tools/installer/LocalCopyMethod.cpp
author David Anderson <dvander@alliedmods.net>
Sun Oct 28 20:15:51 2007 +0000 (2007-10-28)
changeset 1651 077571ea8942
child 1722 2c16f160f5dd
permissions -rw-r--r--
initial import of incomplete installer
dvander@1651
     1
#include "InstallerUtil.h"
dvander@1651
     2
#include "LocalCopyMethod.h"
dvander@1651
     3
dvander@1651
     4
LocalCopyMethod g_LocalCopier;
dvander@1651
     5
dvander@1651
     6
DWORD CALLBACK CopyProgressRoutine(LARGE_INTEGER TotalFileSize,
dvander@1651
     7
								   LARGE_INTEGER TotalBytesTransferred,
dvander@1651
     8
								   LARGE_INTEGER StreamSize,
dvander@1651
     9
								   LARGE_INTEGER StreamBytesTransferred,
dvander@1651
    10
								   DWORD dwStreamNumber,
dvander@1651
    11
								   DWORD dwCallbackReason,
dvander@1651
    12
								   HANDLE hSourceFile,
dvander@1651
    13
								   HANDLE hDestinationFile,
dvander@1651
    14
								   LPVOID lpData)
dvander@1651
    15
{
dvander@1651
    16
	ICopyProgress *progress = (ICopyProgress *)lpData;
dvander@1651
    17
dvander@1651
    18
	float percent = (float)(TotalBytesTransferred.QuadPart) / (float)(TotalFileSize.QuadPart);
dvander@1651
    19
dvander@1651
    20
	progress->UpdateProgress(percent);
dvander@1651
    21
dvander@1651
    22
	return PROGRESS_CONTINUE;
dvander@1651
    23
}
dvander@1651
    24
dvander@1651
    25
LocalCopyMethod::LocalCopyMethod()
dvander@1651
    26
{
dvander@1651
    27
	m_pProgress = NULL;
dvander@1651
    28
}
dvander@1651
    29
dvander@1651
    30
void LocalCopyMethod::SetOutputPath(const TCHAR *path)
dvander@1651
    31
{
dvander@1651
    32
	UTIL_PathFormat(m_OutputPath,
dvander@1651
    33
		sizeof(m_OutputPath) / sizeof(TCHAR),
dvander@1651
    34
		_T("%s"),
dvander@1651
    35
		path);
dvander@1651
    36
dvander@1651
    37
	UTIL_PathFormat(m_CurrentPath,
dvander@1651
    38
		sizeof(m_CurrentPath) / sizeof(TCHAR),
dvander@1651
    39
		_T("%s"),
dvander@1651
    40
		path);
dvander@1651
    41
}
dvander@1651
    42
dvander@1651
    43
void LocalCopyMethod::TrackProgress(ICopyProgress *pProgress)
dvander@1651
    44
{
dvander@1651
    45
	m_pProgress = pProgress;
dvander@1651
    46
}
dvander@1651
    47
dvander@1651
    48
bool LocalCopyMethod::CreateFolder(const TCHAR *name, TCHAR *buffer, size_t maxchars)
dvander@1651
    49
{
dvander@1651
    50
	TCHAR path[MAX_PATH];
dvander@1651
    51
dvander@1651
    52
	UTIL_PathFormat(path,
dvander@1651
    53
		sizeof(path) / sizeof(TCHAR),
dvander@1651
    54
		_T("%s\\%s"),
dvander@1651
    55
		m_CurrentPath,
dvander@1651
    56
		name);
dvander@1651
    57
dvander@1651
    58
	if (CreateDirectory(name, NULL))
dvander@1651
    59
	{
dvander@1651
    60
		return true;
dvander@1651
    61
	}
dvander@1651
    62
dvander@1651
    63
	DWORD error = GetLastError();
dvander@1651
    64
	if (error == ERROR_ALREADY_EXISTS)
dvander@1651
    65
	{
dvander@1651
    66
		return true;
dvander@1651
    67
	}
dvander@1651
    68
dvander@1651
    69
	GenerateErrorMessage(error, buffer, maxchars);
dvander@1651
    70
dvander@1651
    71
	return false;
dvander@1651
    72
}
dvander@1651
    73
dvander@1651
    74
