diff -r 766564f4c929 -r 077571ea8942 tools/installer/LocalCopyMethod.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/installer/LocalCopyMethod.cpp Sun Oct 28 20:15:51 2007 +0000 @@ -0,0 +1,158 @@ +#include "InstallerUtil.h" +#include "LocalCopyMethod.h" + +LocalCopyMethod g_LocalCopier; + +DWORD CALLBACK CopyProgressRoutine(LARGE_INTEGER TotalFileSize, + LARGE_INTEGER TotalBytesTransferred, + LARGE_INTEGER StreamSize, + LARGE_INTEGER StreamBytesTransferred, + DWORD dwStreamNumber, + DWORD dwCallbackReason, + HANDLE hSourceFile, + HANDLE hDestinationFile, + LPVOID lpData) +{ + ICopyProgress *progress = (ICopyProgress *)lpData; + + float percent = (float)(TotalBytesTransferred.QuadPart) / (float)(TotalFileSize.QuadPart); + + progress->UpdateProgress(percent); + + return PROGRESS_CONTINUE; +} + +LocalCopyMethod::LocalCopyMethod() +{ + m_pProgress = NULL; +} + +void LocalCopyMethod::SetOutputPath(const TCHAR *path) +{ + UTIL_PathFormat(m_OutputPath, + sizeof(m_OutputPath) / sizeof(TCHAR), + _T("%s"), + path); + + UTIL_PathFormat(m_CurrentPath, + sizeof(m_CurrentPath) / sizeof(TCHAR), + _T("%s"), + path); +} + +void LocalCopyMethod::TrackProgress(ICopyProgress *pProgress) +{ + m_pProgress = pProgress; +} + +bool LocalCopyMethod::CreateFolder(const TCHAR *name, TCHAR *buffer, size_t maxchars) +{ + TCHAR path[MAX_PATH]; + + UTIL_PathFormat(path, + sizeof(path) / sizeof(TCHAR), + _T("%s\\%s"), + m_CurrentPath, + name); + + if (CreateDirectory(name, NULL)) + { + return true; + } + + DWORD error = GetLastError(); + if (error == ERROR_ALREADY_EXISTS) + { + return true; + } + + GenerateErrorMessage(error, buffer, maxchars); + + return false; +} + +bool LocalCopyMethod::SetCurrentFolder(const TCHAR *path, TCHAR *buffer, size_t maxchars) +{ + if (path == NULL) + { + UTIL_PathFormat(m_CurrentPath, + sizeof(m_CurrentPath) / sizeof(TCHAR), + _T("%s"), + m_OutputPath); + } + else + { + UTIL_PathFormat(m_CurrentPath, + sizeof(m_CurrentPath) / sizeof(TCHAR), + _T("%s\\%s"), + m_OutputPath, + path); + } + + return true; +} + +bool LocalCopyMethod::SendFile(const TCHAR *path, TCHAR *buffer, size_t maxchars) +{ + const TCHAR *filename = GetFileFromPath(path); + + if (filename == NULL) + { + UTIL_Format(buffer, maxchars, _T("Invalid filename")); + return false; + } + + TCHAR new_path[MAX_PATH]; + UTIL_PathFormat(new_path, + sizeof(new_path) / sizeof(TCHAR), + _T("%s\\%s"), + m_CurrentPath, + filename); + + m_bCancelStatus = FALSE; + + if (CopyFileEx(path, + new_path, + m_pProgress ? CopyProgressRoutine : NULL, + m_pProgress, + &m_bCancelStatus, + 0) == 0) + { + /* Delete the file in case it was a partial copy */ + DeleteFile(new_path); + + GenerateErrorMessage(GetLastError(), buffer, maxchars); + + return false; + } + + return true; +} + +void LocalCopyMethod::CancelCurrentCopy() +{ + m_bCancelStatus = TRUE; +} + +bool LocalCopyMethod::CheckForExistingInstall() +{ + TCHAR path[MAX_PATH]; + + UTIL_PathFormat(path, + sizeof(path) / sizeof(TCHAR), + _T("%s\\addons\\sourcemod"), + m_CurrentPath); + if (GetFileAttributes(path) == INVALID_FILE_ATTRIBUTES) + { + UTIL_PathFormat(path, + sizeof(path) / sizeof(TCHAR), + _T("%s\\cfg\\sourcemod"), + m_CurrentPath); + if (GetFileAttributes(path) == INVALID_FILE_ATTRIBUTES) + { + return false; + } + } + + return true; +}