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 / Messaging / DfltAcs.cpp next >
Encoding:
Text File  |  1996-04-22  |  55.3 KB  |  1,876 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        DfltAcs.cpp
  3.  
  4.     Contains:    Implementation of Mac specific default accessors and handlers.
  5.  
  6.     Owned by:    Eric House
  7.  
  8.     Copyright:    © 1995 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.         <57>    25/09/95    NP        1979071: Check results of operator new.
  13.         <56>     9/12/95    JP        1280292 & 1283803: Add Part to Send
  14.         <55>     9/11/95    JP        1269048 & 1283405: Use ODGetComments
  15.         <54>     9/11/95    NP        1272294: Messaging code cleanup.
  16.         <53>     8/25/95    JP        1262410: Comments part to frame fallout
  17.         <52>     8/23/95    NP        1276287: Move constant kODAppShell.
  18.         <51>     8/22/95    eeh        1230007: refbal-inspired cleanup
  19.         <50>     8/16/95    eeh        1276765: mostly formatting
  20.         <49>      8/1/95    eeh        1265319: refcount cleanup
  21.         <48>     7/27/95    DM        #1270320: mem leaks: use Temp Objs in
  22.                                     GetPartFromNULL
  23.         <47>     7/27/95    eeh        1243351: handle pIndex property
  24.         <46>     7/21/95    eeh        1262143: call ODDisposeAppleEvent
  25.         <45>     7/18/95    eeh        1262143: memory leaks; 1267932: SOM call on
  26.                                     disposed object
  27.         <44>      7/5/95    NP        1265196: Wrap CreateEmbeddedFramesIterator
  28.                                     call with exception handling.
  29.         <43>      7/5/95    NP        1265125: Initialize local variable.
  30.         <42>      7/3/95    eeh        1264701: remove WARN; shouldn't be there
  31.                                     anyway
  32.         <41>     6/30/95    JP        Refcounting foo
  33.         <40>     6/29/95    DM        1242642 BB: refcounting: release parent
  34.                                     frame in HandleGetDataInternal()
  35.         <39>     6/28/95    eeh        1262143: dispose AEDescs
  36.         <38>     6/20/95    NP        1260389: Fix DrawPart's count proc
  37.         <37>     6/19/95    eeh        1246443: add PartFrameFromStandardPartToken
  38.                                     etc.
  39.         <36>     6/13/95    JP        Use GetDefaultRootFrameToSwapTo in
  40.                                     GetPartFromNULL
  41.         <35>      6/7/95    eeh        1251403: various refcount changes
  42.         <34>     5/26/95    TJ        Removed contextInfo, and refrences to it.
  43.         <33>     5/26/95    RR        #1251403: Multithreading naming support
  44.         <32>     5/25/95    jpa        Fixed usage of ODDebug. [1253321]
  45.         <31>     5/22/95    eeh        1250831: getdata on part returns objspec
  46.         <30>     5/21/95    NP        1248898: GetUserToken, ODDescToAEDesc, etc.
  47.                                     recipe change.
  48.         <29>     5/18/95    eeh        1250061: make CountEmbeddedFrames
  49.                                     non-static
  50.         <28>     5/17/95    RR        #1250135/1250137/1250143 Getters increment
  51.                                     refcount
  52.         <27>     5/12/95    NP        1237955: Just added a comment here,
  53.                                     actually.
  54.         <26>     5/10/95    JP        1242258: ODSetStationery uses frame instead
  55.                                     of part
  56.         <25>      5/4/95    JP        1238246, 1223529: Change name & icon of
  57.                                     file if root part
  58.         <24>      5/4/95    eeh        1246024: initialize ODFrame* in
  59.                                     HandleSetData
  60.         <23>      5/3/95    NP        1211084: Remove 5$
  61.         <22>     4/29/95    TÇ        1244815 BB: Default Accessors return mod
  62.                                     date when asked for create date
  63.         <21>     4/28/95    eeh        (for eeh) 1243352: implemented GetData for
  64.                                     pContainer
  65.         <20>     4/27/95    TÇ        1223529 BB: ODSetPOName and ODSetIconFamily
  66.                                     should tweak file in root part case (Did
  67.                                     name piece)
  68.         <19>     4/25/95    NP        1186795, 1237220, 1240571: Fixed whose
  69.                                     clauses by allowing swapping in count proc.
  70.         <18>     4/25/95    JP        1192027, 1238519: Added properties and
  71.                                     fixed icon & category
  72.         <17>     4/14/95    TÇ        #1235279 BB: InfoUtil & StdTypIO functions
  73.                                     should take Environment* and SU* when
  74.                                     possible
  75.         <16>     4/14/95    NP        1239651: Include SEPriv.h. Private
  76.                                     constants were moved around.
  77.         <15>      4/7/95    eeh        1236842: added TrySwapToRootPart
  78.         <14>      4/7/95    eeh        1233878: fixed memory leak
  79.         <13>     3/24/95    eeh        1230185: check for null results and errors
  80.         <12>     3/21/95    JP        1192027: Include ODRgstry & change some
  81.                                     constant names
  82.         <11>     3/20/95    NP        1225985: Change API of CreateSwapToken.
  83.         <10>     3/15/95    eeh        1227456: swap when root part should be
  84.                                     equivalent to the document
  85.          <9>     3/13/95    NP        1223764: CreateSwapToken should take an
  86.                                     ODFrame* parameter. Add frame param to
  87.                                     DEFAULT_ACCESSOR_PARAMS.
  88.          <8>      3/2/95    eeh        1214783: finish work on lists
  89.          <7>     2/22/95    eeh        1214783: work on lists; 1222901:
  90.                                     StandardPartToken
  91.          <6>     2/21/95    eeh        1214783: work on lists and on getting by ID
  92.                                     and name
  93.          <5>     2/13/95    eeh        1214783: more work on Get/SetData handlers
  94.          <4>      2/3/95    eeh        1217393: use new ODDesc etc; 1214783:
  95.                                     implement Get/SetData handlers for
  96.                                     part/frame info
  97.          <3>     1/27/95    NP        1213948: Fix object accessors and event
  98.                                     handlers.
  99.          <2>     1/25/95    eeh        1214783: more implementation
  100.          <1>      1/18/95    eeh        first checked in
  101.  
  102.     To Do:
  103.     In Progress:
  104.         
  105. */
  106.  
  107.  
  108. #ifndef _DFLTACS_
  109. #include <DfltAcs.h>
  110. #endif
  111.  
  112. #ifndef _INFOUTIL_
  113. #include <InfoUtil.h>
  114. #endif
  115.  
  116. #ifndef _ODDESUTL_
  117. #include <ODDesUtl.h>
  118. #endif
  119.  
  120. #ifndef _EDITRSET_
  121. #include "EditrSet.h"
  122. #endif
  123.  
  124. #ifndef SOM_ODAppleEvent_xh
  125. #include "ODAplEvt.xh"
  126. #endif
  127.  
  128. #ifndef SOM_ODAddressDesc_xh
  129. #include "ODAdrDes.xh"
  130. #endif
  131.  
  132. #ifndef SOM_ODOSLToken_xh
  133. #include "ODOSLTkn.xh"
  134. #endif
  135.  
  136. #ifndef SOM_ODPart_xh
  137. #include <Part.xh>
  138. #endif
  139.  
  140. #ifndef SOM_ODPartWrapper_xh
  141. #include <PartWrap.xh>
  142. #endif
  143.  
  144. #ifndef __AEPACKOBJECT__
  145. #include <AEPackObject.h>
  146. #endif
  147.  
  148. #ifndef _BNDNSUTL_
  149. #include <BndNSUtl.h>
  150. #endif
  151.  
  152. #ifndef SOM_ODEmbeddedFramesIterator_xh
  153. #include <EmbFrItr.xh>
  154. #endif
  155.  
  156. #ifndef _SIHELPER_
  157. #include <SIHelper.h>
  158. #endif
  159.  
  160. #ifndef _SEUTILS_
  161. #include <SEUtils.h>
  162. #endif
  163.  
  164. #ifndef _SEPRIV_
  165. #include "SEPriv.h"
  166. #endif
  167.  
  168. #ifndef _BARRAY_
  169. #include "BArray.h"
  170. #endif
  171.  
  172. #ifndef _TEMPOBJ_
  173. #include "TempObj.h"
  174. #endif
  175.  
  176. #ifndef SOM_DefaultAccessorSI_xh
  177. #include <MssgSI.xh>
  178. #endif
  179.  
  180. #ifndef SOM_ODNameResolver_xh
  181. #include <NamRslvr.xh>
  182. #endif
  183.  
  184. #ifndef SOM_ODMessageInterface_xh
  185. #include <MssgIntf.xh>
  186. #endif
  187.  
  188. #ifndef SOM_ODWindowState_xh
  189. #include <WinStat.xh>
  190. #endif
  191.  
  192. #ifndef SOM_Module_OpenDoc_StdDefs_defined
  193. #include <StdDefs.xh>
  194. #endif
  195.  
  196. #ifndef __AEOBJECTS__
  197. #include <AEObjects.h>
  198. #endif
  199.  
  200. #ifndef __AEREGISTRY__
  201. #include <AERegistry.h>
  202. #endif
  203.  
  204. #ifndef __OSA__
  205. #include <OSA.h>
  206. #endif
  207.  
  208. #ifndef SOM_Module_OpenDoc_ODRegistry_defined
  209. #include "ODRgstry.xh"
  210. #endif
  211.  
  212. #ifndef __ICONS__
  213. #include <Icons.h>
  214. #endif
  215.  
  216. #pragma segment DefaultAccessors
  217.  
  218. //==============================================================================
  219. // typedefs
  220. //==============================================================================
  221.  
  222. typedef ODError (*InternalHandler)(    Environment *ev,
  223.                                 ODPart* thePart,
  224.                                 ODAppleEvent* message,
  225.                                 ODAppleEvent* reply,
  226.                                 ODSession* session,
  227.                                 AEDesc* directParam,
  228.                                 ODFrame*    frame);
  229.  
  230. //==============================================================================
  231. // Function prototypes
  232. //==============================================================================
  233.  
  234. static void GetDirectParam(ODSession* session, ODAppleEvent* message,
  235.         AEDesc* evtDp);
  236.  
  237. // WE SHOULD AT LEAST HAVE THIS IN A PRIVATE SHARED HEADER.
  238. extern ODFrame* FrameFromContext(OSLContext* context);    // <eeh> ask Nick
  239. static DescType ViewTypetoViewEnum( Environment *ev, ODSession* session,
  240.         ODTypeToken viewType );
  241. static ODTypeToken GetViewTypeFromEnum( Environment *ev, ODSession* session,
  242.         DescType viewEnum );
  243. static ODIText* ITextFromIntlDesc( AEDesc* desc );
  244. static ODError GetEditorFromString(Environment* ev, ODEditor* editor, AEDesc* desc, ODPart* part,
  245.         ODNameSpaceManager* nsm );
  246. static ODIconFamily IfamToIconSuite(AERecord* ifam);
  247. static ODError IconSuiteToIfam( Handle iconSuite, AEDesc* result );
  248. static OSErr CreateObjSpecForFrame( Environment *ev, ODFrame* frame,
  249.         AEDesc* result );
  250. static void AddODOSLTokenToList( ODOSLToken* newToken, ODUShort index,
  251.         AEDesc* list );
  252. static ODOSLToken* DescToODOSLToken( Environment* ev, ODNameResolver* resolver,
  253.         AEDesc* frameDesc, ODOSLToken* tokenToCopy );
  254. //static ODError CreateListInValue( Environment* ev, ODNameResolver* resolver,
  255. //        ODOSLToken* value, AEDesc* list );
  256. extern void NewODToken(ODNameResolver* me, ODOSLToken* openDocToken,
  257.         ODPart* part, OSLToken* newToken);
  258. static ODError HandleEventsForList( Environment *ev,
  259.                                 ODPart* thePart,
  260.                                 ODAppleEvent* message,
  261.                                 ODRecord* reply,
  262.                                 ODSession* session,
  263.                                 AERecord* realToken,
  264.                                 InternalHandler handler );
  265. static ODError HandleGetDataInternal(    Environment *ev, ODPart* thePart,
  266.         ODAppleEvent* message, ODAppleEvent* reply, ODSession* session,
  267.         AEDesc* directParam, ODFrame* frame );
  268. static ODError HandleSetDataInternal(    Environment *ev, ODPart* thePart,
  269.         ODAppleEvent* message, ODAppleEvent* reply, ODSession* session,
  270.         AEDesc* directParam, ODFrame* frame );
  271. static void PutFrameInValue( Environment* ev, ODNameResolver* resolver,
  272.         ODOSLToken* value, ODFrame* frame );
  273. static ODBoolean ITextEqual( ODIText* name1, ODIText* name2 );
  274. static ODFrame* AcquireFrameWithName( Environment* ev, ODFrame* startFrame,
  275.         ODIText* name );
  276. static ODBoolean PartIsContained( Environment* ev, ODFrame* testee,
  277.     ODFrame* container );
  278. static OSErr IndexForFrame( Environment *ev, ODFrame* frame, ODULong* result );
  279. static ODError SwapToRootPart( Environment *ev, ODSession* session,
  280.         ODOSLToken* value);
  281. static ODPersistentObjectID GetIDForFrame( Environment* ev, ODFrame* frame );
  282. // static void CopyNonDPParams( ODAppleEvent* message, ODAppleEvent* newMessage );
  283.  
  284. void ODDuplicateEvent( ODAppleEvent* scrDesc, ODAppleEvent** destDesc );
  285. void ODPutParamDesc( ODAppleEvent* odaevt, DescType keyword, AEDesc* desc );
  286. void ODPutParamDesc( ODAppleEvent* odaevt, DescType keyword, ODDesc* desc );
  287. void ODGetParamDesc( ODAppleEvent* odaevt, DescType keyword, DescType typeSought,
  288.         AEDesc* desc );
  289. void ODGetParamDesc( ODAppleEvent* odaevt, DescType keyword, DescType typeSought,
  290.         ODDesc** desc );
  291. void ODPutAttributeDesc( ODAppleEvent* message, AEKeyword key, ODDesc* desc );
  292. void ODGetAttributePtr( ODAppleEvent *appleEvent, AEKeyword theAEKeyword,
  293.         DescType desiredType, DescType *typeCode, void *dataPtr,
  294.         Size maximumSize, Size *actualSize);
  295.  
  296. #if ODDebug
  297. void PukeIfFrameNULL( ODFrame* frame );
  298. #else
  299. #define PukeIfFrameNULL(frame)
  300. #endif
  301.  
  302. //==============================================================================
  303. // Object Accessor functions
  304. //==============================================================================
  305.  
  306. //------------------------------------------------------------------------------
  307. // GetWildcardFromPart
  308. //------------------------------------------------------------------------------
  309.  
  310. ODError GetWildcardFromPart(DEFAULT_ACCESSOR_PARAMS)
  311. {    
  312.     ODError result;
  313.     TRY
  314.         ODPart* part;
  315.         ODFrame* frame;
  316.         PartFrameFromStandardPartToken( container, &part, &frame );
  317.         ASSERT_FRAME_MATCHES_PART( ev, frame, part );
  318.         session->GetNameResolver(ev)->CreateSwapToken(ev, value, part, frame );
  319.         result = noErr;
  320.     CATCH_ALL
  321.         result = errAENoSuchObject;
  322.     ENDTRY
  323.     return result;
  324. }
  325.  
  326. //------------------------------------------------------------------------------
  327. // TrySwapToRootPart
  328. //------------------------------------------------------------------------------
  329.  
  330. ODError TrySwapToRootPart(DEFAULT_ACCESSOR_PARAMS)
  331. {
  332.     WASSERT( !scriptlessPart );
  333.     return SwapToRootPart( ev, session, value );
  334. }
  335.  
  336. //------------------------------------------------------------------------------
  337. // GetPropFromNULL
  338. //------------------------------------------------------------------------------
  339.  
  340. ODError GetPropFromNULL(DEFAULT_ACCESSOR_PARAMS)
  341. {
  342.     ODError result = noErr ;
  343.     ODNameResolver* resolver = session->GetNameResolver(ev);
  344.  
  345.     TRY
  346.         if ( (!resolver->IsODToken( ev, value )) || (form != formPropertyID) )
  347.             THROW( errAENoSuchObject );
  348.     
  349.         if ( scriptlessPart == kODAppShell )
  350.             return SwapToRootPart( ev, session, value );
  351.  
  352.         AEDesc realSelData;
  353.         THROW_IF_ERROR( ODDescToAEDesc(selectionData, &realSelData ));
  354.         TempAEDesc tmpDesc(&realSelData);
  355.     
  356.         switch ( FIRSTBYTESFROMHANDLE(realSelData.dataHandle, DescType) )
  357.         {    
  358.             case pName:
  359.             case pComment:
  360.             case pAuthor:
  361.             case pKind:
  362.             case pEditorName:
  363.             case pBundled:
  364.             case pStationery:
  365.             case pShowLinks:
  366.             case pASCreationDate:
  367.             case pASModificationDate:
  368.             case pSize:
  369.             case pUniqueID:
  370.             case pIcon:
  371.             case pViewType:
  372.             case pContainer:
  373.             case pCategory:
  374.             case pClass:
  375.             case pDefaultType:
  376.             case pBestType:
  377.             case pIndex:
  378.                 break;
  379.             default:
  380.                 result = errAENoSuchObject;
  381.         }
  382.     
  383.         if ( !result )
  384.         {
  385.             ODDesc* userTokenAsODDesc = resolver->GetUserToken(ev, value);
  386.             THROW_IF_ERROR( AEDescToODDesc( &realSelData, userTokenAsODDesc ));
  387.             userTokenAsODDesc->SetDescType(ev, cProperty);
  388.         }
  389.     
  390.     CATCH_ALL
  391.         result = ErrorCode();
  392.     ENDTRY
  393.  
  394. //    AEDisposeDesc( &realSelData );
  395.     return result;
  396. }
  397.  
  398. //------------------------------------------------------------------------------
  399. // GetWildcardFromList
  400. //------------------------------------------------------------------------------
  401.  
  402. ODError GetWildcardFromList(DEFAULT_ACCESSOR_PARAMS)
  403. {
  404.     ODNameResolver* resolver = session->GetNameResolver(ev);
  405.     ODError error = noErr;
  406.  
  407.     AEDesc newList;
  408.     THROW_IF_ERROR( AECreateList( kODNULL, 0, kODFalse, &newList ) );
  409.     TempAEDesc tmpList( &newList );
  410. //    THROW_IF_ERROR( CreateListInValue( ev, resolver, value,
  411. //            &newList ) );
  412.  
  413.     ODSLong count;
  414.     THROW_IF_ERROR( AECountItems( container, &count ) );
  415.     for ( ODUShort index = 1; index <= count; ++index )
  416.     {
  417.         AEDesc        oneContainer;
  418.         DescType    containerDescType;
  419.  
  420.         THROW_IF_ERROR( AEGetNthDesc( container, index, typeWildCard,
  421.                 &containerDescType, &oneContainer ) );
  422.         TempAEDesc tmpDesc( &oneContainer );
  423.  
  424.         ODOSLToken* containerWrapper = new ODOSLToken();
  425.         THROW_IF_NULL(containerWrapper);
  426.         TempODObject tmpObj(containerWrapper);
  427.         containerWrapper->InitODOSLToken(ev);
  428.         THROW_IF_ERROR( AEDescToODDesc( &oneContainer, containerWrapper ) );
  429.         
  430.         if ( !resolver->IsODToken( ev, containerWrapper ) )
  431.         {
  432.             error = errAENoSuchObject;
  433.             break;
  434.         }
  435.  
  436.         ODOSLToken* newValue = value->DuplicateODOSLToken(ev);
  437.         TempODObject tmpObj2(newValue);
  438.         
  439.         resolver->CallObjectAccessor(ev, scriptlessPart, desiredClass,
  440.                 containerWrapper, containerClass, form, selectionData,
  441.                 newValue );
  442.  
  443.         AddODOSLTokenToList( newValue, index, &newList );
  444.  
  445. //        ODDeleteObject(newValue);
  446. //        ODDeleteObject(containerWrapper);
  447.  
  448. //        (void)AEDisposeDesc( &oneContainer );
  449.     }
  450.  
  451.     ODDesc* userODToken = resolver->GetUserToken(ev, value);
  452.     AEDescToODDesc(&newList, userODToken);
  453. //    (void)AEDisposeDesc( &newList );
  454.  
  455.     return error;
  456. }    // GetWildcardFromList()
  457.  
  458. //------------------------------------------------------------------------------
  459. // GetPartFromNULL
  460. //------------------------------------------------------------------------------
  461.  
  462. ODError GetPartFromNULL(DEFAULT_ACCESSOR_PARAMS)
  463. {
  464.     ODUnused(desiredClass);
  465.     ODUnused(container);
  466.     ODUnused(containerClass);
  467.  
  468.     ODNameResolver*        resolver = session->GetNameResolver(ev);
  469.     ODUShort             i;
  470.     ODError                error = noErr;
  471.  
  472.     if( !resolver->IsODToken( ev, value ) )
  473.         return errAENoSuchObject;
  474.     
  475.     AEDesc coercedSelData = NULL_DESCRIPTOR_DEFINITION;
  476.  
  477.     TRY
  478.  
  479.     ODFrame* containingFrame;
  480.     ODPart* ignorePart;
  481.     resolver->GetContextFromToken(ev, value, &ignorePart, &containingFrame);
  482.  
  483.     PRINT("containingFrame = %ld", containingFrame);
  484.     AEDesc realSelData;
  485.     THROW_IF_ERROR( ODDescToAEDesc(selectionData, &realSelData ));
  486.     TempAEDesc tmpSelData(&realSelData);
  487.  
  488.     switch (form)
  489.     {
  490.         case formName:
  491.         {
  492.             TempODFrame resultFrame = kODNULL;
  493.             THROW_IF_ERROR( AECoerceDesc( &realSelData, typeIntlText,
  494.                     &coercedSelData ) );
  495.             TempODIText name = ITextFromIntlDesc( &coercedSelData );
  496.             AEDisposeDesc( &coercedSelData );
  497.  
  498.             if ( !containingFrame )
  499.             {
  500.                 containingFrame =  GetDefaultRootFrameToSwapTo(ev, session);
  501. //                ODWindow* odWindow = session->GetWindowState(ev)->AcquireFrontRootWindow(ev);
  502. //                containingFrame = odWindow->GetRootFrame(ev);
  503. //                ODReleaseObject(ev, odWindow);
  504.                 TempODIText rootName = ODGetPartName(ev, containingFrame,
  505.                         kODNULL);
  506.                 if ( ITextEqual( rootName, name ) )
  507.                     resultFrame = containingFrame ;
  508.             }
  509.             if ( !resultFrame )
  510.                 resultFrame = AcquireFrameWithName( ev, containingFrame, name );
  511.             PutFrameInValue( ev, resolver, value, resultFrame );
  512. //            ODReleaseObject(ev, resultFrame);
  513.             break;
  514.         }
  515.             
  516.         case formUniqueID:
  517.         {
  518.             THROW_IF_ERROR( AECoerceDesc( &realSelData, typeLongInteger,
  519.                     &coercedSelData ) );
  520.             ODPersistentObjectID objectID = FIRSTBYTESFROMHANDLE(
  521.                     coercedSelData.dataHandle, ODPersistentObjectID );
  522.             AEDisposeDesc( &coercedSelData );
  523.  
  524.             ODStorageUnit* su = (containingFrame ? containingFrame : 
  525.                     GetDefaultRootFrameToSwapTo(ev, session))->
  526.                     GetStorageUnit(ev);
  527.             WASSERT(su);
  528.             ODDraft* draft = su->GetDraft(ev);
  529.             ODObjectType objectType;
  530.             TempODFrame thisFrame = (ODFrame*)draft->AcquirePersistentObject(
  531.                     ev, objectID, &objectType);
  532.             TempODObjectType tempObjectType(objectType); // ensure deletion
  533.             
  534.             if ( !thisFrame || (strcmp( kODFrameObject, objectType ) != 0)
  535.                     || (!PartIsContained( ev, thisFrame, containingFrame )) )
  536.                 THROW(errAENoSuchObject);    // $$$$$ This could leak a reference?
  537.             PutFrameInValue( ev, resolver, value, thisFrame );
  538. //            ODReleaseObject(ev, tmpFrame);
  539.         }    break;
  540.  
  541.         case formAbsolutePosition:
  542.         {
  543.             // if the containing part is null, we substitute the root part
  544.             // by doing a swap.  Note that we do this *only* in the case of
  545.             // formAbsolutePosition, because in the others we need to avoid
  546.             // implicit "root part of root part" object specifiers.
  547.             
  548.             if ( scriptlessPart == kODAppShell )
  549.             {
  550.                 error = SwapToRootPart( ev, session, value );
  551.                 break;
  552.             }
  553.  
  554.             // Are we being asked for an indexed part
  555.             // or for all parts?
  556.             ODSLong theIndex;
  557.             ODBoolean allFlag;
  558.             ODBoolean zeroFlag;
  559.  
  560.             ODSLong partCount = CountEmbeddedParts(ev, scriptlessPart);
  561.             error = DecodeOrdinal( realSelData, (long)partCount, 
  562.                             (long*)&theIndex, (Boolean*)&allFlag, (Boolean*)&zeroFlag);
  563.             THROW_IF_ERROR(error);
  564.             
  565.             ODEmbeddedFramesIterator* iter = kODNULL;
  566.             if ( scriptlessPart != kODAppShell )
  567.                 iter = scriptlessPart->CreateEmbeddedFramesIterator(ev, kODNULL);
  568.             if ( allFlag )
  569.             {
  570.                 AEDesc listOfTokens;
  571.                 THROW_IF_ERROR( AECreateList( kODNULL, 0, kODFalse,
  572.                         &listOfTokens ) );
  573.                 TempAEDesc tmpDesc( &listOfTokens );
  574. //                error = CreateListInValue( ev, resolver, value, &listOfTokens );
  575. //                THROW_IF_ERROR(error);
  576.  
  577.                 // Get theEmbeddedPart number theIndex
  578.                 for (containingFrame = iter->First(ev), i=1; iter->IsNotComplete(ev);
  579.                         containingFrame = iter->Next(ev), i++)
  580.                 {    
  581.                     if (containingFrame)
  582.                     {
  583.                         AEDesc frameDesc;
  584.                         TempODPart    part = containingFrame->AcquirePart(ev);
  585.                         THROW_IF_ERROR( CreateStandardPartToken(containingFrame,
  586.                                 part, &frameDesc ) );
  587.  
  588.                         ODOSLToken* newValue = DescToODOSLToken(ev,
  589.                                 resolver, &frameDesc, value );
  590.                         (void)AEDisposeDesc(&frameDesc);
  591.                         AddODOSLTokenToList( newValue, i, &listOfTokens );
  592.                         ODDeleteObject( newValue );
  593.                     }
  594.                 }
  595.  
  596.                 ODDesc*    userTokenODDesc = resolver->GetUserToken( ev, value );
  597.                 THROW_IF_ERROR(AEDescToODDesc(&listOfTokens, userTokenODDesc));
  598.  
  599. //                AEDisposeDesc(&listOfTokens);
  600.             }
  601.             else
  602.             {
  603.                 // Get theEmbeddedPart number theIndex
  604.                 for (containingFrame = iter->First(ev), i=1; iter->IsNotComplete(ev);
  605.                         containingFrame = iter->Next(ev), i++)
  606.                 {    
  607.                     if (i == theIndex)
  608.                         break;
  609.                 }
  610.                 
  611.                 PutFrameInValue( ev, resolver, value, containingFrame );
  612.             }
  613.             ODDeleteObject(iter);
  614.             break;
  615.         }
  616.         default:
  617.             THROW(errAENoSuchObject);
  618.             break;
  619.     }
  620.         
  621.     
  622.     CATCH_ALL
  623.     error = ErrorCode();
  624.     ENDTRY
  625.     
  626. //    (void)AEDisposeDesc( &realSelData );
  627.     return error;
  628. }
  629.  
  630. //==============================================================================
  631. // Event Handler functions
  632. //==============================================================================
  633.  
  634. //------------------------------------------------------------------------------
  635. // HandleGetData
  636. //------------------------------------------------------------------------------
  637.  
  638. ODError HandleGetData(    Environment *ev,
  639.                         ODPart* thePart,
  640.                         ODAppleEvent* message,
  641.                         ODAppleEvent* reply,
  642.                         ODSession* session)
  643. {
  644.     ODError            error = noErr;
  645.     ODNameResolver*    resolver = session->GetNameResolver(ev);
  646.  
  647.     OSLToken evtDp;
  648.     GetDirectParam( session, message, &evtDp );
  649.     TempAEDesc tmpDesc(&evtDp);
  650.  
  651.     ODOSLToken* tmpWrapper = new ODOSLToken();
  652.     THROW_IF_NULL(tmpWrapper);
  653.     TempODObject tmpObj(tmpWrapper);
  654.     tmpWrapper->InitODOSLToken(ev);
  655.     THROW_IF_ERROR( AEDescToODDesc(&evtDp, tmpWrapper ) );
  656.  
  657.     ODPart* ignorePart;
  658.     ODFrame* frame;
  659.     resolver->GetContextFromToken(ev, tmpWrapper, &ignorePart, &frame);
  660.  
  661.     ODDesc* myToken;
  662.     myToken = resolver->GetUserToken(ev, tmpWrapper);
  663.     AEDesc realToken;
  664.     THROW_IF_ERROR( ODDescToAEDesc(myToken, &realToken) );
  665.  
  666.     error = HandleGetDataInternal( ev, thePart, message, reply,
  667.             session, &realToken, frame );
  668.  
  669.     AEDisposeDesc(&realToken);
  670. //    AEDisposeDesc(&evtDp);
  671.  
  672. //    ODDeleteObject(tmpWrapper);
  673.     return error;
  674. }
  675.  
  676. //------------------------------------------------------------------------------
  677. // PukeIfFrameNULL
  678. //------------------------------------------------------------------------------
  679.  
  680. #if ODDebug
  681. void PukeIfFrameNULL( ODFrame* frame )
  682. {
  683.     if ( !frame )
  684.     {
  685.         WARN( "frame is null; throwing errAEEventNotHandled." );
  686.         THROW( errAEEventNotHandled );
  687.     }
  688. }
  689. #endif
  690.  
  691. ODError HandleGetDataInternal(    Environment *ev,
  692.                                 ODPart* thePart,
  693.                                 ODAppleEvent* message,
  694.                                 ODAppleEvent* reply,
  695.                                 ODSession* session,
  696.                                 AEDesc* directParam,
  697.                                 ODFrame*    frame)
  698. {
  699.     ODError err = noErr;
  700.  
  701.     if ( directParam->descriptorType == typeAEList )
  702.     {
  703.         err = HandleEventsForList( ev, thePart, message, reply,
  704.                 session, directParam, HandleGetDataInternal );
  705.     }
  706.     else
  707.     {
  708.         if ( !thePart )
  709.             return errAEEventNotHandled;
  710.  
  711.         AEDesc result = NULL_DESCRIPTOR_DEFINITION;
  712.  
  713.         // find out what type was requested
  714.         // e.g. get foo as alias
  715.         DescType    desiredType, theType;
  716.         long        theSize;
  717.         AppleEvent    theMessage;
  718.         THROW_IF_ERROR( ODDescToAEDesc(message, &theMessage) );
  719.         err = AEGetParamPtr( &theMessage, keyAERequestedType, typeType,
  720.                 &theType, &desiredType, sizeof(desiredType), &theSize );
  721.         ODDisposeAppleEvent(&theMessage);
  722.         if ( err != noErr )
  723.             desiredType = typeWildCard;
  724.  
  725.         switch( directParam->descriptorType )
  726.         {
  727.             case cPart:
  728.                 err = CreateObjSpecForFrame( ev,
  729.                         FrameFromStandardPartToken(directParam), &result );
  730.                 break;
  731.  
  732.             case cProperty:
  733.             {
  734.                 ODBoolean boolResult;
  735.                 ODIText* itext = kODNULL;
  736.         
  737.                 ODStorageUnit* partSU = ODGetSUFromPstObj(ev, thePart);
  738.                 
  739.                 DescType property = FIRSTBYTESFROMHANDLE( directParam->dataHandle,
  740.                         DescType );
  741.                 
  742.                 switch( property )
  743.                 {
  744.                     // text properties
  745.                     case pName:
  746.                     case pComment:
  747.                     case pAuthor:
  748.                     case pKind:
  749.                     case pEditorName:
  750.                     case pCategory:
  751.                     {
  752.                         ODBoolean okToDispose = kODTrue;
  753.                         if ( property == pName )
  754.                             itext = ODGetPartName(ev, frame, kODNULL );
  755.                         else if ( property == pComment )
  756.                         {
  757.                             itext = ODGetComments(ev, frame, kODNULL );
  758.                             if ( !itext )
  759.                             {
  760.                                 // script and language code don't matter here; stripped below
  761.                                 itext = CreateITextCString( 0, 0, "" );
  762.                                 okToDispose = kODTrue;
  763.                             }
  764.                         }
  765.                         else if ( property == pCategory )
  766.                             itext = ODGetCategory(ev, thePart, session->GetNameSpaceManager(ev) );
  767.                         else if ( property == pAuthor )
  768.                             itext = ODGetModifiedBy(ev, partSU, kODNULL );
  769.                         else if ( property == pKind )
  770.                         {
  771.                             ODType theType = ODGetKind(ev, thePart );
  772.                             okToDispose = !GetUserKindFromKind(
  773.                                     session->GetNameSpaceManager(ev), theType, &itext );
  774.                         }
  775.                         else if ( property == pEditorName )
  776.                         {
  777.                             ODEditor editor = ((ODPartWrapper*)thePart)->GetEditor(ev);
  778.                             okToDispose = !GetUserEditorFromEditor(
  779.                                     session->GetNameSpaceManager(ev), editor, &itext );
  780.                         }
  781.             
  782.                         if ( itext )
  783.                         {
  784.                             err = AECreateDesc( typeChar, GetITextPtr( itext ),
  785.                                     GetITextStringLength( itext ), &result );
  786.                             if ( okToDispose )
  787.                                 DisposeIText(itext);
  788.                         }
  789.                         else
  790.                             err = errAEEventNotHandled;
  791.                         break;
  792.                     }
  793.                     
  794.                     // type properties
  795.                     case pClass:
  796.                     case pDefaultType:
  797.                     case pBestType:
  798.                     {
  799.                         DescType theType = cObjectSpecifier;
  800.                         if (property == pClass)
  801.                             theType = cPart;
  802.                         err = AECreateDesc(typeType, &theType, sizeof(theType), &result);
  803.                         break;
  804.                     }
  805.                     
  806.                     // boolean properties
  807.                     case pBundled:
  808.                     case pStationery:
  809.                     case pShowLinks:
  810.                     {
  811.                         if ( property == pBundled )
  812.                         {
  813.                             PukeIfFrameNULL( frame );
  814.                             ASSERT_FRAME_MATCHES_PART( ev, frame, thePart );
  815.                             boolResult = frame->IsFrozen(ev);
  816.                         }
  817.                         else if ( property == pStationery )
  818.                             boolResult = ODGetIsStationery(ev, frame);
  819.                         else // if ( property == pShowLinks )
  820.                         {
  821.                             PukeIfFrameNULL( frame );
  822.                             TempODWindow window = frame->AcquireWindow(ev);
  823.                             boolResult = window->ShouldShowLinks(ev);
  824. //                            ODReleaseObject( ev, window );
  825.                         }
  826.                         
  827.                         err = AECreateDesc(typeBoolean, &boolResult, sizeof(boolResult),
  828.                                 &result );
  829.                         break;
  830.                     }
  831.                     
  832.                     // date properties
  833.                     case pASCreationDate:
  834.                     case pASModificationDate:
  835.                     {
  836.                         long theDate[2];
  837.                         
  838.                         theDate[0] = 0;
  839.                         if ( property == pASCreationDate )
  840.                             theDate[1] = ODGetCreationDate(ev, partSU);
  841.                         else // if ( property == pASModificationDate )
  842.                             theDate[1] = ODGetModificationDate(ev, partSU);
  843.                         err = AECreateDesc(typeLongDateTime, &theDate, sizeof(theDate), &result);
  844.                         break;
  845.                     }
  846.                     
  847.                     case pSize:
  848.                     {
  849.                         ODULong longResult = ODGetPOSize(ev, thePart );
  850.                         err = AECreateDesc(typeLongInteger, &longResult,
  851.                                 sizeof(longResult), &result );
  852.                         break;
  853.                     }
  854.                     
  855.                     case pUniqueID:
  856.                     {
  857.                         PukeIfFrameNULL( frame );
  858.                         ODPersistentObjectID id = GetIDForFrame( ev, frame );
  859.                         err = AECreateDesc(typeLongInteger, &id,
  860.                                 sizeof(id), &result );
  861.                         break;
  862.                     }
  863.                     
  864.                     case pIndex:
  865.                         PukeIfFrameNULL( frame );
  866.                         ODULong index;
  867.                         err = IndexForFrame( ev, frame, &index );
  868.                         if ( err == noErr )
  869.                             err = AECreateDesc( typeLongInteger, &index,
  870.                                     sizeof(index), &result );
  871.                         break;
  872.  
  873.                     case pIcon:
  874.                     {
  875.                         ODIconFamily iconFamily = ODGetIconFamily(ev, frame );
  876.                         err = IconSuiteToIfam( iconFamily, &result );
  877.                         break;
  878.                     }
  879.             
  880.                     case pViewType:
  881.                     {
  882.                         PukeIfFrameNULL( frame );
  883.                         DescType type = ViewTypetoViewEnum( ev, session,
  884.                                 frame->GetViewType(ev) ) ;
  885.                         err = AECreateDesc(typeEnumeration, &type,
  886.                                 sizeof(type), &result );
  887.                         break;
  888.                     }
  889.         
  890.                     case pContainer:
  891.                     {
  892.                         PukeIfFrameNULL( frame );
  893.                         { TempODFrame parentFrame = frame->AcquireContainingFrame(ev); // DMc refcount - make temp
  894.                           // DMc - I carefully checked that CreateObjSpecForFrame() does not consume this ref.
  895.                           err = parentFrame ?
  896.                                 CreateObjSpecForFrame(ev, parentFrame, &result)
  897.                                 : errAENoSuchObject;
  898.                         }
  899.                         break;
  900.                     }
  901.                     default:
  902.                         err = errAEEventNotHandled;
  903.                 }
  904.                 break;    // case cProperty:
  905.             }
  906.             default:
  907.                 err = errAEEventNotHandled;
  908.         }
  909.         
  910.         if ( !err )
  911.         {
  912.             if (desiredType != typeWildCard && desiredType != result.descriptorType)
  913.             {
  914.                 AEDesc    newDesc;
  915.                 err = AECoerceDesc(&result, desiredType, &newDesc);
  916.                 if (err != noErr)
  917.                 {
  918.                     // we can't coerce to the desiredType, so we provide a decent
  919.                     // error message and throw the error
  920.                     AppleEvent    replyAsAEDesc;
  921.                     THROW_IF_ERROR( ODDescToAEDesc(reply, &replyAsAEDesc) );
  922.                     THROW_IF_ERROR( AEPutParamPtr(&replyAsAEDesc, kOSAErrorExpectedType, typeType,
  923.                                 &desiredType, sizeof(desiredType)) );
  924.                     THROW_IF_ERROR( AEDescToODDesc(&replyAsAEDesc, reply) );
  925.                     ODDisposeAppleEvent(&replyAsAEDesc);
  926.                     THROW(err);
  927.                 }
  928.                 
  929.             }    
  930.         }
  931.  
  932.         if ( !err )
  933.         {
  934.             ODPutParamDesc( reply, keyDirectObject, &result );
  935.             AEDisposeDesc( &result );
  936.         }
  937.  
  938.     }
  939.     return err;
  940. }    // HandleGetDataInternal
  941.  
  942. //------------------------------------------------------------------------------
  943. // HandleEventsForList
  944. //------------------------------------------------------------------------------
  945.  
  946. static ODError HandleEventsForList( Environment *ev,
  947.                                 ODPart* thePart,
  948.                                 ODAppleEvent* message,
  949.                                 ODRecord* reply,
  950.                                 ODSession* session,
  951.                                 AERecord* realToken,
  952.                                 InternalHandler handler )
  953. {
  954.     ODError err = noErr;
  955.     AERecord fakeReply;
  956.     AERecord listOTokens;
  957.     
  958.     TRY
  959.         if ( reply )
  960.         {
  961.             THROW_IF_ERROR( AECreateList( kODNULL, 0, kODTrue, &fakeReply ) );
  962.             THROW_IF_ERROR( AECreateList( kODNULL, 0, kODFalse, &listOTokens ));
  963.         }
  964.  
  965.         ODSLong count;
  966.         THROW_IF_ERROR( AECountItems( realToken, &count ) );
  967.  
  968.         for ( ODUShort index = 1; index <= count ; ++index )
  969.         {
  970.             AEDesc        oneToken;
  971.             DescType    tokenDescType;
  972.             THROW_IF_ERROR( AEGetNthDesc( realToken, index, typeWildCard,
  973.                     &tokenDescType, &oneToken ) );
  974.             TempAEDesc tmpDesc( &oneToken );
  975.     
  976.             ODMessageInterface* msgIntf = session->GetMessageInterface(ev);
  977.  
  978.             AEEventClass eventClass = (AEEventClass)GetSLongAttrOD(
  979.                     message, keyEventClassAttr);
  980.             AEEventID eventID = (AEEventID)GetSLongAttrOD(
  981.                     message, keyEventIDAttr);
  982.  
  983.             ODAddressDesc* addressDesc;
  984.             msgIntf->CreatePartAddrDesc( ev, &addressDesc, thePart );// <eeh> not the right part <jp> why?  is it now?
  985.             TempODObject tmpObj(addressDesc);
  986.  
  987.             ODAppleEvent* newMessage;
  988.             ODDuplicateEvent( message, &newMessage );
  989.             TempODObject tmpODAEVT(newMessage);
  990.             ODPutAttributeDesc( newMessage, keyAddressAttr, addressDesc );
  991.  
  992.             ODPutParamDesc( newMessage, keyDirectObject, &oneToken );
  993.  
  994.             ODAppleEvent* odreply = new ODAppleEvent();
  995.             THROW_IF_NULL(odreply);
  996.             TempODObject tmpObj2(odreply);
  997.             odreply->InitODAppleEvent(ev);
  998.             
  999.             msgIntf->Send( ev, kODNULL, thePart, newMessage, odreply,
  1000.                     kAEWaitReply | kAECanInteract | kAEDontRecord,
  1001.                     kAENormalPriority,
  1002.                     kAEDefaultTimeout );
  1003.  
  1004.             if ( reply )
  1005.             {
  1006.                 AEDesc oneReplyToken;
  1007.                 ODGetParamDesc( odreply, keyDirectObject, typeWildCard,
  1008.                         &oneReplyToken );
  1009.                 THROW_IF_ERROR(AEPutDesc( &listOTokens, index, &oneReplyToken));
  1010.                 AEDisposeDesc( &oneReplyToken );
  1011.             }
  1012. //            ODDeleteObject( odreply );
  1013. //            ODDeleteObject( addressDesc );
  1014. //            ODDeleteObject( newMessage );
  1015. //            AEDisposeDesc( &oneToken );
  1016.         }
  1017.  
  1018.     CATCH_ALL
  1019.         err = ErrorCode();
  1020.     ENDTRY
  1021.         if ( reply )
  1022.         {
  1023.             if ( !err )
  1024.                 ODPutParamDesc( (ODAppleEvent*)reply, keyDirectObject,
  1025.                         &listOTokens );
  1026.             (void)AEDisposeDesc( &listOTokens );
  1027.             (void)AEDisposeDesc( &fakeReply );
  1028.         }
  1029.  
  1030.     return err;
  1031. }
  1032.  
  1033. //------------------------------------------------------------------------------
  1034. // HandleSetData
  1035. //------------------------------------------------------------------------------
  1036.  
  1037. ODError HandleSetData(    Environment *ev,
  1038.                         ODPart* thePart,
  1039.                         ODAppleEvent* message,
  1040.                         ODAppleEvent* reply,
  1041.                         ODSession* session)
  1042. {
  1043.     ODError error = noErr;
  1044.     ODNameResolver* resolver = session->GetNameResolver(ev);
  1045.  
  1046.     AEDesc evtDp;
  1047.     GetDirectParam( session, message, &evtDp );
  1048.  
  1049.     ODOSLToken* tmpWrapper = new ODOSLToken();
  1050.     THROW_IF_NULL(tmpWrapper);
  1051.     TempODObject tmpObj(tmpWrapper);
  1052.     tmpWrapper->InitODOSLToken(ev);
  1053.     THROW_IF_ERROR( AEDescToODDesc(&evtDp, tmpWrapper ) );
  1054.     (void)AEDisposeDesc( &evtDp );
  1055.  
  1056.     if( resolver->IsODToken(ev, tmpWrapper) )
  1057.     {
  1058.         ODDesc* myToken = resolver->GetUserToken(ev, tmpWrapper);
  1059.         AEDesc realToken;
  1060.         THROW_IF_ERROR( ODDescToAEDesc(myToken, &realToken ) );
  1061.         TempAEDesc tmpDesc(&realToken);
  1062.         
  1063.         ODPart* ignorePart;
  1064.         ODFrame* frame;
  1065.         resolver->GetContextFromToken(ev, tmpWrapper, &ignorePart, &frame);
  1066.     
  1067.         error = HandleSetDataInternal( ev, thePart, message, reply,
  1068.                 session, &realToken, frame );
  1069.     
  1070. //        (void)AEDisposeDesc( &realToken );
  1071.     }
  1072.     else
  1073.         error = errAENoSuchObject;
  1074.  
  1075. //    ODDeleteObject(tmpWrapper);
  1076.  
  1077.     return error;
  1078. }
  1079.  
  1080.  
  1081. //------------------------------------------------------------------------------
  1082. // HandleSetDataInternal
  1083. //------------------------------------------------------------------------------
  1084.  
  1085. ODError HandleSetDataInternal( Environment *ev, ODPart* thePart,
  1086.         ODAppleEvent* message, ODAppleEvent* /*reply*/, ODSession* session,
  1087.         AEDesc* directParam, ODFrame* frame )
  1088. {    
  1089.     ODError error = noErr;
  1090.  
  1091.     if ( directParam->descriptorType == typeAEList )
  1092.     {
  1093.         // SetData for lists provided for testing only!  Will be removed before ship
  1094. #if ODDebug
  1095.         error = HandleEventsForList( ev, thePart, message, kODNULL,    // null for reply
  1096.                 session, directParam, HandleSetDataInternal );
  1097. #else
  1098.         // we don't do destructive things on lists.  There's no way to ensure
  1099.         // that all will succeed before beginning, and managing fewer than
  1100.         // all of them is not acceptable.
  1101.         return errAEEventNotHandled;
  1102. #endif
  1103.     }
  1104.     else
  1105.     {
  1106.         if ( directParam->descriptorType != cProperty )
  1107.             return errAENoSuchObject;
  1108.         
  1109. //        ODFrame* frame = session->GetNameResolver(ev)->AcquireContainingFrame(ev);
  1110.     
  1111.         DescType property = FIRSTBYTESFROMHANDLE( directParam->dataHandle,
  1112.                 DescType );
  1113.     
  1114.         AEDesc dataDesc;
  1115.         ODGetParamDesc( message, keyAEData, typeWildCard, &dataDesc );
  1116.         if ( !error )
  1117.         {
  1118.             AEDesc coercedDataDesc;
  1119.             coercedDataDesc.dataHandle = kODNULL;
  1120.             switch( property )
  1121.             {
  1122.                 // read only properties: this is an error
  1123.                 case pAuthor:
  1124.                 case pSize:
  1125.                 case pASCreationDate:
  1126.                 case pASModificationDate:
  1127.                 case pCategory:
  1128.                 case pKind:
  1129.                 case pUniqueID:
  1130.                 case pContainer:
  1131.                 case pIndex:
  1132.                     // <eeh> is there an error for setting r/o properties?
  1133.                     error = errAEEventNotHandled;
  1134.                     break;
  1135.     
  1136.                 case pName:
  1137.                 case pComment:
  1138.                     error = AECoerceDesc( &dataDesc, typeIntlText, &coercedDataDesc );
  1139.                     if ( !error )
  1140.                     {
  1141.                         ODIText* name = ITextFromIntlDesc(&coercedDataDesc);
  1142.                         if ( property == pName )
  1143.                         {
  1144.                             if (!ODSetPartName(ev, frame, name, kAENo))
  1145.                                 error = errAEEventNotHandled;
  1146.                         }
  1147.                         else // if ( property == pComment )
  1148.                             ODSetComments(ev, frame, name );
  1149.     
  1150.                         DisposeIText(name);
  1151.                     }
  1152.                     break;
  1153.                 
  1154.                 case pBundled:
  1155.                 case pStationery:
  1156.                 case pShowLinks:
  1157.                     error = AECoerceDesc( &dataDesc, typeBoolean, &coercedDataDesc );
  1158.                     if ( !error )
  1159.                     {
  1160.                         ODBoolean bool = FIRSTBYTESFROMHANDLE(
  1161.                                 coercedDataDesc.dataHandle,    ODBoolean );
  1162.                         if ( property == pBundled )
  1163.                         {
  1164.                             WASSERT( frame );
  1165.                             ASSERT_FRAME_MATCHES_PART( ev, frame, thePart );
  1166.                             frame->SetFrozen( ev, bool );
  1167.                         }
  1168.                         else if ( property == pStationery )
  1169.                             ODSetIsStationery(ev, frame, bool );
  1170.                         else if ( property == pShowLinks )
  1171.                         {
  1172.                             PukeIfFrameNULL( frame );
  1173.                             SetAllWindowShowLinks(ev, session->GetWindowState(ev), bool);
  1174. //                            TempODWindow window = frame->AcquireWindow(ev);
  1175. //                            window->SetShouldShowLinks(ev, bool );
  1176. //                            ODReleaseObject( ev, window );
  1177.                         }
  1178.                     }
  1179.                     break;
  1180.         
  1181.                 case pIcon:
  1182.                     error = AECoerceDesc( &dataDesc, typeAERecord, &coercedDataDesc );
  1183.                     if ( !error )
  1184.                     {
  1185.                         ODIconFamily iconFamily = IfamToIconSuite(&coercedDataDesc);
  1186.                         ODSetIconFamily(ev, frame, iconFamily );
  1187.                         (void) DisposeIconSuite( iconFamily, kODTrue );
  1188.                     }
  1189.                     break;
  1190.     
  1191.                 case pViewType:
  1192.                     error = AECoerceDesc( &dataDesc, typeEnumeration,
  1193.                             &coercedDataDesc );
  1194.                     if ( !error )
  1195.                     {
  1196.                         DescType viewEnum = FIRSTBYTESFROMHANDLE(
  1197.                                 coercedDataDesc.dataHandle,    ODTypeToken );
  1198.                         ODTypeToken viewType = GetViewTypeFromEnum( ev, session,
  1199.                                 viewEnum );
  1200.                         PukeIfFrameNULL( frame );
  1201.                         frame->SetViewType( ev, viewType );
  1202.                     }
  1203.                     break;
  1204.     
  1205.                 case pEditorName:
  1206.                     error = AECoerceDesc(&dataDesc, typeIntlText, &coercedDataDesc);
  1207.                     if ( !error )
  1208.                     {
  1209.                         ODEditor editor;
  1210.                         error = GetEditorFromString(ev, &editor, &coercedDataDesc,
  1211.                                 thePart, session->GetNameSpaceManager(ev) );
  1212.                         if ( (!error) &&
  1213.                             // don't try to set the same editor again....
  1214.                             strcmp(editor,((ODPartWrapper*)thePart)->GetEditor(ev)))
  1215.                         {
  1216.                             // <eeh> note that other code calling UseEditor
  1217.                             // mucks with the storage unit, perhaps to make
  1218.                             // the change stick?  Check this out.
  1219.                                ((ODPartWrapper*)thePart)->UseEditor( ev, editor );
  1220.                            }
  1221.                     }
  1222.                     break;
  1223.     
  1224.                 default:
  1225.                     error = errAEEventNotHandled;
  1226.             }
  1227.             AEDisposeDesc( &coercedDataDesc );
  1228.             AEDisposeDesc( &dataDesc );
  1229.         }
  1230.     }
  1231.  
  1232.     return error;
  1233. }    // HandleSetData()
  1234.  
  1235. /*******************************************************************************
  1236. //
  1237. // Utility functions
  1238. //
  1239. *******************************************************************************/
  1240.  
  1241. //------------------------------------------------------------------------------
  1242. // PutOneIcon
  1243. //------------------------------------------------------------------------------
  1244.  
  1245. static void PutOneIcon( Handle iconSuite, AERecord* ifam, DescType type )
  1246. {
  1247.     Handle iconData;
  1248.     OSErr err = GetIconFromSuite( &iconData, iconSuite, type);
  1249.     if ( err == noErr )
  1250.     {
  1251.         AEDesc oneIcon;
  1252.         oneIcon.descriptorType = type;
  1253.         oneIcon.dataHandle = iconData;
  1254.         err = AEPutKeyDesc( ifam, type, &oneIcon );
  1255.     }
  1256. }
  1257.  
  1258. //------------------------------------------------------------------------------
  1259. // IconSuiteToIfam
  1260. //------------------------------------------------------------------------------
  1261.  
  1262. static ODError IconSuiteToIfam( Handle iconSuite, AEDesc* result )
  1263. {
  1264.     if ( !iconSuite )
  1265.         return errAEEventFailed;    // need a better error?
  1266.     AERecord record;
  1267.     ODError err = AECreateList( kODNULL, 0, kODTrue, &record );
  1268.     if ( err ) return err ;
  1269.  
  1270.     PutOneIcon( iconSuite, &record, large1BitMask );        // 'ICN#',
  1271.     PutOneIcon( iconSuite, &record, large4BitData );        // 'icl4',
  1272.     PutOneIcon( iconSuite, &record, large8BitData );        // 'icl8',
  1273.     PutOneIcon( iconSuite, &record, small1BitMask );        // 'ics#',
  1274.     PutOneIcon( iconSuite, &record, small4BitData );        // 'ics4',
  1275.     PutOneIcon( iconSuite, &record, small8BitData );        // 'ics8',
  1276.     PutOneIcon( iconSuite, &record, mini1BitMask );            // 'icm#',
  1277.     PutOneIcon( iconSuite, &record, mini4BitData );            // 'icm4',
  1278.     PutOneIcon( iconSuite, &record, mini8BitData );            // 'icm8'
  1279.     
  1280.     err = AECoerceDesc( &record, 'ifam', result );
  1281.     AEDisposeDesc( &record );
  1282.     return err;
  1283. }
  1284.  
  1285. //------------------------------------------------------------------------------
  1286. // GetOneIcon
  1287. //------------------------------------------------------------------------------
  1288.  
  1289. static void GetOneIcon( Handle iconSuite, AERecord* ifam, DescType type )
  1290. {
  1291.     AEDesc oneIcon;
  1292.     ODError err = AEGetKeyDesc( ifam, type, type, &oneIcon );
  1293.     if ( !err )
  1294.     {
  1295.         if ( AddIconToSuite( oneIcon.dataHandle, iconSuite, type) != noErr )
  1296.             // no point in holding onto the handle
  1297.             AEDisposeDesc( &oneIcon );
  1298.     }
  1299. }
  1300.  
  1301. //------------------------------------------------------------------------------
  1302. // IfamToIconSuite
  1303. //------------------------------------------------------------------------------
  1304.  
  1305. static ODIconFamily IfamToIconSuite(AERecord* ifam)
  1306. {
  1307.     Handle iconSuite;
  1308.     OSErr err = NewIconSuite( &iconSuite );
  1309.     if ( err ) return kODNULL;
  1310.  
  1311.     GetOneIcon( iconSuite, ifam, large1BitMask );        // 'ICN#',
  1312.     GetOneIcon( iconSuite, ifam, large4BitData );        // 'icl4',
  1313.     GetOneIcon( iconSuite, ifam, large8BitData );        // 'icl8',
  1314.     GetOneIcon( iconSuite, ifam, small1BitMask );        // 'ics#',
  1315.     GetOneIcon( iconSuite, ifam, small4BitData );        // 'ics4',
  1316.     GetOneIcon( iconSuite, ifam, small8BitData );        // 'ics8',
  1317.     GetOneIcon( iconSuite, ifam, mini1BitMask );        // 'icm#',
  1318.     GetOneIcon( iconSuite, ifam, mini4BitData );        // 'icm4',
  1319.     GetOneIcon( iconSuite, ifam, mini8BitData );        // 'icm8'
  1320.  
  1321.     return iconSuite;
  1322. }
  1323.  
  1324. //------------------------------------------------------------------------------
  1325. // GetEditorFromString
  1326. //------------------------------------------------------------------------------
  1327.  
  1328. static ODError GetEditorFromString(Environment* ev, ODEditor* editor, AEDesc* desc, ODPart* part,
  1329.         ODNameSpaceManager* nsm )
  1330. {
  1331.     ODError error = errAEEventNotHandled;
  1332.     TempODIText newEditor = ITextFromIntlDesc( desc );
  1333.     if ( !newEditor ) return errAEEventNotHandled;
  1334.  
  1335.     EditorSet* editorSet = new EditorSet();
  1336.     editorSet->InitEditorSet();
  1337.     ODBoolean someFound = GetAllEditorsForKind( nsm, ODGetKind(ev, part ),
  1338.             editorSet );
  1339.  
  1340.     if ( someFound )
  1341.     {
  1342.         EditorSetIterator* editorIter = editorSet->CreateIterator();
  1343.         for (ODEditor candidate = editorIter->First();
  1344.             editorIter->IsNotComplete();
  1345.             candidate = editorIter->Next())
  1346.         {
  1347.             ODName* name;
  1348.             if ( GetUserEditorFromEditor( nsm, candidate, &name ) )
  1349.             {
  1350.                 if ( (GetITextStringLength(name) == GetITextStringLength(newEditor))
  1351.                     && (GetITextLangCode(name) == GetITextLangCode(newEditor))
  1352.                     && (GetITextScriptCode(name) == GetITextScriptCode(newEditor))
  1353.                     && strncmp(GetITextPtr(name),
  1354.                             GetITextPtr(newEditor), GetITextStringLength(name)) == 0 )
  1355.                 {
  1356.                     *editor = candidate;
  1357.                     error = noErr;
  1358.                     break;
  1359.                 }
  1360.             }
  1361.         }
  1362.         delete editorIter;
  1363.     }
  1364.     ODDeleteObject( editorSet );
  1365. //    DisposeIText(newEditor);
  1366.     return error;
  1367. }
  1368.  
  1369. //------------------------------------------------------------------------------
  1370. // ITextFromIntlDesc
  1371. //------------------------------------------------------------------------------
  1372.  
  1373. static ODIText* ITextFromIntlDesc( AEDesc* desc )
  1374. {
  1375.     WASSERT( desc->descriptorType == typeIntlText );
  1376.  
  1377.     ODSLong len = GetHandleSize( desc->dataHandle );
  1378.     ODLockHandle( desc->dataHandle );
  1379.     IntlText* ASItext = (IntlText*)*desc->dataHandle;
  1380.     // save as we're about to overwrite with stringlength byte
  1381.     ScriptCode scriptCode = ASItext->theScriptCode;
  1382.     LangCode langCode = ASItext->theLangCode;
  1383.     char* str = ((char*)&ASItext->theText) - 1 ;
  1384.     len -= sizeof(ASItext->theScriptCode)
  1385.                 + sizeof(ASItext->theScriptCode);
  1386.     str[0] = len;
  1387.     ODIText* name = CreateIText( scriptCode, langCode,
  1388.             (StringPtr)str );
  1389.     ODUnlockHandle( desc->dataHandle );
  1390.     return name;
  1391. }
  1392.  
  1393. //------------------------------------------------------------------------------
  1394. // ViewTypetoViewEnum
  1395. //------------------------------------------------------------------------------
  1396.  
  1397. static DescType ViewTypetoViewEnum( Environment *ev, ODSession* session,
  1398.         ODTypeToken viewType )
  1399. {
  1400.     if ( viewType == session->Tokenize(ev, kODViewAsSmallIcon) )
  1401.         return kAEODSmallIcon;
  1402.     else if ( viewType == session->Tokenize(ev, kODViewAsLargeIcon) )
  1403.         return kAEODLargeIcon;
  1404.     else if ( viewType == session->Tokenize(ev, kODViewAsFrame) )
  1405.         return kAEODFrame;
  1406.     else if ( viewType == session->Tokenize(ev, kODViewAsThumbnail) )
  1407.         return kAEODThumbnail;
  1408.     else
  1409.     {
  1410.         WARN( "ViewTypetoViewEnum found unknown viewType" );
  1411.         return typeNull;
  1412.     }
  1413. }
  1414.  
  1415. //------------------------------------------------------------------------------
  1416. // GetViewTypeFromEnum
  1417. //------------------------------------------------------------------------------
  1418.  
  1419. static ODTypeToken GetViewTypeFromEnum( Environment *ev, ODSession* session,
  1420.         DescType viewEnum )
  1421. {
  1422.     switch( viewEnum )
  1423.     {
  1424.         case kAEODSmallIcon:
  1425.             return session->Tokenize(ev, kODViewAsSmallIcon);
  1426.         case kAEODLargeIcon:
  1427.             return session->Tokenize(ev, kODViewAsLargeIcon);
  1428.         case kAEODFrame:
  1429.             return session->Tokenize(ev, kODViewAsFrame);
  1430.         case kAEODThumbnail:
  1431.             return session->Tokenize(ev, kODViewAsThumbnail);
  1432.         default:
  1433.             WARN( "GetViewTypeFromEnum: unknown view type enum" );
  1434.             return -1;
  1435.     }    
  1436. }
  1437.  
  1438. //------------------------------------------------------------------------------
  1439. // GetDirectParam
  1440. //
  1441. //    WE NEED TO CONSOLIDATE THIS WITH GetDirectParam IN RlShlEv.cpp!
  1442. //------------------------------------------------------------------------------
  1443.  
  1444. static void GetDirectParam(ODSession* session, ODAppleEvent* message,
  1445.         AEDesc* evtDp)
  1446. {
  1447.     Environment* ev = somGetGlobalEnvironment();
  1448.     AppleEvent localAEVT;
  1449.     THROW_IF_ERROR( ODDescToAEDesc( message, &localAEVT ) );
  1450.  
  1451.     AEDesc localDP;
  1452.     THROW_IF_ERROR( AEGetParamDesc( &localAEVT, keyDirectObject,
  1453.             typeWildCard, &localDP ) );
  1454.     ODOSLToken* oddesc = new ODOSLToken();
  1455.     THROW_IF_NULL(oddesc);
  1456.     oddesc->InitODOSLToken(ev);
  1457.     THROW_IF_ERROR( AEDescToODDesc( &localDP, oddesc ) );
  1458.  
  1459.     ODNameResolver* resolver = session->GetNameResolver(ev);
  1460.     ODBoolean isToken = resolver->IsODToken(ev, oddesc);
  1461.     ODDeleteObject(oddesc);
  1462.     if ( isToken )
  1463.     {
  1464.         *evtDp = localDP;
  1465.     }
  1466.     else
  1467.     {
  1468.         (void)AEDisposeDesc( &localDP );
  1469.         WARN("GetDirectParam. Found a non-token.  About to throw.");
  1470.         THROW( errAEEventNotHandled );
  1471.     }
  1472.     
  1473.     ODDisposeAppleEvent(&localAEVT);
  1474. }    // GetDirectParam()
  1475.  
  1476. //------------------------------------------------------------------------------
  1477. // DescToODOSLToken
  1478. //------------------------------------------------------------------------------
  1479.  
  1480. static ODOSLToken* DescToODOSLToken( Environment* ev, ODNameResolver* resolver,
  1481.         AEDesc* frameDesc, ODOSLToken* tokenToCopy )
  1482. {
  1483.     ODOSLToken* newToken = tokenToCopy->DuplicateODOSLToken(ev);
  1484.     ODDesc* userODToken = resolver->GetUserToken( ev, newToken );
  1485.     AEDescToODDesc(frameDesc, userODToken);
  1486.  
  1487.     return newToken;
  1488. }
  1489.  
  1490. //------------------------------------------------------------------------------
  1491. // AddODOSLTokenToList
  1492. //
  1493. //    Add newToken into list that's in value.
  1494. //------------------------------------------------------------------------------
  1495.  
  1496. static void AddODOSLTokenToList( ODOSLToken* newToken, ODUShort index,
  1497.         AEDesc* list )
  1498. {
  1499.     AEDesc singleTokenAsAEDesc;
  1500.     THROW_IF_ERROR( ODDescToAEDesc( newToken, &singleTokenAsAEDesc ) );
  1501.     
  1502.     WASSERT( list->descriptorType == typeAEList );
  1503.  
  1504.     THROW_IF_ERROR( AEPutDesc( list, index, &singleTokenAsAEDesc) );
  1505.     (void)AEDisposeDesc( &singleTokenAsAEDesc );
  1506. }
  1507.  
  1508.  
  1509. //------------------------------------------------------------------------------
  1510. // PutFrameInValue
  1511. //------------------------------------------------------------------------------
  1512.  
  1513. static void PutFrameInValue( Environment* ev, ODNameResolver* resolver,
  1514.         ODOSLToken* value, ODFrame* frame )
  1515. {
  1516.     AEDesc    myToken;
  1517.  
  1518.     if ( !frame )
  1519.         THROW(errAENoSuchObject);
  1520.     TempODPart part = frame->AcquirePart(ev);
  1521.     CreateStandardPartToken( frame, part, &myToken );
  1522.     ODDesc* userODToken = resolver->GetUserToken(ev, value);
  1523.     THROW_IF_ERROR( AEDescToODDesc( &myToken, userODToken ));
  1524.     AEDisposeDesc(&myToken);
  1525. }
  1526.  
  1527. //------------------------------------------------------------------------------
  1528. // ITextEqual
  1529. //------------------------------------------------------------------------------
  1530.  
  1531. static ODBoolean ITextEqual( ODIText* name1, ODIText* name2 )
  1532. {
  1533.     return ( (GetITextLangCode(name1) == GetITextLangCode(name2))
  1534.         && (GetITextScriptCode(name1) == GetITextScriptCode(name2))
  1535.         && (GetITextStringLength(name1) == GetITextStringLength(name2))
  1536.         && (strcmp( GetITextString(name1, (char*)kODNULL),
  1537.                 GetITextString(name2, (char*)kODNULL))==0) ) ;
  1538. }
  1539.  
  1540. //------------------------------------------------------------------------------
  1541. // AcquireFrameWithName
  1542. //------------------------------------------------------------------------------
  1543. static ODFrame* AcquireFrameWithName( Environment* ev, ODFrame* startFrame,
  1544.         ODIText* name )
  1545. {
  1546.     // beginning with this part, or with root part if this part is null,
  1547.     // do a recursive search until we find a part whose name is the same
  1548.     // as that given by name.  It's important to always begin the search
  1549.     // with this part, as we shouldn't find a part with the target name if
  1550.     // it isn't inside our container.
  1551.  
  1552.     ODBoolean                    foundNonEmbeddingFrame = kODFalse;
  1553.     ODEmbeddedFramesIterator*    iter;
  1554.  
  1555.     ODVolatile(foundNonEmbeddingFrame);
  1556.  
  1557.     WASSERT( startFrame );
  1558.  
  1559.     TempODPart savePart = startFrame->AcquirePart(ev);
  1560.     TRY
  1561.         iter = savePart->CreateEmbeddedFramesIterator(ev, kODNULL);
  1562.     CATCH_ALL
  1563.         foundNonEmbeddingFrame = kODTrue;
  1564.     ENDTRY
  1565.  
  1566.     ODFrame* result = kODNULL;
  1567.     
  1568.     if (!foundNonEmbeddingFrame)
  1569.     {
  1570.         ODFrame* frame;
  1571.         for ( frame = iter->First(ev); iter->IsNotComplete(ev);
  1572.                                 frame = iter->Next(ev) )
  1573.         {
  1574.             TempODIText canName = ODGetPartName(ev, frame, kODNULL );
  1575.             if ( ITextEqual( canName, name ) )
  1576.             {
  1577.                 frame->Acquire(ev);
  1578.                 result = frame;
  1579.                 break;
  1580.             }
  1581.             else if ( (result = AcquireFrameWithName( ev, frame, name )) != kODNULL )
  1582.                 break;
  1583.         }
  1584.         ODDeleteObject(iter);
  1585.     }
  1586.  
  1587.     return result;
  1588. }
  1589.  
  1590. //------------------------------------------------------------------------------
  1591. // CreateObjSpecForFrame
  1592. //------------------------------------------------------------------------------
  1593.  
  1594. static OSErr CreateObjSpecForFrame( Environment *ev, ODFrame* frame,
  1595.         AEDesc* result )
  1596. {
  1597.     ODPersistentObjectID id = GetIDForFrame( ev, frame );
  1598.     AEDesc nullDesc = NULL_DESCRIPTOR_DEFINITION;
  1599.     AEDesc dataDesc;
  1600.     THROW_IF_ERROR( AECreateDesc( typeLongInteger, &id, sizeof(id),
  1601.             &dataDesc ) );
  1602.     return CreateObjSpecifier( cPart, &nullDesc, pUniqueID,
  1603.             &dataDesc, true, result );
  1604. }
  1605.  
  1606. //------------------------------------------------------------------------------
  1607. // GetIDForFrame
  1608. //------------------------------------------------------------------------------
  1609.  
  1610. static ODPersistentObjectID GetIDForFrame( Environment* ev, ODFrame* frame )
  1611. {
  1612.     ODStorageUnit* su = frame->GetStorageUnit(ev);
  1613.     WASSERT(su);
  1614.     ODDraft* draft = su->GetDraft(ev);
  1615.     WASSERT(draft);
  1616.     return draft->GetPersistentObjectID( ev,
  1617.             (ODPersistentObject*)frame, kODFrameObject);
  1618. }
  1619.  
  1620. //------------------------------------------------------------------------------
  1621. // CopyNonDPParams
  1622. // Move from one AppleEvent to another all parameters but the direct parameter.
  1623. // <eeh> should modify to move attributes as well, probably by changing the
  1624. // type of the AppleEvent from 'aevt' to 'meta' temporarily.  This function
  1625. // could then also be used in ODMessageInterface::DispatchToEventHandlerAux
  1626. // where it copies data back into the reply it must return.
  1627. //------------------------------------------------------------------------------
  1628.  
  1629. #ifdef TO_BE_DELETED
  1630. static void CopyNonDPParams( ODAppleEvent* message, ODAppleEvent* newMessage )
  1631. {
  1632.     AppleEvent sourceAEVT;
  1633.     AppleEvent destAEVT;
  1634.     THROW_IF_ERROR( ODDescToAEDesc( message, &sourceAEVT ) );
  1635.     THROW_IF_ERROR( ODDescToAEDesc( newMessage, &destAEVT ) );
  1636.  
  1637.     long numParams;
  1638.     THROW_IF_ERROR( AECountItems( &sourceAEVT, &numParams ) );
  1639.     for ( long index = 1; index <= numParams; ++index )
  1640.     {
  1641.         AEDesc oneParam;
  1642.         DescType keyword;
  1643.         THROW_IF_ERROR( AEGetNthDesc( &sourceAEVT, index, typeWildCard,
  1644.                 &keyword, &oneParam ) );
  1645.         if ( keyword != keyDirectObject )
  1646.             THROW_IF_ERROR( AEPutParamDesc( &destAEVT, keyword, &oneParam ) );
  1647.         AEDisposeDesc( &oneParam );
  1648.     }
  1649.     THROW_IF_ERROR( AEDescToODDesc( &destAEVT, newMessage ) );
  1650.     ODDisposeAppleEvent( &sourceAEVT );
  1651.     ODDisposeAppleEvent( &destAEVT );
  1652. }
  1653. #endif /* TO_BE_DELETED */
  1654.  
  1655. //------------------------------------------------------------------------------
  1656. // PartIsContained
  1657. //------------------------------------------------------------------------------
  1658.  
  1659. ODBoolean PartIsContained( Environment* ev, ODFrame* testee,
  1660.     ODFrame* container )
  1661. {
  1662.     ODBoolean result ;
  1663.     if ( !testee )
  1664.          result = kODFalse;
  1665.     else if ( !container )
  1666.         result = kODTrue;        // root frame contains all
  1667.  
  1668.     // before the first AcquireContainingFrame call don't test for equality,
  1669.     // as a frame can't contain itself.
  1670.     else
  1671.     {
  1672.         while ( !result &&
  1673.                 ((testee = testee->AcquireContainingFrame(ev)) != kODNULL) )
  1674.         {
  1675.             result = ODObjectsAreEqual( ev, testee, container );
  1676.             ODFrame* saveCopy = testee;
  1677.             ODReleaseObject( ev, saveCopy );
  1678.         }
  1679.     }
  1680.     return result;
  1681. }
  1682.  
  1683. //------------------------------------------------------------------------------
  1684. // IndexForFrame
  1685. //------------------------------------------------------------------------------
  1686.  
  1687. static OSErr IndexForFrame( Environment *ev, ODFrame* frame, ODULong* result )
  1688. {
  1689.     TempODFrame parentFrame = frame->AcquireContainingFrame(ev);
  1690.     ODULong tempResult = 0;
  1691.     if ( parentFrame != kODNULL )
  1692.     {
  1693.         TempODPart part = parentFrame->AcquirePart(ev);
  1694.         ODEmbeddedFramesIterator* iter =
  1695.                 part->CreateEmbeddedFramesIterator( ev, kODNULL );
  1696.         ODFrame* testFrame;
  1697.         for ( testFrame = iter->First(ev), tempResult = 1;
  1698.                 !ODObjectsAreEqual(ev, frame, testFrame)
  1699.                         && iter->IsNotComplete(ev);
  1700.                 ++tempResult, testFrame = iter->Next(ev) )
  1701.         {
  1702.         }
  1703.         ODDeleteObject(iter);
  1704.     }
  1705.     else
  1706.     {
  1707.         return errAENoSuchObject;
  1708.     }
  1709.     *result = tempResult;
  1710.     return noErr;
  1711. }
  1712.  
  1713. //------------------------------------------------------------------------------
  1714. // SwapToRootPart
  1715. //------------------------------------------------------------------------------
  1716.  
  1717. static ODError SwapToRootPart( Environment *ev, ODSession* session,
  1718.         ODOSLToken* value)
  1719. {
  1720.     ODFrame* frame = GetDefaultRootFrameToSwapTo(ev, session);
  1721.     if ( !frame )
  1722.         return errAENoSuchObject;
  1723.     else
  1724.     {
  1725.         // when will this part be released???
  1726.         TempODPart savePart = frame->AcquirePart(ev);
  1727.         session->GetNameResolver(ev)->
  1728.                 CreateSwapToken( ev, value, savePart, frame );
  1729. //        ODReleaseObject( ev, savePart );
  1730.     }
  1731.     return noErr;
  1732. }
  1733.  
  1734. //------------------------------------------------------------------------------
  1735. // ODDuplicateEvent
  1736. //------------------------------------------------------------------------------
  1737.  
  1738. void ODDuplicateEvent( ODAppleEvent* scrDesc,
  1739.         ODAppleEvent** destDesc )
  1740. {
  1741.     Environment*    ev = somGetGlobalEnvironment();
  1742.     AppleEvent newAevt;
  1743.     OSErr err = ODDescToAEDesc( scrDesc, &newAevt );
  1744.     if ( err == noErr )
  1745.     {
  1746.         ODAppleEvent* tmp = new ODAppleEvent();
  1747.         THROW_IF_NULL(tmp);
  1748.         tmp->InitODAppleEvent(ev);
  1749.         err = AEDescToODDesc( &newAevt, tmp );
  1750.         ODDisposeAppleEvent(&newAevt);
  1751.         *destDesc = tmp;
  1752.     }
  1753.     THROW_IF_ERROR(err);
  1754. }
  1755.  
  1756. //------------------------------------------------------------------------------
  1757. // ODPutParamDesc
  1758. //------------------------------------------------------------------------------
  1759.  
  1760. void ODPutParamDesc( ODAppleEvent* odaevt, DescType keyword, AEDesc* desc )
  1761. {
  1762.     AppleEvent local;
  1763.     OSErr err = ODDescToAEDesc( odaevt, &local );
  1764.     if ( err == noErr )
  1765.     {
  1766.         err = AEPutParamDesc( &local, keyword, desc );
  1767.         if ( err == noErr )
  1768.             err = AEDescToODDesc( &local, odaevt );
  1769.         ODDisposeAppleEvent(&local);
  1770.     }
  1771.     THROW_IF_ERROR(err);
  1772. }
  1773.  
  1774. //------------------------------------------------------------------------------
  1775. // ODPutParamDesc
  1776. //------------------------------------------------------------------------------
  1777.  
  1778. void ODPutParamDesc( ODAppleEvent* odaevt, DescType keyword, ODDesc* desc )
  1779. {
  1780.     AEDesc localDesc;
  1781.     THROW_IF_ERROR( ODDescToAEDesc( desc, &localDesc ) );
  1782.     TempAEDesc tmpDesc(&localDesc);
  1783.     ODPutParamDesc( odaevt, keyword, &localDesc );
  1784. }
  1785.  
  1786. //------------------------------------------------------------------------------
  1787. // ODGetParamDesc
  1788. //------------------------------------------------------------------------------
  1789.  
  1790. void ODGetParamDesc( ODAppleEvent* odaevt, DescType keyword, DescType typeSought,
  1791.         AEDesc* desc )
  1792. {
  1793.     AppleEvent event;
  1794.     OSErr err = ODDescToAEDesc( odaevt, &event );
  1795.     if ( err == noErr )
  1796.     {
  1797.         err = AEGetParamDesc( &event, keyword, typeSought, desc );
  1798.         ODDisposeAppleEvent(&event);
  1799.     }
  1800.     THROW_IF_ERROR(err);
  1801. }
  1802.  
  1803. //------------------------------------------------------------------------------
  1804. // ODGetParamDesc
  1805. //------------------------------------------------------------------------------
  1806.  
  1807. void ODGetParamDesc( ODAppleEvent* odaevt, DescType keyword,
  1808.         DescType typeSought, ODDesc** desc )
  1809. {
  1810.     Environment*    ev = somGetGlobalEnvironment();
  1811.     AEDesc            resultAsAEDesc;
  1812.  
  1813.     ODDesc* result = new ODDesc();
  1814.     THROW_IF_NULL(result);
  1815.     result->InitODDesc( ev );
  1816.  
  1817.     ODGetParamDesc( odaevt, keyword, typeSought, &resultAsAEDesc );
  1818.     OSErr error = AEDescToODDesc( &resultAsAEDesc, result);
  1819.     THROW_IF_ERROR (error);
  1820.     AEDisposeDesc(&resultAsAEDesc);
  1821.     *desc = result;
  1822. }
  1823.  
  1824. //------------------------------------------------------------------------------
  1825. // ODPutAttributeDesc
  1826. //------------------------------------------------------------------------------
  1827.  
  1828. void ODPutAttributeDesc( ODAppleEvent* message, AEKeyword key, ODDesc* desc )
  1829. {
  1830.     AppleEvent messageAsAEDesc;
  1831.     THROW_IF_ERROR( ODDescToAEDesc( message, &messageAsAEDesc ) );
  1832.     AEDesc attrDescAsAEDesc;
  1833.     THROW_IF_ERROR( ODDescToAEDesc( desc, &attrDescAsAEDesc ) );
  1834.     THROW_IF_ERROR( AEPutAttributeDesc( &messageAsAEDesc, key,
  1835.                                         &attrDescAsAEDesc) );
  1836.     AEDisposeDesc(&attrDescAsAEDesc);
  1837.     THROW_IF_ERROR( AEDescToODDesc(&messageAsAEDesc, message ));
  1838.     ODDisposeAppleEvent(&messageAsAEDesc);
  1839. }
  1840.  
  1841. //------------------------------------------------------------------------------
  1842. // ODGetAttributePtr
  1843. //------------------------------------------------------------------------------
  1844.  
  1845. void ODGetAttributePtr( ODAppleEvent *appleEvent, AEKeyword theAEKeyword,
  1846.         DescType desiredType, DescType *typeCode, void *dataPtr,
  1847.         Size maximumSize, Size *actualSize)
  1848. {
  1849.     AppleEvent event;
  1850.     OSErr err = ODDescToAEDesc( appleEvent, &event );
  1851.     if ( err == noErr )
  1852.     {
  1853.         err = AEGetAttributePtr( &event, theAEKeyword, desiredType,
  1854.                 typeCode, dataPtr, maximumSize, actualSize );
  1855.         (void)ODDisposeAppleEvent( &event );
  1856.     }
  1857.     THROW_IF_ERROR( err );
  1858. }
  1859.  
  1860. #if ODDebug
  1861. void ASSERT_FRAME_MATCHES_PART( Environment *ev, ODFrame* frame, ODPart* part )
  1862. {
  1863. #if 0
  1864.     if ( frame )
  1865.     {
  1866.         TempODPart savePart = frame->AcquirePart(ev);
  1867.         ODBoolean partMatchesFrame = ODObjectsAreEqual(ev, savePart, part);
  1868. //        ODBoolean partMatchesFrame = savePart == part;
  1869. //        ODReleaseObject( ev, savePart );
  1870.         WASSERT( partMatchesFrame );
  1871.     }
  1872. #endif
  1873. }
  1874. #endif
  1875.  
  1876.