diff options
| author | Nicolas Bacca | 2002-11-14 23:32:42 +0000 | 
|---|---|---|
| committer | Nicolas Bacca | 2002-11-14 23:32:42 +0000 | 
| commit | 8b4ed9236a15c7682e52b9318d09af274e073daf (patch) | |
| tree | 6c42ba258c5f51351a6c6eeccb12b8a0d8a23220 /backends/fs/windows/windows-fs.cpp | |
| parent | 637ffcc517fa11a3fb96e95832c7949ef20fe355 (diff) | |
| download | scummvm-rg350-8b4ed9236a15c7682e52b9318d09af274e073daf.tar.gz scummvm-rg350-8b4ed9236a15c7682e52b9318d09af274e073daf.tar.bz2 scummvm-rg350-8b4ed9236a15c7682e52b9318d09af274e073daf.zip | |
Added FS implementation for Windows / Windows CE
svn-id: r5554
Diffstat (limited to 'backends/fs/windows/windows-fs.cpp')
| -rw-r--r-- | backends/fs/windows/windows-fs.cpp | 148 | 
1 files changed, 124 insertions, 24 deletions
| diff --git a/backends/fs/windows/windows-fs.cpp b/backends/fs/windows/windows-fs.cpp index bd89f6438d..1fb383c8c9 100644 --- a/backends/fs/windows/windows-fs.cpp +++ b/backends/fs/windows/windows-fs.cpp @@ -22,15 +22,10 @@  #if defined(_MSC_VER) || defined(__MINGW32__)  #include "../fs.h" - - -// TODO - this file is just a dummy place holder for the person who wants to implement -// the FS backend for windows. I don't even gurantee it compiles, but it should as a  -// starting place for the implementor at least. -// Look at posix-fs.cpp to see how it is done there, at fs.h for documentation of the -// API. I know that Exult as in files/listfiles.cc implementations for something similar -// for at least Unix, Windows, BeOS, MorphOS and MacOS, if you want to see how it is done. - +#include <stdio.h> +#include <stdlib.h> +#include <windows.h> +#include <TCHAR.h>  /*   * Implementation of the ScummVM file system API based on Windows API. @@ -38,13 +33,12 @@  class WindowsFilesystemNode : public FilesystemNode {  protected: -	// TODO - decide what members to offer. The following are used in the POSIX -	// implementations, but feel free to scrap all of them and use a complete -	// different inner working scheme  	String _displayName;  	bool _isDirectory;  	bool _isValid; +	bool _isPseudoRoot;  	String _path; +	WindowsFilesystemNode *_parentNode;  public:  	WindowsFilesystemNode(); @@ -59,39 +53,145 @@ public:  	virtual FSList *listDir() const;  	virtual FilesystemNode *parent() const;  	virtual FilesystemNode *clone() const { return new WindowsFilesystemNode(this); } + +private: +	static char *toAscii(TCHAR *x); +	static TCHAR* toUnicode(char *x); +	static void addFile (FSList* list, const WindowsFilesystemNode *parentNode, const char *base, WIN32_FIND_DATA* find_data);  }; +char* WindowsFilesystemNode::toAscii(TCHAR *x) { +static char asciiString[MAX_PATH]; + +#ifndef UNICODE +	return (char*)x; +#else +	WideCharToMultiByte(CP_ACP, 0, x, _tcslen(x) + 1, asciiString, sizeof(asciiString), NULL, NULL); +	return asciiString; +#endif +} + +TCHAR* WindowsFilesystemNode::toUnicode(char *x) { +static TCHAR unicodeString[MAX_PATH]; + +#ifndef UNICODE +	return (TCHAR*)x; +#else +	MultiByteToWideChar(CP_ACP, 0, x, strlen(x) + 1, unicodeString, sizeof(unicodeString)); +	return unicodeString; +#endif +} + +void WindowsFilesystemNode::addFile (FSList* list, const WindowsFilesystemNode *parentNode, const char *base, WIN32_FIND_DATA* find_data) { +	WindowsFilesystemNode entry; +	char *asciiName = toAscii(find_data->cFileName); +	bool isDirectory; + +	// Skip local directory (.) and parent (..) +	if (!strcmp(asciiName, ".") || !strcmp(asciiName, "..")) +		return; +	 +	isDirectory = (find_data->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ? true : false); + +	// Only keep the directories for the moment (files already supported) +	if (!isDirectory) +		return; + +	entry._isDirectory = isDirectory; +	entry._parentNode = (entry._isDirectory ? (WindowsFilesystemNode*)parentNode : NULL); +	entry._displayName = asciiName; +	entry._path = base; +	entry._path += asciiName; +	if (entry._isDirectory) +		entry._path += "\\"; +	entry._isValid = true;	 +	entry._isPseudoRoot = false; + +	list->push_back(entry); +} +  FilesystemNode *FilesystemNode::getRoot() { -	// TODO - return a node with the "root". I guess this will be a fake -	// dummy node in which you insert elements for all the drives (C:, D:, ...)  	return new WindowsFilesystemNode();  }  WindowsFilesystemNode::WindowsFilesystemNode() { -	// TODO - default constructor; in the POSIX implementations this just -	// produces the root node, but use as you like.... +	_displayName = "Root"; +	_isDirectory = true; +#ifndef _WIN32_WCE +	// Create a virtual root directory for standard Windows system +	_isValid = false; +	_path = ""; +	_isPseudoRoot = true; +#else +	// No need to create a pseudo root directory on Windows CE +	_isValid = true; +	_path = "\\"; +	_isPseudoRoot = false; +#endif +	_parentNode = this;  }  WindowsFilesystemNode::WindowsFilesystemNode(const WindowsFilesystemNode *node) { -	// TODO - copy constructor +	_displayName = node->_displayName; +	_isDirectory = node->_isDirectory; +	_isValid = node->_isValid; +	_isPseudoRoot = node->_isPseudoRoot; +	_path = node->_path; +	_parentNode = node->_parentNode;  }  FSList *WindowsFilesystemNode::listDir() const {  	assert(_isDirectory); -	struct dirent *dp;  	FSList *myList = new FSList(); -	 -	// TODO - fill myList here + +	if (_isPseudoRoot) { +#ifndef _WIN32_WCE +		// Drives enumeration +		TCHAR drive_buffer[100]; +		GetLogicalDriveStrings(sizeof(drive_buffer) / sizeof(TCHAR), drive_buffer); + +		for (TCHAR *current_drive = drive_buffer; *current_drive;  +			current_drive += _tcslen(current_drive) + 1) { +				WindowsFilesystemNode entry;		 +				char drive_name[2]; + +				drive_name[0] = toAscii(current_drive)[0]; +				drive_name[1] = '\0'; +				entry._displayName = drive_name; +				entry._isDirectory = true; +				entry._isValid = true; +				entry._isPseudoRoot = false; +				entry._path = toAscii(current_drive); +				myList->push_back(entry); +#endif +		} +	} +	else { +		// Files enumeration +		WIN32_FIND_DATA desc; +		HANDLE			handle; +		char			searchPath[MAX_PATH + 10]; + +		sprintf(searchPath, "%s*", _path.c_str()); + +		handle = FindFirstFile(toUnicode(searchPath), &desc); +		if (handle == INVALID_HANDLE_VALUE) +			return myList; +		addFile(myList, this, _path.c_str(), &desc); +		while (FindNextFile(handle, &desc)) +			addFile(myList, this, _path.c_str(), &desc); + +		FindClose(handle); +	}  	return myList;  }  FilesystemNode *WindowsFilesystemNode::parent() const { -	// TODO - return a node representing the parent node of this one. -	// For the root node, you may return 'this'. -	return 0; +	assert(_isDirectory); +	return _parentNode;  } -#endif // defined(UNIX) +#endif // defined(_MSC_VER) || defined(__MINGW32__) | 
