home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1998 May / Pcwk5b98.iso / Borland / Cplus45 / BC45 / BOCOLE.PAK / BOLECMAN.CPP < prev    next >
C/C++ Source or Header  |  1995-08-29  |  4KB  |  158 lines

  1. //
  2. //**************************************************************************
  3. // 
  4. // BOleCMan.cpp -- Declares an IBClassMgr "factory" which can create Bolero
  5. //                 helper objects. 
  6. //
  7. //                 Since callers of BOleClassManager don't have the class 
  8. //                 definition, they can't call operator new to create a
  9. //                 helper object.
  10. //
  11. //                 BOleClassMgr has a pointer to the service, so you need a
  12. //                 BOleClassMgr for every Bolero connection you maintain.
  13. //
  14. // Copyright (c) 1993,94 by Borland International, Inc. All rights reserved
  15. //
  16. //**************************************************************************
  17.  
  18. #include "BOleCMan.h"
  19. #include "BOleSvc.h"
  20. #include "BOleDoc.h"
  21. #include "BOleIPS.h"
  22. #include "BOleSite.h"
  23. #include "BOleCont.h"
  24. #include "BOleData.h"
  25. #include "BOleFact.h"
  26.  
  27. HRESULT _IFUNC BOleClassManager::QueryInterfaceMain(REFIID iid, LPVOID FAR *ppv)
  28. {
  29.     HRESULT hr = ResultFromScode(E_NOINTERFACE);
  30.     *ppv = NULL;
  31.     
  32.     // interfaces
  33.     SUCCEEDED(hr = IBClassMgr_QueryInterface(this, iid, ppv))
  34.  
  35.     // base classes    
  36.     || SUCCEEDED(hr = BOleComponent::QueryInterfaceMain(iid, ppv))
  37.  
  38.     // helpers
  39.     ;
  40.         
  41.     return hr;
  42. }
  43.  
  44.  
  45. BOleClassManager::BOleClassManager(IBUnknownMain *pObj) :
  46.     pSvc (NULLP), BOleComponent(this, pObj)
  47. {
  48.     nServerCount = 0;
  49. }
  50.  
  51. //
  52.  
  53. BOleClassManager::~BOleClassManager()
  54. {
  55.     if (pSvc != NULLP) {
  56.         pSvc->ReleaseMain();
  57.         pSvc = NULLP;
  58.     }
  59.  
  60.     OLE::OleUninitialize (); // Req'd to free OLE2's clipboard window
  61. }
  62.  
  63. int _IFUNC BOleClassManager::ServerCount (int nDelta)
  64. {
  65.     nServerCount += nDelta;
  66.     if (nServerCount == 0) {
  67.         if (pSvc && (nDelta != 0))
  68.             // call ShutdownMaybe on TRANSITION to 0
  69.             (pSvc->GetApplication())->ShutdownMaybe();
  70.     }
  71.     return nServerCount;
  72. }
  73.  
  74. HRESULT _IFUNC BOleClassManager::ComponentCreate( PIUnknown FAR * ppObj, PIUnknown pO, BCID cid)
  75. {
  76.     *ppObj = NULL;
  77.     PIBUnknownMain pOuter = AsPIUnknownMain(pO);
  78.     
  79.     switch (cid) {
  80.         case cidBOleService:
  81.             {
  82.                 if (pSvc != NULLP)
  83.                     pSvc->ReleaseMain();    // ref count on helper (not aggregator)
  84.                 pSvc = new BOleService(this, pOuter);
  85.                 *ppObj = AsPIUnknown(pSvc);
  86.                 if (pSvc != NULLP)
  87.                     pSvc->AddRefMain();
  88.                 break;
  89.             }
  90.         case cidBOleDocument:
  91.             {
  92.                 if (pSvc != NULLP)
  93.                     *ppObj = AsPIUnknown(new BOleDocument(this, pOuter, pSvc));
  94.                 break;
  95.             }
  96.         case cidBOleContainer:
  97.             {
  98.                 *ppObj = AsPIUnknown(new BOleContainer(this, pOuter));
  99.                 break;
  100.             }
  101.         case cidBOlePart:
  102.             {
  103.                 if (pSvc != NULLP)
  104.                     *ppObj = AsPIUnknown(new BOlePart(this, pOuter, pSvc->pActiveDoc));
  105.                 break;
  106.             }
  107.         case cidBOleSite:
  108.             {
  109.                 *ppObj = AsPIUnknown(new BOleSite(this, pOuter, pSvc));
  110.                 break;
  111.             }
  112.         case cidBOleInProcSite:
  113.             {
  114.                 *ppObj = AsPIUnknown(new BOleInProcServer(this, pOuter, pSvc));
  115.                 break;
  116.             }
  117.         case cidBOleInProcHandler:
  118.             {
  119.                 *ppObj = AsPIUnknown(new BOleInProcHandler(this, pOuter, pSvc));
  120.                 break;
  121.             }
  122.         case cidBOleData:
  123.             *ppObj = AsPIUnknown (new BOleData(this, pOuter));
  124.             break;
  125.  
  126.         case cidBOleFactory:
  127.             // not aggregated directly by clients
  128.             // we create one on the clients behalf in IService::RegisterClass
  129.             // and release it in IService::UnregisterClass
  130.             {
  131.                 *ppObj = AsPIUnknown (new BOleFact(this, pOuter));
  132.                 break;
  133.             }
  134.     }
  135.     return (*ppObj) ? NOERROR : ResultFromScode (E_FAIL);
  136. }
  137.  
  138. // CreateClassMgr -- This is the way to initiate a connection with Bolero.
  139. //                   To help us be version-resilient, it's the only exported
  140. //                   function which is visible to Bolero customers
  141. //
  142. extern "C"
  143.  
  144. HRESULT PASCAL FAR _export _loadds CreateClassMgr (
  145.     PIUnknown FAR *pCM,
  146.     PIUnknown pOuter,
  147.     IMalloc FAR *pMalloc)
  148. {
  149.     OLE::OleInitialize(pMalloc);
  150.     *pCM = new BOleClassManager (AsPIUnknownMain(pOuter));
  151.     return (*pCM) ?NOERROR:ResultFromScode(E_OUTOFMEMORY);
  152. }
  153.  
  154.  
  155.  
  156.  
  157.  
  158.