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

VxWorks

开发平台:

C/C++

  1. /* StdProxy.h - COM/DCOM StdProxy class definition */
  2. /*
  3. modification history
  4. --------------------
  5. 01x,25jul01,dbs  fix and improve description for IUnknown proxy methods
  6. 01w,13jul01,dbs  fix up includes
  7. 01v,29mar01,nel  SPR#35873. Add extra param to FaceletAdd to indicate that
  8.                  interface has been bound through RemQueryInterface and should
  9.                  issue a context switch rather than a bind.
  10. 01u,06mar01,nel  SPR#35589. Add code to make Oxid addresses unique to prevent
  11.                  clash with other targets.
  12. 01t,28feb00,dbs  fix IRemUnknown facelet so it is never Release()'ed
  13. 01s,15feb00,dbs  implement IRemUnknown calls directly
  14. 01r,16jul99,dbs  convert map/set with long long key to use new macros
  15. 01q,09jul99,dbs  implement ping functionality in SCM now
  16. 01p,08jul99,dbs  mods for RemoteOxid changes
  17. 01o,06jul99,aim  change from RpcBinding to RpcIfClient
  18. 01n,30jun99,dbs  make Facelet-map contain smart-pointers
  19. 01m,10jun99,dbs  remove inclusion of comNew.h
  20. 01l,08jun99,dbs  remove use of mtmap
  21. 01k,07jun99,dbs  change GuidMap to mtmap
  22. 01j,27may99,dbs  implement Ping functionality
  23. 01i,17may99,dbs  remove IID from args of interaceInfoGet
  24. 01h,13may99,dbs  change BufferInit method to interfaceInfoGet
  25. 01g,11may99,dbs  simplify proxy remoting architecture
  26. 01f,29apr99,dbs  fix -Wall warnings
  27. 01e,28apr99,dbs  make all classes allocate from same pool
  28. 01d,26apr99,dbs  add mem-pool to class
  29. 01c,22apr99,dbs  tidy up potential leaks
  30. 01b,21apr99,dbs  add length arg to orpcDSAFormat()
  31. 01a,20apr99,dbs  created during Grand Renaming
  32. */
  33. #ifndef __INCStdProxy_h
  34. #define __INCStdProxy_h
  35. #include "private/comMisc.h"
  36. #include "private/comStl.h"
  37. #include "RemoteOxid.h"
  38. #include "comObjLib.h"
  39. #include "orpc.h"
  40. typedef CComPtr<IOrpcClientChannel> IOrpcClientChannelPtr;
  41. ///////////////////////////////////////////////////////////////////////////
  42. //
  43. // VxStdProxy - the main 'proxy manager' object that is created to
  44. // 'impersonate' a server object, when that server actually lives on a
  45. // different machine.
  46. //
  47. // It maintains a list of 'facelets' (one per remoted interface) and
  48. // defers all methods to those interfaces, except its own IUnknown and
  49. // IMarshal methods. The member 'm_facelets' has one entry per
  50. // facelet, plus one entry for the IUnknown of the VxStdProxy
  51. // itself. The class provides methods to find the appropriate instance
  52. // given any valid interface-pointer.
  53. //
  54. class VxStdProxy : public IMarshal
  55.     {
  56.   public:
  57.     VxStdProxy ();
  58.     virtual ~VxStdProxy ();
  59.     // IUnknown methods...
  60.     STDMETHOD_(ULONG, AddRef) ();
  61.     STDMETHOD_(ULONG, Release) ();
  62.     STDMETHOD(QueryInterface) (REFIID riid, void** ppv);
  63.     
  64.     // IMarshal methods...
  65.     HRESULT STDMETHODCALLTYPE GetUnmarshalClass
  66. (
  67.         REFIID,
  68.         void*, 
  69.         DWORD, 
  70.         void*, 
  71.         DWORD, 
  72.         CLSID*
  73.         );
  74.         
  75.     HRESULT STDMETHODCALLTYPE GetMarshalSizeMax
  76. (
  77.         REFIID, 
  78.         void*, 
  79.         DWORD, 
  80.         void*, 
  81.         DWORD, 
  82.         DWORD*
  83.         );
  84.     HRESULT STDMETHODCALLTYPE MarshalInterface
  85. (
  86.         IStream*, 
  87.         REFIID, 
  88.         void*, 
  89.         DWORD, 
  90.         void*, 
  91.         DWORD
  92.         );
  93.         
  94.     HRESULT STDMETHODCALLTYPE UnmarshalInterface
  95.         IStream* pStm,
  96.         REFIID riid,
  97.         void** ppv
  98. );
  99.         
  100.     HRESULT STDMETHODCALLTYPE ReleaseMarshalData (IStream *pStm);
  101.     HRESULT STDMETHODCALLTYPE DisconnectObject (DWORD dwReserved);
  102.     // Accessors for apartment and object identifiers...
  103.     OID  oid () const { return m_oid; }
  104.     OXID oxid () const
  105.         {
  106.         if (m_pOxid)
  107.             return m_pOxid->oxid ();
  108.         return 0;
  109.         }
  110.   private:
  111.     // Private class for holding a facelet (a single interface proxy)
  112.     // via its IOrpcProxy interface. We need to record some info about
  113.     // the interface proxy, like its IPID and the number of remote
  114.     // refs it has...
  115.     struct facelet_t
  116.         {
  117.         CComPtr<IOrpcProxy>     pProxy;
  118.         DWORD                   remoteRefCount;
  119.         IPID                    ipid;
  120.         facelet_t ()
  121.             {}
  122.         facelet_t (IOrpcProxy* px, DWORD n, REFIPID id)
  123.             : pProxy (px), remoteRefCount (n), ipid (id)
  124.             {}
  125.         
  126.         facelet_t (const facelet_t& x)
  127.             { *this = x; }
  128.         facelet_t& operator= (const facelet_t& x)
  129.             {
  130.             remoteRefCount = x.remoteRefCount;
  131.             pProxy = x.pProxy;
  132.             ipid = x.ipid;
  133.             return *this;
  134.             }
  135.         };
  136.     // Find a facelet representing the given interface...
  137.     facelet_t* faceletFind (REFIID iid);
  138.     // Add a facelet for the given IID/IPID to this std-proxy, with
  139.     // <nRefs> remote references, and return the resulting interface
  140.     // pointer (of type <iid>) at <ppv>...
  141.     HRESULT faceletAdd
  142.         (
  143.         REFIID              riid,
  144.         REFIPID             ipidNew,
  145.         DWORD               nRefs,
  146.         void**              ppv
  147.         );
  148.     
  149.     // Private data-structures for recording remote Object Exporters,
  150.     // which are effectively 'apartments' in M$-speak and are
  151.     // identified by OXID, and mapping to a table of OID-to-proxy
  152.     // lookup...
  153.     typedef STL_MAP_LL(VxStdProxy*) RemoteApartment_t;
  154.     typedef STL_MAP_LL(RemoteApartment_t)       OXID2RemApartment_t;
  155.     // Map of all facelets, indexed by interface-pointer...
  156.     typedef STL_MAP(void*, facelet_t)           FACELETMAP;
  157.     
  158.     // Static data - map of OXID => remote-apartment...
  159.     static OXID2RemApartment_t  s_allProxies;
  160.     static VxMutex         s_allProxiesMutex;
  161.         
  162.     // Instance data 
  163.     LONG                m_dwRefCount; // local ref count
  164.     VxMutex m_mutex; // task-safety
  165.     FACELETMAP          m_facelets; // map of facelets
  166.     SPRemoteOxid m_pOxid; // OXID proxy object
  167.     IOrpcClientChannelPtr m_pChannel; // RPC client handle
  168.     OID                 m_oid;          // OID in server
  169.     RpcStringBinding m_resAddr; // oxid-resolver address
  170.     IRemUnknown* m_pRemUnknown; // proxy to obj exporter
  171.     facelet_t* m_pRemUnkFacelet; // special facelet
  172.     };
  173. #endif