tools/installer/InstallerUtil.cpp
author David Anderson <dvander@alliedmods.net>
Sun Nov 25 18:50:13 2007 +0000 (2007-11-25)
changeset 1725 ea875bcbc286
parent 1722 2c16f160f5dd
child 2289 44045ead61cd
permissions -rw-r--r--
small clarification to param2 in MenuAction_End
dvander@1651
     1
#include "InstallerUtil.h"
dvander@1651
     2
#include "InstallerMain.h"
dvander@1651
     3
#include <stdio.h>
dvander@1651
     4
#include <windows.h>
dvander@1651
     5
dvander@1651
     6
int tstrcasecmp(const TCHAR *str1, const TCHAR *str2)
dvander@1651
     7
{
dvander@1651
     8
#if defined _UNICODE
dvander@1651
     9
	return _wcsicmp(str1, str2);
dvander@1651
    10
#else
dvander@1651
    11
	return _stricmp(str1, str2);
dvander@1651
    12
#endif
dvander@1651
    13
}
dvander@1651
    14
dvander@1651
    15
size_t AnsiToUnicode(const char *str, wchar_t *buffer, size_t maxchars)
dvander@1651
    16
{
dvander@1651
    17
	if (maxchars < 1)
dvander@1651
    18
	{
dvander@1651
    19
		return 0;
dvander@1651
    20
	}
dvander@1651
    21
dvander@1651
    22
	size_t total = 
dvander@1651
    23
		(size_t)MultiByteToWideChar(CP_UTF8,
dvander@1651
    24
		0,
dvander@1651
    25
		str,
dvander@1651
    26
		-1,
dvander@1651
    27
		buffer,
dvander@1651
    28
		(int)maxchars);
dvander@1651
    29
dvander@1651
    30
	return total;
dvander@1651
    31
}
dvander@1651
    32
dvander@1651
    33
bool IsWhiteSpaceA(const char *stream)
dvander@1651
    34
{
dvander@1651
    35
	char c = *stream;
dvander@1651
    36
	if (c & (1<<7))
dvander@1651
    37
	{
dvander@1651
    38
		return false;
dvander@1651
    39
	}
dvander@1651
    40
	else
dvander@1651
    41
	{
dvander@1651
    42
		return isspace(c) != 0;
dvander@1651
    43
	}
dvander@1651
    44
}
dvander@1651
    45
dvander@1651
    46
int BreakStringA(const char *str, char *out, size_t maxchars)
dvander@1651
    47
{
dvander@1651
    48
	const char *inptr = str;
dvander@1651
    49
	while (*inptr != '\0' && IsWhiteSpaceA(inptr))
dvander@1651
    50
	{
dvander@1651
    51
		inptr++;
dvander@1651
    52
	}
dvander@1651
    53
dvander@1651
    54
	if (*inptr == '\0')
dvander@1651
    55
	{
dvander@1651
    56
		if (maxchars)
dvander@1651
    57
		{
dvander@1651
    58
			*out = '\0';
dvander@1651
    59
		}
dvander@1651
    60
		return -1;
dvander@1651
    61
	}
dvander@1651
    62
dvander@1651
    63
	const char *start, *end = NULL;
dvander@1651
    64
dvander@1651
    65
	bool quoted = (*inptr == '"');
dvander@1651
    66
	if (quoted)
dvander@1651
    67
	{
dvander@1651
    68
		inptr++;
dvander@1651
    69
		start = inptr;
dvander@1651
    70
		/* Read input until we reach a quote. */
dvander@1651
    71
		while (*inptr != '\0' && *inptr != '"')
dvander@1651
    72
		{
dvander@1651
    73
			/* Update the end point, increment the stream. */
dvander@1651
    74
			end = inptr++;
dvander@1651
    75
		}
dvander@1651
    76
		/* Read one more token if we reached an end quote */
dvander@1651
    77
		if (*inptr == '"')
dvander@1651
    78
		{
dvander@1651
    79
			inptr++;
dvander@1651
    80
		}
dvander@1651
    81
	}
dvander@1651
    82
	else
dvander@1651
    83
	{
dvander@1651
    84
		start = inptr;
dvander@1651
    85
		/* Read input until we reach a space */
dvander@1651
    86
		while (*inptr != '\0' && !IsWhiteSpaceA(inptr))
dvander@1651
    87
		{
dvander@1651
    88
			/* Update the end point, increment the stream. */
dvander@1651
    89
			end = inptr++;
dvander@1651
    90
		}
dvander@1651
    91
	}
dvander@1651
    92
dvander@1651
    93
	/* Copy the string we found, if necessary */
dvander@1651
    94
	if (end == NULL)
dvander@1651
    95
	{
dvander@1651
    96
		if (maxchars)
dvander@1651
    97
		{
dvander@1651
    98
			*out = '\0';
dvander@1651
    99
		}
dvander@1651
   100
	}
dvander@1651
   101
	else if (maxchars)
dvander@1651
   102
	{
dvander@1651
   103
		char *outptr = out;
dvander@1651
   104
		maxchars--;
dvander@1651
   105
		for (const char *ptr=start;
dvander@1651
   106
			(ptr <= end) && ((unsigned)(outptr - out) < (maxchars));
dvander@1651
   107
			ptr++, outptr++)
dvander@1651
   108
			{
dvander@1651
   109
			*outptr = *ptr;
dvander@1651
   110
		}
dvander@1651
   111
		*outptr = '\0';
dvander@1651
   112
	}
dvander@1651
   113
dvander@1651
   114
	/* Consume more of the string until we reach non-whitespace */
dvander@1651
   115
	while (*inptr != '\0' && IsWhiteSpaceA(inptr))
dvander@1651
   116
	{
dvander@1651
   117
		inptr++;
dvander@1651
   118
	}
dvander@1651
   119
dvander@1651
   120
	return (int)(inptr - str);
dvander@1651
   121
}
dvander@1651
   122
