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

VxWorks

开发平台:

C/C++

  1. /* ObjectTable.cpp -- VxDCOM ObjectTable implementation */
  2. /* Copyright (c) 1999 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01t,17dec01,nel  Add include symbol for diab build.
  7. 01s,30jul01,dbs  fix stupid bug in findByIUnknown as in T2 original
  8. 01r,13jul01,dbs  fix up includes
  9. 01q,05mar01,nel  SPR#62130 - implement CoDisconnectObject.
  10. 01p,20sep00,nel  Add changes made in T2 since branch.
  11. 01o,18sep00,nel  SPR#33730. Merge T2 OPC fixes into T3 branch.
  12. 01n,19aug99,aim  TASK_LOCK now uses mutex
  13. 01m,19aug99,dbs  fix objectFindByOid() bug
  14. 01l,17aug99,aim  removed copy ctor and operator= from ObjectTable
  15. 01k,29jul99,dbs  fix erroneous return of RPC_E_INVALID_IPID
  16. 01j,27jul99,drm  Returning CLSID from interfaceInfoGet()
  17. 01i,26jul99,dbs  dont save p/s clsid any longer
  18. 01h,08jul99,dbs  remove print statements
  19. 01g,29jun99,dbs  remove const-ness warnings
  20. 01f,29jun99,dbs  remove ifdef DEBUG around ostream operators
  21. 01e,29jun99,dbs  make StdStub a member of ObjectTableEntry
  22. 01d,17jun99,aim  uses new SCM
  23. 01c,10jun99,dbs  remove op new and delete
  24. 01b,02jun99,dbs  use new OS-specific macros
  25. 01a,02jun99,dbs  created
  26. */
  27. #include <stdlib.h>
  28. #include "ObjectTable.h"
  29. #include "dcomLib.h"
  30. #include "private/comMisc.h"
  31. #include "SCM.h"
  32. #include "StdStub.h"
  33. #include "orpcLib.h"
  34. /* Include symbol for diab */
  35. extern "C" int include_vxdcom_ObjectTable (void)
  36.     {
  37.     return 0;
  38.     }
  39. //////////////////////////////////////////////////////////////////////////
  40. //
  41. // ObjectTableEntry default ctor -- 
  42. //
  43. ObjectTableEntry::ObjectTableEntry ()
  44.   : pstmMarshaledItfPtr (0),
  45.     oid (0),
  46.     punkCF (0),
  47.     dwRegToken (0),
  48.     pingTimeout (0),
  49.     noPing (false)
  50.     {
  51.     TRACE_CALL;
  52.     }
  53. //////////////////////////////////////////////////////////////////////////
  54. //
  55. // ObjectTableEntry ctor -- always AddRef() on stream while its in
  56. // this table entry...
  57. //
  58. ObjectTableEntry::ObjectTableEntry
  59.     (
  60.     OID        o,
  61.     REFCLSID    cls,
  62.     IStream*    pstm,
  63.     bool    npng
  64.     )
  65.       : pstmMarshaledItfPtr (pstm),
  66.     oid (o),
  67.     clsid (cls),
  68.     punkCF (0),
  69.     dwRegToken (0),
  70.     pingTimeout (VXDCOM_PING_TIMEOUT),
  71.     noPing (npng)
  72.     {
  73.     TRACE_CALL;
  74.     if (pstmMarshaledItfPtr)
  75.     pstmMarshaledItfPtr->AddRef ();
  76.     }
  77. //////////////////////////////////////////////////////////////////////////
  78. //
  79. // ObjectTableEntry dtor -- releases stream...
  80. //
  81. ObjectTableEntry::~ObjectTableEntry ()
  82.     {
  83.     TRACE_CALL;
  84.     if (pstmMarshaledItfPtr)
  85.     pstmMarshaledItfPtr->Release ();
  86.     }
  87. ////////////////////////////////////////////////////////////////////////////
  88. //
  89. ObjectTableEntry* VxObjectTable::objectRegister
  90.     (
  91.     IStream*        pstmItfPtr,
  92.     REFCLSID        cls,
  93.     bool        noPing
  94.     )
  95.     {
  96.     TRACE_CALL;
  97.     VxCritSec cs (m_mutex);
  98.     OID oidNew = SCM::theSCM()->nextOid ();
  99.     // Add new entry to export table, for this OID...
  100.     ObjectTableEntry* pOTE = new ObjectTableEntry (oidNew,
  101.                            cls,
  102.                            pstmItfPtr,
  103.                            noPing);
  104.     m_objectTable [oidNew] = pOTE;
  105.     return pOTE;
  106.     }
  107. ////////////////////////////////////////////////////////////////////////////
  108. //
  109. ObjectTableEntry* VxObjectTable::objectFindByOid
  110.     (
  111.     OID            oid
  112.     )
  113.     {
  114.     TRACE_CALL;
  115.     // Look for entry...
  116.     VxCritSec cs (m_mutex);
  117.     OBJECTMAP::const_iterator i = m_objectTable.find (oid);
  118.     if (i == m_objectTable.end ())
  119.     return 0;
  120.     
  121.     return (*i).second;
  122.     }
  123. ////////////////////////////////////////////////////////////////////////////
  124. //
  125. ObjectTableEntry* VxObjectTable::objectFindByStream
  126.     (
  127.     IStream*        pStm
  128.     )
  129.     {
  130.     TRACE_CALL;
  131.     VxCritSec cs (m_mutex);
  132.     // Must do linear search, as the table key is OID...
  133.     OBJECTMAP::const_iterator i = m_objectTable.begin ();
  134.     while (i != m_objectTable.end ())
  135.     {
  136.     ObjectTableEntry*    pOTE = (*i).second;
  137.     
  138.     if (pOTE->pstmMarshaledItfPtr == pStm)
  139.         return pOTE;
  140.     ++i;
  141.     }
  142.     
  143.     return 0;
  144.     }
  145. ////////////////////////////////////////////////////////////////////////////
  146. //
  147. ObjectTableEntry* VxObjectTable::objectFindByToken
  148.     (
  149.     DWORD        dwToken
  150.     )
  151.     {
  152.     TRACE_CALL;
  153.     VxCritSec cs (m_mutex);
  154.     // Must do linear search, as table key is OID...
  155.     OBJECTMAP::const_iterator i = m_objectTable.begin ();
  156.     while (i != m_objectTable.end ())
  157.     {
  158.     ObjectTableEntry*    pOTE  = (*i).second;
  159.     if (pOTE->dwRegToken == dwToken)
  160.         return pOTE;
  161.     ++i;
  162.     }
  163.     
  164.     // Not found, if we get here...
  165.     return 0;
  166.     }
  167. ////////////////////////////////////////////////////////////////////////////
  168. //
  169. ObjectTableEntry* VxObjectTable::objectFindByIUnknown
  170.     (
  171.     IUnknown* punk
  172.     )
  173.     {
  174.     TRACE_CALL;
  175.     ObjectTableEntry* pOTE = 0;
  176.     VxCritSec cs (m_mutex);
  177.     // Must do linear search, as table key is OID...
  178.     OBJECTMAP::const_iterator i = m_objectTable.begin ();
  179.     while (i != m_objectTable.end ())
  180. {
  181. pOTE = (*i).second;
  182. if (pOTE->stdStub.getIUnknown () == punk)
  183.             return pOTE;
  184. ++i;
  185. }
  186.     
  187.     return 0;
  188.     }
  189. ////////////////////////////////////////////////////////////////////////////
  190. //
  191. bool VxObjectTable::objectUnregister (OID oid)
  192.     {
  193.     TRACE_CALL;
  194.     size_t nErased = 0;
  195.     VxCritSec cs (m_mutex);
  196.     ObjectTableEntry* pOTE = objectFindByOid (oid);
  197.     DELZERO (pOTE);
  198.     nErased = m_objectTable.erase (oid);
  199.     return (nErased != 0);
  200.     }
  201. //////////////////////////////////////////////////////////////////////////
  202. //
  203. // VxObjectTable::supportsInterface -- determine if the table contains
  204. // an entry corresponding to the given interface identifier...
  205. //
  206. bool VxObjectTable::supportsInterface (REFIID riid)
  207.     {
  208.     bool bSupports = false;
  209.     
  210.     // Must do linear search, as table key is OID...
  211.     VxCritSec cs (m_mutex);
  212.     
  213.     OBJECTMAP::iterator i = m_objectTable.begin ();
  214.     while (i != m_objectTable.end ())
  215.     {
  216.     if ((*i).second->stdStub.supportsInterface (riid))
  217.         {
  218.         bSupports = true;
  219.         break;
  220.         }
  221.     ++i;
  222.     }
  223.     return bSupports;
  224.     }
  225. //////////////////////////////////////////////////////////////////////////
  226. //
  227. // VxObjectTable::interfaceInfoGet -- returns the info required to
  228. // dispatch a method call on an Object Interface...
  229. //
  230. HRESULT VxObjectTable::interfaceInfoGet
  231.     (
  232.     REFIID      riid,
  233.     REFIPID        ripid,
  234.     ULONG        methodNum,
  235.     IUnknown**        ppUnk,
  236.     PFN_ORPC_STUB*    ppfn,
  237.     CLSID &        classid
  238.     )
  239.     {
  240.     HRESULT hr = S_OK;
  241.     
  242.     OID oid = orpcOidFromIpid (ripid);
  243.     ObjectTableEntry* pOTE = objectFindByOid (oid);
  244.     if (pOTE)
  245.         {
  246.     // Both the VxStdStub and VxObjectTable inherit from
  247.     // RpcDispatchTable which declares the interfaceInfoGet() method.
  248.     // Only the VxObjectTable knows the CLSID for the class being
  249.     // invoked by RemoteActivation, so we ignore the CLSID from
  250.     // VxStdStub::interfaceInfoGet() and replace it with the value
  251.     // here.
  252.     hr = pOTE->stdStub.interfaceInfoGet (riid, 
  253.                          ripid,
  254.                          methodNum,
  255.                          ppUnk,
  256.                          ppfn,
  257.                          classid);
  258.         if (SUCCEEDED (hr))
  259.             classid = pOTE->clsid;
  260.     else
  261.         classid = GUID_NULL;
  262.         }
  263.     else
  264.     hr = RPC_E_INVALID_IPID;
  265.     return hr;
  266.     }
  267. //////////////////////////////////////////////////////////////////////////
  268. void ObjectTableEntry::printOn (ostream& os) const
  269.     {
  270.     os << "ObjectTableEntry:oid=" << (int) oid << endl;
  271.     }
  272. void VxObjectTable::printOn (ostream& os) const
  273.     {
  274.     os << "ObjectTable:" << endl;
  275.     for (const_iterator i = begin (); i != end (); ++i)
  276.     os << (*i).second;
  277.     }