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

VxWorks

开发平台:

C/C++

  1. /* ObjectExporter.h - COM/DCOM ObjectExporter class definition */
  2. /* Copyright (c) 1998 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 02a,03aug01,dbs  re-instate ref-counting methods
  7. 01z,30jul01,dbs  import later T2 changes
  8. 01y,19jul01,dbs  fix include-path of Remoting.h
  9. 01x,13jul01,dbs  fix up includes
  10. 01w,02mar01,nel  SPR#62130 - implement CoDisconnectObject.
  11. 01v,23feb00,dbs  add full ref-counting impl
  12. 01u,30jul99,aim  added thread pooling
  13. 01t,26jul99,dbs  move marshaling into exporter
  14. 01s,15jul99,aim  replaced RpcINETAddr
  15. 01r,09jul99,dbs  copy in replacement class from NObjectExporter files
  16. 01q,10jun99,dbs  replace explicit new/delete with macro
  17. 01p,02jun99,dbs  use export-table inheriting from RpcDispatchTable
  18. 01o,01jun99,dbs  add NOPING flag
  19. 01n,27may99,dbs  add get-class-object mode support
  20. 01m,27may99,dbs  implement IOXIDResolver functionality
  21. 01l,25may99,dbs  get OID and OXID values from SCM for uniqueness
  22. 01k,24may99,dbs  enhance SCM/ObjectExporter relationship
  23. 01j,18may99,dbs  remove old marshaling scheme
  24. 01i,11may99,dbs  change name of ChannelBuffer.h to Remoting.h
  25. 01h,07may99,dbs  add RPC-dispatcher functionality to SCM
  26. 01g,29apr99,dbs  fix -Wall warnings
  27. 01f,28apr99,dbs  make all classes allocate from same pool
  28. 01e,28apr99,dbs  must delete OTE in objectUnregister()
  29. 01d,27apr99,dbs  add mem-pool to classes
  30. 01c,22apr99,dbs  improve iteration mechanism
  31. 01b,21apr99,dbs  add include for IRpcChannelBuffer
  32. 01a,20apr99,dbs  created during Grand Renaming
  33. */
  34. #ifndef __INCObjectExporter_h
  35. #define __INCObjectExporter_h
  36. #include "RemUnknown.h" // IRemUnknown interface
  37. #include "dcomLib.h" // basic types, structs, etc
  38. #include "MemoryStream.h"
  39. #include "StdStub.h"
  40. #include "RpcIfServer.h"
  41. #include "private/comMisc.h"
  42. #include "ObjectTable.h"
  43. ////////////////////////////////////////////////////////////////////////////
  44. //
  45. // ObjectExporter -- this class implements an object which 'exports'
  46. // a number of COM-objects. In the current prototype design, there is
  47. // only one object-exporter per system, and hence one OXID value. The
  48. // object records all OIDs and IPIDs exported, and can verify them
  49. // when an incoming ORPC is to be dispatched.
  50. //
  51. // Also, note that there is only ever one SCM task, and one
  52. // IOXIDResolver interface, per machine. However, there may (in
  53. // future) be multiple Object Exporters, perhaps one per Protection
  54. // Domain in VxWorks 6.0 for example.
  55. //
  56. // The SCM creates object exporters in response to incoming activation
  57. // requests, and once an exporter has been created, it stays around
  58. // effectively forever, or until its containing application dies. In
  59. // VxWorks 5.x there is no such thing as an 'application' really, so
  60. // the one and only exporter stays around forever (i.e. until the
  61. // system restarts).
  62. //
  63. // In future (e.g. VxWorks 6.x) there may well be applications, in the
  64. // context of Protection Domains, and so an exporter may well be
  65. // destroyed when a PD is destroyed. This will become the SCM's
  66. // responsibility, and so it will always retain a reference to
  67. // an exporter whilst the exporter remains in the SCM's tables.
  68. //
  69. class Reactor;
  70. class ObjectExporter : public RpcIfServer, public IRemUnknown
  71.     {
  72.   public:
  73.     virtual ~ObjectExporter ();
  74.     ObjectExporter (Reactor*, OXID);
  75.     HRESULT init ();
  76.     // method to 'ping' one object (identified by its OID)...
  77.     HRESULT oidPing (OID oid);
  78.     // method to time-out all exported objects
  79.     HRESULT tick (size_t nSecs);
  80.     
  81.     // IUnknown functions
  82.     STDMETHOD_(ULONG, AddRef) ();
  83.     STDMETHOD_(ULONG, Release) ();
  84.     STDMETHOD(QueryInterface) (REFIID, void**);
  85.     // IRemUnknown methods 
  86.     STDMETHOD(RemQueryInterface)
  87.         (
  88.         REFIPID         ipid,
  89.         ULONG           cRefs,
  90.         USHORT          cIIDs,
  91.         const IID*      iids,
  92.         REMQIRESULT**   ppQIResults
  93.         );
  94.     STDMETHOD(RemAddRef)
  95.         (
  96.         USHORT          cInterfaceRefs,
  97.         REMINTERFACEREF interfaceRefs [],
  98.         HRESULT*        pResults
  99.         );
  100.     STDMETHOD(RemRelease) 
  101.         (
  102.         USHORT          cInterfaceRefs,
  103.         REMINTERFACEREF interfaceRefs []
  104.         );
  105.     // get OXID value
  106.     OXID oxid () const { return m_oxid; };
  107.     // get IPID of IRemUnknown
  108.     IPID ipidRemUnknown () const
  109. { return m_ipidRemUnknown; }
  110.     // get server's listening network address
  111.     HRESULT addressBinding (BSTR*);
  112.     // method to marshal an object for remoting
  113.     HRESULT objectMarshal
  114. (
  115. REFCLSID rclsid, // class ID
  116. IStream* pStm, // stream to marshal into
  117. REFIID riid, // interface IID
  118. IUnknown* pUnk, // interface-ptr to be marshaled
  119. DWORD dwDestContext,  // destination context
  120. void* pvDestContext,  // reserved for future use
  121. DWORD mshlflags, // reason for marshaling
  122. ObjectTableEntry** ppOTE // resulting table entry
  123. );
  124.     // methods to search for remoted objects
  125.     ObjectTableEntry* objectFindByOid (OID o);
  126.     ObjectTableEntry* objectFindByStream (IStream* pstm);
  127.     ObjectTableEntry* objectFindByToken (DWORD dwToken);
  128.     ObjectTableEntry* objectFindByIUnknown (IUnknown*);
  129.     // method to unregister a remoted object
  130.     bool              objectUnregister (OID o);
  131.     // method to unregister all remoted objects forcefully
  132.     void objectUnregisterAll ();
  133.   protected:
  134.     ObjectExporter (); // ensure ObjectExporter is an ABC.
  135.   private:
  136.     OXID                m_oxid; // our OXID
  137.     IPID                m_ipidRemUnknown;// our IRemUnknown IPID
  138.     VxObjectTable m_objectTable;
  139.     RpcDispatcher m_dispatcher;
  140.     VxMutex m_mutex; // internal sync
  141.     OID m_oid;
  142.     LONG                m_dwRefCount;
  143.     
  144.     // unsupported
  145.     ObjectExporter (const ObjectExporter& other);
  146.     ObjectExporter& operator= (const ObjectExporter& rhs);
  147.     };
  148. #endif