tools/installer/PerformInstall.cpp
author David Anderson <dvander@alliedmods.net>
Sun Oct 28 20:15:51 2007 +0000 (2007-10-28)
changeset 1651 077571ea8942
child 1722 2c16f160f5dd
permissions -rw-r--r--
initial import of incomplete installer
dvander@1651
     1
#include "InstallerMain.h"
dvander@1651
     2
#include "InstallerUtil.h"
dvander@1651
     3
#include "PerformInstall.h"
dvander@1651
     4
dvander@1651
     5
struct folder_t
dvander@1651
     6
{
dvander@1651
     7
	TCHAR path[MAX_PATH];
dvander@1651
     8
};
dvander@1651
     9
dvander@1651
    10
ICopyMethod *g_pCopyMethod = NULL;
dvander@1651
    11
bool do_not_copy_binaries = false;
dvander@1651
    12
TCHAR source_path[MAX_PATH];
dvander@1651
    13
dvander@1651
    14
void SetInstallMethod(ICopyMethod *pCopyMethod)
dvander@1651
    15
{
dvander@1651
    16
	g_pCopyMethod = pCopyMethod;
dvander@1651
    17
}
dvander@1651
    18
dvander@1651
    19
bool CopyStructureRecursively(const TCHAR *basepath,
dvander@1651
    20
							  const TCHAR *local_path,
dvander@1651
    21
							  TCHAR *errbuf,
dvander@1651
    22
							  size_t maxchars)
