dvander@1651: #include "InstallerUtil.h" dvander@1651: #include "LocalCopyMethod.h" dvander@1651: dvander@1651: LocalCopyMethod g_LocalCopier; dvander@1651: dvander@1651: DWORD CALLBACK CopyProgressRoutine(LARGE_INTEGER TotalFileSize, dvander@1651: LARGE_INTEGER TotalBytesTransferred, dvander@1651: LARGE_INTEGER StreamSize, dvander@1651: LARGE_INTEGER StreamBytesTransferred, dvander@1651: DWORD dwStreamNumber, dvander@1651: DWORD dwCallbackReason, dvander@1651: HANDLE hSourceFile, dvander@1651: HANDLE hDestinationFile, dvander@1651: LPVOID lpData) dvander@1651: { dvander@1651: ICopyProgress *progress = (ICopyProgress *)lpData; dvander@1651: dvander@1722: progress->UpdateProgress((size_t)TotalBytesTransferred.QuadPart, dvander@1722: (size_t)TotalFileSize.QuadPart); dvander@1651: dvander@1651: return PROGRESS_CONTINUE; dvander@1651: } dvander@1651: dvander@1651: LocalCopyMethod::LocalCopyMethod() dvander@1651: { dvander@1651: m_pProgress = NULL; dvander@1651: } dvander@1651: dvander@1651: void LocalCopyMethod::SetOutputPath(const TCHAR *path) dvander@1651: { dvander@1651: UTIL_PathFormat(m_OutputPath, dvander@1651: sizeof(m_OutputPath) / sizeof(TCHAR), dvander@1651: _T("%s"), dvander@1651: path); dvander@1651: dvander@1651: UTIL_PathFormat(m_CurrentPath, dvander@1651: sizeof(m_CurrentPath) / sizeof(TCHAR), dvander@1651: _T("%s"), dvander@1651: path); dvander@1651: } dvander@1651: dvander@1651: void LocalCopyMethod::TrackProgress(ICopyProgress *pProgress) dvander@1651: { dvander@1651: m_pProgress = pProgress; dvander@1651: } dvander@1651: dvander@1651: bool LocalCopyMethod::CreateFolder(const TCHAR *name, TCHAR *buffer, size_t maxchars) dvander@1651: { dvander@1651: TCHAR path[MAX_PATH]; dvander@1651: dvander@1651: UTIL_PathFormat(path, dvander@1651: sizeof(path) / sizeof(TCHAR), dvander@1651: _T("%s\\%s"), dvander@1651: m_CurrentPath, dvander@1651: name); dvander@1651: dvander@1722: if (CreateDirectory(path, NULL)) dvander@1651: { dvander@1651: return true; dvander@1651: } dvander@1651: dvander@1651: DWORD error = GetLastError(); dvander@1651: if (error == ERROR_ALREADY_EXISTS) dvander@1651: { dvander@1651: return true; dvander@1651: } dvander@1651: dvander@1651: GenerateErrorMessage(error, buffer, maxchars); dvander@1651: dvander@1651: return false; dvander@1651: } dvander@1651: dvander@1651: bool LocalCopyMethod::SetCurrentFolder(const TCHAR *path, TCHAR *buffer, size_t maxchars) dvander@1651: { dvander@1651: if (path == NULL) dvander@1651: { dvander@1651: UTIL_PathFormat(m_CurrentPath, dvander@1651: sizeof(m_CurrentPath) / sizeof(TCHAR), dvander@1651: _T("%s"), dvander@1651: m_OutputPath); dvander@1651: } dvander@1651: else dvander@1651: { dvander@1651: UTIL_PathFormat(m_CurrentPath, dvander@1651: sizeof(m_CurrentPath) / sizeof(TCHAR), dvander@1651: _T("%s\\%s"), dvander@1651: m_OutputPath, dvander@1651: path); dvander@1651: } dvander@1651: dvander@1651: return true; dvander@1651: } dvander@1651: dvander@1651: bool LocalCopyMethod::SendFile(const TCHAR *path, TCHAR *buffer, size_t maxchars) dvander@1651: { dvander@1651: const TCHAR *filename = GetFileFromPath(path); dvander@1651: dvander@1651: if (filename == NULL) dvander@1651: { dvander@1651: UTIL_Format(buffer, maxchars, _T("Invalid filename")); dvander@1651: return false; dvander@1651: } dvander@1651: dvander@1651: TCHAR new_path[MAX_PATH]; dvander@1651: UTIL_PathFormat(new_path, dvander@1651: sizeof(new_path) / sizeof(TCHAR), dvander@1651: _T("%s\\%s"), dvander@1651: m_CurrentPath, dvander@1651: filename); dvander@1651: dvander@1651: m_bCancelStatus = FALSE; dvander@1651: dvander@1722: if (m_pProgress != NULL) dvander@1722: { dvander@1722: m_pProgress->StartingNewFile(filename); dvander@1722: } dvander@1722: dvander@1651: if (CopyFileEx(path, dvander@1651: new_path, dvander@1651: m_pProgress ? CopyProgressRoutine : NULL, dvander@1651: m_pProgress, dvander@1651: &m_bCancelStatus, dvander@1651: 0) == 0) dvander@1651: { dvander@1651: /* Delete the file in case it was a partial copy */ dvander@1651: DeleteFile(new_path); dvander@1651: dvander@1651: GenerateErrorMessage(GetLastError(), buffer, maxchars); dvander@1651: dvander@1651: return false; dvander@1651: } dvander@1651: dvander@1722: if (m_pProgress != NULL) dvander@1722: { dvander@1722: m_pProgress->FileDone(UTIL_GetFileSize(path)); dvander@1722: } dvander@1722: dvander@1651: return true; dvander@1651: } dvander@1651: dvander@1651: void LocalCopyMethod::CancelCurrentCopy() dvander@1651: { dvander@1651: m_bCancelStatus = TRUE; dvander@1651: } dvander@1651: dvander@1651: bool LocalCopyMethod::CheckForExistingInstall() dvander@1651: { dvander@1651: TCHAR path[MAX_PATH]; dvander@1651: dvander@1651: UTIL_PathFormat(path, dvander@1651: sizeof(path) / sizeof(TCHAR), dvander@1651: _T("%s\\addons\\sourcemod"), dvander@1651: m_CurrentPath); dvander@1651: if (GetFileAttributes(path) == INVALID_FILE_ATTRIBUTES) dvander@1651: { dvander@1651: UTIL_PathFormat(path, dvander@1651: sizeof(path) / sizeof(TCHAR), dvander@1651: _T("%s\\cfg\\sourcemod"), dvander@1651: m_CurrentPath); dvander@1651: if (GetFileAttributes(path) == INVALID_FILE_ATTRIBUTES) dvander@1651: { dvander@1651: return false; dvander@1651: } dvander@1651: } dvander@1651: dvander@1651: return true; dvander@1651: }