diff options
Diffstat (limited to 'backends/fs')
| -rw-r--r-- | backends/fs/abstract-fs.h | 9 | ||||
| -rw-r--r-- | backends/fs/amigaos4/amigaos4-fs.cpp | 5 | ||||
| -rw-r--r-- | backends/fs/amigaos4/amigaos4-fs.h | 1 | ||||
| -rw-r--r-- | backends/fs/chroot/chroot-fs.cpp | 5 | ||||
| -rw-r--r-- | backends/fs/chroot/chroot-fs.h | 1 | ||||
| -rw-r--r-- | backends/fs/ds/ds-fs.cpp | 10 | ||||
| -rw-r--r-- | backends/fs/ds/ds-fs.h | 2 | ||||
| -rw-r--r-- | backends/fs/n64/n64-fs.cpp | 5 | ||||
| -rw-r--r-- | backends/fs/n64/n64-fs.h | 1 | ||||
| -rw-r--r-- | backends/fs/posix/posix-fs.cpp | 30 | ||||
| -rw-r--r-- | backends/fs/posix/posix-fs.h | 1 | ||||
| -rw-r--r-- | backends/fs/ps2/ps2-fs.cpp | 5 | ||||
| -rw-r--r-- | backends/fs/ps2/ps2-fs.h | 1 | ||||
| -rw-r--r-- | backends/fs/psp/psp-fs.cpp | 5 | ||||
| -rw-r--r-- | backends/fs/psp/psp-fs.h | 1 | ||||
| -rw-r--r-- | backends/fs/symbian/symbian-fs.cpp | 6 | ||||
| -rw-r--r-- | backends/fs/symbian/symbian-fs.h | 1 | ||||
| -rw-r--r-- | backends/fs/wii/wii-fs.cpp | 13 | ||||
| -rw-r--r-- | backends/fs/wii/wii-fs.h | 1 | ||||
| -rw-r--r-- | backends/fs/windows/windows-fs.cpp | 32 | ||||
| -rw-r--r-- | backends/fs/windows/windows-fs.h | 1 | 
21 files changed, 132 insertions, 4 deletions
diff --git a/backends/fs/abstract-fs.h b/backends/fs/abstract-fs.h index dcfdc08975..24286b649d 100644 --- a/backends/fs/abstract-fs.h +++ b/backends/fs/abstract-fs.h @@ -191,6 +191,15 @@ public:  	 * @return pointer to the stream object, 0 in case of a failure  	 */  	virtual Common::WriteStream *createWriteStream() = 0; + +	/** +	* Creates a file referred by this node. +	* +	* @param isDirectory true if created file must be a directory +	* +	* @return true if file is created successfully +	*/ +	virtual bool create(bool isDirectory) = 0;  }; diff --git a/backends/fs/amigaos4/amigaos4-fs.cpp b/backends/fs/amigaos4/amigaos4-fs.cpp index 6d5b099736..24a8fb98ad 100644 --- a/backends/fs/amigaos4/amigaos4-fs.cpp +++ b/backends/fs/amigaos4/amigaos4-fs.cpp @@ -443,4 +443,9 @@ Common::WriteStream *AmigaOSFilesystemNode::createWriteStream() {  	return StdioStream::makeFromPath(getPath(), true);  } +bool AmigaOSFilesystemNode::create(bool isDirectory) { +	error("Not supported"); +	return false; +} +  #endif //defined(__amigaos4__) diff --git a/backends/fs/amigaos4/amigaos4-fs.h b/backends/fs/amigaos4/amigaos4-fs.h index 408354888e..3ed45d3f77 100644 --- a/backends/fs/amigaos4/amigaos4-fs.h +++ b/backends/fs/amigaos4/amigaos4-fs.h @@ -116,6 +116,7 @@ public:  	virtual Common::SeekableReadStream *createReadStream();  	virtual Common::WriteStream *createWriteStream(); +	virtual bool create(bool isDirectory);  }; diff --git a/backends/fs/chroot/chroot-fs.cpp b/backends/fs/chroot/chroot-fs.cpp index 2cbb4af9d6..be6805bbd8 100644 --- a/backends/fs/chroot/chroot-fs.cpp +++ b/backends/fs/chroot/chroot-fs.cpp @@ -108,6 +108,11 @@ Common::WriteStream *ChRootFilesystemNode::createWriteStream() {  	return _realNode->createWriteStream();  } +bool ChRootFilesystemNode::create(bool /*isDir*/) { +	error("Not supported"); +	return false; +} +  Common::String ChRootFilesystemNode::addPathComponent(const Common::String &path, const Common::String &component) {  	const char sep = '/';  	if (path.lastChar() == sep && component.firstChar() == sep) { diff --git a/backends/fs/chroot/chroot-fs.h b/backends/fs/chroot/chroot-fs.h index 9ff913be31..e0ecc1c47e 100644 --- a/backends/fs/chroot/chroot-fs.h +++ b/backends/fs/chroot/chroot-fs.h @@ -49,6 +49,7 @@ public:  	virtual Common::SeekableReadStream *createReadStream();  	virtual Common::WriteStream *createWriteStream(); +	virtual bool create(bool isDirectory);  private:  	static Common::String addPathComponent(const Common::String &path, const Common::String &component); diff --git a/backends/fs/ds/ds-fs.cpp b/backends/fs/ds/ds-fs.cpp index 3782caf432..83b1295838 100644 --- a/backends/fs/ds/ds-fs.cpp +++ b/backends/fs/ds/ds-fs.cpp @@ -211,6 +211,11 @@ Common::WriteStream *DSFileSystemNode::createWriteStream() {  	return Common::wrapBufferedWriteStream(stream, WRITE_BUFFER_SIZE);  } +bool DSFileSystemNode::create(bool isDirectory) { +	error("Not supported"); +	return false; +} +  //////////////////////////////////////////////////////////////////////////  // GBAMPFileSystemNode - File system using GBA Movie Player and CF card //  ////////////////////////////////////////////////////////////////////////// @@ -393,6 +398,11 @@ Common::WriteStream *GBAMPFileSystemNode::createWriteStream() {  	return Common::wrapBufferedWriteStream(stream, WRITE_BUFFER_SIZE);  } +bool GBAMPFileSystemNode::create(bool isDirectory) { +	error("Not supported"); +	return false; +} +  DSFileStream::DSFileStream(void *handle) : _handle(handle) { diff --git a/backends/fs/ds/ds-fs.h b/backends/fs/ds/ds-fs.h index b9ccfcbe9c..939d1a1555 100644 --- a/backends/fs/ds/ds-fs.h +++ b/backends/fs/ds/ds-fs.h @@ -91,6 +91,7 @@ public:  	virtual Common::SeekableReadStream *createReadStream();  	virtual Common::WriteStream *createWriteStream(); +	virtual bool create(bool isDirectory);  	/**  	 * Returns the zip file this node points to. @@ -156,6 +157,7 @@ public:  	virtual Common::SeekableReadStream *createReadStream();  	virtual Common::WriteStream *createWriteStream(); +	virtual bool create(bool isDirectory);  };  struct fileHandle { diff --git a/backends/fs/n64/n64-fs.cpp b/backends/fs/n64/n64-fs.cpp index fe37dad467..d568500d30 100644 --- a/backends/fs/n64/n64-fs.cpp +++ b/backends/fs/n64/n64-fs.cpp @@ -160,4 +160,9 @@ Common::WriteStream *N64FilesystemNode::createWriteStream() {  	return RomfsStream::makeFromPath(getPath(), true);  } +bool N64FilesystemNode::create(bool isDirectory) { +	error("Not supported"); +	return false; +} +  #endif //#ifdef __N64__ diff --git a/backends/fs/n64/n64-fs.h b/backends/fs/n64/n64-fs.h index d503a6601e..d520ad5be6 100644 --- a/backends/fs/n64/n64-fs.h +++ b/backends/fs/n64/n64-fs.h @@ -73,6 +73,7 @@ public:  	virtual Common::SeekableReadStream *createReadStream();  	virtual Common::WriteStream *createWriteStream(); +	virtual bool create(bool isDirectory);  };  #endif diff --git a/backends/fs/posix/posix-fs.cpp b/backends/fs/posix/posix-fs.cpp index 1a6c4e40a5..ce5715210a 100644 --- a/backends/fs/posix/posix-fs.cpp +++ b/backends/fs/posix/posix-fs.cpp @@ -39,6 +39,7 @@  #include <dirent.h>  #include <stdio.h>  #include <errno.h> +#include <fcntl.h>  #ifdef __OS2__  #define INCL_DOS @@ -252,6 +253,35 @@ Common::WriteStream *POSIXFilesystemNode::createWriteStream() {  	return StdioStream::makeFromPath(getPath(), true);  } +bool POSIXFilesystemNode::create(bool isDir) { +	bool success; + +	if (isDir) { +		success = mkdir(_path.c_str(), 0755) == 0; +	} else { +		int fd = open(_path.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0755); +		success = fd >= 0; + +		if (fd >= 0) { +			close(fd); +		} +	} + +	if (success) { +		setFlags(); +		if (_isValid) { +			if (_isDirectory != isDir) warning("failed to create %s: got %s", isDir ? "directory" : "file", _isDirectory ? "directory" : "file"); +			return _isDirectory == isDir; +		} + +		warning("POSIXFilesystemNode: %s() was a success, but stat indicates there is no such %s", +			isDir ? "mkdir" : "creat", isDir ? "directory" : "file"); +		return false; +	} + +	return false; +} +  namespace Posix {  bool assureDirectoryExists(const Common::String &dir, const char *prefix) { diff --git a/backends/fs/posix/posix-fs.h b/backends/fs/posix/posix-fs.h index 0703ac5bf5..4ebce7e9d9 100644 --- a/backends/fs/posix/posix-fs.h +++ b/backends/fs/posix/posix-fs.h @@ -73,6 +73,7 @@ public:  	virtual Common::SeekableReadStream *createReadStream();  	virtual Common::WriteStream *createWriteStream(); +	virtual bool create(bool isDirectory);  private:  	/** diff --git a/backends/fs/ps2/ps2-fs.cpp b/backends/fs/ps2/ps2-fs.cpp index 9b6e1270f1..8391e063a0 100644 --- a/backends/fs/ps2/ps2-fs.cpp +++ b/backends/fs/ps2/ps2-fs.cpp @@ -441,4 +441,9 @@ Common::WriteStream *Ps2FilesystemNode::createWriteStream() {  	return PS2FileStream::makeFromPath(getPath(), true);  } +bool Ps2FilesystemNode::create(bool isDirectory) { +	error("Not supported"); +	return false; +} +  #endif diff --git a/backends/fs/ps2/ps2-fs.h b/backends/fs/ps2/ps2-fs.h index 63b866ba5b..c9da434535 100644 --- a/backends/fs/ps2/ps2-fs.h +++ b/backends/fs/ps2/ps2-fs.h @@ -96,6 +96,7 @@ public:  	virtual Common::SeekableReadStream *createReadStream();  	virtual Common::WriteStream *createWriteStream(); +	virtual bool create(bool isDirectory);  	int getDev() { return 0; }  }; diff --git a/backends/fs/psp/psp-fs.cpp b/backends/fs/psp/psp-fs.cpp index e8aad9fa98..6bd5e93435 100644 --- a/backends/fs/psp/psp-fs.cpp +++ b/backends/fs/psp/psp-fs.cpp @@ -239,4 +239,9 @@ Common::WriteStream *PSPFilesystemNode::createWriteStream() {  	return Common::wrapBufferedWriteStream(stream, WRITE_BUFFER_SIZE);  } +bool PSPFilesystemNode::create(bool isDirectory) { +	error("Not supported"); +	return false; +} +  #endif //#ifdef __PSP__ diff --git a/backends/fs/psp/psp-fs.h b/backends/fs/psp/psp-fs.h index 1bb4543d19..648544650b 100644 --- a/backends/fs/psp/psp-fs.h +++ b/backends/fs/psp/psp-fs.h @@ -65,6 +65,7 @@ public:  	virtual Common::SeekableReadStream *createReadStream();  	virtual Common::WriteStream *createWriteStream(); +	virtual bool create(bool isDirectory);  };  #endif diff --git a/backends/fs/symbian/symbian-fs.cpp b/backends/fs/symbian/symbian-fs.cpp index 8fbc3a402a..e4163caa33 100644 --- a/backends/fs/symbian/symbian-fs.cpp +++ b/backends/fs/symbian/symbian-fs.cpp @@ -231,4 +231,10 @@ Common::SeekableReadStream *SymbianFilesystemNode::createReadStream() {  Common::WriteStream *SymbianFilesystemNode::createWriteStream() {  	return SymbianStdioStream::makeFromPath(getPath(), true);  } + +bool SymbianFilesystemNode::create(bool isDirectory) { +	error("Not supported"); +	return false; +} +  #endif //#if defined(__SYMBIAN32__) diff --git a/backends/fs/symbian/symbian-fs.h b/backends/fs/symbian/symbian-fs.h index 339e998a28..1327f9f2e9 100644 --- a/backends/fs/symbian/symbian-fs.h +++ b/backends/fs/symbian/symbian-fs.h @@ -66,6 +66,7 @@ public:  	virtual Common::SeekableReadStream *createReadStream();  	virtual Common::WriteStream *createWriteStream(); +	virtual bool create(bool isDirectory);  };  #endif diff --git a/backends/fs/wii/wii-fs.cpp b/backends/fs/wii/wii-fs.cpp index 43f4f592b7..e036b75019 100644 --- a/backends/fs/wii/wii-fs.cpp +++ b/backends/fs/wii/wii-fs.cpp @@ -168,7 +168,7 @@ bool WiiFilesystemNode::getChildren(AbstractFSList &list, ListMode mode, bool hi  		if (newPath.lastChar() != '/')  		  newPath += '/';  		newPath += pent->d_name; -	   +  		bool isDir = false;  		tmpdir = opendir(newPath.c_str());  		if(tmpdir) @@ -176,17 +176,17 @@ bool WiiFilesystemNode::getChildren(AbstractFSList &list, ListMode mode, bool hi  			isDir = true;  			closedir(tmpdir);  		} -		 +  		if ((mode == Common::FSNode::kListFilesOnly && isDir) ||  			(mode == Common::FSNode::kListDirectoriesOnly && !isDir))  			continue; -		 +  		struct stat st;  		st.st_mode = 0;  		st.st_mode |= ( isDir ? S_IFDIR : 0 );  		st.st_mode |= S_IRUSR;  		st.st_mode |= S_IWUSR; -			 +  		list.push_back(new WiiFilesystemNode(newPath, &st));  	} @@ -213,4 +213,9 @@ Common::WriteStream *WiiFilesystemNode::createWriteStream() {  	return StdioStream::makeFromPath(getPath(), true);  } +bool WiiFilesystemNode::create(bool isDirectory) { +	error("Not supported"); +	return false; +} +  #endif //#if defined(__WII__) diff --git a/backends/fs/wii/wii-fs.h b/backends/fs/wii/wii-fs.h index c77c543dae..affb765884 100644 --- a/backends/fs/wii/wii-fs.h +++ b/backends/fs/wii/wii-fs.h @@ -69,6 +69,7 @@ public:  	virtual Common::SeekableReadStream *createReadStream();  	virtual Common::WriteStream *createWriteStream(); +	virtual bool create(bool isDirectory);  };  #endif diff --git a/backends/fs/windows/windows-fs.cpp b/backends/fs/windows/windows-fs.cpp index 49549b83cb..b43686f911 100644 --- a/backends/fs/windows/windows-fs.cpp +++ b/backends/fs/windows/windows-fs.cpp @@ -244,4 +244,36 @@ Common::WriteStream *WindowsFilesystemNode::createWriteStream() {  	return StdioStream::makeFromPath(getPath(), true);  } +bool WindowsFilesystemNode::create(bool isDirectory) { +	bool success; + +	if (isDirectory) { +		success = CreateDirectory(toUnicode(_path.c_str()), NULL) != 0; +	} else { +		success = CreateFile(toUnicode(_path.c_str()), GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) != INVALID_HANDLE_VALUE; +	} + +	if (success) { +		//this piece is copied from constructor, it checks that file exists and detects whether it's a directory +		DWORD fileAttribs = GetFileAttributes(toUnicode(_path.c_str())); +		if (fileAttribs != INVALID_FILE_ATTRIBUTES) { +			_isDirectory = ((fileAttribs & FILE_ATTRIBUTE_DIRECTORY) != 0); +			_isValid = true; +			// Add a trailing slash, if necessary. +			if (_isDirectory && _path.lastChar() != '\\') { +				_path += '\\'; +			} + +			if (_isDirectory != isDirectory) warning("failed to create %s: got %s", isDirectory ? "directory" : "file", _isDirectory ? "directory" : "file"); +			return _isDirectory == isDirectory; +		} + +		warning("WindowsFilesystemNode: Create%s() was a success, but GetFileAttributes() indicates there is no such %s", +			    isDirectory ? "Directory" : "File", isDirectory ? "directory" : "file"); +		return false; +	} + +	return false; +} +  #endif //#ifdef WIN32 diff --git a/backends/fs/windows/windows-fs.h b/backends/fs/windows/windows-fs.h index d06044603a..7c9f2c1e1a 100644 --- a/backends/fs/windows/windows-fs.h +++ b/backends/fs/windows/windows-fs.h @@ -88,6 +88,7 @@ public:  	virtual Common::SeekableReadStream *createReadStream();  	virtual Common::WriteStream *createWriteStream(); +	virtual bool create(bool isDirectory);  private:  	/**  | 
