freerdp-core: added Terminate event

This commit is contained in:
Marc-André Moreau 2013-06-18 16:55:23 -04:00
parent cc5b471f75
commit 90ce8be9fc
7 changed files with 73 additions and 21 deletions

View File

@ -1502,6 +1502,24 @@ DWORD xf_exit_code_from_disconnect_reason(DWORD reason)
return reason;
}
void xf_TerminateEventHandler(rdpContext* context, TerminateEventArgs* e)
{
wMessageQueue* queue;
xfContext* xfc = (xfContext*) context;
if (context->settings->AsyncInput)
{
queue = freerdp_get_message_queue(context->instance, FREERDP_INPUT_MESSAGE_QUEUE);
if (queue)
MessageQueue_PostQuit(queue, 0);
}
else
{
xfc->disconnect = TRUE;
}
}
/**
* Client Interface
*/
@ -1543,7 +1561,9 @@ int xfreerdp_client_stop(rdpContext* context)
{
wMessageQueue* queue;
queue = freerdp_get_message_queue(context->instance, FREERDP_INPUT_MESSAGE_QUEUE);
MessageQueue_PostQuit(queue, 0);
if (queue)
MessageQueue_PostQuit(queue, 0);
}
else
{
@ -1622,6 +1642,8 @@ int xfreerdp_client_new(freerdp* instance, rdpContext* context)
settings->OrderSupport[NEG_ELLIPSE_SC_INDEX] = FALSE;
settings->OrderSupport[NEG_ELLIPSE_CB_INDEX] = FALSE;
PubSub_SubscribeTerminate(context->pubSub, (pTerminateEventHandler) xf_TerminateEventHandler);
return 0;
}

View File

@ -193,8 +193,6 @@ BOOL xf_generic_ButtonPress(xfContext* xfc, int x, int y, int button, Window win
extended = FALSE;
input = xfc->instance->input;
printf("ButtonPress: x: %d y: %d button: %d\n", x, y, button);
switch (button)
{
case 1:

View File

@ -50,6 +50,10 @@ DEFINE_EVENT_BEGIN(ParamChange)
int id;
DEFINE_EVENT_END(ParamChange)
DEFINE_EVENT_BEGIN(Terminate)
int code;
DEFINE_EVENT_END(Terminate)
#ifdef __cplusplus
}
#endif

View File

@ -34,6 +34,7 @@
#include <freerdp/freerdp.h>
#include <freerdp/error.h>
#include <freerdp/event.h>
#include <freerdp/locale/keyboard.h>
/* connectErrorCode is 'extern' in error.h. See comment there.*/
@ -188,7 +189,16 @@ BOOL freerdp_check_fds(freerdp* instance)
status = rdp_check_fds(rdp);
if (status < 0)
{
TerminateEventArgs e;
rdpContext* context = instance->context;
EventArgsInit(&e, "freerdp");
e.code = 0;
PubSub_OnTerminate(context->pubSub, context, &e);
return FALSE;
}
return TRUE;
}
@ -314,6 +324,7 @@ static wEvent FreeRDP_Events[] =
DEFINE_EVENT_ENTRY(ResizeWindow)
DEFINE_EVENT_ENTRY(ErrorInfo)
DEFINE_EVENT_ENTRY(ParamChange)
DEFINE_EVENT_ENTRY(Terminate)
};
/** Allocator function for a rdp context.
@ -329,16 +340,18 @@ int freerdp_context_new(freerdp* instance)
rdpRdp* rdp;
rdpContext* context;
rdp = rdp_new(instance);
instance->input = rdp->input;
instance->update = rdp->update;
instance->settings = rdp->settings;
instance->context = (rdpContext*) malloc(instance->ContextSize);
ZeroMemory(instance->context, instance->ContextSize);
context = instance->context;
context->pubSub = PubSub_New(TRUE);
PubSub_Publish(context->pubSub, FreeRDP_Events, sizeof(FreeRDP_Events) / sizeof(wEvent));
rdp = rdp_new(instance);
instance->input = rdp->input;
instance->update = rdp->update;
instance->settings = rdp->settings;
context->graphics = graphics_new(context);
context->instance = instance;
context->rdp = rdp;
@ -347,9 +360,6 @@ int freerdp_context_new(freerdp* instance)
context->update = instance->update;
context->settings = instance->settings;
context->pubSub = PubSub_New(TRUE);
PubSub_Publish(context->pubSub, FreeRDP_Events, sizeof(FreeRDP_Events) / sizeof(wEvent));
instance->update->context = instance->context;
instance->update->pointer->context = instance->context;
instance->update->primary->context = instance->context;

View File

@ -91,6 +91,9 @@ int rpc_client_on_fragment_received_event(rdpRpc* rpc)
UINT32 StubLength;
wStream* fragment;
rpcconn_hdr_t* header;
freerdp* instance;
instance = (freerdp*) rpc->transport->settings->instance;
if (!rpc->client->pdu)
rpc->client->pdu = rpc_client_receive_pool_take(rpc);
@ -158,15 +161,21 @@ int rpc_client_on_fragment_received_event(rdpRpc* rpc)
if (StubLength == 4)
{
//fprintf(stderr, "Ignoring TsProxySendToServer Response\n");
printf("Got stub length 4 with flags %d and callid %d\n", header->common.pfc_flags, header->common.call_id);
/* received a disconnect request from the server? */
if (header->common.call_id == rpc->PipeCallId && header->common.pfc_flags & PFC_LAST_FRAG)
{
((freerdp*)rpc->settings->instance)->context->rdp->disconnect = TRUE;
((freerdp*)rpc->settings->instance)->context->rdp->transport->tsg->state = TSG_STATE_TUNNEL_CLOSE_PENDING;
}
printf("Got stub length 4 with flags %d and callid %d\n", header->common.pfc_flags, header->common.call_id);
/* received a disconnect request from the server? */
if ((header->common.call_id == rpc->PipeCallId) && (header->common.pfc_flags & PFC_LAST_FRAG))
{
TerminateEventArgs e;
instance->context->rdp->disconnect = TRUE;
rpc->transport->tsg->state = TSG_STATE_TUNNEL_CLOSE_PENDING;
EventArgsInit(&e, "freerdp");
e.code = 0;
PubSub_OnTerminate(instance->context->pubSub, instance->context, &e);
}
rpc_client_fragment_pool_return(rpc, fragment);
return 0;
}

View File

@ -255,12 +255,18 @@ BOOL rdp_read_header(rdpRdp* rdp, wStream* s, UINT16* length, UINT16* channel_id
if (MCSPDU == DomainMCSPDU_DisconnectProviderUltimatum)
{
BYTE reason;
TerminateEventArgs e;
rdpContext* context = rdp->instance->context;
(void) per_read_enumerated(s, &reason, 0);
DEBUG_RDP("DisconnectProviderUltimatum from server, reason code 0x%02x\n", reason);
rdp->disconnect = TRUE;
EventArgsInit(&e, "freerdp");
e.code = 0;
PubSub_OnTerminate(context->pubSub, context, &e);
return TRUE;
}

View File

@ -784,10 +784,13 @@ static void* transport_client_thread(void* arg)
DWORD nCount;
HANDLE events[32];
freerdp* instance;
rdpContext* context;
rdpTransport* transport;
TerminateEventArgs e;
transport = (rdpTransport*) arg;
instance = (freerdp*) transport->settings->instance;
context = instance->context;
while (1)
{