PSFactory.cpp
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:3k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* PSFactory.cpp - COM/DCOM PSFactory class implementation */
  2. /* Copyright (c) 1999 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01r,17dec01,nel  Add include symbol for diab.
  7. 01q,25jul01,dbs  revise facelet/proxy classes
  8. 01p,13jul01,dbs  fix up includes
  9. 01o,30jul99,aim  fixed compiler warning
  10. 01n,30jul99,dbs  CreateStublet() must return NULL if no p/s found
  11. 01m,30jun99,dbs  create facelets with zero ref-count
  12. 01l,08jun99,dbs  remove use of mtmap
  13. 01k,04jun99,dbs  change GuidMap to mtmap
  14. 01j,03jun99,dbs  no return value from mutex lock
  15. 01i,28may99,dbs  make stub disp-tbl a structure
  16. 01h,14may99,dbs  use new stub-func type
  17. 01g,11may99,dbs  simplify proxy remoting architecture
  18. 01f,11may99,dbs  simplify stub remoting architecture
  19. 01e,29apr99,dbs  fix -Wall warnings
  20. 01d,27apr99,dbs  make PSFactory a true singleton
  21. 01c,27apr99,dbs  add mem-pool to classes
  22. 01b,26apr99,aim  added TRACE_CALL
  23. 01a,20apr99,dbs  created during Grand Renaming
  24. */
  25. /*
  26.   DESCRIPTION:
  27.   PSFactory -- 
  28. */
  29. #include "private/comMisc.h"
  30. #include "PSFactory.h"
  31. /* Include symbol for diab */
  32. extern "C" int include_vxdcom_PSFactory (void)
  33.     {
  34.     return 0;
  35.     }
  36. //////////////////////////////////////////////////////////////////////////
  37. //
  38. VxStublet* VxPSFactory::CreateStublet
  39.     (
  40.     IUnknown* punkServer,
  41.     REFIID iid,
  42.     REFIPID ipid
  43.     )
  44.     {
  45.     VxCritSec critSec (m_mutex);
  46.     PSMAP::const_iterator i = m_psMap.find (iid);
  47.     if (i == m_psMap.end ())
  48. return 0;
  49.     return new VxStublet (punkServer,
  50.   iid,
  51.   ipid,
  52.   (*i).second.pStubDispTbl);
  53.     }
  54.     
  55. //////////////////////////////////////////////////////////////////////////
  56. //
  57. // Register a proxy/stub pair with the factory...
  58. //
  59. HRESULT VxPSFactory::Register
  60.     (
  61.     REFIID iid,
  62.     const void* pvProxyVtbl,
  63.     const VXDCOM_STUB_DISPTBL* pStubDispTbl
  64.     )
  65.     {
  66.     VxCritSec cs (m_mutex);
  67.     m_psMap [iid] = psentry (pvProxyVtbl, pStubDispTbl);
  68.     return S_OK;
  69.     }
  70. //////////////////////////////////////////////////////////////////////////
  71. //
  72. // CreateProxy -- search the factory's table of registered p/s IIDs
  73. // until it finds one that matches. If so, return the interface proxy
  74. // (facelet) aggregated into the supplied VxStdProxy.
  75. //
  76. HRESULT VxPSFactory::CreateProxy
  77.     (
  78.     IUnknown *      pUnkOuter,
  79.     REFIID          iid,
  80.     REFIPID         ipid,
  81.     IOrpcProxy**    ppProxy
  82.     )
  83.     {
  84.     const void* pvVtbl = 0;
  85.     
  86.     // Search for registered interface...
  87.     {
  88.     VxCritSec critSec (m_mutex);
  89.     PSMAP::const_iterator i = m_psMap.find (iid);
  90.     if (i != m_psMap.end ())
  91. pvVtbl = (*i).second.pvProxyVtbl;
  92.     }
  93.     // Make sure we were given somewhere to put it...
  94.     if (ppProxy)
  95.         {
  96.         VxInterfaceProxy* p = new VxInterfaceProxy (iid,
  97.                                                     ipid,
  98.                                                     pUnkOuter,
  99.                                                     pvVtbl);
  100.         *ppProxy = p;
  101.         p->AddRef ();
  102.         }
  103.         
  104.     return S_OK;
  105.     }
  106. //////////////////////////////////////////////////////////////////////////
  107. //
  108. VxPSFactory* VxPSFactory::theInstance ()
  109.     {
  110.     static VxPSFactory s_theFactory;
  111.     return &s_theFactory;
  112.     }