home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / opendc12.zip / od124os2.exe / od12osr1.exe / src / LinkB.cpp < prev    next >
Text File  |  1997-03-21  |  46KB  |  1,332 lines

  1. /* @(#) 1.17 com/src/storage/LinkB.cpp, oddataxfer, od96os2, odos29712d 3/7/97 11:16:30 [3/21/97 17:18:41] */
  2. //====START_GENERATED_PROLOG======================================
  3. //
  4. //
  5. //   COMPONENT_NAME: oddataxfer
  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:           LinkB.cpp
  31.  
  32.         Contains:       Implementation of ODBaseLink class
  33.  
  34.         Owned by:       Craig Carper
  35.  
  36.         Copyright:      ⌐ 1993 - 1995 by Apple Computer, Inc., all rights reserved.
  37.  
  38.         Change History (most recent first):
  39.  
  40.                 <35>     8/19/96        DJ              24768: Fix helps on Link Destination Info Dlg
  41.                 <34>     6/27/96        DJ              23569: Enable compile on AIX platform
  42.                 <33>     10/8/95        TJ              Fixes Recomended by Refball
  43.                 <32>     10/3/95        TJ              Added Includes so it compiles
  44.                 <31>     10/3/95        TJ              Changes done by RefBall Team
  45.                 <30>      9/8/95        Té              1281096 FB2:Many constants in ODTypesB
  46.                                                                         without kOD prefix!
  47.                 <29>      9/1/95        CC              1278590: GetContentStorageUnit: Throw if
  48.                                                                         link source status is
  49.                                                                         kODErrCannotEstablishLink.
  50.                 <28>     8/21/95        VL              1277291: Added #include <StorUtil.h>.
  51.                 <27>     8/12/95        Té              1276807 Opt./Bug: use StdTypIO routines for
  52.                                                                         portable streaming & smaller footprint
  53.                 <26>      8/3/95        RR              #1257260: Collapse B classes. Remove
  54.                                                                         somInit methods. Don't call IsInitialized
  55.                                                                         or SubclassResponsibility
  56.                 <25>     7/28/95        CC              1183569: Externalize only when dirty.
  57.                 <24>     7/28/95        CC              1242625: ODDeleteObject sets argument to
  58.                                                                         null.
  59.                 <23>     7/24/95        CC              1193553: Added private class
  60.                                                                         ODPartListIterator.
  61.                                                                         1234526: RegisterDependent: Ignore register
  62.                                                                         if draft is read-only, so part won't be
  63.                                                                         notified.
  64.                 <22>     7/24/95        CC              1154714:  UpdateDependents:  Iteration not
  65.                                                                         broken by Registration & Unregistration
  66.                                                                         during notification.
  67.                                                                         Added AddPartList and RemovePartList to
  68.                                                                         private class ODPartList.
  69.                                                                         AddPart: Test for presence in list before
  70.                                                                         adding.
  71.                                                                         Destructor for class ODPartList removes all
  72.                                                                         parts.
  73.                 <21>     6/17/95        CC              1259139: GetContentStorageUnit: Fail if no
  74.                                                                         content property or value.
  75.                 <20>      6/2/95        CC              1255474: AcquireLinkSource restored to
  76.                                                                         GetLinkSource.
  77.                                                                         1255474: AcquireLinkedList restored to
  78.                                                                         GetLinkedList.
  79.                 <19>     5/26/95        VL              1251403: Multithreading naming support.
  80.                 <18>     5/25/95        jpa             List.h --> LinkList.h [1253324]
  81.                 <17>     5/18/95        CC              1238898: Add destFrame argument to
  82.                                                                         BeginClone call.
  83.                 <16>     5/17/95        RR              #1250135/1250137/1250143 Getters increment
  84.                                                                         refcount
  85.                 <15>     4/14/95        Té              #1235279 BB: InfoUtil & StdTypIO functions
  86.                                                                         should take Environment* and SU* when
  87.                                                                         possible
  88.                 <14>     4/11/95        CC              1236452: Added SOM_CATCH to InitBaseLink,
  89.                                                                         InitBaseLinkFromStorage,
  90.                                                                         GetContentStorageUnit, SetLinkSource, Lock,
  91.                                                                         and Unlock.
  92.                                                                         Added inline override of THROW_IF_NULL.
  93.                                                                         Removed #include of Link.xh.
  94.                 <13>      3/9/95        CC              1221471: Added changesAllowed parameter to
  95.                                                                         ShowLinkDestinationInfo().
  96.                 <12>     2/15/95        CC              1216124 ShowLinkDestinationInfo: Aquire
  97.                                                                         modal focus & deactivate front window.
  98.                 <11>     1/19/95        CC              1193551 Removed GetLinkStatus().
  99.                                                                         1183569 Added fDirty flag.
  100.                                                                         1212356 ShowSourceContent: Catch errors
  101.                                                                         returned by
  102.                                                                         ODLinkSource::ShowSourceContent().
  103.                 <10>    12/22/94        CC              1207986 Moved ODSURemoveProperty to
  104.                                                                         StdTypIO.
  105.                  <9>    12/16/94        CC              1203516 Removed ODLinkSource parameter from
  106.                                                                         InitBaseLink(); added SetLinkSource().
  107.                  <8>     10/4/94        CC              1190307 - Robustify for non-existent link
  108.                                                                         object.
  109.                  <7>     9/15/94        CC              1186669 - Replace CloneTo() with
  110.                                                                         CloneInto().
  111.                  <6>      9/8/94        CC              #1185113 - Use StdTypeIO to read/write
  112.                                                                         property values.
  113.                  <5>      9/7/94        CC              #1185114 - Catch throws from KeyValid().
  114.                  <4>     8/26/94        VL              1183174: Use updated cloning APIs.
  115.                  <3>     8/12/94        CC              1180598 - Added ODFacet parameter to
  116.                                                                         ShowLinkDestinationInfo().
  117.                  <2>     8/10/94        CC              1179943 - Moved in platform-independent
  118.                                                                         implementation from Link.cpp.
  119.                  <1>     6/24/94        CC              first checked in
  120.  
  121.         To Do:
  122.         In Progress:
  123. */
  124.  
  125. #define VARIABLE_MACROS
  126.  
  127. #ifdef _PLATFORM_OS2_
  128. #include <builtin.h>
  129. #include <odos2.h>
  130. #include <StdDefs.xh>
  131. #endif
  132.  
  133. #define ODBaseLink_Class_Source
  134. #include <LinkB.xih>
  135.  
  136. #ifndef _EXCEPT_
  137. #include <Except.h>
  138. #endif
  139.  
  140. #ifndef _ODMEMORY_
  141. #include <ODMemory.h>
  142. #endif
  143.  
  144. #ifdef _PLATFORM_MACINTOSH_
  145. #ifndef _CONSTDEF_
  146. #include <ConstDef.h>
  147. #endif
  148. #endif
  149.  
  150. #ifndef _LINKDLGS_
  151. #include <LinkDlgs.h>
  152. #endif
  153.  
  154. #ifndef SOM_ODLinkSource_xh
  155. #include <LinkSrc.xh>
  156. #endif
  157.  
  158. #ifndef _LINKLIST_
  159. #include <LinkList.h>
  160. #endif
  161.  
  162. #ifndef SOM_ODPart_xh
  163. #include <Part.xh>
  164. #endif
  165.  
  166. #ifndef SOM_ODFrame_xh
  167. #include <Frame.xh>
  168. #endif
  169.  
  170. #if defined(_PLATFORM_WIN32_) || defined(_PLATFORM_OS2_)
  171. #ifndef SOM_ODFacet_xh
  172. #include <Facet.xh>
  173. #endif
  174. #endif
  175.  
  176. #ifndef SOM_ODSession_xh
  177. #include <ODSessn.xh>
  178. #endif
  179.  
  180. #ifndef SOM_ODArbitrator_xh
  181. #include <Arbitrat.xh>
  182. #endif
  183.  
  184. #ifndef SOM_ODWindowState_xh
  185. #include <WinStat.xh>
  186. #endif
  187.  
  188. #ifndef SOM_Module_OpenDoc_Foci_defined
  189. #include <Foci.xh>
  190. #endif
  191.  
  192. #ifndef SOM_ODContainer_xh
  193. #include <ODCtr.xh>
  194. #endif
  195.  
  196. #ifndef SOM_ODDocument_xh
  197. #include <Document.xh>
  198. #endif
  199.  
  200. #ifndef SOM_ODDraft_xh
  201. #include <Draft.xh>
  202. #endif
  203.  
  204. #ifndef SOM_ODStorageUnit_xh
  205. #include <StorageU.xh>
  206. #endif
  207.  
  208. #ifndef SOM_Module_OpenDoc_StdProps_defined
  209. #include <StdProps.xh>
  210. #endif
  211.  
  212. #ifndef SOM_Module_OpenDoc_StdTypes_defined
  213. #include <StdTypes.xh>
  214. #endif
  215.  
  216. #ifndef __ERRORS__
  217. #include <Errors.h>
  218. #endif
  219.  
  220. #ifndef _ODUTILS_
  221. #include <ODUtils.h>
  222. #endif
  223.  
  224. #ifndef _STDTYPIO_
  225. #include <StdTypIO.h>
  226. #endif
  227.  
  228. #ifndef _DOCUTILS_
  229. #include <DocUtils.h>
  230. #endif
  231.  
  232. #ifndef _STORUTIL_
  233. #include <StorUtil.h>
  234. #endif
  235.  
  236. #ifndef _ODDEBUG_
  237. #include <ODDebug.h>
  238. #endif
  239.  
  240. #ifndef _TEMPOBJ_
  241. #include "TempObj.h"
  242. #endif
  243.  
  244. #if defined(_PLATFORM_MACINTOSH_) || defined(_PLATFORM_WIN32_)
  245. #pragma segment ODBaseLink
  246. #endif
  247.  
  248. //==============================================================================
  249. // Local Classes
  250. //==============================================================================
  251.  
  252. //------------------------------------------------------------------------------
  253. // Class ODPartLink
  254. //------------------------------------------------------------------------------
  255.  
  256. class ODPartLink : public Link {
  257.         public:
  258.                 ODPartLink(ODPart* thePart) {fPart = thePart;}
  259.                 virtual ~ODPartLink()           {}
  260.                 ODPart* GetPart()                       { return fPart;}
  261.  
  262.         private:
  263.                 ODPart* fPart;
  264. };
  265.  
  266. //------------------------------------------------------------------------------
  267. // Class ODPartList
  268. //------------------------------------------------------------------------------
  269.  
  270. class ODPartList
  271. {
  272.         friend class ODPartListIterator;
  273.  
  274.         public:
  275.  
  276.                 ODPartList()                    {}
  277.                 virtual ~ODPartList()   {this->RemoveAllParts(somGetGlobalEnvironment());}
  278.  
  279.                 virtual ODBoolean       ContainsPart(Environment *ev, ODPart* thePart);
  280.                 virtual ODBoolean       AddPart(Environment *ev, ODPart* thePart);
  281.                 virtual void            AddPartList(Environment *ev, ODPartList* thePartList);
  282.                 virtual void            RemovePart(Environment *ev, ODPart* thePart);
  283.                 virtual void            RemovePartList(Environment *ev, ODPartList* thePartList);
  284.                 virtual void            RemoveAllParts(Environment *ev);
  285.  
  286.         private:
  287.  
  288.                 LinkedList      fImplementation;
  289. };
  290.  
  291. //------------------------------------------------------------------------------
  292. // Class ODPartListIterator
  293. //------------------------------------------------------------------------------
  294.  
  295. class ODPartListIterator
  296. {
  297. public:
  298.  
  299.         ODPartListIterator(ODPartList* partList)
  300.                 : fIterator(&(partList->fImplementation))
  301.                 {}
  302.         ODVMethod ~ODPartListIterator()
  303.                 {}
  304.  
  305.         ODMethod ODPart* First();
  306.         ODMethod ODPart* Next();
  307.         ODMethod ODBoolean IsNotComplete();
  308.  
  309. private:
  310.  
  311.         LinkedListIterator fIterator;
  312.  
  313. };
  314.  
  315. //------------------------------------------------------------------------------
  316. // ODPartList::ContainsPart
  317. //------------------------------------------------------------------------------
  318.  
  319. ODBoolean ODPartList::ContainsPart(Environment *ev, ODPart* thePart)
  320. {
  321.         ODBoolean result = kODFalse;
  322.         ODPartListIterator iter(this);
  323.  
  324.         for (ODPart* part = iter.First(); (result == kODFalse) && iter.IsNotComplete(); part = iter.Next())
  325.         {
  326.                 result = ODObjectsAreEqual(ev, part, thePart);
  327.         }
  328.  
  329.         return result;
  330. }
  331.  
  332. //------------------------------------------------------------------------------
  333. // ODPartList::AddPart
  334. //------------------------------------------------------------------------------
  335.  
  336. ODBoolean ODPartList::AddPart(Environment *ev, ODPart* thePart)
  337. {
  338.         ODBoolean notPresent = !this->ContainsPart(ev, thePart);
  339.         if ( notPresent )
  340.         {
  341.                 ODPartLink* aLink = new ODPartLink(thePart);
  342.                 thePart->Acquire(ev);
  343.                 fImplementation.AddLast(aLink);
  344.         }
  345.  
  346.         return notPresent;
  347. }
  348.  
  349. //------------------------------------------------------------------------------
  350. // ODPartList::AddPartList
  351. //------------------------------------------------------------------------------
  352.  
  353. void ODPartList::AddPartList(Environment *ev, ODPartList* thePartList)
  354. {
  355.         if ( thePartList )
  356.         {
  357.                 ODPartListIterator iter(thePartList);
  358.  
  359.                 for (ODPart* thePart = iter.First(); iter.IsNotComplete(); thePart = iter.Next())
  360.                 {
  361.                         this->AddPart(ev, thePart);
  362.                 }
  363.         }
  364. }
  365.  
  366. //------------------------------------------------------------------------------
  367. // ODPartList::RemovePart
  368. //------------------------------------------------------------------------------
  369.  
  370. void ODPartList::RemovePart(Environment *ev, ODPart* thePart)
  371. {
  372.         LinkedListIterator iter(&fImplementation);
  373.  
  374.         ODPartLink* aLink = (ODPartLink*)iter.First();
  375.         while (aLink != NULL)
  376.         {
  377.                 ODPart* part = aLink->GetPart();
  378.                 if ( ODObjectsAreEqual(ev, part, thePart) )
  379.                 {
  380.                         fImplementation.Remove(*aLink);
  381.                         aLink = NULL;
  382.                         part->Release(ev);
  383.                 }
  384.                 else
  385.                         aLink = (ODPartLink*)iter.Next();
  386.         }
  387. }
  388.  
  389. //------------------------------------------------------------------------------
  390. // ODPartList::RemovePartList
  391. //------------------------------------------------------------------------------
  392.  
  393. void ODPartList::RemovePartList(Environment *ev, ODPartList* thePartList)
  394. {
  395.         if ( thePartList )
  396.         {
  397.                 ODPartListIterator iter(thePartList);
  398.  
  399.                 for (ODPart* thePart = iter.First(); iter.IsNotComplete(); thePart = iter.Next())
  400.                 {
  401.                         this->RemovePart(ev, thePart);
  402.                 }
  403.         }
  404. }
  405.  
  406. //------------------------------------------------------------------------------
  407. // ODPartList::RemoveAllParts
  408. //------------------------------------------------------------------------------
  409.  
  410. void ODPartList::RemoveAllParts(Environment *ev)
  411. {
  412.         ODPartLink* aLink = (ODPartLink*) fImplementation.RemoveFirst();
  413.         while (aLink != kODNULL)
  414.         {
  415.                 ODPart* part = aLink->GetPart();
  416.                 part->Release(ev);
  417.                 delete aLink;
  418.                 aLink = (ODPartLink*) fImplementation.RemoveFirst();
  419.         }
  420. }
  421.  
  422. //------------------------------------------------------------------------------
  423. // ODPartListIterator::First
  424. //------------------------------------------------------------------------------
  425.  
  426. ODPart* ODPartListIterator::First()
  427. {
  428.         ODPart* part = kODNULL;
  429.         ODPartLink* partLink = (ODPartLink*) fIterator.First();
  430.  
  431.         if ( partLink )
  432.                 part = partLink->GetPart();
  433.  
  434.         return part;
  435. }
  436.  
  437. //------------------------------------------------------------------------------
  438. // ODPartListIterator::Next
  439. //------------------------------------------------------------------------------
  440.  
  441. ODPart* ODPartListIterator::Next()
  442. {
  443.         ODPart* part = kODNULL;
  444.         ODPartLink* partLink = (ODPartLink*) fIterator.Next();
  445.  
  446.         if ( partLink )
  447.                 part = partLink->GetPart();
  448.  
  449.         return part;
  450. }
  451.  
  452. //------------------------------------------------------------------------------
  453. // ODPartListIterator::IsNotComplete
  454. //------------------------------------------------------------------------------
  455.  
  456. ODBoolean ODPartListIterator::IsNotComplete()
  457. {
  458.         return fIterator.IsNotComplete();
  459. }
  460.  
  461. //==============================================================================
  462. // ODBaseLink
  463. //==============================================================================
  464.  
  465. //------------------------------------------------------------------------------
  466. // ODBaseLink: somUninit
  467. //------------------------------------------------------------------------------
  468.  
  469. SOM_Scope void  SOMLINK ODBaseLinksomUninit(ODBaseLink *somSelf)
  470. {
  471.     /* ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf); */
  472.     ODBaseLinkMethodDebug("ODBaseLink","somUninit");
  473.  
  474.     parent_somUninit(somSelf);
  475. }
  476.  
  477. //------------------------------------------------------------------------------
  478. // ODBaseLink: InitBaseLink
  479. //------------------------------------------------------------------------------
  480.  
  481. SOM_Scope void  SOMLINK ODBaseLinkInitBaseLink(ODBaseLink *somSelf, Environment *ev,
  482.                 ODStorageUnit* storageUnit)
  483. {
  484.     ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
  485.     ODBaseLinkMethodDebug("ODBaseLink","InitBaseLink");
  486.  
  487. #ifdef _PLATFORM_MACINTOSH_
  488.         SOM_CATCH return;
  489. #endif
  490.  
  491. #if defined(_PLATFORM_OS2_) || defined(_PLATFORM_WIN32_) || defined(_PLATFORM_AIX_)
  492.         SOM_TRY
  493. #endif
  494.  
  495.         /* Moved from somInit. SOM itself sets fields to zero
  496.         _fPartList = (ODPartList*) kODNULL;
  497.         _fLinkSource = (ODLinkSource*) kODNULL;
  498.         _fDirty = kODFalse;
  499.         _fIterationInProgress = kODFalse;
  500.         _fRestartIteration = kODFalse;
  501.         */
  502.         somSelf->InitPersistentObject(ev, storageUnit);
  503.  
  504.         _fPartList = new ODPartList();
  505.  
  506.         ODStorageUnit* su = somSelf->GetStorageUnit(ev);
  507.         ODSUAddPropValue(ev, su, kODPropLinkSource, kODWeakStorageUnitRef);
  508.  
  509. #ifdef _PLATFORM_OS2_
  510.  
  511. // Save the hwnd for the client in thread 1 so that when thread 3 from dsom
  512. // calls, the message can be routed to thread 1 for processing.
  513. // This is to make dsom call thread safe.
  514.  
  515.     PTIB ptib;  
  516.     PPIB ppib;  
  517.  
  518.     DosGetInfoBlocks(&ptib, &ppib);       // Get the info block
  519.     ULONG tid = ptib->tib_ptib2->tib2_ultid;
  520.  
  521.     if ( tid == 1) {                      // Check if this is for thread 1
  522.  
  523.        ODSession     * session      = somSelf->GetStorageUnit(ev)->GetSession(ev);
  524.        ODWindowState * winState     = session->GetWindowState(ev);
  525.  
  526.        ODWindow      * activeWindow = winState->AcquireActiveWindow(ev);
  527.        HWND            hwndFrame    = activeWindow->GetPlatformWindow(ev);   \
  528.        activeWindow->Release(ev);
  529.  
  530.        _fhwndClient                 = WinWindowFromID(hwndFrame, FID_CLIENT);
  531.  
  532.     } /* endif */
  533. #endif
  534.  
  535. #if defined(_PLATFORM_WIN32_) || defined(_PLATFORM_AIX_)
  536.         somSelf->SetBaseLinkDirty(ev);
  537. #endif
  538.  
  539. #if defined(_PLATFORM_OS2_) || defined(_PLATFORM_WIN32_) || defined(_PLATFORM_AIX_)
  540.         SOM_CATCH_ALL
  541.  
  542.         SOM_ENDTRY
  543.           return;
  544. #endif
  545. }
  546.  
  547. //------------------------------------------------------------------------------
  548. // ODBaseLink: InitBaseLinkFromStorage
  549. //------------------------------------------------------------------------------
  550.  
  551. SOM_Scope void  SOMLINK ODBaseLinkInitBaseLinkFromStorage(ODBaseLink *somSelf, Environment *ev,
  552.                 ODStorageUnit* storageUnit)
  553. {
  554.     ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
  555.     ODBaseLinkMethodDebug("ODBaseLink","InitBaseLinkFromStorage");
  556.  
  557. #ifdef _PLATFORM_MACINTOSH_
  558.         SOM_CATCH return;
  559. #endif
  560.  
  561. #if defined(_PLATFORM_OS2_) || defined(_PLATFORM_WIN32_) || defined(_PLATFORM_AIX_)
  562.         SOM_TRY
  563. #endif
  564.  
  565.         /* Moved from somInit. SOM itself sets fields to zero
  566.         _fPartList = (ODPartList*) kODNULL;
  567.         _fLinkSource = (ODLinkSource*) kODNULL;
  568.         _fDirty = kODFalse;
  569.         _fIterationInProgress = kODFalse;
  570.         _fRestartIteration = kODFalse;
  571.         */
  572.         somSelf->InitPersistentObjectFromStorage(ev, storageUnit);
  573.  
  574.         _fPartList = new ODPartList();
  575.  
  576.         if ( storageUnit->Exists(ev, kODPropLinkSource, 0, 0) )
  577.         {
  578.                 ODID linkSourceID = ODGetWeakSURefProp(ev, storageUnit, kODPropLinkSource, kODWeakStorageUnitRef);
  579.  
  580. #if defined(_PLATFORM_OS2_)
  581.                 if ( linkSourceID != 0 )
  582.                         _fLinkSource = storageUnit->GetDraft(ev)->AcquireLinkSource(ev, linkSourceID);
  583. #else
  584.                 if ( linkSourceID == kODNULLID )
  585.                         somSelf->SetBaseLinkDirty(ev);
  586.                 else
  587.                         _fLinkSource = storageUnit->GetDraft(ev)->AcquireLinkSource(ev, linkSourceID);
  588. #endif
  589.         }
  590.  
  591.  
  592. #if defined(_PLATFORM_OS2_) || defined(_PLATFORM_WIN32_) || defined(_PLATFORM_AIX_)
  593.         SOM_CATCH_ALL
  594.  
  595.         SOM_ENDTRY
  596.           return;
  597. #endif
  598. }
  599.  
  600. //------------------------------------------------------------------------------
  601. // ODBaseLink: Externalize (OVERRIDE)
  602. //------------------------------------------------------------------------------
  603.  
  604. SOM_Scope void  SOMLINK ODBaseLinkExternalize(ODBaseLink *somSelf, Environment *ev)
  605. {
  606.     ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
  607.     ODBaseLinkMethodDebug("ODBaseLink","Externalize");
  608.  
  609. #ifdef _PLATFORM_MACINTOSH_
  610.         SOM_CATCH return;
  611. #endif
  612.  
  613. #if defined(_PLATFORM_OS2_) || defined(_PLATFORM_WIN32_) || defined(_PLATFORM_AIX_)
  614.         SOM_TRY
  615. #endif
  616.  
  617.     parent_Externalize(somSelf,ev);
  618.  
  619. #if defined(_PLATFORM_OS2_)
  620.         ODStorageUnit* su = somSelf->GetStorageUnit(ev);
  621.  
  622.         if ( _fLinkSource == (ODLinkSource*) kODNULL )
  623.                 ODSURemoveProperty(ev, su, kODPropLinkSource);
  624.         else
  625.         ODSetWeakSURefProp(ev, su, kODPropLinkSource, kODWeakStorageUnitRef, _fLinkSource->GetID(ev));
  626. #else
  627.         if ( _fDirty )
  628.         {
  629.                 ODStorageUnit* su = somSelf->GetStorageUnit(ev);
  630.  
  631.                 if ( _fLinkSource == (ODLinkSource*) kODNULL )
  632.                         ODSURemoveProperty(ev, su, kODPropLinkSource);
  633.                 else
  634.                         ODSetWeakSURefProp(ev, su, kODPropLinkSource, kODWeakStorageUnitRef, _fLinkSource->GetID(ev));
  635.  
  636.                 _fDirty = kODFalse;
  637.         }
  638. #endif
  639.  
  640. #if defined(_PLATFORM_OS2_) || defined(_PLATFORM_WIN32_) || defined(_PLATFORM_AIX_)
  641.         SOM_CATCH_ALL
  642.  
  643.         SOM_ENDTRY
  644.           return;
  645. #endif
  646. }
  647.  
  648. //------------------------------------------------------------------------------
  649. // ODBaseLink: CloneInto (OVERRIDE)
  650. //------------------------------------------------------------------------------
  651.  
  652. SOM_Scope void  SOMLINK ODBaseLinkCloneInto(ODBaseLink *somSelf, Environment *ev,
  653.                 ODDraftKey key,
  654.                 ODStorageUnit* toSU,
  655.                 ODFrame* scopeFrame)
  656. {
  657.     ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
  658.     ODBaseLinkMethodDebug("ODBaseLink","CloneInto");
  659.  
  660. #ifdef _PLATFORM_MACINTOSH_
  661.         SOM_CATCH return;
  662. #endif
  663.  
  664. #if defined(_PLATFORM_OS2_) || defined(_PLATFORM_WIN32_) || defined(_PLATFORM_AIX_)
  665.         SOM_TRY
  666. #endif
  667.  
  668.         // If one of our properties already exists, this object has been cloned already
  669.         if ( toSU->Exists(ev, kODPropLinkSource, kODWeakStorageUnitRef, 0) )
  670.                 return;
  671.  
  672.         parent_CloneInto(somSelf, ev, key, toSU, scopeFrame);
  673.  
  674.         if ( _fLinkSource != (ODLinkSource*) kODNULL )
  675.         {
  676.                 ODDraft* draft = somSelf->GetStorageUnit(ev)->GetDraft(ev);
  677.                 ODID clonedLinkSourceID = draft->WeakClone(ev, key, _fLinkSource->GetID(ev), 0,
  678.                                                                                                 (scopeFrame ? scopeFrame->GetID(ev) : 0));
  679.  
  680.                 ODSetWeakSURefProp(ev, toSU, kODPropLinkSource, kODWeakStorageUnitRef, clonedLinkSourceID);
  681.         }
  682.  
  683.  
  684. #if defined(_PLATFORM_OS2_) || defined(_PLATFORM_WIN32_) || defined(_PLATFORM_AIX_)
  685.         SOM_CATCH_ALL
  686.  
  687.         SOM_ENDTRY
  688.           return;
  689. #endif
  690. }
  691.  
  692. //------------------------------------------------------------------------------
  693. // ODBaseLink: ReleaseAll (OVERRIDE)
  694. //------------------------------------------------------------------------------
  695.  
  696. SOM_Scope void  SOMLINK ODBaseLinkReleaseAll(ODBaseLink *somSelf, Environment *ev)
  697. {
  698.     ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
  699.     ODBaseLinkMethodDebug("ODBaseLink","ReleaseAll");
  700.  
  701. #ifdef _PLATFORM_MACINTOSH_
  702.         SOM_CATCH return;
  703. #endif
  704.  
  705. #if defined(_PLATFORM_OS2_) || defined(_PLATFORM_WIN32_) || defined(_PLATFORM_AIX_)
  706.         SOM_TRY
  707. #endif
  708.  
  709.     parent_ReleaseAll(somSelf,ev);
  710.  
  711.         ODReleaseObject(ev, _fLinkSource);
  712.  
  713.         // Release all part references stored in the list of registered parts
  714.         ODDeleteObject(_fPartList);
  715.  
  716.  
  717. #if defined(_PLATFORM_OS2_) || defined(_PLATFORM_WIN32_) || defined(_PLATFORM_AIX_)
  718.         SOM_CATCH_ALL
  719.  
  720.         SOM_ENDTRY
  721.           return;
  722. #endif
  723. }
  724.  
  725. //------------------------------------------------------------------------------
  726. // ODBaseLink: SetBaseLinkDirty
  727. //------------------------------------------------------------------------------
  728.  
  729. SOM_Scope void  SOMLINK ODBaseLinkSetBaseLinkDirty(ODBaseLink *somSelf, Environment *ev)
  730. {
  731.     ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
  732.     ODBaseLinkMethodDebug("ODBaseLink","SetBaseLinkDirty");
  733.  
  734.         SOM_TRY
  735.                 _fDirty = kODTrue;
  736.  
  737.                 ODDraft* draft = somSelf->GetStorageUnit(ev)->GetDraft(ev);
  738.                 if ( draft->GetPermissions(ev) != kODDPReadOnly )
  739.                         draft->SetChangedFromPrev(ev);
  740.         SOM_CATCH_ALL
  741.         SOM_ENDTRY
  742. }
  743.  
  744. #if defined(_PLATFORM_MACINTOSH_) || defined(_PLATFORM_WIN32_) || defined(_PLATFORM_OS2_)
  745. //------------------------------------------------------------------------------
  746. // ODBaseLink::ShowLinkDestinationInfo
  747. //------------------------------------------------------------------------------
  748.  
  749. SOM_Scope ODBoolean  SOMLINK ODBaseLinkShowLinkDestinationInfo(ODBaseLink *somSelf, Environment *ev,
  750.                 ODFacet* facet,
  751.                 ODLinkInfo* info,
  752.                 ODBoolean changesAllowed,
  753.                 ODLinkInfoResult* infoResult)
  754. {
  755.     ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
  756.     ODBaseLinkMethodDebug("ODBaseLink","ShowLinkDestinationInfo");
  757.  
  758.         ODBoolean result = kODFalse;
  759.  
  760. #ifdef _PLATFORM_MACINTOSH_
  761.         SOM_CATCH return kODFalse;
  762. #else
  763.         SOM_TRY
  764. #endif // _PLATFORM_MACINTOSH_
  765.  
  766.         THROW_IF_NULL(facet, kODErrNullFacetInput);
  767.         THROW_IF_NULL(info, kODErrNullLinkInfoInput);
  768.         THROW_IF_NULL(infoResult, kODErrNullLinkInfoResultInput);
  769. #ifndef _PLATFORM_OS2_
  770.         THROW_IF_NULL(_fLinkSource, kODErrBrokenLink);
  771. #endif
  772.  
  773.         ODSession* session = somSelf->GetStorageUnit(ev)->GetSession(ev);
  774.         ODTypeToken modalFocus = session->Tokenize(ev, kODModalFocus);
  775.         ODArbitrator* arbitrator = session->GetArbitrator(ev);
  776.         TempODFrame currentOwner = arbitrator->AcquireFocusOwner(ev, modalFocus);
  777.  
  778.         if ( arbitrator->RequestFocus(ev, modalFocus, facet->GetFrame(ev)) )
  779.         {
  780.                 infoResult->autoUpdate = info->autoUpdate;
  781. #ifdef _PLATFORM_MACINTOSH_
  782.                 session->GetWindowState(ev)->DeactivateFrontWindows(ev);
  783. #endif
  784.  
  785.         ODWindow* activeWindow = session->GetWindowState(ev)->AcquireActiveWindow(ev);
  786. #if defined (_PLATFORM_WIN32_) || defined(_PLATFORM_OS2_)
  787.                 result = ShowLinkDestinationInfo(somSelf,
  788.                                             info,
  789.                                             changesAllowed,
  790.                         activeWindow->GetPlatformWindow(ev),
  791.                                             facet,
  792.                                             infoResult);
  793. #else
  794.                 result = ShowLinkDestinationInfo(somSelf, info, changesAllowed, infoResult);
  795. #endif
  796.  
  797. #ifdef _PLATFORM_MACINTOSH_
  798.                 session->GetWindowState(ev)->ActivateFrontWindows(ev);
  799. #endif
  800.  
  801.                 arbitrator->TransferFocus(ev, modalFocus, facet->GetFrame(ev), currentOwner);
  802.         activeWindow->Release(ev);
  803.         }
  804.         else
  805.         {
  806. #ifdef _PLATFORM_MACINTOSH_
  807.                 SysBeep(2);
  808. #endif
  809. #ifdef _PLATFORM_WIN32_
  810.                 Beep(440, 250);  // play an A for 1/4 second, OK?
  811. #endif
  812. #ifdef _PLATFORM_OS2_
  813.                 // ?? OS/2?             SysBeep(2);
  814. #endif
  815.         }
  816.         return result;
  817.  
  818. #if defined(_PLATFORM_OS2_) || defined(_PLATFORM_WIN32_)
  819.         SOM_CATCH_ALL
  820.  
  821.         SOM_ENDTRY
  822.           return kODFalse;
  823. #endif
  824. }
  825. #endif // _PLATFORM_MACINTOSH_ or _PLATFORM_WIN32_
  826.  
  827. //------------------------------------------------------------------------------
  828. // ODBaseLink: Lock
  829. //------------------------------------------------------------------------------
  830.  
  831. SOM_Scope ODBoolean  SOMLINK ODBaseLinkLock(ODBaseLink *somSelf, Environment *ev,
  832.                 ODULong wait,
  833.                 ODLinkKey* key)
  834. {
  835.     ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
  836.     ODBaseLinkMethodDebug("ODBaseLink","Lock");
  837.  
  838. #ifdef _PLATFORM_MACINTOSH_
  839.         SOM_CATCH return kODFalse;
  840. #endif
  841.  
  842. #if defined(_PLATFORM_OS2_) || defined(_PLATFORM_WIN32_) || defined(_PLATFORM_AIX_)
  843.         SOM_TRY
  844. #endif
  845.  
  846. #ifdef _PLATFORM_OS2_
  847.  
  848.         somSelf->SubClassResponsibility(ev);
  849.         return kODFalse;
  850.  
  851. #else
  852.         THROW_IF_NULL(_fLinkSource, kODErrBrokenLink);
  853.  
  854.         return _fLinkSource->Lock(ev, wait, key);
  855. #endif
  856.  
  857. #if defined(_PLATFORM_OS2_) || defined(_PLATFORM_WIN32_) || defined(_PLATFORM_AIX_)
  858.         SOM_CATCH_ALL
  859.  
  860.         SOM_ENDTRY
  861.           return kODFalse;
  862. #endif
  863. }
  864.  
  865. //------------------------------------------------------------------------------
  866. // ODBaseLink: Unlock
  867. //------------------------------------------------------------------------------
  868.  
  869. SOM_Scope void  SOMLINK ODBaseLinkUnlock(ODBaseLink *somSelf, Environment *ev,
  870.                 ODLinkKey key)
  871. {
  872.     ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
  873.     ODBaseLinkMethodDebug("ODBaseLink","Unlock");
  874.  
  875. #ifdef _PLATFORM_MACINTOSH_
  876.         SOM_CATCH return;
  877. #endif
  878.  
  879. #if defined(_PLATFORM_OS2_) || defined(_PLATFORM_WIN32_) || defined(_PLATFORM_AIX_)
  880.         SOM_TRY
  881. #endif
  882.  
  883. #ifdef _PLATFORM_OS2_
  884.  
  885.     somSelf->SubClassResponsibility(ev);
  886.  
  887. #else
  888.  
  889.         THROW_IF_NULL(_fLinkSource, kODErrBrokenLink);
  890.  
  891.         _fLinkSource->Unlock(ev, key);
  892.  
  893. #endif
  894.  
  895. #if defined(_PLATFORM_OS2_) || defined(_PLATFORM_WIN32_) || defined(_PLATFORM_AIX_)
  896.         SOM_CATCH_ALL
  897.  
  898.         SOM_ENDTRY
  899.           return;
  900. #endif
  901. }
  902.  
  903. //------------------------------------------------------------------------------
  904. // ODBaseLink: KeyValid
  905. //------------------------------------------------------------------------------
  906.  
  907. SOM_Scope void  SOMLINK ODBaseLinkKeyValid(ODBaseLink *somSelf, Environment *ev,
  908.                 ODLinkKey key)
  909. {
  910.     ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
  911.     ODBaseLinkMethodDebug("ODBaseLink","KeyValid");
  912.  
  913. #ifdef _PLATFORM_OS2_
  914.  
  915.     _interrupt(3);
  916.  
  917. #else
  918.  
  919. #ifdef _PLATFORM_MACINTOSH_
  920.         SOM_CATCH return;
  921. #endif
  922.  
  923. #if defined(_PLATFORM_OS2_) || defined(_PLATFORM_WIN32_) || defined(_PLATFORM_AIX_)
  924.         SOM_TRY
  925. #endif
  926.  
  927.         THROW_IF_NULL(_fLinkSource, kODErrBrokenLink);
  928. #ifdef _PLATFORM_MACINTOSH_
  929.         _fLinkSource->KeyValid(ev, key);
  930. #endif
  931.  
  932.  
  933. #if  defined(_PLATFORM_WIN32_) || defined(_PLATFORM_AIX_)
  934.         SOM_CATCH_ALL
  935.  
  936.         SOM_ENDTRY
  937.           return;
  938. #endif
  939.  
  940. #endif //_PLATFORM_OS2_
  941.  
  942. }
  943.  
  944. //------------------------------------------------------------------------------
  945. // ODBaseLink: GetContentStorageUnit
  946. //------------------------------------------------------------------------------
  947.  
  948. SOM_Scope ODStorageUnit*  SOMLINK ODBaseLinkGetContentStorageUnit(ODBaseLink *somSelf, Environment *ev,
  949.                 ODLinkKey key)
  950. {
  951.     ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
  952.     ODBaseLinkMethodDebug("ODBaseLink","GetContentStorageUnit");
  953.  
  954.  
  955. #ifdef _PLATFORM_OS2_
  956.  
  957.     somSelf->SubClassResponsibility(ev);
  958.     return (ODStorageUnit*) kODNULL;
  959.  
  960. #else
  961.  
  962. #ifdef _PLATFORM_MACINTOSH_
  963.         SOM_CATCH return (ODStorageUnit*) kODNULL;
  964. #endif
  965.  
  966. #if defined(_PLATFORM_OS2_) || defined(_PLATFORM_WIN32_) || defined(_PLATFORM_AIX_)
  967.         SOM_TRY
  968. #endif
  969.  
  970.         THROW_IF_NULL(_fLinkSource, kODErrBrokenLink);
  971.  
  972. #ifdef _PLATFORM_MACINTOSH_
  973.         if ( _fLinkSource->GetStatus(ev) == kODErrCannotEstablishLink )
  974.                 THROW(kODErrCannotEstablishLink);
  975. #endif
  976.  
  977.         ODStorageUnit* su = _fLinkSource->GetContentStorageUnit(ev, key);
  978.  
  979.         if ( su && !su->Exists(ev, kODPropContents, kODNULL, 1) )
  980.                 THROW(kODErrNoLinkContent);
  981.  
  982.         return su;
  983.  
  984.  
  985. #if defined(_PLATFORM_WIN32_) || defined(_PLATFORM_AIX_)
  986.         SOM_CATCH_ALL
  987.  
  988.         SOM_ENDTRY
  989.           return (ODStorageUnit*) kODNULL;
  990. #endif
  991.  
  992. #endif
  993. }
  994.  
  995. //------------------------------------------------------------------------------
  996. // ODBaseLink: RegisterDependent
  997. //------------------------------------------------------------------------------
  998.  
  999. SOM_Scope void  SOMLINK ODBaseLinkRegisterDependent(ODBaseLink *somSelf, Environment *ev,
  1000.                 ODPart* clientPart,
  1001.                 ODUpdateID id)
  1002. {
  1003.     ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
  1004.     ODBaseLinkMethodDebug("ODBaseLink","RegisterDependent");
  1005.  
  1006. #ifdef _PLATFORM_OS2_
  1007.  
  1008.         SOM_TRY
  1009.  
  1010.         if (!_fPartList->ContainsPart(ev, clientPart))
  1011.           _fPartList->AddPart(ev, clientPart);
  1012.  
  1013.         ODUpdateID currentID = somSelf->GetUpdateID(ev);
  1014.         if (currentID != kODUnknownUpdate)
  1015.         {
  1016.           if (id != currentID)
  1017.             clientPart->LinkUpdated(ev, (ODLink*) somSelf, currentID);
  1018.         }
  1019.  
  1020. #else
  1021.         // This method does nothing if clientPart is already registered or
  1022.         // if draft is read-only.
  1023.  
  1024.         SOM_TRY
  1025.  
  1026.                 THROW_IF_NULL(_fLinkSource, kODErrBrokenLink);
  1027.  
  1028.                 THROW_IF_NULL(_fPartList, kODErrCannotRegisterDependent);
  1029.  
  1030.                 ODDraftPermissions permissions = somSelf->GetStorageUnit(ev)->GetDraft(ev)->GetPermissions(ev);
  1031.  
  1032.                 if (HAS_WRITE_ACCESS(permissions))
  1033.                 {
  1034.                         if ( _fPartList->AddPart(ev, clientPart) )
  1035.                         {
  1036.                                 ODUpdateID currentID = somSelf->GetUpdateID(ev);
  1037.                                 if ( (currentID != kODUnknownUpdate) && (id != currentID) )
  1038.                                         clientPart->LinkUpdated(ev, (ODLink*) somSelf, currentID);
  1039.                         }
  1040.                 }
  1041.  
  1042. #endif
  1043.         SOM_CATCH_ALL
  1044.  
  1045.         SOM_ENDTRY
  1046. }
  1047.  
  1048. //------------------------------------------------------------------------------
  1049. // ODBaseLink: UnregisterDependent
  1050. //------------------------------------------------------------------------------
  1051.  
  1052. SOM_Scope void  SOMLINK ODBaseLinkUnregisterDependent(ODBaseLink *somSelf, Environment *ev,
  1053.                 ODPart* clientPart)
  1054. {
  1055.     ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
  1056.     ODBaseLinkMethodDebug("ODBaseLink","UnregisterDependent");
  1057.  
  1058.         SOM_TRY
  1059.  
  1060.                 // If fPartList is null, this object's ReleaseAll() has been called
  1061.                 //   and already unregistered any dependents.
  1062.                 if ( _fPartList )
  1063.                         _fPartList->RemovePart(ev, clientPart);
  1064.  
  1065.         SOM_CATCH_ALL
  1066.  
  1067.         SOM_ENDTRY
  1068. }
  1069.  
  1070. //------------------------------------------------------------------------------
  1071. // ODBaseLink: GetUpdateID
  1072. //------------------------------------------------------------------------------
  1073.  
  1074. SOM_Scope ODUpdateID  SOMLINK ODBaseLinkGetUpdateID(ODBaseLink *somSelf, Environment *ev)
  1075. {
  1076.     ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
  1077.     ODBaseLinkMethodDebug("ODBaseLink","GetUpdateID");
  1078.  
  1079. #ifdef _PLATFORM_OS2_
  1080.  
  1081.     somSelf->SubClassResponsibility(ev);
  1082.     return kODUnknownUpdate;
  1083.  
  1084. #else
  1085.         SOM_TRY
  1086.  
  1087.         if ( _fLinkSource == (ODLinkSource*) kODNULL )
  1088.                 THROW(kODErrBrokenLink);
  1089.  
  1090.         return _fLinkSource->GetUpdateID(ev);
  1091.  
  1092.         SOM_CATCH_ALL
  1093.         SOM_ENDTRY
  1094.         return kODUnknownUpdate;
  1095. #endif
  1096. }
  1097.  
  1098. //------------------------------------------------------------------------------
  1099. // ODBaseLink: GetChangeTime
  1100. //------------------------------------------------------------------------------
  1101.  
  1102. SOM_Scope ODTime  SOMLINK ODBaseLinkGetChangeTime(ODBaseLink *somSelf, Environment *ev)
  1103. {
  1104.     ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
  1105.     ODBaseLinkMethodDebug("ODBaseLink","GetChangeTime");
  1106.  
  1107. #ifdef _PLATFORM_OS2_
  1108.  
  1109.     somSelf->SubClassResponsibility(ev);
  1110.     return (ODTime) 0;
  1111.  
  1112. #else
  1113.         SOM_TRY
  1114.  
  1115.         if ( _fLinkSource == (ODLinkSource*) kODNULL )
  1116.                 THROW(kODErrBrokenLink);
  1117.  
  1118.         return _fLinkSource->GetChangeTime(ev);
  1119.  
  1120.         SOM_CATCH_ALL
  1121.         SOM_ENDTRY
  1122.         return (ODTime)0;
  1123. #endif
  1124. }
  1125.  
  1126. //------------------------------------------------------------------------------
  1127. // ODBaseLink: SetLinkSource
  1128. //------------------------------------------------------------------------------
  1129.  
  1130. SOM_Scope void  SOMLINK ODBaseLinkSetLinkSource(ODBaseLink *somSelf, Environment *ev,
  1131.                 ODLinkSource* linkSource)
  1132. {
  1133.     ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
  1134.     ODBaseLinkMethodDebug("ODBaseLink","SetLinkSource");
  1135.  
  1136. #ifdef _PLATFORM_OS2_
  1137.  
  1138.     _interrupt(3);
  1139.  
  1140. #else
  1141.  
  1142.  
  1143. #ifdef _PLATFORM_MACINTOSH_
  1144.         SOM_CATCH return;
  1145. #endif
  1146.  
  1147. #if defined(_PLATFORM_OS2_) || defined(_PLATFORM_WIN32_) || defined(_PLATFORM_AIX_)
  1148.         SOM_TRY
  1149. #endif
  1150.  
  1151.         if ( !ODObjectsAreEqual(ev, _fLinkSource, linkSource) )
  1152.         {
  1153.                 ODReleaseObject(ev, _fLinkSource);
  1154.  
  1155.                 _fLinkSource = linkSource;
  1156.                 if ( _fLinkSource != (ODLinkSource*) kODNULL )
  1157.                         _fLinkSource->Acquire(ev);
  1158.  
  1159.                 somSelf->SetBaseLinkDirty(ev);
  1160.         }
  1161.  
  1162.  
  1163. #if defined(_PLATFORM_WIN32_) || defined(_PLATFORM_AIX_)
  1164.         SOM_CATCH_ALL
  1165.  
  1166.         SOM_ENDTRY
  1167.           return;
  1168. #endif
  1169.  
  1170. #endif // _PLATFORM_OS2_
  1171.  
  1172. }
  1173.  
  1174. //------------------------------------------------------------------------------
  1175. // ODBaseLink: GetLinkSource
  1176. //------------------------------------------------------------------------------
  1177.  
  1178. SOM_Scope ODLinkSource*  SOMLINK ODBaseLinkGetLinkSource(ODBaseLink *somSelf, Environment *ev)
  1179. {
  1180.     ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
  1181.     ODBaseLinkMethodDebug("ODBaseLink","GetLinkSource");
  1182.  
  1183.  
  1184. #ifdef _PLATFORM_OS2_
  1185.  
  1186.     somSelf->SubClassResponsibility(ev);
  1187.     return (ODLinkSource*) kODNULL;
  1188.  
  1189. #else
  1190.         if ( _fLinkSource == (ODLinkSource*) kODNULL )
  1191.         {
  1192.                 ODSetSOMException(ev, kODErrBrokenLink);
  1193.                 return (ODLinkSource*) kODNULL;
  1194.         }
  1195.  
  1196.         return _fLinkSource;
  1197. #endif
  1198. }
  1199.  
  1200. //------------------------------------------------------------------------------
  1201. // ODBaseLink: ShowSourceContent
  1202. //------------------------------------------------------------------------------
  1203.  
  1204. SOM_Scope void  SOMLINK ODBaseLinkShowSourceContent(ODBaseLink *somSelf, Environment *ev)
  1205. {
  1206.     ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
  1207.     ODBaseLinkMethodDebug("ODBaseLink","ShowSourceContent");
  1208.  
  1209. #ifdef _PLATFORM_OS2_
  1210.  
  1211.     somSelf->SubClassResponsibility(ev);
  1212.  
  1213. #else
  1214.  
  1215. #ifdef _PLATFORM_MACINTOSH_
  1216.         SOM_CATCH return;
  1217. #endif
  1218.  
  1219. #if defined(_PLATFORM_OS2_) || defined(_PLATFORM_WIN32_) || defined(_PLATFORM_AIX_)
  1220.         SOM_TRY
  1221. #endif
  1222.  
  1223.         THROW_IF_NULL(_fLinkSource, kODErrBrokenLink);
  1224.  
  1225.         _fLinkSource->ShowSourceContent(ev);
  1226.  
  1227.  
  1228. #if defined(_PLATFORM_WIN32_) || defined(_PLATFORM_AIX_)
  1229.         SOM_CATCH_ALL
  1230.  
  1231.         SOM_ENDTRY
  1232.           return;
  1233. #endif
  1234.  
  1235. #endif // _PLATFORM_OS2_
  1236.  
  1237. }
  1238.  
  1239. //------------------------------------------------------------------------------
  1240. // ODBaseLink: UpdateDependents
  1241. //------------------------------------------------------------------------------
  1242. #ifdef _PLATFORM_OS2_
  1243. SOM_Scope void  SOMLINK ODBaseLinkUpdateDependents(ODBaseLink *somSelf, Environment *ev,
  1244.                 ODUpdateID id)
  1245. #else
  1246. SOM_Scope void  SOMLINK ODBaseLinkUpdateDependents(ODBaseLink *somSelf, Environment *ev)
  1247. #endif
  1248.  
  1249. {
  1250.     ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
  1251.     ODBaseLinkMethodDebug("ODBaseLink","UpdateDependents");
  1252.  
  1253.   #ifdef _PLATFORM_OS2_
  1254.  
  1255.     PTIB ptib;  
  1256.     PPIB ppib;  
  1257.  
  1258.     DosGetInfoBlocks(&ptib, &ppib);       // Get the info block
  1259.     ULONG tid = ptib->tib_ptib2->tib2_ultid;
  1260.  
  1261.     if ( tid != 1) {                      // Check if this is for thread 1
  1262.  
  1263.        MPARAM mpsomSelf = MPFROMP(somSelf);
  1264.        MPARAM mpUpdateId = MPFROMLONG(id);
  1265.        ULONG  Message = kODEvtLinkUpdate;
  1266.  
  1267.        if (!_fhwndClient) {
  1268.           ODSession     * session      = somSelf->GetStorageUnit(ev)->GetSession(ev);
  1269.           ODWindowState * winState     = session->GetWindowState(ev);
  1270.    
  1271.           ODWindow      * activeWindow = winState->AcquireActiveWindow(ev);
  1272.           HWND            hwndFrame    = activeWindow->GetPlatformWindow(ev);   \
  1273.           activeWindow->Release(ev);
  1274.    
  1275.           _fhwndClient                 = WinWindowFromID(hwndFrame, FID_CLIENT);
  1276.        } /* endif */
  1277.  
  1278.        WinPostMsg(_fhwndClient,           // Post the message for thread 1
  1279.                   Message,
  1280.                   mpsomSelf,
  1281.                   mpUpdateId);
  1282.  
  1283.        return;
  1284.     } /* endif */
  1285.   #endif
  1286.         if ( _fIterationInProgress )
  1287.         {
  1288.                 _fRestartIteration = kODTrue;
  1289.                 return;
  1290.         }
  1291.  
  1292.         _fIterationInProgress = kODTrue;
  1293.  
  1294.         SOM_TRY
  1295.  
  1296.                 do
  1297.                 {
  1298.                         _fRestartIteration = kODFalse;
  1299.  
  1300.                         ODPartList registeredParts;
  1301.                         registeredParts.AddPartList(ev, _fPartList);
  1302.  
  1303.                         ODPartListIterator iter(®isteredParts);
  1304.  
  1305.                         for (ODPart* clientPart = iter.First();
  1306.                                  !_fRestartIteration && iter.IsNotComplete();
  1307.                                  clientPart = iter.Next())
  1308.                         {
  1309.                                 // Don't call LinkUpdated if part has unregistered during iteration.
  1310.                                 if ( _fPartList->ContainsPart(ev, clientPart) )
  1311.                                 {
  1312.                                         // Ignore any errors returned from a part's LinkUpdated method
  1313.                                         TRY
  1314. #ifdef _PLATFORM_OS2_
  1315.                                                 clientPart->LinkUpdated(ev, (ODLink*) somSelf, id);
  1316. #else
  1317.                                                 clientPart->LinkUpdated(ev, (ODLink*) somSelf, somSelf->GetUpdateID(ev));
  1318. #endif
  1319.                                         CATCH_ALL
  1320.                                         ENDTRY
  1321.                                 }
  1322.                         }
  1323.  
  1324.                 } while ( _fRestartIteration );
  1325.  
  1326.         SOM_CATCH_ALL
  1327.  
  1328.         SOM_ENDTRY
  1329.  
  1330.         _fIterationInProgress = kODFalse;
  1331. }
  1332.