tools/installer/CFileList.cpp
author Scott Ehlert <ds@alliedmods.net>
Tue May 13 08:22:49 2008 +0000 (2008-05-13)
changeset 2051 568678a2e847
parent 1952 b7aa2b626807
permissions -rw-r--r--
Trunk build fixes
Fixed up IGameHelpers.h such that it no longer requires HL2SDK headers if a function doesn't need them
ds@1952
     1
#include "CFileList.h"
ds@1952
     2
#include "InstallerUtil.h"
ds@1952
     3
ds@1952
     4
using namespace std;
ds@1952
     5
ds@1952
     6
CFileList::CFileList(const TCHAR *name) : m_TotalSize(0), m_RecursiveSize(0), 
ds@1952
     7
	m_bGotRecursiveSize(false)
ds@1952
     8
{
ds@1952
     9
	UTIL_Format(m_FolderName, sizeof(m_FolderName) / sizeof(TCHAR), _T("%s"), name);
ds@1952
    10
}
ds@1952
    11
ds@1952
    12
CFileList::~CFileList()
ds@1952
    13
{
ds@1952
    14
	list<CFileList *>::iterator iter;
ds@1952
    15
ds@1952
    16
	for (iter = m_folder_list.begin();
ds@1952
    17
		 iter != m_folder_list.end();
ds@1952
    18
		 iter++)
ds@1952
    19
	{
ds@1952
    20
		delete (*iter);
ds@1952
    21
	}
ds@1952
    22
}
ds@1952
    23
ds@1952
    24
const TCHAR *CFileList::GetFolderName()
ds@1952
    25
{
ds@1952
    26
	return m_FolderName;
ds@1952
    27
}
ds@1952
    28
ds@1952
    29
void CFileList::AddFolder(CFileList *pFileList)
ds@1952
    30
{
ds@1952
    31
	m_folder_list.push_back(pFileList);
ds@1952
    32
}
ds@1952
    33
ds@1952
    34
void CFileList::AddFile(const TCHAR *name, unsigned __int64 size)
ds@1952
    35
{
ds@1952
    36
	CFileListEntry entry;
ds@1952
    37
	
ds@1952
    38
	UTIL_Format(entry.file, sizeof(entry.file) / sizeof(TCHAR), _T("%s"), name);
ds@1952
    39
	entry.size = size;
ds@1952
    40
ds@1952
    41
	m_file_list.push_back(entry);
ds@1952
    42
	m_TotalSize += size;
ds@1952
    43
}
ds@1952
    44
ds@1952
    45
unsigned __int64 CFileList::GetRecursiveSize()
ds@1952
    46
{
ds@1952
    47
	if (m_bGotRecursiveSize)
ds@1952
    48
	{
ds@1952
    49
		return m_RecursiveSize;
ds@1952
    50
	}
ds@1952
    51
ds@1952
    52
	m_RecursiveSize = m_TotalSize;
ds@1952
    53
ds@1952
    54
	list<CFileList *>::iterator iter;
ds@1952
    55
	for (iter = m_folder_list.begin(); iter != m_folder_list.end(); iter++)
ds@1952
    56
	{
ds@1952
    57
		m_RecursiveSize += (*iter)->GetRecursiveSize();
ds@1952
    58
	}
ds@1952
    59
ds@1952
    60
	m_bGotRecursiveSize = true;
ds@1952
    61
ds@1952
    62
	return m_RecursiveSize;
ds@1952
    63
}
ds@1952
    64
ds@1952
    65
const TCHAR *CFileList::PeekCurrentFile()
ds@1952
    66
{
ds@1952
    67
	if (m_file_list.empty())
ds@1952
    68
	{
ds@1952
    69
		return NULL;
ds@1952
    70
	}
ds@1952
    71
ds@1952
    72
	return m_file_list.begin()->file;
ds@1952
    73
}
ds@1952
    74
ds@1952
    75
void CFileList::PopCurrentFile()
ds@1952
    76
{
ds@1952
    77
	m_file_list.erase(m_file_list.begin());
ds@1952
    78
}
ds@1952
    79
ds@1952
    80
CFileList *CFileList::PeekCurrentFolder()
ds@1952
    81
{
ds@1952
    82
	if (m_folder_list.empty())
ds@1952
    83
	{
ds@1952
    84
		return NULL;
ds@1952
    85
	}
ds@1952
    86
ds@1952
    87
	return *(m_folder_list.begin());
ds@1952
    88
}
ds@1952
    89
ds@1952
    90
void CFileList::PopCurrentFolder()
ds@1952
    91
{
ds@1952
    92
	m_folder_list.erase(m_folder_list.begin());
ds@1952
    93
}
ds@1952
    94
ds@1952
    95
void RecursiveBuildFileList(CFileList *file_list, const TCHAR *current_folder)
ds@1952
    96
{
ds@1952
    97
	HANDLE hFind;
ds@1952
    98
	WIN32_FIND_DATA fd;
ds@1952
    99
	TCHAR path[MAX_PATH];
ds@1952
   100
ds@1952
   101
	UTIL_PathFormat(path, sizeof(path) / sizeof(TCHAR), _T("%s\\*.*"), current_folder);
ds@1952
   102
ds@1952
   103
	if ((hFind = FindFirstFile(path, &fd)) == INVALID_HANDLE_VALUE)
ds@1952
   104
	{
ds@1952
   105
		return;
ds@1952
   106
	}
ds@1952
   107
ds@1952
   108
	do
ds@1952
   109
	{
ds@1952
   110
		if (tstrcasecmp(fd.cFileName, _T(".")) == 0
ds@1952
   111
			|| tstrcasecmp(fd.cFileName, _T("..")) == 0)
ds@1952
   112
		{
ds@1952
   113
			continue;
ds@1952
   114
		}
ds@1952
   115
ds@1952
   116
		if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
ds@1952
   117
		{
ds@1952
   118
			CFileList *pSubList = new CFileList(fd.cFileName);
ds@1952
   119
ds@1952
   120
			UTIL_PathFormat(path,
ds@1952
   121
				sizeof(path) / sizeof(TCHAR),
ds@1952
   122
				_T("%s\\%s"), 
ds@1952
   123
				current_folder,
ds@1952
   124
				fd.cFileName);			
ds@1952
   125
ds@1952
   126
			RecursiveBuildFileList(pSubList, path);
ds@1952
   127
ds@1952
   128
			file_list->AddFolder(pSubList);
ds@1952
   129
		}
ds@1952
   130
		else
ds@1952
   131
		{
ds@1952
   132
			LARGE_INTEGER li;
ds@1952
   133
ds@1952
   134
			li.LowPart = fd.nFileSizeLow;
ds@1952
   135
			li.HighPart = fd.nFileSizeHigh;
ds@1952
   136
ds@1952
   137
			file_list->AddFile(fd.cFileName, li.QuadPart);
ds@1952
   138
		}
ds@1952
   139
	} while (FindNextFile(hFind, &fd));
ds@1952
   140
ds@1952
   141
	FindClose(hFind);
ds@1952
   142
}
ds@1952
   143
ds@1952
   144
CFileList *CFileList::BuildFileList(const TCHAR *name, const TCHAR *root_folder)
ds@1952
   145
{
ds@1952
   146
	CFileList *pFileList = new CFileList(name);
ds@1952
   147
ds@1952
   148
	RecursiveBuildFileList(pFileList, root_folder);
ds@1952
   149
ds@1952
   150
	return pFileList;
ds@1952
   151
}