bool LocalCopyMethod::SetCurrentFolder(const TCHAR *path, TCHAR *buffer, size_t maxchars)
dvander@1651
    75
{
dvander@1651
    76
	if (path == NULL)
dvander@1651
    77
	{
dvander@1651
    78
		UTIL_PathFormat(m_CurrentPath,
dvander@1651
    79
			sizeof(m_CurrentPath) / sizeof(TCHAR),
dvander@1651
    80
			_T("%s"),
dvander@1651
    81
			m_OutputPath);
dvander@1651
    82
	}
dvander@1651
    83
	else
dvander@1651
    84
	{
dvander@1651
    85
		UTIL_PathFormat(m_CurrentPath,
dvander@1651
    86
			sizeof(m_CurrentPath) / sizeof(TCHAR),
dvander@1651
    87
			_T("%s\\%s"),
dvander@1651
    88
			m_OutputPath,
dvander@1651
    89
			path);
dvander@1651
    90
	}
dvander@1651
    91
dvander@1651
    92
	return true;
dvander@1651
    93
}
dvander@1651
    94
dvander@1651
    95
bool LocalCopyMethod::SendFile(const TCHAR *path, TCHAR *buffer, size_t maxchars)
dvander@1651
    96
{
dvander@1651
    97
	const TCHAR *filename = GetFileFromPath(path);
dvander@1651
    98
dvander@1651
    99
	if (filename == NULL)
dvander@1651
   100
	{
dvander@1651
   101
		UTIL_Format(buffer, maxchars, _T("Invalid filename"));
dvander@1651
   102
		return false;
dvander@1651
   103
	}
dvander@1651
   104
dvander@1651
   105
	TCHAR new_path[MAX_PATH];
dvander@1651
   106
	UTIL_PathFormat(new_path,
dvander@1651
   107
		sizeof(new_path) / sizeof(TCHAR),
dvander@1651
   108
		_T("%s\\%s"),
dvander@1651
   109
		m_CurrentPath,
dvander@1651
   110
		filename);
dvander@1651
   111
dvander@1651
   112
	m_bCancelStatus = FALSE;
dvander@1651
   113
dvander@1651
   114
	if (CopyFileEx(path,
dvander@1651
   115
		new_path,
dvander@1651
   116
		m_pProgress ? CopyProgressRoutine : NULL,
dvander@1651
   117
		m_pProgress,
dvander@1651
   118
		&m_bCancelStatus,
dvander@1651
   119
		0) == 0)
dvander@1651
   120
	{
dvander@1651
   121
		/* Delete the file in case it was a partial copy */
dvander@1651
   122
		DeleteFile(new_path);
dvander@1651
   123
dvander@1651
   124
		GenerateErrorMessage(GetLastError(), buffer, maxchars);
dvander@1651
   125
dvander@1651
   126
		return false;
dvander@1651
   127
	}
dvander@1651
   128
dvander@1651
   129
	return true;
dvander@1651
   130
}
dvander@1651
   131
dvander@1651
   132
void LocalCopyMethod::CancelCurrentCopy()
dvander@1651
   133
{
dvander@1651
   134
	m_bCancelStatus = TRUE;
dvander@1651
   135
}
dvander@1651
   136
dvander@1651
   137
bool LocalCopyMethod::CheckForExistingInstall()
dvander@1651
   138
{
dvander@1651
   139
	TCHAR path[MAX_PATH];
dvander@1651
   140
dvander@1651
   141
	UTIL_PathFormat(path,
dvander@1651
   142
		sizeof(path) / sizeof(TCHAR),
dvander@1651
   143
		_T("%s\\addons\\sourcemod"),
dvander@1651
   144
		m_CurrentPath);
dvander@1651
   145
	if (GetFileAttributes(path) == INVALID_FILE_ATTRIBUTES)
dvander@1651
   146
	{
dvander@1651
   147
		UTIL_PathFormat(path,
dvander@1651
   148
			sizeof(path) / sizeof(TCHAR),
dvander@1651
   149
			_T("%s\\cfg\\sourcemod"),
dvander@1651
   150
			m_CurrentPath);
dvander@1651
   151
		if (GetFileAttributes(path) == INVALID_FILE_ATTRIBUTES)
dvander@1651
   152
		{
dvander@1651
   153
			return false;
dvander@1651
   154
		}
dvander@1651
   155
	}
dvander@1651
   156
dvander@1651
   157
	return true;
dvander@1651
   158
}