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