Module: wine Branch: master Commit: 9208eef55c37c7b41abc9a84d7b79823531b152a URL: http://source.winehq.org/git/wine.git/?a=commit;h=9208eef55c37c7b41abc9a84d7...
Author: Rob Shearman rob@codeweavers.com Date: Tue Dec 19 19:37:09 2006 +0000
ole32: Call the message filter for incoming calls.
---
dlls/ole32/rpc.c | 41 +++++++++++++++++++++++++++++++++++++++-- dlls/ole32/tests/marshal.c | 2 +- 2 files changed, 40 insertions(+), 3 deletions(-)
diff --git a/dlls/ole32/rpc.c b/dlls/ole32/rpc.c index 64269c0..5d66891 100644 --- a/dlls/ole32/rpc.c +++ b/dlls/ole32/rpc.c @@ -931,13 +931,15 @@ static HRESULT unmarshal_ORPCTHIS(RPC_ME
void RPC_ExecuteCall(struct dispatch_params *params) { - struct message_state *message_state; + struct message_state *message_state = NULL; RPC_MESSAGE *msg = (RPC_MESSAGE *)params->msg; char *original_buffer = msg->Buffer; ORPCTHIS orpcthis; ORPC_EXTENT_ARRAY orpc_ext_array; WIRE_ORPC_EXTENT *first_wire_orpc_extent;
+ /* handle ORPCTHIS and server extensions */ + params->hr = unmarshal_ORPCTHIS(msg, &orpcthis, &orpc_ext_array, &first_wire_orpc_extent); if (params->hr != S_OK) goto exit; @@ -966,6 +968,41 @@ void RPC_ExecuteCall(struct dispatch_par msg->Handle = message_state; msg->BufferLength -= message_state->prefix_data_len;
+ /* call message filter */ + + if (COM_CurrentApt()->filter) + { + DWORD handlecall; + INTERFACEINFO interface_info; + + interface_info.pUnk = NULL; /* FIXME */ + interface_info.iid = IID_NULL; /* FIXME */ + interface_info.wMethod = msg->ProcNum; + handlecall = IMessageFilter_HandleInComingCall(COM_CurrentApt()->filter, + CALLTYPE_TOPLEVEL /* FIXME */, + (HTASK)GetCurrentProcessId(), + 0 /* FIXME */, + &interface_info); + TRACE("IMessageFilter_HandleInComingCall returned %d\n", handlecall); + switch (handlecall) + { + case SERVERCALL_REJECTED: + params->hr = RPC_E_CALL_REJECTED; + goto exit; + case SERVERCALL_RETRYLATER: +#if 0 /* FIXME: handle retries on the client side before enabling this code */ + params->hr = RPC_E_RETRY; + goto exit; +#else + FIXME("retry call later not implemented\n"); + break; +#endif + case SERVERCALL_ISHANDLED: + default: + break; + } + } + /* invoke the method */
params->hr = IRpcStubBuffer_Invoke(params->stub, params->msg, params->chan); @@ -974,9 +1011,9 @@ void RPC_ExecuteCall(struct dispatch_par msg->Handle = message_state->binding_handle; msg->Buffer = (char *)msg->Buffer - message_state->prefix_data_len; msg->BufferLength += message_state->prefix_data_len; - HeapFree(GetProcessHeap(), 0, message_state);
exit: + HeapFree(GetProcessHeap(), 0, message_state); IRpcStubBuffer_Release(params->stub); IRpcChannelBuffer_Release(params->chan); if (params->handle) SetEvent(params->handle); diff --git a/dlls/ole32/tests/marshal.c b/dlls/ole32/tests/marshal.c index c1e81f3..aa71790 100644 --- a/dlls/ole32/tests/marshal.c +++ b/dlls/ole32/tests/marshal.c @@ -1290,7 +1290,7 @@ static void test_message_filter(void) ok_more_than_one_lock();
hr = IClassFactory_CreateInstance(cf, NULL, &IID_IUnknown, (LPVOID*)&proxy); - todo_wine { ok(hr == RPC_E_CALL_REJECTED, "Call should have returned RPC_E_CALL_REJECTED, but return 0x%08x instead\n", hr); } + ok(hr == RPC_E_CALL_REJECTED, "Call should have returned RPC_E_CALL_REJECTED, but return 0x%08x instead\n", hr); if (proxy) IUnknown_Release(proxy); proxy = NULL;