251cced1f8
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 --HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401971
152 lines
2.9 KiB
C++
152 lines
2.9 KiB
C++
#include "CFileList.h"
|
|
#include "InstallerUtil.h"
|
|
|
|
using namespace std;
|
|
|
|
CFileList::CFileList(const TCHAR *name) : m_TotalSize(0), m_RecursiveSize(0),
|
|
m_bGotRecursiveSize(false)
|
|
{
|
|
UTIL_Format(m_FolderName, sizeof(m_FolderName) / sizeof(TCHAR), _T("%s"), name);
|
|
}
|
|
|
|
CFileList::~CFileList()
|
|
{
|
|
list<CFileList *>::iterator iter;
|
|
|
|
for (iter = m_folder_list.begin();
|
|
iter != m_folder_list.end();
|
|
iter++)
|
|
{
|
|
delete (*iter);
|
|
}
|
|
}
|
|
|
|
const TCHAR *CFileList::GetFolderName()
|
|
{
|
|
return m_FolderName;
|
|
}
|
|
|
|
void CFileList::AddFolder(CFileList *pFileList)
|
|
{
|
|
m_folder_list.push_back(pFileList);
|
|
}
|
|
|
|
void CFileList::AddFile(const TCHAR *name, unsigned __int64 size)
|
|
{
|
|
CFileListEntry entry;
|
|
|
|
UTIL_Format(entry.file, sizeof(entry.file) / sizeof(TCHAR), _T("%s"), name);
|
|
entry.size = size;
|
|
|
|
m_file_list.push_back(entry);
|
|
m_TotalSize += size;
|
|
}
|
|
|
|
unsigned __int64 CFileList::GetRecursiveSize()
|
|
{
|
|
if (m_bGotRecursiveSize)
|
|
{
|
|
return m_RecursiveSize;
|
|
}
|
|
|
|
m_RecursiveSize = m_TotalSize;
|
|
|
|
list<CFileList *>::iterator iter;
|
|
for (iter = m_folder_list.begin(); iter != m_folder_list.end(); iter++)
|
|
{
|
|
m_RecursiveSize += (*iter)->GetRecursiveSize();
|
|
}
|
|
|
|
m_bGotRecursiveSize = true;
|
|
|
|
return m_RecursiveSize;
|
|
}
|
|
|
|
const TCHAR *CFileList::PeekCurrentFile()
|
|
{
|
|
if (m_file_list.empty())
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
return m_file_list.begin()->file;
|
|
}
|
|
|
|
void CFileList::PopCurrentFile()
|
|
{
|
|
m_file_list.erase(m_file_list.begin());
|
|
}
|
|
|
|
CFileList *CFileList::PeekCurrentFolder()
|
|
{
|
|
if (m_folder_list.empty())
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
return *(m_folder_list.begin());
|
|
}
|
|
|
|
void CFileList::PopCurrentFolder()
|
|
{
|
|
m_folder_list.erase(m_folder_list.begin());
|
|
}
|
|
|
|
void RecursiveBuildFileList(CFileList *file_list, const TCHAR *current_folder)
|
|
{
|
|
HANDLE hFind;
|
|
WIN32_FIND_DATA fd;
|
|
TCHAR path[MAX_PATH];
|
|
|
|
UTIL_PathFormat(path, sizeof(path) / sizeof(TCHAR), _T("%s\\*.*"), current_folder);
|
|
|
|
if ((hFind = FindFirstFile(path, &fd)) == INVALID_HANDLE_VALUE)
|
|
{
|
|
return;
|
|
}
|
|
|
|
do
|
|
{
|
|
if (tstrcasecmp(fd.cFileName, _T(".")) == 0
|
|
|| tstrcasecmp(fd.cFileName, _T("..")) == 0)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
|
|
{
|
|
CFileList *pSubList = new CFileList(fd.cFileName);
|
|
|
|
UTIL_PathFormat(path,
|
|
sizeof(path) / sizeof(TCHAR),
|
|
_T("%s\\%s"),
|
|
current_folder,
|
|
fd.cFileName);
|
|
|
|
RecursiveBuildFileList(pSubList, path);
|
|
|
|
file_list->AddFolder(pSubList);
|
|
}
|
|
else
|
|
{
|
|
LARGE_INTEGER li;
|
|
|
|
li.LowPart = fd.nFileSizeLow;
|
|
li.HighPart = fd.nFileSizeHigh;
|
|
|
|
file_list->AddFile(fd.cFileName, li.QuadPart);
|
|
}
|
|
} while (FindNextFile(hFind, &fd));
|
|
|
|
FindClose(hFind);
|
|
}
|
|
|
|
CFileList *CFileList::BuildFileList(const TCHAR *name, const TCHAR *root_folder)
|
|
{
|
|
CFileList *pFileList = new CFileList(name);
|
|
|
|
RecursiveBuildFileList(pFileList, root_folder);
|
|
|
|
return pFileList;
|
|
}
|