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

📄 rpcdispatcher.cpp

📁 VXWORKS源代码
💻 CPP
字号:
/* RpcDispatcher *//* Copyright (c) 1999 Wind River Systems, Inc. *//*modification history--------------------01r,17dec01,nel  Add include symbol for diab.01q,13jul01,dbs  fix up includes, exclude priority propagation for now01p,13jul00,nel  Win2K fix.01o,26jun00,dbs  implement presentation context IDs01n,19aug99,aim  added TraceCall header01m,13aug99,drm  Documentation updates01l,10aug99,aim  fix compiler warnings on solaris01k,06aug99,drm  Correcting bug related to error checking.01j,03aug99,drm  Adding code to set server priority.01i,28jul99,drm  Adding clsid argument to interfaceInfoGet() call.01h,09jul99,dbs  convert to final naming scheme01g,02jul99,aim  fix for name changes in RpcPduFactory01f,29jun99,dbs  release IUnknown-ptr after use01e,25jun99,dbs  add channel ID to stub msg01d,24jun99,dbs  move authn into new class01c,23jun99,dbs  fix authn on response packets01b,08jun99,aim  rework01a,27may99,aim  created*/#include "RpcDispatcher.h"#include "RpcPdu.h"#include "RpcPduFactory.h"#include "NdrStreams.h"		// marshaling streams#include "Syslog.h"#include "orpcLib.h"#include "orpc.h"#include "vxdcomExtent.h"#include "TraceCall.h"/* Include symbol for diab */extern "C" int include_vxdcom_RpcDispatcher (void)    {    return 0;    }RpcDispatcher::RpcDispatcher (RpcDispatchTable* dispatchTable)  : m_dispatchTable (dispatchTable)    {    TRACE_CALL;    }RpcDispatcher::~RpcDispatcher ()    {    TRACE_CALL;    }boolRpcDispatcher::supportsInterface (REFIID riid)    {    return m_dispatchTable->supportsInterface (riid);    }extern IID IID_ISystemActivator;intRpcDispatcher::dispatch (const RpcPdu& request, RpcPdu& reply, int channelId, REFIID iid)    {    PFN_ORPC_STUB	pfn;    IUnknown* 		punkItf=0;    CLSID 		classid = GUID_NULL;	// CLSID of object    ORPCTHIS		orpcThis; // holds unmarshalled ORPCTHIS     HRESULT hr = m_dispatchTable->interfaceInfoGet (iid,						    request.objectId (),						    request.opnum (),						    &punkItf,						    &pfn,						    classid);    // Here, we test explicitly for S_OK (rather than using FAILED())    // since there is only one success (S_OK) and *any* other result    // is a kind of failure...    if (hr == S_OK)	{	// Create a marshaling-stream ready to hold the reply	NdrMarshalStream ms (NdrPhase::STUB_MSHL, request.drep ());	// Create an unmarshaling-stream holding the received	// stub-data	NdrUnmarshalStream us (NdrPhase::STUB_UNMSHL,			       request.drep (),			       (byte*) request.stubData (),			       request.stubDataLen ());		if (request.objectId() != GUID_NULL)	    {	    // Remove the ORPCTHIS from the stream...	    hr = ndrUnmarshalORPCTHIS (&us, &orpcThis);	    // Insert an ORPCTHAT at the start of the stub-data	    ORPCTHAT orpcThat = { 0, 0 };	    ms.insert (sizeof (ORPCTHAT), &orpcThat, false);	    }	// Fill in msg structure	RPC_STUB_MSG msg (&us, &ms, channelId);#if 0#ifdef VXDCOM_PLATFORM_VXWORKS	int		oldPriority;		// used to restore priority 	int 		currentId=0;		// task ID of current task	BOOL		priorityChanged=FALSE;	// whether or not priority was set	ORPC_EXTENT* 	pExtent;		// ptr to VXDCOM_EXTENT                currentId = taskIdSelf ();	// Lookup the priority scheme for the object and set the 	// priority to the appropriate value.        if (classid != GUID_NULL)            {            int priority;            vxdcomClassObjRegInfo regInfo;      // result of lookup            hr = vxdcomSymLookup (classid, &regInfo);            if (SUCCEEDED (hr))                {                switch (regInfo.priorityScheme)                    {                    case PS_DEFAULT:                        priority = g_defaultServerPriority;                        break;                    case PS_SVR_ASSIGNED:                        priority = regInfo.priority;                        break;                    case PS_CLNT_PROPAGATED:			// If client propagated priority is not present,			// use the default server priority.                        if (orpcThis.orpcExtentFind (GUID_VXDCOM_EXTENT,                                                     &pExtent) == S_OK)                            {			    VXDCOM_EXTENT* pVExtent=NULL;	// ptr to derived type			    pVExtent = static_cast<VXDCOM_EXTENT*> (pExtent);                            if (pVExtent != NULL)			        pVExtent->getPriority(priority);                            else                                priority = g_defaultServerPriority;                            }                        else                            {                            priority = regInfo.priority;                            }                        break;                    default:			// Unknown priority scheme.  Rather than produce an error			// we will simply use the default server priority.                        priority = g_defaultServerPriority;                        break;                    }	        // Check for valid priority                if ( (priority < 0)  || (priority > 255) )                    {                    // Invalid priority.  		    // Let's use the system default priority.                    priority = g_defaultServerPriority;                    }                if (taskPriorityGet (currentId, &oldPriority) == OK)	            {                    if (taskPrioritySet (currentId, priority) == OK)                        {                        priorityChanged = TRUE;                        }                    else                        {                        // Unable to set priority                        // There's really nothing we can do in this case - we'll                        // just run the function at the current priority.                        }                    }                else                    {                    // Unable to get priority.                    // We might be able to set the priority here, but we wouldn't be                     // able to restore, so we'll just run the function at the current                    // priority.                    }                }            }        else            {            // Since we can't find the class object, we don't know what priority            // scheme to use. We'll try to run the function at the default server             // priority.            if (taskPriorityGet (currentId, &oldPriority) == OK)	        {                if (taskPrioritySet (currentId, g_defaultServerPriority) == OK)                    {                    priorityChanged = TRUE;                    }                else                    {                    // Unable to set priority                    // There's really nothing we can do in this case - we'll                    // just run the function at the current priority.                    }                }            else                {                // Unable to get priority.                // We might be able to set the priority here, but we wouldn't be                 // able to restore, so we'll just run the function at the current                // priority.                }            }           #endif#endif	// Call stub function...	hr = pfn (punkItf, msg);#if 0#ifdef VXDCOM_PLATFORM_VXWORKS	// Restore the priority to its previous value.        if (priorityChanged)            {            if (taskPrioritySet (currentId, oldPriority) != OK)                {                // We were unable to restore the priority to the default value.                  // There's not really anything we can do, but leave the thread at the                // new priority.                }            }#endif#endif	// Release itf ptr...	if (punkItf)	    punkItf->Release ();	if (SUCCEEDED (hr))	    {	    RpcPduFactory::formatResponsePdu (request, reply);	    if (ms.size() > 0)		reply.stubDataAppend (ms.begin (), ms.size ());	    }	else	    {	    RpcPduFactory::formatFaultPdu (request, reply, hr, false);	    }	}    else	{	RpcPduFactory::formatFaultPdu (request, reply, hr, true);	}    return hr;    }

⌨️ 快捷键说明

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