Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

379 lines
10 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1994.
//
// File: rpc16.cxx
//
// Contents: Maps the 16-bit IRpcChannel implementation to a 16-bit
// implementation of IRpcChannelBuffer.
//
// This is required to support custom interface marshalling.
//
// History: 30-Mar-94 BobDay Adapted from OLELRPC.CPP
//
//--------------------------------------------------------------------------
#include <headers.cxx>
#pragma hdrstop
#include <ole2ver.h>
#include <ole2sp.h>
#include "rpc16.hxx"
interface IRpcChannel : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE GetStream
(
REFIID riid,
int iMethod,
BOOL fSend,
BOOL fNoWait,
DWORD size,
IStream FAR * FAR *ppIStream
) = 0;
virtual HRESULT STDMETHODCALLTYPE Call
(
IStream FAR * pIStream
) = 0;
virtual HRESULT STDMETHODCALLTYPE GetDestCtx
(
DWORD *pdwDestContext,
void **ppvDestContext
) = 0;
virtual HRESULT STDMETHODCALLTYPE IsConnected
(
void
) = 0;
};
//
// 16-bit IRpcChannel interface, stream-based
//
// This is the interface seen by the 16-bit proxy implementations
//
class CRpcChannel : public IRpcChannel
{
public:
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid,void **ppvObject);
ULONG STDMETHODCALLTYPE AddRef(void);
ULONG STDMETHODCALLTYPE Release(void);
STDMETHOD(GetStream)(REFIID iid, int iMethod, BOOL fSend,
BOOL fNoWait, DWORD size, IStream FAR* FAR* ppIStream);
STDMETHOD(Call)(IStream FAR* pIStream);
STDMETHOD(GetDestCtx)(DWORD FAR* lpdwDestCtx, LPVOID FAR* lplpvDestCtx);
STDMETHOD(IsConnected)(void);
CRpcChannel FAR *CRpcChannel::Create( CRpcChannelBuffer FAR *prcb );
private:
CRpcChannel::CRpcChannel( CRpcChannelBuffer FAR *prcb );
CRpcChannel::~CRpcChannel( void );
ULONG m_refs; // Reference count
CRpcChannelBuffer FAR * m_prcb; // ChannelBuffer to talk through
};
//+-------------------------------------------------------------------------
//
// Implementation of CRpcChannel
//
//--------------------------------------------------------------------------
//+---------------------------------------------------------------------------
//
// Function: Create, public
//
// Synopsis: Creates a 16-bit CRpcChannel and gives it the
// IRpcChannelBuffer that in needs to call.
//
// Arguments: [prcb] - IRpcChannelBuffer to call when called
//
// Returns: IRpcChannel *, Null on failure
//
// History: 30-Mar-94 BobDay Created
//
//----------------------------------------------------------------------------
CRpcChannel FAR *CRpcChannel::Create( CRpcChannelBuffer FAR *prcb )
{
CRpcChannel FAR *pRC;
pRC = new CRpcChannel( prcb );
return( pRC );
}
//+---------------------------------------------------------------------------
//
// Function: Constructor, private
//
// Synopsis: Creates a 16-bit CRpcChannel and gives it the
// IRpcChannelBuffer that in needs to call.
//
// Arguments: [prcb] - IRpcChannelBuffer to call when called
//
// Returns: IRpcChannel *, Null on failure
//
// History: 30-Mar-94 BobDay Created
//
//----------------------------------------------------------------------------
CRpcChannel::CRpcChannel( CRpcChannelBuffer FAR *prcb )
{
m_refs = 1;
m_prcb = prcb; // Save it and addref it
if ( m_prcb != NULL )
{
m_prcb->AddRef();
}
}
//+---------------------------------------------------------------------------
//
// Function: Destructor, private
//
// Synopsis: Destroys the CRpcChannel object
//
// Arguments: none
//
// Returns: nothing
//
// History: 30-Mar-94 BobDay Created
//
//----------------------------------------------------------------------------
CRpcChannel::~CRpcChannel( void )
{
if ( m_prcb != NULL )
{
m_prcb->Release(); // Release it and zero it
m_prcb = NULL;
}
}
//+---------------------------------------------------------------------------
//
// Function: QueryInterface, public
//
// Synopsis: Allows querying for other interfaces supported by this
// object
//
// Arguments: [iidInterface] - iid to query for
// [ppv] - interface pointer returned
//
// Returns: nothing
//
// History: 30-Mar-94 BobDay Created
//
//----------------------------------------------------------------------------
STDMETHODIMP CRpcChannel::QueryInterface(
REFIID iidInterface,
void FAR* FAR* ppvObj )
{
HRESULT hresult;
// Two interfaces supported: IUnknown, IRpcChannel
if (iidInterface == IID_IUnknown || iidInterface == IID_IRpcChannel)
{
m_refs++; // A pointer to this object is returned
*ppvObj = this;
hresult = NOERROR;
}
else
{
*ppvObj = NULL;
hresult = ResultFromScode(E_NOINTERFACE);
}
return hresult;
}
//+---------------------------------------------------------------------------
//
// Function: AddRef, public
//
// Synopsis: Increments object reference count, called when object is
// referenced by another pointer/client.
//
// Arguments: none
//
// Returns: new reference count
//
// History: 30-Mar-94 BobDay Created
//
//----------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CRpcChannel::AddRef(void)
{
return ++m_refs;
}
//+---------------------------------------------------------------------------
//
// Function: Release, public
//
// Synopsis: Decrements object reference count and handles necessary
// self-destruction and sub-releasing, called when object is
// no longer referenced by another pointer/client.
//
// Arguments: none
//
// Returns: new reference count
//
// History: 30-Mar-94 BobDay Created
//
//----------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CRpcChannel::Release(void)
{
if (--m_refs != 0) // Object still alive?
{
return m_refs;
}
delete this; // Suicide
return 0;
}
//+---------------------------------------------------------------------------
//
// Function: GetStream, public
//
// Synopsis: Create an IStream onto which the client can write in
// preparation for making an RPC call with the stream contents
// as parameters.
//
// Arguments: [iid] - IID of interface being RPC'd
// [iMethod] - Method # within interface
// [fSend] - Should we use SendMessage?
// [fNoWait] - Should we be asynchronous?
// [size] - Initial size of stream
// [ppIStream] - Output IStream
//
// Returns: HRESULT for success/failure
// [ppIStream] - IStream for writing parameters
//
// History: 30-Mar-94 BobDay Created
//
//----------------------------------------------------------------------------
STDMETHODIMP CRpcChannel::GetStream(
REFIID iid,
int iMethod,
BOOL fSend,
BOOL fNoWait,
DWORD size,
IStream FAR* FAR* ppIStream )
{
CPkt FAR* pCPkt;
// no point in allowing this to succeed if we are not connected
if ( IsConnected() != NOERROR )
{
// Connection terminated (server died or disconnectd)
return ResultFromScode(RPC_E_CONNECTION_TERMINATED);
}
pCPkt = CPkt::CreateForCall(this,iid,iMethod,fSend,fNoWait,size);
if (pCPkt == NULL)
{
*ppIStream = NULL;
return ResultFromScode(E_OUTOFMEMORY);
}
if (pCPkt->QueryInterface(IID_IStream,(void FAR* FAR*) ppIStream)
!= NOERROR)
{
pCPkt->Release();
return ResultFromScode(E_OUTOFMEMORY);
}
pCPkt->SetRpcChannelBuffer( m_prcb );
pCPkt->Release();
return NOERROR;
}
//+---------------------------------------------------------------------------
//
// Function: Call, public
//
// Synopsis: Sends a call to a remote procedure. Previously, all of the
// parameters for the procedure were serialized into the IStream
// which was passed in.
//
// Arguments: [pIStream] - IStream for parameters to procedure
//
// Returns: HRESULT for success/failure of call or procedure
//
// History: 30-Mar-94 BobDay Created
//
//----------------------------------------------------------------------------
STDMETHODIMP CRpcChannel::Call(
IStream FAR * pIStream )
{
HRESULT hresult;
CPkt FAR * pCPkt;
hresult = pIStream->QueryInterface(IID_CPkt,(void FAR* FAR*) &pCPkt);
if (hresult != NOERROR)
{
return ResultFromScode(E_INVALIDARG);
}
return pCPkt->CallRpcChannelBuffer();
}
//+---------------------------------------------------------------------------
//
// Function: GetDestCtx, public
//
// Synopsis: According to the code in OLELRPC.CPP, this is all this code
// does, presumably, it might be expanded in the future.
//
// Arguments:
//
// Returns:
//
// History: 30-Mar-94 BobDay Created
//
//----------------------------------------------------------------------------
STDMETHODIMP CRpcChannel::GetDestCtx(
DWORD FAR * lpdwDestCtx,
LPVOID FAR * lplpvDestCtx )
{
*lpdwDestCtx = NULL;
if (lplpvDestCtx)
{
*lplpvDestCtx = NULL;
}
return NOERROR;
}
//+---------------------------------------------------------------------------
//
// Function: IsConnected, public
//
// Synopsis: According to the code in OLELRPC.CPP, this is all this code
// does, presumably, it might be expanded in the future.
//
// Arguments: none
//
// Returns: HRESULT indicating connection status
//
// History: 30-Mar-94 BobDay Created
//
//----------------------------------------------------------------------------
STDMETHODIMP CRpcChannel::IsConnected( void )
{
if ( m_prcb == NULL )
{
return ResultFromScode(E_UNEXPECTED);
}
return m_prcb->IsConnected();
}