Spring Cleaning, Part Ichi (1)
Various minor things done to project files Updated sample extension project file and updated makefile to the new unified version (more changes likely on the way) Updated regex project file and makefile --HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401971
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
#ifndef _INCLUDE_INSTALLER_CRIT_SECT_H_
|
||||
#define _INCLUDE_INSTALLER_CRIT_SECT_H_
|
||||
|
||||
#include "platform_headers.h"
|
||||
|
||||
class CCriticalSection
|
||||
{
|
||||
public:
|
||||
CCriticalSection()
|
||||
{
|
||||
InitializeCriticalSection(&m_crit);
|
||||
}
|
||||
~CCriticalSection()
|
||||
{
|
||||
DeleteCriticalSection(&m_crit);
|
||||
}
|
||||
void Enter()
|
||||
{
|
||||
EnterCriticalSection(&m_crit);
|
||||
}
|
||||
bool TryEnter()
|
||||
{
|
||||
if (TryEnterCriticalSection(&m_crit))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
void Leave()
|
||||
{
|
||||
LeaveCriticalSection(&m_crit);
|
||||
}
|
||||
private:
|
||||
CRITICAL_SECTION m_crit;
|
||||
};
|
||||
|
||||
#endif //_INCLUDE_INSTALLER_CRIT_SECT_H_
|
||||
@@ -0,0 +1,151 @@
|
||||
#include "CFileList.h"
|
||||
#include "InstallerUtil.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
CFileList::CFileList(const TCHAR *name) : m_TotalSize(0), m_RecursiveSize(0),
|
||||
m_bGotRecursiveSize(false)
|
||||
{
|
||||
UTIL_Format(m_FolderName, sizeof(m_FolderName) / sizeof(TCHAR), _T("%s"), name);
|
||||
}
|
||||
|
||||
CFileList::~CFileList()
|
||||
{
|
||||
list<CFileList *>::iterator iter;
|
||||
|
||||
for (iter = m_folder_list.begin();
|
||||
iter != m_folder_list.end();
|
||||
iter++)
|
||||
{
|
||||
delete (*iter);
|
||||
}
|
||||
}
|
||||
|
||||
const TCHAR *CFileList::GetFolderName()
|
||||
{
|
||||
return m_FolderName;
|
||||
}
|
||||
|
||||
void CFileList::AddFolder(CFileList *pFileList)
|
||||
{
|
||||
m_folder_list.push_back(pFileList);
|
||||
}
|
||||
|
||||
void CFileList::AddFile(const TCHAR *name, unsigned __int64 size)
|
||||
{
|
||||
CFileListEntry entry;
|
||||
|
||||
UTIL_Format(entry.file, sizeof(entry.file) / sizeof(TCHAR), _T("%s"), name);
|
||||
entry.size = size;
|
||||
|
||||
m_file_list.push_back(entry);
|
||||
m_TotalSize += size;
|
||||
}
|
||||
|
||||
unsigned __int64 CFileList::GetRecursiveSize()
|
||||
{
|
||||
if (m_bGotRecursiveSize)
|
||||
{
|
||||
return m_RecursiveSize;
|
||||
}
|
||||
|
||||
m_RecursiveSize = m_TotalSize;
|
||||
|
||||
list<CFileList *>::iterator iter;
|
||||
for (iter = m_folder_list.begin(); iter != m_folder_list.end(); iter++)
|
||||
{
|
||||
m_RecursiveSize += (*iter)->GetRecursiveSize();
|
||||
}
|
||||
|
||||
m_bGotRecursiveSize = true;
|
||||
|
||||
return m_RecursiveSize;
|
||||
}
|
||||
|
||||
const TCHAR *CFileList::PeekCurrentFile()
|
||||
{
|
||||
if (m_file_list.empty())
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return m_file_list.begin()->file;
|
||||
}
|
||||
|
||||
void CFileList::PopCurrentFile()
|
||||
{
|
||||
m_file_list.erase(m_file_list.begin());
|
||||
}
|
||||
|
||||
CFileList *CFileList::PeekCurrentFolder()
|
||||
{
|
||||
if (m_folder_list.empty())
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return *(m_folder_list.begin());
|
||||
}
|
||||
|
||||
void CFileList::PopCurrentFolder()
|
||||
{
|
||||
m_folder_list.erase(m_folder_list.begin());
|
||||
}
|
||||
|
||||
void RecursiveBuildFileList(CFileList *file_list, const TCHAR *current_folder)
|
||||
{
|
||||
HANDLE hFind;
|
||||
WIN32_FIND_DATA fd;
|
||||
TCHAR path[MAX_PATH];
|
||||
|
||||
UTIL_PathFormat(path, sizeof(path) / sizeof(TCHAR), _T("%s\\*.*"), current_folder);
|
||||
|
||||
if ((hFind = FindFirstFile(path, &fd)) == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
if (tstrcasecmp(fd.cFileName, _T(".")) == 0
|
||||
|| tstrcasecmp(fd.cFileName, _T("..")) == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
|
||||
{
|
||||
CFileList *pSubList = new CFileList(fd.cFileName);
|
||||
|
||||
UTIL_PathFormat(path,
|
||||
sizeof(path) / sizeof(TCHAR),
|
||||
_T("%s\\%s"),
|
||||
current_folder,
|
||||
fd.cFileName);
|
||||
|
||||
RecursiveBuildFileList(pSubList, path);
|
||||
|
||||
file_list->AddFolder(pSubList);
|
||||
}
|
||||
else
|
||||
{
|
||||
LARGE_INTEGER li;
|
||||
|
||||
li.LowPart = fd.nFileSizeLow;
|
||||
li.HighPart = fd.nFileSizeHigh;
|
||||
|
||||
file_list->AddFile(fd.cFileName, li.QuadPart);
|
||||
}
|
||||
} while (FindNextFile(hFind, &fd));
|
||||
|
||||
FindClose(hFind);
|
||||
}
|
||||
|
||||
CFileList *CFileList::BuildFileList(const TCHAR *name, const TCHAR *root_folder)
|
||||
{
|
||||
CFileList *pFileList = new CFileList(name);
|
||||
|
||||
RecursiveBuildFileList(pFileList, root_folder);
|
||||
|
||||
return pFileList;
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
#ifndef _INCLUDE_FOLDER_LIST_H_
|
||||
#define _INCLUDE_FOLDER_LIST_H_
|
||||
|
||||
#include "platform_headers.h"
|
||||
#include <list>
|
||||
#include <vector>
|
||||
|
||||
struct CFileListEntry
|
||||
{
|
||||
TCHAR file[MAX_PATH];
|
||||
unsigned __int64 size;
|
||||
};
|
||||
|
||||
class CFileList
|
||||
{
|
||||
public:
|
||||
CFileList(const TCHAR *name);
|
||||
~CFileList();
|
||||
public:
|
||||
CFileList *PeekCurrentFolder();
|
||||
void PopCurrentFolder();
|
||||
const TCHAR *PeekCurrentFile();
|
||||
void PopCurrentFile();
|
||||
const TCHAR *GetFolderName();
|
||||
public:
|
||||
void AddFolder(CFileList *pFileList);
|
||||
void AddFile(const TCHAR *name, unsigned __int64 size);
|
||||
unsigned __int64 GetRecursiveSize();
|
||||
public:
|
||||
static CFileList *BuildFileList(const TCHAR *name, const TCHAR *root_folder);
|
||||
private:
|
||||
std::list<CFileList *> m_folder_list;
|
||||
std::list<CFileListEntry> m_file_list;
|
||||
TCHAR m_FolderName[MAX_PATH];
|
||||
unsigned __int64 m_TotalSize;
|
||||
unsigned __int64 m_RecursiveSize;
|
||||
bool m_bGotRecursiveSize;
|
||||
};
|
||||
|
||||
#endif //_INCLUDE_FOLDER_LIST_H_
|
||||
@@ -0,0 +1,235 @@
|
||||
#include "InstallerMain.h"
|
||||
#include "InstallerUtil.h"
|
||||
#include "ChooseMethod.h"
|
||||
#include "Welcome.h"
|
||||
#include "GamesList.h"
|
||||
#include "SelectGame.h"
|
||||
#include "PerformInstall.h"
|
||||
#include "LocalCopyMethod.h"
|
||||
|
||||
game_group_t *g_game_group = NULL;
|
||||
unsigned int method_chosen = 0;
|
||||
TCHAR method_path[MAX_PATH];
|
||||
|
||||
bool SelectFolder(HWND hOwner)
|
||||
{
|
||||
BROWSEINFO info;
|
||||
LPITEMIDLIST pidlist;
|
||||
TCHAR path[MAX_PATH];
|
||||
|
||||
if (FAILED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
info.hwndOwner = hOwner;
|
||||
info.pidlRoot = NULL;
|
||||
info.pszDisplayName = path;
|
||||
info.lpszTitle = _T("Select a game/mod folder");
|
||||
info.ulFlags = BIF_EDITBOX | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;
|
||||
info.lpfn = NULL;
|
||||
info.lParam = 0;
|
||||
info.iImage = 0;
|
||||
|
||||
if ((pidlist = SHBrowseForFolder(&info)) == NULL)
|
||||
{
|
||||
CoUninitialize();
|
||||
return false;
|
||||
}
|
||||
|
||||
/* This hellish code is from MSDN and translate shortcuts to real targets.
|
||||
* God almighty, I wish Window used real symlinks.
|
||||
*/
|
||||
bool acquire_success = false;
|
||||
bool is_link = false;
|
||||
IShellFolder *psf = NULL;
|
||||
LPCITEMIDLIST new_item_list;
|
||||
HRESULT hr;
|
||||
|
||||
hr = SHBindToParent(pidlist, IID_IShellFolder, (void **)&psf, &new_item_list);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
IShellLink *psl = NULL;
|
||||
|
||||
hr = psf->GetUIObjectOf(hOwner, 1, &new_item_list, IID_IShellLink, NULL, (void **)&psl);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
LPITEMIDLIST new_item_list;
|
||||
|
||||
hr = psl->GetIDList(&new_item_list);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
is_link = true;
|
||||
|
||||
hr = SHGetPathFromIDList(new_item_list, method_path);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
acquire_success = true;
|
||||
}
|
||||
|
||||
CoTaskMemFree(new_item_list);
|
||||
}
|
||||
psl->Release();
|
||||
}
|
||||
psf->Release();
|
||||
}
|
||||
|
||||
if (!acquire_success && !is_link)
|
||||
{
|
||||
hr = SHGetPathFromIDList(pidlist, method_path);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
acquire_success = true;
|
||||
}
|
||||
}
|
||||
|
||||
/* That was awful. shoo, shoo, COM */
|
||||
CoTaskMemFree(pidlist);
|
||||
CoUninitialize();
|
||||
|
||||
return acquire_success;
|
||||
}
|
||||
|
||||
INT_PTR CALLBACK ChooseMethodHandler(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (message)
|
||||
{
|
||||
case WM_COMMAND:
|
||||
{
|
||||
if (LOWORD(wParam) == ID_METHOD_BACK)
|
||||
{
|
||||
UpdateGlobalPosition(hDlg);
|
||||
EndDialog(hDlg, (INT_PTR)DisplayWelcome);
|
||||
return (INT_PTR)TRUE;
|
||||
}
|
||||
else if (LOWORD(wParam) == ID_METHOD_EXIT
|
||||
|| LOWORD(wParam) == ID_CLOSE)
|
||||
{
|
||||
return AskToExit(hDlg);
|
||||
}
|
||||
else if (LOWORD(wParam) == IDC_METHOD_DED_SERVER
|
||||
|| LOWORD(wParam) == IDC_METHOD_ALONE_SERVER
|
||||
|| LOWORD(wParam) == IDC_METHOD_LISTEN_SERVER
|
||||
|| LOWORD(wParam) == IDC_METHOD_UPLOAD_FTP
|
||||
|| LOWORD(wParam) == IDC_METHOD_CUSTOM_FOLDER)
|
||||
{
|
||||
method_chosen = LOWORD(wParam);
|
||||
HWND button = GetDlgItem(hDlg, ID_METHOD_NEXT);
|
||||
EnableWindow(button, TRUE);
|
||||
break;
|
||||
}
|
||||
else if (LOWORD(wParam) == ID_METHOD_NEXT)
|
||||
{
|
||||
unsigned int game_type = 0;
|
||||
|
||||
switch (method_chosen)
|
||||
{
|
||||
case IDC_METHOD_DED_SERVER:
|
||||
{
|
||||
game_type = GAMES_DEDICATED;
|
||||
break;
|
||||
}
|
||||
case IDC_METHOD_ALONE_SERVER:
|
||||
{
|
||||
game_type = GAMES_STANDALONE;
|
||||
break;
|
||||
}
|
||||
case IDC_METHOD_LISTEN_SERVER:
|
||||
{
|
||||
game_type = GAMES_LISTEN;
|
||||
break;
|
||||
}
|
||||
case IDC_METHOD_UPLOAD_FTP:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case IDC_METHOD_CUSTOM_FOLDER:
|
||||
{
|
||||
int val;
|
||||
|
||||
if (!SelectFolder(hDlg))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
val = IsValidFolder(method_path);
|
||||
if (val != GAMEINFO_IS_USABLE)
|
||||
{
|
||||
DisplayBadFolderDialog(hDlg, val);
|
||||
break;
|
||||
}
|
||||
|
||||
g_LocalCopier.SetOutputPath(method_path);
|
||||
SetInstallMethod(&g_LocalCopier);
|
||||
|
||||
UpdateGlobalPosition(hDlg);
|
||||
EndDialog(hDlg, (INT_PTR)DisplayPerformInstall);
|
||||
}
|
||||
}
|
||||
|
||||
if (game_type != 0)
|
||||
{
|
||||
g_game_group = NULL;
|
||||
|
||||
BuildGameDB();
|
||||
|
||||
if (game_type == GAMES_DEDICATED)
|
||||
{
|
||||
g_game_group = &g_games.dedicated;
|
||||
}
|
||||
else if (game_type == GAMES_LISTEN)
|
||||
{
|
||||
g_game_group = &g_games.listen;
|
||||
}
|
||||
else if (game_type == GAMES_STANDALONE)
|
||||
{
|
||||
g_game_group = &g_games.standalone;
|
||||
}
|
||||
|
||||
if (g_game_group == NULL)
|
||||
{
|
||||
return (INT_PTR)TRUE;
|
||||
}
|
||||
|
||||
if (g_game_group->list_count == 0)
|
||||
{
|
||||
DisplayBadGamesDialog(hDlg, g_game_group->error_code);
|
||||
return (INT_PTR)TRUE;
|
||||
}
|
||||
|
||||
/* If we got a valid games list, we can display the next
|
||||
* dialog box.
|
||||
*/
|
||||
UpdateGlobalPosition(hDlg);
|
||||
EndDialog(hDlg, (INT_PTR)DisplaySelectGame);
|
||||
return (INT_PTR)TRUE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
SetToGlobalPosition(hDlg);
|
||||
return (INT_PTR)TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return (INT_PTR)FALSE;
|
||||
}
|
||||
|
||||
void *DisplayChooseMethod(HWND hWnd)
|
||||
{
|
||||
INT_PTR val;
|
||||
|
||||
if ((val = DialogBox(
|
||||
g_hInstance,
|
||||
MAKEINTRESOURCE(IDD_CHOOSE_METHOD),
|
||||
hWnd,
|
||||
ChooseMethodHandler)) == -1)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return (void *)val;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
#ifndef _INCLUDE_INSTALLER_CHOOSE_METHOD_H_
|
||||
#define _INCLUDE_INSTALLER_CHOOSE_METHOD_H_
|
||||
|
||||
#include "InstallerMain.h"
|
||||
#include "GamesList.h"
|
||||
|
||||
void *DisplayChooseMethod(HWND hWnd);
|
||||
|
||||
extern game_group_t *g_game_group;
|
||||
|
||||
#endif //_INCLUDE_INSTALLER_CHOOSE_METHOD_H_
|
||||
@@ -0,0 +1,574 @@
|
||||
#include "GamesList.h"
|
||||
#include "InstallerUtil.h"
|
||||
#include "InstallerMain.h"
|
||||
#include <stdio.h>
|
||||
|
||||
game_database_t g_games =
|
||||
{
|
||||
NULL, 0,
|
||||
{NULL, 0, GAME_LIST_NO_GAMES},
|
||||
{NULL, 0, GAME_LIST_NO_GAMES},
|
||||
{NULL, 0, GAME_LIST_NO_GAMES}
|
||||
};
|
||||
|
||||
valve_game_t valve_game_list[] =
|
||||
{
|
||||
{_T("counter-strike source"), _T("cstrike"), SOURCE_ENGINE_2004},
|
||||
{_T("day of defeat source"), _T("dod"), SOURCE_ENGINE_2004},
|
||||
{_T("half-life 2 deathmatch"), _T("hl2mp"), SOURCE_ENGINE_2004},
|
||||
{_T("half-life deathmatch source"), _T("hl1mp"), SOURCE_ENGINE_2004},
|
||||
{_T("team fortress 2"), _T("tf"), SOURCE_ENGINE_2007},
|
||||
{NULL, NULL, 0},
|
||||
};
|
||||
|
||||
valve_game_t valve_server_list[] =
|
||||
{
|
||||
{_T("source dedicated server"), NULL, SOURCE_ENGINE_2004},
|
||||
{_T("source 2007 dedicated server"), NULL, SOURCE_ENGINE_2007},
|
||||
{NULL, NULL, 0},
|
||||
};
|
||||
|
||||
int IsValidFolder(const TCHAR *path)
|
||||
{
|
||||
DWORD attr;
|
||||
TCHAR gameinfo_file[MAX_PATH];
|
||||
|
||||
UTIL_PathFormat(gameinfo_file, sizeof(gameinfo_file), _T("%s\\gameinfo.txt"), path);
|
||||
|
||||
if ((attr = GetFileAttributes(gameinfo_file)) == INVALID_FILE_ATTRIBUTES)
|
||||
{
|
||||
return GAMEINFO_DOES_NOT_EXIST;
|
||||
}
|
||||
|
||||
if ((attr & FILE_ATTRIBUTE_READONLY) == FILE_ATTRIBUTE_READONLY)
|
||||
{
|
||||
return GAMEINFO_IS_READ_ONLY;
|
||||
}
|
||||
|
||||
if ((attr & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
|
||||
{
|
||||
return GAMEINFO_DOES_NOT_EXIST;
|
||||
}
|
||||
|
||||
return GAMEINFO_IS_USABLE;
|
||||
}
|
||||
|
||||
void DisplayBadFolderDialog(HWND hDlg, int reason)
|
||||
{
|
||||
TCHAR message_string[255];
|
||||
UINT resource;
|
||||
|
||||
if (reason == GAMEINFO_DOES_NOT_EXIST)
|
||||
{
|
||||
resource = IDS_NO_GAMEINFO;
|
||||
}
|
||||
else if (reason == GAMEINFO_IS_READ_ONLY)
|
||||
{
|
||||
resource = IDS_READONLY_GAMEINFO;
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (LoadString(g_hInstance,
|
||||
resource,
|
||||
message_string,
|
||||
sizeof(message_string) / sizeof(TCHAR)
|
||||
) == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
MessageBox(hDlg,
|
||||
message_string,
|
||||
_T("SourceMod Installer"),
|
||||
MB_OK|MB_ICONWARNING);
|
||||
}
|
||||
|
||||
game_list_t *MakeGameList(const TCHAR *name)
|
||||
{
|
||||
game_list_t *gl = (game_list_t *)malloc(sizeof(game_list_t));
|
||||
|
||||
UTIL_Format(gl->root_name,
|
||||
sizeof(gl->root_name) / sizeof(TCHAR),
|
||||
_T("%s"),
|
||||
name);
|
||||
gl->game_count = 0;
|
||||
gl->games = NULL;
|
||||
|
||||
return gl;
|
||||
}
|
||||
|
||||
void AttachGameListToGroup(game_group_t *group, game_list_t *gl)
|
||||
{
|
||||
if (group->lists == NULL)
|
||||
{
|
||||
group->lists = (game_list_t **)malloc(sizeof(game_list_t *));
|
||||
}
|
||||
else
|
||||
{
|
||||
group->lists = (game_list_t **)realloc(group->lists,
|
||||
sizeof(game_list_t *) * (group->list_count + 1));
|
||||
}
|
||||
|
||||
group->lists[group->list_count] = gl;
|
||||
group->list_count++;
|
||||
}
|
||||
|
||||
void AttachModToGameList(game_list_t *gl, unsigned int mod_id)
|
||||
{
|
||||
if (gl->games == NULL)
|
||||
{
|
||||
gl->games = (unsigned int *)malloc(sizeof(unsigned int));
|
||||
}
|
||||
else
|
||||
{
|
||||
gl->games = (unsigned int *)realloc(gl->games,
|
||||
sizeof(unsigned int) * (gl->game_count + 1));
|
||||
}
|
||||
|
||||
gl->games[gl->game_count] = mod_id;
|
||||
gl->game_count++;
|
||||
}
|
||||
|
||||
unsigned int AddModToList(game_database_t *db, const game_info_t *mod_info)
|
||||
{
|
||||
/* Check if a matching game already exists */
|
||||
for (unsigned int i = 0; i < db->game_count; i++)
|
||||
{
|
||||
if (tstrcasecmp(mod_info->game_path, db->game_list[i].game_path) == 0)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
if (db->game_list == NULL)
|
||||
{
|
||||
db->game_list = (game_info_t *)malloc(sizeof(game_info_t));
|
||||
}
|
||||
else
|
||||
{
|
||||
db->game_list = (game_info_t *)realloc(db->game_list,
|
||||
sizeof(game_info_t) * (db->game_count + 1));
|
||||
}
|
||||
|
||||
memcpy(&db->game_list[db->game_count], mod_info, sizeof(game_info_t));
|
||||
db->game_count++;
|
||||
|
||||
return db->game_count - 1;
|
||||
}
|
||||
|
||||
bool TryToAddMod(const TCHAR *path, int eng_type, game_database_t *db, unsigned int *id)
|
||||
{
|
||||
FILE *fp;
|
||||
TCHAR gameinfo_path[MAX_PATH];
|
||||
|
||||
UTIL_PathFormat(gameinfo_path,
|
||||
sizeof(gameinfo_path),
|
||||
_T("%s\\gameinfo.txt"),
|
||||
path);
|
||||
|
||||
if ((fp = _tfopen(gameinfo_path, _T("rt"))) == NULL)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
int pos;
|
||||
char buffer[512];
|
||||
char key[256], value[256];
|
||||
while (!feof(fp) && fgets(buffer, sizeof(buffer), fp) != NULL)
|
||||
{
|
||||
if ((pos = BreakStringA(buffer, key, sizeof(key))) == -1)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ((pos = BreakStringA(&buffer[pos], value, sizeof(value))) == -1)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (strcmp(key, "game") == 0)
|
||||
{
|
||||
game_info_t mod;
|
||||
unsigned int got_id;
|
||||
|
||||
AnsiToUnicode(value, mod.name, sizeof(mod.name));
|
||||
UTIL_Format(mod.game_path, sizeof(mod.game_path), _T("%s"), path);
|
||||
mod.source_engine = eng_type;
|
||||
|
||||
got_id = AddModToList(db, &mod);
|
||||
|
||||
if (id != NULL)
|
||||
{
|
||||
*id = got_id;
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void AddModsFromFolder(const TCHAR *path,
|
||||
int eng_type,
|
||||
game_database_t *db,
|
||||
game_list_t *gl)
|
||||
{
|
||||
HANDLE hFind;
|
||||
WIN32_FIND_DATA fd;
|
||||
TCHAR temp_path[MAX_PATH];
|
||||
TCHAR search_path[MAX_PATH];
|
||||
unsigned int mod_id;
|
||||
|
||||
UTIL_Format(search_path,
|
||||
sizeof(search_path),
|
||||
_T("%s\\*.*"),
|
||||
path);
|
||||
|
||||
if ((hFind = FindFirstFile(search_path, &fd)) == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (tstrcasecmp(fd.cFileName, _T(".")) == 0
|
||||
|| tstrcasecmp(fd.cFileName, _T("..")) == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
UTIL_PathFormat(temp_path,
|
||||
sizeof(temp_path),
|
||||
_T("%s\\%s"),
|
||||
path,
|
||||
fd.cFileName);
|
||||
if (TryToAddMod(temp_path, eng_type, db, &mod_id))
|
||||
{
|
||||
AttachModToGameList(gl, mod_id);
|
||||
}
|
||||
} while (FindNextFile(hFind, &fd));
|
||||
|
||||
FindClose(hFind);
|
||||
}
|
||||
|
||||
void GetSteamGames(game_database_t *db)
|
||||
{
|
||||
HKEY hkPath;
|
||||
DWORD dwLen, dwType;
|
||||
HANDLE hFind;
|
||||
WIN32_FIND_DATA fd;
|
||||
TCHAR temp_path[MAX_PATH];
|
||||
TCHAR steam_path[MAX_PATH];
|
||||
TCHAR steamapps_path[MAX_PATH];
|
||||
|
||||
if (RegOpenKeyEx(HKEY_CURRENT_USER,
|
||||
_T("Software\\Valve\\Steam"),
|
||||
0,
|
||||
KEY_READ,
|
||||
&hkPath) != ERROR_SUCCESS)
|
||||
{
|
||||
db->listen.error_code = GAME_LIST_CANT_READ;
|
||||
db->dedicated.error_code = GAME_LIST_CANT_READ;
|
||||
return;
|
||||
}
|
||||
|
||||
dwLen = sizeof(steam_path) / sizeof(TCHAR);
|
||||
if (RegQueryValueEx(hkPath,
|
||||
_T("SteamPath"),
|
||||
NULL,
|
||||
&dwType,
|
||||
(LPBYTE)steam_path,
|
||||
&dwLen) != ERROR_SUCCESS)
|
||||
{
|
||||
RegCloseKey(hkPath);
|
||||
db->listen.error_code = GAME_LIST_CANT_READ;
|
||||
db->dedicated.error_code = GAME_LIST_CANT_READ;
|
||||
return;
|
||||
}
|
||||
|
||||
UTIL_PathFormat(steamapps_path,
|
||||
sizeof(steamapps_path) / sizeof(TCHAR),
|
||||
_T("%s\\steamapps\\*.*"),
|
||||
steam_path);
|
||||
|
||||
if ((hFind = FindFirstFile(steamapps_path, &fd)) == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
RegCloseKey(hkPath);
|
||||
db->listen.error_code = GAME_LIST_CANT_READ;
|
||||
db->dedicated.error_code = GAME_LIST_CANT_READ;
|
||||
return;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (tstrcasecmp(fd.cFileName, _T(".")) == 0
|
||||
|| tstrcasecmp(fd.cFileName, _T("..")) == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
/* If we get a folder called "SourceMods," look for third party mods */
|
||||
if (tstrcasecmp(fd.cFileName, _T("SourceMods")) == 0)
|
||||
{
|
||||
game_list_t *gl = MakeGameList(_T("Third-Party Games"));
|
||||
|
||||
UTIL_PathFormat(temp_path,
|
||||
sizeof(temp_path) / sizeof(TCHAR),
|
||||
_T("%s\\steamapps\\%s"),
|
||||
steam_path,
|
||||
fd.cFileName);
|
||||
|
||||
AddModsFromFolder(temp_path, SOURCE_ENGINE_UNKNOWN, db, gl);
|
||||
|
||||
if (gl->game_count)
|
||||
{
|
||||
AttachGameListToGroup(&db->listen, gl);
|
||||
}
|
||||
else
|
||||
{
|
||||
free(gl);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Look for listenserver games */
|
||||
game_list_t *gl = MakeGameList(fd.cFileName);
|
||||
|
||||
for (unsigned int i = 0; valve_game_list[i].folder != NULL; i++)
|
||||
{
|
||||
unsigned int mod_id;
|
||||
UTIL_PathFormat(temp_path,
|
||||
sizeof(temp_path) / sizeof(TCHAR),
|
||||
_T("%s\\steamapps\\%s\\%s\\%s"),
|
||||
steam_path,
|
||||
fd.cFileName,
|
||||
valve_game_list[i].folder,
|
||||
valve_game_list[i].subfolder);
|
||||
if (TryToAddMod(temp_path, valve_game_list[i].eng_type, db, &mod_id))
|
||||
{
|
||||
AttachModToGameList(gl, mod_id);
|
||||
}
|
||||
}
|
||||
|
||||
if (gl->game_count)
|
||||
{
|
||||
AttachGameListToGroup(&db->listen, gl);
|
||||
}
|
||||
else
|
||||
{
|
||||
free(gl);
|
||||
}
|
||||
|
||||
/* Look for dedicated games */
|
||||
gl = MakeGameList(fd.cFileName);
|
||||
|
||||
for (unsigned int i = 0; valve_server_list[i].folder != NULL; i++)
|
||||
{
|
||||
UTIL_PathFormat(temp_path,
|
||||
sizeof(temp_path) / sizeof(TCHAR),
|
||||
_T("%s\\steamapps\\%s\\%s"),
|
||||
steam_path,
|
||||
fd.cFileName,
|
||||
valve_server_list[i].folder);
|
||||
AddModsFromFolder(temp_path, valve_server_list[i].eng_type, db, gl);
|
||||
}
|
||||
|
||||
if (gl->game_count)
|
||||
{
|
||||
AttachGameListToGroup(&db->dedicated, gl);
|
||||
}
|
||||
else
|
||||
{
|
||||
free(gl);
|
||||
}
|
||||
}
|
||||
|
||||
} while (FindNextFile(hFind, &fd));
|
||||
|
||||
FindClose(hFind);
|
||||
RegCloseKey(hkPath);
|
||||
}
|
||||
|
||||
void GetStandaloneGames(game_database_t *db)
|
||||
{
|
||||
HKEY hkPath;
|
||||
DWORD dwLen, dwType, dwAttr;
|
||||
TCHAR temp_path[MAX_PATH];
|
||||
TCHAR hlds_path[MAX_PATH];
|
||||
game_list_t *games_standalone;
|
||||
|
||||
if (RegOpenKeyEx(HKEY_CURRENT_USER,
|
||||
_T("Software\\Valve\\HLServer"),
|
||||
0,
|
||||
KEY_READ,
|
||||
&hkPath) != ERROR_SUCCESS)
|
||||
{
|
||||
db->standalone.error_code = GAME_LIST_CANT_READ;
|
||||
return;
|
||||
}
|
||||
|
||||
dwLen = sizeof(hlds_path) / sizeof(TCHAR);
|
||||
if (RegQueryValueEx(hkPath,
|
||||
_T("InstallPath"),
|
||||
NULL,
|
||||
&dwType,
|
||||
(LPBYTE)hlds_path,
|
||||
&dwLen) != ERROR_SUCCESS)
|
||||
{
|
||||
RegCloseKey(hkPath);
|
||||
db->standalone.error_code = GAME_LIST_CANT_READ;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Make sure there is a "srcds.exe" file */
|
||||
UTIL_PathFormat(temp_path,
|
||||
sizeof(temp_path) / sizeof(TCHAR),
|
||||
_T("%s\\srcds.exe"),
|
||||
hlds_path);
|
||||
dwAttr = GetFileAttributes(temp_path);
|
||||
if (dwAttr == INVALID_FILE_ATTRIBUTES)
|
||||
{
|
||||
db->standalone.error_code = GAME_LIST_HALFLIFE1;
|
||||
return;
|
||||
}
|
||||
|
||||
games_standalone = MakeGameList(_T("Standalone"));
|
||||
|
||||
/* If there is an "orangebox" sub folder, we can make a better guess
|
||||
* at the engine state.
|
||||
*/
|
||||
UTIL_PathFormat(temp_path,
|
||||
sizeof(temp_path) / sizeof(TCHAR),
|
||||
_T("%s\\orangebox"),
|
||||
hlds_path);
|
||||
dwAttr = GetFileAttributes(temp_path);
|
||||
if (dwAttr != INVALID_FILE_ATTRIBUTES
|
||||
&& ((dwAttr & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY))
|
||||
{
|
||||
AddModsFromFolder(temp_path, SOURCE_ENGINE_2007, db, games_standalone);
|
||||
}
|
||||
|
||||
/* Add everything from the server */
|
||||
AddModsFromFolder(hlds_path, SOURCE_ENGINE_2004, db, games_standalone);
|
||||
|
||||
if (games_standalone->game_count)
|
||||
{
|
||||
AttachGameListToGroup(&db->standalone, games_standalone);
|
||||
}
|
||||
else
|
||||
{
|
||||
free(games_standalone);
|
||||
}
|
||||
|
||||
RegCloseKey(hkPath);
|
||||
}
|
||||
|
||||
void DisplayBadGamesDialog(HWND hWnd, int reason)
|
||||
{
|
||||
TCHAR message[256];
|
||||
UINT idc = 0;
|
||||
|
||||
if (reason == GAME_LIST_CANT_READ)
|
||||
{
|
||||
idc = IDS_GAME_FAIL_READ;
|
||||
}
|
||||
else if (reason == GAME_LIST_HALFLIFE1)
|
||||
{
|
||||
idc = IDS_GAME_FAIL_HL1;
|
||||
}
|
||||
else if (reason == GAME_LIST_NO_GAMES)
|
||||
{
|
||||
idc = IDS_GAME_FAIL_NONE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (LoadString(g_hInstance,
|
||||
idc,
|
||||
message,
|
||||
sizeof(message) / sizeof(TCHAR)) == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
MessageBox(hWnd,
|
||||
message,
|
||||
_T("SourceMod Installer"),
|
||||
MB_OK|MB_ICONWARNING);
|
||||
}
|
||||
|
||||
int _ModIdCompare(const void *item1, const void *item2)
|
||||
{
|
||||
unsigned int mod_id1 = *(unsigned int *)item1;
|
||||
unsigned int mod_id2 = *(unsigned int *)item2;
|
||||
|
||||
return tstrcasecmp(g_games.game_list[mod_id1].name, g_games.game_list[mod_id2].name);
|
||||
}
|
||||
|
||||
int _GroupCompare(const void *item1, const void *item2)
|
||||
{
|
||||
game_list_t *g1 = *(game_list_t **)item1;
|
||||
game_list_t *g2 = *(game_list_t **)item2;
|
||||
|
||||
return tstrcasecmp(g1->root_name, g2->root_name);
|
||||
}
|
||||
|
||||
void SortGameGroup(game_group_t *group)
|
||||
{
|
||||
qsort(group->lists, group->list_count, sizeof(game_list_t *), _GroupCompare);
|
||||
|
||||
for (unsigned int i = 0; i < group->list_count; i++)
|
||||
{
|
||||
qsort(group->lists[i]->games,
|
||||
group->lists[i]->game_count,
|
||||
sizeof(unsigned int),
|
||||
_ModIdCompare);
|
||||
}
|
||||
}
|
||||
|
||||
void BuildGameDB()
|
||||
{
|
||||
ReleaseGameDB();
|
||||
GetStandaloneGames(&g_games);
|
||||
GetSteamGames(&g_games);
|
||||
SortGameGroup(&g_games.dedicated);
|
||||
SortGameGroup(&g_games.listen);
|
||||
SortGameGroup(&g_games.standalone);
|
||||
}
|
||||
|
||||
void ReleaseGameGroup(game_group_t *group)
|
||||
{
|
||||
for (unsigned int i = 0; i < group->list_count; i++)
|
||||
{
|
||||
free(group->lists[i]->games);
|
||||
free(group->lists[i]);
|
||||
}
|
||||
free(group->lists);
|
||||
}
|
||||
|
||||
void ReleaseGameDB()
|
||||
{
|
||||
ReleaseGameGroup(&g_games.dedicated);
|
||||
ReleaseGameGroup(&g_games.listen);
|
||||
ReleaseGameGroup(&g_games.standalone);
|
||||
free(g_games.game_list);
|
||||
memset(&g_games, 0, sizeof(g_games));
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
#ifndef _INCLUDE_INSTALLER_GAMES_LIST_H_
|
||||
#define _INCLUDE_INSTALLER_GAMES_LIST_H_
|
||||
|
||||
#include "platform_headers.h"
|
||||
|
||||
#define GAMEINFO_IS_USABLE 0
|
||||
#define GAMEINFO_DOES_NOT_EXIST 1
|
||||
#define GAMEINFO_IS_READ_ONLY 2
|
||||
|
||||
#define GAME_LIST_HALFLIFE1 -2
|
||||
#define GAME_LIST_CANT_READ -1
|
||||
#define GAME_LIST_NO_GAMES 0
|
||||
|
||||
#define GAMES_DEDICATED 1
|
||||
#define GAMES_LISTEN 2
|
||||
#define GAMES_STANDALONE 3
|
||||
|
||||
#define SOURCE_ENGINE_UNKNOWN 0
|
||||
#define SOURCE_ENGINE_2004 1
|
||||
#define SOURCE_ENGINE_2007 2
|
||||
|
||||
struct valve_game_t
|
||||
{
|
||||
const TCHAR *folder;
|
||||
const TCHAR *subfolder;
|
||||
int eng_type;
|
||||
};
|
||||
|
||||
/* One game */
|
||||
struct game_info_t
|
||||
{
|
||||
TCHAR name[128];
|
||||
TCHAR game_path[MAX_PATH];
|
||||
int source_engine;
|
||||
};
|
||||
|
||||
/* A list of games under one "account" */
|
||||
struct game_list_t
|
||||
{
|
||||
TCHAR root_name[128];
|
||||
unsigned int *games;
|
||||
unsigned int game_count;
|
||||
};
|
||||
|
||||
/* A list of accounts */
|
||||
struct game_group_t
|
||||
{
|
||||
game_list_t **lists;
|
||||
unsigned int list_count;
|
||||
int error_code;
|
||||
};
|
||||
|
||||
/* All games on the system */
|
||||
struct game_database_t
|
||||
{
|
||||
game_info_t *game_list;
|
||||
unsigned int game_count;
|
||||
game_group_t dedicated;
|
||||
game_group_t listen;
|
||||
game_group_t standalone;
|
||||
};
|
||||
|
||||
int IsValidFolder(const TCHAR *path);
|
||||
void DisplayBadFolderDialog(HWND hWnd, int reason);
|
||||
|
||||
void BuildGameDB();
|
||||
void ReleaseGameDB();
|
||||
void DisplayBadGamesDialog(HWND hWnd, int reason);
|
||||
|
||||
extern game_database_t g_games;
|
||||
|
||||
#endif //_INCLUDE_INSTALLER_GAMES_LIST_H_
|
||||
@@ -0,0 +1,25 @@
|
||||
#ifndef _INCLUDE_INSTALLER_COPY_METHOD_H_
|
||||
#define _INCLUDE_INSTALLER_COPY_METHOD_H_
|
||||
|
||||
#include "platform_headers.h"
|
||||
|
||||
class ICopyProgress
|
||||
{
|
||||
public:
|
||||
virtual void StartingNewFile(const TCHAR *filename) =0;
|
||||
virtual void UpdateProgress(size_t bytes, size_t total_bytes) =0;
|
||||
virtual void FileDone(size_t file_size) =0;
|
||||
};
|
||||
|
||||
class ICopyMethod
|
||||
{
|
||||
public:
|
||||
virtual bool CheckForExistingInstall() =0;
|
||||
virtual void TrackProgress(ICopyProgress *pProgress) =0;
|
||||
virtual bool SetCurrentFolder(const TCHAR *path, TCHAR *buffer, size_t maxchars) =0;
|
||||
virtual bool SendFile(const TCHAR *path, TCHAR *buffer, size_t maxchars) =0;
|
||||
virtual bool CreateFolder(const TCHAR *name, TCHAR *buffer, size_t maxchars) =0;
|
||||
virtual void CancelCurrentCopy() =0;
|
||||
};
|
||||
|
||||
#endif //_INCLUDE_INSTALLER_COPY_METHOD_H_
|
||||
@@ -0,0 +1,142 @@
|
||||
#include "InstallerMain.h"
|
||||
#include "Welcome.h"
|
||||
|
||||
#define WMU_INIT_INSTALLER WM_USER+1
|
||||
|
||||
HINSTANCE g_hInstance;
|
||||
NEXT_DIALOG next_dialog = DisplayWelcome;
|
||||
POINT g_GlobalPosition;
|
||||
|
||||
void UpdateGlobalPosition(HWND hWnd)
|
||||
{
|
||||
WINDOWINFO wi;
|
||||
|
||||
wi.cbSize = sizeof(WINDOWINFO);
|
||||
if (GetWindowInfo(hWnd, &wi))
|
||||
{
|
||||
g_GlobalPosition.x = wi.rcWindow.left;
|
||||
g_GlobalPosition.y = wi.rcWindow.top;
|
||||
}
|
||||
}
|
||||
|
||||
void SetToGlobalPosition(HWND hWnd)
|
||||
{
|
||||
WINDOWINFO wi;
|
||||
|
||||
wi.cbSize = sizeof(WINDOWINFO);
|
||||
if (GetWindowInfo(hWnd, &wi))
|
||||
{
|
||||
MoveWindow(hWnd,
|
||||
g_GlobalPosition.x,
|
||||
g_GlobalPosition.y,
|
||||
wi.rcWindow.right - wi.rcWindow.left,
|
||||
wi.rcWindow.bottom - wi.rcWindow.top,
|
||||
TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (message)
|
||||
{
|
||||
case WMU_INIT_INSTALLER:
|
||||
{
|
||||
UpdateGlobalPosition(hWnd);
|
||||
while (next_dialog != NULL)
|
||||
{
|
||||
next_dialog = (NEXT_DIALOG)next_dialog(hWnd);
|
||||
}
|
||||
PostQuitMessage(0);
|
||||
break;
|
||||
}
|
||||
case WM_DESTROY:
|
||||
{
|
||||
PostQuitMessage(0);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
return DefWindowProc(hWnd, message, wParam, lParam);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
|
||||
{
|
||||
WNDCLASSEX wcex;
|
||||
BOOL bRet;
|
||||
|
||||
wcex.cbSize = sizeof(wcex);
|
||||
wcex.style = CS_HREDRAW | CS_VREDRAW;
|
||||
wcex.lpfnWndProc = MainWndProc;
|
||||
wcex.cbClsExtra = 0;
|
||||
wcex.cbWndExtra = 0;
|
||||
wcex.hInstance = hInstance;
|
||||
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_INSTALLER));
|
||||
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
|
||||
wcex.lpszMenuName = _T("InstallerMenu");
|
||||
wcex.lpszClassName = _T("Installer");
|
||||
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
|
||||
|
||||
if (!RegisterClassEx(&wcex))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
INITCOMMONCONTROLSEX ccex;
|
||||
ccex.dwSize = sizeof(ccex);
|
||||
ccex.dwICC = ICC_BAR_CLASSES
|
||||
|ICC_HOTKEY_CLASS
|
||||
|ICC_LISTVIEW_CLASSES
|
||||
|ICC_PROGRESS_CLASS
|
||||
|ICC_WIN95_CLASSES
|
||||
|ICC_TAB_CLASSES;
|
||||
|
||||
if (!InitCommonControlsEx(&ccex))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
g_hInstance = hInstance;
|
||||
|
||||
HWND hWnd = CreateWindow(
|
||||
_T("Installer"),
|
||||
_T("InstallerMain"),
|
||||
WS_OVERLAPPEDWINDOW,
|
||||
CW_USEDEFAULT,
|
||||
CW_USEDEFAULT,
|
||||
CW_USEDEFAULT,
|
||||
CW_USEDEFAULT,
|
||||
(HWND)NULL,
|
||||
(HMENU)NULL,
|
||||
hInstance,
|
||||
NULL);
|
||||
if (hWnd == NULL)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
ShowWindow(hWnd, SW_HIDE);
|
||||
UpdateWindow(hWnd);
|
||||
|
||||
PostMessage(hWnd, WMU_INIT_INSTALLER, 0, 0);
|
||||
|
||||
MSG msg;
|
||||
while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
|
||||
{
|
||||
if (bRet == -1)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
}
|
||||
|
||||
return (int)msg.wParam;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
#ifndef _INCLUDE_INSTALLER_H_
|
||||
#define _INCLUDE_INSTALLER_H_
|
||||
|
||||
#include "platform_headers.h"
|
||||
#include "Resource.h"
|
||||
|
||||
void UpdateGlobalPosition(HWND hWnd);
|
||||
void SetToGlobalPosition(HWND hWnd);
|
||||
|
||||
typedef void *(*NEXT_DIALOG)(HWND);
|
||||
|
||||
extern HINSTANCE g_hInstance;
|
||||
|
||||
#endif //_INCLUDE_INSTALLER_H_
|
||||
@@ -0,0 +1,312 @@
|
||||
#include "InstallerUtil.h"
|
||||
#include "InstallerMain.h"
|
||||
#include <stdio.h>
|
||||
#include <windows.h>
|
||||
|
||||
int tstrcasecmp(const TCHAR *str1, const TCHAR *str2)
|
||||
{
|
||||
#if defined _UNICODE
|
||||
return _wcsicmp(str1, str2);
|
||||
#else
|
||||
return _stricmp(str1, str2);
|
||||
#endif
|
||||
}
|
||||
|
||||
size_t AnsiToUnicode(const char *str, wchar_t *buffer, size_t maxchars)
|
||||
{
|
||||
if (maxchars < 1)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
size_t total =
|
||||
(size_t)MultiByteToWideChar(CP_UTF8,
|
||||
0,
|
||||
str,
|
||||
-1,
|
||||
buffer,
|
||||
(int)maxchars);
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
bool IsWhiteSpaceA(const char *stream)
|
||||
{
|
||||
char c = *stream;
|
||||
if (c & (1<<7))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
return isspace(c) != 0;
|
||||
}
|
||||
}
|
||||
|
||||
int BreakStringA(const char *str, char *out, size_t maxchars)
|
||||
{
|
||||
const char *inptr = str;
|
||||
while (*inptr != '\0' && IsWhiteSpaceA(inptr))
|
||||
{
|
||||
inptr++;
|
||||
}
|
||||
|
||||
if (*inptr == '\0')
|
||||
{
|
||||
if (maxchars)
|
||||
{
|
||||
*out = '\0';
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
const char *start, *end = NULL;
|
||||
|
||||
bool quoted = (*inptr == '"');
|
||||
if (quoted)
|
||||
{
|
||||
inptr++;
|
||||
start = inptr;
|
||||
/* Read input until we reach a quote. */
|
||||
while (*inptr != '\0' && *inptr != '"')
|
||||
{
|
||||
/* Update the end point, increment the stream. */
|
||||
end = inptr++;
|
||||
}
|
||||
/* Read one more token if we reached an end quote */
|
||||
if (*inptr == '"')
|
||||
{
|
||||
inptr++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
start = inptr;
|
||||
/* Read input until we reach a space */
|
||||
while (*inptr != '\0' && !IsWhiteSpaceA(inptr))
|
||||
{
|
||||
/* Update the end point, increment the stream. */
|
||||
end = inptr++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Copy the string we found, if necessary */
|
||||
if (end == NULL)
|
||||
{
|
||||
if (maxchars)
|
||||
{
|
||||
*out = '\0';
|
||||
}
|
||||
}
|
||||
else if (maxchars)
|
||||
{
|
||||
char *outptr = out;
|
||||
maxchars--;
|
||||
for (const char *ptr=start;
|
||||
(ptr <= end) && ((unsigned)(outptr - out) < (maxchars));
|
||||
ptr++, outptr++)
|
||||
{
|
||||
*outptr = *ptr;
|
||||
}
|
||||
*outptr = '\0';
|
||||
}
|
||||
|
||||
/* Consume more of the string until we reach non-whitespace */
|
||||
while (*inptr != '\0' && IsWhiteSpaceA(inptr))
|
||||
{
|
||||
inptr++;
|
||||
}
|
||||
|
||||
return (int)(inptr - str);
|
||||
}
|
||||
|
||||
size_t UTIL_Format(TCHAR *buffer, size_t count, const TCHAR *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
size_t len;
|
||||
|
||||
va_start(ap, fmt);
|
||||
len = UTIL_FormatArgs(buffer, count, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
if (len >= count)
|
||||
{
|
||||
len = count - 1;
|
||||
buffer[len] = '\0';
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
size_t UTIL_FormatArgs(TCHAR *buffer, size_t count, const TCHAR *fmt, va_list ap)
|
||||
{
|
||||
size_t len = _vsntprintf(buffer, count, fmt, ap);
|
||||
|
||||
if (len >= count)
|
||||
{
|
||||
len = count - 1;
|
||||
buffer[len] = '\0';
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
size_t UTIL_PathFormat(TCHAR *buffer, size_t count, const TCHAR *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
size_t len;
|
||||
|
||||
va_start(ap, fmt);
|
||||
len = UTIL_FormatArgs(buffer, count, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
for (size_t i = 0; i < len; i++)
|
||||
{
|
||||
if (buffer[i] == '/')
|
||||
{
|
||||
buffer[i] = '\\';
|
||||
}
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
const TCHAR *GetFileFromPath(const TCHAR *path)
|
||||
{
|
||||
size_t len = _tcslen(path);
|
||||
|
||||
for (size_t i = len - 1;
|
||||
i >= 0 && i < len;
|
||||
i--)
|
||||
{
|
||||
if (path[i] == '\\' || path[i] == '/')
|
||||
{
|
||||
return &path[i+1];
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void GenerateErrorMessage(DWORD err, TCHAR *buffer, size_t maxchars)
|
||||
{
|
||||
if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
|
||||
NULL,
|
||||
err,
|
||||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||
buffer,
|
||||
(DWORD)maxchars,
|
||||
NULL) == 0)
|
||||
{
|
||||
UTIL_Format(buffer, maxchars, _T("Unknown error"));
|
||||
}
|
||||
}
|
||||
|
||||
INT_PTR AskToExit(HWND hWnd)
|
||||
{
|
||||
TCHAR verify_exit[100];
|
||||
|
||||
if (LoadString(g_hInstance,
|
||||
IDS_VERIFY_EXIT,
|
||||
verify_exit,
|
||||
sizeof(verify_exit) / sizeof(TCHAR)
|
||||
) == 0)
|
||||
{
|
||||
return (INT_PTR)FALSE;
|
||||
}
|
||||
|
||||
int val = MessageBox(
|
||||
hWnd,
|
||||
_T("Are you sure you want to exit?"),
|
||||
_T("SourceMod Installer"),
|
||||
MB_YESNO|MB_ICONQUESTION);
|
||||
|
||||
if (val == 0 || val == IDYES)
|
||||
{
|
||||
UpdateGlobalPosition(hWnd);
|
||||
EndDialog(hWnd, NULL);
|
||||
return (INT_PTR)TRUE;
|
||||
}
|
||||
|
||||
return (INT_PTR)FALSE;
|
||||
}
|
||||
|
||||
size_t UTIL_GetFileSize(const TCHAR *file_path)
|
||||
{
|
||||
HANDLE hFile;
|
||||
|
||||
if ((hFile = CreateFile(file_path,
|
||||
GENERIC_READ,
|
||||
FILE_SHARE_READ,
|
||||
NULL,
|
||||
OPEN_EXISTING,
|
||||
FILE_ATTRIBUTE_NORMAL,
|
||||
NULL))
|
||||
!= INVALID_HANDLE_VALUE)
|
||||
{
|
||||
LARGE_INTEGER size;
|
||||
|
||||
if (GetFileSizeEx(hFile, &size))
|
||||
{
|
||||
CloseHandle(hFile);
|
||||
return (size_t)size.QuadPart;
|
||||
}
|
||||
|
||||
CloseHandle(hFile);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
size_t UTIL_GetFolderSize(const TCHAR *basepath)
|
||||
{
|
||||
HANDLE hFind;
|
||||
WIN32_FIND_DATA fd;
|
||||
TCHAR search_path[MAX_PATH];
|
||||
size_t total = 0;
|
||||
|
||||
UTIL_PathFormat(search_path,
|
||||
sizeof(search_path) / sizeof(TCHAR),
|
||||
_T("%s\\*.*"),
|
||||
basepath);
|
||||
|
||||
if ((hFind = FindFirstFile(search_path, &fd)) == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
if (tstrcasecmp(fd.cFileName, _T(".")) == 0
|
||||
|| tstrcasecmp(fd.cFileName, _T("..")) == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
|
||||
{
|
||||
UTIL_PathFormat(search_path,
|
||||
sizeof(search_path) / sizeof(TCHAR),
|
||||
_T("%s\\%s"),
|
||||
basepath,
|
||||
fd.cFileName);
|
||||
total += UTIL_GetFolderSize(search_path);
|
||||
}
|
||||
else
|
||||
{
|
||||
UTIL_PathFormat(search_path,
|
||||
sizeof(search_path) / sizeof(TCHAR),
|
||||
_T("%s\\%s"),
|
||||
basepath,
|
||||
fd.cFileName);
|
||||
|
||||
total += UTIL_GetFileSize(search_path);
|
||||
}
|
||||
} while (FindNextFile(hFind, &fd));
|
||||
|
||||
FindClose(hFind);
|
||||
|
||||
return total;
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,20 @@
|
||||
#ifndef _INCLUDE_INSTALLER_UTIL_H_
|
||||
#define _INCLUDE_INSTALLER_UTIL_H_
|
||||
|
||||
#include "platform_headers.h"
|
||||
|
||||
bool IsWhiteSpaceA(const char *stream);
|
||||
size_t UTIL_FormatArgs(TCHAR *buffer, size_t count, const TCHAR *fmt, va_list ap);
|
||||
size_t UTIL_Format(TCHAR *buffer, size_t count, const TCHAR *fmt, ...);
|
||||
size_t UTIL_PathFormat(TCHAR *buffer, size_t count, const TCHAR *fmt, ...);
|
||||
int tstrcasecmp(const TCHAR *str1, const TCHAR *str2);
|
||||
int BreakStringA(const char *str, char *out, size_t maxchars);
|
||||
size_t AnsiToUnicode(const char *str, wchar_t *buffer, size_t maxchars);
|
||||
const TCHAR *GetFileFromPath(const TCHAR *path);
|
||||
void GenerateErrorMessage(DWORD err, TCHAR *buffer, size_t maxchars);
|
||||
size_t UTIL_GetFileSize(const TCHAR *file_path);
|
||||
size_t UTIL_GetFolderSize(const TCHAR *basepath);
|
||||
|
||||
INT_PTR AskToExit(HWND hWnd);
|
||||
|
||||
#endif //_INCLUDE_INSTALLER_UTIL_H_
|
||||
@@ -0,0 +1,167 @@
|
||||
#include "InstallerUtil.h"
|
||||
#include "LocalCopyMethod.h"
|
||||
|
||||
LocalCopyMethod g_LocalCopier;
|
||||
|
||||
DWORD CALLBACK CopyProgressRoutine(LARGE_INTEGER TotalFileSize,
|
||||
LARGE_INTEGER TotalBytesTransferred,
|
||||
LARGE_INTEGER StreamSize,
|
||||
LARGE_INTEGER StreamBytesTransferred,
|
||||
DWORD dwStreamNumber,
|
||||
DWORD dwCallbackReason,
|
||||
HANDLE hSourceFile,
|
||||
HANDLE hDestinationFile,
|
||||
LPVOID lpData)
|
||||
{
|
||||
ICopyProgress *progress = (ICopyProgress *)lpData;
|
||||
|
||||
progress->UpdateProgress((size_t)TotalBytesTransferred.QuadPart,
|
||||
(size_t)TotalFileSize.QuadPart);
|
||||
|
||||
return PROGRESS_CONTINUE;
|
||||
}
|
||||
|
||||
LocalCopyMethod::LocalCopyMethod()
|
||||
{
|
||||
m_pProgress = NULL;
|
||||
}
|
||||
|
||||
void LocalCopyMethod::SetOutputPath(const TCHAR *path)
|
||||
{
|
||||
UTIL_PathFormat(m_OutputPath,
|
||||
sizeof(m_OutputPath) / sizeof(TCHAR),
|
||||
_T("%s"),
|
||||
path);
|
||||
|
||||
UTIL_PathFormat(m_CurrentPath,
|
||||
sizeof(m_CurrentPath) / sizeof(TCHAR),
|
||||
_T("%s"),
|
||||
path);
|
||||
}
|
||||
|
||||
void LocalCopyMethod::TrackProgress(ICopyProgress *pProgress)
|
||||
{
|
||||
m_pProgress = pProgress;
|
||||
}
|
||||
|
||||
bool LocalCopyMethod::CreateFolder(const TCHAR *name, TCHAR *buffer, size_t maxchars)
|
||||
{
|
||||
TCHAR path[MAX_PATH];
|
||||
|
||||
UTIL_PathFormat(path,
|
||||
sizeof(path) / sizeof(TCHAR),
|
||||
_T("%s\\%s"),
|
||||
m_CurrentPath,
|
||||
name);
|
||||
|
||||
if (CreateDirectory(path, NULL))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
DWORD error = GetLastError();
|
||||
if (error == ERROR_ALREADY_EXISTS)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
GenerateErrorMessage(error, buffer, maxchars);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool LocalCopyMethod::SetCurrentFolder(const TCHAR *path, TCHAR *buffer, size_t maxchars)
|
||||
{
|
||||
if (path == NULL)
|
||||
{
|
||||
UTIL_PathFormat(m_CurrentPath,
|
||||
sizeof(m_CurrentPath) / sizeof(TCHAR),
|
||||
_T("%s"),
|
||||
m_OutputPath);
|
||||
}
|
||||
else
|
||||
{
|
||||
UTIL_PathFormat(m_CurrentPath,
|
||||
sizeof(m_CurrentPath) / sizeof(TCHAR),
|
||||
_T("%s\\%s"),
|
||||
m_OutputPath,
|
||||
path);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool LocalCopyMethod::SendFile(const TCHAR *path, TCHAR *buffer, size_t maxchars)
|
||||
{
|
||||
const TCHAR *filename = GetFileFromPath(path);
|
||||
|
||||
if (filename == NULL)
|
||||
{
|
||||
UTIL_Format(buffer, maxchars, _T("Invalid filename"));
|
||||
return false;
|
||||
}
|
||||
|
||||
TCHAR new_path[MAX_PATH];
|
||||
UTIL_PathFormat(new_path,
|
||||
sizeof(new_path) / sizeof(TCHAR),
|
||||
_T("%s\\%s"),
|
||||
m_CurrentPath,
|
||||
filename);
|
||||
|
||||
m_bCancelStatus = FALSE;
|
||||
|
||||
if (m_pProgress != NULL)
|
||||
{
|
||||
m_pProgress->StartingNewFile(filename);
|
||||
}
|
||||
|
||||
if (CopyFileEx(path,
|
||||
new_path,
|
||||
m_pProgress ? CopyProgressRoutine : NULL,
|
||||
m_pProgress,
|
||||
&m_bCancelStatus,
|
||||
0) == 0)
|
||||
{
|
||||
/* Delete the file in case it was a partial copy */
|
||||
DeleteFile(new_path);
|
||||
|
||||
GenerateErrorMessage(GetLastError(), buffer, maxchars);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if (m_pProgress != NULL)
|
||||
{
|
||||
m_pProgress->FileDone(UTIL_GetFileSize(path));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void LocalCopyMethod::CancelCurrentCopy()
|
||||
{
|
||||
m_bCancelStatus = TRUE;
|
||||
}
|
||||
|
||||
bool LocalCopyMethod::CheckForExistingInstall()
|
||||
{
|
||||
TCHAR path[MAX_PATH];
|
||||
|
||||
UTIL_PathFormat(path,
|
||||
sizeof(path) / sizeof(TCHAR),
|
||||
_T("%s\\addons\\sourcemod"),
|
||||
m_CurrentPath);
|
||||
if (GetFileAttributes(path) == INVALID_FILE_ATTRIBUTES)
|
||||
{
|
||||
UTIL_PathFormat(path,
|
||||
sizeof(path) / sizeof(TCHAR),
|
||||
_T("%s\\cfg\\sourcemod"),
|
||||
m_CurrentPath);
|
||||
if (GetFileAttributes(path) == INVALID_FILE_ATTRIBUTES)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
#ifndef _INCLUDE_INSTALL_LOCAL_COPY_METHOD_H_
|
||||
#define _INCLUDE_INSTALL_LOCAL_COPY_METHOD_H_
|
||||
|
||||
#include "platform_headers.h"
|
||||
#include "ICopyMethod.h"
|
||||
|
||||
class LocalCopyMethod : public ICopyMethod
|
||||
{
|
||||
public:
|
||||
LocalCopyMethod();
|
||||
public:
|
||||
virtual void TrackProgress(ICopyProgress *pProgress);
|
||||
virtual bool SetCurrentFolder(const TCHAR *path, TCHAR *buffer, size_t maxchars);
|
||||
virtual bool SendFile(const TCHAR *path, TCHAR *buffer, size_t maxchars);
|
||||
virtual bool CreateFolder(const TCHAR *name, TCHAR *buffer, size_t maxchars);
|
||||
virtual void CancelCurrentCopy();
|
||||
virtual bool CheckForExistingInstall();
|
||||
public:
|
||||
void SetOutputPath(const TCHAR *path);
|
||||
private:
|
||||
ICopyProgress *m_pProgress;
|
||||
TCHAR m_OutputPath[MAX_PATH];
|
||||
TCHAR m_CurrentPath[MAX_PATH];
|
||||
BOOL m_bCancelStatus;
|
||||
};
|
||||
|
||||
extern LocalCopyMethod g_LocalCopier;
|
||||
|
||||
#endif //_INCLUDE_INSTALL_LOCAL_COPY_METHOD_H_
|
||||
@@ -0,0 +1,438 @@
|
||||
#include "InstallerMain.h"
|
||||
#include "InstallerUtil.h"
|
||||
#include "PerformInstall.h"
|
||||
#include "CCriticalSection.h"
|
||||
|
||||
#define WMU_INSTALLER_DONE WM_USER+2
|
||||
#define PBAR_RANGE_HIGH 100
|
||||
#define PBAR_RANGE_LOW 0
|
||||
|
||||
ICopyMethod *g_pCopyMethod = NULL;
|
||||
HANDLE g_hCopyThread = NULL;
|
||||
copy_thread_args_t g_thread_args = {NULL, NULL, NULL, false, false};
|
||||
CCriticalSection g_update_window;
|
||||
|
||||
class TrackProgress : public ICopyProgress
|
||||
{
|
||||
public:
|
||||
void Initialize(HWND hTextBar, HWND hCurBar, HWND hTotalBar, size_t total_size)
|
||||
{
|
||||
m_hTextBar = hTextBar;
|
||||
m_hCurBar = hCurBar;
|
||||
m_hTotalBar = hTotalBar;
|
||||
m_TotalSize = total_size;
|
||||
m_TotalDone = 0;
|
||||
RedrawProgressBars(0.0, 0.0);
|
||||
}
|
||||
void Finished()
|
||||
{
|
||||
RedrawProgressBars(100.0, 100.0);
|
||||
}
|
||||
public:
|
||||
void StartingNewFile(const TCHAR *filename)
|
||||
{
|
||||
TCHAR buffer[255];
|
||||
|
||||
if (g_update_window.TryEnter())
|
||||
{
|
||||
UTIL_Format(buffer, sizeof(buffer) / sizeof(TCHAR), _T("Copying: %s"), filename);
|
||||
SendMessage(m_hTextBar, WM_SETTEXT, 0, (LPARAM)buffer);
|
||||
UpdateWindow(m_hTextBar);
|
||||
g_update_window.Leave();
|
||||
}
|
||||
}
|
||||
void UpdateProgress(size_t bytes, size_t total_bytes)
|
||||
{
|
||||
float fCur = (float)bytes / (float)total_bytes;
|
||||
float fTotal = ((float)m_TotalDone + (float)bytes) / (float)m_TotalSize;
|
||||
RedrawProgressBars(fCur, fTotal);
|
||||
}
|
||||
void FileDone(size_t total_size)
|
||||
{
|
||||
m_TotalDone += total_size;
|
||||
RedrawProgressBars(0.0, (float)m_TotalDone / (float)m_TotalSize);
|
||||
}
|
||||
private:
|
||||
void RedrawProgressBar(HWND hBar, float fPerc)
|
||||
{
|
||||
/* Get a percentage point in the range */
|
||||
float fPointInRange = (float)(PBAR_RANGE_HIGH - PBAR_RANGE_LOW) * fPerc;
|
||||
int iPointInRange = (int)fPointInRange;
|
||||
|
||||
/* Scale it */
|
||||
iPointInRange += PBAR_RANGE_LOW;
|
||||
|
||||
if (g_update_window.TryEnter())
|
||||
{
|
||||
SendMessage(hBar,
|
||||
PBM_SETPOS,
|
||||
iPointInRange,
|
||||
0);
|
||||
g_update_window.Leave();
|
||||
}
|
||||
}
|
||||
void RedrawProgressBars(float fCurrent, float fTotal)
|
||||
{
|
||||
RedrawProgressBar(m_hCurBar, fCurrent);
|
||||
RedrawProgressBar(m_hTotalBar, fTotal);
|
||||
}
|
||||
private:
|
||||
size_t m_TotalSize;
|
||||
size_t m_TotalDone;
|
||||
HWND m_hTextBar;
|
||||
HWND m_hCurBar;
|
||||
HWND m_hTotalBar;
|
||||
} s_ProgressTracker;
|
||||
|
||||
void CancelPerformInstall()
|
||||
{
|
||||
delete g_thread_args.pFileList;
|
||||
g_thread_args.pFileList = NULL;
|
||||
}
|
||||
|
||||
void SetInstallMethod(ICopyMethod *pCopyMethod)
|
||||
{
|
||||
g_pCopyMethod = pCopyMethod;
|
||||
}
|
||||
|
||||
bool CopyStructureRecursively(ICopyMethod *pCopyMethod,
|
||||
CFileList *pFileList,
|
||||
const TCHAR *basepath,
|
||||
const TCHAR *local_path,
|
||||
TCHAR *errbuf,
|
||||
size_t maxchars)
|
||||
{
|
||||
TCHAR file_path[MAX_PATH];
|
||||
const TCHAR *file;
|
||||
CFileList *pSubList;
|
||||
|
||||
if (!pCopyMethod->SetCurrentFolder(local_path, errbuf, maxchars))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Copy files */
|
||||
while ((file = pFileList->PeekCurrentFile()) != NULL)
|
||||
{
|
||||
if (local_path == NULL)
|
||||
{
|
||||
UTIL_PathFormat(file_path,
|
||||
sizeof(file_path) / sizeof(TCHAR),
|
||||
_T("%s\\%s"),
|
||||
basepath,
|
||||
file);
|
||||
}
|
||||
else
|
||||
{
|
||||
UTIL_PathFormat(file_path,
|
||||
sizeof(file_path) / sizeof(TCHAR),
|
||||
_T("%s\\%s\\%s"),
|
||||
basepath,
|
||||
local_path,
|
||||
file);
|
||||
}
|
||||
|
||||
if (!pCopyMethod->SendFile(file_path, errbuf, maxchars))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
pFileList->PopCurrentFile();
|
||||
}
|
||||
|
||||
/* Now copy folders */
|
||||
while ((pSubList = pFileList->PeekCurrentFolder()) != NULL)
|
||||
{
|
||||
if (g_thread_args.m_bIsUpgrade)
|
||||
{
|
||||
/* :TODO: put this somewhere else because it technically
|
||||
* means the progress bars get calculated wrong
|
||||
*/
|
||||
if (tstrcasecmp(pSubList->GetFolderName(), _T("cfg")) == 0
|
||||
|| tstrcasecmp(pSubList->GetFolderName(), _T("configs")) == 0)
|
||||
{
|
||||
pFileList->PopCurrentFolder();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* Try creating the folder */
|
||||
if (!pCopyMethod->CreateFolder(pSubList->GetFolderName(), errbuf, maxchars))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
TCHAR new_local_path[MAX_PATH];
|
||||
if (local_path == NULL)
|
||||
{
|
||||
UTIL_PathFormat(new_local_path,
|
||||
sizeof(new_local_path) / sizeof(TCHAR),
|
||||
_T("%s"),
|
||||
pSubList->GetFolderName());
|
||||
}
|
||||
else
|
||||
{
|
||||
UTIL_PathFormat(new_local_path,
|
||||
sizeof(new_local_path) / sizeof(TCHAR),
|
||||
_T("%s\\%s"),
|
||||
local_path,
|
||||
pSubList->GetFolderName());
|
||||
}
|
||||
|
||||
if (!CopyStructureRecursively(pCopyMethod,
|
||||
pSubList,
|
||||
basepath,
|
||||
new_local_path,
|
||||
errbuf,
|
||||
maxchars))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
pFileList->PopCurrentFolder();
|
||||
|
||||
/* Set the current folder again for the next operation */
|
||||
if (!pCopyMethod->SetCurrentFolder(local_path, errbuf, maxchars))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
DWORD WINAPI T_CopyFiles(LPVOID arg)
|
||||
{
|
||||
bool result =
|
||||
CopyStructureRecursively(g_thread_args.pCopyMethod,
|
||||
g_thread_args.pFileList,
|
||||
g_thread_args.basepath,
|
||||
NULL,
|
||||
g_thread_args.error,
|
||||
sizeof(g_thread_args.error) / sizeof(TCHAR));
|
||||
|
||||
PostMessage(g_thread_args.hWnd, WMU_INSTALLER_DONE, result ? TRUE : FALSE, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool StartFileCopy(HWND hWnd)
|
||||
{
|
||||
g_thread_args.m_bWasCancelled = false;
|
||||
g_thread_args.hWnd = hWnd;
|
||||
if ((g_hCopyThread = CreateThread(NULL,
|
||||
0,
|
||||
T_CopyFiles,
|
||||
NULL,
|
||||
0,
|
||||
NULL))
|
||||
== NULL)
|
||||
{
|
||||
MessageBox(
|
||||
hWnd,
|
||||
_T("Could not initialize copy thread."),
|
||||
_T("SourceMod Installer"),
|
||||
MB_OK|MB_ICONERROR);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void StopFileCopy()
|
||||
{
|
||||
g_thread_args.m_bWasCancelled = true;
|
||||
g_pCopyMethod->CancelCurrentCopy();
|
||||
|
||||
if (g_hCopyThread != NULL)
|
||||
{
|
||||
g_update_window.Enter();
|
||||
WaitForSingleObject(g_hCopyThread, INFINITE);
|
||||
g_update_window.Leave();
|
||||
CloseHandle(g_hCopyThread);
|
||||
g_hCopyThread = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
bool RequestCancelInstall(HWND hWnd)
|
||||
{
|
||||
StopFileCopy();
|
||||
|
||||
int val = MessageBox(
|
||||
hWnd,
|
||||
_T("Are you sure you want to cancel the install?"),
|
||||
_T("SourceMod Installer"),
|
||||
MB_YESNO|MB_ICONQUESTION);
|
||||
|
||||
if (val == IDYES)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (g_thread_args.pFileList == NULL)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Start the thread, note our return value is opposite */
|
||||
return !StartFileCopy(hWnd);
|
||||
}
|
||||
|
||||
bool StartInstallProcess(HWND hWnd)
|
||||
{
|
||||
if (g_pCopyMethod->CheckForExistingInstall())
|
||||
{
|
||||
int val = MessageBox(
|
||||
hWnd,
|
||||
_T("It looks like a previous SourceMod installation exists. Select \"Yes\" to skip copying configuration files. Select \"No\" to perform a full re-install."),
|
||||
_T("SourceMod Installer"),
|
||||
MB_YESNO|MB_ICONQUESTION);
|
||||
|
||||
if (val == 0 || val == IDYES)
|
||||
{
|
||||
g_thread_args.m_bIsUpgrade = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_thread_args.m_bIsUpgrade = false;
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
TCHAR cur_path[MAX_PATH];
|
||||
if (_tgetcwd(cur_path, sizeof(cur_path)) == NULL)
|
||||
{
|
||||
MessageBox(
|
||||
hWnd,
|
||||
_T("Could not locate current directory!"),
|
||||
_T("SourceMod Installer"),
|
||||
MB_OK|MB_ICONERROR);
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
UTIL_PathFormat(source_path,
|
||||
sizeof(source_path) / sizeof(TCHAR),
|
||||
_T("%s\\files"),
|
||||
cur_path);
|
||||
#else
|
||||
UTIL_PathFormat(g_thread_args.basepath,
|
||||
sizeof(g_thread_args.basepath) / sizeof(TCHAR),
|
||||
_T("C:\\real\\done\\base"));
|
||||
#endif
|
||||
|
||||
if (GetFileAttributes(g_thread_args.basepath) == INVALID_FILE_ATTRIBUTES)
|
||||
{
|
||||
MessageBox(
|
||||
hWnd,
|
||||
_T("Could not locate the source installation files!"),
|
||||
_T("SourceMod Installer"),
|
||||
MB_OK|MB_ICONERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
delete g_thread_args.pFileList;
|
||||
g_thread_args.pFileList = CFileList::BuildFileList(_T(""), g_thread_args.basepath);
|
||||
|
||||
s_ProgressTracker.Initialize(
|
||||
GetDlgItem(hWnd, IDC_PROGRESS_CURCOPY),
|
||||
GetDlgItem(hWnd, IDC_PROGRESS_CURRENT),
|
||||
GetDlgItem(hWnd, IDC_PROGRESS_TOTAL),
|
||||
(size_t)g_thread_args.pFileList->GetRecursiveSize());
|
||||
g_pCopyMethod->TrackProgress(&s_ProgressTracker);
|
||||
g_thread_args.pCopyMethod = g_pCopyMethod;
|
||||
|
||||
return StartFileCopy(hWnd);
|
||||
}
|
||||
|
||||
INT_PTR CALLBACK PerformInstallHandler(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (message)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
SetToGlobalPosition(hDlg);
|
||||
return (INT_PTR)TRUE;
|
||||
}
|
||||
case WM_COMMAND:
|
||||
{
|
||||
if (LOWORD(wParam) == ID_INSTALL_CANCEL
|
||||
|| LOWORD(wParam) == ID_CLOSE)
|
||||
{
|
||||
if (RequestCancelInstall(hDlg))
|
||||
{
|
||||
CancelPerformInstall();
|
||||
UpdateGlobalPosition(hDlg);
|
||||
EndDialog(hDlg, NULL);
|
||||
}
|
||||
return (INT_PTR)TRUE;
|
||||
}
|
||||
else if (LOWORD(wParam) == ID_INSTALL_START)
|
||||
{
|
||||
HWND hButton = GetDlgItem(hDlg, ID_INSTALL_START);
|
||||
EnableWindow(hButton, FALSE);
|
||||
StartInstallProcess(hDlg);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case WMU_INSTALLER_DONE:
|
||||
{
|
||||
if (wParam == TRUE)
|
||||
{
|
||||
s_ProgressTracker.Finished();
|
||||
MessageBox(hDlg,
|
||||
_T("SourceMod was successfully installed! Please visit http://www.sourcemod.net/ for documentation."),
|
||||
_T("SourceMod Installer"),
|
||||
MB_OK);
|
||||
CancelPerformInstall();
|
||||
UpdateGlobalPosition(hDlg);
|
||||
EndDialog(hDlg, NULL);
|
||||
return (INT_PTR)TRUE;
|
||||
}
|
||||
else if (!g_thread_args.m_bWasCancelled)
|
||||
{
|
||||
TCHAR buffer[500];
|
||||
|
||||
UTIL_Format(buffer,
|
||||
sizeof(buffer) / sizeof(TCHAR),
|
||||
_T("Encountered error: %s"),
|
||||
g_thread_args.error);
|
||||
int res = MessageBox(hDlg,
|
||||
buffer,
|
||||
_T("SourceMod Installer"),
|
||||
MB_ICONERROR|MB_RETRYCANCEL);
|
||||
|
||||
if (res == IDRETRY)
|
||||
{
|
||||
StartFileCopy(hDlg);
|
||||
}
|
||||
else
|
||||
{
|
||||
CancelPerformInstall();
|
||||
UpdateGlobalPosition(hDlg);
|
||||
EndDialog(hDlg, NULL);
|
||||
return (INT_PTR)TRUE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return (INT_PTR)FALSE;
|
||||
}
|
||||
|
||||
void *DisplayPerformInstall(HWND hWnd)
|
||||
{
|
||||
INT_PTR val;
|
||||
|
||||
if ((val = DialogBox(
|
||||
g_hInstance,
|
||||
MAKEINTRESOURCE(IDD_PERFORM_INSTALL),
|
||||
hWnd,
|
||||
PerformInstallHandler)) == -1)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return (void *)val;
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
#ifndef _INCLUDE_PERFORM_INSTALL_H_
|
||||
#define _INCLUDE_PERFORM_INSTALL_H_
|
||||
|
||||
#include "InstallerMain.h"
|
||||
#include "ICopyMethod.h"
|
||||
#include "CFileList.h"
|
||||
|
||||
struct copy_thread_args_t
|
||||
{
|
||||
ICopyMethod *pCopyMethod;
|
||||
CFileList *pFileList;
|
||||
HWND hWnd;
|
||||
bool m_bIsUpgrade;
|
||||
bool m_bWasCancelled;
|
||||
TCHAR basepath[MAX_PATH];
|
||||
TCHAR error[255];
|
||||
};
|
||||
|
||||
void *DisplayPerformInstall(HWND hWnd);
|
||||
void SetInstallMethod(ICopyMethod *pCopyMethod);
|
||||
|
||||
#endif //_INCLUDE_PERFORM_INSTALL_H_
|
||||
@@ -0,0 +1,65 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Visual C++ generated include file.
|
||||
// Used by installer.rc
|
||||
//
|
||||
#define ID_CLOSE 2
|
||||
#define IDD_INSTALLER_DIALOG 102
|
||||
#define IDS_APP_TITLE 103
|
||||
#define IDM_ABOUT 104
|
||||
#define IDM_EXIT 105
|
||||
#define IDI_INSTALLER 107
|
||||
#define IDI_SMALL 108
|
||||
#define IDC_INSTALLER 109
|
||||
#define IDR_MAINFRAME 128
|
||||
#define IDD_WELCOME 130
|
||||
#define IDD_CHOOSE_METHOD 132
|
||||
#define IDS_NO_GAMEINFO 132
|
||||
#define IDS_READONLY_GAMEINFO 133
|
||||
#define IDS_GAME_FAIL_HL1 134
|
||||
#define IDS_GAME_FAIL_READ 135
|
||||
#define IDS_GAME_FAIL_NONE 136
|
||||
#define IDS_VERIFY_EXIT 137
|
||||
#define ID_WELCOME_NEXT 1001
|
||||
#define IDC_WELCOME_PANEL 1002
|
||||
#define IDC_METHOD_TEXT 1003
|
||||
#define ID_WELCOME_EXIT 1003
|
||||
#define ID_METHOD_NEXT 1004
|
||||
#define ID_METHOD_EXIT 1005
|
||||
#define ID_METHOD_BACK 1006
|
||||
#define IDC_METHOD_DED_SERVER 1007
|
||||
#define IDC_METHOD_LISTEN_SERVER 1008
|
||||
#define IDC_SELGAME_LIST 1008
|
||||
#define IDC_METHOD_ALONE_SERVER 1009
|
||||
#define IDC_PROGRESS_CURRENT 1009
|
||||
#define IDC_METHOD_CUSTOM_FOLDER 1010
|
||||
#define IDC_PROGRESS_TOTAL 1010
|
||||
#define IDC_METHOD_UPLOAD_FTP 1011
|
||||
#define ID_SELGAME_NEXT 1012
|
||||
#define ID_SELGAME_EXIT 1013
|
||||
#define ID_SELGAME_BACK 1014
|
||||
#define IDC_SELGAME_TEXT 1015
|
||||
#define IDC_SELGAME_PANEL 1016
|
||||
#define IDD_SELECT_GAME 1017
|
||||
#define IDD_PERFORM_INSTALL 1018
|
||||
#define ID_INSTALL_CANCEL 1019
|
||||
#define IDC_INSTALL_PANEL 1020
|
||||
#define IDC_INSTALL_TEXT 1021
|
||||
#define IDC_COMBO3 1021
|
||||
#define IDC_SELGROUP_ACCOUNT 1021
|
||||
#define ID_INSTALL_START 1022
|
||||
#define IDC_PROGRESS_CURCOPY 1023
|
||||
#define IDC_STATIC -1
|
||||
#define IDC_WELCOME_TEXT -1
|
||||
#define IDC_METHOD_PANEL -1
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NO_MFC 1
|
||||
#define _APS_NEXT_RESOURCE_VALUE 133
|
||||
#define _APS_NEXT_COMMAND_VALUE 32771
|
||||
#define _APS_NEXT_CONTROL_VALUE 1022
|
||||
#define _APS_NEXT_SYMED_VALUE 110
|
||||
#endif
|
||||
#endif
|
||||
@@ -0,0 +1,169 @@
|
||||
#include "InstallerMain.h"
|
||||
#include "InstallerUtil.h"
|
||||
#include "SelectGame.h"
|
||||
#include "GamesList.h"
|
||||
#include "ChooseMethod.h"
|
||||
#include "PerformInstall.h"
|
||||
#include "LocalCopyMethod.h"
|
||||
|
||||
int selected_game_index = -1;
|
||||
|
||||
void UpdateGameListBox(HWND hDlg, game_list_t *gl)
|
||||
{
|
||||
HWND lbox = GetDlgItem(hDlg, IDC_SELGAME_LIST);
|
||||
|
||||
SendMessage(lbox, LB_RESETCONTENT, 0, 0);
|
||||
|
||||
for (unsigned int i = 0; i < gl->game_count; i++)
|
||||
{
|
||||
LRESULT res = SendMessage(lbox,
|
||||
LB_ADDSTRING,
|
||||
0,
|
||||
(LPARAM)g_games.game_list[gl->games[i]].name);
|
||||
|
||||
if (res == LB_ERR || res == LB_ERRSPACE)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
SendMessage(lbox, LB_SETITEMDATA, i, gl->games[i]);
|
||||
}
|
||||
|
||||
UpdateWindow(lbox);
|
||||
}
|
||||
|
||||
#include "windowsx.h"
|
||||
|
||||
INT_PTR CALLBACK ChooseGameHandler(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (message)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
HWND cbox = GetDlgItem(hDlg, IDC_SELGROUP_ACCOUNT);
|
||||
SendMessage(cbox, CB_RESETCONTENT, 0, 0);
|
||||
for (unsigned int i = 0; i < g_game_group->list_count; i++)
|
||||
{
|
||||
LRESULT res = SendMessage(cbox,
|
||||
CB_ADDSTRING,
|
||||
0,
|
||||
(LPARAM)g_game_group->lists[i]->root_name);
|
||||
if (res == CB_ERR || res == CB_ERRSPACE)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
SendMessage(cbox, CB_SETITEMDATA, i, (LPARAM)g_game_group->lists[i]);
|
||||
}
|
||||
SendMessage(cbox, CB_SETCURSEL, 0, 0);
|
||||
UpdateWindow(cbox);
|
||||
UpdateGameListBox(hDlg, g_game_group->lists[0]);
|
||||
|
||||
SetToGlobalPosition(hDlg);
|
||||
|
||||
return (INT_PTR)TRUE;
|
||||
}
|
||||
case WM_COMMAND:
|
||||
{
|
||||
if (LOWORD(wParam) == ID_SELGAME_EXIT
|
||||
|| LOWORD(wParam) == ID_CLOSE)
|
||||
{
|
||||
return AskToExit(hDlg);
|
||||
}
|
||||
else if (LOWORD(wParam) == ID_SELGAME_BACK)
|
||||
{
|
||||
UpdateGlobalPosition(hDlg);
|
||||
EndDialog(hDlg, (INT_PTR)DisplayChooseMethod);
|
||||
return (INT_PTR)TRUE;
|
||||
}
|
||||
else if (LOWORD(wParam) == IDC_SELGROUP_ACCOUNT)
|
||||
{
|
||||
if (HIWORD(wParam) == CBN_SELCHANGE)
|
||||
{
|
||||
HWND cbox = (HWND)lParam;
|
||||
LRESULT cursel = SendMessage(cbox, CB_GETCURSEL, 0, 0);
|
||||
|
||||
if (cursel == LB_ERR)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
LRESULT data = SendMessage(cbox, CB_GETITEMDATA, cursel, 0);
|
||||
if (data == CB_ERR)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
game_list_t *gl = (game_list_t *)data;
|
||||
UpdateGameListBox(hDlg, gl);
|
||||
}
|
||||
break;
|
||||
}
|
||||
else if (LOWORD(wParam) == IDC_SELGAME_LIST)
|
||||
{
|
||||
if (HIWORD(wParam) == LBN_SELCHANGE)
|
||||
{
|
||||
HWND lbox = (HWND)lParam;
|
||||
LRESULT cursel = SendMessage(lbox, LB_GETCURSEL, 0, 0);
|
||||
|
||||
selected_game_index = -1;
|
||||
|
||||
if (cursel == LB_ERR)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
LRESULT item = SendMessage(lbox, LB_GETITEMDATA, cursel, 0);
|
||||
if (item == LB_ERR)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
selected_game_index = (int)item;
|
||||
|
||||
HWND button = GetDlgItem(hDlg, ID_SELGAME_NEXT);
|
||||
EnableWindow(button, TRUE);
|
||||
}
|
||||
}
|
||||
else if (LOWORD(wParam) == ID_SELGAME_NEXT)
|
||||
{
|
||||
if (selected_game_index == -1)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
g_LocalCopier.SetOutputPath(g_games.game_list[selected_game_index].game_path);
|
||||
SetInstallMethod(&g_LocalCopier);
|
||||
|
||||
UpdateGlobalPosition(hDlg);
|
||||
EndDialog(hDlg, (INT_PTR)DisplayPerformInstall);
|
||||
|
||||
return (INT_PTR)TRUE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case WM_DESTROY:
|
||||
{
|
||||
ReleaseGameDB();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return (INT_PTR)FALSE;
|
||||
}
|
||||
|
||||
void *DisplaySelectGame(HWND hWnd)
|
||||
{
|
||||
INT_PTR val;
|
||||
|
||||
if ((val = DialogBox(
|
||||
g_hInstance,
|
||||
MAKEINTRESOURCE(IDD_SELECT_GAME),
|
||||
hWnd,
|
||||
ChooseGameHandler)) == -1)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return (void *)val;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
#ifndef _INCLUDE_INSTALLER_SELECT_GAME_H_
|
||||
#define _INCLUDE_INSTALLER_SELECT_GAME_H_
|
||||
|
||||
#include "InstallerMain.h"
|
||||
|
||||
void *DisplaySelectGame(HWND hWnd);
|
||||
|
||||
#endif //_INCLUDE_INSTALLER_SELECT_GAME_H_
|
||||
@@ -0,0 +1,60 @@
|
||||
#include "InstallerMain.h"
|
||||
#include "Welcome.h"
|
||||
#include "ChooseMethod.h"
|
||||
|
||||
bool g_bIsFirstRun = true;
|
||||
|
||||
INT_PTR CALLBACK WelcomeHandler(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (message)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
if (!g_bIsFirstRun)
|
||||
{
|
||||
SetToGlobalPosition(hDlg);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_bIsFirstRun = false;
|
||||
}
|
||||
return (INT_PTR)TRUE;
|
||||
}
|
||||
case WM_COMMAND:
|
||||
{
|
||||
if (LOWORD(wParam) == ID_WELCOME_EXIT
|
||||
|| LOWORD(wParam) == ID_CLOSE)
|
||||
{
|
||||
UpdateGlobalPosition(hDlg);
|
||||
EndDialog(hDlg, NULL);
|
||||
return (INT_PTR)TRUE;
|
||||
}
|
||||
else if (LOWORD(wParam) == ID_WELCOME_NEXT)
|
||||
{
|
||||
UpdateGlobalPosition(hDlg);
|
||||
EndDialog(hDlg, (INT_PTR)DisplayChooseMethod);
|
||||
return (INT_PTR)TRUE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return (INT_PTR)FALSE;
|
||||
}
|
||||
|
||||
void *DisplayWelcome(HWND hWnd)
|
||||
{
|
||||
INT_PTR val;
|
||||
|
||||
if ((val = DialogBox(
|
||||
g_hInstance,
|
||||
MAKEINTRESOURCE(IDD_WELCOME),
|
||||
hWnd,
|
||||
WelcomeHandler)) == -1)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return (void *)val;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
#ifndef _INCLUDE_INSTALLER_WELCOME_H_
|
||||
#define _INCLUDE_INSTALLER_WELCOME_H_
|
||||
|
||||
void *DisplayWelcome(HWND hWnd);
|
||||
|
||||
#endif //_INCLUDE_INSTALLER_WELCOME_H_
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 23 KiB |
@@ -0,0 +1,222 @@
|
||||
// Microsoft Visual C++ generated resource script.
|
||||
//
|
||||
#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#define APSTUDIO_HIDDEN_SYMBOLS
|
||||
#include "windows.h"
|
||||
#undef APSTUDIO_HIDDEN_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.S.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Icon
|
||||
//
|
||||
|
||||
// Icon with lowest ID value placed first to ensure application icon
|
||||
// remains consistent on all systems.
|
||||
IDI_INSTALLER ICON "installer.ico"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Menu
|
||||
//
|
||||
|
||||
IDC_INSTALLER MENU
|
||||
BEGIN
|
||||
POPUP "&File"
|
||||
BEGIN
|
||||
MENUITEM "E&xit", IDM_EXIT
|
||||
END
|
||||
POPUP "&Help"
|
||||
BEGIN
|
||||
MENUITEM "&About ...", IDM_ABOUT
|
||||
END
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Accelerator
|
||||
//
|
||||
|
||||
IDC_INSTALLER ACCELERATORS
|
||||
BEGIN
|
||||
"?", IDM_ABOUT, ASCII, ALT
|
||||
"/", IDM_ABOUT, ASCII, ALT
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Dialog
|
||||
//
|
||||
|
||||
IDD_WELCOME DIALOGEX 0, 0, 244, 74
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_CAPTION | WS_SYSMENU
|
||||
EXSTYLE WS_EX_APPWINDOW
|
||||
CAPTION "SourceMod Installer"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
DEFPUSHBUTTON "&Next",ID_WELCOME_NEXT,191,58,50,14
|
||||
GROUPBOX "",IDC_WELCOME_PANEL,2,3,239,51
|
||||
LTEXT "Welcome to the SourceMod Installer. This tool can be used to install SourcecMod to a local server/game installation, or upload SourceMod to a server via FTP.",IDC_WELCOME_TEXT,9,11,225,42
|
||||
DEFPUSHBUTTON "E&xit",ID_WELCOME_EXIT,2,58,50,14
|
||||
END
|
||||
|
||||
IDD_CHOOSE_METHOD DIALOGEX 0, 0, 244, 130
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_CAPTION | WS_SYSMENU
|
||||
EXSTYLE WS_EX_APPWINDOW
|
||||
CAPTION "SourceMod Installer"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
PUSHBUTTON "&Next",ID_METHOD_NEXT,191,113,50,14,WS_DISABLED
|
||||
PUSHBUTTON "E&xit",ID_METHOD_EXIT,2,113,50,14
|
||||
GROUPBOX "",IDC_METHOD_PANEL,2,3,239,108
|
||||
DEFPUSHBUTTON "&Back",ID_METHOD_BACK,136,113,50,14
|
||||
GROUPBOX "",IDC_METHOD_PANEL,17,30,181,69
|
||||
LTEXT "Please select an installation method:",IDC_METHOD_TEXT,9,15,122,12
|
||||
CONTROL "Steam Dedicated Server",IDC_METHOD_DED_SERVER,"Button",BS_AUTORADIOBUTTON,21,35,98,15
|
||||
CONTROL "Steam Listen Server",IDC_METHOD_LISTEN_SERVER,"Button",BS_AUTORADIOBUTTON,21,46,93,16
|
||||
CONTROL "Standalone Server",IDC_METHOD_ALONE_SERVER,"Button",BS_AUTORADIOBUTTON,21,58,93,16
|
||||
CONTROL "Select Destination Folder",IDC_METHOD_CUSTOM_FOLDER,
|
||||
"Button",BS_AUTORADIOBUTTON,21,70,95,16
|
||||
CONTROL "Upload via FTP",IDC_METHOD_UPLOAD_FTP,"Button",BS_AUTORADIOBUTTON,21,82,94,16
|
||||
END
|
||||
|
||||
IDD_SELECT_GAME DIALOGEX 0, 0, 244, 148
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_CAPTION | WS_SYSMENU
|
||||
EXSTYLE WS_EX_APPWINDOW
|
||||
CAPTION "SourceMod Installer"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
PUSHBUTTON "&Next",ID_SELGAME_NEXT,191,131,50,14,WS_DISABLED
|
||||
PUSHBUTTON "E&xit",ID_SELGAME_EXIT,2,131,50,14
|
||||
GROUPBOX "",IDC_SELGAME_PANEL,2,3,239,126
|
||||
DEFPUSHBUTTON "&Back",ID_SELGAME_BACK,136,131,50,14
|
||||
LTEXT "Please select a game from the list below. If there are multiple accounts, you may select one from the combo-box.",IDC_SELGAME_TEXT,7,14,221,16
|
||||
LISTBOX IDC_SELGAME_LIST,17,46,199,76,LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
|
||||
COMBOBOX IDC_SELGROUP_ACCOUNT,17,32,133,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
|
||||
END
|
||||
|
||||
IDD_PERFORM_INSTALL DIALOGEX 0, 0, 243, 116
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_CAPTION | WS_SYSMENU
|
||||
EXSTYLE WS_EX_APPWINDOW
|
||||
CAPTION "SourceMod Installer"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
PUSHBUTTON "&Cancel",ID_INSTALL_CANCEL,2,99,50,14
|
||||
GROUPBOX "",IDC_INSTALL_PANEL,2,3,239,93
|
||||
LTEXT "Click ""Install"" to begin copying the SourceMod files.",IDC_INSTALL_TEXT,9,15,175,13
|
||||
CONTROL "",IDC_PROGRESS_CURRENT,"msctls_progress32",WS_BORDER | 0x1,5,50,232,17
|
||||
CONTROL "",IDC_PROGRESS_TOTAL,"msctls_progress32",WS_BORDER | 0x1,5,73,232,17
|
||||
PUSHBUTTON "&Install",ID_INSTALL_START,191,99,50,14
|
||||
LTEXT "",IDC_PROGRESS_CURCOPY,9,34,175,11
|
||||
END
|
||||
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE
|
||||
BEGIN
|
||||
"resource.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE
|
||||
BEGIN
|
||||
"#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
|
||||
"#include ""windows.h""\r\n"
|
||||
"#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE
|
||||
BEGIN
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// DESIGNINFO
|
||||
//
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
GUIDELINES DESIGNINFO
|
||||
BEGIN
|
||||
IDD_WELCOME, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 2
|
||||
RIGHTMARGIN, 241
|
||||
TOPMARGIN, 3
|
||||
BOTTOMMARGIN, 72
|
||||
END
|
||||
|
||||
IDD_CHOOSE_METHOD, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 2
|
||||
RIGHTMARGIN, 241
|
||||
TOPMARGIN, 3
|
||||
BOTTOMMARGIN, 127
|
||||
END
|
||||
|
||||
IDD_PERFORM_INSTALL, DIALOG
|
||||
BEGIN
|
||||
BOTTOMMARGIN, 113
|
||||
END
|
||||
END
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// String Table
|
||||
//
|
||||
|
||||
STRINGTABLE
|
||||
BEGIN
|
||||
IDS_NO_GAMEINFO "The folder you selected does not appear to be a valid Half-Life 2 game/mod folder."
|
||||
IDS_READONLY_GAMEINFO "The folder you selected may contain a valid Half-Life 2 game/mod, but its gameinfo.txt is read-only. You must make it writable to continue."
|
||||
IDS_GAME_FAIL_HL1 "A Source dedicated server installation could not be found. This may occur if you used the standalone server to install HLDS. Try navigating to the folder manually."
|
||||
IDS_GAME_FAIL_READ "Could not locate a valid Source installation. Please make sure Steam is installed and its games have been run at least once."
|
||||
IDS_GAME_FAIL_NONE "No Source games or mods were found. Please make sure that Steam is installed and its games have been run at least once."
|
||||
IDS_VERIFY_EXIT "Are you sure you want to exit?"
|
||||
END
|
||||
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||
# Visual Studio 2005
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "installer", "installer.vcproj", "{B2479B33-A265-423B-A996-F994546644F9}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
Release|Win32 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{B2479B33-A265-423B-A996-F994546644F9}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{B2479B33-A265-423B-A996-F994546644F9}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{B2479B33-A265-423B-A996-F994546644F9}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{B2479B33-A265-423B-A996-F994546644F9}.Release|Win32.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -0,0 +1,298 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="8.00"
|
||||
Name="installer"
|
||||
ProjectGUID="{B2479B33-A265-423B-A996-F994546644F9}"
|
||||
RootNamespace="installer"
|
||||
Keyword="Win32Proj"
|
||||
>
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"
|
||||
/>
|
||||
</Platforms>
|
||||
<ToolFiles>
|
||||
</ToolFiles>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="1"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="1"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="true"
|
||||
DebugInformationFormat="4"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="comctl32.lib"
|
||||
LinkIncremental="2"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="1"
|
||||
WholeProgramOptimization="1"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
|
||||
RuntimeLibrary="2"
|
||||
UsePrecompiledHeader="2"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="true"
|
||||
DebugInformationFormat="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
LinkIncremental="1"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\CFileList.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\GamesList.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\InstallerUtil.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\LocalCopyMethod.cpp"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\CCriticalSection.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\CFileList.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\GamesList.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ICopyMethod.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\InstallerUtil.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\LocalCopyMethod.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\platform_headers.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Resource.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource Files"
|
||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
|
||||
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\installer.ico"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\installer.rc"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Window Headers"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\ChooseMethod.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\InstallerMain.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\PerformInstall.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\SelectGame.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Welcome.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Window Source"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\ChooseMethod.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\InstallerMain.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\PerformInstall.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\SelectGame.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Welcome.cpp"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
@@ -0,0 +1,33 @@
|
||||
#ifndef _INCLUDE_INSTALLER_PLATFORM_HEADERS_H_
|
||||
#define _INCLUDE_INSTALLER_PLATFORM_HEADERS_H_
|
||||
|
||||
// Refer to MSDN for the latest info on corresponding values for different platforms.
|
||||
#ifndef WINVER // Allow use of features specific to Windows XP or later.
|
||||
#define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows.
|
||||
#endif
|
||||
|
||||
#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
|
||||
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
|
||||
#endif
|
||||
|
||||
#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later.
|
||||
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
|
||||
#endif
|
||||
|
||||
#ifndef _WIN32_IE // Allow use of features specific to IE 6.0 or later.
|
||||
#define _WIN32_IE 0x0600 // Change this to the appropriate value to target other versions of IE.
|
||||
#endif
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
||||
// Windows Header Files:
|
||||
#include <windows.h>
|
||||
|
||||
// C RunTime Header Files
|
||||
#include <stdlib.h>
|
||||
#include <malloc.h>
|
||||
#include <memory.h>
|
||||
#include <tchar.h>
|
||||
#include <commctrl.h>
|
||||
#include <shlobj.h>
|
||||
|
||||
#endif //_INCLUDE_INSTALLER_PLATFORM_HEADERS_H_
|
||||
Reference in New Issue
Block a user