home *** CD-ROM | disk | FTP | other *** search
- /* PedFSRef.cc */
-
- #include <Errors.h>
- #include <Files.h>
- #include <Resources.h>
- #include <Script.h>
-
- #include <string.h>
-
- #include "DGDebugging.h"
-
- #include "pstring.h"
- #include "SiesString.hh"
- #include "NGLList.hh"
- #include "NGLIterator.hh"
- #include "MoreFilesExtras.h"
-
- #include "PedFSRef.hh"
-
-
- void
- Split(const SiesString &inString, char inChar, NGLList<SiesString *> &ioList);
- void
- Split(const SiesString &inString, char inChar, NGLList<SiesString *> &ioList)
- {
- long len = inString.Length();
- if (len == 0) {
- return;
- }
- char *data = new char [len];
-
- inString.GetData(data, len);
-
- char *p, *q, *end;
-
- p = data;
- end = p + len;
- while (1) {
- q = p;
- while (p < end && *p++ != inChar) ;
- SiesString *str = new SiesString(q, p - q);
- ioList.Append(str);
- if (p >= end) {
- break;
- }
- p++;
- }
- delete [] data;
- }
-
-
- PedFSRef::PedFSRef()
- {
- mFSS.vRefNum = 0;
- mFSS.parID = 0;
- mFSS.name[0] = 0;
- }
-
- PedFSRef::PedFSRef(const FSSpec &inFSS)
- : mFSS(inFSS)
- {
- }
-
- PedFSRef::PedFSRef(short inVRefNum, long inDir, const char *inName)
- {
- mFSS.vRefNum = inVRefNum;
- mFSS.parID = inDir;
- Pstrcpy(mFSS.name, inName);
- }
-
- PedFSRef::PedFSRef(short inVRefNum, long inDir, const unsigned char *inName)
- {
- mFSS.vRefNum = inVRefNum;
- mFSS.parID = inDir;
- PstrPcpy(mFSS.name, inName);
- }
-
- PedFSRef::PedFSRef(const char *inPathname)
- {
- if (inPathname[0] == ':') {
- throw;
- }
- SiesString str(inPathname);
- NGLList<SiesString *> list;
- Split(str, ':', list);
- SiesString *volName = list.Behead();
- // for each subdir, ...
- NGLIterator<SiesString *> iter(list);
- SiesString *subdir;
- while (iter.GetNext(subdir)) {
-
- }
- }
-
- PedFSRef::PedFSRef(const unsigned char *inPathname)
- {
- OSErr err;
-
- err = ::FSMakeFSSpec(0, 0, inPathname, &mFSS);
- ThrowIfOSErr_(err);
- }
-
- PedFSRef::~PedFSRef()
- {
- }
-
- const FSSpec &
- PedFSRef::FSS() const
- {
- return mFSS;
- }
-
- void
- PedFSRef::SetFSSpec(const FSSpec &inFSS)
- {
- mFSS = inFSS;
- }
-
- void
- PedFSRef::SetVolDefault(short inVRefNum)
- {
- OSErr err;
-
- err = ::FSMakeFSSpec(inVRefNum, 0, NULL, &mFSS);
- ThrowIfOSErr_(err);
- }
-
- void
- PedFSRef::SetVolRoot(short inVRefNum)
- {
- OSErr err;
-
- err = ::FSMakeFSSpec(inVRefNum, 2, NULL, &mFSS);
- ThrowIfOSErr_(err);
- }
-
- void
- PedFSRef::SetVolDir(short inVRefNum, long inDir)
- {
- OSErr err;
-
- err = ::FSMakeFSSpec(inVRefNum, inDir, NULL, &mFSS);
- ThrowIfOSErr_(err);
- }
-
- void
- PedFSRef::SetVolDirName(short inVRefNum, long inDir, const char *inName)
- {
- Str255 name;
- Pstrcpy(name, inName);
- SetVolDirName(inVRefNum, inDir, name);
- }
-
- void
- PedFSRef::SetVolDirName(short inVRefNum, long inDir, const unsigned char *inName)
- {
- OSErr err;
-
- err = ::FSMakeFSSpec(inVRefNum, inDir, inName, &mFSS);
- ThrowIfOSErr_(err);
- }
-
- void
- PedFSRef::SetPathname(const char *inPathname)
- {
-
- }
-
- void
- PedFSRef::SetPathname(const unsigned char *inPathname)
- {
- OSErr err;
-
- err = ::FSMakeFSSpec(0, 0, inPathname, &mFSS);
- ThrowIfOSErr_(err);
- }
-
-
- bool
- PedFSRef::Exists()
- {
- short realVRefNum;
- long realDirID;
- Str255 realName;
- Boolean isDir;
- OSErr err;
-
- err = ::GetObjectLocation(mFSS.vRefNum, mFSS.parID, mFSS.name,
- &realVRefNum, &realDirID, realName, &isDir);
- return (err == noErr);
- }
-
- bool
- PedFSRef::IsFile()
- {
- short realVRefNum;
- long realDirID;
- Str255 realName;
- Boolean isDir;
- OSErr err;
-
- err = ::GetObjectLocation(mFSS.vRefNum, mFSS.parID, mFSS.name,
- &realVRefNum, &realDirID, realName, &isDir);
- return (err == noErr) && !isDir;
- }
-
- bool
- PedFSRef::IsDirectory()
- {
- short realVRefNum;
- long realDirID;
- Str255 realName;
- Boolean isDir;
- OSErr err;
-
- err = ::GetObjectLocation(mFSS.vRefNum, mFSS.parID, mFSS.name,
- &realVRefNum, &realDirID, realName, &isDir);
- return (err == noErr) && isDir;
- }
-
- void
- PedFSRef::CreateFile(OSType inCreator, OSType inType)
- {
- OSErr err;
-
- err = ::FSpCreate(&mFSS, inCreator, inType, smRoman);
- ThrowIfOSErr_(err);
- }
-
- void
- PedFSRef::CreateDirectory()
- {
- OSErr err;
- long dirID;
-
- err = ::FSpDirCreate(&mFSS, smRoman, &dirID);
- ThrowIfOSErr_(err);
- }
-
- AccessPath
- PedFSRef::OpenData(SInt8 inPerm) const
- {
- OSErr err;
- AccessPath refNum;
- FSSpec spec;
-
- spec = FSS();
-
- err = ::FSpOpenDF(&spec, inPerm, &refNum);
- ThrowIfOSErr_(err);
- return refNum;
- }
-
- AccessPath
- PedFSRef::OpenRF(SInt8 inPerm) const
- {
- OSErr err;
- AccessPath refNum;
- FSSpec spec;
-
- spec = FSS();
-
- err = ::FSpOpenRF(&spec, inPerm, &refNum);
- ThrowIfOSErr_(err);
- return refNum;
- }
-
- AccessPath
- PedFSRef::OpenResFile(SInt8 inPerm) const
- {
- OSErr err;
- AccessPath refNum;
- FSSpec spec;
-
- spec = FSS();
-
- refNum = ::FSpOpenResFile(&spec, inPerm);
- err = ::ResError();
- ThrowIfOSErr_(err);
- return refNum;
- }
-
- PedFSRef &
- PedFSRef::operator-(short inLevels)
- {
- return *this;
- }
-
- PedFSRef &
- PedFSRef::operator-=(short inLevels)
- {
- long parID;
- OSErr err;
-
- err = ::GetParentID(mFSS.vRefNum, mFSS.parID, mFSS.name, &parID);
- if (err == fnfErr) {
- parID = mFSS.parID;
- } else {
- ThrowIfOSErr_(err);
- }
- err = ::FSMakeFSSpec(mFSS.vRefNum, parID, NULL, &mFSS);
- ThrowIfOSErr_(err);
- return *this;
- }
-
- PedFSRef &
- PedFSRef::operator--()
- {
- return ((*this) -= 1);
- }
-
-
- PedFSRef &
- PedFSRef::operator+(const char *inName)
- {
- return *this;
- }
-
- PedFSRef &
- PedFSRef::operator+(const unsigned char *inName)
- {
- return *this;
- }
-
- PedFSRef &
- PedFSRef::operator+=(const char *inName)
- {
- if (inName == NULL) {
- return *this;
- }
-
- Str255 name;
-
- if (strlen(inName) > 255) {
- throw;
- }
- Pstrcpy(name, inName);
- return (*this += name);
- }
-
- PedFSRef &
- PedFSRef::operator+=(const unsigned char *inName)
- {
- long dirID;
- Boolean isDir;
- OSErr err;
-
- err = ::FSpGetDirectoryID(&mFSS, &dirID, &isDir);
- ThrowIfOSErr_(err);
- if (!isDir) {
- throw;
- }
- err = ::FSMakeFSSpec(mFSS.vRefNum, dirID, inName, &mFSS);
- // fnfErr indicates a valid spec of a location with no item in it.
- if (err != noErr && err != fnfErr) {
- ThrowOSErr_(err);
- }
- return *this;
- }
-
-