⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 objecttable.cpp

📁 dcom机制在vxworks上的实现源代码
💻 CPP
字号:
/* ObjectTable.cpp -- VxDCOM ObjectTable implementation *//* Copyright (c) 1999 Wind River Systems, Inc. *//*modification history--------------------01t,17dec01,nel  Add include symbol for diab build.01s,30jul01,dbs  fix stupid bug in findByIUnknown as in T2 original01r,13jul01,dbs  fix up includes01q,05mar01,nel  SPR#62130 - implement CoDisconnectObject.01p,20sep00,nel  Add changes made in T2 since branch.01o,18sep00,nel  SPR#33730. Merge T2 OPC fixes into T3 branch.01n,19aug99,aim  TASK_LOCK now uses mutex01m,19aug99,dbs  fix objectFindByOid() bug01l,17aug99,aim  removed copy ctor and operator= from ObjectTable01k,29jul99,dbs  fix erroneous return of RPC_E_INVALID_IPID01j,27jul99,drm  Returning CLSID from interfaceInfoGet()01i,26jul99,dbs  dont save p/s clsid any longer01h,08jul99,dbs  remove print statements01g,29jun99,dbs  remove const-ness warnings01f,29jun99,dbs  remove ifdef DEBUG around ostream operators01e,29jun99,dbs  make StdStub a member of ObjectTableEntry01d,17jun99,aim  uses new SCM01c,10jun99,dbs  remove op new and delete01b,02jun99,dbs  use new OS-specific macros01a,02jun99,dbs  created*/#include <stdlib.h>#include "ObjectTable.h"#include "dcomLib.h"#include "private/comMisc.h"#include "SCM.h"#include "StdStub.h"#include "orpcLib.h"/* Include symbol for diab */extern "C" int include_vxdcom_ObjectTable (void)    {    return 0;    }////////////////////////////////////////////////////////////////////////////// ObjectTableEntry default ctor -- //ObjectTableEntry::ObjectTableEntry ()  : pstmMarshaledItfPtr (0),    oid (0),    punkCF (0),    dwRegToken (0),    pingTimeout (0),    noPing (false)    {    TRACE_CALL;    }////////////////////////////////////////////////////////////////////////////// ObjectTableEntry ctor -- always AddRef() on stream while its in// this table entry...//ObjectTableEntry::ObjectTableEntry    (    OID        o,    REFCLSID    cls,    IStream*    pstm,    bool    npng    )      : pstmMarshaledItfPtr (pstm),    oid (o),    clsid (cls),    punkCF (0),    dwRegToken (0),    pingTimeout (VXDCOM_PING_TIMEOUT),    noPing (npng)    {    TRACE_CALL;    if (pstmMarshaledItfPtr)    pstmMarshaledItfPtr->AddRef ();    }////////////////////////////////////////////////////////////////////////////// ObjectTableEntry dtor -- releases stream...//ObjectTableEntry::~ObjectTableEntry ()    {    TRACE_CALL;    if (pstmMarshaledItfPtr)    pstmMarshaledItfPtr->Release ();    }//////////////////////////////////////////////////////////////////////////////ObjectTableEntry* VxObjectTable::objectRegister    (    IStream*        pstmItfPtr,    REFCLSID        cls,    bool        noPing    )    {    TRACE_CALL;    VxCritSec cs (m_mutex);    OID oidNew = SCM::theSCM()->nextOid ();    // Add new entry to export table, for this OID...    ObjectTableEntry* pOTE = new ObjectTableEntry (oidNew,                           cls,                           pstmItfPtr,                           noPing);    m_objectTable [oidNew] = pOTE;    return pOTE;    }//////////////////////////////////////////////////////////////////////////////ObjectTableEntry* VxObjectTable::objectFindByOid    (    OID            oid    )    {    TRACE_CALL;    // Look for entry...    VxCritSec cs (m_mutex);    OBJECTMAP::const_iterator i = m_objectTable.find (oid);    if (i == m_objectTable.end ())    return 0;        return (*i).second;    }//////////////////////////////////////////////////////////////////////////////ObjectTableEntry* VxObjectTable::objectFindByStream    (    IStream*        pStm    )    {    TRACE_CALL;    VxCritSec cs (m_mutex);    // Must do linear search, as the table key is OID...    OBJECTMAP::const_iterator i = m_objectTable.begin ();    while (i != m_objectTable.end ())    {    ObjectTableEntry*    pOTE = (*i).second;        if (pOTE->pstmMarshaledItfPtr == pStm)        return pOTE;    ++i;    }        return 0;    }//////////////////////////////////////////////////////////////////////////////ObjectTableEntry* VxObjectTable::objectFindByToken    (    DWORD        dwToken    )    {    TRACE_CALL;    VxCritSec cs (m_mutex);    // Must do linear search, as table key is OID...    OBJECTMAP::const_iterator i = m_objectTable.begin ();    while (i != m_objectTable.end ())    {    ObjectTableEntry*    pOTE  = (*i).second;    if (pOTE->dwRegToken == dwToken)        return pOTE;    ++i;    }        // Not found, if we get here...    return 0;    }//////////////////////////////////////////////////////////////////////////////ObjectTableEntry* VxObjectTable::objectFindByIUnknown    (    IUnknown*	punk    )    {    TRACE_CALL;    ObjectTableEntry*	pOTE = 0;    VxCritSec cs (m_mutex);    // Must do linear search, as table key is OID...    OBJECTMAP::const_iterator i = m_objectTable.begin ();    while (i != m_objectTable.end ())	{	pOTE = (*i).second;	if (pOTE->stdStub.getIUnknown () == punk)            return pOTE;	++i;	}        return 0;    }//////////////////////////////////////////////////////////////////////////////bool VxObjectTable::objectUnregister (OID oid)    {    TRACE_CALL;    size_t nErased = 0;    VxCritSec cs (m_mutex);    ObjectTableEntry* pOTE = objectFindByOid (oid);    DELZERO (pOTE);    nErased = m_objectTable.erase (oid);    return (nErased != 0);    }////////////////////////////////////////////////////////////////////////////// VxObjectTable::supportsInterface -- determine if the table contains// an entry corresponding to the given interface identifier...//bool VxObjectTable::supportsInterface (REFIID riid)    {    bool bSupports = false;        // Must do linear search, as table key is OID...    VxCritSec cs (m_mutex);        OBJECTMAP::iterator i = m_objectTable.begin ();    while (i != m_objectTable.end ())    {    if ((*i).second->stdStub.supportsInterface (riid))        {        bSupports = true;        break;        }    ++i;    }    return bSupports;    }////////////////////////////////////////////////////////////////////////////// VxObjectTable::interfaceInfoGet -- returns the info required to// dispatch a method call on an Object Interface...//HRESULT VxObjectTable::interfaceInfoGet    (    REFIID      riid,    REFIPID        ripid,    ULONG        methodNum,    IUnknown**        ppUnk,    PFN_ORPC_STUB*    ppfn,    CLSID &        classid    )    {    HRESULT hr = S_OK;        OID oid = orpcOidFromIpid (ripid);    ObjectTableEntry* pOTE = objectFindByOid (oid);    if (pOTE)        {    // Both the VxStdStub and VxObjectTable inherit from    // RpcDispatchTable which declares the interfaceInfoGet() method.    // Only the VxObjectTable knows the CLSID for the class being    // invoked by RemoteActivation, so we ignore the CLSID from    // VxStdStub::interfaceInfoGet() and replace it with the value    // here.    hr = pOTE->stdStub.interfaceInfoGet (riid,                          ripid,                         methodNum,                         ppUnk,                         ppfn,                         classid);        if (SUCCEEDED (hr))            classid = pOTE->clsid;    else        classid = GUID_NULL;        }    else    hr = RPC_E_INVALID_IPID;    return hr;    }//////////////////////////////////////////////////////////////////////////void ObjectTableEntry::printOn (ostream& os) const    {    os << "ObjectTableEntry:oid=" << (int) oid << endl;    }void VxObjectTable::printOn (ostream& os) const    {    os << "ObjectTable:" << endl;    for (const_iterator i = begin (); i != end (); ++i)    os << (*i).second;    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -