Revert isFile functionality in Windows for now; just assume it's a file if it isn't a directory.

git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@2521 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2012-06-01 17:58:01 +00:00
parent 9b8155b29d
commit 132dfcddf0
1 changed files with 438 additions and 435 deletions

View File

@ -1,257 +1,260 @@
//============================================================================ //============================================================================
// //
// SSSS tt lll lll // SSSS tt lll lll
// SS SS tt ll ll // SS SS tt ll ll
// SS tttttt eeee ll ll aaaa // SS tttttt eeee ll ll aaaa
// SSSS tt ee ee ll ll aa // SSSS tt ee ee ll ll aa
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" // SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
// SS SS tt ee ll ll aa aa // SS SS tt ee ll ll aa aa
// SSSS ttt eeeee llll llll aaaaa // SSSS ttt eeeee llll llll aaaaa
// //
// Copyright (c) 1995-2012 by Bradford W. Mott, Stephen Anthony // Copyright (c) 1995-2012 by Bradford W. Mott, Stephen Anthony
// and the Stella Team // and the Stella Team
// //
// See the file "License.txt" for information on usage and redistribution of // See the file "License.txt" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id$ // $Id$
// //
// Based on code from ScummVM - Scumm Interpreter // Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project // Copyright (C) 2002-2004 The ScummVM project
//============================================================================ //============================================================================
#include <cassert> #include <cassert>
#include <shlobj.h> #include <shlobj.h>
#ifdef ARRAYSIZE #ifdef ARRAYSIZE
#undef ARRAYSIZE #undef ARRAYSIZE
#endif #endif
#ifdef _WIN32_WCE #ifdef _WIN32_WCE
#include <windows.h> #include <windows.h>
// winnt.h defines ARRAYSIZE, but we want our own one... // winnt.h defines ARRAYSIZE, but we want our own one...
#undef ARRAYSIZE #undef ARRAYSIZE
#undef GetCurrentDirectory #undef GetCurrentDirectory
#endif #endif
#include <io.h> #include <io.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#ifndef _WIN32_WCE #ifndef _WIN32_WCE
#include <windows.h> #include <windows.h>
// winnt.h defines ARRAYSIZE, but we want our own one... // winnt.h defines ARRAYSIZE, but we want our own one...
#undef ARRAYSIZE #undef ARRAYSIZE
#endif #endif
#include <tchar.h> #include <tchar.h>
// F_OK, R_OK and W_OK are not defined under MSVC, so we define them here // F_OK, R_OK and W_OK are not defined under MSVC, so we define them here
// For more information on the modes used by MSVC, check: // For more information on the modes used by MSVC, check:
// http://msdn2.microsoft.com/en-us/library/1w06ktdy(VS.80).aspx // http://msdn2.microsoft.com/en-us/library/1w06ktdy(VS.80).aspx
#ifndef F_OK #ifndef F_OK
#define F_OK 0 #define F_OK 0
#endif #endif
#ifndef R_OK #ifndef R_OK
#define R_OK 4 #define R_OK 4
#endif #endif
#ifndef W_OK #ifndef W_OK
#define W_OK 2 #define W_OK 2
#endif #endif
#include "FSNode.hxx" #include "FSNode.hxx"
#include "HomeFinder.hxx" #include "HomeFinder.hxx"
static HomeFinder myHomeFinder; static HomeFinder myHomeFinder;
/* // TODO - fix isFile() functionality so that it actually determines if something
* Implementation of the Stella file system API based on Windows API. // is a file; for now, it assumes a file if it isn't a directory
*
* Parts of this class are documented in the base interface class, AbstractFilesystemNode. /*
*/ * Implementation of the Stella file system API based on Windows API.
class WindowsFilesystemNode : public AbstractFilesystemNode *
{ * Parts of this class are documented in the base interface class, AbstractFilesystemNode.
public: */
/** class WindowsFilesystemNode : public AbstractFilesystemNode
* Creates a WindowsFilesystemNode with the root node as path. {
* public:
* In regular windows systems, a virtual root path is used "". /**
* In windows CE, the "\" root is used instead. * Creates a WindowsFilesystemNode with the root node as path.
*/ *
WindowsFilesystemNode(); * In regular windows systems, a virtual root path is used "".
* In windows CE, the "\" root is used instead.
/** */
* Creates a WindowsFilesystemNode for a given path. WindowsFilesystemNode();
*
* Examples: /**
* path=c:\foo\bar.txt, currentDir=false -> c:\foo\bar.txt * Creates a WindowsFilesystemNode for a given path.
* path=c:\foo\bar.txt, currentDir=true -> current directory *
* path=NULL, currentDir=true -> current directory * Examples:
* * path=c:\foo\bar.txt, currentDir=false -> c:\foo\bar.txt
* @param path String with the path the new node should point to. * path=c:\foo\bar.txt, currentDir=true -> current directory
*/ * path=NULL, currentDir=true -> current directory
WindowsFilesystemNode(const string& path); *
* @param path String with the path the new node should point to.
bool exists() const { return _access(_path.c_str(), F_OK) == 0; } */
const string& getDisplayName() const { return _displayName; } WindowsFilesystemNode(const string& path);
const string& getName() const { return _displayName; }
const string& getPath() const { return _path; } bool exists() const { return _access(_path.c_str(), F_OK) == 0; }
string getRelativePath() const; const string& getDisplayName() const { return _displayName; }
bool isDirectory() const { return _isDirectory; } const string& getName() const { return _displayName; }
bool isFile() const { return _isFile; } const string& getPath() const { return _path; }
bool isReadable() const { return _access(_path.c_str(), R_OK) == 0; } string getRelativePath() const;
bool isWritable() const { return _access(_path.c_str(), W_OK) == 0; } bool isDirectory() const { return _isDirectory; }
bool isFile() const { return _isFile; }
bool getChildren(AbstractFSList& list, ListMode mode, bool hidden) const; bool isReadable() const { return _access(_path.c_str(), R_OK) == 0; }
AbstractFilesystemNode* getParent() const; bool isWritable() const { return _access(_path.c_str(), W_OK) == 0; }
protected: bool getChildren(AbstractFSList& list, ListMode mode, bool hidden) const;
string _displayName; AbstractFilesystemNode* getParent() const;
string _path;
bool _isDirectory; protected:
bool _isFile; string _displayName;
bool _isPseudoRoot; string _path;
bool _isValid; bool _isDirectory;
bool _isFile;
private: bool _isPseudoRoot;
/** bool _isValid;
* Adds a single WindowsFilesystemNode to a given list.
* This method is used by getChildren() to populate the directory entries list. private:
* /**
* @param list List to put the file entry node in. * Adds a single WindowsFilesystemNode to a given list.
* @param mode Mode to use while adding the file entry to the list. * This method is used by getChildren() to populate the directory entries list.
* @param base String with the directory being listed. *
* @param find_data Describes a file that the FindFirstFile, FindFirstFileEx, or FindNextFile functions find. * @param list List to put the file entry node in.
*/ * @param mode Mode to use while adding the file entry to the list.
static void addFile(AbstractFSList& list, ListMode mode, const char* base, WIN32_FIND_DATA* find_data); * @param base String with the directory being listed.
* @param find_data Describes a file that the FindFirstFile, FindFirstFileEx, or FindNextFile functions find.
/** */
* Converts a Unicode string to Ascii format. static void addFile(AbstractFSList& list, ListMode mode, const char* base, WIN32_FIND_DATA* find_data);
*
* @param str String to convert from Unicode to Ascii. /**
* @return str in Ascii format. * Converts a Unicode string to Ascii format.
*/ *
static char* toAscii(TCHAR *str); * @param str String to convert from Unicode to Ascii.
* @return str in Ascii format.
/** */
* Converts an Ascii string to Unicode format. static char* toAscii(TCHAR *str);
*
* @param str String to convert from Ascii to Unicode. /**
* @return str in Unicode format. * Converts an Ascii string to Unicode format.
*/ *
static const TCHAR* toUnicode(const char* str); * @param str String to convert from Ascii to Unicode.
}; * @return str in Unicode format.
*/
/** static const TCHAR* toUnicode(const char* str);
* Returns the last component of a given path. };
*
* Examples: /**
* c:\foo\bar.txt would return "\bar.txt" * Returns the last component of a given path.
* c:\foo\bar\ would return "\bar\" *
* * Examples:
* @param str Path to obtain the last component from. * c:\foo\bar.txt would return "\bar.txt"
* @return Pointer to the first char of the last component inside str. * c:\foo\bar\ would return "\bar\"
*/ *
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * @param str Path to obtain the last component from.
const char* lastPathComponent(const string& str) * @return Pointer to the first char of the last component inside str.
{ */
if(str.empty()) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
return ""; const char* lastPathComponent(const string& str)
{
const char *start = str.c_str(); if(str.empty())
const char *cur = start + str.size() - 2; return "";
while (cur >= start && *cur != '\\') const char *start = str.c_str();
--cur; const char *cur = start + str.size() - 2;
return cur + 1; while (cur >= start && *cur != '\\')
} --cur;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - return cur + 1;
void WindowsFilesystemNode::addFile(AbstractFSList& list, ListMode mode, }
const char* base, WIN32_FIND_DATA* find_data)
{ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
WindowsFilesystemNode entry; void WindowsFilesystemNode::addFile(AbstractFSList& list, ListMode mode,
char* asciiName = toAscii(find_data->cFileName); const char* base, WIN32_FIND_DATA* find_data)
bool isDirectory, isFile; {
WindowsFilesystemNode entry;
// Skip local directory (.) and parent (..) char* asciiName = toAscii(find_data->cFileName);
if (!strncmp(asciiName, ".", 1) || !strncmp(asciiName, "..", 2)) bool isDirectory, isFile;
return;
// Skip local directory (.) and parent (..)
isDirectory = (find_data->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ? true : false); if (!strncmp(asciiName, ".", 1) || !strncmp(asciiName, "..", 2))
isFile = (find_data->dwFileAttributes & FILE_ATTRIBUTE_NORMAL ? true : false); return;
if ((isFile && mode == FilesystemNode::kListDirectoriesOnly) || isDirectory = (find_data->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ? true : false);
(isDirectory && mode == FilesystemNode::kListFilesOnly)) isFile = !isDirectory;//(find_data->dwFileAttributes & FILE_ATTRIBUTE_NORMAL ? true : false);
return;
if ((isFile && mode == FilesystemNode::kListDirectoriesOnly) ||
entry._isDirectory = isDirectory; (isDirectory && mode == FilesystemNode::kListFilesOnly))
entry._isFile = isFile; return;
entry._displayName = asciiName;
entry._path = base; entry._isDirectory = isDirectory;
entry._path += asciiName; entry._isFile = isFile;
if (entry._isDirectory) entry._displayName = asciiName;
entry._path += "\\"; entry._path = base;
entry._isValid = true; entry._path += asciiName;
entry._isPseudoRoot = false; if (entry._isDirectory)
entry._path += "\\";
list.push_back(new WindowsFilesystemNode(entry)); entry._isValid = true;
} entry._isPseudoRoot = false;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - list.push_back(new WindowsFilesystemNode(entry));
char* WindowsFilesystemNode::toAscii(TCHAR* str) }
{
#ifndef UNICODE // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
return (char*)str; char* WindowsFilesystemNode::toAscii(TCHAR* str)
#else {
static char asciiString[MAX_PATH]; #ifndef UNICODE
WideCharToMultiByte(CP_ACP, 0, str, _tcslen(str) + 1, asciiString, sizeof(asciiString), NULL, NULL); return (char*)str;
return asciiString; #else
#endif static char asciiString[MAX_PATH];
} WideCharToMultiByte(CP_ACP, 0, str, _tcslen(str) + 1, asciiString, sizeof(asciiString), NULL, NULL);
return asciiString;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #endif
const TCHAR* WindowsFilesystemNode::toUnicode(const char* str) }
{
#ifndef UNICODE // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
return (const TCHAR *)str; const TCHAR* WindowsFilesystemNode::toUnicode(const char* str)
#else {
static TCHAR unicodeString[MAX_PATH]; #ifndef UNICODE
MultiByteToWideChar(CP_ACP, 0, str, strlen(str) + 1, unicodeString, sizeof(unicodeString) / sizeof(TCHAR)); return (const TCHAR *)str;
return unicodeString; #else
#endif static TCHAR unicodeString[MAX_PATH];
} MultiByteToWideChar(CP_ACP, 0, str, strlen(str) + 1, unicodeString, sizeof(unicodeString) / sizeof(TCHAR));
return unicodeString;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #endif
WindowsFilesystemNode::WindowsFilesystemNode() }
{
// Create a virtual root directory for standard Windows system // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
_isDirectory = true; WindowsFilesystemNode::WindowsFilesystemNode()
_isFile = false; {
_isValid = false; // Create a virtual root directory for standard Windows system
_path = ""; _isDirectory = true;
_isPseudoRoot = true; _isFile = false;
} _isValid = false;
_path = "";
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _isPseudoRoot = true;
WindowsFilesystemNode::WindowsFilesystemNode(const string& p) }
{
// Expand '~\' to the users 'home' directory // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
if (p.length() >= 2 && p[0] == '~' && p[1] == '\\') WindowsFilesystemNode::WindowsFilesystemNode(const string& p)
{ {
_path = myHomeFinder.getHomePath(); // Expand '~\' to the users 'home' directory
// Skip over the tilde/dot. We know that p contains at least if (p.length() >= 2 && p[0] == '~' && p[1] == '\\')
// two chars, so this is safe: {
_path += p.c_str() + 1; _path = myHomeFinder.getHomePath();
} // Skip over the tilde/dot. We know that p contains at least
// Expand '.\' to the current working directory, // two chars, so this is safe:
// likewise if the path is relative (second character not a colon) _path += p.c_str() + 1;
else if ((p.length() >= 2 && ((p[0] == '.' && p[1] == '\\') || }
p[1] != ':'))) // Expand '.\' to the current working directory,
{ // likewise if the path is relative (second character not a colon)
char buf[4096]; else if ((p.length() >= 2 && ((p[0] == '.' && p[1] == '\\') ||
if(GetCurrentDirectory(4096, buf) > 0) p[1] != ':')))
_path = buf; {
char buf[4096];
if(GetCurrentDirectory(4096, buf) > 0)
_path = buf;
if(p[0] == '.') if(p[0] == '.')
// Skip over the tilde/dot. We know that p contains at least // Skip over the tilde/dot. We know that p contains at least
@ -259,184 +262,184 @@ WindowsFilesystemNode::WindowsFilesystemNode(const string& p)
_path = _path + (p.c_str() + 1); _path = _path + (p.c_str() + 1);
else else
_path = _path + '\\' + p; _path = _path + '\\' + p;
} }
else else
{ {
_path = p; _path = p;
} }
_displayName = lastPathComponent(_path); _displayName = lastPathComponent(_path);
// Check whether it is a directory, and whether the file actually exists // Check whether it is a directory, and whether the file actually exists
DWORD fileAttribs = GetFileAttributes(toUnicode(_path.c_str())); DWORD fileAttribs = GetFileAttributes(toUnicode(_path.c_str()));
if (fileAttribs == INVALID_FILE_ATTRIBUTES) if (fileAttribs == INVALID_FILE_ATTRIBUTES)
{ {
_isDirectory = _isFile = _isValid = false; _isDirectory = _isFile = _isValid = false;
} }
else else
{ {
_isDirectory = ((fileAttribs & FILE_ATTRIBUTE_DIRECTORY) != 0); _isDirectory = ((fileAttribs & FILE_ATTRIBUTE_DIRECTORY) != 0);
_isFile = ((fileAttribs & FILE_ATTRIBUTE_NORMAL) != 0); _isFile = !_isDirectory;//((fileAttribs & FILE_ATTRIBUTE_NORMAL) != 0);
_isValid = true; _isValid = true;
// Add a trailing backslash, if necessary // Add a trailing backslash, if necessary
if (_isDirectory && _path.length() > 0 && _path[_path.length()-1] != '\\') if (_isDirectory && _path.length() > 0 && _path[_path.length()-1] != '\\')
_path += '\\'; _path += '\\';
} }
_isPseudoRoot = false; _isPseudoRoot = false;
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
string WindowsFilesystemNode::getRelativePath() const string WindowsFilesystemNode::getRelativePath() const
{ {
// If the path starts with the home directory, replace it with '~' // If the path starts with the home directory, replace it with '~'
const string& home = myHomeFinder.getHomePath(); const string& home = myHomeFinder.getHomePath();
if(home != "" && BSPF_startsWithIgnoreCase(_path, home)) if(home != "" && BSPF_startsWithIgnoreCase(_path, home))
{ {
string path = "~"; string path = "~";
const char* offset = _path.c_str() + home.length(); const char* offset = _path.c_str() + home.length();
if(*offset != '\\') path += '\\'; if(*offset != '\\') path += '\\';
path += offset; path += offset;
return path; return path;
} }
return _path; return _path;
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool WindowsFilesystemNode:: bool WindowsFilesystemNode::
getChildren(AbstractFSList& myList, ListMode mode, bool hidden) const getChildren(AbstractFSList& myList, ListMode mode, bool hidden) const
{ {
assert(_isDirectory); assert(_isDirectory);
//TODO: honor the hidden flag //TODO: honor the hidden flag
if (_isPseudoRoot) if (_isPseudoRoot)
{ {
// Drives enumeration // Drives enumeration
TCHAR drive_buffer[100]; TCHAR drive_buffer[100];
GetLogicalDriveStrings(sizeof(drive_buffer) / sizeof(TCHAR), drive_buffer); GetLogicalDriveStrings(sizeof(drive_buffer) / sizeof(TCHAR), drive_buffer);
for (TCHAR *current_drive = drive_buffer; *current_drive; for (TCHAR *current_drive = drive_buffer; *current_drive;
current_drive += _tcslen(current_drive) + 1) current_drive += _tcslen(current_drive) + 1)
{ {
WindowsFilesystemNode entry; WindowsFilesystemNode entry;
char drive_name[2]; char drive_name[2];
drive_name[0] = toAscii(current_drive)[0]; drive_name[0] = toAscii(current_drive)[0];
drive_name[1] = '\0'; drive_name[1] = '\0';
entry._displayName = drive_name; entry._displayName = drive_name;
entry._isDirectory = true; entry._isDirectory = true;
entry._isFile = false; entry._isFile = false;
entry._isValid = true; entry._isValid = true;
entry._isPseudoRoot = false; entry._isPseudoRoot = false;
entry._path = toAscii(current_drive); entry._path = toAscii(current_drive);
myList.push_back(new WindowsFilesystemNode(entry)); myList.push_back(new WindowsFilesystemNode(entry));
} }
} }
else else
{ {
// Files enumeration // Files enumeration
WIN32_FIND_DATA desc; WIN32_FIND_DATA desc;
HANDLE handle; HANDLE handle;
char searchPath[MAX_PATH + 10]; char searchPath[MAX_PATH + 10];
sprintf(searchPath, "%s*", _path.c_str()); sprintf(searchPath, "%s*", _path.c_str());
handle = FindFirstFile(toUnicode(searchPath), &desc); handle = FindFirstFile(toUnicode(searchPath), &desc);
if (handle == INVALID_HANDLE_VALUE) if (handle == INVALID_HANDLE_VALUE)
return false; return false;
addFile(myList, mode, _path.c_str(), &desc); addFile(myList, mode, _path.c_str(), &desc);
while (FindNextFile(handle, &desc)) while (FindNextFile(handle, &desc))
addFile(myList, mode, _path.c_str(), &desc); addFile(myList, mode, _path.c_str(), &desc);
FindClose(handle); FindClose(handle);
} }
return true; return true;
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AbstractFilesystemNode* WindowsFilesystemNode::getParent() const AbstractFilesystemNode* WindowsFilesystemNode::getParent() const
{ {
// assert(_isValid || _isPseudoRoot); // assert(_isValid || _isPseudoRoot);
if (!_isValid || _isPseudoRoot) if (!_isValid || _isPseudoRoot)
return 0; return 0;
WindowsFilesystemNode* p = new WindowsFilesystemNode(); WindowsFilesystemNode* p = new WindowsFilesystemNode();
if (_path.size() > 3) if (_path.size() > 3)
{ {
const char *start = _path.c_str(); const char *start = _path.c_str();
const char *end = lastPathComponent(_path); const char *end = lastPathComponent(_path);
p->_path = string(start, end - start); p->_path = string(start, end - start);
p->_isValid = true; p->_isValid = true;
p->_isDirectory = true; p->_isDirectory = true;
p->_isFile = false; p->_isFile = false;
p->_displayName = lastPathComponent(p->_path); p->_displayName = lastPathComponent(p->_path);
p->_isPseudoRoot = false; p->_isPseudoRoot = false;
} }
return p; return p;
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AbstractFilesystemNode* AbstractFilesystemNode::makeRootFileNode() AbstractFilesystemNode* AbstractFilesystemNode::makeRootFileNode()
{ {
return new WindowsFilesystemNode(); return new WindowsFilesystemNode();
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AbstractFilesystemNode* AbstractFilesystemNode::makeHomeDirectoryFileNode() AbstractFilesystemNode* AbstractFilesystemNode::makeHomeDirectoryFileNode()
{ {
return new WindowsFilesystemNode("~\\"); return new WindowsFilesystemNode("~\\");
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AbstractFilesystemNode* AbstractFilesystemNode::makeFileNodePath(const string& path) AbstractFilesystemNode* AbstractFilesystemNode::makeFileNodePath(const string& path)
{ {
return new WindowsFilesystemNode(path); return new WindowsFilesystemNode(path);
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool AbstractFilesystemNode::makeDir(const string& path) bool AbstractFilesystemNode::makeDir(const string& path)
{ {
return CreateDirectory(path.c_str(), NULL) != 0; return CreateDirectory(path.c_str(), NULL) != 0;
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool AbstractFilesystemNode::renameFile(const string& oldfile, bool AbstractFilesystemNode::renameFile(const string& oldfile,
const string& newfile) const string& newfile)
{ {
return MoveFile(oldfile.c_str(), newfile.c_str()) != 0; return MoveFile(oldfile.c_str(), newfile.c_str()) != 0;
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
string AbstractFilesystemNode::getAbsolutePath(const string& p, string AbstractFilesystemNode::getAbsolutePath(const string& p,
const string& startpath, const string& startpath,
const string& ext) const string& ext)
{ {
// Does p start with a drive letter or the given startpath? // Does p start with a drive letter or the given startpath?
// If not, it isn't an absolute path // If not, it isn't an absolute path
string path = FilesystemNode(p).getRelativePath(); string path = FilesystemNode(p).getRelativePath();
bool startsWithDrive = path.length() >= 2 && path[1] == ':'; bool startsWithDrive = path.length() >= 2 && path[1] == ':';
if(!BSPF_startsWithIgnoreCase(p, startpath+"\\") && !startsWithDrive) if(!BSPF_startsWithIgnoreCase(p, startpath+"\\") && !startsWithDrive)
path = startpath + "\\" + p; path = startpath + "\\" + p;
// Does the path have a valid extension? // Does the path have a valid extension?
// If not, we add the given one // If not, we add the given one
string::size_type idx = path.find_last_of('.'); string::size_type idx = path.find_last_of('.');
if(idx != string::npos) if(idx != string::npos)
{ {
if(!BSPF_equalsIgnoreCase(path.c_str() + idx + 1, ext)) if(!BSPF_equalsIgnoreCase(path.c_str() + idx + 1, ext))
path = path.replace(idx+1, ext.length(), ext); path = path.replace(idx+1, ext.length(), ext);
} }
else else
path += "." + ext; path += "." + ext;
return path; return path;
} }