home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / opendc12.zip / od124os2.exe / od12osr1.exe / src / CMLkItr.cpp < prev    next >
C/C++ Source or Header  |  1997-03-21  |  13KB  |  396 lines

  1. /* @(#)Z 1.8 com/src/bento/CMLkItr.cpp, odstorage, od96os2, odos29712d 97/03/21 17:19:10 (96/10/29 09:11:21) */
  2. //====START_GENERATED_PROLOG======================================
  3. //
  4. //
  5. //   COMPONENT_NAME: odstorage
  6. //
  7. //   CLASSES: none
  8. //
  9. //   ORIGINS: 82,27
  10. //
  11. //
  12. //   (C) COPYRIGHT International Business Machines Corp. 1995,1996
  13. //   All Rights Reserved
  14. //   Licensed Materials - Property of IBM
  15. //   US Government Users Restricted Rights - Use, duplication or
  16. //   disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  17. //       
  18. //   IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
  19. //   ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  20. //   PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR
  21. //   CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
  22. //   USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
  23. //   OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
  24. //   OR PERFORMANCE OF THIS SOFTWARE.
  25. //
  26. //====END_GENERATED_PROLOG========================================
  27. //
  28.  
  29. /*
  30.         File:           CMLkItr.cpp
  31.  
  32.         Contains:       Implementation of class CMLinkIterator
  33.  
  34.         Owned by:       Craig Carper
  35.  
  36.         Copyright:      ⌐ 1994, 1995 by Apple Computer, Inc., all rights reserved.
  37.  
  38.         Change History (most recent first):
  39.  
  40.                  <8>    10/24/95        jpa             1293441: DM/VL: Bento memory reserve &
  41.                                                                         fatal container err.
  42.                  <7>      8/3/95        RR              #1257260: Collapse B classes. Remove
  43.                                                                         somInit methods. Don't call IsInitialized
  44.                                                                         or SubclassResponsibility
  45.                  <6>     5/26/95        VL              1251403: Multithreading naming support.
  46.                  <5>     5/18/95        CC              1249197: Renamed InitODLinkIterator to
  47.                                                                         InitLinkIterator.
  48.                  <4>     4/11/95        CC              1236452: InitCMLinkIterator: Added
  49.                                                                         SOM_CATCH and throw if underlying interator
  50.                                                                         can't be created.
  51.                                                                         Changed parent method calls from verbose to
  52.                                                                         simple form (parent_method).
  53.                  <3>     10/4/94        CC              1190857 - Don't call CMReleaseObject() on
  54.                                                                         _fCurrent since its added to the draft's
  55.                                                                         list of objects.
  56.                  <2>     9/23/94        VL              1182227: Includes BentoDef.h for Bento
  57.                                                                         Types.
  58.                  <1>     8/11/94        CC              first checked in
  59.  
  60.         To Do:
  61.         In Progress:
  62.  
  63. */
  64.  
  65. #define VARIABLE_MACROS
  66.  
  67. #ifdef _PLATFORM_OS2_
  68.  
  69. #include <ODTypesB.xh>
  70.  
  71. #ifndef SOM_ODLinkSpec_xh
  72.    #include <LinkSpec.xh>
  73. #endif
  74.  
  75. typedef struct CMLinkItrNode
  76. {
  77.     ODStorageUnitID   linkSUID;
  78.     CMLinkItrNode*    next;
  79. } CMLinkItrNode;
  80.  
  81. #endif /*_PLATFORM_OS2_*/
  82.  
  83. #define CMLinkIterator_Class_Source
  84. #include <CMLkItr.xih>
  85.  
  86. #ifndef __CM_API__
  87. #include <CMAPI.h>
  88. #endif
  89.  
  90. #ifndef SOM_Module_OpenDoc_StdProps_defined
  91. #include <StdProps.xh>
  92. #endif
  93.  
  94. #ifndef SOM_Module_OpenDoc_StdTypes_defined
  95. #include <StdTypes.xh>
  96. #endif
  97.  
  98. #ifndef SOM_ODObject_xh
  99. #include <ODObject.xh>
  100. #endif
  101.  
  102. #ifndef SOM_CMCtr_xh
  103. #include <CMCtr.xh>
  104. #endif
  105.  
  106. #ifndef SOM_CMDraft_xh
  107. #include <CMDraft.xh>
  108. #endif
  109.  
  110. #ifndef _DRAFPRIV_
  111. #include <DrafPriv.h>
  112. #endif
  113.  
  114. #ifndef _ODMEMORY_
  115. #include <ODMemory.h>
  116. #endif
  117.  
  118. #ifndef _ISOSTR_
  119. #include <ISOStr.h>
  120. #endif
  121.  
  122. #ifndef _BENTODEF_
  123. #include <BentoDef.h>
  124. #endif
  125.  
  126. #ifndef _SESSHDR_
  127. #include "SessHdr.h"
  128. #endif
  129.  
  130. #pragma segment CMLinkIterator
  131.  
  132. //==============================================================================
  133. // CMLinkIterator
  134. //==============================================================================
  135.  
  136. //------------------------------------------------------------------------------
  137. // CMLinkIterator: somUninit
  138. //------------------------------------------------------------------------------
  139.  
  140. SOM_Scope void  SOMLINK CMLinkIteratorsomUninit(CMLinkIterator *somSelf)
  141. {
  142.     CMLinkIteratorData *somThis = CMLinkIteratorGetData(somSelf);
  143.     CMLinkIteratorMethodDebug("CMLinkIterator","somUninit");
  144.  
  145.         if (_fBuffer != kODNULL)
  146.                 ODDisposePtr(_fBuffer);
  147.  
  148.     parent_somUninit(somSelf);
  149. }
  150.  
  151. //------------------------------------------------------------------------------
  152. // CMLinkIterator: InitCMLinkIterator
  153. //------------------------------------------------------------------------------
  154.  
  155. SOM_Scope void  SOMLINK CMLinkIteratorInitCMLinkIterator(CMLinkIterator *somSelf, Environment *ev,
  156.                 CMDraft* draft)
  157. {
  158.     CMLinkIteratorData *somThis = CMLinkIteratorGetData(somSelf);
  159.     CMLinkIteratorMethodDebug("CMLinkIterator","InitCMLinkIterator");
  160.  
  161. #ifdef _NATIVE_EXCEPTIONS_
  162. //      Use C++ native exception
  163.         SOM_TRY
  164. #else
  165.         SOM_CATCH return;
  166. #endif
  167.  
  168.         /* Moved from somInit. SOM itself sets fields to zero
  169.         _fDraft = kODNULL;
  170.         _fCurrent = kODNULL;
  171.         _fContainer = kODNULL;
  172.         _fProperty = kODNULL;
  173.         _fType = kODNULL;
  174.         _fBuffer = kODNULL;
  175.         _fSize = 0;
  176.         */
  177.  
  178.         somSelf->InitLinkIterator(ev);
  179.  
  180.         _fDraft = draft;
  181.         _fContainer = draft->GetCMContainer(ev);
  182.  
  183.         ODSessionMustHaveCMAllocReserve(_fContainer);
  184.  
  185.         _fProperty = CMRegisterProperty(_fContainer, kODPropStorageUnitType);
  186.         _fType = CMRegisterType(_fContainer, kODISOStr);
  187.  
  188.         ODSessionRestoreCMAllocReserve(_fContainer);
  189.  
  190.         _fSize = ODISOStrLength(kODLink) + 1;
  191.         _fBuffer = ODNewPtr(_fSize, kDefaultHeapID);
  192.  
  193.         THROW_IF_NULL(_fBuffer);
  194.  
  195. #ifdef _NATIVE_EXCEPTIONS_
  196. //      Use C++ native exception
  197.         SOM_CATCH_ALL
  198.         SOM_ENDTRY
  199. #endif
  200. }
  201.  
  202. //------------------------------------------------------------------------------
  203. // CMLinkIterator: IsNotComplete
  204. //------------------------------------------------------------------------------
  205.  
  206. SOM_Scope ODBoolean  SOMLINK CMLinkIteratorIsNotComplete(CMLinkIterator *somSelf, Environment *ev)
  207. {
  208.     CMLinkIteratorData *somThis = CMLinkIteratorGetData(somSelf);
  209.     CMLinkIteratorMethodDebug("CMLinkIterator","IsNotComplete");
  210.  
  211. #ifdef _PLATFORM_OS2_
  212.         if (_fCurrentNode != (CMLinkItrNode*)kODNULL)
  213.         {
  214.            return kODTrue;
  215.         }
  216.         else
  217.         {
  218.            return kODFalse;
  219.         }
  220. #else /*_PLATFORM_OS2_*/
  221.         return ( _fLink != kODNULL );
  222. #endif /* _PLATFORM_OS2_ */
  223. }
  224.  
  225. //------------------------------------------------------------------------------
  226. // CMLinkIterator: First
  227. //------------------------------------------------------------------------------
  228.  
  229. SOM_Scope ODLink*  SOMLINK CMLinkIteratorFirst(CMLinkIterator *somSelf, Environment *ev)
  230. {
  231.     /* CMLinkIteratorData *somThis = CMLinkIteratorGetData(somSelf); */
  232.     CMLinkIteratorMethodDebug("CMLinkIterator","First");
  233.  
  234. #ifdef _NATIVE_EXCEPTIONS_
  235. //      Use C++ native exception
  236.         ODLink *retLink = kODNULL;
  237.  
  238.         SOM_TRY
  239.  #ifdef _PLATFORM_OS2_
  240.         retLink = somSelf->AcquireFirst(ev);
  241. #else /*_PLATFORM_OS2_*/
  242.         retLink = somSelf->Next(ev);
  243. #endif /* _PLATFORM_OS2_ */
  244.  
  245.         SOM_CATCH_ALL
  246.         SOM_ENDTRY
  247.         return retLink;
  248. #else
  249.         SOM_CATCH return kODNULL;
  250.         return somSelf->Next(ev);
  251. #endif
  252.  
  253. }
  254.  
  255. //------------------------------------------------------------------------------
  256. // CMLinkIterator: Next
  257. //------------------------------------------------------------------------------
  258.  
  259. SOM_Scope ODLink*  SOMLINK CMLinkIteratorNext(CMLinkIterator *somSelf, Environment *ev)
  260. {
  261.     CMLinkIteratorData *somThis = CMLinkIteratorGetData(somSelf);
  262.     CMLinkIteratorMethodDebug("CMLinkIterator","Next");
  263.  
  264.         CMObject        object = _fCurrent;
  265.         CMObject        oldObject = object;
  266.  
  267. #ifdef _PLATFORM_OS2_
  268.         return somSelf->AcquireNext(ev);
  269. #endif
  270.  
  271. #ifdef _NATIVE_EXCEPTIONS_
  272. //      Use C++ native exception
  273.         ODLink          *retLink = kODNULL;
  274.  
  275.         SOM_TRY
  276. #else
  277.         SOM_CATCH return kODNULL;
  278. #endif
  279.  
  280.         _fLink = kODNULL;
  281.         do {
  282.  
  283.                 ODSessionMustHaveCMAllocReserve(_fContainer); // safest once per loop
  284.  
  285.                 object = CMGetNextObjectWithProperty(_fContainer, object, _fProperty);
  286.                 if (object != kODNULL) {
  287.                         CMValue value = CMUseValue(object, _fProperty, _fType);
  288.                         if (value != kODNULL) {
  289.                                 if ((CMReadValueData(value, _fBuffer, 0, _fSize) == _fSize) &&
  290.                                         (ODISOStrCompare((const ODISOStr) _fBuffer, (const ODISOStr) kODLink) == 0)) {
  291.                                         _fCurrent = object;
  292.                                         ODStorageUnitID id = _fDraft->GetIDList(ev)->Add(_fCurrent);
  293.                                         _fLink = _fDraft->AcquireLink(ev, id, kODNULL);
  294.                                 }
  295.                                 CMReleaseValue(value);
  296.                         }
  297.                         if (object != _fCurrent)
  298.                                 CMReleaseObject(object);        /* we did not use it */
  299.                 }
  300.         } while ((object != kODNULL) && (_fCurrent == oldObject));
  301.  
  302.         ODSessionRestoreCMAllocReserve(_fContainer);
  303.  
  304. #ifdef _NATIVE_EXCEPTIONS_
  305. //      Use C++ native exception
  306.         retLink = _fLink;
  307.  
  308.         SOM_CATCH_ALL
  309.         SOM_ENDTRY
  310.         return retLink;
  311. #else
  312.         return _fLink;
  313. #endif
  314. }
  315. #ifdef _PLATFORM_OS2_
  316. /*
  317.  *=============================================================================
  318. // CMLinkIterator: AcquireFirst
  319.  *=============================================================================
  320.  */
  321. SOM_Scope ODLink*
  322. SOMLINK CMLinkIteratorAcquireFirst(CMLinkIterator *somSelf,
  323.                                    Environment *ev)
  324. {
  325.     CMLinkIteratorData *somThis = CMLinkIteratorGetData(somSelf);
  326.     CMLinkIteratorMethodDebug("CMLinkIterator","First");
  327.  
  328.     if ((_fCurrentNode = _fCMLinkItrList) != (CMLinkItrNode*)kODNULL)
  329.     {
  330.       ODLink* link =
  331.                   _fDraft->AcquireLink(ev, _fCurrentNode->linkSUID,(ODLinkSpec*)kODNULL);
  332.       return link;
  333.     }
  334.     else
  335.     {
  336.       return kODNULL;
  337.     }
  338. }
  339.  
  340. /*
  341.  *=============================================================================
  342. // CMLinkIterator: AcquireNext
  343.  *=============================================================================
  344.  */
  345.  
  346. SOM_Scope ODLink*
  347. SOMLINK CMLinkIteratorAcquireNext(CMLinkIterator *somSelf,
  348.                                   Environment *ev)
  349. {
  350.     CMLinkIteratorData *somThis = CMLinkIteratorGetData(somSelf);
  351.     CMLinkIteratorMethodDebug("CMLinkIterator","Next");
  352.  
  353.     if (_fCurrentNode != (CMLinkItrNode*)kODNULL)
  354.     {
  355.       _fCurrentNode = _fCurrentNode->next;
  356.       if (_fCurrentNode != (CMLinkItrNode*)kODNULL)
  357.       {
  358.         ODLink* link =
  359.                     _fDraft->AcquireLink(ev, _fCurrentNode->linkSUID,(ODLinkSpec*)kODNULL);
  360.         return link;
  361.       }
  362.     }
  363.     return kODNULL;
  364. }
  365.  
  366. /*
  367.  *=============================================================================
  368. // CMLinkIterator: Add
  369.  *=============================================================================
  370.  */
  371.  
  372. SOM_Scope void
  373. SOMLINK CMLinkIteratorAdd(CMLinkIterator *somSelf,
  374.                          Environment *ev,
  375.                          ODStorageUnitID linkSUID)
  376. {
  377.     CMLinkIteratorData *somThis = CMLinkIteratorGetData(somSelf);
  378.     CMLinkIteratorMethodDebug("CMLinkIterator","Add");
  379.  
  380.     CMLinkItrNode* entry = new CMLinkItrNode;
  381.     THROW_IF_NULL(entry);
  382.  
  383.     entry->linkSUID = linkSUID;
  384.     if (_fCMLinkItrList != (CMLinkItrNode*)kODNULL)
  385.     {
  386.       entry->next = _fCMLinkItrList;
  387.     }
  388.     else
  389.     {
  390.       entry->next = (CMLinkItrNode*)kODNULL;
  391.     }
  392.     _fCMLinkItrList = entry;
  393. }
  394.  
  395. #endif // _PLATFORM_OS2_
  396.