home *** CD-ROM | disk | FTP | other *** search
- /*
- File: CMLkSItr.cpp
-
- Contains: Implementation of class CMLinkSourceIterator
-
- Owned by: Craig Carper
-
- Copyright: © 1994, 1995 by Apple Computer, Inc., all rights reserved.
-
- Change History (most recent first):
-
- <2> 5/24/96 jpa 1246074: SOM_CATCH --> SOM_TRY..SOM_ENDTRY
- <8> 10/24/95 jpa 1293441: DM/VL: Bento memory reserve &
- fatal container err.
- <7> 8/3/95 RR #1257260: Collapse B classes. Remove
- somInit methods. Don't call IsInitialized
- or SubclassResponsibility
- <6> 5/26/95 VL 1251403: Multithreading naming support.
- <5> 5/18/95 CC 1249197: Renamed InitODLinkSourceIterator
- to InitLinkSourceIterator.
- <4> 4/11/95 CC 1236452: InitCMLinkSourceIterator: Added
- SOM_CATCH and throw if underlying interator
- can't be created.
- Changed parent method calls from verbose to
- simple form (parent_method).
- <3> 10/4/94 CC 1190857 - Don't call CMReleaseObject() on
- _fCurrent since its added to the draft's
- list of objects.
- <2> 9/23/94 VL 1182227: Includes BentoDef.h for Bento
- Types.
- <1> 8/11/94 CC first checked in
-
- To Do:
- In Progress:
-
- */
-
- #define VARIABLE_MACROS
-
- #define CMLinkSourceIterator_Class_Source
- #include <CMLkSItr.xih>
-
- #ifndef __CM_API__
- #include <CMAPI.h>
- #endif
-
- #ifndef SOM_Module_OpenDoc_StdProps_defined
- #include <StdProps.xh>
- #endif
-
- #ifndef SOM_Module_OpenDoc_StdTypes_defined
- #include <StdTypes.xh>
- #endif
-
- #ifndef SOM_ODObject_xh
- #include <ODObject.xh>
- #endif
-
- #ifndef SOM_CMCtr_xh
- #include <CMCtr.xh>
- #endif
-
- #ifndef SOM_CMDraft_xh
- #include <CMDraft.xh>
- #endif
-
- #ifndef _DRAFPRIV_
- #include <DrafPriv.h>
- #endif
-
- #ifndef _ODMEMORY_
- #include <ODMemory.h>
- #endif
-
- #ifndef _ISOSTR_
- #include <ISOStr.h>
- #endif
-
- #ifndef _BENTODEF_
- #include <BentoDef.h>
- #endif
-
- #ifndef _SESSHDR_
- #include "SessHdr.h"
- #endif
-
- #pragma segment CMLinkSourceIterator
-
- //==============================================================================
- // CMLinkSourceIterator
- //==============================================================================
-
- //------------------------------------------------------------------------------
- // CMLinkSourceIterator: somUninit
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMLinkSourceIteratorsomUninit(CMLinkSourceIterator *somSelf)
- {
- CMLinkSourceIteratorData *somThis = CMLinkSourceIteratorGetData(somSelf);
- CMLinkSourceIteratorMethodDebug("CMLinkSourceIterator","somUninit");
-
- if (_fBuffer != kODNULL)
- ODDisposePtr(_fBuffer);
-
- parent_somUninit(somSelf);
- }
-
- //------------------------------------------------------------------------------
- // CMLinkSourceIterator: InitCMLinkSourceIterator
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMLinkSourceIteratorInitCMLinkSourceIterator(CMLinkSourceIterator *somSelf, Environment *ev,
- CMDraft* draft)
- {
- CMLinkSourceIteratorData *somThis = CMLinkSourceIteratorGetData(somSelf);
- CMLinkSourceIteratorMethodDebug("CMLinkSourceIterator","InitCMLinkSourceIterator");
-
- SOM_TRY
-
- /* Moved from somInit. SOM itself sets fields to zero
- _fDraft = kODNULL;
- _fCurrent = kODNULL;
- _fContainer = kODNULL;
- _fProperty = kODNULL;
- _fType = kODNULL;
- _fBuffer = kODNULL;
- _fSize = 0;
- */
-
- somSelf->InitLinkSourceIterator(ev);
-
- _fDraft = draft;
- _fContainer = draft->GetCMContainer(ev);
-
- ODSessionMustHaveCMAllocReserve(_fContainer);
-
- _fProperty = CMRegisterProperty(_fContainer, kODPropStorageUnitType);
- _fType = CMRegisterType(_fContainer, kODISOStr);
-
- ODSessionRestoreCMAllocReserve(_fContainer);
-
- _fSize = ODISOStrLength(kODLinkSource) + 1;
- _fBuffer = ODNewPtr(_fSize, kDefaultHeapID);
-
- THROW_IF_NULL(_fBuffer);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMLinkSourceIterator: IsNotComplete
- //------------------------------------------------------------------------------
-
- SOM_Scope ODBoolean SOMLINK CMLinkSourceIteratorIsNotComplete(CMLinkSourceIterator *somSelf, Environment *ev)
- {
- CMLinkSourceIteratorData *somThis = CMLinkSourceIteratorGetData(somSelf);
- CMLinkSourceIteratorMethodDebug("CMLinkSourceIterator","IsNotComplete");
-
- return ( _fLinkSource != kODNULL );
- }
-
- //------------------------------------------------------------------------------
- // CMLinkSourceIterator: First
- //------------------------------------------------------------------------------
-
- SOM_Scope ODLinkSource* SOMLINK CMLinkSourceIteratorFirst(CMLinkSourceIterator *somSelf, Environment *ev)
- {
- /* CMLinkSourceIteratorData *somThis = CMLinkSourceIteratorGetData(somSelf); */
- CMLinkSourceIteratorMethodDebug("CMLinkSourceIterator","First");
-
- SOM_TRY
-
- return somSelf->Next(ev);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODNULL;
- }
-
- //------------------------------------------------------------------------------
- // CMLinkSourceIterator: Next
- //------------------------------------------------------------------------------
-
- SOM_Scope ODLinkSource* SOMLINK CMLinkSourceIteratorNext(CMLinkSourceIterator *somSelf, Environment *ev)
- {
- CMLinkSourceIteratorData *somThis = CMLinkSourceIteratorGetData(somSelf);
- CMLinkSourceIteratorMethodDebug("CMLinkSourceIterator","Next");
-
- CMObject object = _fCurrent;
- CMObject oldObject = object;
-
- SOM_TRY
-
- _fLinkSource = kODNULL;
- do {
- ODSessionMustHaveCMAllocReserve(_fContainer); // safest once per loop
-
- object = CMGetNextObjectWithProperty(_fContainer, object, _fProperty);
- if (object != kODNULL) {
- CMValue value = CMUseValue(object, _fProperty, _fType);
- if (value != kODNULL) {
- if ((CMReadValueData(value, _fBuffer, 0, _fSize) == _fSize) &&
- (ODISOStrCompare((const ODISOStr) _fBuffer, (const ODISOStr) kODLinkSource) == 0)) {
- _fCurrent = object;
- ODStorageUnitID id = _fDraft->GetIDList(ev)->Add(_fCurrent);
- _fLinkSource = _fDraft->AcquireLinkSource(ev, id);
- }
- CMReleaseValue(value);
- }
- if (object != _fCurrent)
- CMReleaseObject(object); /* we did not use it */
- }
- } while ((object != kODNULL) && (_fCurrent == oldObject));
-
- ODSessionRestoreCMAllocReserve(_fContainer);
-
- return _fLinkSource;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODNULL;
- }
-