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

VxWorks

开发平台:

C/C++

  1. /* InterfaceProxy.cpp - COM/DCOM interface-proxy class implementation */
  2. /* Copyright (c) 1999 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01q,17dec01,nel  Add include symbol for diab build.
  7. 01p,08aug01,dbs  fix compiler warning
  8. 01o,24jul01,dbs  add public inner-proxy structure
  9. 01n,13jul01,dbs  fix up includes
  10. 01m,19aug99,aim  added TraceCall header
  11. 01l,16jul99,aim  added vxdcom header
  12. 01k,10jun99,dbs  remove op new and delete
  13. 01j,03jun99,dbs  no return value from mutex lock
  14. 01i,03jun99,dbs  remove refs to comSyncLib
  15. 01h,25may99,dbs  initialise remote-ref count to zero in ctor
  16. 01g,13may99,dbs  remove usage of IRpcChannelBuffer
  17. 01f,11may99,dbs  simplify proxy remoting architecture
  18. 01e,29apr99,dbs  fix -Wall warnings
  19. 01d,28apr99,dbs  use COM_MEM_ALLOC for all classes
  20. 01c,27apr99,dbs  add mem-pool to class
  21. 01b,26apr99,aim  added TRACE_CALL
  22. 01a,20apr99,dbs  created during Grand Renaming
  23. */
  24. #include "private/comMisc.h"
  25. #include "private/comMisc.h"
  26. #include "StdProxy.h"
  27. #include "InterfaceProxy.h"
  28. #include "TraceCall.h"
  29. /* Include symbol for diab */
  30. extern "C" int include_vxdcom_InterfaceProxy (void)
  31.     {
  32.     return 0;
  33.     }
  34. //////////////////////////////////////////////////////////////////////////
  35. //
  36. const int MAGIC = 0xFACEFACE;
  37. //////////////////////////////////////////////////////////////////////////
  38. //
  39. // VxInterfaceProxy method implementations...
  40. //
  41. //////////////////////////////////////////////////////////////////////////
  42. VxInterfaceProxy::VxInterfaceProxy
  43.     (
  44.     REFIID         iid,
  45.     REFIPID         ipid,
  46.     IUnknown *          pUnkOuter,
  47.     const void *        pvVtbl
  48.     )
  49.   : m_iidManaged (iid),
  50.      m_ipid (ipid),
  51.      m_dwRefCount (0),
  52.      m_pUnkOuter (pUnkOuter),
  53.      m_pChannel (0)
  54.     {
  55.     m_interface.lpVtbl = pvVtbl;
  56.     m_interface.magic = MAGIC;
  57.     m_interface.backptr = this;
  58.     }
  59.     
  60. //////////////////////////////////////////////////////////////////////////
  61. //
  62. VxInterfaceProxy::~VxInterfaceProxy ()
  63.     {
  64.     m_interface.magic = 0;
  65.     m_interface.backptr = 0;
  66.     if (m_pChannel)
  67.         m_pChannel->Release ();
  68.     }
  69. //////////////////////////////////////////////////////////////////////////
  70. //
  71. ULONG VxInterfaceProxy::AddRef ()
  72.     {
  73.     return comSafeInc (&m_dwRefCount);
  74.     }
  75. //////////////////////////////////////////////////////////////////////////
  76. //
  77. ULONG VxInterfaceProxy::Release ()
  78.     {
  79.     DWORD n = comSafeDec (&m_dwRefCount);
  80.     if (n == 0)
  81. delete this;
  82.     return n;
  83.     }
  84. //////////////////////////////////////////////////////////////////////////
  85. //
  86. // VxInterfaceProxy::QueryInterface - private QI implementation
  87. //
  88. // This is the QI implementation for the VxInterfaceProxy's private
  89. // IUnknown (actually IOrpcProxy) which is seen only by the containing
  90. // StdProxy. It can be QI'ed for either IOrpcProxy, in which case it
  91. // returns its own primary interface, or for the managed interface, in
  92. // which case it returns the delegating proxy-interface.
  93. //
  94. HRESULT VxInterfaceProxy::QueryInterface (REFIID riid, void** ppv)
  95.     {
  96.     if (riid == IID_IOrpcProxy)
  97.         {
  98.         *ppv = this;
  99.         AddRef ();
  100.         return S_OK;
  101.         }
  102.     else if (riid == m_iidManaged)
  103.         {
  104.         *ppv = &m_interface;
  105.         m_pUnkOuter->AddRef ();
  106.         return S_OK;
  107.         }
  108.     return E_NOINTERFACE;
  109.     }
  110. //////////////////////////////////////////////////////////////////////////
  111. //
  112. HRESULT VxInterfaceProxy::interfaceInfoGet
  113.     (
  114.     IPID *                      pIpid,
  115.     IOrpcClientChannel**        ppChan
  116.     )
  117.     {
  118.     *pIpid = m_ipid;
  119.     if (! m_pChannel)
  120.         cout << "Channel gone away!" << endl;
  121.     
  122.     return m_pChannel->QueryInterface (IID_IOrpcClientChannel,
  123.                                        (void**) ppChan);
  124.     }
  125. //////////////////////////////////////////////////////////////////////////
  126. //
  127. HRESULT VxInterfaceProxy::Connect (IOrpcClientChannel* pChan)
  128.     {
  129.     // We should not be connected...
  130.     if (m_pChannel && (m_pChannel != pChan))
  131.         return E_UNEXPECTED;        
  132.     // Store a ref to the channel...
  133.     m_pChannel = pChan;
  134.     m_pChannel->AddRef ();
  135.     return S_OK;
  136.     }
  137. //////////////////////////////////////////////////////////////////////////
  138. //
  139. HRESULT VxInterfaceProxy::Disconnect ()
  140.     {
  141.     if (m_pChannel)
  142.         {
  143.         m_pChannel->Release ();
  144.         m_pChannel = 0;
  145.         return S_OK;
  146.         }
  147.     return E_UNEXPECTED;
  148.     }
  149. //////////////////////////////////////////////////////////////////////////
  150. //
  151. VxInterfaceProxy* VxInterfaceProxy::safe_cast (const void* pvInterface)
  152.     {
  153.     void * pv = const_cast<void*> (pvInterface);
  154.     interface_t* pitf = reinterpret_cast<interface_t*> (pv);
  155.     if (pitf->magic != MAGIC)
  156.         return 0;
  157.     return pitf->backptr;
  158.     }
  159. //////////////////////////////////////////////////////////////////////////
  160. //
  161. // The following functions provide the vtable entries for the IUnknown 
  162. // slots in proxy interfaces. They provide the IUnknown remoting
  163. // functionality for all exposed, derived interfaces of a proxy
  164. // object. They effectively form the IUnknown-methods of the public
  165. // interface of any instance of VxInterfaceProxy, and all they do is
  166. // delegate to the controlling unknown...
  167. //
  168. HRESULT IUnknown_QueryInterface_vxproxy
  169.     (
  170.     IUnknown*       punkThis,
  171.     REFIID          iid,
  172.     void**          ppv
  173.     )
  174.     {
  175.     VxInterfaceProxy* pProxy = VxInterfaceProxy::safe_cast (punkThis);
  176.     if (! pProxy)
  177.         return E_NOINTERFACE;
  178.     return pProxy->pUnkOuter()->QueryInterface (iid, ppv);
  179.     }
  180. ULONG IUnknown_AddRef_vxproxy
  181.     (
  182.     IUnknown*        punkThis
  183.     )
  184.     {
  185.     VxInterfaceProxy* pProxy = VxInterfaceProxy::safe_cast (punkThis);
  186.     if (! pProxy)
  187.         return 0;
  188.     return pProxy->pUnkOuter()->AddRef ();
  189.     }
  190. ULONG IUnknown_Release_vxproxy
  191.     (
  192.     IUnknown*       punkThis
  193.     )
  194.     {
  195.     VxInterfaceProxy* pProxy = VxInterfaceProxy::safe_cast (punkThis);
  196.     if (! pProxy)
  197.         return 0;
  198.     return pProxy->pUnkOuter()->Release ();
  199.     }