dvander@1651
    23
{
dvander@1651
    24
	HANDLE hFind;
dvander@1651
    25
	WIN32_FIND_DATA fd;
dvander@1651
    26
	TCHAR search_path[MAX_PATH];
dvander@1651
    27
	folder_t *folder_list = NULL;
dvander@1651
    28
	unsigned int folder_count = 0;
dvander@1651
    29
dvander@1651
    30
	if (local_path == NULL)
dvander@1651
    31
	{
dvander@1651
    32
		UTIL_PathFormat(search_path,
dvander@1651
    33
			sizeof(search_path) / sizeof(TCHAR),
dvander@1651
    34
			_T("%s\\*.*"),
dvander@1651
    35
			basepath);
dvander@1651
    36
	}
dvander@1651
    37
	else
dvander@1651
    38
	{
dvander@1651
    39
		UTIL_PathFormat(search_path,
dvander@1651
    40
			sizeof(search_path) / sizeof(TCHAR),
dvander@1651
    41
			_T("%s\\%s\\*.*"),
dvander@1651
    42
			basepath,
dvander@1651
    43
			local_path);
dvander@1651
    44
	}
dvander@1651
    45
dvander@1651
    46
	if (!g_pCopyMethod->SetCurrentFolder(local_path, errbuf, maxchars))
dvander@1651
    47
	{
dvander@1651
    48
		/* :TODO: set fail state */
dvander@1651
    49
		return false;
dvander@1651
    50
	}
dvander@1651
    51
dvander@1651
    52
	if ((hFind = FindFirstFile(search_path, &fd)) == INVALID_HANDLE_VALUE)
dvander@1651
    53
	{
dvander@1651
    54
		/* :TODO: set a fail state */
dvander@1651
    55
		return false;
dvander@1651
    56
	}
dvander@1651
    57
dvander@1651
    58
	do
dvander@1651
    59
	{
dvander@1651
    60
		if (tstrcasecmp(fd.cFileName, _T(".")) == 0
dvander@1651
    61
			|| tstrcasecmp(fd.cFileName, _T("..")) == 0)
dvander@1651
    62
		{
dvander@1651
    63
			continue;
dvander@1651
    64
		}
dvander@1651
    65
dvander@1651
    66
		if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
dvander@1651
    67
		{
dvander@1651
    68
			/* We cache the folder list so we don't have to keep changing folders back and forth, 
dvander@1651
    69
			 * which could be annoying on a slow copy connection.
dvander@1651
    70
			 */
dvander@1651
    71
			if (folder_list == NULL)
dvander@1651
    72
			{
dvander@1651
    73
				folder_list = (folder_t *)malloc(sizeof(folder_t) * (folder_count + 1));
dvander@1651
    74
			}
dvander@1651
    75
			else
dvander@1651
    76
			{
dvander@1651
    77
				folder_list = (folder_t *)realloc(folder_list, sizeof(folder_t) * (folder_count + 1));
dvander@1651
    78
			}
dvander@1651
    79
dvander@1651
    80
			UTIL_Format(folder_list[folder_count].path, MAX_PATH, _T("%s"), fd.cFileName);
dvander@1651
    81
			folder_count++;
dvander@1651
    82
		}
dvander@1651
    83
		else
dvander@1651
    84
		{
dvander@1651
    85
			TCHAR file_path[MAX_PATH];
dvander@1651
    86
dvander@1651
    87
			if (local_path == NULL)
dvander@1651
    88
			{
dvander@1651
    89
				UTIL_PathFormat(file_path,
dvander@1651
    90
					sizeof(file_path),
dvander@1651
    91
					_T("%s\\%s"),
dvander@1651
    92
					basepath,
dvander@1651
    93
					fd.cFileName);
dvander@1651
    94
			}
dvander@1651
    95
			else
dvander@1651
    96
			{
dvander@1651
    97
				UTIL_PathFormat(file_path,
dvander@1651
    98
					sizeof(file_path),
dvander@1651
    99
					_T("%s\\%s\\%s"),
dvander@1651
   100
					basepath,
dvander@1651
   101
					local_path,
dvander@1651
   102
					fd.cFileName);
dvander@1651
   103
			}
dvander@1651
   104
dvander@1651
   105
			if (!g_pCopyMethod->SendFile(file_path, errbuf, maxchars))
dvander@1651
   106
			{
dvander@1651
   107
				FindClose(hFind);
dvander@1651
   108
				free(folder_list);
dvander@1651
   109
				return false;
dvander@1651
   110
			}
dvander@1651
   111
		}
dvander@1651
   112
	} while (FindNextFile(hFind, &fd));
dvander@1651
   113
dvander@1651
   114
	FindClose(hFind);
dvander@1651
   115
dvander@1651
   116
	/* Now copy folders */
dvander@1651
   117
	for (unsigned int i = 0; i < folder_count; i++)
dvander@1651
   118
	{
dvander@1651
   119
		/* Try creating the folder */
dvander@1651
   120
		if (!g_pCopyMethod->CreateFolder(folder_list[i].path, errbuf, maxchars))
dvander@1651
   121
		{
dvander@1651
   122
			free(folder_list);
dvander@1651
   123
			return false;
dvander@1651
   124
		}
dvander@1651
   125
dvander@1651
   126
		TCHAR new_local_path[MAX_PATH];
dvander@1651
   127
		if (local_path == NULL)
dvander@1651
   128
		{
dvander@1651
   129
			UTIL_PathFormat(new_local_path,
dvander@1651
   130
				sizeof(new_local_path) / sizeof(TCHAR),
dvander@1651
   131
				_T("%s"),
dvander@1651
   132
				folder_list[i].path);
dvander@1651
   133
		}
dvander@1651
   134
		else
dvander@1651
   135
		{
dvander@1651
   136
			UTIL_PathFormat(new_local_path,
dvander@1651
   137
				sizeof(new_local_path) / sizeof(TCHAR),
dvander@1651
   138
				_T("%s\\%s"),
dvander@1651
   139
				local_path,
dvander@1651
   140
				folder_list[i].path);
dvander@1651
   141
		}
dvander@1651
   142
dvander@1651
   143
		if (!CopyStructureRecursively(basepath, new_local_path, errbuf, maxchars))
dvander@1651
   144
		{
dvander@1651
   145
			free(folder_list);
dvander@1651
   146
			return false;
dvander@1651
   147
		}
dvander@1651
   148
	}
dvander@1651
   149
dvander@1651
   150
	free(folder_list);
dvander@1651
   151
dvander@1651
   152
	return true;
dvander@1651
   153
}
dvander@1651
   154
dvander@1651
   155
