Added getFolderInfo and getDrivesInfo methods to FolderManager class.


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@353 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/rfb_win32/FolderManager.cxx b/rfb_win32/FolderManager.cxx
index 98f7096..7cba7b5 100644
--- a/rfb_win32/FolderManager.cxx
+++ b/rfb_win32/FolderManager.cxx
@@ -59,7 +59,59 @@
 }
     
 bool 
-FolderManager::getDirInfo(char *pPath, FileInfo *pFileInfo, unsigned int dirOnly)
+FolderManager::getFolderInfo(char *pPath, FileInfo *pFileInfo, unsigned int dirOnly)
 {
-  return false;
+	if (strlen(pPath) == 0) return getDrivesInfo(pFileInfo);
+
+	char path[FT_FILENAME_SIZE];
+	sprintf(path, "%s\\*", pPath);
+
+	WIN32_FIND_DATA FindFileData;
+	SetErrorMode(SEM_FAILCRITICALERRORS);
+	HANDLE handle = FindFirstFile(path, &FindFileData);
+	DWORD lastError = GetLastError();
+	SetErrorMode(0);
+
+	if (handle != INVALID_HANDLE_VALUE) {
+		do {
+			if (strcmp(FindFileData.cFileName, ".") != 0 &&
+				strcmp(FindFileData.cFileName, "..") != 0) {
+				LARGE_INTEGER li;
+				li.LowPart = FindFileData.ftLastWriteTime.dwLowDateTime;
+				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);
+				} else {
+					if (!dirOnly)
+						pFileInfo->add(FindFileData.cFileName, FindFileData.nFileSizeLow, li.LowPart, FT_ATTR_FILE);
+				}
+			}
+			
+		} while (FindNextFile(handle, &FindFileData));
+	} else {
+		return false;
+	}
+	FindClose(handle);
+	return true;
+}
+
+bool 
+FolderManager::getDrivesInfo(FileInfo *pFileInfo)
+{
+	TCHAR szDrivesList[256];
+	if (GetLogicalDriveStrings(255, szDrivesList) == 0)
+		return false;
+
+	int i = 0;
+	while (szDrivesList[i] != '\0') {
+		char *drive = strdup(&szDrivesList[i]);
+		char *backslash = strrchr(drive, '\\');
+		if (backslash != NULL)
+			*backslash = '\0';
+		pFileInfo->add(drive, 0, 0, FT_ATTR_FOLDER);
+		free(drive);
+		i += strcspn(&szDrivesList[i], "\0") + 1;
+	}
+	return true;
 }
diff --git a/rfb_win32/FolderManager.h b/rfb_win32/FolderManager.h
index ad23c3d..15aa238 100644
--- a/rfb_win32/FolderManager.h
+++ b/rfb_win32/FolderManager.h
@@ -40,7 +40,8 @@
       bool renameDir(char *pOldName, char *pNewName);
       bool deleteDir(char *pFullPath);
       
-      bool getDirInfo(char *pPath, FileInfo *pFileInfo, unsigned int dirOnly);
+      bool getFolderInfo(char *pPath, FileInfo *pFileInfo, unsigned int dirOnly);
+      bool getDrivesInfo(FileInfo *pFI);
     };
   }
 }