mirror of
https://foundry.openuru.org/gitblit/r/CWE-ou-minkata.git
synced 2025-07-17 10:52:46 +00:00
Move plFileUtils and hsFiles to CoreLib
--HG-- rename : Sources/Plasma/PubUtilLib/plFile/hsFiles.cpp => Sources/Plasma/CoreLib/hsFiles.cpp rename : Sources/Plasma/PubUtilLib/plFile/hsFiles.h => Sources/Plasma/CoreLib/hsFiles.h rename : Sources/Plasma/PubUtilLib/plFile/hsFiles_Mac.cpp => Sources/Plasma/CoreLib/hsFiles_Mac.cpp rename : Sources/Plasma/PubUtilLib/plFile/hsFiles_PS2.cpp => Sources/Plasma/CoreLib/hsFiles_PS2.cpp rename : Sources/Plasma/PubUtilLib/plFile/hsFiles_Unix.cpp => Sources/Plasma/CoreLib/hsFiles_Unix.cpp rename : Sources/Plasma/PubUtilLib/plFile/hsFiles_Win.cpp => Sources/Plasma/CoreLib/hsFiles_Win.cpp rename : Sources/Plasma/PubUtilLib/plFile/plFileUtils.cpp => Sources/Plasma/CoreLib/plFileUtils.cpp rename : Sources/Plasma/PubUtilLib/plFile/plFileUtils.h => Sources/Plasma/CoreLib/plFileUtils.h
This commit is contained in:
@ -5,26 +5,16 @@ include_directories("../../PubUtilLib")
|
||||
include_directories(${ZLIB_INCLUDE_DIR})
|
||||
|
||||
set(plFile_SOURCES
|
||||
hsFiles.cpp
|
||||
plBrowseFolder.cpp
|
||||
plEncryptedStream.cpp
|
||||
plFileUtils.cpp
|
||||
plInitFileReader.cpp
|
||||
plSecureStream.cpp
|
||||
plStreamSource.cpp
|
||||
)
|
||||
|
||||
if(WIN32)
|
||||
set(plFile_SOURCES ${plFile_SOURCES} hsFiles_Win.cpp)
|
||||
else(WIN32)
|
||||
set(plFile_SOURCES ${plFile_SOURCES} hsFiles_Unix.cpp)
|
||||
endif(WIN32)
|
||||
|
||||
set(plFile_HEADERS
|
||||
hsFiles.h
|
||||
plBrowseFolder.h
|
||||
plEncryptedStream.h
|
||||
plFileUtils.h
|
||||
plInitFileReader.h
|
||||
plSecureStream.h
|
||||
plStreamSource.h
|
||||
|
@ -1,182 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools
|
||||
Copyright (C) 2011 Cyan Worlds, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7
|
||||
|
||||
If you modify this Program, or any covered work, by linking or
|
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
|
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
|
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
|
||||
(or a modified version of those libraries),
|
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
|
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
|
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
|
||||
licensors of this Program grant you additional
|
||||
permission to convey the resulting work. Corresponding Source for a
|
||||
non-source form of such a combination shall include the source code for
|
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
|
||||
work.
|
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com
|
||||
or by snail mail at:
|
||||
Cyan Worlds, Inc.
|
||||
14617 N Newport Hwy
|
||||
Mead, WA 99021
|
||||
|
||||
*==LICENSE==*/
|
||||
#include "hsFiles.h"
|
||||
#include <string.h>
|
||||
|
||||
|
||||
#include "hsExceptions.h"
|
||||
|
||||
#if HS_BUILD_FOR_WIN32
|
||||
#define kDirChar '\\'
|
||||
#else
|
||||
#define kDirChar '/'
|
||||
#endif
|
||||
|
||||
|
||||
static const char* FindNameInPath(const char path[])
|
||||
{
|
||||
const char* name = ::strrchr(path, kDirChar);
|
||||
|
||||
if (name == nil)
|
||||
name = path;
|
||||
return name;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
hsFile::hsFile() : fPathAndName(nil), fFILE(nil)
|
||||
{
|
||||
}
|
||||
|
||||
hsFile::hsFile(const char pathAndName[]) : fPathAndName(nil), fFILE(nil)
|
||||
{
|
||||
if (pathAndName)
|
||||
fPathAndName = hsStrcpy(pathAndName);
|
||||
}
|
||||
|
||||
hsFile::~hsFile()
|
||||
{
|
||||
this->SetPathAndName(nil);
|
||||
}
|
||||
|
||||
const char* hsFile::GetPathAndName()
|
||||
{
|
||||
return fPathAndName;
|
||||
}
|
||||
|
||||
void hsFile::SetPathAndName(const char pathAndName[])
|
||||
{
|
||||
this->Close();
|
||||
|
||||
if (fPathAndName)
|
||||
{ delete[] fPathAndName;
|
||||
fPathAndName = nil;
|
||||
}
|
||||
if (pathAndName)
|
||||
fPathAndName = hsStrcpy(pathAndName);
|
||||
}
|
||||
|
||||
const char* hsFile::GetName()
|
||||
{
|
||||
return FindNameInPath(this->GetPathAndName());
|
||||
}
|
||||
|
||||
FILE* hsFile::OpenFILE(const char mode[], bool throwIfFailure)
|
||||
{
|
||||
this->Close();
|
||||
|
||||
// We call the virtual method here rather than using
|
||||
// fPathAndName directly, allowing a subclass to construct
|
||||
// the name if necessary
|
||||
//
|
||||
const char* name = this->GetPathAndName();
|
||||
if (name)
|
||||
fFILE = ::fopen(name, mode);
|
||||
|
||||
hsThrowIfTrue(throwIfFailure && fFILE == nil);
|
||||
return fFILE;
|
||||
}
|
||||
|
||||
hsStream* hsFile::OpenStream(const char mode[], bool throwIfFailure)
|
||||
{
|
||||
FILE* file = this->OpenFILE(mode, throwIfFailure);
|
||||
|
||||
if (file)
|
||||
{ hsUNIXStream* stream = new hsUNIXStream;
|
||||
stream->SetFILE(file);
|
||||
return stream;
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
void hsFile::Close()
|
||||
{
|
||||
if (fFILE)
|
||||
{ int err = ::fflush(fFILE);
|
||||
hsIfDebugMessage(err != 0, "fflush failed", err);
|
||||
err = ::fclose(fFILE);
|
||||
hsIfDebugMessage(err != 0, "fclose failed", err);
|
||||
fFILE = nil;
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool hsFolderIterator::NextFileSuffix(const char suffix[])
|
||||
{
|
||||
while (this->NextFile())
|
||||
{ const char* fileSuffix = ::strrchr(this->GetFileName(), '.');
|
||||
if (fileSuffix != nil && stricmp(fileSuffix, suffix) == 0)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
int hsFolderIterator::GetPathAndName(char pathandname[])
|
||||
{
|
||||
hsAssert(pathandname, "NULL path string");
|
||||
const char* name = this->GetFileName();
|
||||
int pathLen = strlen(fPath);
|
||||
|
||||
// add 1 for null terminator
|
||||
int totalLen = pathLen + sizeof(kDirChar) + strlen(name) + 1;
|
||||
hsAssert(totalLen <= kFolderIterator_MaxPath, "Overrun kFolderIterator_MaxPath");
|
||||
|
||||
if (pathandname)
|
||||
{
|
||||
strcpy(pathandname, fPath);
|
||||
if (pathLen > 0 && pathandname[pathLen - 1] != kDirChar)
|
||||
pathandname[pathLen++] = kDirChar;
|
||||
strcpy(pathandname + pathLen, name);
|
||||
}
|
||||
return totalLen;
|
||||
}
|
||||
|
||||
FILE* hsFolderIterator::OpenFILE(const char mode[])
|
||||
{
|
||||
char fileName[kFolderIterator_MaxPath];
|
||||
|
||||
(void)this->GetPathAndName(fileName);
|
||||
|
||||
return ::fopen(fileName, mode);
|
||||
}
|
||||
|
@ -1,154 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools
|
||||
Copyright (C) 2011 Cyan Worlds, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7
|
||||
|
||||
If you modify this Program, or any covered work, by linking or
|
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
|
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
|
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
|
||||
(or a modified version of those libraries),
|
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
|
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
|
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
|
||||
licensors of this Program grant you additional
|
||||
permission to convey the resulting work. Corresponding Source for a
|
||||
non-source form of such a combination shall include the source code for
|
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
|
||||
work.
|
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com
|
||||
or by snail mail at:
|
||||
Cyan Worlds, Inc.
|
||||
14617 N Newport Hwy
|
||||
Mead, WA 99021
|
||||
|
||||
*==LICENSE==*/
|
||||
#ifndef hsFiles_Defined
|
||||
#define hsFiles_Defined
|
||||
|
||||
#include "hsStream.h"
|
||||
#include <stdio.h>
|
||||
|
||||
#if HS_BUILD_FOR_UNIX
|
||||
#include <limits.h>
|
||||
#define kFolderIterator_MaxPath PATH_MAX
|
||||
#define SetCurrentDirectory chdir
|
||||
#else
|
||||
#define kFolderIterator_MaxPath _MAX_PATH
|
||||
#endif
|
||||
|
||||
|
||||
#if HS_BUILD_FOR_WIN32
|
||||
# define PATH_SEPARATOR '\\'
|
||||
# define WPATH_SEPARATOR L'\\'
|
||||
# define PATH_SEPARATOR_STR "\\"
|
||||
# define WPATH_SEPARATOR_STR L"\\"
|
||||
#elif HS_BUILD_FOR_UNIX
|
||||
# define PATH_SEPARATOR '/'
|
||||
# define WPATH_SEPARATOR L'/'
|
||||
# define PATH_SEPARATOR_STR "/"
|
||||
# define WPATH_SEPARATOR_STR L"/"
|
||||
#endif
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
class hsFile {
|
||||
hsFile& operator=(const hsFile&); // disallow assignment
|
||||
protected:
|
||||
char* fPathAndName;
|
||||
FILE* fFILE;
|
||||
public:
|
||||
hsFile();
|
||||
hsFile(const char pathAndName[]);
|
||||
virtual ~hsFile();
|
||||
|
||||
const char* GetName();
|
||||
virtual const char* GetPathAndName();
|
||||
virtual void SetPathAndName(const char pathAndName[]);
|
||||
|
||||
virtual FILE* OpenFILE(const char mode[], bool throwIfFailure = false);
|
||||
virtual hsStream* OpenStream(const char mode[], bool throwIfFailure = false);
|
||||
|
||||
virtual void Close(); // called automatically in the destructor
|
||||
};
|
||||
typedef hsFile hsUnixFile; // for compatibility
|
||||
typedef hsFile hsOSFile;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
class hsFolderIterator {
|
||||
char fPath[kFolderIterator_MaxPath];
|
||||
struct hsFolderIterator_Data* fData;
|
||||
bool fCustomFilter;
|
||||
public:
|
||||
#ifdef HS_BUILD_FOR_WIN32
|
||||
hsFolderIterator(const char path[] = nil, bool useCustomFilter=false);
|
||||
#else
|
||||
hsFolderIterator(const char path[] = nil, bool unused=true);
|
||||
hsFolderIterator(const struct FSSpec* spec); // Alt constructor
|
||||
#endif
|
||||
virtual ~hsFolderIterator();
|
||||
|
||||
const char* GetPath() const { return fPath; }
|
||||
void SetPath(const char path[]);
|
||||
|
||||
void Reset();
|
||||
bool NextFile();
|
||||
bool NextFileSuffix(const char suffix[]);
|
||||
const char* GetFileName() const;
|
||||
int GetPathAndName(char pathandname[] = nil);
|
||||
bool IsDirectory( void ) const;
|
||||
|
||||
FILE* OpenFILE(const char mode[]);
|
||||
|
||||
#if HS_BUILD_FOR_WIN32
|
||||
void SetWinSystemDir(const char subdir[]); // e.g. "Fonts"
|
||||
void SetFileFilterStr(const char filterStr[]); // e.g. "*.*"
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef HS_BUILD_FOR_WIN32
|
||||
// only implemented on Win32 for now
|
||||
class hsWFolderIterator {
|
||||
wchar_t fPath[kFolderIterator_MaxPath];
|
||||
struct hsWFolderIterator_Data* fData;
|
||||
bool fCustomFilter;
|
||||
public:
|
||||
hsWFolderIterator(const wchar_t path[] = nil, bool useCustomFilter=false);
|
||||
virtual ~hsWFolderIterator();
|
||||
|
||||
const wchar_t* GetPath() const { return fPath; }
|
||||
void SetPath(const wchar_t path[]);
|
||||
|
||||
void Reset();
|
||||
bool NextFile();
|
||||
bool NextFileSuffix(const wchar_t suffix[]);
|
||||
const wchar_t* GetFileName() const;
|
||||
int GetPathAndName(wchar_t pathandname[] = nil);
|
||||
bool IsDirectory( void ) const;
|
||||
|
||||
FILE* OpenFILE(const wchar_t mode[]);
|
||||
|
||||
void SetWinSystemDir(const wchar_t subdir[]); // e.g. "Fonts"
|
||||
void SetFileFilterStr(const wchar_t filterStr[]); // e.g. "*.*"
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
@ -1,409 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools
|
||||
Copyright (C) 2011 Cyan Worlds, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7
|
||||
|
||||
If you modify this Program, or any covered work, by linking or
|
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
|
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
|
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
|
||||
(or a modified version of those libraries),
|
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
|
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
|
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
|
||||
licensors of this Program grant you additional
|
||||
permission to convey the resulting work. Corresponding Source for a
|
||||
non-source form of such a combination shall include the source code for
|
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
|
||||
work.
|
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com
|
||||
or by snail mail at:
|
||||
Cyan Worlds, Inc.
|
||||
14617 N Newport Hwy
|
||||
Mead, WA 99021
|
||||
|
||||
*==LICENSE==*/
|
||||
#include "hsFiles.h"
|
||||
#include "hsUtils.h"
|
||||
#include "hsMemory.h"
|
||||
|
||||
#if HS_BUILD_FOR_MAC
|
||||
|
||||
#include <Files.h>
|
||||
#include <Folders.h>
|
||||
#include <Errors.h>
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
hsMacFile::hsMacFile() : fFlags(kRefNum_Dirty)
|
||||
{
|
||||
fSpec.name[0] = 0;
|
||||
}
|
||||
|
||||
hsMacFile::hsMacFile(const char pathAndName[]) : hsFile(pathAndName), fFlags(kRefNum_Dirty)
|
||||
{
|
||||
this->SetSpecFromName();
|
||||
}
|
||||
|
||||
hsMacFile::hsMacFile(const FSSpec* spec) : fFlags(kRefNum_Dirty)
|
||||
{
|
||||
this->SetSpec(spec);
|
||||
}
|
||||
|
||||
hsMacFile::~hsMacFile()
|
||||
{
|
||||
this->Close();
|
||||
}
|
||||
|
||||
void hsMacFile::SetSpec(const FSSpec* spec)
|
||||
{
|
||||
if (spec)
|
||||
fSpec = *spec;
|
||||
else
|
||||
fSpec.name[0] = 0;
|
||||
fFlags |= kPathName_Dirty;
|
||||
}
|
||||
|
||||
void hsMacFile::SetSpecFromName()
|
||||
{
|
||||
Str255 pstr;
|
||||
|
||||
if (fPathAndName == nil)
|
||||
fSpec.name[0] = 0;
|
||||
else
|
||||
{ hsC2PString(fPathAndName, pstr);
|
||||
::FSMakeFSSpec(0, 0, pstr, &fSpec);
|
||||
}
|
||||
}
|
||||
|
||||
void hsMacFile::SetNameFromSpec()
|
||||
{
|
||||
CInfoPBRec pb;
|
||||
Str255 dirNameP;
|
||||
char dirName[256], temp[256];
|
||||
int err;
|
||||
|
||||
hsP2CString(fSpec.name, temp);
|
||||
|
||||
pb.dirInfo.ioNamePtr = dirNameP;
|
||||
pb.dirInfo.ioVRefNum = fSpec.vRefNum;
|
||||
pb.dirInfo.ioDrParID = fSpec.parID;
|
||||
pb.dirInfo.ioFDirIndex = -1;
|
||||
|
||||
do {
|
||||
pb.dirInfo.ioDrDirID = pb.dirInfo.ioDrParID;
|
||||
err = PBGetCatInfoSync(&pb);
|
||||
hsThrowIfOSErr(err);
|
||||
|
||||
hsP2CString(dirNameP, dirName);
|
||||
strcat(dirName,":");
|
||||
strcat(dirName, temp);
|
||||
strcpy(temp, dirName);
|
||||
} while( pb.dirInfo.ioDrDirID != fsRtDirID);
|
||||
|
||||
hsAssert(fPathAndName == nil, "pathname should be nil");
|
||||
fPathAndName = hsStrcpy(temp);
|
||||
}
|
||||
|
||||
bool hsMacFile::Create(OSType creator, OSType fileType, ScriptCode scriptCode)
|
||||
{
|
||||
this->Close();
|
||||
|
||||
OSErr err;
|
||||
|
||||
(void)::FSpDelete(&fSpec);
|
||||
err = ::FSpCreate(&fSpec, creator, fileType, scriptCode);
|
||||
hsIfDebugMessage(err != 0, "FSpCreate failed", err);
|
||||
|
||||
return err == 0;
|
||||
}
|
||||
|
||||
#define kFileNotFound_Err -43
|
||||
|
||||
bool hsMacFile::OpenDataFork(Sint8_t perm, int16_t* refnum)
|
||||
{
|
||||
this->Close();
|
||||
|
||||
OSErr err;
|
||||
|
||||
err = ::FSpOpenDF(&fSpec, perm, &fRefNum);
|
||||
if (err == kFileNotFound_Err && (perm & fsWrPerm) && (perm & fsRdPerm) == 0)
|
||||
{ if (this->Create('HdSp', '????'))
|
||||
err = ::FSpOpenDF(&fSpec, perm, &fRefNum);
|
||||
}
|
||||
|
||||
if (err == 0)
|
||||
{ fFlags &= ~kRefNum_Dirty;
|
||||
if (refnum)
|
||||
*refnum = fRefNum;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
const char* hsMacFile::GetPathAndName()
|
||||
{
|
||||
if (fFlags & kPathName_Dirty)
|
||||
{ this->SetNameFromSpec();
|
||||
fFlags &= ~kPathName_Dirty;
|
||||
}
|
||||
return fPathAndName;
|
||||
}
|
||||
|
||||
void hsMacFile::SetPathAndName(const char pathAndName[])
|
||||
{
|
||||
this->hsFile::SetPathAndName(pathAndName);
|
||||
this->SetSpecFromName();
|
||||
}
|
||||
|
||||
hsStream* hsMacFile::OpenStream(const char mode[], bool throwIfFailure)
|
||||
{
|
||||
hsThrowIfNilParam(mode);
|
||||
|
||||
short refnum;
|
||||
Sint8_t perm = 0;
|
||||
|
||||
if (::strchr(mode, 'r'))
|
||||
perm |= fsRdPerm;
|
||||
if (::strchr(mode, 'w'))
|
||||
perm |= fsWrPerm;
|
||||
|
||||
if (this->OpenDataFork(perm, &refnum))
|
||||
{ hsFileStream* stream = new hsFileStream;
|
||||
stream->SetFileRef(refnum);
|
||||
return stream;
|
||||
}
|
||||
|
||||
hsThrowIfTrue(throwIfFailure);
|
||||
return nil;
|
||||
}
|
||||
|
||||
void hsMacFile::Close()
|
||||
{
|
||||
if (fFlags & kRefNum_Dirty)
|
||||
{ OSErr err = ::FSClose(fRefNum);
|
||||
hsIfDebugMessage(err != 0, "FSClose failed", err);
|
||||
fFlags &= ~kRefNum_Dirty;
|
||||
}
|
||||
this->hsFile::Close();
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
struct hsFolderIterator_Data {
|
||||
FSSpec fSpec;
|
||||
OSType fFileType;
|
||||
OSType fCreator;
|
||||
char fCName[_MAX_PATH];
|
||||
int16_t fCurrIndex;
|
||||
bool fValid;
|
||||
};
|
||||
|
||||
hsFolderIterator::hsFolderIterator(const char path[])
|
||||
{
|
||||
fData = new hsFolderIterator_Data;
|
||||
|
||||
fData->fCurrIndex = 0;
|
||||
fData->fValid = false;
|
||||
#if HS_BUILD_FOR_WIN32
|
||||
this->SetPath(path);
|
||||
#else
|
||||
this->SetMacFolder(path);
|
||||
#endif
|
||||
}
|
||||
|
||||
hsFolderIterator::hsFolderIterator(const struct FSSpec* spec) // Alt Constructor - pass in FSSpec from OpenDlg()
|
||||
{
|
||||
fData = new hsFolderIterator_Data;
|
||||
|
||||
fData->fCurrIndex = 0;
|
||||
fData->fValid = false;
|
||||
|
||||
SetMacFolder(spec->vRefNum, spec->parID);
|
||||
}
|
||||
|
||||
hsFolderIterator::~hsFolderIterator()
|
||||
{
|
||||
delete fData;
|
||||
}
|
||||
|
||||
void hsFolderIterator::SetPath(const char path[])
|
||||
{
|
||||
fPath[0] = 0;
|
||||
fData->fValid = false;
|
||||
fData->fCurrIndex = 0;
|
||||
|
||||
if (path)
|
||||
{
|
||||
::strcpy(fPath, path);
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void hsFolderIterator::SetMacFolder(OSType folderType)
|
||||
{
|
||||
fData->fCurrIndex = 0;
|
||||
fData->fValid = ::FindFolder(kOnSystemDisk, folderType, false,
|
||||
&fData->fSpec.vRefNum, &fData->fSpec.parID) == 0;
|
||||
this->Reset();
|
||||
}
|
||||
|
||||
void hsFolderIterator::SetMacFolder(int16_t vRefNum, int32_t dirID)
|
||||
{
|
||||
fData->fSpec.vRefNum = vRefNum;
|
||||
fData->fSpec.parID = dirID;
|
||||
fData->fCurrIndex = 0;
|
||||
fData->fValid = true;
|
||||
this->Reset();
|
||||
}
|
||||
|
||||
void hsFolderIterator::SetMacFolder(const char path[])
|
||||
{
|
||||
char tmp[255];
|
||||
FSSpec fileSpec;
|
||||
OSErr err;
|
||||
|
||||
hsCPathToMacPath(&tmp[1], (char*)path);
|
||||
tmp[0] = hsStrlen(&tmp[1]);
|
||||
SetPath((char*)&tmp[1]);
|
||||
|
||||
err = FSMakeFSSpec(0, 0, (const unsigned char*)tmp, &fileSpec);
|
||||
if(err == fnfErr)
|
||||
{
|
||||
HSDebugProc("XCmd directory does not exist.");
|
||||
return;
|
||||
}
|
||||
hsAssert(err == noErr, "Error making file spec.");
|
||||
|
||||
// by now we should have the file spec for the given
|
||||
// directory, however, the DirID is the PARENT directory,
|
||||
// not the child directory. The following steps should
|
||||
// give us the items we want.
|
||||
|
||||
CInfoPBRec pb;
|
||||
pb.hFileInfo.ioVRefNum = fileSpec.vRefNum;
|
||||
pb.hFileInfo.ioNamePtr = (StringPtr)fileSpec.name; // The name of the child directory.
|
||||
pb.hFileInfo.ioDirID = fileSpec.parID; // The ID of the parent directory.
|
||||
pb.hFileInfo.ioFDirIndex = 0;
|
||||
pb.hFileInfo.ioCompletion = 0;
|
||||
|
||||
err = ::PBGetCatInfoSync(&pb);
|
||||
hsAssert(err == noErr, "PBGetCatInfoSync() failure.");
|
||||
|
||||
fData->fSpec.vRefNum = fileSpec.vRefNum; // Volume reference
|
||||
fData->fSpec.parID = pb.dirInfo.ioDrDirID; // child directory ID (Finally!)
|
||||
fData->fCurrIndex = 0;
|
||||
fData->fValid = true;
|
||||
|
||||
this->Reset();
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void hsFolderIterator::Reset()
|
||||
{
|
||||
if (fData->fValid)
|
||||
fData->fCurrIndex = 1;
|
||||
#ifdef HS_DEBUGGING
|
||||
else
|
||||
hsAssert(fData->fCurrIndex == 0, "bad currindex");
|
||||
#endif
|
||||
}
|
||||
|
||||
bool hsFolderIterator::NextFile()
|
||||
{
|
||||
if (fData->fCurrIndex == 0)
|
||||
return false;
|
||||
|
||||
CInfoPBRec pb;
|
||||
|
||||
do {
|
||||
pb.hFileInfo.ioVRefNum = fData->fSpec.vRefNum;
|
||||
pb.hFileInfo.ioNamePtr = (StringPtr)fData->fSpec.name;
|
||||
pb.hFileInfo.ioDirID = fData->fSpec.parID;
|
||||
pb.hFileInfo.ioFDirIndex = fData->fCurrIndex++;
|
||||
|
||||
OSErr err = ::PBGetCatInfoSync(&pb);
|
||||
if (err)
|
||||
{
|
||||
fData->fCurrIndex = 0;
|
||||
return false;
|
||||
}
|
||||
} while (pb.hFileInfo.ioFlAttrib & ioDirMask);
|
||||
|
||||
fData->fFileType = pb.hFileInfo.ioFlFndrInfo.fdType;
|
||||
fData->fCreator = pb.hFileInfo.ioFlFndrInfo.fdCreator;
|
||||
return true;
|
||||
}
|
||||
|
||||
const char* hsFolderIterator::GetFileName() const
|
||||
{
|
||||
if (fData->fCurrIndex == 0)
|
||||
throw "end of folder";
|
||||
|
||||
// Copy our filename (in pascal format) into a cstring and then return
|
||||
HSMemory::BlockMove(&fData->fSpec.name[1], fData->fCName, fData->fSpec.name[0]);
|
||||
fData->fCName[fData->fSpec.name[0]] = 0;
|
||||
return fData->fCName;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool hsFolderIterator::NextMacFile(OSType targetFileType, OSType targetCreator)
|
||||
{
|
||||
for (;;)
|
||||
{ if (this->NextFile() == false)
|
||||
return false;
|
||||
if ((targetFileType == 0 || targetFileType == this->GetMacFileType()) &&
|
||||
(targetCreator == 0 || targetCreator == this->GetMacCreator()))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
const FSSpec* hsFolderIterator::GetMacSpec() const
|
||||
{
|
||||
if (fData->fCurrIndex == 0)
|
||||
throw "end of folder";
|
||||
return &fData->fSpec;
|
||||
}
|
||||
|
||||
|
||||
OSType hsFolderIterator::GetMacFileType() const
|
||||
{
|
||||
if (fData->fCurrIndex == 0)
|
||||
throw "end of folder";
|
||||
return fData->fFileType;
|
||||
}
|
||||
|
||||
OSType hsFolderIterator::GetMacCreator() const
|
||||
{
|
||||
if (fData->fCurrIndex == 0)
|
||||
throw "end of folder";
|
||||
return fData->fCreator;
|
||||
}
|
||||
|
||||
bool hsFolderIterator::IsDirectory( void ) const
|
||||
{
|
||||
hsAssert( false, "hsFolderIterator::IsDirectory() not defined on this platform!!!" );
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif // HS_BUILD_FOR_MAC
|
@ -1,84 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools
|
||||
Copyright (C) 2011 Cyan Worlds, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7
|
||||
|
||||
If you modify this Program, or any covered work, by linking or
|
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
|
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
|
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
|
||||
(or a modified version of those libraries),
|
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
|
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
|
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
|
||||
licensors of this Program grant you additional
|
||||
permission to convey the resulting work. Corresponding Source for a
|
||||
non-source form of such a combination shall include the source code for
|
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
|
||||
work.
|
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com
|
||||
or by snail mail at:
|
||||
Cyan Worlds, Inc.
|
||||
14617 N Newport Hwy
|
||||
Mead, WA 99021
|
||||
|
||||
*==LICENSE==*/
|
||||
#include "hsFiles.h"
|
||||
|
||||
#if HS_BUILD_FOR_PS2
|
||||
|
||||
|
||||
|
||||
hsFolderIterator::hsFolderIterator(const char path[])
|
||||
{
|
||||
hsAssert(0,"No folder Interator defined for PS2 -- yet");
|
||||
}
|
||||
|
||||
hsFolderIterator::~hsFolderIterator()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void hsFolderIterator::SetPath(const char path[])
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void hsFolderIterator::Reset()
|
||||
{
|
||||
}
|
||||
|
||||
bool hsFolderIterator::NextFile()
|
||||
{
|
||||
}
|
||||
|
||||
const char* hsFolderIterator::GetFileName() const
|
||||
{
|
||||
}
|
||||
|
||||
bool hsFolderIterator::IsDirectory( void ) const
|
||||
{
|
||||
hsAssert( false, "hsFolderIterator::IsDirectory() not defined on this platform!!!" );
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif // HS_BUILD_FOR_PS2
|
@ -1,146 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools
|
||||
Copyright (C) 2011 Cyan Worlds, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7
|
||||
|
||||
If you modify this Program, or any covered work, by linking or
|
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
|
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
|
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
|
||||
(or a modified version of those libraries),
|
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
|
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
|
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
|
||||
licensors of this Program grant you additional
|
||||
permission to convey the resulting work. Corresponding Source for a
|
||||
non-source form of such a combination shall include the source code for
|
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
|
||||
work.
|
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com
|
||||
or by snail mail at:
|
||||
Cyan Worlds, Inc.
|
||||
14617 N Newport Hwy
|
||||
Mead, WA 99021
|
||||
|
||||
*==LICENSE==*/
|
||||
#include "hsFiles.h"
|
||||
|
||||
#if HS_BUILD_FOR_UNIX
|
||||
|
||||
#include <errno.h>
|
||||
#include <dirent.h>
|
||||
#include <limits.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <glob.h>
|
||||
#include "hsTemplates.h"
|
||||
#include "plFileUtils.h"
|
||||
#include "hsStlUtils.h"
|
||||
|
||||
struct hsFolderIterator_Data {
|
||||
glob_t fGlobBuf;
|
||||
bool fInited;
|
||||
int fCnt;
|
||||
hsFolderIterator_Data() : fInited(false), fCnt(0) {}
|
||||
// ~hsFolderIterator_Data() { fInited=false; globfree(&fData->fGlobBuf); }
|
||||
};
|
||||
|
||||
hsFolderIterator::hsFolderIterator(const char path[], bool)
|
||||
{
|
||||
fData = new hsFolderIterator_Data;
|
||||
|
||||
this->SetPath(path);
|
||||
}
|
||||
|
||||
hsFolderIterator::~hsFolderIterator()
|
||||
{
|
||||
this->Reset();
|
||||
delete fData;
|
||||
}
|
||||
|
||||
void hsFolderIterator::SetPath(const char path[])
|
||||
{
|
||||
fPath[0] = 0;
|
||||
if (path)
|
||||
{
|
||||
::strcpy(fPath, path);
|
||||
}
|
||||
this->Reset();
|
||||
}
|
||||
|
||||
void hsFolderIterator::Reset()
|
||||
{
|
||||
if (fData->fInited)
|
||||
{
|
||||
globfree(&fData->fGlobBuf);
|
||||
fData->fCnt = 0;
|
||||
fData->fInited=false;
|
||||
}
|
||||
}
|
||||
bool hsFolderIterator::NextFile()
|
||||
{
|
||||
if (fData->fInited == false)
|
||||
{
|
||||
std::string path=fPath;
|
||||
if(!(strchr(fPath,'*') || strchr(fPath,'?') || strchr(fPath,'[')))
|
||||
{
|
||||
if (fPath[strlen(fPath)-1] != PATH_SEPARATOR)
|
||||
path = path + PATH_SEPARATOR_STR + "*";
|
||||
else
|
||||
path = path + "*";
|
||||
}
|
||||
|
||||
if(glob(path.c_str(), 0, NULL, &fData->fGlobBuf) != 0 ) {
|
||||
return false;
|
||||
}
|
||||
fData->fInited=true;
|
||||
fData->fCnt = 0;
|
||||
}
|
||||
|
||||
return fData->fCnt++ < fData->fGlobBuf.gl_pathc;
|
||||
}
|
||||
|
||||
const char* hsFolderIterator::GetFileName() const
|
||||
{
|
||||
if (!fData->fInited || fData->fCnt > fData->fGlobBuf.gl_pathc)
|
||||
throw "end of folder";
|
||||
|
||||
const char* fn=fData->fGlobBuf.gl_pathv[fData->fCnt-1];
|
||||
return plFileUtils::GetFileName(fn);
|
||||
}
|
||||
|
||||
bool hsFolderIterator::IsDirectory( void ) const
|
||||
{
|
||||
// rob, please forgive me, this is my best attempt...
|
||||
if(fData->fCnt > fData->fGlobBuf.gl_pathc )
|
||||
return false;
|
||||
|
||||
struct stat info;
|
||||
const char* fn=fData->fGlobBuf.gl_pathv[fData->fCnt-1];
|
||||
if( stat( fn, &info ) )
|
||||
{
|
||||
printf("Error calling stat(): %s errno=%d\n", strerror(errno), errno);
|
||||
return false;
|
||||
}
|
||||
return ( info.st_mode & S_IFDIR ) ? true : false;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -1,319 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools
|
||||
Copyright (C) 2011 Cyan Worlds, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7
|
||||
|
||||
If you modify this Program, or any covered work, by linking or
|
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
|
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
|
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
|
||||
(or a modified version of those libraries),
|
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
|
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
|
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
|
||||
licensors of this Program grant you additional
|
||||
permission to convey the resulting work. Corresponding Source for a
|
||||
non-source form of such a combination shall include the source code for
|
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
|
||||
work.
|
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com
|
||||
or by snail mail at:
|
||||
Cyan Worlds, Inc.
|
||||
14617 N Newport Hwy
|
||||
Mead, WA 99021
|
||||
|
||||
*==LICENSE==*/
|
||||
#include "hsFiles.h"
|
||||
#include "HeadSpin.h"
|
||||
|
||||
#if HS_BUILD_FOR_WIN32
|
||||
|
||||
#include "hsExceptions.h"
|
||||
|
||||
struct hsFolderIterator_Data {
|
||||
HANDLE fSearchHandle;
|
||||
WIN32_FIND_DATA fFindData;
|
||||
bool fValid;
|
||||
};
|
||||
|
||||
hsFolderIterator::hsFolderIterator(const char path[], bool useCustomFilter)
|
||||
{
|
||||
fCustomFilter = useCustomFilter;
|
||||
|
||||
fData = new hsFolderIterator_Data;
|
||||
fData->fSearchHandle = nil;
|
||||
fData->fValid = true;
|
||||
|
||||
if(useCustomFilter)
|
||||
{
|
||||
this->SetFileFilterStr(path);
|
||||
}
|
||||
else
|
||||
{
|
||||
this->SetPath(path);
|
||||
}
|
||||
}
|
||||
|
||||
hsFolderIterator::~hsFolderIterator()
|
||||
{
|
||||
delete fData;
|
||||
}
|
||||
|
||||
void hsFolderIterator::SetPath(const char path[])
|
||||
{
|
||||
fCustomFilter = false;
|
||||
fPath[0] = 0;
|
||||
if (path)
|
||||
{
|
||||
::strcpy(fPath, path);
|
||||
|
||||
// Make sure the dir ends with a slash
|
||||
char lastchar = fPath[strlen(fPath)-1];
|
||||
if (lastchar != '\\' && lastchar != '/')
|
||||
strcat(fPath, "\\");
|
||||
}
|
||||
|
||||
this->Reset();
|
||||
}
|
||||
|
||||
void hsFolderIterator::SetWinSystemDir(const char subdir[])
|
||||
{
|
||||
int ret = GetWindowsDirectory(fPath, _MAX_PATH);
|
||||
hsAssert(ret != 0, "Error getting windows directory in UseWindowsFontsPath");
|
||||
|
||||
if (subdir)
|
||||
{ ::strcat(fPath, "\\");
|
||||
::strcat(fPath, subdir);
|
||||
::strcat(fPath, "\\");
|
||||
}
|
||||
this->Reset();
|
||||
}
|
||||
|
||||
void hsFolderIterator::SetFileFilterStr(const char filterStr[])
|
||||
{
|
||||
fPath[0] = 0;
|
||||
if (filterStr)
|
||||
{
|
||||
fCustomFilter = true;
|
||||
::strcpy(fPath, filterStr);
|
||||
}
|
||||
|
||||
this->Reset();
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void hsFolderIterator::Reset()
|
||||
{
|
||||
if (fData->fSearchHandle)
|
||||
{ FindClose(fData->fSearchHandle);
|
||||
fData->fSearchHandle = nil;
|
||||
}
|
||||
fData->fValid = true;
|
||||
}
|
||||
|
||||
bool hsFolderIterator::NextFile()
|
||||
{
|
||||
if (fData->fValid == false)
|
||||
return false;
|
||||
|
||||
if (fData->fSearchHandle == nil)
|
||||
{ int len = ::strlen(fPath);
|
||||
|
||||
if(fCustomFilter == false)
|
||||
{
|
||||
fPath[len] = '*';
|
||||
fPath[len+1] = 0;
|
||||
}
|
||||
|
||||
fData->fSearchHandle = FindFirstFile(fPath, &fData->fFindData);
|
||||
fPath[len] = 0;
|
||||
|
||||
if (fData->fSearchHandle == INVALID_HANDLE_VALUE)
|
||||
{ fData->fSearchHandle = nil;
|
||||
fData->fValid = false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{ if (FindNextFile(fData->fSearchHandle, &fData->fFindData) == false)
|
||||
{ FindClose(fData->fSearchHandle);
|
||||
fData->fSearchHandle = nil;
|
||||
fData->fValid = false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool hsFolderIterator::IsDirectory( void ) const
|
||||
{
|
||||
if( fData->fValid && ( fData->fFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
const char* hsFolderIterator::GetFileName() const
|
||||
{
|
||||
if (fData->fValid == false)
|
||||
hsThrow( "end of folder");
|
||||
|
||||
return fData->fFindData.cFileName;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
struct hsWFolderIterator_Data {
|
||||
HANDLE fSearchHandle;
|
||||
WIN32_FIND_DATAW fFindData;
|
||||
bool fValid;
|
||||
};
|
||||
|
||||
hsWFolderIterator::hsWFolderIterator(const wchar_t path[], bool useCustomFilter)
|
||||
{
|
||||
fCustomFilter = useCustomFilter;
|
||||
|
||||
fData = new hsWFolderIterator_Data;
|
||||
fData->fSearchHandle = nil;
|
||||
fData->fValid = true;
|
||||
|
||||
if(useCustomFilter)
|
||||
SetFileFilterStr(path);
|
||||
else
|
||||
SetPath(path);
|
||||
}
|
||||
|
||||
hsWFolderIterator::~hsWFolderIterator()
|
||||
{
|
||||
delete fData;
|
||||
}
|
||||
|
||||
void hsWFolderIterator::SetPath(const wchar_t path[])
|
||||
{
|
||||
fCustomFilter = false;
|
||||
fPath[0] = 0;
|
||||
if (path)
|
||||
{
|
||||
wcscpy(fPath, path);
|
||||
|
||||
// Make sure the dir ends with a slash
|
||||
wchar_t lastchar = fPath[wcslen(fPath)-1];
|
||||
if (lastchar != L'\\' && lastchar != L'/')
|
||||
wcscat(fPath, L"\\");
|
||||
}
|
||||
|
||||
Reset();
|
||||
}
|
||||
|
||||
void hsWFolderIterator::SetWinSystemDir(const wchar_t subdir[])
|
||||
{
|
||||
int ret = GetWindowsDirectoryW(fPath, _MAX_PATH);
|
||||
hsAssert(ret != 0, "Error getting windows directory in UseWindowsFontsPath");
|
||||
|
||||
if (subdir)
|
||||
{
|
||||
wcscat(fPath, L"\\");
|
||||
wcscat(fPath, subdir);
|
||||
wcscat(fPath, L"\\");
|
||||
}
|
||||
Reset();
|
||||
}
|
||||
|
||||
void hsWFolderIterator::SetFileFilterStr(const wchar_t filterStr[])
|
||||
{
|
||||
fPath[0] = 0;
|
||||
if (filterStr)
|
||||
{
|
||||
fCustomFilter = true;
|
||||
wcscpy(fPath, filterStr);
|
||||
}
|
||||
|
||||
Reset();
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void hsWFolderIterator::Reset()
|
||||
{
|
||||
if (fData->fSearchHandle)
|
||||
{
|
||||
FindClose(fData->fSearchHandle);
|
||||
fData->fSearchHandle = nil;
|
||||
}
|
||||
fData->fValid = true;
|
||||
}
|
||||
|
||||
bool hsWFolderIterator::NextFile()
|
||||
{
|
||||
if (fData->fValid == false)
|
||||
return false;
|
||||
|
||||
if (fData->fSearchHandle == nil)
|
||||
{
|
||||
int len = wcslen(fPath);
|
||||
|
||||
if(fCustomFilter == false)
|
||||
{
|
||||
fPath[len] = L'*';
|
||||
fPath[len+1] = L'\0';
|
||||
}
|
||||
|
||||
fData->fSearchHandle = FindFirstFileW(fPath, &fData->fFindData);
|
||||
fPath[len] = 0;
|
||||
|
||||
if (fData->fSearchHandle == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
fData->fSearchHandle = nil;
|
||||
fData->fValid = false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (FindNextFileW(fData->fSearchHandle, &fData->fFindData) == false)
|
||||
{
|
||||
FindClose(fData->fSearchHandle);
|
||||
fData->fSearchHandle = nil;
|
||||
fData->fValid = false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool hsWFolderIterator::IsDirectory( void ) const
|
||||
{
|
||||
if( fData->fValid && ( fData->fFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
const wchar_t* hsWFolderIterator::GetFileName() const
|
||||
{
|
||||
if (fData->fValid == false)
|
||||
hsThrow( "end of folder");
|
||||
|
||||
return fData->fFindData.cFileName;
|
||||
}
|
||||
|
||||
#endif // HS_BUILD_FOR_WIN32
|
@ -1,563 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools
|
||||
Copyright (C) 2011 Cyan Worlds, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7
|
||||
|
||||
If you modify this Program, or any covered work, by linking or
|
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
|
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
|
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
|
||||
(or a modified version of those libraries),
|
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
|
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
|
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
|
||||
licensors of this Program grant you additional
|
||||
permission to convey the resulting work. Corresponding Source for a
|
||||
non-source form of such a combination shall include the source code for
|
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
|
||||
work.
|
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com
|
||||
or by snail mail at:
|
||||
Cyan Worlds, Inc.
|
||||
14617 N Newport Hwy
|
||||
Mead, WA 99021
|
||||
|
||||
*==LICENSE==*/
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// plFileUtils - Namespace of fun file utilities
|
||||
//
|
||||
//// History /////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 5.7.2002 mcn - Created
|
||||
// 4.8.2003 chip - added FileCopy and FileMove for Unix
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "HeadSpin.h"
|
||||
#include "hsStlUtils.h"
|
||||
#include "plFileUtils.h"
|
||||
#include "hsFiles.h"
|
||||
#include "hsStringTokenizer.h"
|
||||
|
||||
|
||||
#include "plUnifiedTime/plUnifiedTime.h"
|
||||
|
||||
#include "plSecureStream.h" // for the default key
|
||||
|
||||
#include <time.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
|
||||
|
||||
#if HS_BUILD_FOR_WIN32
|
||||
#include <direct.h>
|
||||
#include <io.h>
|
||||
#define mkdir _mkdir
|
||||
#define chdir _chdir
|
||||
#define chmod _chmod
|
||||
#define rmdir _rmdir
|
||||
#define unlink _unlink
|
||||
#endif
|
||||
|
||||
#if HS_BUILD_FOR_UNIX
|
||||
#include <unistd.h>
|
||||
#include <utime.h>
|
||||
#endif
|
||||
|
||||
|
||||
//// CreateDir ///////////////////////////////////////////////////////////////
|
||||
// Creates the directory specified. Returns false if unsuccessful or
|
||||
// directory already exists
|
||||
|
||||
bool plFileUtils::CreateDir( const char *path )
|
||||
{
|
||||
// Create our directory
|
||||
#if HS_BUILD_FOR_WIN32
|
||||
return ( mkdir( path ) == 0 ) ? true : ( errno==EEXIST );
|
||||
#elif HS_BUILD_FOR_UNIX
|
||||
return ( mkdir( path, 0777 ) == 0 ) ? true : ( errno==EEXIST );
|
||||
#endif
|
||||
}
|
||||
|
||||
bool plFileUtils::CreateDir( const wchar_t *path )
|
||||
{
|
||||
// Create our directory
|
||||
#if HS_BUILD_FOR_WIN32
|
||||
return ( _wmkdir( path ) == 0 ) ? true : ( errno==EEXIST );
|
||||
#elif HS_BUILD_FOR_UNIX
|
||||
const char* cpath = hsWStringToString(path);
|
||||
bool ret = CreateDir(cpath);
|
||||
delete[] cpath; /* Free the string */
|
||||
|
||||
return ret;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool plFileUtils::RemoveDir(const char* path)
|
||||
{
|
||||
return (rmdir(path) == 0);
|
||||
}
|
||||
|
||||
bool plFileUtils::RemoveDirTree(const char * path)
|
||||
{
|
||||
hsFolderIterator it(path);
|
||||
while (it.NextFile())
|
||||
{
|
||||
const char * fname = it.GetFileName();
|
||||
if ( fname[0]=='.' )
|
||||
continue;
|
||||
char pathAndName[128];
|
||||
it.GetPathAndName(pathAndName);
|
||||
if ( it.IsDirectory() )
|
||||
{
|
||||
RemoveDirTree( pathAndName );
|
||||
RemoveDir( pathAndName );
|
||||
}
|
||||
else
|
||||
{
|
||||
RemoveFile( pathAndName );
|
||||
}
|
||||
}
|
||||
RemoveDir( path );
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//// RemoveFile ////////////////////////////////////////////////////////////
|
||||
|
||||
bool plFileUtils::RemoveFile(const char* filename, bool delReadOnly)
|
||||
{
|
||||
if (delReadOnly)
|
||||
chmod(filename, S_IWRITE);
|
||||
return (unlink(filename) == 0);
|
||||
}
|
||||
|
||||
bool plFileUtils::RemoveFile(const wchar_t* filename, bool delReadOnly)
|
||||
{
|
||||
#ifdef HS_BUILD_FOR_WIN32
|
||||
if (delReadOnly)
|
||||
_wchmod(filename, S_IWRITE);
|
||||
return (_wunlink(filename) == 0);
|
||||
#elif HS_BUILD_FOR_UNIX
|
||||
const char* cfilename = hsWStringToString(filename);
|
||||
bool ret = RemoveFile(cfilename, delReadOnly);
|
||||
delete[] cfilename; /* Free the string */
|
||||
|
||||
return ret;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool plFileUtils::FileCopy(const char* existingFile, const char* newFile)
|
||||
{
|
||||
wchar_t* wExisting = hsStringToWString(existingFile);
|
||||
wchar_t* wNew = hsStringToWString(newFile);
|
||||
bool ret = FileCopy(wExisting, wNew);
|
||||
delete [] wExisting;
|
||||
delete [] wNew;
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool plFileUtils::FileCopy(const wchar_t* existingFile, const wchar_t* newFile)
|
||||
{
|
||||
#if HS_BUILD_FOR_WIN32
|
||||
return (::CopyFileW(existingFile, newFile, FALSE) != 0);
|
||||
#elif HS_BUILD_FOR_UNIX
|
||||
char data[1500];
|
||||
const char* cexisting = hsWStringToString(existingFile);
|
||||
const char* cnew = hsWStringToString(newFile);
|
||||
FILE* fp = fopen(cexisting, "rb");
|
||||
FILE* fw = fopen(cnew, "w");
|
||||
delete[] cexisting;
|
||||
delete[] cnew;
|
||||
int num = 0;
|
||||
bool retVal = true;
|
||||
if (fp && fw){
|
||||
while(!feof(fp)){
|
||||
num = fread(data, sizeof( char ), 1500, fp);
|
||||
if( ferror( fp ) ) {
|
||||
retVal = false;
|
||||
break;
|
||||
}
|
||||
fwrite(data, sizeof( char ), num, fw);
|
||||
}
|
||||
fclose(fp);
|
||||
fclose(fw);
|
||||
} else {
|
||||
retVal = false;
|
||||
}
|
||||
return retVal;
|
||||
#else
|
||||
hsAssert(0, "Not implemented");
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool plFileUtils::FileMove(const char* existingFile, const char* newFile)
|
||||
{
|
||||
#if HS_BUILD_FOR_WIN32
|
||||
return (::MoveFile(existingFile, newFile) != 0);
|
||||
#elif HS_BUILD_FOR_UNIX
|
||||
FileCopy(existingFile,newFile);
|
||||
return( RemoveFile( existingFile )==0);
|
||||
#else
|
||||
hsAssert(0, "Not implemented");
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool plFileUtils::FileMove(const wchar_t* existingFile, const wchar_t* newFile)
|
||||
{
|
||||
#if HS_BUILD_FOR_WIN32
|
||||
return (::MoveFileW(existingFile, newFile) != 0);
|
||||
#elif HS_BUILD_FOR_UNIX
|
||||
FileCopy(existingFile,newFile);
|
||||
return( RemoveFile( existingFile )==0);
|
||||
#else
|
||||
hsAssert(0, "Not implemented");
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool plFileUtils::FileExists(const wchar_t* file)
|
||||
{
|
||||
FILE* fp = hsWFopen(file, L"rb");
|
||||
bool retVal = (fp != nil);
|
||||
if (fp)
|
||||
fclose(fp);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
bool plFileUtils::FileExists(const char* file)
|
||||
{
|
||||
FILE* fp = fopen(file, "rb");
|
||||
bool retVal = (fp != nil);
|
||||
if (fp)
|
||||
fclose(fp);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
//// EnsureFilePathExists ////////////////////////////////////////////////////
|
||||
// Given a filename with path, makes sure the file's path exists
|
||||
|
||||
bool plFileUtils::EnsureFilePathExists( const char *filename )
|
||||
{
|
||||
wchar_t* wFilename = hsStringToWString(filename);
|
||||
bool ret = EnsureFilePathExists(wFilename);
|
||||
delete [] wFilename;
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool plFileUtils::EnsureFilePathExists( const wchar_t *filename )
|
||||
{
|
||||
hsWStringTokenizer izer( filename, L"\\/" );
|
||||
|
||||
bool lastWorked = false;
|
||||
wchar_t token[ kFolderIterator_MaxPath ];
|
||||
|
||||
|
||||
while( izer.Next( token, arrsize( token ) ) && izer.HasMoreTokens() )
|
||||
{
|
||||
// Want the full path from the start of the string
|
||||
lastWorked = CreateDir( izer.fString );
|
||||
izer.RestoreLastTerminator();
|
||||
}
|
||||
|
||||
return lastWorked;
|
||||
}
|
||||
|
||||
//// GetFileTimes ////////////////////////////////////////////////////////////
|
||||
// Gets the creation and modification dates of the file specified. Returns
|
||||
// false if unsuccessful
|
||||
|
||||
bool plFileUtils::GetFileTimes( const char *path, plUnifiedTime *createTimeOut, plUnifiedTime *modifyTimeOut )
|
||||
{
|
||||
struct stat fileInfo;
|
||||
|
||||
int result = stat( path, &fileInfo );
|
||||
if( result != 0 )
|
||||
return false;
|
||||
|
||||
if( createTimeOut != nil )
|
||||
*createTimeOut = plUnifiedTime( fileInfo.st_ctime );
|
||||
if( modifyTimeOut != nil )
|
||||
*modifyTimeOut = plUnifiedTime( fileInfo.st_mtime );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
plFileUtils::Modify plFileUtils::CompareModifyTimes(const char* file1, const char* file2)
|
||||
{
|
||||
plUnifiedTime modTime1, modTime2;
|
||||
if (GetFileTimes(file1, nil, &modTime1) &&
|
||||
GetFileTimes(file2, nil, &modTime2))
|
||||
{
|
||||
double diff = plUnifiedTime::GetTimeDifference(modTime1, modTime2);
|
||||
|
||||
if (hsABS(diff) <= 2)
|
||||
return kFilesEqual;
|
||||
else if (diff > 0)
|
||||
return kFile1Newer;
|
||||
else
|
||||
return kFile2Newer;
|
||||
}
|
||||
|
||||
return kFileError;
|
||||
}
|
||||
|
||||
bool plFileUtils::SetModifyTime( const char * filename, const plUnifiedTime & timestamp )
|
||||
{
|
||||
#ifdef HS_BUILD_FOR_WIN32
|
||||
HANDLE hFile = CreateFile(filename,
|
||||
GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,
|
||||
nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,nil);
|
||||
if (hFile==INVALID_HANDLE_VALUE)
|
||||
return false;
|
||||
SYSTEMTIME systime;
|
||||
systime.wDay = timestamp.GetDay();
|
||||
systime.wDayOfWeek = timestamp.GetDayOfWeek();
|
||||
systime.wHour = timestamp.GetHour();
|
||||
systime.wMilliseconds = 0;
|
||||
systime.wMinute = timestamp.GetMinute();
|
||||
systime.wMonth = timestamp.GetMonth();
|
||||
systime.wSecond = timestamp.GetSecond();
|
||||
systime.wYear = timestamp.GetYear();
|
||||
FILETIME localFileTime, filetime;
|
||||
SystemTimeToFileTime(&systime,&localFileTime);
|
||||
LocalFileTimeToFileTime(&localFileTime,&filetime);
|
||||
SetFileTime(hFile,nil,nil,&filetime);
|
||||
CloseHandle(hFile);
|
||||
return true;
|
||||
|
||||
#elif HS_BUILD_FOR_UNIX
|
||||
struct stat sbuf;
|
||||
int result = stat( filename, &sbuf );
|
||||
if( result )
|
||||
return false;
|
||||
struct utimbuf utb;
|
||||
utb.actime = sbuf.st_atime;
|
||||
utb.modtime = timestamp.GetSecs();
|
||||
result = utime( filename, &utb );
|
||||
if( result )
|
||||
return false;
|
||||
return true;
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
//// StripPath ///////////////////////////////////////////////////////////////
|
||||
|
||||
const char* plFileUtils::GetFileName(const char* path)
|
||||
{
|
||||
const char* c = strrchr(path, '/');
|
||||
if (c == nil)
|
||||
c = strrchr(path, '\\');
|
||||
|
||||
if (c == nil)
|
||||
c = path;
|
||||
else
|
||||
c++;
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
const wchar_t* plFileUtils::GetFileName(const wchar_t* path)
|
||||
{
|
||||
const wchar_t* c = wcsrchr(path, L'/');
|
||||
if (c == nil)
|
||||
c = wcsrchr(path, L'\\');
|
||||
|
||||
if (c == nil)
|
||||
c = path;
|
||||
else
|
||||
c++;
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
void plFileUtils::StripFile(char* pathAndName)
|
||||
{
|
||||
char* fileName = (char*)GetFileName(pathAndName);
|
||||
if (fileName != pathAndName)
|
||||
*fileName = '\0';
|
||||
}
|
||||
|
||||
void plFileUtils::StripFile(wchar_t* pathAndName)
|
||||
{
|
||||
wchar_t* fileName = (wchar_t*)GetFileName(pathAndName);
|
||||
if (fileName != pathAndName)
|
||||
*fileName = L'\0';
|
||||
}
|
||||
|
||||
void plFileUtils::StripExt(char* fileName)
|
||||
{
|
||||
char* ext = (char*)GetFileExt(fileName);
|
||||
if (ext)
|
||||
*(ext-1) = '\0';
|
||||
}
|
||||
|
||||
void plFileUtils::StripExt(wchar_t* fileName)
|
||||
{
|
||||
wchar_t* ext = (wchar_t*)GetFileExt(fileName);
|
||||
if (ext)
|
||||
*(ext-1) = L'\0';
|
||||
}
|
||||
|
||||
const char* plFileUtils::GetFileExt(const char* pathAndName)
|
||||
{
|
||||
const char* fileName = GetFileName(pathAndName);
|
||||
if (fileName)
|
||||
{
|
||||
const char* ext = strrchr(fileName, '.');
|
||||
if (ext)
|
||||
return ext+1;
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
const wchar_t* plFileUtils::GetFileExt(const wchar_t* pathAndName)
|
||||
{
|
||||
const wchar_t* fileName = GetFileName(pathAndName);
|
||||
if (fileName)
|
||||
{
|
||||
const wchar_t* ext = wcsrchr(fileName, L'.');
|
||||
if (ext)
|
||||
return ext+1;
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
void plFileUtils::AddSlash(char* path)
|
||||
{
|
||||
char lastChar = path[strlen(path)-1];
|
||||
if (lastChar != '\\' && lastChar != '/')
|
||||
#if HS_BUILD_FOR_WIN32
|
||||
strcat(path, "\\");
|
||||
#else
|
||||
strcat(path, "/");
|
||||
#endif
|
||||
}
|
||||
|
||||
void plFileUtils::AddSlash(wchar_t* path)
|
||||
{
|
||||
wchar_t lastChar = path[wcslen(path)-1];
|
||||
if (lastChar != L'\\' && lastChar != L'/')
|
||||
#if HS_BUILD_FOR_WIN32
|
||||
wcscat(path, L"\\");
|
||||
#else
|
||||
wcscat(path, L"/");
|
||||
#endif
|
||||
}
|
||||
|
||||
void plFileUtils::ConcatFileName(char* path, const char* fileName)
|
||||
{
|
||||
AddSlash(path);
|
||||
strcat(path, fileName);
|
||||
}
|
||||
|
||||
void plFileUtils::ConcatFileName(wchar_t* path, const wchar_t* fileName)
|
||||
{
|
||||
AddSlash(path);
|
||||
wcscat(path, fileName);
|
||||
}
|
||||
|
||||
//// GetFileSize /////////////////////////////////////////////////////////////
|
||||
|
||||
uint32_t plFileUtils::GetFileSize( const char *path )
|
||||
{
|
||||
wchar_t* wPath = hsStringToWString(path);
|
||||
uint32_t ret = GetFileSize(wPath);
|
||||
delete [] wPath;
|
||||
return ret;
|
||||
}
|
||||
|
||||
uint32_t plFileUtils::GetFileSize( const wchar_t *path )
|
||||
{
|
||||
uint32_t len = 0;
|
||||
|
||||
hsUNIXStream str;
|
||||
if (str.Open(path, L"rb"))
|
||||
{
|
||||
len = str.GetEOF();
|
||||
str.Close();
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
//// GetSecureEncryptionKey //////////////////////////////////////////////////
|
||||
|
||||
bool plFileUtils::GetSecureEncryptionKey(const char* filename, uint32_t* key, unsigned length)
|
||||
{
|
||||
wchar_t* wFilename = hsStringToWString(filename);
|
||||
bool ret = GetSecureEncryptionKey(wFilename, key, length);
|
||||
delete [] wFilename;
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool plFileUtils::GetSecureEncryptionKey(const wchar_t* filename, uint32_t* key, unsigned length)
|
||||
{
|
||||
// looks for an encryption key file in the same directory, and reads it
|
||||
std::wstring sFilename = filename;
|
||||
|
||||
// grab parent directory
|
||||
size_t loc = sFilename.rfind(L"\\");
|
||||
if (loc == std::wstring::npos)
|
||||
loc = sFilename.rfind(L"/");
|
||||
|
||||
std::wstring sDir;
|
||||
if (loc != std::wstring::npos)
|
||||
sDir = sFilename.substr(0, loc);
|
||||
else // no directory
|
||||
sDir = L"./";
|
||||
if ((sDir[sDir.length()-1] != L'/') && (sDir[sDir.length()-1] != L'\\'))
|
||||
sDir += L'/'; // add the slash, if it doesn't has one
|
||||
|
||||
// now add the key filename
|
||||
std::wstring keyFile = sDir + kWKeyFilename;
|
||||
|
||||
if (FileExists(keyFile.c_str()))
|
||||
{
|
||||
// file exists, read from it
|
||||
hsUNIXStream file;
|
||||
file.Open(keyFile.c_str(), L"rb");
|
||||
|
||||
unsigned bytesToRead = length * sizeof(uint32_t);
|
||||
uint8_t* buffer = (uint8_t*)malloc(bytesToRead);
|
||||
unsigned bytesRead = file.Read(bytesToRead, buffer);
|
||||
|
||||
file.Close();
|
||||
|
||||
unsigned memSize = min(bytesToRead, bytesRead);
|
||||
memcpy(key, buffer, memSize);
|
||||
free(buffer);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// file doesn't exist, use default key
|
||||
unsigned memSize = min(length, arrsize(plSecureStream::kDefaultKey));
|
||||
memSize *= sizeof(uint32_t);
|
||||
memcpy(key, plSecureStream::kDefaultKey, memSize);
|
||||
|
||||
return false;
|
||||
}
|
@ -1,125 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools
|
||||
Copyright (C) 2011 Cyan Worlds, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7
|
||||
|
||||
If you modify this Program, or any covered work, by linking or
|
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
|
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
|
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
|
||||
(or a modified version of those libraries),
|
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
|
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
|
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
|
||||
licensors of this Program grant you additional
|
||||
permission to convey the resulting work. Corresponding Source for a
|
||||
non-source form of such a combination shall include the source code for
|
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
|
||||
work.
|
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com
|
||||
or by snail mail at:
|
||||
Cyan Worlds, Inc.
|
||||
14617 N Newport Hwy
|
||||
Mead, WA 99021
|
||||
|
||||
*==LICENSE==*/
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// plFileUtils - Namespace of fun file utilities
|
||||
//
|
||||
//// History /////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 5.7.2002 mcn - Created
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _plFileUtils_h
|
||||
#define _plFileUtils_h
|
||||
|
||||
class plUnifiedTime;
|
||||
|
||||
namespace plFileUtils
|
||||
{
|
||||
static const char kKeyFilename[] = "encryption.key";
|
||||
static const wchar_t kWKeyFilename[] = L"encryption.key";
|
||||
|
||||
// Creates the directory specified. Returns false if unsuccessful or directory already exists
|
||||
bool CreateDir( const char *path );
|
||||
bool CreateDir( const wchar_t *path );
|
||||
bool RemoveDir(const char* path);
|
||||
bool RemoveDirTree(const char * path);
|
||||
|
||||
// delete file from disk
|
||||
bool RemoveFile(const char* filename, bool delReadOnly=false);
|
||||
bool RemoveFile(const wchar_t* filename, bool delReadOnly=false);
|
||||
|
||||
bool FileCopy(const char* existingFile, const char* newFile);
|
||||
bool FileCopy(const wchar_t* existingFile, const wchar_t* newFile);
|
||||
bool FileMove(const char* existingFile, const char* newFile);
|
||||
bool FileMove(const wchar_t* existingFile, const wchar_t* newFile);
|
||||
|
||||
bool FileExists(const char* file);
|
||||
bool FileExists(const wchar_t* file);
|
||||
|
||||
// Given a filename with path, makes sure the file's path exists
|
||||
bool EnsureFilePathExists( const char *filename );
|
||||
bool EnsureFilePathExists( const wchar_t *filename );
|
||||
|
||||
// Gets the creation and modification dates of the file specified. Returns false if unsuccessful
|
||||
bool GetFileTimes( const char *path, plUnifiedTime *createTimeOut, plUnifiedTime *modifyTimeOut );
|
||||
// Compares file times, taking into account NTFS/FAT32 time issues
|
||||
enum Modify { kFileError, kFilesEqual, kFile1Newer, kFile2Newer };
|
||||
Modify CompareModifyTimes(const char* file1, const char* file2);
|
||||
// Set file modify time
|
||||
bool SetModifyTime( const char * filename, const plUnifiedTime & time );
|
||||
|
||||
// Return a pointer into the given string at the start of the actual filename (i.e. past any path info)
|
||||
const char* GetFileName(const char* pathAndName);
|
||||
const wchar_t* GetFileName(const wchar_t* pathAndName);
|
||||
// Get the file extension (without the .), or nil if it doesn't have one
|
||||
const char* GetFileExt(const char* pathAndName);
|
||||
const wchar_t* GetFileExt(const wchar_t* pathAndName);
|
||||
|
||||
// Strips the filename off the given full path
|
||||
void StripFile(char* pathAndName);
|
||||
void StripFile(wchar_t* pathAndName);
|
||||
void StripExt(char* fileName);
|
||||
void StripExt(wchar_t* fileName);
|
||||
|
||||
// Get the size of the given file in bytes
|
||||
uint32_t GetFileSize( const char *path );
|
||||
uint32_t GetFileSize( const wchar_t *path );
|
||||
|
||||
// Adds a slash to the end of a filename (or does nothing if it's already there)
|
||||
void AddSlash(char* path);
|
||||
void AddSlash(wchar_t* path);
|
||||
|
||||
// Concatenates fileName onto path, making sure to add a slash if necessary
|
||||
void ConcatFileName(char* path, const char* fileName);
|
||||
void ConcatFileName(wchar_t* path, const wchar_t* fileName);
|
||||
|
||||
// searches the parent directory of filename for the encryption key file, and reads it
|
||||
// into the key passed in. Returns false if the key file didn't exist (and sets key to
|
||||
// the default key)
|
||||
bool GetSecureEncryptionKey(const char* filename, uint32_t* key, unsigned length);
|
||||
bool GetSecureEncryptionKey(const wchar_t* filename, uint32_t* key, unsigned length);
|
||||
};
|
||||
|
||||
|
||||
#endif // _plFileUtils_h
|
Reference in New Issue
Block a user