mirror of https://github.com/stella-emu/stella.git
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:
parent
9b8155b29d
commit
132dfcddf0
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue