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