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

VxWorks

开发平台:

C/C++

  1. /* ObjectTable.h - VxDCOM ObjectTable class definition */
  2. /* Copyright (c) 1999 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01o,13jul01,dbs  fix up includes
  7. 01n,05mar01,nel  SPR#62130 - implement CoDisconnectObject.
  8. 01m,20sep00,nel  Add changes made in T2 since branch.
  9. 01l,17aug99,aim  removed copy ctor and operator= from ObjectTable
  10. 01k,27jul99,drm  Returning CLSID from interfaceInfoGet()
  11. 01j,26jul99,dbs  dont save p/s clsid any longer
  12. 01i,16jul99,dbs  convert map/set with long long key to use new macros
  13. 01h,29jun99,dbs  remove const-ness warnings
  14. 01g,29jun99,dbs  remove ifdef DEBUG around ostream operators
  15. 01f,29jun99,dbs  make StdStub a member of ObjectTableEntry
  16. 01e,17jun99,aim  uses new SCM
  17. 01d,10jun99,dbs  remove inclusion of comNew.h
  18. 01c,03jun99,dbs  no return value from mutex lock
  19. 01b,03jun99,dbs  fix includes for VxMutex class
  20. 01a,02jun99,dbs  created
  21. */
  22. #ifndef __INCObjectTable_h
  23. #define __INCObjectTable_h
  24. #include "dcomLib.h" // basic types, structs, etc
  25. #include "RpcDispatchTable.h" // for table class
  26. #include "MemoryStream.h" // for IStream impl
  27. #include "private/comMisc.h"            // for VxMutex class
  28. #include "StdStub.h"                    // StdStub class
  29. ////////////////////////////////////////////////////////////////////////////
  30. //
  31. // ObjectTableEntry - each object exported by an Object Exporter
  32. // requires a record of this form. It records the useful information
  33. // relating to the object, and allows incoming ORPCs to be dispatched
  34. // against the object.
  35. //
  36. // The table-entry always adds a reference to the stream holding the
  37. // marshaled interface ptr, and releases it upon destruction. It is up
  38. // to the user (usually CoMarshalInterface()) to determine whether an
  39. // extra ref is needed for 'strong' marshaling.
  40. //
  41. #define VXDCOM_PING_TIMEOUT (120 * 3)
  42. struct ObjectTableEntry
  43.     {
  44.     IStream*    pstmMarshaledItfPtr; // stream with marshaled itf ptr
  45.     VxStdStub stdStub;                // std-mshl stub object
  46.     OID         oid; // OID of marshaled object
  47.     CLSID       clsid; // CLSID of object
  48.     IUnknown* punkCF; // class-factory ptr
  49.     DWORD dwRegToken; // factory reg token
  50.     long pingTimeout; // ping timeout (secs)
  51.     bool noPing; // ping defeat mechanism
  52.     
  53.     ObjectTableEntry ();
  54.     ObjectTableEntry (OID o, REFCLSID psc, IStream* pstm, bool);
  55.     ~ObjectTableEntry ();
  56.     void printOn (ostream&) const;
  57.   private:
  58.     // unsupported
  59.     ObjectTableEntry& operator= (const ObjectTableEntry&);
  60.     ObjectTableEntry (const ObjectTableEntry&);
  61.     };
  62. ////////////////////////////////////////////////////////////////////////////
  63. //
  64. // VxObjectTable -- this class implements a type of RpcDispatchTable
  65. // which records all exported objects owned by an Object Exporter.
  66. //
  67. class VxObjectTable : public RpcDispatchTable
  68.     {
  69.     typedef STL_MAP_LL(ObjectTableEntry*) OBJECTMAP;
  70.   public:
  71.     typedef OBJECTMAP::iterator iterator;
  72.     typedef OBJECTMAP::const_iterator const_iterator;
  73.     
  74.     VxObjectTable () {}
  75.     virtual ~VxObjectTable () {}
  76.     // methods inherited from RpcDispatchTable base-class, to look-up
  77.     // interface IDs, and interface pointers
  78.     bool    supportsInterface (REFIID);
  79.     HRESULT interfaceInfoGet (REFIID riid, REFIPID, ULONG, IUnknown**, PFN_ORPC_STUB*, CLSID &);
  80.     // methods to manage exported objects
  81.     ObjectTableEntry* objectRegister (IStream*, REFCLSID, bool noPing);
  82.     ObjectTableEntry* objectFindByOid (OID o);
  83.     ObjectTableEntry* objectFindByStream (IStream* pstm);
  84.     ObjectTableEntry* objectFindByToken (DWORD dwToken);
  85.     ObjectTableEntry* objectFindByIUnknown (IUnknown* punk);
  86.     bool              objectUnregister (OID o);
  87.     iterator begin () { return m_objectTable.begin (); }
  88.     iterator end () { return m_objectTable.end (); }
  89.     const_iterator begin () const { return m_objectTable.begin (); }
  90.     const_iterator end () const { return m_objectTable.end (); }
  91.     void lock () { m_mutex.lock (); }
  92.     void unlock () { m_mutex.unlock (); }
  93.     void printOn (ostream&) const;
  94.   private:
  95.     VxMutex m_mutex; // for task safety
  96.     OBJECTMAP m_objectTable; // OID -> ObjectTableEntry
  97.     };
  98. inline ostream& operator << (ostream& os, const ObjectTableEntry& ote)
  99.     {
  100.     ote.printOn (os);
  101.     return os;
  102.     }
  103. inline ostream& operator << (ostream& os, const VxObjectTable& ot)
  104.     {
  105.     ot.printOn (os);
  106.     return os;
  107.     }
  108. #endif