home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 October: Mac OS SDK / Dev.CD Oct 96 SDK / Dev.CD Oct 96 SDK2.toast / Development Kits (Disc 2) / OpenDoc / OpenDoc Development / Debugging Support / OpenDoc Source Code / Storage / Bento / MemCtr.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-22  |  9.6 KB  |  327 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        MemCtr.cpp
  3.  
  4.     Contains:    Implementation of ODMemContainer class.
  5.  
  6.     Owned by:    Paul Hartenstine
  7.  
  8.     Copyright:    © 1993 - 1995 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.         <13>    10/24/95    jpa        1293441: DM/VL: Bento memory reserve &
  13.                                     fatal container err.
  14.         <12>     10/8/95    TJ        Fixes Recomended by Refball
  15.         <11>     8/12/95    TÇ        1276806 Optimization: use kODFalse instead
  16.                                     of kODTrue in comparisons
  17.         <10>      8/3/95    RR        #1257260: Collapse B classes. Remove
  18.                                     somInit methods. Don't call IsInitialized
  19.                                     or SubclassResponsibility
  20.          <9>     5/26/95    VL        1251403: Multithreading naming support.
  21.          <8>     3/23/95    VL        1230357: Implemented Purge.
  22.          <7>    11/14/94    VL        1188257: Use Bento errors in BenotDef.h.
  23.          <6>     11/1/94    VL        1194188: Implemented unimplemented
  24.                                     functions.
  25.          <5>     9/29/94    RA        1189812: Mods for 68K build.
  26.          <4>     9/23/94    VL        1184272: ContainerID is now a sequence of
  27.                                     octets. 1184166: Implemented GetName and
  28.                                     SetName. (still commented out).
  29.          <3>      8/5/94    VL        1171603: Use somSelf->GetCMSession instead
  30.                                     of depending on ODStorageSystem.
  31.          <2>      8/3/94    VL        1153123: Storage to ODStor.
  32.          <1>     6/30/94    CC        first checked in
  33.          <2>     4/13/94    VL        1157028: StorageM.h does not include
  34.                                     CMAPI.h anymore, so GetCMSession returns
  35.                                     ODULong.
  36.          <1>     3/24/94    VL        first checked in
  37.         <10>      2/8/94    VL        Use new exception macros.
  38.          <9>     1/12/94    VL        Init changes.
  39.          <8>     12/3/93    TÇ        Stop including ODError.h, it is included
  40.                                     as ErrorDef.h inside Except.h
  41.          <7>    11/23/93    VL        Made ODMemContainer pool-aware.
  42.          <6>      9/9/93    VL        Moved session global code to ODDraft,39.
  43.          <5>      8/9/93    VL        Moved error code to ODError.h.
  44.          <4>      8/6/93    VL        fContainer should be fCMContainer.
  45.          <3>      8/6/93    PH        Specify all types in calls to Bento
  46.          <2>      8/3/93    PH        Fix includes
  47.          <1>      8/2/93    PH        first checked in
  48.     To Do:
  49.     In Progress:
  50.         
  51. */
  52.  
  53. #define ODMemContainer_Class_Source
  54.  
  55. #define VARIABLE_MACROS
  56.  
  57. #include <MemCtr.xih>
  58.  
  59. #ifndef _PLFMDEF_
  60. #include "PlfmDef.h"
  61. #endif
  62.  
  63. #ifndef SOM_ODStorageSystem_xh
  64. #include <ODStor.xh>
  65. #endif
  66.  
  67. #ifndef _MEMHDR_
  68. #include "MemHdr.h"
  69. #endif
  70.  
  71. #ifndef _TARGTHDR_
  72. #include "TargtHdr.h"
  73. #endif
  74.  
  75. #ifndef __CM_API__
  76. #include "CMAPI.h"
  77. #endif
  78.  
  79. #ifndef _EXCEPT_
  80. #include "Except.h"
  81. #endif
  82.  
  83. #ifndef _ODNEW_
  84. #include <ODNew.h>
  85. #endif
  86.  
  87. #ifndef _BENTODEF_
  88. #include "BentoDef.h"
  89. #endif
  90.  
  91. #ifndef _SESSHDR_
  92. #include "SessHdr.h"
  93. #endif
  94.  
  95. #pragma segment ODMemContainer
  96.  
  97. //==============================================================================
  98. // ODMemContainer
  99. //==============================================================================
  100.  
  101. //------------------------------------------------------------------------------
  102. // ODMemContainer: ~ODMemContainer
  103. //------------------------------------------------------------------------------
  104.  
  105. SOM_Scope void  SOMLINK ODMemContainersomUninit(ODMemContainer *somSelf)
  106. {
  107.     ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
  108.     ODMemContainerMethodDebug("ODMemContainer","somUninit");
  109.  
  110. #ifdef DebugRefCount
  111.     printf("~ODMemContainer %x CMContainer %x RefCount %d\n", somSelf, _fCMContainer, _fRefCount);
  112.     fflush(stdout);
  113. #endif
  114.  
  115.     TRY{
  116.         Environment *ev = somGetGlobalEnvironment ();
  117.     
  118.         if (_fCMContainer != kODNULL)
  119.             somSelf->Close(ev);
  120.     
  121.         if (_fHandlers != kODNULL)
  122.             delete _fHandlers;
  123.     
  124.         if (_fName != kODNULL)
  125.             DisposeIText(_fName);
  126.     }CATCH_ALL{
  127.         // Ignore any errors
  128.     }ENDTRY
  129. }
  130.  
  131. //------------------------------------------------------------------------------
  132. // ODMemContainer: InitContainer
  133. //------------------------------------------------------------------------------
  134.  
  135. SOM_Scope void  SOMLINK ODMemContainerInitContainer(ODMemContainer *somSelf, Environment *ev,
  136.         ODStorageSystem* storage, ODContainerID* id)
  137. {
  138.     ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
  139.     ODMemContainerMethodDebug("ODMemContainer","InitContainer");
  140.     
  141.     SOM_CATCH return;
  142.  
  143.     /* Moved from somInit. SOM itself sets fields to zero
  144.     _fCMContainer = kODNULL;
  145.     _fHandlers = kODNULL;
  146.     _fName = kODNULL;
  147.     */
  148.     
  149.     ODMemContainer_parent_ODBentoContainer_InitContainer(somSelf, ev, storage, id);
  150.     
  151.     _fHandlers = new(somSelf->GetHeap(ev)) ODMemBentoHandlers(somSelf->GetCMSession(ev),
  152.                                                              *((ODHandle*) id->_buffer));
  153.     _fHandlers->Initialize();
  154.     
  155.     _fName = CreateIText(0);
  156. }
  157.  
  158. //------------------------------------------------------------------------------
  159. // ODMemContainer: GetName
  160. //------------------------------------------------------------------------------
  161.  
  162. SOM_Scope ODContainerName  SOMLINK ODMemContainerGetName(ODMemContainer *somSelf, Environment *ev)
  163. {
  164.     ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
  165.     ODMemContainerMethodDebug("ODMemContainer","GetName");
  166.     
  167.     return *_fName;
  168. }
  169.  
  170. //------------------------------------------------------------------------------
  171. // ODMemContainer: SetName
  172. //------------------------------------------------------------------------------
  173.  
  174. SOM_Scope void  SOMLINK ODMemContainerSetName(ODMemContainer *somSelf, Environment *ev,
  175.         ODContainerName* name)
  176. {
  177.     ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
  178.     ODMemContainerMethodDebug("ODMemContainer","SetName");
  179.  
  180.     SOM_CATCH    return;
  181.     
  182.     if (_fName != kODNULL) {
  183.         DisposeIText(_fName);
  184.     }
  185.     _fName = CopyIText(name);
  186. }
  187.  
  188. //------------------------------------------------------------------------------
  189. // ODMemContainer: Create
  190. //------------------------------------------------------------------------------
  191.  
  192. SOM_Scope ODContainer*  SOMLINK ODMemContainerCreate(ODMemContainer *somSelf, Environment *ev)
  193. {
  194.     ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
  195.     ODMemContainerMethodDebug("ODMemContainer","Create");
  196.  
  197.     SOM_CATCH    return somSelf;
  198.     
  199.     if (_fCMContainer == kODNULL) {
  200.     
  201.         CMSession cmSession = somSelf->GetCMSession(ev);
  202.  
  203.         CMSetMetaHandler(cmSession,
  204.                         (CMGlobalName)CMTargetHandlersTypeName,
  205.                         targetContainerMetahandler);
  206.                         
  207.         _fCMContainer = CMOpenNewContainer(cmSession,
  208.                                         _fHandlers,
  209.                                         (CMGlobalName) kODBentoMemoryTypeName,
  210.                                         (CMContainerUseMode)(kCMWriting),
  211.                                         1, 0);
  212.  
  213.         if (_fCMContainer == kODNULL)
  214.             THROW(kODErrCannotCreateContainer);
  215.         ODSessionRestoreCMAllocReserve(_fCMContainer);
  216.  
  217.     }
  218.     return somSelf;
  219. }
  220.  
  221. //------------------------------------------------------------------------------
  222. // ODMemContainer: Open
  223. //------------------------------------------------------------------------------
  224.  
  225. SOM_Scope ODContainer*  SOMLINK ODMemContainerOpen(ODMemContainer *somSelf, Environment *ev)
  226. {
  227.     ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
  228.     ODMemContainerMethodDebug("ODMemContainer","Open");
  229.  
  230.     SOM_CATCH    return somSelf;
  231.  
  232.     if (_fCMContainer == kODNULL) {
  233.     
  234.         CMSession cmSession = somSelf->GetCMSession(ev);
  235.  
  236.         CMSetMetaHandler(cmSession,
  237.                         (CMGlobalName)CMTargetHandlersTypeName,
  238.                         targetContainerMetahandler);
  239.                         
  240.         _fCMContainer = CMOpenNewContainer(cmSession,
  241.                                         _fHandlers,
  242.                                         (CMGlobalName) kODBentoMemoryTypeName,
  243.                                         (CMContainerUseMode)(kCMUpdateByAppend),
  244.                                         1, 0);
  245.  
  246.         if (_fCMContainer == kODNULL)
  247.             THROW(kODErrCannotOpenContainer);
  248.  
  249.         ODSessionRestoreCMAllocReserve(_fCMContainer);
  250.     }
  251.     return somSelf;
  252. }
  253.  
  254. //------------------------------------------------------------------------------
  255. // ODMemContainer: Close
  256. //------------------------------------------------------------------------------
  257.  
  258. SOM_Scope ODContainer*  SOMLINK ODMemContainerClose(ODMemContainer *somSelf, Environment *ev)
  259. {
  260.     ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
  261.     ODMemContainerMethodDebug("ODMemContainer","Close");
  262.  
  263.     if (_fCMContainer != kODNULL) {
  264.         SOM_TRY
  265.             ODSessionMustHaveCMAllocReserve(_fCMContainer);
  266.             if (somSelf->GetDirtyFlag(ev) != kODFalse)
  267.                 CMCloseContainer(_fCMContainer);
  268.             else
  269.                 CMAbortContainer(_fCMContainer);
  270.         SOM_CATCH_ALL
  271.             if (ErrorCode() == kODErrBentoErr)
  272.                 SetErrorCode(kODErrFatalContainerError);
  273.         SOM_ENDTRY
  274.         _fCMContainer = kODNULL;
  275.     }
  276.     
  277.     return ODMemContainer_parent_ODBentoContainer_Close(somSelf, ev);
  278. }
  279.  
  280. //------------------------------------------------------------------------------
  281. // ODMemContainer: Purge
  282. //------------------------------------------------------------------------------
  283.  
  284. SOM_Scope ODSize  SOMLINK ODMemContainerPurge(ODMemContainer *somSelf, Environment *ev,
  285.         ODSize size)
  286. {
  287.     ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
  288.     ODMemContainerMethodDebug("ODMemContainer","Purge");
  289.  
  290.     ODSize freed = 0; ODVolatile(freed);
  291.  
  292.     SOM_TRY
  293.         freed = parent_Purge(somSelf, ev, size);
  294.     SOM_CATCH_ALL
  295.         WARN("Error %ld trying to purge in ODMemContainerPurge",ErrorCode());
  296.         SetErrorCode(kODNoError);        // Eat the exception; Purge should not 
  297.                                         // propagate it because clients function
  298.                                         // fine whether memory was purged or not.
  299.     SOM_ENDTRY
  300.  
  301.     return freed;
  302. }
  303.  
  304. //------------------------------------------------------------------------------
  305. // ODMemContainer: GetCMContainer
  306. //------------------------------------------------------------------------------
  307.  
  308. SOM_Scope CMContainer  SOMLINK ODMemContainerGetCMContainer(ODMemContainer *somSelf, Environment *ev)
  309. {
  310.     ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
  311.     ODMemContainerMethodDebug("ODMemContainer","GetCMContainer");
  312.  
  313.     return _fCMContainer;
  314. }
  315.  
  316. //------------------------------------------------------------------------------
  317. // ODMemContainer: GetHandlers
  318. //------------------------------------------------------------------------------
  319.  
  320. SOM_Scope ODBentoHandlers*  SOMLINK ODMemContainerGetHandlers(ODMemContainer *somSelf, Environment *ev)
  321. {
  322.     ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
  323.     ODMemContainerMethodDebug("ODMemContainer","GetHandlers");
  324.  
  325.     return _fHandlers;
  326. }
  327.