tools/installer/CFileList.cpp
changeset 1952 b7aa2b626807
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/tools/installer/CFileList.cpp	Sun Mar 30 07:00:22 2008 +0000
     1.3 @@ -0,0 +1,151 @@
     1.4 +#include "CFileList.h"
     1.5 +#include "InstallerUtil.h"
     1.6 +
     1.7 +using namespace std;
     1.8 +
     1.9 +CFileList::CFileList(const TCHAR *name) : m_TotalSize(0), m_RecursiveSize(0), 
    1.10 +	m_bGotRecursiveSize(false)
    1.11 +{
    1.12 +	UTIL_Format(m_FolderName, sizeof(m_FolderName) / sizeof(TCHAR), _T("%s"), name);
    1.13 +}
    1.14 +
    1.15 +CFileList::~CFileList()
    1.16 +{
    1.17 +	list<CFileList *>::iterator iter;
    1.18 +
    1.19 +	for (iter = m_folder_list.begin();
    1.20 +		 iter != m_folder_list.end();
    1.21 +		 iter++)
    1.22 +	{
    1.23 +		delete (*iter);
    1.24 +	}
    1.25 +}
    1.26 +
    1.27 +const TCHAR *CFileList::GetFolderName()
    1.28 +{
    1.29 +	return m_FolderName;
    1.30 +}
    1.31 +
    1.32 +void CFileList::AddFolder(CFileList *pFileList)
    1.33 +{
    1.34 +	m_folder_list.push_back(pFileList);
    1.35 +}
    1.36 +
    1.37 +void CFileList::AddFile(const TCHAR *name, unsigned __int64 size)
    1.38 +{
    1.39 +	CFileListEntry entry;
    1.40 +	
    1.41 +	UTIL_Format(entry.file, sizeof(entry.file) / sizeof(TCHAR), _T("%s"), name);
    1.42 +	entry.size = size;
    1.43 +
    1.44 +	m_file_list.push_back(entry);
    1.45 +	m_TotalSize += size;
    1.46 +}
    1.47 +
    1.48 +unsigned __int64 CFileList::GetRecursiveSize()
    1.49 +{
    1.50 +	if (m_bGotRecursiveSize)
    1.51 +	{
    1.52 +		return m_RecursiveSize;
    1.53 +	}
    1.54 +
    1.55 +	m_RecursiveSize = m_TotalSize;
    1.56 +
    1.57 +	list<CFileList *>::iterator iter;
    1.58 +	for (iter = m_folder_list.begin(); iter != m_folder_list.end(); iter++)
    1.59 +	{
    1.60 +		m_RecursiveSize += (*iter)->GetRecursiveSize();
    1.61 +	}
    1.62 +
    1.63 +	m_bGotRecursiveSize = true;
    1.64 +
    1.65 +	return m_RecursiveSize;
    1.66 +}
    1.67 +
    1.68 +const TCHAR *CFileList::PeekCurrentFile()
    1.69 +{
    1.70 +	if (m_file_list.empty())
    1.71 +	{
    1.72 +		return NULL;
    1.73 +	}
    1.74 +
    1.75 +	return m_file_list.begin()->file;
    1.76 +}
    1.77 +
    1.78 +void CFileList::PopCurrentFile()
    1.79 +{
    1.80 +	m_file_list.erase(m_file_list.begin());
    1.81 +}
    1.82 +
    1.83 +CFileList *CFileList::PeekCurrentFolder()
    1.84 +{
    1.85 +	if (m_folder_list.empty())
    1.86 +	{
    1.87 +		return NULL;
    1.88 +	}
    1.89 +
    1.90 +	return *(m_folder_list.begin());
    1.91 +}
    1.92 +
    1.93 +void CFileList::PopCurrentFolder()
    1.94 +{
    1.95 +	m_folder_list.erase(m_folder_list.begin());
    1.96 +}
    1.97 +
    1.98 +void RecursiveBuildFileList(CFileList *file_list, const TCHAR *current_folder)
    1.99 +{
   1.100 +	HANDLE hFind;
   1.101 +	WIN32_FIND_DATA fd;
   1.102 +	TCHAR path[MAX_PATH];
   1.103 +
   1.104 +	UTIL_PathFormat(path, sizeof(path) / sizeof(TCHAR), _T("%s\\*.*"), current_folder);
   1.105 +
   1.106 +	if ((hFind = FindFirstFile(path, &fd)) == INVALID_HANDLE_VALUE)
   1.107 +	{
   1.108 +		return;
   1.109 +	}
   1.110 +
   1.111 +	do
   1.112 +	{
   1.113 +		if (tstrcasecmp(fd.cFileName, _T(".")) == 0
   1.114 +			|| tstrcasecmp(fd.cFileName, _T("..")) == 0)
   1.115 +		{
   1.116 +			continue;
   1.117 +		}
   1.118 +
   1.119 +		if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
   1.120 +		{
   1.121 +			CFileList *pSubList = new CFileList(fd.cFileName);
   1.122 +
   1.123 +			UTIL_PathFormat(path,
   1.124 +				sizeof(path) / sizeof(TCHAR),
   1.125 +				_T("%s\\%s"), 
   1.126 +				current_folder,
   1.127 +				fd.cFileName);			
   1.128 +
   1.129 +			RecursiveBuildFileList(pSubList, path);
   1.130 +
   1.131 +			file_list->AddFolder(pSubList);
   1.132 +		}
   1.133 +		else
   1.134 +		{
   1.135 +			LARGE_INTEGER li;
   1.136 +
   1.137 +			li.LowPart = fd.nFileSizeLow;
   1.138 +			li.HighPart = fd.nFileSizeHigh;
   1.139 +
   1.140 +			file_list->AddFile(fd.cFileName, li.QuadPart);
   1.141 +		}
   1.142 +	} while (FindNextFile(hFind, &fd));
   1.143 +
   1.144 +	FindClose(hFind);
   1.145 +}
   1.146 +
   1.147 +CFileList *CFileList::BuildFileList(const TCHAR *name, const TCHAR *root_folder)
   1.148 +{
   1.149 +	CFileList *pFileList = new CFileList(name);
   1.150 +
   1.151 +	RecursiveBuildFileList(pFileList, root_folder);
   1.152 +
   1.153 +	return pFileList;
   1.154 +}