tools/installer/LocalCopyMethod.cpp
author David Anderson <dvander@alliedmods.net>
Wed Jan 07 04:06:18 2009 -0500 (2009-01-07)
changeset 2513 527bad3cb6f9
parent 2289 44045ead61cd
permissions -rw-r--r--
Cleaned up SourceForts entries in sdktools.games.txt (bug 3492).
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@1722
    18
	progress->UpdateProgress((size_t)TotalBytesTransferred.QuadPart,
dvander@1722
    19
		(size_t)TotalFileSize.QuadPart);
dvander@1651
    20
dvander@1651
    21
	return PROGRESS_CONTINUE;
dvander@1651
    22
}
dvander@1651
    23
dvander@1651
    24
LocalCopyMethod::LocalCopyMethod()
dvander@1651
    25
{
dvander@1651
    26
	m_pProgress = NULL;
dvander@1651
    27
}
dvander@1651
    28
dvander@1651
    29
void LocalCopyMethod::SetOutputPath(const TCHAR *path)
dvander@1651
    30
{
dvander@1651
    31
	UTIL_PathFormat(m_OutputPath,
dvander@1651
    32
		sizeof(m_OutputPath) / sizeof(TCHAR),
dvander@1651
    33
		_T("%s"),
dvander@1651
    34
		path);
dvander@1651
    35
dvander@1651
    36
	UTIL_PathFormat(m_CurrentPath,
dvander@1651
    37
		sizeof(m_CurrentPath) / sizeof(TCHAR),
dvander@1651
    38
		_T("%s"),
dvander@1651
    39
		path);
dvander@1651
    40
}
dvander@1651
    41
dvander@1651
    42
void LocalCopyMethod::TrackProgress(ICopyProgress *pProgress)
dvander@1651
    43
{
dvander@1651
    44
	m_pProgress = pProgress;
dvander@1651
    45
}
dvander@1651
    46
dvander@1651
    47
bool LocalCopyMethod::CreateFolder(const TCHAR *name, TCHAR *buffer, size_t maxchars)
dvander@1651
    48
{
dvander@1651
    49
	TCHAR path[MAX_PATH];
dvander@1651
    50
dvander@1651
    51
	UTIL_PathFormat(path,
dvander@1651
    52
		sizeof(path) / sizeof(TCHAR),
dvander@1651
    53
		_T("%s\\%s"),
dvander@1651
    54
		m_CurrentPath,
dvander@1651
    55
		name);
dvander@1651
    56
dvander@1722
    57
	if (CreateDirectory(path, NULL))
dvander@1651
    58
	{
dvander@1651
    59
		return true;
dvander@1651
    60
	}
dvander@1651
    61
dvander@1651
    62
	DWORD error = GetLastError();
dvander@1651
    63
	if (error == ERROR_ALREADY_EXISTS)
dvander@1651
    64
	{
dvander@1651
    65
		return true;
dvander@1651
    66
	}
dvander@1651
    67
dvander@1651
    68
	GenerateErrorMessage(error, buffer, maxchars);
dvander@1651
    69
dvander@1651
    70
	return false;
dvander@1651
    71
}
dvander@1651
    72
dvander@1651
    73
bool LocalCopyMethod::SetCurrentFolder(const TCHAR *path, TCHAR *buffer, size_t maxchars)
dvander@1651
    74
{
dvander@1651
    75
	if (path == NULL)
dvander@1651
    76
	{
dvander@1651
    77
		UTIL_PathFormat(m_CurrentPath,
dvander@1651
    78
			sizeof(m_CurrentPath) / sizeof(TCHAR),
dvander@1651
    79
			_T("%s"),
dvander@1651
    80
			m_OutputPath);
dvander@1651
    81
	}
dvander@1651
    82
	else
dvander@1651
    83
	{
dvander@1651
    84
		UTIL_PathFormat(m_CurrentPath,
dvander@1651
    85
			sizeof(m_CurrentPath) / sizeof(TCHAR),
dvander@1651
    86
			_T("%s\\%s"),
dvander@1651
    87
			m_OutputPath,
dvander@1651
    88
			path);
dvander@1651
    89
	}
dvander@1651
    90
dvander@1651
    91
	return true;
dvander@1651
    92
}
dvander@1651
    93
