home *** CD-ROM | disk | FTP | other *** search
/ PC Media 7 / PC MEDIA CD07.iso / share / prog / cm / cmobject.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-06  |  2.7 KB  |  88 lines

  1. // CmObject.cpp
  2. // -----------------------------------------------------------------
  3. // Compendium - C++ Container Class Library
  4. // Copyright (C) 1992-1994, Glenn M. Poorman, All rights reserved
  5. // -----------------------------------------------------------------
  6. // Abstract object implementation.
  7. // -----------------------------------------------------------------
  8.  
  9. #include <cm/include/cmobject.h>
  10. #include <cm/include/cmobjref.h>
  11. #include <cm/include/cmreserv.h>
  12.  
  13.  
  14. // Shorthand definitions.
  15. #define OBJ CmObjectReference::OBJECTS
  16. #define KEY CmObjectReference::KEYS
  17.  
  18.  
  19. // "writeObject" writes this object to the specified reserve file.
  20. //
  21. Bool CmObject::writeObject(CmReserveFile& file)
  22. {
  23.   if (!file.write(this->isA())) return FALSE;  // Write class name.
  24.  
  25.   int key, flag = CmReserve::OBJECT;
  26.   if (CmReserve::maintainReferences())
  27.   {
  28.     key  = CmReserve::getFromTable(this);      // See if object is in table.
  29.     flag = (key >= 0) ? CmReserve::REFERENCE : CmReserve::OBJECT;
  30.   }
  31.   Bool success = file.write(flag);             // Write reference flag.
  32.  
  33.   if (success && flag == CmReserve::REFERENCE) // If object was written.
  34.     success = file.write(key);                 // Write table key.
  35.   else if (success)                            // Object was not written.
  36.   {
  37.     success = this->write(file);               // Write object.
  38.     if (CmReserve::maintainReferences() && success)
  39.       success = CmReserve::addToTable(this, OBJ);
  40.   }
  41.   return success;
  42. }
  43.  
  44.  
  45. // "readObject" reads an object from the specified reserve file.
  46. //
  47. CmObject* CmObject::readObject(CmReserveFile& file)
  48. {
  49.   char *letters = file.read();                 // Read class name.
  50.   if (!letters) return NULL;
  51.  
  52.   int flag;
  53.   if (!file.read(flag))                        // Read reference flag.
  54.   {
  55.     delete[] letters;
  56.     return NULL;
  57.   }
  58.  
  59.   CmObject *pObj = NULL;
  60.   if (flag == CmReserve::REFERENCE)            // If object was reference,
  61.   {
  62.     int key;
  63.     if (file.read(key))                        // Read table index.
  64.       pObj = CmReserve::getFromTable(key);     // Get pointer from table.
  65.   }
  66.   else
  67.   {
  68.     CmObject *temp = CmReserve::getClassRegister(letters); // Get register.
  69.     if (temp)
  70.     {
  71.       pObj = temp->newCopy();                  // Clone register.
  72.       if (pObj)
  73.       {
  74.         Bool success = pObj->read(file);       // Read object data.
  75.         if (!success)
  76.         {
  77.           delete pObj;
  78.           pObj = NULL;
  79.         }
  80.         else
  81.           CmReserve::addToTable(pObj, KEY);    // Add to reference table.
  82.       }
  83.     }
  84.   }
  85.   delete[] letters;
  86.   return pObj;                                 // Return new object.
  87. }
  88.