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

VxWorks

开发平台:

C/C++

  1. /* Stublet.cpp - COM/DCOM Stublet class implementation */
  2. /* Copyright (c) 1999 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01o,17dec01,nel  Add include symbol for diab build.
  7. 01n,13jul01,dbs  fix up includes
  8. 01m,05mar01,nel  SPR#35701. exported objects have too many refcounts.
  9. 01l,10jun99,dbs  remove op new and delete
  10. 01k,04jun99,dbs  add const to vtbl ctor arg
  11. 01j,28may99,dbs  make stub disp-tbl a structure
  12. 01i,27may99,dbs  check method number is in range
  13. 01h,25may99,dbs  Stublet no longer keeps refs to server
  14. 01g,18may99,dbs  change to new marshaling architecture
  15. 01f,14may99,dbs  change stub-function typename
  16. 01e,11may99,dbs  simplify stub remoting architecture
  17. 01d,28apr99,dbs  use COM_MEM_ALLOC for all classes
  18. 01c,27apr99,dbs  add mem-pool to class
  19. 01b,26apr99,aim  added TRACE_CALL
  20. 01a,20apr99,dbs  created during Grand Renaming
  21. */
  22. /*
  23.   DESCRIPTION:
  24.   VxStublet -- records the interface-related into for one interface
  25.   pointer for one (server) object. Its lifetime is always shorter than
  26.   that of the object it is masquerading as, and always shorter than
  27.   its owning StdStub object, so it doesn't keep any references to the
  28.   server object at all.
  29. */
  30. #include "Stublet.h"
  31. #include "private/comMisc.h"
  32. #include "TraceCall.h"
  33. /* Include symbol for diab */
  34. extern "C" int include_vxdcom_Stublet (void)
  35.     {
  36.     return 0;
  37.     }
  38. //////////////////////////////////////////////////////////////////////////
  39. //
  40. // VxStublet method implementations. The stublet maintains a reference
  41. // to the interface it is representing, as long as it lives. This
  42. // ensures that even objects with 'tear-off' or transient interfaces
  43. // can be remoted, as once they have handed out a reference to any
  44. // interface, the stublet for that interface will maintain one
  45. // reference to it until the object is completely destroyed.
  46. //
  47. //////////////////////////////////////////////////////////////////////////
  48. VxStublet::VxStublet
  49.     (
  50.     IUnknown* punkServer,
  51.     REFIID iid,
  52.     REFIPID ipid,
  53.     const VXDCOM_STUB_DISPTBL* dispTbl
  54.     )
  55.       : m_dwRefCount (0),
  56. m_punkServer (punkServer),
  57. m_iidServer (iid),
  58. m_ipid (ipid),
  59. m_pDispTbl (dispTbl)
  60.     {
  61.     TRACE_CALL;
  62.     if (m_punkServer)
  63.         m_punkServer->AddRef ();
  64.     }
  65. //////////////////////////////////////////////////////////////////////////
  66. //
  67. VxStublet::~VxStublet ()
  68.     {
  69.     TRACE_CALL;
  70.     if (m_punkServer)
  71.         m_punkServer->Release ();
  72.     }
  73. //////////////////////////////////////////////////////////////////////////
  74. //
  75. ULONG VxStublet::addRefs (ULONG nRefs)
  76.     {
  77.     TRACE_CALL;
  78.     m_mutex.lock ();
  79.     m_dwRefCount += nRefs;
  80.     m_mutex.unlock ();
  81.     return m_dwRefCount;
  82.     }
  83. //////////////////////////////////////////////////////////////////////////
  84. //
  85. ULONG VxStublet::relRefs (ULONG nRefs)
  86.     {
  87.     TRACE_CALL;
  88.     m_mutex.lock ();
  89.     if (nRefs > m_dwRefCount)
  90. m_dwRefCount = 0;
  91.     else
  92. m_dwRefCount -= nRefs;
  93.     m_mutex.unlock ();
  94.     return m_dwRefCount;
  95.     }
  96. //////////////////////////////////////////////////////////////////////////
  97. //
  98. // VxStublet::stubInfoGet -- gives out the object's interface pointer,
  99. // so in this case it *does* AddREf() it before handing it out. It is
  100. // the caller's responsibility to Release() the interface later...
  101. //
  102. HRESULT VxStublet::stubInfoGet
  103.     (
  104.     ULONG opnum,
  105.     IUnknown** ppunk,
  106.     PFN_ORPC_STUB* ppfn
  107.     )
  108.     {
  109.     if (opnum >= m_pDispTbl->nFuncs)
  110. return MAKE_HRESULT (SEVERITY_ERROR,
  111.      FACILITY_RPC,
  112.      RPC_S_PROCNUM_OUT_OF_RANGE);
  113.     
  114.     m_punkServer->AddRef ();
  115.     *ppunk = m_punkServer;
  116.     *ppfn = m_pDispTbl->funcs [opnum];
  117.     return S_OK;
  118.     }