bool StartInstallProcess(HWND hWnd)
dvander@1651
   156
{
dvander@1651
   157
	if (g_pCopyMethod->CheckForExistingInstall())
dvander@1651
   158
	{
dvander@1651
   159
		int val = MessageBox(
dvander@1651
   160
			hWnd, 
dvander@1651
   161
			_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
   162
			_T("SourceMod Installer"), 
dvander@1651
   163
			MB_YESNO|MB_ICONQUESTION);
dvander@1651
   164
dvander@1651
   165
		if (val == 0 || val == IDYES)
dvander@1651
   166
		{
dvander@1651
   167
			do_not_copy_binaries = true;
dvander@1651
   168
		}
dvander@1651
   169
		else
dvander@1651
   170
		{
dvander@1651
   171
			do_not_copy_binaries = false;
dvander@1651
   172
		}
dvander@1651
   173
	}
dvander@1651
   174
dvander@1651
   175
	TCHAR cur_path[MAX_PATH];
dvander@1651
   176
	if (_tgetcwd(cur_path, sizeof(cur_path)) == NULL)
dvander@1651
   177
	{
dvander@1651
   178
		MessageBox(
dvander@1651
   179
			hWnd,
dvander@1651
   180
			_T("Could not locate current directory!"),
dvander@1651
   181
			_T("SourceMod Installer"),
dvander@1651
   182
			MB_OK|MB_ICONERROR);
dvander@1651
   183
		return false;
dvander@1651
   184
	}
dvander@1651
   185
dvander@1651
   186
	UTIL_PathFormat(source_path,
dvander@1651
   187
		sizeof(source_path) / sizeof(TCHAR),
dvander@1651
   188
		_T("%s\\files"),
dvander@1651
   189
		cur_path);
dvander@1651
   190
dvander@1651
   191
	if (GetFileAttributes(source_path) == INVALID_FILE_ATTRIBUTES)
dvander@1651
   192
	{
dvander@1651
   193
		MessageBox(
dvander@1651
   194
			hWnd,
dvander@1651
   195
			_T("Could not locate the source installation files!"),
dvander@1651
   196
			_T("SourceMod Installer"),
dvander@1651
   197
			MB_OK|MB_ICONERROR);
dvander@1651
   198
		return false;
dvander@1651
   199
	}
dvander@1651
   200
dvander@1651
   201
dvander@1651
   202
dvander@1651
   203
	return true;
dvander@1651
   204
}
dvander@1651
   205
dvander@1651
   206
INT_PTR CALLBACK PerformInstallHandler(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
dvander@1651
   207
{
dvander@1651
   208
	switch (message)
dvander@1651
   209
	{
dvander@1651
   210
	case WM_INITDIALOG:
dvander@1651
   211
		{
dvander@1651
   212
			return (INT_PTR)TRUE;
dvander@1651
   213
		}
dvander@1651
   214
	case WM_COMMAND:
dvander@1651
   215
		{
dvander@1651
   216
			if (LOWORD(wParam) == ID_INSTALL_CANCEL
dvander@1651
   217
				|| LOWORD(wParam) == ID_CLOSE)
dvander@1651
   218
			{
dvander@1651
   219
				/* :TODO: enhance */
dvander@1651
   220
				EndDialog(hDlg, NULL);
dvander@1651
   221
				return (INT_PTR)TRUE;
dvander@1651
   222
			}
dvander@1651
   223
			break;
dvander@1651
   224
		}
dvander@1651
   225
	}
dvander@1651
   226
dvander@1651
   227
	return (INT_PTR)FALSE;
dvander@1651
   228
}
dvander@1651
   229
dvander@1651
   230
void *DisplayPerformInstall(HWND hWnd)
dvander@1651
   231
{
dvander@1651
   232
	INT_PTR val;
dvander@1651
   233
dvander@1651
   234
	if ((val = DialogBox(
dvander@1651
   235
		g_hInstance, 
dvander@1651
   236
		MAKEINTRESOURCE(IDD_PERFORM_INSTALL),
dvander@1651
   237
		hWnd,
dvander@1651
   238
		PerformInstallHandler)) == -1)
dvander@1651
   239
	{
dvander@1651
   240
		return NULL;
dvander@1651
   241
	}
dvander@1651
   242
dvander@1651
   243
	return (void *)val;
dvander@1651
   244
}