dvander@1722: #include "CFileList.h" dvander@1722: #include "InstallerUtil.h" dvander@1722: dvander@1722: using namespace std; dvander@1722: dvander@1722: CFileList::CFileList(const TCHAR *name) : m_TotalSize(0), m_RecursiveSize(0), dvander@1722: m_bGotRecursiveSize(false) dvander@1722: { dvander@1722: UTIL_Format(m_FolderName, sizeof(m_FolderName) / sizeof(TCHAR), _T("%s"), name); dvander@1722: } dvander@1722: dvander@1722: CFileList::~CFileList() dvander@1722: { dvander@1722: list::iterator iter; dvander@1722: dvander@1722: for (iter = m_folder_list.begin(); dvander@1722: iter != m_folder_list.end(); dvander@1722: iter++) dvander@1722: { dvander@1722: delete (*iter); dvander@1722: } dvander@1722: } dvander@1722: dvander@1722: const TCHAR *CFileList::GetFolderName() dvander@1722: { dvander@1722: return m_FolderName; dvander@1722: } dvander@1722: dvander@1722: void CFileList::AddFolder(CFileList *pFileList) dvander@1722: { dvander@1722: m_folder_list.push_back(pFileList); dvander@1722: } dvander@1722: dvander@1722: void CFileList::AddFile(const TCHAR *name, unsigned __int64 size) dvander@1722: { dvander@1722: CFileListEntry entry; dvander@1722: dvander@1722: UTIL_Format(entry.file, sizeof(entry.file) / sizeof(TCHAR), _T("%s"), name); dvander@1722: entry.size = size; dvander@1722: dvander@1722: m_file_list.push_back(entry); dvander@1722: m_TotalSize += size; dvander@1722: } dvander@1722: dvander@1722: unsigned __int64 CFileList::GetRecursiveSize() dvander@1722: { dvander@1722: if (m_bGotRecursiveSize) dvander@1722: { dvander@1722: return m_RecursiveSize; dvander@1722: } dvander@1722: dvander@1722: m_RecursiveSize = m_TotalSize; dvander@1722: dvander@1722: list::iterator iter; dvander@1722: for (iter = m_folder_list.begin(); iter != m_folder_list.end(); iter++) dvander@1722: { dvander@1722: m_RecursiveSize += (*iter)->GetRecursiveSize(); dvander@1722: } dvander@1722: dvander@1722: m_bGotRecursiveSize = true; dvander@1722: dvander@1722: return m_RecursiveSize; dvander@1722: } dvander@1722: dvander@1722: const TCHAR *CFileList::PeekCurrentFile() dvander@1722: { dvander@1722: if (m_file_list.empty()) dvander@1722: { dvander@1722: return NULL; dvander@1722: } dvander@1722: dvander@1722: return m_file_list.begin()->file; dvander@1722: } dvander@1722: dvander@1722: void CFileList::PopCurrentFile() dvander@1722: { dvander@1722: m_file_list.erase(m_file_list.begin()); dvander@1722: } dvander@1722: dvander@1722: CFileList *CFileList::PeekCurrentFolder() dvander@1722: { dvander@1722: if (m_folder_list.empty()) dvander@1722: { dvander@1722: return NULL; dvander@1722: } dvander@1722: dvander@1722: return *(m_folder_list.begin()); dvander@1722: } dvander@1722: dvander@1722: void CFileList::PopCurrentFolder() dvander@1722: { dvander@1722: m_folder_list.erase(m_folder_list.begin()); dvander@1722: } dvander@1722: dvander@1722: void RecursiveBuildFileList(CFileList *file_list, const TCHAR *current_folder) dvander@1722: { dvander@1722: HANDLE hFind; dvander@1722: WIN32_FIND_DATA fd; dvander@1722: TCHAR path[MAX_PATH]; dvander@1722: dvander@1722: UTIL_PathFormat(path, sizeof(path) / sizeof(TCHAR), _T("%s\\*.*"), current_folder); dvander@1722: dvander@1722: if ((hFind = FindFirstFile(path, &fd)) == INVALID_HANDLE_VALUE) dvander@1722: { dvander@1722: return; dvander@1722: } dvander@1722: dvander@1722: do dvander@1722: { dvander@1722: if (tstrcasecmp(fd.cFileName, _T(".")) == 0 dvander@1722: || tstrcasecmp(fd.cFileName, _T("..")) == 0) dvander@1722: { dvander@1722: continue; dvander@1722: } dvander@1722: dvander@1722: if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) dvander@1722: { dvander@1722: CFileList *pSubList = new CFileList(fd.cFileName); dvander@1722: dvander@1722: UTIL_PathFormat(path, dvander@1722: sizeof(path) / sizeof(TCHAR), dvander@1722: _T("%s\\%s"), dvander@1722: current_folder, dvander@1722: fd.cFileName); dvander@1722: dvander@1722: RecursiveBuildFileList(pSubList, path); dvander@1722: dvander@1722: file_list->AddFolder(pSubList); dvander@1722: } dvander@1722: else dvander@1722: { dvander@1722: LARGE_INTEGER li; dvander@1722: dvander@1722: li.LowPart = fd.nFileSizeLow; dvander@1722: li.HighPart = fd.nFileSizeHigh; dvander@1722: dvander@1722: file_list->AddFile(fd.cFileName, li.QuadPart); dvander@1722: } dvander@1722: } while (FindNextFile(hFind, &fd)); dvander@1722: dvander@1722: FindClose(hFind); dvander@1722: } dvander@1722: dvander@1722: CFileList *CFileList::BuildFileList(const TCHAR *name, const TCHAR *root_folder) dvander@1722: { dvander@1722: CFileList *pFileList = new CFileList(name); dvander@1722: dvander@1722: RecursiveBuildFileList(pFileList, root_folder); dvander@1722: dvander@1722: return pFileList; dvander@1722: }