dvander@1651: #include "InstallerMain.h" dvander@1651: #include "InstallerUtil.h" dvander@1651: #include "PerformInstall.h" dvander@1651: dvander@1651: struct folder_t dvander@1651: { dvander@1651: TCHAR path[MAX_PATH]; dvander@1651: }; dvander@1651: dvander@1651: ICopyMethod *g_pCopyMethod = NULL; dvander@1651: bool do_not_copy_binaries = false; dvander@1651: TCHAR source_path[MAX_PATH]; dvander@1651: dvander@1651: void SetInstallMethod(ICopyMethod *pCopyMethod) dvander@1651: { dvander@1651: g_pCopyMethod = pCopyMethod; dvander@1651: } dvander@1651: dvander@1651: bool CopyStructureRecursively(const TCHAR *basepath, dvander@1651: const TCHAR *local_path, dvander@1651: TCHAR *errbuf, dvander@1651: size_t maxchars) dvander@1651: { dvander@1651: HANDLE hFind; dvander@1651: WIN32_FIND_DATA fd; dvander@1651: TCHAR search_path[MAX_PATH]; dvander@1651: folder_t *folder_list = NULL; dvander@1651: unsigned int folder_count = 0; dvander@1651: dvander@1651: if (local_path == NULL) dvander@1651: { dvander@1651: UTIL_PathFormat(search_path, dvander@1651: sizeof(search_path) / sizeof(TCHAR), dvander@1651: _T("%s\\*.*"), dvander@1651: basepath); dvander@1651: } dvander@1651: else dvander@1651: { dvander@1651: UTIL_PathFormat(search_path, dvander@1651: sizeof(search_path) / sizeof(TCHAR), dvander@1651: _T("%s\\%s\\*.*"), dvander@1651: basepath, dvander@1651: local_path); dvander@1651: } dvander@1651: dvander@1651: if (!g_pCopyMethod->SetCurrentFolder(local_path, errbuf, maxchars)) dvander@1651: { dvander@1651: /* :TODO: set fail state */ dvander@1651: return false; dvander@1651: } dvander@1651: dvander@1651: if ((hFind = FindFirstFile(search_path, &fd)) == INVALID_HANDLE_VALUE) dvander@1651: { dvander@1651: /* :TODO: set a fail state */ dvander@1651: return false; dvander@1651: } dvander@1651: dvander@1651: do dvander@1651: { dvander@1651: if (tstrcasecmp(fd.cFileName, _T(".")) == 0 dvander@1651: || tstrcasecmp(fd.cFileName, _T("..")) == 0) dvander@1651: { dvander@1651: continue; dvander@1651: } dvander@1651: dvander@1651: if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) dvander@1651: { dvander@1651: /* We cache the folder list so we don't have to keep changing folders back and forth, dvander@1651: * which could be annoying on a slow copy connection. dvander@1651: */ dvander@1651: if (folder_list == NULL) dvander@1651: { dvander@1651: folder_list = (folder_t *)malloc(sizeof(folder_t) * (folder_count + 1)); dvander@1651: } dvander@1651: else dvander@1651: { dvander@1651: folder_list = (folder_t *)realloc(folder_list, sizeof(folder_t) * (folder_count + 1)); dvander@1651: } dvander@1651: dvander@1651: UTIL_Format(folder_list[folder_count].path, MAX_PATH, _T("%s"), fd.cFileName); dvander@1651: folder_count++; dvander@1651: } dvander@1651: else dvander@1651: { dvander@1651: TCHAR file_path[MAX_PATH]; dvander@1651: dvander@1651: if (local_path == NULL) dvander@1651: { dvander@1651: UTIL_PathFormat(file_path, dvander@1651: sizeof(file_path), dvander@1651: _T("%s\\%s"), dvander@1651: basepath, dvander@1651: fd.cFileName); dvander@1651: } dvander@1651: else dvander@1651: { dvander@1651: UTIL_PathFormat(file_path, dvander@1651: sizeof(file_path), dvander@1651: _T("%s\\%s\\%s"), dvander@1651: basepath, dvander@1651: local_path, dvander@1651: fd.cFileName); dvander@1651: } dvander@1651: dvander@1651: if (!g_pCopyMethod->SendFile(file_path, errbuf, maxchars)) dvander@1651: { dvander@1651: FindClose(hFind); dvander@1651: free(folder_list); dvander@1651: return false; dvander@1651: } dvander@1651: } dvander@1651: } while (FindNextFile(hFind, &fd)); dvander@1651: dvander@1651: FindClose(hFind); dvander@1651: dvander@1651: /* Now copy folders */ dvander@1651: for (unsigned int i = 0; i < folder_count; i++) dvander@1651: { dvander@1651: /* Try creating the folder */ dvander@1651: if (!g_pCopyMethod->CreateFolder(folder_list[i].path, errbuf, maxchars)) dvander@1651: { dvander@1651: free(folder_list); dvander@1651: return false; dvander@1651: } dvander@1651: dvander@1651: TCHAR new_local_path[MAX_PATH]; dvander@1651: if (local_path == NULL) dvander@1651: { dvander@1651: UTIL_PathFormat(new_local_path, dvander@1651: sizeof(new_local_path) / sizeof(TCHAR), dvander@1651: _T("%s"), dvander@1651: folder_list[i].path); dvander@1651: } dvander@1651: else dvander@1651: { dvander@1651: UTIL_PathFormat(new_local_path, dvander@1651: sizeof(new_local_path) / sizeof(TCHAR), dvander@1651: _T("%s\\%s"), dvander@1651: local_path, dvander@1651: folder_list[i].path); dvander@1651: } dvander@1651: dvander@1651: if (!CopyStructureRecursively(basepath, new_local_path, errbuf, maxchars)) dvander@1651: { dvander@1651: free(folder_list); dvander@1651: return false; dvander@1651: } dvander@1651: } dvander@1651: dvander@1651: free(folder_list); dvander@1651: dvander@1651: return true; dvander@1651: } dvander@1651: dvander@1651: bool StartInstallProcess(HWND hWnd) dvander@1651: { dvander@1651: if (g_pCopyMethod->CheckForExistingInstall()) dvander@1651: { dvander@1651: int val = MessageBox( dvander@1651: hWnd, dvander@1651: _T("It looks like a previous SourceMod installation exists. Do you want to upgrade? Select \"Yes\" to upgrade and keep configuration files. Select \"No\" to perform a full re-install."), dvander@1651: _T("SourceMod Installer"), dvander@1651: MB_YESNO|MB_ICONQUESTION); dvander@1651: dvander@1651: if (val == 0 || val == IDYES) dvander@1651: { dvander@1651: do_not_copy_binaries = true; dvander@1651: } dvander@1651: else dvander@1651: { dvander@1651: do_not_copy_binaries = false; dvander@1651: } dvander@1651: } dvander@1651: dvander@1651: TCHAR cur_path[MAX_PATH]; dvander@1651: if (_tgetcwd(cur_path, sizeof(cur_path)) == NULL) dvander@1651: { dvander@1651: MessageBox( dvander@1651: hWnd, dvander@1651: _T("Could not locate current directory!"), dvander@1651: _T("SourceMod Installer"), dvander@1651: MB_OK|MB_ICONERROR); dvander@1651: return false; dvander@1651: } dvander@1651: dvander@1651: UTIL_PathFormat(source_path, dvander@1651: sizeof(source_path) / sizeof(TCHAR), dvander@1651: _T("%s\\files"), dvander@1651: cur_path); dvander@1651: dvander@1651: if (GetFileAttributes(source_path) == INVALID_FILE_ATTRIBUTES) dvander@1651: { dvander@1651: MessageBox( dvander@1651: hWnd, dvander@1651: _T("Could not locate the source installation files!"), dvander@1651: _T("SourceMod Installer"), dvander@1651: MB_OK|MB_ICONERROR); dvander@1651: return false; dvander@1651: } dvander@1651: dvander@1651: dvander@1651: dvander@1651: return true; dvander@1651: } dvander@1651: dvander@1651: INT_PTR CALLBACK PerformInstallHandler(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) dvander@1651: { dvander@1651: switch (message) dvander@1651: { dvander@1651: case WM_INITDIALOG: dvander@1651: { dvander@1651: return (INT_PTR)TRUE; dvander@1651: } dvander@1651: case WM_COMMAND: dvander@1651: { dvander@1651: if (LOWORD(wParam) == ID_INSTALL_CANCEL dvander@1651: || LOWORD(wParam) == ID_CLOSE) dvander@1651: { dvander@1651: /* :TODO: enhance */ dvander@1651: EndDialog(hDlg, NULL); dvander@1651: return (INT_PTR)TRUE; dvander@1651: } dvander@1651: break; dvander@1651: } dvander@1651: } dvander@1651: dvander@1651: return (INT_PTR)FALSE; dvander@1651: } dvander@1651: dvander@1651: void *DisplayPerformInstall(HWND hWnd) dvander@1651: { dvander@1651: INT_PTR val; dvander@1651: dvander@1651: if ((val = DialogBox( dvander@1651: g_hInstance, dvander@1651: MAKEINTRESOURCE(IDD_PERFORM_INSTALL), dvander@1651: hWnd, dvander@1651: PerformInstallHandler)) == -1) dvander@1651: { dvander@1651: return NULL; dvander@1651: } dvander@1651: dvander@1651: return (void *)val; dvander@1651: }