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

VxWorks

开发平台:

C/C++

  1. /* StdStub.h - COM/DCOM StdStub class definition */
  2. /* Copyright (c) 1999 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01u,13jul01,dbs  fix up includes
  7. 01t,20sep00,nel  Add changes made in T2 since branch.
  8. 01s,27jul99,drm  Returning CLSID from interfaceInfoGet().
  9. 01r,29jun99,dbs  remove obsolete ctor
  10. 01q,28jun99,dbs  make Relase() return refs so deletion can be done by OX
  11. 01p,17jun99,aim  uses new SCM
  12. 01o,10jun99,dbs  remove inclusion of comNew.h
  13. 01n,08jun99,dbs  remove use of mtmap
  14. 01m,04jun99,dbs  change GuidMap to mtmap
  15. 01l,02jun99,dbs  inherit from RpcDispatchTable
  16. 01k,18may99,dbs  change to new marshaling architecture
  17. 01j,11may99,dbs  remove inclusion of ChannelBuffer.h
  18. 01i,11may99,dbs  simplify stub remoting architecture
  19. 01h,10may99,dbs  add method to determine if interface is supported
  20. 01g,28apr99,dbs  make all classes allocate from same pool
  21. 01f,26apr99,dbs  remove class-specific debug code
  22. 01e,26apr99,dbs  add mem-pool to StubInfo class
  23. 01d,26apr99,dbs  add show command
  24. 01c,23apr99,dbs  add mem-pool to class
  25. 01b,21apr99,dbs  add include for IRpcChannelBuffer
  26. 01a,20apr99,dbs  created during Grand Renaming
  27. */
  28. #ifndef __INCStdStub_h
  29. #define __INCStdStub_h
  30. #include "dcomProxy.h"
  31. #include "private/comMisc.h"
  32. #include "private/comStl.h"
  33. #include "RpcDispatchTable.h"
  34. ///////////////////////////////////////////////////////////////////////////
  35. //
  36. // VxStdStub - the standard-marshaling stub (a.k.a. stub manager) which
  37. // represents the server-object for the purposes of remoting its 
  38. // interfaces. It keeps a list of all the stublets (interface stubs)
  39. // it maintains, one for each remoted interface on the object, keyed
  40. // by their IPID, in the table m_stublets. It also maintains a
  41. // parallel table, m_interfaces, which maps from IID to stublet - this
  42. // increases lookup speed when determining if a particular interface
  43. // is supported by the stub itself.
  44. //
  45. // The VxStdStub object itself maintains one reference to the server,
  46. // and each stublet maintains one reference. Remote references are 
  47. // counted per-IPID and only when the total remote ref-count reaches 
  48. // zero is the VxStdStub object destroyed.
  49. //
  50. // Remote refs to the IUnknown of the server are kept in the
  51. // 'm_stublets' table just like all other refs - this makes it easier
  52. // to total up the outstanding refs, etc. However, it does mean the
  53. // IUnknown entry requires special treatment, as IUnknown is not
  54. // remoted, so sometimes (if the client has only asked for IUnknown)
  55. // then there will be an entry in m_interfaces for IID_IUnknown,
  56. // whereas normally there would be an entry for both IID_IUnknown and
  57. // some other IID both pointing to the same stublet.
  58. //
  59. class VxStublet;
  60. class VxStdStub : public RpcDispatchTable
  61.     {
  62.     typedef STL_MAP(GUID, VxStublet*) STUBLETMAP;
  63.     
  64.     IUnknown* m_pUnkServer; // server object
  65.     STUBLETMAP m_stublets; // IPID -> Stublet
  66.     STUBLETMAP m_interfaces; // IID -> Stublet
  67.     OID m_oid; // object ID
  68.     VxMutex m_mutex; // task safety
  69.     
  70.     VxStdStub& operator= (const VxStdStub&);
  71.     VxStdStub::VxStdStub (const VxStdStub&);
  72.     
  73.   public:
  74.     // ctor and dtor
  75.     VxStdStub ();
  76.     ~VxStdStub ();
  77.     // RpcDispatchTable methods
  78.     bool supportsInterface (REFIID);
  79.     HRESULT interfaceInfoGet (REFIID, REFIPID, ULONG, IUnknown**, PFN_ORPC_STUB*, CLSID &);
  80.     IUnknown* getIUnknown () const { return m_pUnkServer; }
  81.     // adopt a particular server object...
  82.     void adopt (IUnknown* punk, OID oid);
  83.     
  84.     // add an interface
  85.     HRESULT interfaceAdd (REFIID iid, DWORD nRefs, IPID* pIpidNew);
  86.     // add remote references per-IPID
  87.     ULONG AddRef (ULONG n, REFIPID ipid);
  88.     ULONG Release (ULONG n, REFIPID ipid);
  89. #ifdef VXDCOM_DEBUG
  90.     void printOn (ostream& os);
  91. #endif
  92.     };
  93. #endif