380 lines
10 KiB
C++
380 lines
10 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// 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();
|
|
}
|