NT4/private/ole32/com/idl/classf_c.sav
2020-09-30 17:12:29 +02:00

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);
}