home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 July: Mac OS SDK / Dev.CD Jul 96 SDK / Dev.CD Jul 96 SDK1.toast / Development Kits (Disc 1) / OpenDoc / OpenDoc Development / Debugging Support / OpenDoc Source Code / Storage / Bento / CMLkItr.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-22  |  5.7 KB  |  213 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        CMLkItr.cpp
  3.  
  4.     Contains:    Implementation of class CMLinkIterator
  5.  
  6.     Owned by:    Craig Carper
  7.  
  8.     Copyright:    © 1994, 1995 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.          <8>    10/24/95    jpa        1293441: DM/VL: Bento memory reserve &
  13.                                     fatal container err.
  14.          <7>      8/3/95    RR        #1257260: Collapse B classes. Remove
  15.                                     somInit methods. Don't call IsInitialized
  16.                                     or SubclassResponsibility
  17.          <6>     5/26/95    VL        1251403: Multithreading naming support.
  18.          <5>     5/18/95    CC        1249197: Renamed InitODLinkIterator to
  19.                                     InitLinkIterator.
  20.          <4>     4/11/95    CC        1236452: InitCMLinkIterator: Added
  21.                                     SOM_CATCH and throw if underlying interator
  22.                                     can't be created.
  23.                                     Changed parent method calls from verbose to
  24.                                     simple form (parent_method).
  25.          <3>     10/4/94    CC        1190857 - Don't call CMReleaseObject() on
  26.                                     _fCurrent since its added to the draft's
  27.                                     list of objects.
  28.          <2>     9/23/94    VL        1182227: Includes BentoDef.h for Bento
  29.                                     Types.
  30.          <1>     8/11/94    CC        first checked in
  31.  
  32.     To Do:
  33.     In Progress:
  34.         
  35. */
  36.  
  37. #define VARIABLE_MACROS
  38.  
  39. #define CMLinkIterator_Class_Source
  40. #include <CMLkItr.xih>
  41.  
  42. #ifndef __CM_API__
  43. #include <CMAPI.h>
  44. #endif
  45.  
  46. #ifndef SOM_Module_OpenDoc_StdProps_defined
  47. #include <StdProps.xh>
  48. #endif
  49.  
  50. #ifndef SOM_Module_OpenDoc_StdTypes_defined
  51. #include <StdTypes.xh>
  52. #endif
  53.  
  54. #ifndef SOM_ODObject_xh
  55. #include <ODObject.xh>
  56. #endif
  57.  
  58. #ifndef SOM_CMCtr_xh
  59. #include <CMCtr.xh>
  60. #endif
  61.  
  62. #ifndef SOM_CMDraft_xh
  63. #include <CMDraft.xh>
  64. #endif
  65.  
  66. #ifndef _DRAFPRIV_
  67. #include <DrafPriv.h>
  68. #endif
  69.  
  70. #ifndef _ODMEMORY_
  71. #include <ODMemory.h>
  72. #endif
  73.  
  74. #ifndef _ISOSTR_
  75. #include <ISOStr.h>
  76. #endif
  77.  
  78. #ifndef _BENTODEF_
  79. #include <BentoDef.h>
  80. #endif
  81.  
  82. #ifndef _SESSHDR_
  83. #include "SessHdr.h"
  84. #endif
  85.  
  86. #pragma segment CMLinkIterator
  87.  
  88. //==============================================================================
  89. // CMLinkIterator
  90. //==============================================================================
  91.  
  92. //------------------------------------------------------------------------------
  93. // CMLinkIterator: somUninit
  94. //------------------------------------------------------------------------------
  95.  
  96. SOM_Scope void  SOMLINK CMLinkIteratorsomUninit(CMLinkIterator *somSelf)
  97. {
  98.     CMLinkIteratorData *somThis = CMLinkIteratorGetData(somSelf);
  99.     CMLinkIteratorMethodDebug("CMLinkIterator","somUninit");
  100.  
  101.     if (_fBuffer != kODNULL)
  102.         ODDisposePtr(_fBuffer);
  103.  
  104.     parent_somUninit(somSelf);
  105. }
  106.  
  107. //------------------------------------------------------------------------------
  108. // CMLinkIterator: InitCMLinkIterator
  109. //------------------------------------------------------------------------------
  110.  
  111. SOM_Scope void  SOMLINK CMLinkIteratorInitCMLinkIterator(CMLinkIterator *somSelf, Environment *ev,
  112.         CMDraft* draft)
  113. {
  114.     CMLinkIteratorData *somThis = CMLinkIteratorGetData(somSelf);
  115.     CMLinkIteratorMethodDebug("CMLinkIterator","InitCMLinkIterator");
  116.  
  117.     SOM_CATCH return;
  118.     
  119.     /* Moved from somInit. SOM itself sets fields to zero
  120.     _fDraft = kODNULL;
  121.     _fCurrent = kODNULL;
  122.     _fContainer = kODNULL;
  123.     _fProperty = kODNULL;
  124.     _fType = kODNULL;
  125.     _fBuffer = kODNULL;
  126.     _fSize = 0;
  127.     */
  128.     
  129.     somSelf->InitLinkIterator(ev);
  130.  
  131.     _fDraft = draft;
  132.     _fContainer = draft->GetCMContainer(ev);
  133.  
  134.     ODSessionMustHaveCMAllocReserve(_fContainer);
  135.     
  136.     _fProperty = CMRegisterProperty(_fContainer, kODPropStorageUnitType);
  137.     _fType = CMRegisterType(_fContainer, kODISOStr);
  138.  
  139.     ODSessionRestoreCMAllocReserve(_fContainer);
  140.  
  141.     _fSize = ODISOStrLength(kODLink) + 1;
  142.     _fBuffer = ODNewPtr(_fSize, kDefaultHeapID);
  143.  
  144.     THROW_IF_NULL(_fBuffer);
  145. }
  146.  
  147. //------------------------------------------------------------------------------
  148. // CMLinkIterator: IsNotComplete
  149. //------------------------------------------------------------------------------
  150.  
  151. SOM_Scope ODBoolean  SOMLINK CMLinkIteratorIsNotComplete(CMLinkIterator *somSelf, Environment *ev)
  152. {
  153.     CMLinkIteratorData *somThis = CMLinkIteratorGetData(somSelf);
  154.     CMLinkIteratorMethodDebug("CMLinkIterator","IsNotComplete");
  155.  
  156.     return ( _fLink != kODNULL );
  157. }
  158.  
  159. //------------------------------------------------------------------------------
  160. // CMLinkIterator: First
  161. //------------------------------------------------------------------------------
  162.  
  163. SOM_Scope ODLink*  SOMLINK CMLinkIteratorFirst(CMLinkIterator *somSelf, Environment *ev)
  164. {
  165.     /* CMLinkIteratorData *somThis = CMLinkIteratorGetData(somSelf); */
  166.     CMLinkIteratorMethodDebug("CMLinkIterator","First");
  167.  
  168.     SOM_CATCH return kODNULL;
  169.  
  170.     return somSelf->Next(ev);
  171. }
  172.  
  173. //------------------------------------------------------------------------------
  174. // CMLinkIterator: Next
  175. //------------------------------------------------------------------------------
  176.  
  177. SOM_Scope ODLink*  SOMLINK CMLinkIteratorNext(CMLinkIterator *somSelf, Environment *ev)
  178. {
  179.     CMLinkIteratorData *somThis = CMLinkIteratorGetData(somSelf);
  180.     CMLinkIteratorMethodDebug("CMLinkIterator","Next");
  181.  
  182.     CMObject    object = _fCurrent;
  183.     CMObject    oldObject = object;
  184.  
  185.     SOM_CATCH return kODNULL;
  186.  
  187.     _fLink = kODNULL;
  188.     do {    
  189.      
  190.         ODSessionMustHaveCMAllocReserve(_fContainer); // safest once per loop
  191.         
  192.         object = CMGetNextObjectWithProperty(_fContainer, object, _fProperty);
  193.         if (object != kODNULL) {
  194.             CMValue value = CMUseValue(object, _fProperty, _fType);            
  195.             if (value != kODNULL) {
  196.                 if ((CMReadValueData(value, _fBuffer, 0, _fSize) == _fSize) &&
  197.                     (ODISOStrCompare((const ODISOStr) _fBuffer, (const ODISOStr) kODLink) == 0)) {
  198.                     _fCurrent = object;
  199.                     ODStorageUnitID id = _fDraft->GetIDList(ev)->Add(_fCurrent);
  200.                     _fLink = _fDraft->AcquireLink(ev, id, kODNULL);
  201.                 }
  202.                 CMReleaseValue(value);
  203.             }
  204.             if (object != _fCurrent)
  205.                 CMReleaseObject(object);    /* we did not use it */
  206.         }
  207.     } while ((object != kODNULL) && (_fCurrent == oldObject));
  208.  
  209.     ODSessionRestoreCMAllocReserve(_fContainer);
  210.     
  211.     return _fLink;
  212. }
  213.