dvander@1651
    94
bool LocalCopyMethod::SendFile(const TCHAR *path, TCHAR *buffer, size_t maxchars)
dvander@1651
    95
{
dvander@1651
    96
	const TCHAR *filename = GetFileFromPath(path);
dvander@1651
    97
dvander@1651
    98
	if (filename == NULL)
dvander@1651
    99
	{
dvander@1651
   100
		UTIL_Format(buffer, maxchars, _T("Invalid filename"));
dvander@1651
   101
		return false;
dvander@1651
   102
	}
dvander@1651
   103
dvander@1651
   104
	TCHAR new_path[MAX_PATH];
dvander@1651
   105
	UTIL_PathFormat(new_path,
dvander@1651
   106
		sizeof(new_path) / sizeof(TCHAR),
dvander@1651
   107
		_T("%s\\%s"),
dvander@1651
   108
		m_CurrentPath,
dvander@1651
   109
		filename);
dvander@1651
   110
dvander@1651
   111
	m_bCancelStatus = FALSE;
dvander@1651
   112
dvander@1722
   113
	if (m_pProgress != NULL)
dvander@1722
   114
	{
dvander@1722
   115
		m_pProgress->StartingNewFile(filename);
dvander@1722
   116
	}
dvander@1722
   117
dvander@1651
   118
	if (CopyFileEx(path,
dvander@1651
   119
		new_path,
dvander@1651
   120
		m_pProgress ? CopyProgressRoutine : NULL,
dvander@1651
   121
		m_pProgress,
dvander@1651
   122
		&m_bCancelStatus,
dvander@1651
   123
		0) == 0)
dvander@1651
   124
	{
dvander@1651
   125
		/* Delete the file in case it was a partial copy */
dvander@1651
   126
		DeleteFile(new_path);
dvander@1651
   127
dvander@1651
   128
		GenerateErrorMessage(GetLastError(), buffer, maxchars);
dvander@1651
   129
dvander@1651
   130
		return false;
dvander@1651
   131
	}
dvander@1651
   132
dvander@1722
   133
	if (m_pProgress != NULL)
dvander@1722
   134
	{
dvander@1722
   135
		m_pProgress->FileDone(UTIL_GetFileSize(path));
dvander@1722
   136
	}
dvander@1722
   137
dvander@1651
   138
	return true;
dvander@1651
   139
}
dvander@1651
   140
dvander@1651
   141
void LocalCopyMethod::CancelCurrentCopy()
dvander@1651
   142
{
dvander@1651
   143
	m_bCancelStatus = TRUE;
dvander@1651
   144
}
dvander@1651
   145
dvander@1651
   146
bool LocalCopyMethod::CheckForExistingInstall()
dvander@1651
   147
{
dvander@1651
   148
	TCHAR path[MAX_PATH];
dvander@1651
   149
dvander@1651
   150
	UTIL_PathFormat(path,
dvander@1651
   151
		sizeof(path) / sizeof(TCHAR),
dvander@1651
   152
		_T("%s\\addons\\sourcemod"),
dvander@1651
   153
		m_CurrentPath);
dvander@1651
   154
	if (GetFileAttributes(path) == INVALID_FILE_ATTRIBUTES)
dvander@1651
   155
	{
dvander@1651
   156
		UTIL_PathFormat(path,
dvander@1651
   157
			sizeof(path) / sizeof(TCHAR),
dvander@1651
   158
			_T("%s\\cfg\\sourcemod"),
dvander@1651
   159
			m_CurrentPath);
dvander@1651
   160
		if (GetFileAttributes(path) == INVALID_FILE_ATTRIBUTES)
dvander@1651
   161
		{
dvander@1651
   162
			return false;
dvander@1651
   163
		}
dvander@1651
   164
	}
dvander@1651
   165
dvander@1651
   166
	return true;
dvander@1651
   167
}