1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/tools/installer/ChooseMethod.cpp Sun Mar 30 07:00:22 2008 +0000
1.3 @@ -0,0 +1,235 @@
1.4 +#include "InstallerMain.h"
1.5 +#include "InstallerUtil.h"
1.6 +#include "ChooseMethod.h"
1.7 +#include "Welcome.h"
1.8 +#include "GamesList.h"
1.9 +#include "SelectGame.h"
1.10 +#include "PerformInstall.h"
1.11 +#include "LocalCopyMethod.h"
1.12 +
1.13 +game_group_t *g_game_group = NULL;
1.14 +unsigned int method_chosen = 0;
1.15 +TCHAR method_path[MAX_PATH];
1.16 +
1.17 +bool SelectFolder(HWND hOwner)
1.18 +{
1.19 + BROWSEINFO info;
1.20 + LPITEMIDLIST pidlist;
1.21 + TCHAR path[MAX_PATH];
1.22 +
1.23 + if (FAILED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)))
1.24 + {
1.25 + return false;
1.26 + }
1.27 +
1.28 + info.hwndOwner = hOwner;
1.29 + info.pidlRoot = NULL;
1.30 + info.pszDisplayName = path;
1.31 + info.lpszTitle = _T("Select a game/mod folder");
1.32 + info.ulFlags = BIF_EDITBOX | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;
1.33 + info.lpfn = NULL;
1.34 + info.lParam = 0;
1.35 + info.iImage = 0;
1.36 +
1.37 + if ((pidlist = SHBrowseForFolder(&info)) == NULL)
1.38 + {
1.39 + CoUninitialize();
1.40 + return false;
1.41 + }
1.42 +
1.43 + /* This hellish code is from MSDN and translate shortcuts to real targets.
1.44 + * God almighty, I wish Window used real symlinks.
1.45 + */
1.46 + bool acquire_success = false;
1.47 + bool is_link = false;
1.48 + IShellFolder *psf = NULL;
1.49 + LPCITEMIDLIST new_item_list;
1.50 + HRESULT hr;
1.51 +
1.52 + hr = SHBindToParent(pidlist, IID_IShellFolder, (void **)&psf, &new_item_list);
1.53 + if (SUCCEEDED(hr))
1.54 + {
1.55 + IShellLink *psl = NULL;
1.56 +
1.57 + hr = psf->GetUIObjectOf(hOwner, 1, &new_item_list, IID_IShellLink, NULL, (void **)&psl);
1.58 + if (SUCCEEDED(hr))
1.59 + {
1.60 + LPITEMIDLIST new_item_list;
1.61 +
1.62 + hr = psl->GetIDList(&new_item_list);
1.63 + if (SUCCEEDED(hr))
1.64 + {
1.65 + is_link = true;
1.66 +
1.67 + hr = SHGetPathFromIDList(new_item_list, method_path);
1.68 + if (SUCCEEDED(hr))
1.69 + {
1.70 + acquire_success = true;
1.71 + }
1.72 +
1.73 + CoTaskMemFree(new_item_list);
1.74 + }
1.75 + psl->Release();
1.76 + }
1.77 + psf->Release();
1.78 + }
1.79 +
1.80 + if (!acquire_success && !is_link)
1.81 + {
1.82 + hr = SHGetPathFromIDList(pidlist, method_path);
1.83 + if (SUCCEEDED(hr))
1.84 + {
1.85 + acquire_success = true;
1.86 + }
1.87 + }
1.88 +
1.89 + /* That was awful. shoo, shoo, COM */
1.90 + CoTaskMemFree(pidlist);
1.91 + CoUninitialize();
1.92 +
1.93 + return acquire_success;
1.94 +}
1.95 +
1.96 +INT_PTR CALLBACK ChooseMethodHandler(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
1.97 +{
1.98 + switch (message)
1.99 + {
1.100 + case WM_COMMAND:
1.101 + {
1.102 + if (LOWORD(wParam) == ID_METHOD_BACK)
1.103 + {
1.104 + UpdateGlobalPosition(hDlg);
1.105 + EndDialog(hDlg, (INT_PTR)DisplayWelcome);
1.106 + return (INT_PTR)TRUE;
1.107 + }
1.108 + else if (LOWORD(wParam) == ID_METHOD_EXIT
1.109 + || LOWORD(wParam) == ID_CLOSE)
1.110 + {
1.111 + return AskToExit(hDlg);
1.112 + }
1.113 + else if (LOWORD(wParam) == IDC_METHOD_DED_SERVER
1.114 + || LOWORD(wParam) == IDC_METHOD_ALONE_SERVER
1.115 + || LOWORD(wParam) == IDC_METHOD_LISTEN_SERVER
1.116 + || LOWORD(wParam) == IDC_METHOD_UPLOAD_FTP
1.117 + || LOWORD(wParam) == IDC_METHOD_CUSTOM_FOLDER)
1.118 + {
1.119 + method_chosen = LOWORD(wParam);
1.120 + HWND button = GetDlgItem(hDlg, ID_METHOD_NEXT);
1.121 + EnableWindow(button, TRUE);
1.122 + break;
1.123 + }
1.124 + else if (LOWORD(wParam) == ID_METHOD_NEXT)
1.125 + {
1.126 + unsigned int game_type = 0;
1.127 +
1.128 + switch (method_chosen)
1.129 + {
1.130 + case IDC_METHOD_DED_SERVER:
1.131 + {
1.132 + game_type = GAMES_DEDICATED;
1.133 + break;
1.134 + }
1.135 + case IDC_METHOD_ALONE_SERVER:
1.136 + {
1.137 + game_type = GAMES_STANDALONE;
1.138 + break;
1.139 + }
1.140 + case IDC_METHOD_LISTEN_SERVER:
1.141 + {
1.142 + game_type = GAMES_LISTEN;
1.143 + break;
1.144 + }
1.145 + case IDC_METHOD_UPLOAD_FTP:
1.146 + {
1.147 + break;
1.148 + }
1.149 + case IDC_METHOD_CUSTOM_FOLDER:
1.150 + {
1.151 + int val;
1.152 +
1.153 + if (!SelectFolder(hDlg))
1.154 + {
1.155 + break;
1.156 + }
1.157 +
1.158 + val = IsValidFolder(method_path);
1.159 + if (val != GAMEINFO_IS_USABLE)
1.160 + {
1.161 + DisplayBadFolderDialog(hDlg, val);
1.162 + break;
1.163 + }
1.164 +
1.165 + g_LocalCopier.SetOutputPath(method_path);
1.166 + SetInstallMethod(&g_LocalCopier);
1.167 +
1.168 + UpdateGlobalPosition(hDlg);
1.169 + EndDialog(hDlg, (INT_PTR)DisplayPerformInstall);
1.170 + }
1.171 + }
1.172 +
1.173 + if (game_type != 0)
1.174 + {
1.175 + g_game_group = NULL;
1.176 +
1.177 + BuildGameDB();
1.178 +
1.179 + if (game_type == GAMES_DEDICATED)
1.180 + {
1.181 + g_game_group = &g_games.dedicated;
1.182 + }
1.183 + else if (game_type == GAMES_LISTEN)
1.184 + {
1.185 + g_game_group = &g_games.listen;
1.186 + }
1.187 + else if (game_type == GAMES_STANDALONE)
1.188 + {
1.189 + g_game_group = &g_games.standalone;
1.190 + }
1.191 +
1.192 + if (g_game_group == NULL)
1.193 + {
1.194 + return (INT_PTR)TRUE;
1.195 + }
1.196 +
1.197 + if (g_game_group->list_count == 0)
1.198 + {
1.199 + DisplayBadGamesDialog(hDlg, g_game_group->error_code);
1.200 + return (INT_PTR)TRUE;
1.201 + }
1.202 +
1.203 + /* If we got a valid games list, we can display the next
1.204 + * dialog box.
1.205 + */
1.206 + UpdateGlobalPosition(hDlg);
1.207 + EndDialog(hDlg, (INT_PTR)DisplaySelectGame);
1.208 + return (INT_PTR)TRUE;
1.209 + }
1.210 + }
1.211 + break;
1.212 + }
1.213 + case WM_INITDIALOG:
1.214 + {
1.215 + SetToGlobalPosition(hDlg);
1.216 + return (INT_PTR)TRUE;
1.217 + }
1.218 + }
1.219 +
1.220 + return (INT_PTR)FALSE;
1.221 +}
1.222 +
1.223 +void *DisplayChooseMethod(HWND hWnd)
1.224 +{
1.225 + INT_PTR val;
1.226 +
1.227 + if ((val = DialogBox(
1.228 + g_hInstance,
1.229 + MAKEINTRESOURCE(IDD_CHOOSE_METHOD),
1.230 + hWnd,
1.231 + ChooseMethodHandler)) == -1)
1.232 + {
1.233 + return NULL;
1.234 + }
1.235 +
1.236 + return (void *)val;
1.237 +}
1.238 +