/** * go through and inform all the libraries that we are initialized * called only from main thread */ UINT freerdp_channels_pre_connect(rdpChannels* channels, freerdp* instance) { UINT error = CHANNEL_RC_OK; int index; CHANNEL_CLIENT_DATA* pChannelClientData; for (index = 0; index < channels->clientDataCount; index++) { pChannelClientData = &channels->clientDataList[index]; if (pChannelClientData->pChannelInitEventProc) { pChannelClientData->pChannelInitEventProc( pChannelClientData->pInitHandle, CHANNEL_EVENT_INITIALIZED, 0, 0); } else if (pChannelClientData->pChannelInitEventProcEx) { pChannelClientData->pChannelInitEventProcEx(pChannelClientData->lpUserParam, pChannelClientData->pInitHandle, CHANNEL_EVENT_INITIALIZED, 0, 0); } if (CHANNEL_RC_OK != getChannelError(instance->context)) break; } return error; }
UINT freerdp_channels_detach(freerdp* instance) { UINT error = CHANNEL_RC_OK; int index; char* name = NULL; char* hostname; int hostnameLength; rdpChannels* channels; CHANNEL_CLIENT_DATA* pChannelClientData; channels = instance->context->channels; channels->connected = 1; hostname = instance->settings->ServerHostname; hostnameLength = (int) strlen(hostname); for (index = 0; index < channels->clientDataCount; index++) { ChannelConnectedEventArgs e; CHANNEL_OPEN_DATA* pChannelOpenData; pChannelClientData = &channels->clientDataList[index]; if (pChannelClientData->pChannelInitEventProc) { pChannelClientData->pChannelInitEventProc( pChannelClientData->pInitHandle, CHANNEL_EVENT_DETACHED, hostname, hostnameLength); } else if (pChannelClientData->pChannelInitEventProcEx) { pChannelClientData->pChannelInitEventProcEx(pChannelClientData->lpUserParam, pChannelClientData->pInitHandle, CHANNEL_EVENT_DETACHED, hostname, hostnameLength); } if (getChannelError(instance->context) != CHANNEL_RC_OK) goto fail; pChannelOpenData = &channels->openDataList[index]; name = (char*) malloc(9); if (!name) { error = CHANNEL_RC_NO_MEMORY; goto fail; } CopyMemory(name, pChannelOpenData->name, 8); name[8] = '\0'; EventArgsInit(&e, "freerdp"); e.name = name; e.pInterface = pChannelOpenData->pInterface; PubSub_OnChannelDetached(instance->context->pubSub, instance->context, &e); free(name); name = NULL; } fail: free(name); return error; }
/** * go through and inform all the libraries that we are connected * this will tell the libraries that its ok to call MyVirtualChannelOpen * called only from main thread */ UINT freerdp_channels_post_connect(rdpChannels* channels, freerdp* instance) { UINT error = CHANNEL_RC_OK; UINT index; char* hostname; size_t hostnameLength; CHANNEL_CLIENT_DATA* pChannelClientData; channels->connected = TRUE; hostname = instance->settings->ServerHostname; hostnameLength = strlen(hostname); for (index = 0; index < channels->clientDataCount; index++) { ChannelConnectedEventArgs e; CHANNEL_OPEN_DATA* pChannelOpenData; pChannelClientData = &channels->clientDataList[index]; if (pChannelClientData->pChannelInitEventProc) { pChannelClientData->pChannelInitEventProc( pChannelClientData->pInitHandle, CHANNEL_EVENT_CONNECTED, hostname, hostnameLength); } else if (pChannelClientData->pChannelInitEventProcEx) { pChannelClientData->pChannelInitEventProcEx(pChannelClientData->lpUserParam, pChannelClientData->pInitHandle, CHANNEL_EVENT_CONNECTED, hostname, hostnameLength); } if (getChannelError(instance->context) != CHANNEL_RC_OK) goto fail; pChannelOpenData = &channels->openDataList[index]; EventArgsInit(&e, "freerdp"); e.name = pChannelOpenData->name; e.pInterface = pChannelOpenData->pInterface; PubSub_OnChannelConnected(instance->context->pubSub, instance->context, &e); } channels->drdynvc = (DrdynvcClientContext*) freerdp_channels_get_static_channel_interface(channels, "drdynvc"); if (channels->drdynvc) { channels->drdynvc->custom = (void*) channels; channels->drdynvc->OnChannelConnected = freerdp_drdynvc_on_channel_connected; channels->drdynvc->OnChannelDisconnected = freerdp_drdynvc_on_channel_disconnected; channels->drdynvc->OnChannelAttached = freerdp_drdynvc_on_channel_attached; channels->drdynvc->OnChannelDetached = freerdp_drdynvc_on_channel_detached; } fail: return error; }
UINT freerdp_channels_disconnect(rdpChannels* channels, freerdp* instance) { UINT error = CHANNEL_RC_OK; int index; char* name; CHANNEL_OPEN_DATA* pChannelOpenData; CHANNEL_CLIENT_DATA* pChannelClientData; if (!channels->connected) return 0; channels->connected = 0; freerdp_channels_check_fds(channels, instance); /* tell all libraries we are shutting down */ for (index = 0; index < channels->clientDataCount; index++) { ChannelDisconnectedEventArgs e; pChannelClientData = &channels->clientDataList[index]; if (pChannelClientData->pChannelInitEventProc) { pChannelClientData->pChannelInitEventProc( pChannelClientData->pInitHandle, CHANNEL_EVENT_DISCONNECTED, 0, 0); } else if (pChannelClientData->pChannelInitEventProcEx) { pChannelClientData->pChannelInitEventProcEx(pChannelClientData->lpUserParam, pChannelClientData->pInitHandle, CHANNEL_EVENT_DISCONNECTED, 0, 0); } if (getChannelError(instance->context) != CHANNEL_RC_OK) goto fail; pChannelOpenData = &channels->openDataList[index]; name = (char*) malloc(9); if (!name) return -1; CopyMemory(name, pChannelOpenData->name, 8); name[8] = '\0'; EventArgsInit(&e, "freerdp"); e.name = name; e.pInterface = pChannelOpenData->pInterface; PubSub_OnChannelDisconnected(instance->context->pubSub, instance->context, &e); free(name); } fail: return error; }
UINT freerdp_channels_attach(freerdp* instance) { UINT error = CHANNEL_RC_OK; int index; char* hostname; int hostnameLength; rdpChannels* channels; CHANNEL_CLIENT_DATA* pChannelClientData; channels = instance->context->channels; hostname = instance->settings->ServerHostname; hostnameLength = (int) strlen(hostname); for (index = 0; index < channels->clientDataCount; index++) { ChannelAttachedEventArgs e; CHANNEL_OPEN_DATA* pChannelOpenData = NULL; pChannelClientData = &channels->clientDataList[index]; if (pChannelClientData->pChannelInitEventProc) { pChannelClientData->pChannelInitEventProc( pChannelClientData->pInitHandle, CHANNEL_EVENT_ATTACHED, hostname, hostnameLength); } else if (pChannelClientData->pChannelInitEventProcEx) { pChannelClientData->pChannelInitEventProcEx(pChannelClientData->lpUserParam, pChannelClientData->pInitHandle, CHANNEL_EVENT_ATTACHED, hostname, hostnameLength); } if (getChannelError(instance->context) != CHANNEL_RC_OK) goto fail; pChannelOpenData = &channels->openDataList[index]; EventArgsInit(&e, "freerdp"); e.name = pChannelOpenData->name; e.pInterface = pChannelOpenData->pInterface; PubSub_OnChannelAttached(instance->context->pubSub, instance->context, &e); } fail: return error; }
/** * go through and inform all the libraries that we are connected * this will tell the libraries that its ok to call MyVirtualChannelOpen * called only from main thread */ UINT freerdp_channels_post_connect(rdpChannels* channels, freerdp* instance) { UINT error = CHANNEL_RC_OK; int index; char* name = NULL; char* hostname; int hostnameLength; CHANNEL_CLIENT_DATA* pChannelClientData; channels->connected = 1; hostname = instance->settings->ServerHostname; hostnameLength = (int) strlen(hostname); for (index = 0; index < channels->clientDataCount; index++) { pChannelClientData = &channels->clientDataList[index]; if (pChannelClientData->pChannelInitEventProc) { ChannelConnectedEventArgs e; CHANNEL_OPEN_DATA* pChannelOpenData; pChannelOpenData = &channels->openDataList[index]; pChannelClientData->pChannelInitEventProc(pChannelClientData->pInitHandle, CHANNEL_EVENT_CONNECTED, hostname, hostnameLength); if (getChannelError(instance->context) != CHANNEL_RC_OK) goto fail; name = (char*) malloc(9); if (!name) { error = CHANNEL_RC_NO_MEMORY; goto fail; } CopyMemory(name, pChannelOpenData->name, 8); name[8] = '\0'; EventArgsInit(&e, "freerdp"); e.name = name; e.pInterface = pChannelOpenData->pInterface; PubSub_OnChannelConnected(instance->context->pubSub, instance->context, &e); free(name); name = NULL; } } channels->drdynvc = (DrdynvcClientContext*) freerdp_channels_get_static_channel_interface(channels, "drdynvc"); if (channels->drdynvc) { channels->drdynvc->custom = (void*) channels; channels->drdynvc->OnChannelConnected = freerdp_drdynvc_on_channel_connected; channels->drdynvc->OnChannelDisconnected = freerdp_drdynvc_on_channel_disconnected; } fail: free (name); return error; }