home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-07-28 | 10.7 KB | 462 lines | [TEXT/MPS ] |
- /*
- File: AbstractFile.cp
-
- Copyright: © 1991-1994 by Apple Computer, Inc.
- All rights reserved.
-
- Part of the AOCE Sample SMSAM Package. Consult the license
- which came with this software for your specific legal rights.
-
- */
-
-
-
- #ifndef __ABSTRACTFILE__
- #include "AbstractFile.h"
- #endif
-
- #ifndef __STRING__
- #include "String.h"
- #endif
-
- #ifndef __STDARG__
- #include "StdArg.h"
- #endif
-
- #ifndef __STDIO__
- #include "StdIO.h"
- #endif
-
- #ifndef __DEBUGGINGGEAR__
- #include "DebuggingGear.h"
- #endif
-
- #ifndef __ERRORS__
- #include "Errors.h"
- #endif
-
- #ifndef __HANDLEOBJECTOWNER__
- #include "HandleObjectOwner.h"
- #endif
-
- #ifndef __BUFFER__
- #include "Buffer.h"
- #endif
-
- #pragma segment VirtualFile
-
- const unsigned long kBufferSize = 1024;
-
- /***********************************|****************************************/
- /***********************************|****************************************/
-
- TAbstractFile::TAbstractFile ():
- THandleObject ()
- {
- }
-
- /***********************************|****************************************/
-
- TAbstractFile::TAbstractFile ( const TAbstractFile& that ):
- THandleObject ( that )
- {
- }
-
- /***********************************|****************************************/
-
- TAbstractFile::~TAbstractFile()
- {
- }
-
- /***********************************|****************************************/
-
- TAbstractFile&
- TAbstractFile::operator = ( const TAbstractFile& that )
- {
- THandleObject::operator = ( that );
- return *this;
- }
-
- /***********************************|****************************************/
-
- long
- TAbstractFile::ComputeAbsoluteOffset ( short mode, long offset ) const
- {
- if ( mode == fsFromStart )
- return offset;
- else if ( mode == fsFromMark )
- return offset + GetPosition ();
- else if ( mode == fsFromLEOF )
- return offset + GetEnd ();
- else
- return 0;
- }
-
- /***********************************|****************************************/
-
- long
- TAbstractFile::GetEnd () const
- {
- long end = 0;
- GetEnd ( end );
- return end;
- }
-
- /***********************************|****************************************/
-
- long
- TAbstractFile::GetPosition () const
- {
- long position = 0;
- GetPosition ( position );
- return position;
- }
-
- /***********************************|****************************************/
-
- OSErr TAbstractFile::Write ( const RString& string )
- {
- return WriteDataIgnore ( &string.body, string.dataLength );
- }
-
- /***********************************|****************************************/
-
- OSErr TAbstractFile::Write ( const TRString& string )
- {
- return WriteDataIgnore ( (const void *) (const char *) string, string.GetLength() );
- }
-
- /***********************************|****************************************/
-
- OSErr TAbstractFile::Write ( const char* s )
- {
- return WriteDataIgnore ( s, strlen ( s ) );
- }
-
- /***********************************|****************************************/
-
- OSErr TAbstractFile::Write ( const StringPtr s )
- {
- return WriteDataIgnore ( s + 1, s [ 0 ] );
- }
-
- /***********************************|****************************************/
-
- OSErr TAbstractFile::WriteDataIgnore ( const void* buffer, unsigned long length )
- {
- long temp = length;
- return WriteData ( buffer, temp );
- }
-
- /***********************************|****************************************/
-
- OSErr TAbstractFile::ReadDataIgnore ( void* buffer, unsigned long length )
- {
- long temp = length;
- return ReadData ( buffer, temp );
- }
-
- /***********************************|****************************************/
-
- OSErr TAbstractFile::Read ( StringPtr stringToRead, long maxBytesToRead )
- {
- OSErr result = ReadData ( &stringToRead[1], maxBytesToRead );
- stringToRead [ 0 ] = (unsigned char) maxBytesToRead;
- return result;
- }
-
- /***********************************|****************************************/
-
- OSErr TAbstractFile::Read ( char* dataToRead, long maxBytesToRead, long& actualSizeRead )
- {
- actualSizeRead = maxBytesToRead;
- return ReadData ( dataToRead, actualSizeRead );
- }
-
- /***********************************|****************************************/
-
- Boolean TAbstractFile::AtEOF() const
- {
- long position = 0, end = 0;
- GetPosition ( position );
- GetEnd ( end );
- return position == end;
- }
-
- /***********************************|****************************************/
-
- OSErr TAbstractFile::ReadUntil ( StringPtr string, const StringPtr stringToMatch, long maxBytesToRead )
- {
- OSErr result = -30001;
-
- string[0] = 0;
-
- while (PLstrlen(string) < maxBytesToRead)
- {
- char ch;
-
- result = Read(ch);
-
- if (result == noErr)
- {
- string[++string[0]] = ch;
- }
- else
- {
- break;
- }
-
- if (PLstrlen(stringToMatch) <= PLstrlen(string))
- {
- if (memcmp((char*) &stringToMatch[1], (char*) &string[string[0] - PLstrlen(stringToMatch) + 1], PLstrlen(stringToMatch)) == 0)
- {
- result = noErr;
- break;
- }
- }
- }
-
- return result;
- }
-
- /***********************************|****************************************/
-
- OSErr TAbstractFile::ReadUntil(char* string, const StringPtr stringToMatch, long maxBytesToRead)
- {
- OSErr result = noErr;
-
- short length = 0;
-
- while (length < maxBytesToRead)
- {
- char ch;
-
- result = Read(ch);
- if (result == noErr)
- {
- string[++length] = ch;
- }
-
- if (PLstrlen(stringToMatch) <= length)
- {
- if (memcmp((char*) &stringToMatch[1], (char*) &string[length - PLstrlen(stringToMatch)], PLstrlen(stringToMatch)) == 0)
- {
- result = noErr;
- break;
- }
- }
- }
-
- return result;
- }
-
- /***********************************|****************************************/
-
- OSErr
- TAbstractFile::WriteFormat ( const char* format, ... )
- {
- char buffer [ 128 ];
- va_list val; va_start ( val, format );
- long bytes = vsprintf ( buffer, format, val );
- return WriteData ( buffer, bytes );
- }
-
- /***********************************|****************************************/
-
- OSErr
- TAbstractFile::ReadFrom ( TAbstractFile& destination )
- {
- return destination.WriteTo ( *this );
- }
-
- /***********************************|****************************************/
-
- OSErr
- TAbstractFile::WriteTo ( TAbstractFile& destination )
- {
- long fileSize;
- OSErr error = GetEnd ( fileSize ) ;
-
- if ( error )
- return error;
-
- if ( fileSize > 0 )
- {
- TPositionPreserver preserver ( *this ); // previous position is reset when we leave scope
-
- error = SetPosition ( 0 );
- if ( error )
- return error;
-
- CBuffer buffer ( kBufferSize ); // buffer is deleted when we leave scope
-
- TRY
- {
- do
- {
- long chunkSize = fileSize > kBufferSize ? kBufferSize : fileSize;
- error = ReadData ( (void*) buffer.GetPhysicalStart (), chunkSize );
- if ( error )
- break;
- else
- error = destination.WriteData ( (void*) buffer.GetPhysicalStart (), chunkSize );
-
- fileSize -= chunkSize;
- }
- while ( !error && fileSize > 0 );
- }
- EXCEPTION
- {
- }
- ENDEXCEPTION
- }
-
- return error;
- }
-
- /***********************************|****************************************/
-
- OSErr
- TAbstractFile::WriteTo ( short refNum )
- {
- TAbstractFile* file = new TWrapperFile ( refNum );
- THandleObjectOwner owner ( file );
- return WriteTo ( *file );
- }
-
- /***********************************|****************************************/
-
- OSErr
- TAbstractFile::WriteTo ( Fork fork, const FSSpec& spec, OSType creator, OSType type )
- {
- TAbstractFile* file = new TForkFile ( spec, fork, creator, type );
- THandleObjectOwner owner ( file );
- return WriteTo ( *file );
- }
-
- /***********************************|****************************************/
-
- OSErr
- TAbstractFile::WriteTo ( Fork fork, short vRefNum, long dirID, const StringPtr name, OSType creator, OSType type )
- {
- TAbstractFile* file = new TForkFile ( vRefNum, dirID, name, fork, creator, type );
- THandleObjectOwner owner ( file );
- return WriteTo ( *file );
- }
-
- /***********************************|****************************************/
-
- OSErr
- TAbstractFile::ReadFrom ( short refNum )
- {
- TAbstractFile* file = new TWrapperFile ( refNum );
- THandleObjectOwner owner ( file );
- return ReadFrom ( *file );
- }
-
- /***********************************|****************************************/
-
- OSErr
- TAbstractFile::ReadFrom ( Fork fork, const FSSpec& spec )
- {
- TAbstractFile* file = new TForkFile ( spec, fork );
- THandleObjectOwner owner ( file );
- return file->WriteTo ( *this );
- }
-
- /***********************************|****************************************/
-
- OSErr
- TAbstractFile::ReadFrom ( Fork fork, short vRefNum, long dirID, const StringPtr name )
- {
- TAbstractFile* file = new TForkFile ( vRefNum, dirID, name, fork );
- THandleObjectOwner owner ( file );
- return file->WriteTo ( *this );
- }
-
- /***********************************|****************************************/
- /***********************************|****************************************/
-
- TWrapperFile::TWrapperFile ( short refNum, Boolean adopt ):
- TAbstractFile (),
- fRefNum ( refNum ),
- fAdopted ( adopt )
- {
- }
-
- /***********************************|****************************************/
-
- TWrapperFile::~TWrapperFile ()
- {
- if ( fAdopted )
- ::FSClose ( fRefNum );
- }
-
- /***********************************|****************************************/
- /***********************************|****************************************/
-
- TForkFile::TForkFile ( const FSSpec& spec, TAbstractFile::Fork fork, OSType creator, OSType type ):
- TWrapperFile ( -1, true )
- {
- Open ( spec, fork, creator, type );
- }
-
- /***********************************|****************************************/
-
- TForkFile::TForkFile ( short vRefNum, long dirID, const StringPtr name, TAbstractFile::Fork fork, OSType creator, OSType type ):
- TWrapperFile ( -1, true )
- {
- Open ( vRefNum, dirID, name, fork, creator, type );
- }
-
- /***********************************|****************************************/
-
- TForkFile::~TForkFile ()
- {
- }
-
- /***********************************|****************************************/
-
- OSErr TForkFile::Open ( short vRefNum, long dirID, const StringPtr name, TAbstractFile::Fork fork, OSType creator, OSType type )
- {
- FSSpec spec;
- spec.vRefNum = vRefNum;
- spec.parID = dirID;
- PLstrcpy ( spec.name, name );
- return Open ( spec, fork, creator, type );
- }
-
- /***********************************|****************************************/
-
- OSErr TForkFile::Open ( const FSSpec& spec, TAbstractFile::Fork fork, OSType creator, OSType type )
- {
- OSErr error = ::FSpCreate ( &spec, creator, type, smRoman );
-
- if ( error == noErr || error == dupFNErr )
- {
- if ( fork == TAbstractFile::kData )
- ::FSpOpenDF ( &spec, fsRdWrPerm, &fRefNum );
- else
- ::FSpOpenRF ( &spec, fsRdWrPerm, &fRefNum );
- }
-
- return error;
- }
-
- /***********************************|****************************************/
-
- ostream& operator << ( ostream& s, const FSSpec& spec )
- {
- return s << "vRefNum " << spec.vRefNum << ", dirID " << spec.parID << ", \"" << spec.name << "\"";
- }
-
- /***********************************|****************************************/
-
- ostream&
- TAbstractFile::operator >> ( ostream& stream ) const
- {
- return stream << "end: " << GetEnd () << ", position: " << GetPosition ();
- }
-
- /***********************************|****************************************/
-