dvander@1651: #include "InstallerUtil.h" dvander@1651: #include "InstallerMain.h" dvander@1651: #include dvander@1651: #include dvander@1651: dvander@1651: int tstrcasecmp(const TCHAR *str1, const TCHAR *str2) dvander@1651: { dvander@1651: #if defined _UNICODE dvander@1651: return _wcsicmp(str1, str2); dvander@1651: #else dvander@1651: return _stricmp(str1, str2); dvander@1651: #endif dvander@1651: } dvander@1651: dvander@1651: size_t AnsiToUnicode(const char *str, wchar_t *buffer, size_t maxchars) dvander@1651: { dvander@1651: if (maxchars < 1) dvander@1651: { dvander@1651: return 0; dvander@1651: } dvander@1651: dvander@1651: size_t total = dvander@1651: (size_t)MultiByteToWideChar(CP_UTF8, dvander@1651: 0, dvander@1651: str, dvander@1651: -1, dvander@1651: buffer, dvander@1651: (int)maxchars); dvander@1651: dvander@1651: return total; dvander@1651: } dvander@1651: dvander@1651: bool IsWhiteSpaceA(const char *stream) dvander@1651: { dvander@1651: char c = *stream; dvander@1651: if (c & (1<<7)) dvander@1651: { dvander@1651: return false; dvander@1651: } dvander@1651: else dvander@1651: { dvander@1651: return isspace(c) != 0; dvander@1651: } dvander@1651: } dvander@1651: dvander@1651: int BreakStringA(const char *str, char *out, size_t maxchars) dvander@1651: { dvander@1651: const char *inptr = str; dvander@1651: while (*inptr != '\0' && IsWhiteSpaceA(inptr)) dvander@1651: { dvander@1651: inptr++; dvander@1651: } dvander@1651: dvander@1651: if (*inptr == '\0') dvander@1651: { dvander@1651: if (maxchars) dvander@1651: { dvander@1651: *out = '\0'; dvander@1651: } dvander@1651: return -1; dvander@1651: } dvander@1651: dvander@1651: const char *start, *end = NULL; dvander@1651: dvander@1651: bool quoted = (*inptr == '"'); dvander@1651: if (quoted) dvander@1651: { dvander@1651: inptr++; dvander@1651: start = inptr; dvander@1651: /* Read input until we reach a quote. */ dvander@1651: while (*inptr != '\0' && *inptr != '"') dvander@1651: { dvander@1651: /* Update the end point, increment the stream. */ dvander@1651: end = inptr++; dvander@1651: } dvander@1651: /* Read one more token if we reached an end quote */ dvander@1651: if (*inptr == '"') dvander@1651: { dvander@1651: inptr++; dvander@1651: } dvander@1651: } dvander@1651: else dvander@1651: { dvander@1651: start = inptr; dvander@1651: /* Read input until we reach a space */ dvander@1651: while (*inptr != '\0' && !IsWhiteSpaceA(inptr)) dvander@1651: { dvander@1651: /* Update the end point, increment the stream. */ dvander@1651: end = inptr++; dvander@1651: } dvander@1651: } dvander@1651: dvander@1651: /* Copy the string we found, if necessary */ dvander@1651: if (end == NULL) dvander@1651: { dvander@1651: if (maxchars) dvander@1651: { dvander@1651: *out = '\0'; dvander@1651: } dvander@1651: } dvander@1651: else if (maxchars) dvander@1651: { dvander@1651: char *outptr = out; dvander@1651: maxchars--; dvander@1651: for (const char *ptr=start; dvander@1651: (ptr <= end) && ((unsigned)(outptr - out) < (maxchars)); dvander@1651: ptr++, outptr++) dvander@1651: { dvander@1651: *outptr = *ptr; dvander@1651: } dvander@1651: *outptr = '\0'; dvander@1651: } dvander@1651: dvander@1651: /* Consume more of the string until we reach non-whitespace */ dvander@1651: while (*inptr != '\0' && IsWhiteSpaceA(inptr)) dvander@1651: { dvander@1651: inptr++; dvander@1651: } dvander@1651: dvander@1651: return (int)(inptr - str); dvander@1651: } dvander@1651: dvander@1651: size_t UTIL_Format(TCHAR *buffer, size_t count, const TCHAR *fmt, ...) dvander@1651: { dvander@1651: va_list ap; dvander@1651: size_t len; dvander@1651: dvander@1651: va_start(ap, fmt); dvander@1651: len = UTIL_FormatArgs(buffer, count, fmt, ap); dvander@1651: va_end(ap); dvander@1651: dvander@1651: if (len >= count) dvander@1651: { dvander@1651: len = count - 1; dvander@1651: buffer[len] = '\0'; dvander@1651: } dvander@1651: dvander@1651: return len; dvander@1651: } dvander@1651: dvander@1651: size_t UTIL_FormatArgs(TCHAR *buffer, size_t count, const TCHAR *fmt, va_list ap) dvander@1651: { dvander@1651: size_t len = _vsntprintf(buffer, count, fmt, ap); dvander@1651: dvander@1651: if (len >= count) dvander@1651: { dvander@1651: len = count - 1; dvander@1651: buffer[len] = '\0'; dvander@1651: } dvander@1651: dvander@1651: return len; dvander@1651: } dvander@1651: dvander@1651: size_t UTIL_PathFormat(TCHAR *buffer, size_t count, const TCHAR *fmt, ...) dvander@1651: { dvander@1651: va_list ap; dvander@1651: size_t len; dvander@1651: dvander@1651: va_start(ap, fmt); dvander@1651: len = UTIL_FormatArgs(buffer, count, fmt, ap); dvander@1651: va_end(ap); dvander@1651: dvander@1651: for (size_t i = 0; i < len; i++) dvander@1651: { dvander@1651: if (buffer[i] == '/') dvander@1651: { dvander@1651: buffer[i] = '\\'; dvander@1651: } dvander@1651: } dvander@1651: dvander@1651: return len; dvander@1651: } dvander@1651: dvander@1651: const TCHAR *GetFileFromPath(const TCHAR *path) dvander@1651: { dvander@1651: size_t len = _tcslen(path); dvander@1651: dvander@1722: for (size_t i = len - 1; dvander@1722: i >= 0 && i < len; dvander@1651: i--) dvander@1651: { dvander@1651: if (path[i] == '\\' || path[i] == '/') dvander@1651: { dvander@1722: return &path[i+1]; dvander@1651: } dvander@1651: } dvander@1651: dvander@1651: return NULL; dvander@1651: } dvander@1651: dvander@1651: void GenerateErrorMessage(DWORD err, TCHAR *buffer, size_t maxchars) dvander@1651: { dvander@1651: if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, dvander@1651: NULL, dvander@1651: err, dvander@1651: MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), dvander@1651: buffer, dvander@1651: (DWORD)maxchars, dvander@1651: NULL) == 0) dvander@1651: { dvander@1651: UTIL_Format(buffer, maxchars, _T("Unknown error")); dvander@1651: } dvander@1651: } dvander@1651: dvander@1651: INT_PTR AskToExit(HWND hWnd) dvander@1651: { dvander@1651: TCHAR verify_exit[100]; dvander@1651: dvander@1651: if (LoadString(g_hInstance, dvander@1651: IDS_VERIFY_EXIT, dvander@1651: verify_exit, dvander@1651: sizeof(verify_exit) / sizeof(TCHAR) dvander@1651: ) == 0) dvander@1651: { dvander@1651: return (INT_PTR)FALSE; dvander@1651: } dvander@1651: dvander@1651: int val = MessageBox( dvander@1651: hWnd, dvander@1651: _T("Are you sure you want to exit?"), dvander@1651: _T("SourceMod Installer"), dvander@1651: MB_YESNO|MB_ICONQUESTION); dvander@1651: dvander@1651: if (val == 0 || val == IDYES) dvander@1651: { dvander@1722: UpdateGlobalPosition(hWnd); dvander@1651: EndDialog(hWnd, NULL); dvander@1651: return (INT_PTR)TRUE; dvander@1651: } dvander@1651: dvander@1651: return (INT_PTR)FALSE; dvander@1651: } dvander@1722: dvander@1722: size_t UTIL_GetFileSize(const TCHAR *file_path) dvander@1722: { dvander@1722: HANDLE hFile; dvander@1722: dvander@1722: if ((hFile = CreateFile(file_path, dvander@1722: GENERIC_READ, dvander@1722: FILE_SHARE_READ, dvander@1722: NULL, dvander@1722: OPEN_EXISTING, dvander@1722: FILE_ATTRIBUTE_NORMAL, dvander@1722: NULL)) dvander@1722: != INVALID_HANDLE_VALUE) dvander@1722: { dvander@1722: LARGE_INTEGER size; dvander@1722: dvander@1722: if (GetFileSizeEx(hFile, &size)) dvander@1722: { dvander@1722: CloseHandle(hFile); dvander@1722: return (size_t)size.QuadPart; dvander@1722: } dvander@1722: dvander@1722: CloseHandle(hFile); dvander@1722: } dvander@1722: dvander@1722: return 0; dvander@1722: } dvander@1722: dvander@1722: #if 0 dvander@1722: size_t UTIL_GetFolderSize(const TCHAR *basepath) dvander@1722: { dvander@1722: HANDLE hFind; dvander@1722: WIN32_FIND_DATA fd; dvander@1722: TCHAR search_path[MAX_PATH]; dvander@1722: size_t total = 0; dvander@1722: dvander@1722: UTIL_PathFormat(search_path, dvander@1722: sizeof(search_path) / sizeof(TCHAR), dvander@1722: _T("%s\\*.*"), dvander@1722: basepath); dvander@1722: dvander@1722: if ((hFind = FindFirstFile(search_path, &fd)) == INVALID_HANDLE_VALUE) dvander@1722: { dvander@1722: return 0; dvander@1722: } dvander@1722: dvander@1722: do dvander@1722: { dvander@1722: if (tstrcasecmp(fd.cFileName, _T(".")) == 0 dvander@1722: || tstrcasecmp(fd.cFileName, _T("..")) == 0) dvander@1722: { dvander@1722: continue; dvander@1722: } dvander@1722: dvander@1722: if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) dvander@1722: { dvander@1722: UTIL_PathFormat(search_path, dvander@1722: sizeof(search_path) / sizeof(TCHAR), dvander@1722: _T("%s\\%s"), dvander@1722: basepath, dvander@1722: fd.cFileName); dvander@1722: total += UTIL_GetFolderSize(search_path); dvander@1722: } dvander@1722: else dvander@1722: { dvander@1722: UTIL_PathFormat(search_path, dvander@1722: sizeof(search_path) / sizeof(TCHAR), dvander@1722: _T("%s\\%s"), dvander@1722: basepath, dvander@1722: fd.cFileName); dvander@1722: dvander@1722: total += UTIL_GetFileSize(search_path); dvander@1722: } dvander@1722: } while (FindNextFile(hFind, &fd)); dvander@1722: dvander@1722: FindClose(hFind); dvander@1722: dvander@1722: return total; dvander@1722: } dvander@1722: #endif