296 lines
9.5 KiB
Plaintext
296 lines
9.5 KiB
Plaintext
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1993.
|
|
//
|
|
// File: classf_c.cxx
|
|
//
|
|
// Contents: Interface proxy for IClassFactory
|
|
//
|
|
// Classes: CProxyIClassFactory
|
|
//
|
|
// History: Created by Microsoft (R) MIDL Compiler Version 1.10.82
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
#include "stdrpc.hxx"
|
|
#pragma hdrstop
|
|
#include "classf_x.h"
|
|
|
|
|
|
#include "iface.h"
|
|
extern "C" const GUID CLSID_RemoteHdlr;
|
|
STDAPI CoCreateRemoteHandler(IUnknown *pUnkOuter, void **pUnk);
|
|
|
|
|
|
HRESULT STDMETHODCALLTYPE CProxyIClassFactory::CreateInstance
|
|
(
|
|
|
|
IUnknown *pUnkOuter,
|
|
|
|
REFIID riid,
|
|
|
|
void **ppvObject
|
|
)
|
|
{
|
|
RPCOLE_INTERFACE _RpcInterfaceInformation;
|
|
RPCOLE_MESSAGE _message;
|
|
RPCOLE_MESSAGE * _prpcmsg = &_message;
|
|
HRESULT _ret_value;
|
|
|
|
unsigned char *_tempbuf;
|
|
unsigned char *_savebuf;
|
|
|
|
|
|
memset((void *) &_message, 0, sizeof(_message));
|
|
//Initialize [out] parameters
|
|
memset((void *) ppvObject, 0, (sizeof(void *)));
|
|
|
|
//Calculate size of message buffer
|
|
((PRPCOLE_MESSAGE)_prpcmsg)->_hResult = S_OK;
|
|
((PRPCOLE_MESSAGE)_prpcmsg)->_hResult = _pRpcChannel->GetDestCtx(&_prpcmsg->_dwDestContext, &_prpcmsg->_pvDestContext);
|
|
if(((PRPCOLE_MESSAGE)_prpcmsg)->_hResult != S_OK)
|
|
{
|
|
return (((PRPCOLE_MESSAGE)_prpcmsg)->_hResult);
|
|
}
|
|
_prpcmsg->BufferLength = 24;
|
|
_prpcmsg->BufferLength += 3;
|
|
_prpcmsg->BufferLength &= (unsigned int)0xfffffffc;
|
|
_prpcmsg->BufferLength += 4;
|
|
|
|
//Get RPC message
|
|
memset(&_RpcInterfaceInformation, 0, sizeof(_RpcInterfaceInformation));
|
|
_RpcInterfaceInformation.InterfaceId.Syntax = _iid;
|
|
_RpcInterfaceInformation.TransferSyntax = NdrTransferSyntax;
|
|
_prpcmsg->Interface = &_RpcInterfaceInformation;
|
|
_prpcmsg->ProcNum = IClassFactory_CreateInstance_OPNUM;
|
|
((PRPCOLE_MESSAGE)_prpcmsg)->_hResult = _pRpcChannel->GetBuffer(_prpcmsg);
|
|
if(((PRPCOLE_MESSAGE)_prpcmsg)->_hResult != S_OK)
|
|
{
|
|
return (((PRPCOLE_MESSAGE)_prpcmsg)->_hResult);
|
|
}
|
|
|
|
|
|
//Marshal [in] and [in,out] parameters
|
|
((PRPCOLE_MESSAGE)_prpcmsg)->_hResult = _pRpcChannel->GetStream(_prpcmsg, _prpcmsg->_cbStream, &_prpcmsg->_pStream);
|
|
if(((PRPCOLE_MESSAGE)_prpcmsg)->_hResult == S_OK)
|
|
{
|
|
|
|
|
|
_try
|
|
{
|
|
/* send data from pUnkOuter */
|
|
*(unsigned long FAR *)&_prpcmsg->Buffer += 3;
|
|
*(unsigned long FAR *)&_prpcmsg->Buffer &= 0xfffffffc;
|
|
*(*(long FAR *FAR *)&_prpcmsg->Buffer)++ = (long)pUnkOuter;
|
|
|
|
/* send data from &riid */
|
|
*(unsigned long FAR *)&_prpcmsg->Buffer += 3;
|
|
*(unsigned long FAR *)&_prpcmsg->Buffer &= 0xfffffffc;
|
|
NDRcopy (_prpcmsg->Buffer, (void __RPC_FAR *) (&riid), (unsigned int)(16));
|
|
*(unsigned long FAR *)&_prpcmsg->Buffer += 16;
|
|
|
|
}
|
|
_except(EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
//Catch exceptions and map them into HRESULT error codes
|
|
HRESULT_from_exception(GetExceptionCode(), &((PRPCOLE_MESSAGE)_prpcmsg)->_hResult);
|
|
}
|
|
//Release the stream
|
|
_prpcmsg->_pStream->Release();
|
|
_prpcmsg->_pStream = 0;
|
|
}
|
|
if(((PRPCOLE_MESSAGE)_prpcmsg)->_hResult != S_OK)
|
|
{
|
|
//Free the RPC message buffer
|
|
_pRpcChannel->FreeBuffer(_prpcmsg);
|
|
return (((PRPCOLE_MESSAGE)_prpcmsg)->_hResult);
|
|
}
|
|
|
|
|
|
|
|
//Send the request message, then receive the result message.
|
|
((PRPCOLE_MESSAGE)_prpcmsg)->_hResult = _pRpcChannel->SendReceive(_prpcmsg);
|
|
if(((PRPCOLE_MESSAGE)_prpcmsg)->_hResult != S_OK)
|
|
{
|
|
return (((PRPCOLE_MESSAGE)_prpcmsg)->_hResult);
|
|
}
|
|
|
|
|
|
//Unmarshal parameters and return value
|
|
((PRPCOLE_MESSAGE)_prpcmsg)->_hResult = _pRpcChannel->GetStream(_prpcmsg, _prpcmsg->_cbStream, &_prpcmsg->_pStream);
|
|
if(((PRPCOLE_MESSAGE)_prpcmsg)->_hResult == S_OK)
|
|
{
|
|
_try
|
|
{
|
|
|
|
_tempbuf = (unsigned char FAR *)_prpcmsg->Buffer;
|
|
if (ppvObject ==0)
|
|
RpcRaiseException(RPC_X_NULL_REF_POINTER);
|
|
*(unsigned long FAR *)&_prpcmsg->Buffer += 3;
|
|
*(unsigned long FAR *)&_prpcmsg->Buffer &= 0xfffffffc;
|
|
if (*(*(unsigned long FAR *FAR *)&_prpcmsg->Buffer)++)
|
|
{
|
|
// BUGBUG: this is where to do custom unmarshalling work.
|
|
// ((PRPCOLE_MESSAGE)_prpcmsg)->_hResult = CoUnmarshalInterface(((PRPCOLE_MESSAGE)_prpcmsg)->_pStream , riid, (void **) &(*ppvObject));
|
|
|
|
HRESULT sc;
|
|
SApiDataHdr ApiHdr;
|
|
IUnknown *pUnk = NULL;
|
|
IMarshal *pIM = NULL;
|
|
IStream *pStm = ((PRPCOLE_MESSAGE)_prpcmsg)->_pStream;
|
|
|
|
sc = pStm->Read(&ApiHdr, sizeof(SApiDataHdr), NULL);
|
|
if (SUCCEEDED(sc))
|
|
{
|
|
if (IsEqualCLSID(CLSID_RemoteHdlr, ApiHdr.classid))
|
|
{
|
|
sc = CoCreateRemoteHandler(pUnkOuter, (void **)&pUnk);
|
|
}
|
|
else
|
|
{
|
|
sc = CoCreateInstance(ApiHdr.classid, pUnkOuter, CLSCTX_INPROC,
|
|
IID_IUnknown, (void **)&pUnk);
|
|
}
|
|
|
|
if (SUCCEEDED(sc))
|
|
{
|
|
sc = pUnk->QueryInterface(IID_IMarshal, (void **)&pIM);
|
|
if (SUCCEEDED(sc))
|
|
{
|
|
sc = pIM->UnmarshalInterface(pStm, riid, (void **) &(*ppvObject));
|
|
pIM->Release();
|
|
}
|
|
pUnk->Release();
|
|
}
|
|
}
|
|
|
|
if(sc != S_OK)
|
|
RpcRaiseException(sc);
|
|
}
|
|
|
|
/* receive data into &_ret_value */
|
|
long_from_ndr((PRPC_MESSAGE)_prpcmsg, (unsigned long FAR *)&_ret_value);
|
|
|
|
}_except(EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
//Catch exceptions and map them into HRESULT error codes
|
|
HRESULT_from_exception(GetExceptionCode(), &((PRPCOLE_MESSAGE)_prpcmsg)->_hResult);
|
|
//Free the [out] parameters
|
|
}
|
|
//Release the stream
|
|
_prpcmsg->_pStream->Release();
|
|
_prpcmsg->_pStream = 0;
|
|
}
|
|
((PRPCOLE_MESSAGE)_prpcmsg)->_hResult = _pRpcChannel->FreeBuffer(_prpcmsg);
|
|
if(((PRPCOLE_MESSAGE)_prpcmsg)->_hResult != S_OK)
|
|
return (((PRPCOLE_MESSAGE)_prpcmsg)->_hResult);
|
|
else
|
|
return (_ret_value);
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CProxyIClassFactory::LockServer
|
|
(
|
|
|
|
BOOL fLock
|
|
)
|
|
{
|
|
RPCOLE_INTERFACE _RpcInterfaceInformation;
|
|
RPCOLE_MESSAGE _message;
|
|
RPCOLE_MESSAGE * _prpcmsg = &_message;
|
|
HRESULT _ret_value;
|
|
unsigned long _alloc_total;
|
|
|
|
void *_xmit_type;
|
|
unsigned char *_packet;
|
|
|
|
|
|
memset((void *) &_message, 0, sizeof(_message));
|
|
//Initialize [out] parameters
|
|
|
|
//Calculate size of message buffer
|
|
((PRPCOLE_MESSAGE)_prpcmsg)->_hResult = S_OK;
|
|
((PRPCOLE_MESSAGE)_prpcmsg)->_hResult = _pRpcChannel->GetDestCtx(&_prpcmsg->_dwDestContext, &_prpcmsg->_pvDestContext);
|
|
if(((PRPCOLE_MESSAGE)_prpcmsg)->_hResult != S_OK)
|
|
{
|
|
return (((PRPCOLE_MESSAGE)_prpcmsg)->_hResult);
|
|
}
|
|
_prpcmsg->BufferLength = 0;
|
|
INT_to_xmit (&fLock, (long FAR *FAR *)&_xmit_type);
|
|
_prpcmsg->BufferLength += 3;
|
|
_prpcmsg->BufferLength &= (unsigned int)0xfffffffc;
|
|
_prpcmsg->BufferLength += 4;
|
|
INT_free_xmit ((long FAR *)_xmit_type);
|
|
|
|
|
|
//Get RPC message
|
|
memset(&_RpcInterfaceInformation, 0, sizeof(_RpcInterfaceInformation));
|
|
_RpcInterfaceInformation.InterfaceId.Syntax = _iid;
|
|
_RpcInterfaceInformation.TransferSyntax = NdrTransferSyntax;
|
|
_prpcmsg->Interface = &_RpcInterfaceInformation;
|
|
_prpcmsg->ProcNum = IClassFactory_LockServer_OPNUM;
|
|
((PRPCOLE_MESSAGE)_prpcmsg)->_hResult = _pRpcChannel->GetBuffer(_prpcmsg);
|
|
if(((PRPCOLE_MESSAGE)_prpcmsg)->_hResult != S_OK)
|
|
{
|
|
return (((PRPCOLE_MESSAGE)_prpcmsg)->_hResult);
|
|
}
|
|
|
|
|
|
//Marshal [in] and [in,out] parameters
|
|
_packet = _prpcmsg->Buffer;
|
|
_try
|
|
{
|
|
INT_to_xmit (&fLock, (long FAR *FAR *)&_xmit_type);
|
|
/* send data from *((long FAR *)_xmit_type) */
|
|
*(unsigned long FAR *)&_prpcmsg->Buffer += 3;
|
|
*(unsigned long FAR *)&_prpcmsg->Buffer &= 0xfffffffc;
|
|
*(*(long FAR *FAR *)&_prpcmsg->Buffer)++ = (long)*((long FAR *)_xmit_type);
|
|
INT_free_xmit ((long FAR *)_xmit_type);
|
|
|
|
}
|
|
_except(EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
//Catch exceptions and map them into HRESULT error codes
|
|
HRESULT_from_exception(GetExceptionCode(), &((PRPCOLE_MESSAGE)_prpcmsg)->_hResult);
|
|
}
|
|
_prpcmsg->BufferLength = _prpcmsg->Buffer - _packet;
|
|
_prpcmsg->Buffer = _packet;
|
|
if(((PRPCOLE_MESSAGE)_prpcmsg)->_hResult != S_OK)
|
|
{
|
|
//Free the RPC message buffer
|
|
_pRpcChannel->FreeBuffer(_prpcmsg);
|
|
return (((PRPCOLE_MESSAGE)_prpcmsg)->_hResult);
|
|
}
|
|
|
|
|
|
|
|
//Send the request message, then receive the result message.
|
|
((PRPCOLE_MESSAGE)_prpcmsg)->_hResult = _pRpcChannel->SendReceive(_prpcmsg);
|
|
if(((PRPCOLE_MESSAGE)_prpcmsg)->_hResult != S_OK)
|
|
{
|
|
return (((PRPCOLE_MESSAGE)_prpcmsg)->_hResult);
|
|
}
|
|
|
|
|
|
//Unmarshal parameters and return value
|
|
_packet = _prpcmsg->Buffer;
|
|
_try
|
|
{
|
|
|
|
/* receive data into &_ret_value */
|
|
long_from_ndr((PRPC_MESSAGE)_prpcmsg, (unsigned long FAR *)&_ret_value);
|
|
|
|
}_except(EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
//Catch exceptions and map them into HRESULT error codes
|
|
HRESULT_from_exception(GetExceptionCode(), &((PRPCOLE_MESSAGE)_prpcmsg)->_hResult);
|
|
//Free the [out] parameters
|
|
}
|
|
_prpcmsg->Buffer = _packet;
|
|
((PRPCOLE_MESSAGE)_prpcmsg)->_hResult = _pRpcChannel->FreeBuffer(_prpcmsg);
|
|
if(((PRPCOLE_MESSAGE)_prpcmsg)->_hResult != S_OK)
|
|
return (((PRPCOLE_MESSAGE)_prpcmsg)->_hResult);
|
|
else
|
|
return (_ret_value);
|
|
}
|