#include #include #include #ifndef WIN32 # ifndef __BORLANDC__ # include # else # include # endif /* !__BORLANDC__ */ #else # ifndef __BORLANDC__ # include # else # include # endif /* !__BORLANDC__ */ #endif /* !WIN32 */ #include #include #include "wingui\wizunzip.h" #include "wingui\helpids.h" #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #ifndef WIZUNZIP_MAX_PATH #define WIZUNZIP_MAX_PATH 128 #endif /* * Function: BOOL MakeDirectory(char *path, BOOL fileAttached) * * Return: TRUE if successful * FALSE if unsuccessful * * Creates directories specified by path. These can be any level of * previously non-existent directories, up to WIZUNZIP_MAX_PATH. * * First checks to see if a drive is designated, and if so, if the * drive exists. If drive doesn't exist, returns FALSE. * * Then successively creates the directories (assuming they don't exist). * * Placed in the public domain by Mike White, 1995 * */ BOOL MakeDirectory(char *path, BOOL fileAttached); BOOL MakeDirectory(char *path, BOOL fileAttached) { char tempPath[WIZUNZIP_MAX_PATH], tempChar; BOOL slash = FALSE; #ifdef WIN32 DWORD attrib; unsigned int dReturn; #else unsigned int attrib; WORD dReturn; #endif int i; if (path[0] == '\0') return TRUE; /* Don't need to make a directory */ lstrcpy(tempPath, path); if (tempPath[1] == ':') /* check if drive included */ { if (lstrlen(tempPath) < 4) return TRUE; /* specified only a drive and a root directory */ #ifndef WIN32 dReturn = GetDriveType(toupper(tempPath[0]) - 'A'); #else tempPath[2] = '\\'; tempPath[3] = '\0'; dReturn = GetDriveType(tempPath); lstrcpy(tempPath, path); #endif if (dReturn == 0) /* drive type can't be determined */ return FALSE; #ifdef WIN32 if (dReturn == 1) /* root directory doesn't exist */ return FALSE; #endif } /* Is this a valid path already? If so, return TRUE */ /* There appears to be a bug (feature?) in NT 3.51 (and perhaps other versions as well) that allows you to create a path the first time for a given application, but erroneously reports that the path exists, if another application deletes the directories, hence the following code has been commented out until such time as a fix is figured out. #ifndef WIN32 _dos_getfileattr(tempPath, &attrib); if (attrib & _A_SUBDIR) { return TRUE; } #else attrib = GetFileAttributes(tempPath); if (attrib & FILE_ATTRIBUTE_DIRECTORY) { return TRUE; } #endif */ if (tempPath[1] == ':') for (i = 3; i < lstrlen(path); i++) { if (tempPath[i] == '\\') { tempChar = tempPath[i]; tempPath[i] = '\0'; mkdir(tempPath); /* We don't care what the return value is, if it already exists, we'll get an error. Check later on. */ tempPath[i] = tempChar; slash = TRUE; } } else for (i = 1; i < lstrlen(path); i++) { if (tempPath[i] == '\\') { tempChar = tempPath[i]; tempPath[i] = '\0'; mkdir(tempPath); /* We don't care what the return value is, if it already exists, we'll get an error. Check later on. */ tempPath[i] = tempChar; slash = TRUE; } } if (slash && !fileAttached) mkdir(tempPath); else if (!fileAttached) mkdir(tempPath); if (fileAttached) { char *ptr; if ((ptr = strrchr(tempPath, '\\')) != NULL) *ptr = '\0'; } /* Now, do we have a valid path? */ #ifndef WIN32 _dos_getfileattr(tempPath, &attrib); if (attrib & _A_SUBDIR) return TRUE; #else attrib = GetFileAttributes(tempPath); if (attrib & FILE_ATTRIBUTE_DIRECTORY) return TRUE; #endif /* Still no valid path, can't create it. return false */ return FALSE; } /**************************************************************************** FUNCTION: MakeDirProc(HWND, unsigned, WPARAM, LPARAM) PURPOSE: Processes messages for "Make Directory" dialog box MESSAGES: WM_INITDIALOG - initialize dialog box WM_COMMAND - Input received ****************************************************************************/ #ifdef __BORLANDC__ #pragma warn -par #endif BOOL WINAPI MakeDirProc(HWND hDlg, WORD wMessage, WPARAM wParam, LPARAM lParam) { static HWND hSelect, hMakeDir; char tempPath[128]; int nPatternLength; /* length of data in pattern edit window */ switch (wMessage) { case WM_INITDIALOG: hSelect = GetDlgItem(hDlg, IDOK); hMakeDir = GetDlgItem(hDlg, IDM_MAKEDIR_PATH); SetDlgItemText(hDlg, IDM_CURRENT_PATH,lpumb->szUnzipToDirName); CenterDialog(GetParent(hDlg), hDlg); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDM_MAKEDIR_PATH: if (GET_WM_COMMAND_CMD(wParam, lParam) == EN_CHANGE) { if ((nPatternLength = GetWindowTextLength(hMakeDir))==1) { /* Enable or disable buttons depending on fullness of * "Suffix" box. */ BOOL fButtonState = TRUE ; WinAssert(hSelect); EnableWindow(hSelect, fButtonState); } if (nPatternLength == 0) { BOOL fButtonState = FALSE; WinAssert(hSelect); EnableWindow(hSelect, fButtonState); } } break; case IDOK: /* Make Directory */ GetDlgItemText(hDlg, IDM_MAKEDIR_PATH, tempPath, WIZUNZIP_MAX_PATH); if (tempPath[lstrlen(tempPath) - 1] == '\\') tempPath[lstrlen(tempPath) - 1] = '\0'; /* strip trailing backslash */ if (strchr(tempPath, '\\') == NULL) { char sz[WIZUNZIP_MAX_PATH]; lstrcpy(sz, lpumb->szUnzipToDirName); strcat(sz, "\\"); strcat(sz, tempPath); lstrcpy(tempPath, sz); } if (!MakeDirectory(tempPath, FALSE)) { char tStr[WIZUNZIP_MAX_PATH]; sprintf(tStr, "Could not create %s", tempPath); MessageBox(hDlg, tStr, NULL, MB_OK | MB_ICONSTOP); } else { char tStr[WIZUNZIP_MAX_PATH]; sprintf(tStr, "Created directory: %s\n", tempPath); win_fprintf(stdout, strlen(tStr), tStr); } EndDialog(hDlg, wParam); break; case IDCANCEL: EndDialog(hDlg, wParam); break; case IDM_MAKEDIR_HELP: WinHelp(hDlg,szHelpFileName,HELP_CONTEXT, (DWORD)(HELPID_MAKEDIR_HELP)); } return TRUE; case WM_CLOSE: DestroyWindow(hDlg); return TRUE; } return FALSE; } #ifdef __BORLANDC__ #pragma warn .par #endif