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