home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 February: Technology Seed / Mac Tech Seed Feb '97.toast / ODF Release 3 / Developer University / DU Projects / DataSave / Sources / Content.cpp < prev    next >
Encoding:
Text File  |  1996-12-11  |  4.3 KB  |  160 lines  |  [TEXT/CWIE]

  1. //    Release Version:    $ ODF 3 $
  2. //    Copyright:            (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
  3.  
  4. //========================================================================================
  5. #include "DataSave.hpp"
  6.  
  7. #ifndef CONTENT_H
  8. #include "Content.h"
  9. #endif
  10.  
  11. #ifndef PART_H
  12. #include "Part.h"
  13. #endif
  14.  
  15. #ifndef PIZZA_H
  16. #include "Pizza.h"            //  CPizza
  17. #endif
  18.  
  19. // ----- Framework Layer -----
  20. #ifndef FWEVENTU_H
  21. #include "FWEventU.h"        // FW_IsCommandKeyPressed
  22. #endif
  23.  
  24. #ifndef FWKIND_H            // FW_CKind
  25. #include "FWKind.h"
  26. #endif
  27.  
  28. //--- OpenDoc ------------------------------------------------------------------
  29. #ifndef SOM_Module_OpenDoc_StdProps_defined
  30. #include <StdProps.xh>        // kODPropContents
  31. #endif
  32.  
  33. //========================================================================================
  34. #ifdef FW_BUILD_MAC
  35. #pragma segment DataSave
  36. #endif
  37.  
  38. //========================================================================================
  39. // Template instantiation
  40. #include "FWTColl.tpp"
  41.  
  42. FW_DEFINE_AUTO_TEMPLATE(FW_TOrderedCollection, CPizzaCollection)
  43. FW_DEFINE_AUTO_TEMPLATE(FW_TOrderedCollectionIterator, CPizzaCollectionIterator)
  44.  
  45. #ifdef FW_USE_TEMPLATE_PRAGMAS
  46.     #pragma template_access public
  47.     #pragma template FW_TOrderedCollection<CPizzaCollection>
  48.     #pragma template FW_TOrderedCollectionIterator<CPizzaCollectionIterator>
  49. #else
  50.     template class FW_TOrderedCollection<CPizzaCollection>;
  51.     template class FW_TOrderedCollectionIterator<CPizzaCollectionIterator>;
  52. #endif
  53.  
  54. FW_DEFINE_AUTO(CDataSaveContent)
  55.  
  56. //----------------------------------------------------------------------------------------
  57. CDataSaveContent::CDataSaveContent(Environment* ev, CDataSavePart* part)
  58.  :    FW_CContent(ev, part),
  59.     fPart(part),
  60.     fNumPizzas(0),
  61.     fPizzaList(NULL)
  62. {
  63.     fPizzaList = FW_NEW(CPizzaCollection, ());
  64.     FW_END_CONSTRUCTOR
  65. }
  66.  
  67. //----------------------------------------------------------------------------------------
  68. CDataSaveContent::~CDataSaveContent()
  69. {
  70.     FW_START_DESTRUCTOR
  71.     CPizza* pizza = NULL;
  72.     while ((pizza = fPizzaList->First()) != NULL) {
  73.         fPizzaList->Remove(pizza);
  74.         delete pizza;
  75.         }
  76.     delete fPizzaList;
  77. }
  78.  
  79. //----------------------------------------------------------------------------------------
  80. CPizzaCollection*
  81. CDataSaveContent::MyGetPizzaList()
  82. {
  83.     return fPizzaList;
  84. }
  85.  
  86. //----------------------------------------------------------------------------------------
  87. void
  88. CDataSaveContent::MyAddPizza(Environment* ev, CPizza* pizza)
  89. {
  90.     fNumPizzas++;
  91.     fPizzaList->AddLast(pizza);
  92.     fPart->MyPartChanged(ev, pizza->GetBounds());
  93. }
  94.  
  95. //----------------------------------------------------------------------------------------
  96. void
  97. CDataSaveContent::MyRemoveLastPizza(Environment* ev, CPizza* pizza)
  98. {
  99.     fNumPizzas--;
  100.     fPizzaList->RemoveLast();
  101.     fPart->MyPartChanged(ev, pizza->GetBounds());
  102. }
  103.  
  104. //----------------------------------------------------------------------------------------
  105. void
  106. CDataSaveContent::ExternalizeKind(Environment* ev,
  107.                                 ODStorageUnit* storageUnit,
  108.                                 FW_CKind* kind,
  109.                                 FW_StorageKinds storageKind,
  110.                                 FW_CPromise* promise,
  111.                                 FW_CCloneInfo* cloneInfo)
  112. {
  113.     FW_UNUSED(cloneInfo);
  114.     FW_UNUSED(storageKind);
  115.     FW_UNUSED(promise);
  116.     FW_PStorageUnitSink suSink(ev, storageUnit, kODPropContents, kind->GetType(ev));
  117.     FW_CWritableStream stream(suSink);
  118.  
  119.     // write number
  120.     stream << fNumPizzas;
  121.     
  122.     // write each item
  123.     CPizzaCollectionIterator iter(fPizzaList);
  124.     CPizza* pizza = NULL;
  125.     for (pizza = iter.First(); iter.IsNotComplete(); pizza = iter.Next())
  126.         FW_WRITE_DYNAMIC_OBJECT(stream, pizza, CPizza);
  127.  
  128. #ifdef FW_BUILD_MAC
  129.     if (::FW_IsCommandKeyPressed()) {
  130.         FW_LOG_MESSAGE("Number of pizzas =");
  131.         Str255 numString;
  132.         ::NumToString(fNumPizzas, numString);
  133.         DebugStr(numString);
  134.     }
  135. #endif
  136. }
  137.  
  138. //----------------------------------------------------------------------------------------
  139. FW_Boolean 
  140. CDataSaveContent::InternalizeKind(Environment* ev,
  141.                                     ODStorageUnit* storageUnit, 
  142.                                     FW_CKind* kind,
  143.                                     FW_StorageKinds storageKind,
  144.                                     FW_CCloneInfo* cloneInfo)
  145. {
  146.     FW_UNUSED(cloneInfo);
  147.     FW_UNUSED(storageKind);
  148.     FW_PStorageUnitSink suSink(ev, storageUnit, kODPropContents, kind->GetType(ev));
  149.     FW_CReadableStream stream(suSink);    
  150.     // read number
  151.     stream >> fNumPizzas;
  152.     // read items; make list
  153.     CPizza* pizza = NULL;
  154.     for (long count = 0; count < fNumPizzas; count++) {
  155.         FW_READ_DYNAMIC_OBJECT(stream, &pizza, CPizza);
  156.         fPizzaList->AddLast(pizza);
  157.         }
  158.     return true;
  159. }
  160.