freerdp-core: added Terminate event
This commit is contained in:
parent
cc5b471f75
commit
90ce8be9fc
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user