blob: 5e079d7534cc35c9d76e7582a7cd32637b50d9b1 [file] [log] [blame]
Dennis Syrovatsky110e7ee2005-10-19 07:01:41 +00001/* Copyright (C) 2005 TightVNC Team. All Rights Reserved.
2 *
3 * This is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This software is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this software; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
16 * USA.
17 *
18 * TightVNC distribution homepage on the Web: http://www.tightvnc.com/
19 *
20 */
21
22// -=- FolderManager.cxx
23
24#include <rfb_win32/FolderManager.h>
25
26using namespace rfb;
27using namespace rfb::win32;
28
29FolderManager::FolderManager()
30{
31
32}
33
34FolderManager::~FolderManager()
35{
36
37}
38
39bool
40FolderManager::createDir(char *pFullPath)
41{
Dennis Syrovatsky514c3072005-10-19 07:34:40 +000042 if (CreateDirectory(pFullPath, NULL) == 0) return false;
43
44 return true;
Dennis Syrovatsky110e7ee2005-10-19 07:01:41 +000045}
46
47bool
Dennis Syrovatsky05c448f2005-10-26 01:10:22 +000048FolderManager::renameIt(char *pOldName, char *pNewName)
Dennis Syrovatsky110e7ee2005-10-19 07:01:41 +000049{
Dennis Syrovatsky514c3072005-10-19 07:34:40 +000050 if (MoveFile(pOldName, pNewName)) return true;
51
Dennis Syrovatsky110e7ee2005-10-19 07:01:41 +000052 return false;
53}
54
55bool
Dennis Syrovatsky05c448f2005-10-26 01:10:22 +000056FolderManager::deleteIt(char *pFullPath)
Dennis Syrovatsky110e7ee2005-10-19 07:01:41 +000057{
Dennis Syrovatsky880318b2005-10-19 10:05:51 +000058 FileInfo fileInfo;
Dennis Syrovatsky05c448f2005-10-26 01:10:22 +000059
60 FILEINFO FIStruct;
61 if (!getInfo(pFullPath, &FIStruct)) return false;
62
63 fileInfo.add(&FIStruct);
Dennis Syrovatsky880318b2005-10-19 10:05:51 +000064
65 unsigned int num = fileInfo.getNumEntries();
66 unsigned int last = num - 1;
67
68 while (num > 0) {
69 if (fileInfo.getFlagsAt(last) & FT_ATTR_DIR) {
70 if (RemoveDirectory(fileInfo.getNameAt(last)) == 0) {
71 if (GetLastError() == ERROR_DIR_NOT_EMPTY) {
72 if (!getFolderInfoWithPrefix(fileInfo.getNameAt(last), &fileInfo)) {
73 fileInfo.free();
74 return false;
75 }
76 }
77 } else {
78 fileInfo.deleteAt(last);
79 }
80 } else {
81 if (DeleteFile(fileInfo.getNameAt(last)) == 0) {
82 fileInfo.free();
83 return false;
84 } else {
85 fileInfo.deleteAt(last);
86 }
87 }
88
89 num = fileInfo.getNumEntries();
90 last = num - 1;
91 }
92
93 return true;
94}
95
96bool
97FolderManager::getFolderInfoWithPrefix(char *pPrefix, FileInfo *pFileInfo)
98{
99 char prefix[FT_FILENAME_SIZE];
100 strcpy(prefix, pPrefix);
101
102 FileInfo tmpFileInfo;
Dennis Syrovatskyf3c57662005-11-02 03:53:04 +0000103 if (!getDirInfo(prefix, &tmpFileInfo, 0)) {
Dennis Syrovatsky880318b2005-10-19 10:05:51 +0000104 tmpFileInfo.free();
105 return false;
106 } else {
107 char buf[FT_FILENAME_SIZE];
108 for (unsigned int i = 0; i < tmpFileInfo.getNumEntries(); i++) {
109 sprintf(buf, "%s\\%s", prefix, tmpFileInfo.getNameAt(i));
110 pFileInfo->add(buf, tmpFileInfo.getSizeAt(i), tmpFileInfo.getDataAt(i), tmpFileInfo.getFlagsAt(i));
111 }
112 }
113 tmpFileInfo.free();
114 return true;
Dennis Syrovatsky110e7ee2005-10-19 07:01:41 +0000115}
116
117bool
Dennis Syrovatskyf3c57662005-11-02 03:53:04 +0000118FolderManager::getDirInfo(char *pPath, FileInfo *pFileInfo, unsigned int dirOnly)
Dennis Syrovatsky110e7ee2005-10-19 07:01:41 +0000119{
Dennis Syrovatskyf3c57662005-11-02 03:53:04 +0000120 if (strlen(pPath) == 0) return getDrivesInfo(pFileInfo);
121
122 char path[FT_FILENAME_SIZE];
123 sprintf(path, "%s\\*", pPath);
124
125 WIN32_FIND_DATA FindFileData;
126 SetErrorMode(SEM_FAILCRITICALERRORS);
127 HANDLE handle = FindFirstFile(path, &FindFileData);
128 DWORD lastError = GetLastError();
129 SetErrorMode(0);
130
131 if (handle != INVALID_HANDLE_VALUE) {
132 do {
133 if (strcmp(FindFileData.cFileName, ".") != 0 &&
134 strcmp(FindFileData.cFileName, "..") != 0) {
135 unsigned int lastWriteTime = getTime70(FindFileData.ftLastWriteTime);
136 if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
137 pFileInfo->add(FindFileData.cFileName, 0, lastWriteTime, FT_ATTR_DIR);
138 } else {
139 if (!dirOnly)
140 pFileInfo->add(FindFileData.cFileName, FindFileData.nFileSizeLow, lastWriteTime, FT_ATTR_FILE);
141 }
142 }
143
144 } while (FindNextFile(handle, &FindFileData));
145 } else {
146 return false;
147 }
148 FindClose(handle);
149 return true;
Dennis Syrovatsky84ea20f2005-10-19 07:46:31 +0000150}
151
152bool
153FolderManager::getDrivesInfo(FileInfo *pFileInfo)
154{
Dennis Syrovatskyf3c57662005-11-02 03:53:04 +0000155 TCHAR szDrivesList[256];
156 if (GetLogicalDriveStrings(255, szDrivesList) == 0)
157 return false;
158
159 int i = 0;
160 while (szDrivesList[i] != '\0') {
161 char *drive = strdup(&szDrivesList[i]);
162 char *backslash = strrchr(drive, '\\');
163 if (backslash != NULL)
164 *backslash = '\0';
165 pFileInfo->add(drive, 0, 0, FT_ATTR_DIR);
166 free(drive);
167 i += strcspn(&szDrivesList[i], "\0") + 1;
168 }
169 return true;
Dennis Syrovatsky110e7ee2005-10-19 07:01:41 +0000170}
Dennis Syrovatsky05c448f2005-10-26 01:10:22 +0000171
172bool
173FolderManager::getInfo(char *pFullPath, FILEINFO *pFIStruct)
174{
Dennis Syrovatskyf3c57662005-11-02 03:53:04 +0000175 WIN32_FIND_DATA FindFileData;
176 SetErrorMode(SEM_FAILCRITICALERRORS);
177 HANDLE hFile = FindFirstFile(pFullPath, &FindFileData);
178 DWORD lastError = GetLastError();
179 SetErrorMode(0);
180 if (hFile != INVALID_HANDLE_VALUE) {
181 FindClose(hFile);
182 strcpy(pFIStruct->name, FindFileData.cFileName);
183 pFIStruct->info.data = getTime70(FindFileData.ftLastWriteTime);
184 if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
185 pFIStruct->info.size = 0;
186 pFIStruct->info.flags = FT_ATTR_DIR;
187 return true;
188 } else {
189 pFIStruct->info.size = FindFileData.nFileSizeLow;
190 pFIStruct->info.flags = FT_ATTR_FILE;
191 return true;
192 }
193 }
194 return false;
Dennis Syrovatsky05c448f2005-10-26 01:10:22 +0000195}
196
197unsigned int
198FolderManager::getTime70(FILETIME ftime)
199{
Dennis Syrovatskyf3c57662005-11-02 03:53:04 +0000200 LARGE_INTEGER uli;
201 uli.LowPart = ftime.dwLowDateTime;
202 uli.HighPart = ftime.dwHighDateTime;
203 uli.QuadPart = (uli.QuadPart - 116444736000000000) / 10000000;
204 return uli.LowPart;
Dennis Syrovatsky05c448f2005-10-26 01:10:22 +0000205}
206
207void
208FolderManager::getFiletime(unsigned int time70, FILETIME *pftime)
209{
Dennis Syrovatskyf3c57662005-11-02 03:53:04 +0000210 LONGLONG ll = Int32x32To64(time70, 10000000) + 116444736000000000;
211 pftime->dwLowDateTime = (DWORD) ll;
212 pftime->dwHighDateTime = (DWORD) (ll >> 32);
Dennis Syrovatsky05c448f2005-10-26 01:10:22 +0000213}