home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 February: Tool Chest / Apple Developer CD Series Tool Chest February 1996 (Apple Computer)(1996).iso / Sample Code / AOCE Sample Code / PowerTalk Access Modules / Sample SMSAM / SampleSMSAM Source / VirtualFile / AbstractFile.cp next >
Encoding:
Text File  |  1995-07-28  |  10.7 KB  |  462 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        AbstractFile.cp
  3.  
  4.     Copyright:    © 1991-1994 by Apple Computer, Inc.
  5.                 All rights reserved.
  6.  
  7.     Part of the AOCE Sample SMSAM Package.  Consult the license
  8.     which came with this software for your specific legal rights.
  9.  
  10. */
  11.  
  12.  
  13.  
  14. #ifndef __ABSTRACTFILE__
  15. #include "AbstractFile.h"
  16. #endif
  17.  
  18. #ifndef    __STRING__
  19. #include "String.h"
  20. #endif
  21.  
  22. #ifndef    __STDARG__
  23. #include "StdArg.h"
  24. #endif
  25.  
  26. #ifndef    __STDIO__
  27. #include "StdIO.h"
  28. #endif
  29.  
  30. #ifndef    __DEBUGGINGGEAR__
  31. #include "DebuggingGear.h"
  32. #endif
  33.  
  34. #ifndef    __ERRORS__
  35. #include "Errors.h"
  36. #endif
  37.  
  38. #ifndef    __HANDLEOBJECTOWNER__
  39. #include "HandleObjectOwner.h"
  40. #endif
  41.  
  42. #ifndef    __BUFFER__
  43. #include "Buffer.h"
  44. #endif
  45.  
  46. #pragma segment VirtualFile
  47.  
  48. const unsigned long kBufferSize = 1024;
  49.  
  50. /***********************************|****************************************/
  51. /***********************************|****************************************/
  52.  
  53. TAbstractFile::TAbstractFile ():
  54.     THandleObject ()
  55. {
  56. }
  57.  
  58. /***********************************|****************************************/
  59.  
  60. TAbstractFile::TAbstractFile ( const TAbstractFile& that ):
  61.     THandleObject ( that )
  62. {
  63. }
  64.  
  65. /***********************************|****************************************/
  66.  
  67. TAbstractFile::~TAbstractFile()
  68. {
  69. }
  70.  
  71. /***********************************|****************************************/
  72.  
  73. TAbstractFile&
  74. TAbstractFile::operator = ( const TAbstractFile& that )
  75. {
  76.     THandleObject::operator = ( that );
  77.     return *this;
  78. }
  79.  
  80. /***********************************|****************************************/
  81.  
  82. long
  83. TAbstractFile::ComputeAbsoluteOffset ( short mode, long offset ) const
  84. {
  85.     if ( mode == fsFromStart )
  86.         return offset;
  87.     else if ( mode == fsFromMark )
  88.         return offset + GetPosition ();
  89.     else if ( mode == fsFromLEOF )
  90.         return offset + GetEnd ();
  91.     else
  92.         return 0;
  93. }
  94.  
  95. /***********************************|****************************************/
  96.  
  97. long
  98. TAbstractFile::GetEnd () const
  99. {
  100.     long end = 0;
  101.     GetEnd ( end );
  102.     return end;
  103. }
  104.  
  105. /***********************************|****************************************/
  106.  
  107. long
  108. TAbstractFile::GetPosition () const
  109. {
  110.     long position = 0;
  111.     GetPosition ( position );
  112.     return position;
  113. }
  114.  
  115. /***********************************|****************************************/
  116.  
  117. OSErr TAbstractFile::Write ( const RString& string )
  118. {
  119.     return WriteDataIgnore ( &string.body, string.dataLength );
  120. }
  121.  
  122. /***********************************|****************************************/
  123.  
  124. OSErr TAbstractFile::Write ( const TRString& string )
  125. {
  126.     return WriteDataIgnore ( (const void *) (const char *) string, string.GetLength() );
  127. }
  128.  
  129. /***********************************|****************************************/
  130.  
  131. OSErr TAbstractFile::Write ( const char* s )
  132. {
  133.     return WriteDataIgnore ( s, strlen ( s ) );
  134. }
  135.  
  136. /***********************************|****************************************/
  137.  
  138. OSErr TAbstractFile::Write ( const StringPtr s )
  139. {
  140.     return WriteDataIgnore ( s + 1, s [ 0 ] );
  141. }
  142.  
  143. /***********************************|****************************************/
  144.  
  145. OSErr TAbstractFile::WriteDataIgnore ( const void* buffer, unsigned long length )
  146. {
  147.     long temp = length;
  148.     return WriteData ( buffer, temp );
  149. }
  150.  
  151. /***********************************|****************************************/
  152.  
  153. OSErr TAbstractFile::ReadDataIgnore ( void* buffer, unsigned long length )
  154. {
  155.     long temp = length;
  156.     return ReadData ( buffer, temp );
  157. }
  158.  
  159. /***********************************|****************************************/
  160.  
  161. OSErr TAbstractFile::Read ( StringPtr stringToRead, long maxBytesToRead )
  162. {
  163.     OSErr result = ReadData ( &stringToRead[1], maxBytesToRead );
  164.     stringToRead [ 0 ] = (unsigned char) maxBytesToRead;
  165.     return result;
  166. }
  167.  
  168. /***********************************|****************************************/
  169.  
  170. OSErr TAbstractFile::Read ( char* dataToRead, long maxBytesToRead, long& actualSizeRead )
  171. {
  172.     actualSizeRead = maxBytesToRead;
  173.     return ReadData ( dataToRead, actualSizeRead );
  174. }
  175.  
  176. /***********************************|****************************************/
  177.  
  178. Boolean TAbstractFile::AtEOF() const
  179. {
  180.     long position = 0, end = 0;
  181.     GetPosition ( position );
  182.     GetEnd ( end );
  183.     return position == end;
  184. }
  185.  
  186. /***********************************|****************************************/
  187.  
  188. OSErr TAbstractFile::ReadUntil ( StringPtr string, const StringPtr stringToMatch, long maxBytesToRead )
  189. {
  190.     OSErr result = -30001;
  191.  
  192.     string[0] = 0;
  193.  
  194.     while (PLstrlen(string) < maxBytesToRead)
  195.     {
  196.         char ch;
  197.  
  198.         result = Read(ch);
  199.  
  200.         if (result == noErr)
  201.         {
  202.             string[++string[0]] = ch;
  203.         }
  204.         else
  205.         {
  206.             break;
  207.         }
  208.  
  209.         if (PLstrlen(stringToMatch) <= PLstrlen(string))
  210.         {
  211.             if (memcmp((char*) &stringToMatch[1], (char*) &string[string[0] - PLstrlen(stringToMatch) + 1], PLstrlen(stringToMatch)) == 0)
  212.             {
  213.                 result = noErr;
  214.                 break;
  215.             }
  216.         }
  217.     }
  218.  
  219.     return result;
  220. }
  221.  
  222. /***********************************|****************************************/
  223.  
  224. OSErr TAbstractFile::ReadUntil(char* string, const StringPtr stringToMatch, long maxBytesToRead)
  225. {
  226.     OSErr result = noErr;
  227.  
  228.     short length = 0;
  229.  
  230.     while (length < maxBytesToRead)
  231.     {
  232.         char ch;
  233.  
  234.         result = Read(ch);
  235.         if (result == noErr)
  236.         {
  237.             string[++length] = ch;
  238.         }
  239.  
  240.         if (PLstrlen(stringToMatch) <= length)
  241.         {
  242.             if (memcmp((char*) &stringToMatch[1], (char*) &string[length - PLstrlen(stringToMatch)], PLstrlen(stringToMatch)) == 0)
  243.             {
  244.                 result = noErr;
  245.                 break;
  246.             }
  247.         }
  248.     }
  249.  
  250.     return result;
  251. }
  252.  
  253. /***********************************|****************************************/
  254.  
  255. OSErr
  256. TAbstractFile::WriteFormat ( const char* format, ... )
  257. {
  258.     char buffer [ 128 ];
  259.     va_list val; va_start ( val, format );
  260.     long bytes = vsprintf ( buffer, format, val );
  261.     return WriteData ( buffer, bytes );
  262. }
  263.  
  264. /***********************************|****************************************/
  265.  
  266. OSErr
  267. TAbstractFile::ReadFrom ( TAbstractFile& destination )
  268. {
  269.     return destination.WriteTo ( *this );
  270. }
  271.  
  272. /***********************************|****************************************/
  273.  
  274. OSErr
  275. TAbstractFile::WriteTo ( TAbstractFile& destination )
  276. {
  277.     long fileSize;
  278.     OSErr error = GetEnd ( fileSize ) ; 
  279.  
  280.     if ( error )
  281.         return error;
  282.  
  283.     if ( fileSize > 0 )
  284.     {
  285.         TPositionPreserver preserver ( *this );    // previous position is reset when we leave scope
  286.         
  287.         error =  SetPosition ( 0 );
  288.         if ( error )
  289.             return error;
  290.  
  291.         CBuffer buffer ( kBufferSize );    // buffer is deleted when we leave scope
  292.  
  293.         TRY
  294.         {
  295.             do
  296.             {
  297.                 long chunkSize = fileSize > kBufferSize ? kBufferSize : fileSize;
  298.                 error = ReadData ( (void*) buffer.GetPhysicalStart (), chunkSize );
  299.                 if ( error )
  300.                     break;
  301.                 else
  302.                     error = destination.WriteData ( (void*) buffer.GetPhysicalStart (), chunkSize );
  303.  
  304.                 fileSize -= chunkSize;
  305.             }
  306.             while ( !error && fileSize > 0 );
  307.         }
  308.         EXCEPTION
  309.         {
  310.         }
  311.         ENDEXCEPTION
  312.     }
  313.  
  314.     return error;
  315. }
  316.  
  317. /***********************************|****************************************/
  318.  
  319. OSErr
  320. TAbstractFile::WriteTo ( short refNum )
  321. {
  322.     TAbstractFile* file = new TWrapperFile ( refNum );
  323.     THandleObjectOwner owner ( file );
  324.     return WriteTo ( *file );
  325. }
  326.  
  327. /***********************************|****************************************/
  328.  
  329. OSErr
  330. TAbstractFile::WriteTo ( Fork fork, const FSSpec& spec, OSType creator, OSType type )
  331. {
  332.     TAbstractFile* file = new TForkFile ( spec, fork, creator, type );
  333.     THandleObjectOwner owner ( file );
  334.     return WriteTo ( *file );
  335. }
  336.  
  337. /***********************************|****************************************/
  338.  
  339. OSErr
  340. TAbstractFile::WriteTo ( Fork fork, short vRefNum, long dirID, const StringPtr name, OSType creator, OSType type )
  341. {
  342.     TAbstractFile* file = new TForkFile ( vRefNum, dirID, name, fork, creator, type );
  343.     THandleObjectOwner owner ( file );
  344.     return WriteTo ( *file );
  345. }
  346.  
  347. /***********************************|****************************************/
  348.  
  349. OSErr
  350. TAbstractFile::ReadFrom ( short refNum )
  351. {
  352.     TAbstractFile* file = new TWrapperFile ( refNum );
  353.     THandleObjectOwner owner ( file );
  354.     return ReadFrom ( *file );
  355. }
  356.  
  357. /***********************************|****************************************/
  358.  
  359. OSErr
  360. TAbstractFile::ReadFrom ( Fork fork, const FSSpec& spec )
  361. {
  362.     TAbstractFile* file = new TForkFile ( spec, fork );
  363.     THandleObjectOwner owner ( file );
  364.     return file->WriteTo ( *this );
  365. }
  366.  
  367. /***********************************|****************************************/
  368.  
  369. OSErr
  370. TAbstractFile::ReadFrom ( Fork fork, short vRefNum, long dirID, const StringPtr name )
  371. {
  372.     TAbstractFile* file = new TForkFile ( vRefNum, dirID, name, fork );
  373.     THandleObjectOwner owner ( file );
  374.     return file->WriteTo ( *this );
  375. }
  376.  
  377. /***********************************|****************************************/
  378. /***********************************|****************************************/
  379.  
  380. TWrapperFile::TWrapperFile ( short refNum, Boolean adopt ):
  381.     TAbstractFile (),
  382.     fRefNum ( refNum ),
  383.     fAdopted ( adopt )
  384. {
  385. }
  386.  
  387. /***********************************|****************************************/
  388.  
  389. TWrapperFile::~TWrapperFile ()
  390. {
  391.     if ( fAdopted )
  392.         ::FSClose ( fRefNum );
  393. }
  394.  
  395. /***********************************|****************************************/
  396. /***********************************|****************************************/
  397.  
  398. TForkFile::TForkFile ( const FSSpec& spec, TAbstractFile::Fork fork, OSType creator, OSType type ):
  399.     TWrapperFile ( -1, true )
  400. {
  401.     Open ( spec, fork, creator, type );
  402. }
  403.  
  404. /***********************************|****************************************/
  405.  
  406. TForkFile::TForkFile ( short vRefNum, long dirID, const StringPtr name, TAbstractFile::Fork fork, OSType creator, OSType type ):
  407.     TWrapperFile ( -1, true )
  408. {
  409.     Open ( vRefNum, dirID, name, fork, creator, type );
  410. }
  411.  
  412. /***********************************|****************************************/
  413.  
  414. TForkFile::~TForkFile ()
  415. {
  416. }
  417.  
  418. /***********************************|****************************************/
  419.  
  420. OSErr TForkFile::Open ( short vRefNum, long dirID, const StringPtr name, TAbstractFile::Fork fork, OSType creator, OSType type )
  421. {
  422.     FSSpec spec;
  423.     spec.vRefNum = vRefNum;
  424.     spec.parID = dirID;
  425.     PLstrcpy ( spec.name, name );
  426.     return Open ( spec, fork, creator, type );
  427. }
  428.  
  429. /***********************************|****************************************/
  430.  
  431. OSErr TForkFile::Open ( const FSSpec& spec, TAbstractFile::Fork fork, OSType creator, OSType type )
  432. {
  433.     OSErr error = ::FSpCreate ( &spec, creator, type, smRoman );
  434.  
  435.     if ( error == noErr || error == dupFNErr )
  436.     {
  437.         if ( fork == TAbstractFile::kData )
  438.             ::FSpOpenDF ( &spec, fsRdWrPerm, &fRefNum );
  439.         else
  440.             ::FSpOpenRF ( &spec, fsRdWrPerm, &fRefNum );
  441.     }
  442.  
  443.     return error;
  444. }
  445.  
  446. /***********************************|****************************************/
  447.  
  448. ostream& operator << ( ostream& s, const FSSpec& spec )
  449. {
  450.     return s << "vRefNum " << spec.vRefNum << ", dirID " << spec.parID << ", \"" << spec.name << "\"";
  451. }
  452.  
  453. /***********************************|****************************************/
  454.  
  455. ostream&
  456. TAbstractFile::operator >> ( ostream& stream ) const
  457. {
  458.     return stream << "end: " << GetEnd () << ", position: " << GetPosition ();
  459. }
  460.  
  461. /***********************************|****************************************/
  462.