summaryrefslogtreecommitdiffstats
path: root/rfb_win32
diff options
context:
space:
mode:
authorDennis Syrovatsky <dennis@tightvnc.com>2005-10-19 10:05:51 +0000
committerDennis Syrovatsky <dennis@tightvnc.com>2005-10-19 10:05:51 +0000
commit880318bf63d7640764ecd5639c7aadef952fd118 (patch)
treeb0688eb597511c77c55caeb2832c7969b895b3d9 /rfb_win32
parent84ea20fbd67d760b1fb214cb4413258ecf8b24bd (diff)
downloadtigervnc-880318bf63d7640764ecd5639c7aadef952fd118.tar.gz
tigervnc-880318bf63d7640764ecd5639c7aadef952fd118.zip
Added routines for deleteDir method in FolderManager class.
Changed flag for folder identification. git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@354 3789f03b-4d11-0410-bbf8-ca57d06f2519
Diffstat (limited to 'rfb_win32')
-rw-r--r--rfb_win32/FolderManager.cxx58
-rw-r--r--rfb_win32/FolderManager.h2
2 files changed, 57 insertions, 3 deletions
diff --git a/rfb_win32/FolderManager.cxx b/rfb_win32/FolderManager.cxx
index 7cba7b51..d554cbb0 100644
--- a/rfb_win32/FolderManager.cxx
+++ b/rfb_win32/FolderManager.cxx
@@ -55,7 +55,59 @@ FolderManager::renameDir(char *pOldName, char *pNewName)
bool
FolderManager::deleteDir(char *pFullPath)
{
- return false;
+ FileInfo fileInfo;
+ fileInfo.add(pFullPath, 0, 0, FT_ATTR_DIR);
+
+ unsigned int num = fileInfo.getNumEntries();
+ unsigned int last = num - 1;
+
+ while (num > 0) {
+ if (fileInfo.getFlagsAt(last) & FT_ATTR_DIR) {
+ if (RemoveDirectory(fileInfo.getNameAt(last)) == 0) {
+ if (GetLastError() == ERROR_DIR_NOT_EMPTY) {
+ if (!getFolderInfoWithPrefix(fileInfo.getNameAt(last), &fileInfo)) {
+ fileInfo.free();
+ return false;
+ }
+ }
+ } else {
+ fileInfo.deleteAt(last);
+ }
+ } else {
+ if (DeleteFile(fileInfo.getNameAt(last)) == 0) {
+ fileInfo.free();
+ return false;
+ } else {
+ fileInfo.deleteAt(last);
+ }
+ }
+
+ num = fileInfo.getNumEntries();
+ last = num - 1;
+ }
+
+ return true;
+}
+
+bool
+FolderManager::getFolderInfoWithPrefix(char *pPrefix, FileInfo *pFileInfo)
+{
+ char prefix[FT_FILENAME_SIZE];
+ strcpy(prefix, pPrefix);
+
+ FileInfo tmpFileInfo;
+ if (!getFolderInfo(prefix, &tmpFileInfo, 0)) {
+ tmpFileInfo.free();
+ return false;
+ } else {
+ char buf[FT_FILENAME_SIZE];
+ for (unsigned int i = 0; i < tmpFileInfo.getNumEntries(); i++) {
+ sprintf(buf, "%s\\%s", prefix, tmpFileInfo.getNameAt(i));
+ pFileInfo->add(buf, tmpFileInfo.getSizeAt(i), tmpFileInfo.getDataAt(i), tmpFileInfo.getFlagsAt(i));
+ }
+ }
+ tmpFileInfo.free();
+ return true;
}
bool
@@ -81,7 +133,7 @@ FolderManager::getFolderInfo(char *pPath, FileInfo *pFileInfo, unsigned int dirO
li.HighPart = FindFileData.ftLastWriteTime.dwHighDateTime;
li.QuadPart = (li.QuadPart - 116444736000000000) / 10000000;
if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
- pFileInfo->add(FindFileData.cFileName, 0, li.LowPart, FT_ATTR_FOLDER);
+ pFileInfo->add(FindFileData.cFileName, 0, li.LowPart, FT_ATTR_DIR);
} else {
if (!dirOnly)
pFileInfo->add(FindFileData.cFileName, FindFileData.nFileSizeLow, li.LowPart, FT_ATTR_FILE);
@@ -109,7 +161,7 @@ FolderManager::getDrivesInfo(FileInfo *pFileInfo)
char *backslash = strrchr(drive, '\\');
if (backslash != NULL)
*backslash = '\0';
- pFileInfo->add(drive, 0, 0, FT_ATTR_FOLDER);
+ pFileInfo->add(drive, 0, 0, FT_ATTR_DIR);
free(drive);
i += strcspn(&szDrivesList[i], "\0") + 1;
}
diff --git a/rfb_win32/FolderManager.h b/rfb_win32/FolderManager.h
index 15aa238f..6f1839d0 100644
--- a/rfb_win32/FolderManager.h
+++ b/rfb_win32/FolderManager.h
@@ -42,6 +42,8 @@ namespace rfb {
bool getFolderInfo(char *pPath, FileInfo *pFileInfo, unsigned int dirOnly);
bool getDrivesInfo(FileInfo *pFI);
+ private:
+ bool getFolderInfoWithPrefix(char *pPrefix, FileInfo *pFileInfo);
};
}
}