dvander@1651
   123
size_t UTIL_Format(TCHAR *buffer, size_t count, const TCHAR *fmt, ...)
dvander@1651
   124
{
dvander@1651
   125
	va_list ap;
dvander@1651
   126
	size_t len;
dvander@1651
   127
	
dvander@1651
   128
	va_start(ap, fmt);
dvander@1651
   129
	len = UTIL_FormatArgs(buffer, count, fmt, ap);
dvander@1651
   130
	va_end(ap);
dvander@1651
   131
dvander@1651
   132
	if (len >= count)
dvander@1651
   133
	{
dvander@1651
   134
		len = count - 1;
dvander@1651
   135
		buffer[len] = '\0';
dvander@1651
   136
	}
dvander@1651
   137
dvander@1651
   138
	return len;
dvander@1651
   139
}
dvander@1651
   140
dvander@1651
   141
size_t UTIL_FormatArgs(TCHAR *buffer, size_t count, const TCHAR *fmt, va_list ap)
dvander@1651
   142
{
dvander@1651
   143
	size_t len = _vsntprintf(buffer, count, fmt, ap);
dvander@1651
   144
dvander@1651
   145
	if (len >= count)
dvander@1651
   146
	{
dvander@1651
   147
		len = count - 1;
dvander@1651
   148
		buffer[len] = '\0';
dvander@1651
   149
	}
dvander@1651
   150
dvander@1651
   151
	return len;
dvander@1651
   152
}
dvander@1651
   153
dvander@1651
   154
size_t UTIL_PathFormat(TCHAR *buffer, size_t count, const TCHAR *fmt, ...)
dvander@1651
   155
{
dvander@1651
   156
	va_list ap;
dvander@1651
   157
	size_t len;
dvander@1651
   158
dvander@1651
   159
	va_start(ap, fmt);
dvander@1651
   160
	len = UTIL_FormatArgs(buffer, count, fmt, ap);
dvander@1651
   161
	va_end(ap);
dvander@1651
   162
dvander@1651
   163
	for (size_t i = 0; i < len; i++)
dvander@1651
   164
	{
dvander@1651
   165
		if (buffer[i] == '/')
dvander@1651
   166
		{
dvander@1651
   167
			buffer[i] = '\\';
dvander@1651
   168
		}
dvander@1651
   169
	}
dvander@1651
   170
dvander@1651
   171
	return len;
dvander@1651
   172
}
dvander@1651
   173
dvander@1651
   174
const TCHAR *GetFileFromPath(const TCHAR *path)
dvander@1651
   175
{
dvander@1651
   176
	size_t len = _tcslen(path);
dvander@1651
   177
dvander@1722
   178
	for (size_t i = len - 1;
dvander@1722
   179
		 i >= 0 && i < len;
dvander@1651
   180
		 i--)
dvander@1651
   181
	{
dvander@1651
   182
		if (path[i] == '\\' || path[i] == '/')
dvander@1651
   183
		{
dvander@1722
   184
			return &path[i+1];
dvander@1651
   185
		}
dvander@1651
   186
	}
dvander@1651
   187
dvander@1651
   188
	return NULL;
dvander@1651
   189
}
dvander@1651
   190
dvander@1651
   191
void GenerateErrorMessage(DWORD err, TCHAR *buffer, size_t maxchars)
dvander@1651
   192
{
dvander@1651
   193
	if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
dvander@1651
   194
		NULL,
dvander@1651
   195
		err,
dvander@1651
   196
		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
dvander@1651
   197
		buffer,
dvander@1651
   198
		(DWORD)maxchars,
dvander@1651
   199
		NULL) == 0)
dvander@1651
   200
	{
dvander@1651
   201
		UTIL_Format(buffer, maxchars, _T("Unknown error"));
dvander@1651
   202
	}
dvander@1651
   203
}
dvander@1651
   204
dvander@1651
   205
