|
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 |
} |