tools/installer/CFileList.cpp
author Scott Ehlert <ds@alliedmods.net>
Sun Mar 30 07:00:22 2008 +0000 (2008-03-30)
changeset 1952 b7aa2b626807
permissions -rw-r--r--
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
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
}