tools/installer/ChooseMethod.cpp
author Scott Ehlert <ds@alliedmods.net>
Tue May 13 08:22:49 2008 +0000 (2008-05-13)
changeset 2051 568678a2e847
parent 1952 b7aa2b626807
child 2289 44045ead61cd
permissions -rw-r--r--
Trunk build fixes
Fixed up IGameHelpers.h such that it no longer requires HL2SDK headers if a function doesn't need them
ds@1952
     1
#include "InstallerMain.h"
ds@1952
     2
#include "InstallerUtil.h"
ds@1952
     3
#include "ChooseMethod.h"
ds@1952
     4
#include "Welcome.h"
ds@1952
     5
#include "GamesList.h"
ds@1952
     6
#include "SelectGame.h"
ds@1952
     7
#include "PerformInstall.h"
ds@1952
     8
#include "LocalCopyMethod.h"
ds@1952
     9
ds@1952
    10
game_group_t *g_game_group = NULL;
ds@1952
    11
unsigned int method_chosen = 0;
ds@1952
    12
TCHAR method_path[MAX_PATH];
ds@1952
    13
ds@1952
    14
bool SelectFolder(HWND hOwner)
ds@1952
    15
{
ds@1952
    16
	BROWSEINFO info;
ds@1952
    17
	LPITEMIDLIST pidlist;
ds@1952
    18
	TCHAR path[MAX_PATH];
ds@1952
    19
ds@1952
    20
	if (FAILED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)))
ds@1952
    21
	{
ds@1952
    22
		return false;
ds@1952
    23
	}
ds@1952
    24
	
ds@1952
    25
	info.hwndOwner = hOwner;
ds@1952
    26
	info.pidlRoot = NULL;
ds@1952
    27
	info.pszDisplayName = path;
ds@1952
    28
	info.lpszTitle = _T("Select a game/mod folder");
ds@1952
    29
	info.ulFlags = BIF_EDITBOX | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;
ds@1952
    30
	info.lpfn = NULL;
ds@1952
    31
	info.lParam = 0;
ds@1952
    32
	info.iImage = 0;
ds@1952
    33
ds@1952
    34
	if ((pidlist = SHBrowseForFolder(&info)) == NULL)
ds@1952
    35
	{
ds@1952
    36
		CoUninitialize();
ds@1952
    37
		return false;
ds@1952
    38
	}
ds@1952
    39
ds@1952
    40
	/* This hellish code is from MSDN and translate shortcuts to real targets.
ds@1952
    41
	 * God almighty, I wish Window used real symlinks.
ds@1952
    42
	 */
ds@1952
    43
	bool acquire_success = false;
ds@1952
    44
	bool is_link = false;
ds@1952
    45
	IShellFolder *psf = NULL;
ds@1952
    46
	LPCITEMIDLIST new_item_list;
ds@1952
    47
	HRESULT hr;
ds@1952
    48
	
ds@1952
    49
	hr = SHBindToParent(pidlist, IID_IShellFolder, (void **)&psf, &new_item_list);
ds@1952
    50
	if (SUCCEEDED(hr))
ds@1952
    51
	{
ds@1952
    52
		IShellLink *psl = NULL;
ds@1952
    53
ds@1952
    54
		hr = psf->GetUIObjectOf(hOwner, 1, &new_item_list, IID_IShellLink, NULL, (void **)&psl);
ds@1952
    55
		if (SUCCEEDED(hr))
ds@1952
    56
		{
ds@1952
    57
			LPITEMIDLIST new_item_list;
ds@1952
    58
ds@1952
    59
			hr = psl->GetIDList(&new_item_list);
ds@1952
    60
			if (SUCCEEDED(hr))
ds@1952
    61
			{
ds@1952
    62
				is_link = true;
ds@1952
    63
ds@1952
    64
				hr = SHGetPathFromIDList(new_item_list, method_path);
ds@1952
    65
				if (SUCCEEDED(hr))
ds@1952
    66
				{
ds@1952
    67
					acquire_success = true;
ds@1952
    68
				}
ds@1952
    69
ds@1952
    70
				CoTaskMemFree(new_item_list);
ds@1952
    71
			}
ds@1952
    72
			psl->Release();
ds@1952
    73
		}
ds@1952
    74
		psf->Release();
ds@1952
    75
	}