INT_PTR AskToExit(HWND hWnd)
dvander@1651
   206
{
dvander@1651
   207
	TCHAR verify_exit[100];
dvander@1651
   208
dvander@1651
   209
	if (LoadString(g_hInstance,
dvander@1651
   210
		IDS_VERIFY_EXIT,
dvander@1651
   211
		verify_exit,
dvander@1651
   212
		sizeof(verify_exit) / sizeof(TCHAR)
dvander@1651
   213
		) == 0)
dvander@1651
   214
	{
dvander@1651
   215
		return (INT_PTR)FALSE;
dvander@1651
   216
	}
dvander@1651
   217
dvander@1651
   218
	int val = MessageBox(
dvander@1651
   219
		hWnd, 
dvander@1651
   220
		_T("Are you sure you want to exit?"), 
dvander@1651
   221
		_T("SourceMod Installer"), 
dvander@1651
   222
		MB_YESNO|MB_ICONQUESTION);
dvander@1651
   223
dvander@1651
   224
	if (val == 0 || val == IDYES)
dvander@1651
   225
	{
dvander@1722
   226
		UpdateGlobalPosition(hWnd);
dvander@1651
   227
		EndDialog(hWnd, NULL);
dvander@1651
   228
		return (INT_PTR)TRUE;
dvander@1651
   229
	}
dvander@1651
   230
	
dvander@1651
   231
	return (INT_PTR)FALSE;
dvander@1651
   232
}
dvander@1722
   233
dvander@1722
   234
size_t UTIL_GetFileSize(const TCHAR *file_path)
dvander@1722
   235
{
dvander@1722
   236
	HANDLE hFile;
dvander@1722
   237
dvander@1722
   238
	if ((hFile = CreateFile(file_path, 
dvander@1722
   239
		GENERIC_READ,
dvander@1722
   240
		FILE_SHARE_READ,
dvander@1722
   241
		NULL,
dvander@1722
   242
		OPEN_EXISTING,
dvander@1722
   243
		FILE_ATTRIBUTE_NORMAL,
dvander@1722
   244
		NULL)) 
dvander@1722
   245
		!= INVALID_HANDLE_VALUE)
dvander@1722
   246
	{
dvander@1722
   247
		LARGE_INTEGER size;
dvander@1722
   248
dvander@1722
   249
		if (GetFileSizeEx(hFile, &size))
dvander@1722
   250
		{
dvander@1722
   251
			CloseHandle(hFile);
dvander@1722
   252
			return (size_t)size.QuadPart;
dvander@1722
   253
		}
dvander@1722
   254
dvander@1722
   255
		CloseHandle(hFile);
dvander@1722
   256
	}
dvander@1722
   257
dvander@1722
   258
	return 0;
dvander@1722
   259
}
dvander@1722
   260
dvander@1722
   261
#if 0
dvander@1722
   262
size_t UTIL_GetFolderSize(const TCHAR *basepath)
dvander@1722
   263
{
dvander@1722
   264
	HANDLE hFind;
dvander@1722
   265
	WIN32_FIND_DATA fd;
dvander@1722
   266
	TCHAR search_path[MAX_PATH];
dvander@1722
   267
	size_t total = 0;
dvander@1722
   268
dvander@1722
   269
	UTIL_PathFormat(search_path,
dvander@1722
   270
		sizeof(search_path) / sizeof(TCHAR),
dvander@1722
   271
		_T("%s\\*.*"),
dvander@1722
   272
		basepath);
dvander@1722
   273
dvander@1722
   274
	if ((hFind = FindFirstFile(search_path, &fd)) == INVALID_HANDLE_VALUE)
dvander@1722
   275
	{
dvander@1722
   276
		return 0;
dvander@1722
   277
	}
dvander@1722
   278
dvander@1722
   279
	do
dvander@1722
   280
	{
dvander@1722
   281
		if (tstrcasecmp(fd.cFileName, _T(".")) == 0
dvander@1722
   282
			|| tstrcasecmp(fd.cFileName, _T("..")) == 0)
dvander@1722
   283
		{
dvander@1722
   284
			continue;
dvander@1722
   285
		}
dvander@1722
   286
dvander@1722
   287
		if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
dvander@1722
   288
		{
dvander@1722
   289
			UTIL_PathFormat(search_path,
dvander@1722
   290
				sizeof(search_path) / sizeof(TCHAR),
dvander@1722
   291
				_T("%s\\%s"),
dvander@1722
   292
				basepath,
dvander@1722
   293
				fd.cFileName);
dvander@1722
   294
			total += UTIL_GetFolderSize(search_path);
dvander@1722
   295
		}
dvander@1722
   296
		else
dvander@1722
   297
		{
dvander@1722
   298
			UTIL_PathFormat(search_path,
dvander@1722
   299
				sizeof(search_path) / sizeof(TCHAR),
dvander@1722
   300
				_T("%s\\%s"),
dvander@1722
   301
				basepath,
dvander@1722
   302
				fd.cFileName);
dvander@1722
   303
dvander@1722
   304
			total += UTIL_GetFileSize(search_path);
dvander@1722
   305
		}
dvander@1722
   306
	} while (FindNextFile(hFind, &fd));
dvander@1722
   307
dvander@1722
   308
	FindClose(hFind);
dvander@1722
   309
dvander@1722
   310
	return total;
dvander@1722
   311
}
dvander@1722
   312
#endif