ds@1952
    76
ds@1952
    77
	if (!acquire_success && !is_link)
ds@1952
    78
	{
ds@1952
    79
		hr = SHGetPathFromIDList(pidlist, method_path);
ds@1952
    80
		if (SUCCEEDED(hr))
ds@1952
    81
		{
ds@1952
    82
			acquire_success = true;
ds@1952
    83
		}
ds@1952
    84
	}
ds@1952
    85
ds@1952
    86
	/* That was awful.  shoo, shoo, COM */
ds@1952
    87
	CoTaskMemFree(pidlist);
ds@1952
    88
	CoUninitialize();
ds@1952
    89
ds@1952
    90
	return acquire_success;
ds@1952
    91
}
ds@1952
    92
ds@1952
    93
INT_PTR CALLBACK ChooseMethodHandler(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
ds@1952
    94
{
ds@1952
    95
	switch (message)
ds@1952
    96
	{
ds@1952
    97
	case WM_COMMAND:
ds@1952
    98
		{
ds@1952
    99
			if (LOWORD(wParam) == ID_METHOD_BACK)
ds@1952
   100
			{
ds@1952
   101
				UpdateGlobalPosition(hDlg);
ds@1952
   102
				EndDialog(hDlg, (INT_PTR)DisplayWelcome);
ds@1952
   103
				return (INT_PTR)TRUE;
ds@1952
   104
			}
ds@1952
   105
			else if (LOWORD(wParam) == ID_METHOD_EXIT
ds@1952
   106
					 || LOWORD(wParam) == ID_CLOSE)
ds@1952
   107
			{
ds@1952
   108
				return AskToExit(hDlg);
ds@1952
   109
			}
ds@1952
   110
			else if (LOWORD(wParam) == IDC_METHOD_DED_SERVER
ds@1952
   111
					 || LOWORD(wParam) == IDC_METHOD_ALONE_SERVER
ds@1952
   112
					 || LOWORD(wParam) == IDC_METHOD_LISTEN_SERVER
ds@1952
   113
					 || LOWORD(wParam) == IDC_METHOD_UPLOAD_FTP
ds@1952
   114
					 || LOWORD(wParam) == IDC_METHOD_CUSTOM_FOLDER)
ds@1952
   115
			{
ds@1952
   116
				method_chosen = LOWORD(wParam);
ds@1952
   117
				HWND button = GetDlgItem(hDlg, ID_METHOD_NEXT);
ds@1952
   118
				EnableWindow(button, TRUE);
ds@1952
   119
				break;
ds@1952
   120
			}
ds@1952
   121
			else if (LOWORD(wParam) == ID_METHOD_NEXT)
ds@1952
   122
			{
ds@1952
   123
				unsigned int game_type = 0;
ds@1952
   124
ds@1952
   125
				switch (method_chosen)
ds@1952
   126
				{
ds@1952
   127
				case IDC_METHOD_DED_SERVER:
ds@1952
   128
					{
ds@1952
   129
						game_type = GAMES_DEDICATED;
ds@1952
   130
						break;
ds@1952
   131
					}
ds@1952
   132
				case IDC_METHOD_ALONE_SERVER:
ds@1952
   133
					{
ds@1952
   134
						game_type = GAMES_STANDALONE;
ds@1952
   135
						break;
ds@1952
   136
					}
ds@1952
   137
				case IDC_METHOD_LISTEN_SERVER:
ds@1952
   138
					{
ds@1952
   139
						game_type = GAMES_LISTEN;
ds@1952
   140
						break;
ds@1952
   141
					}
ds@1952
   142
				case IDC_METHOD_UPLOAD_FTP:
ds@1952
   143
					{
ds@1952
   144
						break;
ds@1952
   145
					}
ds@1952
   146
				case IDC_METHOD_CUSTOM_FOLDER:
ds@1952
   147
					{
ds@1952
   148
						int val;
ds@1952
   149
ds@1952
   150
						if (!SelectFolder(hDlg))
ds@1952
   151
						{
ds@1952
   152
							break;
ds@1952
   153
						}
ds@1952
   154
						
ds@1952
   155
						val = IsValidFolder(method_path);
ds@1952
   156
						if (val != GAMEINFO_IS_USABLE)
ds@1952
   157
						{
ds@1952
   158
							DisplayBadFolderDialog(hDlg, val);
ds@1952
   159
							break;
ds@1952
   160
						}
ds@1952
   161
ds@1952
   162
						g_LocalCopier.SetOutputPath(method_path);
ds@1952
   163
						SetInstallMethod(&g_LocalCopier);
ds@1952
   164
ds@1952
   165
						UpdateGlobalPosition(hDlg);
ds@1952
   166
						EndDialog(hDlg, (INT_PTR)DisplayPerformInstall);
ds@1952
   167
					}
ds@1952
   168
				}
ds@1952
   169
ds@1952
   170
				if (game_type != 0)
ds@1952
   171
				{
ds@1952
   172
					g_game_group = NULL;
ds@1952
   173
ds@1952
   174
					BuildGameDB();
ds@1952
   175
ds@1952
   176
					if (game_type == GAMES_DEDICATED)
ds@1952
   177
					{
ds@1952
   178
						g_game_group = &g_games.dedicated;
ds@1952
   179
					}
ds@1952
   180
					else if (game_type == GAMES_LISTEN)
ds@1952
   181
					{
ds@1952
   182
						g_game_group = &g_games.listen;
ds@1952
   183
					}
ds@1952
   184
					else if (game_type == GAMES_STANDALONE)
ds@1952
   185
					{
ds@1952
   186
						g_game_group = &g_games.standalone;
ds@1952
   187
					}
ds@1952
   188
					
ds@1952
   189
					if (g_game_group == NULL)
ds@1952
   190
					{
ds@1952
   191
						return (INT_PTR)TRUE;
ds@1952
   192
					}
ds@1952
   193
ds@1952
   194
					if (g_game_group->list_count == 0)
ds@1952
   195
					{
ds@1952
   196
						DisplayBadGamesDialog(hDlg, g_game_group->error_code);
ds@1952
   197
						return (INT_PTR)TRUE;
ds@1952
   198
					}
ds@1952
   199
ds@1952
   200
					/* If we got a valid games list, we can display the next 
ds@1952
   201
					 * dialog box.
ds@1952
   202
					 */
ds@1952
   203
					UpdateGlobalPosition(hDlg);
ds@1952
   204
					EndDialog(hDlg, (INT_PTR)DisplaySelectGame);
ds@1952
   205
					return (INT_PTR)TRUE;
ds@1952
   206
				}
ds@1952
   207
			}
ds@1952
   208
			break;
ds@1952
   209
		}
ds@1952
   210
	case WM_INITDIALOG:
ds@1952
   211
		{
ds@1952
   212
			SetToGlobalPosition(hDlg);
ds@1952
   213
			return (INT_PTR)TRUE;
ds@1952
   214
		}
ds@1952
   215
	}
ds@1952
   216
ds@1952
   217
	return (INT_PTR)FALSE;
ds@1952
   218
}
ds@1952
   219
ds@1952
   220
void *DisplayChooseMethod(HWND hWnd)
ds@1952
   221
{
ds@1952
   222
	INT_PTR val;
ds@1952
   223
	
ds@1952
   224
	if ((val = DialogBox(
ds@1952
   225
		g_hInstance, 
ds@1952
   226
		MAKEINTRESOURCE(IDD_CHOOSE_METHOD),
ds@1952
   227
		hWnd,
ds@1952
   228
		ChooseMethodHandler)) == -1)
ds@1952
   229
	{
ds@1952
   230
		return NULL;
ds@1952
   231
	}
ds@1952
   232
ds@1952
   233
	return (void *)val;
ds@1952
   234
}
ds@1952
   235