Fixed error handling for channel load failures.

This commit is contained in:
Armin Novak
2016-03-07 12:54:49 +01:00
parent 6ebf452513
commit 36cbf1b583
24 changed files with 216 additions and 165 deletions

View File

@@ -832,23 +832,21 @@ UINT DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints)
assert(pEntryPoints->GetPlugin);
audin = (AUDIN_PLUGIN*) pEntryPoints->GetPlugin(pEntryPoints, "audin");
if (audin == NULL)
if (audin != NULL)
return CHANNEL_RC_ALREADY_INITIALIZED;
audin = (AUDIN_PLUGIN*) calloc(1, sizeof(AUDIN_PLUGIN));
if (!audin)
{
audin = (AUDIN_PLUGIN*) calloc(1, sizeof(AUDIN_PLUGIN));
if (!audin)
{
WLog_ERR(TAG, "calloc failed!");
return CHANNEL_RC_NO_MEMORY;
}
audin->iface.Initialize = audin_plugin_initialize;
audin->iface.Connected = NULL;
audin->iface.Disconnected = NULL;
audin->iface.Terminated = audin_plugin_terminated;
error = pEntryPoints->RegisterPlugin(pEntryPoints, "audin", (IWTSPlugin*) audin);
WLog_ERR(TAG, "calloc failed!");
return CHANNEL_RC_NO_MEMORY;
}
audin->iface.Initialize = audin_plugin_initialize;
audin->iface.Connected = NULL;
audin->iface.Disconnected = NULL;
audin->iface.Terminated = audin_plugin_terminated;
args = pEntryPoints->GetPluginData(pEntryPoints);
audin->rdpcontext = ((freerdp*)((rdpSettings*) pEntryPoints->GetRdpSettings(pEntryPoints))->instance)->context;
@@ -894,7 +892,7 @@ UINT DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints)
if (audin->device == NULL)
WLog_ERR(TAG, "no sound device.");
error = CHANNEL_RC_OK;
error = pEntryPoints->RegisterPlugin(pEntryPoints, "audin", (IWTSPlugin*) audin);
out:
if (error != CHANNEL_RC_OK)

View File

@@ -159,10 +159,10 @@ static UINT cliprdr_process_general_capability(cliprdrPlugin* cliprdr, wStream*
WLog_ERR(TAG, "cliprdr_get_client_interface failed!");
return ERROR_INTERNAL_ERROR;
}
Stream_Read_UINT32(s, version); /* version (4 bytes) */
Stream_Read_UINT32(s, generalFlags); /* generalFlags (4 bytes) */
DEBUG_CLIPRDR("Version: %d", version);
#ifdef WITH_DEBUG_CLIPRDR
cliprdr_print_general_capability_flags(generalFlags);
@@ -179,7 +179,7 @@ static UINT cliprdr_process_general_capability(cliprdrPlugin* cliprdr, wStream*
if (cliprdr->canLockClipData)
cliprdr->canLockClipData = (generalFlags & CB_CAN_LOCK_CLIPDATA) ? TRUE : FALSE;
cliprdr->capabilitiesReceived = TRUE;
if (!context->custom)
@@ -187,7 +187,7 @@ static UINT cliprdr_process_general_capability(cliprdrPlugin* cliprdr, wStream*
WLog_ERR(TAG, "context->custom not set!");
return ERROR_INTERNAL_ERROR;
}
capabilities.cCapabilitiesSets = 1;
capabilities.capabilitySets = (CLIPRDR_CAPABILITY_SET*) &(generalCapabilitySet);
generalCapabilitySet.capabilitySetType = CB_CAPSTYPE_GENERAL;
@@ -215,7 +215,7 @@ static UINT cliprdr_process_clip_caps(cliprdrPlugin* cliprdr, wStream* s, UINT16
UINT16 cCapabilitiesSets;
UINT16 capabilitySetType;
UINT error = CHANNEL_RC_OK;
Stream_Read_UINT16(s, cCapabilitiesSets); /* cCapabilitiesSets (2 bytes) */
Stream_Seek_UINT16(s); /* pad1 (2 bytes) */
@@ -235,7 +235,7 @@ static UINT cliprdr_process_clip_caps(cliprdrPlugin* cliprdr, wStream* s, UINT16
return error;
}
break;
default:
WLog_ERR(TAG, "unknown cliprdr capability set: %d", capabilitySetType);
return CHANNEL_RC_BAD_PROC;
@@ -273,13 +273,13 @@ static UINT cliprdr_process_monitor_ready(cliprdrPlugin* cliprdr, wStream* s, UI
* When the server capabilities pdu is not used, default capabilities
* corresponding to a generalFlags field set to zero are assumed.
*/
cliprdr->useLongFormatNames = FALSE;
cliprdr->streamFileClipEnabled = FALSE;
cliprdr->fileClipNoFilePaths = TRUE;
cliprdr->canLockClipData = FALSE;
}
monitorReady.msgType = CB_MONITOR_READY;
monitorReady.msgFlags = flags;
monitorReady.dataLen = length;
@@ -354,7 +354,7 @@ static UINT cliprdr_process_filecontents_response(cliprdrPlugin* cliprdr, wStrea
WLog_ERR(TAG, "context->custom not set!");
return ERROR_INTERNAL_ERROR;
}
if (Stream_GetRemainingLength(s) < 4)
{
WLog_ERR(TAG, "not enought remaining data");
@@ -366,7 +366,7 @@ static UINT cliprdr_process_filecontents_response(cliprdrPlugin* cliprdr, wStrea
response.dataLen = length;
Stream_Read_UINT32(s, response.streamId); /* streamId (4 bytes) */
response.cbRequested = length - 4;
response.requestedData = Stream_Pointer(s); /* requestedFileContentsData */
@@ -434,7 +434,7 @@ static UINT cliprdr_process_unlock_clipdata(cliprdrPlugin* cliprdr, wStream* s,
WLog_ERR(TAG, "context->custom not set!");
return ERROR_INTERNAL_ERROR;
}
if (Stream_GetRemainingLength(s) < 4)
{
WLog_ERR(TAG, "not enought remaining data");
@@ -637,7 +637,7 @@ UINT cliprdr_client_format_list(CliprdrClientContext* context, CLIPRDR_FORMAT_LI
if (!cliprdr->useLongFormatNames)
{
length = formatList->numFormats * 36;
s = cliprdr_packet_new(CB_FORMAT_LIST, 0, length);
if (!s)
@@ -649,40 +649,40 @@ UINT cliprdr_client_format_list(CliprdrClientContext* context, CLIPRDR_FORMAT_LI
for (index = 0; index < formatList->numFormats; index++)
{
format = (CLIPRDR_FORMAT*) &(formatList->formats[index]);
Stream_Write_UINT32(s, format->formatId); /* formatId (4 bytes) */
formatNameSize = 0;
formatNameLength = 0;
szFormatName = format->formatName;
if (asciiNames)
{
if (szFormatName)
formatNameLength = strlen(szFormatName);
if (formatNameLength > 31)
formatNameLength = 31;
Stream_Write(s, szFormatName, formatNameLength);
Stream_Zero(s, 32 - formatNameLength);
}
else
{
wszFormatName = NULL;
if (szFormatName)
formatNameSize = ConvertToUnicode(CP_UTF8, 0, szFormatName, -1, &wszFormatName, 0);
if (formatNameSize > 15)
formatNameSize = 15;
if (wszFormatName)
if (wszFormatName)
Stream_Write(s, wszFormatName, formatNameSize * 2);
Stream_Zero(s, 32 - (formatNameSize * 2));
free(wszFormatName);
}
}
@@ -1218,9 +1218,9 @@ static UINT cliprdr_virtual_channel_event_disconnected(cliprdrPlugin* cliprdr)
if (MessageQueue_PostQuit(cliprdr->queue, 0) && (WaitForSingleObject(cliprdr->thread, INFINITE) == WAIT_FAILED))
{
rc = GetLastError();
WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", rc);
return rc;
rc = GetLastError();
WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", rc);
return rc;
}
MessageQueue_Free(cliprdr->queue);
@@ -1257,7 +1257,9 @@ static UINT cliprdr_virtual_channel_event_terminated(cliprdrPlugin* cliprdr)
return CHANNEL_RC_OK;
}
static VOID VCAPITYPE cliprdr_virtual_channel_init_event(LPVOID pInitHandle, UINT event, LPVOID pData, UINT dataLength)
static UINT VCAPITYPE cliprdr_virtual_channel_init_event(LPVOID pInitHandle,
UINT event, LPVOID pData,
UINT dataLength)
{
cliprdrPlugin* cliprdr;
UINT error = CHANNEL_RC_OK;
@@ -1267,7 +1269,7 @@ static VOID VCAPITYPE cliprdr_virtual_channel_init_event(LPVOID pInitHandle, UIN
if (!cliprdr)
{
WLog_ERR(TAG, "error no match");
return;
return CHANNEL_RC_BAD_INIT_HANDLE;
}
switch (event)
@@ -1290,7 +1292,7 @@ static VOID VCAPITYPE cliprdr_virtual_channel_init_event(LPVOID pInitHandle, UIN
if (error && cliprdr->context->rdpcontext)
setChannelError(cliprdr->context->rdpcontext, error, "cliprdr_virtual_channel_init_event reported an error");
return;
return error;
}
/* cliprdr is always built-in */
@@ -1358,14 +1360,14 @@ BOOL VCAPITYPE VirtualChannelEntry(PCHANNEL_ENTRY_POINTS pEntryPoints)
cliprdr->streamFileClipEnabled = FALSE;
cliprdr->fileClipNoFilePaths = TRUE;
cliprdr->canLockClipData = FALSE;
WLog_Print(cliprdr->log, WLOG_DEBUG, "VirtualChannelEntry");
CopyMemory(&(cliprdr->channelEntryPoints), pEntryPoints, sizeof(CHANNEL_ENTRY_POINTS_FREERDP));
rc = cliprdr->channelEntryPoints.pVirtualChannelInit(&cliprdr->InitHandle,
&cliprdr->channelDef, 1, VIRTUAL_CHANNEL_VERSION_WIN2000, cliprdr_virtual_channel_init_event);
if (CHANNEL_RC_OK != rc)
{
WLog_ERR(TAG, "pVirtualChannelInit failed with %s [%08X]",

View File

@@ -241,7 +241,7 @@ IWTSVirtualChannelManager* dvcman_new(drdynvcPlugin* plugin)
*
* @return 0 on success, otherwise a Win32 error code
*/
UINT dvcman_load_addin(IWTSVirtualChannelManager* pChannelMgr, ADDIN_ARGV* args, rdpSettings* settings)
static UINT dvcman_load_addin(IWTSVirtualChannelManager* pChannelMgr, ADDIN_ARGV* args, rdpSettings* settings)
{
DVCMAN_ENTRY_POINTS entryPoints;
PDVC_PLUGIN_ENTRY pDVCPluginEntry = NULL;
@@ -261,7 +261,7 @@ UINT dvcman_load_addin(IWTSVirtualChannelManager* pChannelMgr, ADDIN_ARGV* args,
entryPoints.args = args;
entryPoints.settings = settings;
pDVCPluginEntry((IDRDYNVC_ENTRY_POINTS*) &entryPoints);
return pDVCPluginEntry((IDRDYNVC_ENTRY_POINTS*) &entryPoints);
}
return CHANNEL_RC_OK;
@@ -478,8 +478,8 @@ UINT dvcman_create_channel(IWTSVirtualChannelManager* pChannelMgr, UINT32 Channe
context = dvcman->drdynvc->context;
IFCALLRET(context->OnChannelConnected, error, context, ChannelName, listener->iface.pInterface);
if (error)
WLog_ERR(TAG, "context.ReceiveSamples failed with error %lu", error);
if (error)
WLog_ERR(TAG, "context.ReceiveSamples failed with error %lu", error);
return error;
}
@@ -1056,7 +1056,7 @@ static UINT drdynvc_process_close_request(drdynvcPlugin* drdynvc, int Sp, int cb
WLog_ERR(TAG, "dvcman_close_channel failed with error %lu!", error);
return error;
}
data_out = Stream_New(NULL, 4);
if (!data_out)
@@ -1214,6 +1214,10 @@ void* drdynvc_get_open_handle_data(DWORD openHandle)
void drdynvc_remove_open_handle_data(DWORD openHandle)
{
void* pOpenHandle = (void*) (size_t) openHandle;
if (!g_OpenHandles)
return;
ListDictionary_Remove(g_OpenHandles, pOpenHandle);
if (ListDictionary_Count(g_OpenHandles) < 1)
@@ -1411,7 +1415,9 @@ static UINT drdynvc_virtual_channel_event_connected(drdynvcPlugin* drdynvc, LPVO
for (index = 0; index < settings->DynamicChannelCount; index++)
{
args = settings->DynamicChannelArray[index];
dvcman_load_addin(drdynvc->channel_mgr, args, settings);
error = dvcman_load_addin(drdynvc->channel_mgr, args, settings);
if (CHANNEL_RC_OK != error)
goto error;
}
if ((error = dvcman_init(drdynvc->channel_mgr)))
@@ -1434,8 +1440,6 @@ static UINT drdynvc_virtual_channel_event_connected(drdynvcPlugin* drdynvc, LPVO
error:
drdynvc_remove_open_handle_data(drdynvc->OpenHandle);
MessageQueue_Free(drdynvc->queue);
drdynvc->queue = NULL;
return error;
}
@@ -1449,11 +1453,11 @@ static UINT drdynvc_virtual_channel_event_disconnected(drdynvcPlugin* drdynvc)
UINT status;
if (MessageQueue_PostQuit(drdynvc->queue, 0) && (WaitForSingleObject(drdynvc->thread, INFINITE) == WAIT_FAILED))
{
status = GetLastError();
WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", status);
return status;
}
{
status = GetLastError();
WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", status);
return status;
}
MessageQueue_Free(drdynvc->queue);
CloseHandle(drdynvc->thread);
@@ -1497,7 +1501,9 @@ static UINT drdynvc_virtual_channel_event_terminated(drdynvcPlugin* drdynvc)
return CHANNEL_RC_OK;
}
static void VCAPITYPE drdynvc_virtual_channel_init_event(LPVOID pInitHandle, UINT event, LPVOID pData, UINT dataLength)
static UINT VCAPITYPE drdynvc_virtual_channel_init_event(LPVOID pInitHandle,
UINT event, LPVOID pData,
UINT dataLength)
{
drdynvcPlugin* drdynvc;
UINT error = CHANNEL_RC_OK;
@@ -1507,7 +1513,7 @@ static void VCAPITYPE drdynvc_virtual_channel_init_event(LPVOID pInitHandle, UIN
if (!drdynvc)
{
WLog_ERR(TAG, "drdynvc_virtual_channel_init_event: error no match");
return;
return CHANNEL_RC_BAD_INIT_HANDLE;
}
switch (event)
@@ -1530,6 +1536,7 @@ static void VCAPITYPE drdynvc_virtual_channel_init_event(LPVOID pInitHandle, UIN
if (error && drdynvc->rdpcontext)
setChannelError(drdynvc->rdpcontext, error, "drdynvc_virtual_channel_init_event reported an error");
return error;
}
/**

View File

@@ -1217,9 +1217,9 @@ static UINT encomsp_virtual_channel_event_disconnected(encomspPlugin* encomsp)
if (MessageQueue_PostQuit(encomsp->queue, 0) && (WaitForSingleObject(encomsp->thread, INFINITE) == WAIT_FAILED))
{
rc = GetLastError();
WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", rc);
return rc;
rc = GetLastError();
WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", rc);
return rc;
}
MessageQueue_Free(encomsp->queue);
@@ -1259,7 +1259,9 @@ static UINT encomsp_virtual_channel_event_terminated(encomspPlugin* encomsp)
return CHANNEL_RC_OK;
}
static void VCAPITYPE encomsp_virtual_channel_init_event(LPVOID pInitHandle, UINT event, LPVOID pData, UINT dataLength)
static UINT VCAPITYPE encomsp_virtual_channel_init_event(LPVOID pInitHandle,
UINT event, LPVOID pData,
UINT dataLength)
{
encomspPlugin* encomsp;
UINT error = CHANNEL_RC_OK;
@@ -1269,7 +1271,7 @@ static void VCAPITYPE encomsp_virtual_channel_init_event(LPVOID pInitHandle, UIN
if (!encomsp)
{
WLog_ERR(TAG, "encomsp_virtual_channel_init_event: error no match");
return;
return CHANNEL_RC_BAD_INIT_HANDLE;
}
switch (event)
@@ -1294,7 +1296,7 @@ static void VCAPITYPE encomsp_virtual_channel_init_event(LPVOID pInitHandle, UIN
if (error && encomsp->rdpcontext)
setChannelError(encomsp->rdpcontext, error, "encomsp_virtual_channel_init_event reported an error");
return;
return error;
}
/* encomsp is always built-in */

View File

@@ -741,9 +741,9 @@ static UINT rail_virtual_channel_event_disconnected(railPlugin* rail)
UINT rc;
if (MessageQueue_PostQuit(rail->queue, 0) && (WaitForSingleObject(rail->thread, INFINITE) == WAIT_FAILED))
{
rc = GetLastError();
WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", rc);
return rc;
rc = GetLastError();
WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", rc);
return rc;
}
MessageQueue_Free(rail->queue);
@@ -757,7 +757,7 @@ static UINT rail_virtual_channel_event_disconnected(railPlugin* rail)
{
WLog_ERR(TAG, "pVirtualChannelClose failed with %s [%08X]",
WTSErrorToString(rc), rc);
return rc;
return rc;
}
if (rail->data_in)
@@ -776,7 +776,7 @@ static void rail_virtual_channel_event_terminated(railPlugin* rail)
free(rail);
}
static VOID VCAPITYPE rail_virtual_channel_init_event(LPVOID pInitHandle, UINT event, LPVOID pData, UINT dataLength)
static UINT VCAPITYPE rail_virtual_channel_init_event(LPVOID pInitHandle, UINT event, LPVOID pData, UINT dataLength)
{
railPlugin* rail;
UINT error = CHANNEL_RC_OK;
@@ -786,7 +786,7 @@ static VOID VCAPITYPE rail_virtual_channel_init_event(LPVOID pInitHandle, UINT e
if (!rail)
{
WLog_ERR(TAG, "rail_virtual_channel_init_event: error no match");
return;
return CHANNEL_RC_BAD_INIT_HANDLE;
}
switch (event)
@@ -798,7 +798,7 @@ static VOID VCAPITYPE rail_virtual_channel_init_event(LPVOID pInitHandle, UINT e
case CHANNEL_EVENT_DISCONNECTED:
if ((error = rail_virtual_channel_event_disconnected(rail)))
WLog_ERR(TAG, "rail_virtual_channel_event_disconnected failed with error %lu!", error);
WLog_ERR(TAG, "rail_virtual_channel_event_disconnected failed with error %lu!", error);
break;
case CHANNEL_EVENT_TERMINATED:
@@ -809,7 +809,7 @@ static VOID VCAPITYPE rail_virtual_channel_init_event(LPVOID pInitHandle, UINT e
if(error && rail->rdpcontext)
setChannelError(rail->rdpcontext, error, "rail_virtual_channel_init_event reported an error");
return;
return error;
}
/* rail is always built-in */

View File

@@ -480,8 +480,8 @@ cleanup:
static void drive_hotplug_fsevent_callback(ConstFSEventStreamRef streamRef, void *clientCallBackInfo,
size_t numEvents, void *eventPaths, const FSEventStreamEventFlags eventFlags[],
const FSEventStreamEventId eventIds[])
size_t numEvents, void *eventPaths, const FSEventStreamEventFlags eventFlags[],
const FSEventStreamEventId eventIds[])
{
rdpdrPlugin* rdpdr;
int i;
@@ -649,13 +649,13 @@ static char* get_word(char* str, unsigned int* offset)
(*offset)++;
word = malloc(wlen + 1);
if (word != NULL)
{
CopyMemory(word, p, wlen);
word[wlen] = '\0';
}
return word;
}
@@ -1720,7 +1720,8 @@ static void rdpdr_virtual_channel_event_terminated(rdpdrPlugin* rdpdr)
free(rdpdr);
}
static VOID VCAPITYPE rdpdr_virtual_channel_init_event(LPVOID pInitHandle, UINT event, LPVOID pData, UINT dataLength)
static UINT VCAPITYPE rdpdr_virtual_channel_init_event(LPVOID pInitHandle, UINT event,
LPVOID pData, UINT dataLength)
{
rdpdrPlugin* rdpdr;
UINT error = CHANNEL_RC_OK;
@@ -1730,7 +1731,7 @@ static VOID VCAPITYPE rdpdr_virtual_channel_init_event(LPVOID pInitHandle, UINT
if (!rdpdr)
{
WLog_ERR(TAG, "error no match");
return;
return CHANNEL_RC_BAD_INIT_HANDLE;
}
switch (event)
@@ -1758,7 +1759,7 @@ static VOID VCAPITYPE rdpdr_virtual_channel_init_event(LPVOID pInitHandle, UINT
if (error && rdpdr->rdpcontext)
setChannelError(rdpdr->rdpcontext, error, "rdpdr_virtual_channel_init_event reported an error");
return;
return error;
}
/* rdpdr is always built-in */

View File

@@ -116,39 +116,39 @@ static void* rdpsnd_schedule_thread(void* arg)
while (1)
{
status = WaitForMultipleObjects(2, events, FALSE, INFINITE);
status = WaitForMultipleObjects(2, events, FALSE, INFINITE);
if (status == WAIT_FAILED)
{
error = GetLastError();
WLog_ERR(TAG, "WaitForMultipleObjects failed with error %lu!", error);
break;
}
if (status == WAIT_FAILED)
{
error = GetLastError();
WLog_ERR(TAG, "WaitForMultipleObjects failed with error %lu!", error);
break;
}
status = WaitForSingleObject(rdpsnd->stopEvent, 0);
status = WaitForSingleObject(rdpsnd->stopEvent, 0);
if (status == WAIT_FAILED)
{
error = GetLastError();
WLog_ERR(TAG, "WaitForSingleObject failed with error %lu!", error);
break;
}
if (status == WAIT_FAILED)
{
error = GetLastError();
WLog_ERR(TAG, "WaitForSingleObject failed with error %lu!", error);
break;
}
if (status == WAIT_OBJECT_0)
break;
if (status == WAIT_OBJECT_0)
break;
status = WaitForSingleObject(events[0], 0);
status = WaitForSingleObject(events[0], 0);
if (status == WAIT_FAILED)
{
error = GetLastError();
WLog_ERR(TAG, "WaitForSingleObject failed with error %lu!", error);
break;
}
if (status == WAIT_FAILED)
{
error = GetLastError();
WLog_ERR(TAG, "WaitForSingleObject failed with error %lu!", error);
break;
}
if (!MessageQueue_Peek(rdpsnd->MsgPipe->Out, &message, TRUE))
if (!MessageQueue_Peek(rdpsnd->MsgPipe->Out, &message, TRUE))
{
WLog_ERR(TAG, "MessageQueue_Peek failed!");
error = ERROR_INTERNAL_ERROR;
@@ -811,6 +811,7 @@ static UINT rdpsnd_load_device_plugin(rdpsndPlugin* rdpsnd, const char* name, AD
if ((error = entry(&entryPoints)))
WLog_ERR(TAG, "%s entry returns error %lu", name, error);
WLog_INFO(TAG, "Loaded %s backend for rdpsnd", name);
return error;
}
@@ -828,7 +829,7 @@ BOOL rdpsnd_set_device_name(rdpsndPlugin* rdpsnd, const char* device_name)
return (rdpsnd->device_name != NULL);
}
COMMAND_LINE_ARGUMENT_A rdpsnd_args[] =
static COMMAND_LINE_ARGUMENT_A rdpsnd_args[] =
{
{ "sys", COMMAND_LINE_VALUE_REQUIRED, "<subsystem>", NULL, NULL, -1, NULL, "subsystem" },
{ "dev", COMMAND_LINE_VALUE_REQUIRED, "<device>", NULL, NULL, -1, NULL, "device" },
@@ -1078,10 +1079,10 @@ static void rdpsnd_process_disconnect(rdpsndPlugin* rdpsnd)
{
SetEvent(rdpsnd->stopEvent);
if (WaitForSingleObject(rdpsnd->ScheduleThread, INFINITE) == WAIT_FAILED)
{
WLog_ERR(TAG, "WaitForSingleObject failed with error %lu!", GetLastError());
return;
}
{
WLog_ERR(TAG, "WaitForSingleObject failed with error %lu!", GetLastError());
return;
}
CloseHandle(rdpsnd->ScheduleThread);
CloseHandle(rdpsnd->stopEvent);
}
@@ -1386,9 +1387,9 @@ static UINT rdpsnd_virtual_channel_event_disconnected(rdpsndPlugin* rdpsnd)
MessagePipe_PostQuit(rdpsnd->MsgPipe, 0);
if (WaitForSingleObject(rdpsnd->thread, INFINITE) == WAIT_FAILED)
{
error = GetLastError();
WLog_ERR(TAG, "WaitForSingleObject failed with error %lu!", error);
return error;
error = GetLastError();
WLog_ERR(TAG, "WaitForSingleObject failed with error %lu!", error);
return error;
}
CloseHandle(rdpsnd->thread);
@@ -1449,7 +1450,7 @@ static void rdpsnd_virtual_channel_event_terminated(rdpsndPlugin* rdpsnd)
free(rdpsnd);
}
static VOID VCAPITYPE rdpsnd_virtual_channel_init_event(LPVOID pInitHandle, UINT event, LPVOID pData, UINT dataLength)
static UINT VCAPITYPE rdpsnd_virtual_channel_init_event(LPVOID pInitHandle, UINT event, LPVOID pData, UINT dataLength)
{
rdpsndPlugin* plugin;
UINT error = CHANNEL_RC_OK;
@@ -1459,7 +1460,7 @@ static VOID VCAPITYPE rdpsnd_virtual_channel_init_event(LPVOID pInitHandle, UINT
if (!plugin)
{
WLog_ERR(TAG, "rdpsnd_virtual_channel_init_event: error no match");
return;
return CHANNEL_RC_BAD_INIT_HANDLE;
}
switch (event)
@@ -1480,6 +1481,7 @@ static VOID VCAPITYPE rdpsnd_virtual_channel_init_event(LPVOID pInitHandle, UINT
}
if (error && plugin->rdpcontext)
setChannelError(plugin->rdpcontext, error, "rdpsnd_virtual_channel_init_event reported an error");
return error;
}
/* rdpsnd is always built-in */

View File

@@ -1030,11 +1030,11 @@ static UINT remdesk_virtual_channel_event_disconnected(remdeskPlugin* remdesk)
UINT rc;
if (MessageQueue_PostQuit(remdesk->queue, 0) && (WaitForSingleObject(remdesk->thread, INFINITE) == WAIT_FAILED))
{
rc = GetLastError();
WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", rc);
return rc;
}
{
rc = GetLastError();
WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", rc);
return rc;
}
MessageQueue_Free(remdesk->queue);
CloseHandle(remdesk->thread);
@@ -1066,7 +1066,9 @@ static void remdesk_virtual_channel_event_terminated(remdeskPlugin* remdesk)
free(remdesk);
}
static VOID VCAPITYPE remdesk_virtual_channel_init_event(LPVOID pInitHandle, UINT event, LPVOID pData, UINT dataLength)
static UINT VCAPITYPE remdesk_virtual_channel_init_event(LPVOID pInitHandle,
UINT event, LPVOID pData,
UINT dataLength)
{
remdeskPlugin* remdesk;
UINT error = CHANNEL_RC_OK;
@@ -1076,7 +1078,7 @@ static VOID VCAPITYPE remdesk_virtual_channel_init_event(LPVOID pInitHandle, UIN
if (!remdesk)
{
WLog_ERR(TAG, "error no match");
return;
return CHANNEL_RC_BAD_INIT_HANDLE;
}
switch (event)
@@ -1097,6 +1099,8 @@ static VOID VCAPITYPE remdesk_virtual_channel_init_event(LPVOID pInitHandle, UIN
}
if (error && remdesk->rdpcontext)
setChannelError(remdesk->rdpcontext, error, "remdesk_virtual_channel_init_event reported an error");
return error;
}
/* remdesk is always built-in */

View File

@@ -357,7 +357,7 @@ static BOOL android_post_connect(freerdp* instance)
instance->update->EndPaint = android_end_paint;
instance->update->DesktopResize = android_desktop_resize;
if (freerdp_channels_post_connect(instance->context->channels, instance) < 0)
if (freerdp_channels_post_connect(instance->context->channels, instance) != CHANNEL_RC_OK)
return FALSE;
freerdp_callback("OnSettingsChanged", "(IIII)V", instance,

View File

@@ -177,7 +177,8 @@ BOOL df_pre_connect(freerdp* instance)
dfi->clrconv->palette = (rdpPalette*) malloc(sizeof(rdpPalette));
ZeroMemory(dfi->clrconv->palette, sizeof(rdpPalette));
freerdp_channels_pre_connect(instance->context->channels, instance);
if (freerdp_channels_pre_connect(instance->context->channels, instance) != CHANNEL_RC_OK)
return FALSE;
return (instance->context->cache = cache_new(instance->settings)) != NULL;
}
@@ -235,7 +236,7 @@ BOOL df_post_connect(freerdp* instance)
pointer_cache_register_callbacks(instance->update);
df_register_graphics(instance->context->graphics);
return freerdp_channels_post_connect(instance->context->channels, instance) >= 0;
return freerdp_channels_post_connect(instance->context->channels, instance) == CHANNEL_RC_OK;
}
BOOL df_verify_certificate(freerdp* instance, char* subject, char* issuer, char* fingerprint)
@@ -487,7 +488,8 @@ int main(int argc, char* argv[])
if (status < 0)
exit(0);
freerdp_client_load_addins(instance->context->channels, instance->settings);
if (!freerdp_client_load_addins(instance->context->channels, instance->settings))
exit(-1);
data = (struct thread_data*) malloc(sizeof(struct thread_data));
ZeroMemory(data, sizeof(sizeof(struct thread_data)));

View File

@@ -967,9 +967,11 @@ BOOL mac_pre_connect(freerdp* instance)
PubSub_SubscribeChannelDisconnected(instance->context->pubSub,
(pChannelDisconnectedEventHandler) mac_OnChannelDisconnectedEventHandler);
freerdp_client_load_addins(instance->context->channels, instance->settings);
if (!freerdp_client_load_addins(instance->context->channels, instance->settings))
return FALSE;
freerdp_channels_pre_connect(instance->context->channels, instance);
if (freerdp_channels_pre_connect(instance->context->channels, instance) != CHANNEL_RC_OK)
return FALSE;
return TRUE;
}
@@ -1011,7 +1013,8 @@ BOOL mac_post_connect(freerdp* instance)
pointer_cache_register_callbacks(instance->update);
graphics_register_pointer(instance->context->graphics, &rdp_pointer);
freerdp_channels_post_connect(instance->context->channels, instance);
if (freerdp_channels_post_connect(instance->context->channels, instance) != CHANNEL_RC_OK)
return FALSE;
/* setup pasteboard (aka clipboard) for copy operations (write only) */
view->pasteboard_wr = [NSPasteboard generalPasteboard];

View File

@@ -109,7 +109,8 @@ static BOOL tf_pre_connect(freerdp* instance)
settings->OrderSupport[NEG_ELLIPSE_SC_INDEX] = TRUE;
settings->OrderSupport[NEG_ELLIPSE_CB_INDEX] = TRUE;
freerdp_channels_pre_connect(instance->context->channels, instance);
if (freerdp_channels_pre_connect(instance->context->channels, instance) != CHANNEL_RC_OK)
return FALSE;
return TRUE;
}
@@ -122,7 +123,7 @@ static BOOL tf_post_connect(freerdp* instance)
instance->update->BeginPaint = tf_begin_paint;
instance->update->EndPaint = tf_end_paint;
return (freerdp_channels_post_connect(instance->context->channels, instance) >= 0);
return (freerdp_channels_post_connect(instance->context->channels, instance) == CHANNEL_RC_OK);
}
static void* tf_client_thread_proc(freerdp* instance)
@@ -200,7 +201,8 @@ int main(int argc, char* argv[])
exit(0);
}
freerdp_client_load_addins(instance->context->channels, instance->settings);
if (!freerdp_client_load_addins(instance->context->channels, instance->settings))
exit (-1);
if (!(thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)
tf_client_thread_proc, instance, 0, NULL)))

View File

@@ -114,7 +114,7 @@ static BOOL wl_pre_connect(freerdp* instance)
{
wlfContext* context;
if (freerdp_channels_pre_connect(instance->context->channels, instance))
if (freerdp_channels_pre_connect(instance->context->channels, instance) != CHANNEL_RC_OK)
return FALSE;
context = (wlfContext*) instance->context;
@@ -149,7 +149,7 @@ static BOOL wl_post_connect(freerdp* instance)
instance->update->BeginPaint = wl_begin_paint;
instance->update->EndPaint = wl_end_paint;
if (freerdp_channels_post_connect(instance->context->channels, instance) < 0)
if (freerdp_channels_post_connect(instance->context->channels, instance) != CHANNEL_RC_OK)
return FALSE;
@@ -324,7 +324,8 @@ int main(int argc, char* argv[])
if (status)
exit(0);
freerdp_client_load_addins(instance->context->channels, instance->settings);
if (!freerdp_client_load_addins(instance->context->channels, instance->settings))
exit(-1);
wlfreerdp_run(instance);

View File

@@ -333,7 +333,8 @@ BOOL wf_pre_connect(freerdp* instance)
PubSub_SubscribeChannelDisconnected(instance->context->pubSub,
(pChannelDisconnectedEventHandler) wf_OnChannelDisconnectedEventHandler);
freerdp_channels_pre_connect(instance->context->channels, instance);
if (freerdp_channels_pre_connect(instance->context->channels, instance) != CHANNEL_RC_OK)
return FALSE;
return TRUE;
}
@@ -485,7 +486,7 @@ BOOL wf_post_connect(freerdp* instance)
instance->update->BitmapUpdate = wf_gdi_bitmap_update;
}
if (freerdp_channels_post_connect(context->channels, instance) < 0)
if (freerdp_channels_post_connect(context->channels, instance) != CHANNEL_RC_OK)
return FALSE;
if (wfc->fullscreen)
@@ -1169,7 +1170,8 @@ int wfreerdp_client_start(rdpContext* context)
if (!wfc->keyboardThread)
return -1;
freerdp_client_load_addins(context->channels, instance->settings);
if (!freerdp_client_load_addins(context->channels, instance->settings))
return -1;
wfc->thread = CreateThread(NULL, 0, wf_client_thread, (void*) instance, 0, &wfc->mainThreadId);

View File

@@ -1127,8 +1127,11 @@ BOOL xf_pre_connect(freerdp* instance)
PubSub_SubscribeChannelDisconnected(instance->context->pubSub,
(pChannelDisconnectedEventHandler) xf_OnChannelDisconnectedEventHandler);
freerdp_client_load_addins(channels, instance->settings);
freerdp_channels_pre_connect(channels, instance);
if (!freerdp_client_load_addins(channels, instance->settings))
return FALSE;
if (freerdp_channels_pre_connect(channels, instance) != CHANNEL_RC_OK)
return FALSE;
if (!settings->Username && !settings->CredentialsFromStdin)
{
@@ -1312,7 +1315,7 @@ BOOL xf_post_connect(freerdp* instance)
if (!(xfc->clipboard = xf_clipboard_new(xfc)))
return FALSE;
if (freerdp_channels_post_connect(channels, instance) < 0)
if (freerdp_channels_post_connect(channels, instance) != CHANNEL_RC_OK)
return FALSE;
EventArgsInit(&e, "xfreerdp");

View File

@@ -64,9 +64,11 @@ static BOOL ios_pre_connect(freerdp* instance)
settings->FrameAcknowledge = 10;
freerdp_client_load_addins(instance->context->channels, instance->settings);
if (!freerdp_client_load_addins(instance->context->channels, instance->settings))
return FALSE;
freerdp_channels_pre_connect(instance->context->channels, instance);
if (freerdp_channels_pre_connect(instance->context->channels, instance) != CHANNEL_RC_OK)
return FALSE;
return TRUE;
}
@@ -84,7 +86,8 @@ static BOOL ios_post_connect(freerdp* instance)
instance->update->DesktopResize = ios_ui_resize_window;
// Channel allocation
freerdp_channels_post_connect(instance->context->channels, instance);
if (freerdp_channels_post_connect(instance->context->channels, instance) != CHANNEL_RC_OK)
return FALSE;
[mfi->session performSelectorOnMainThread:@selector(sessionDidConnect) withObject:nil waitUntilDone:YES];
return TRUE;

View File

@@ -38,9 +38,9 @@ FREERDP_API int freerdp_channels_client_load(rdpChannels* channels, rdpSettings*
PVIRTUALCHANNELENTRY entry, void* data);
FREERDP_API int freerdp_channels_load_plugin(rdpChannels* channels, rdpSettings* settings,
const char* name, void* data);
FREERDP_API int freerdp_channels_pre_connect(rdpChannels* channels, freerdp* instance);
FREERDP_API int freerdp_channels_post_connect(rdpChannels* channels, freerdp* instance);
FREERDP_API int freerdp_channels_disconnect(rdpChannels* channels, freerdp* instance);
FREERDP_API UINT freerdp_channels_pre_connect(rdpChannels* channels, freerdp* instance);
FREERDP_API UINT freerdp_channels_post_connect(rdpChannels* channels, freerdp* instance);
FREERDP_API UINT freerdp_channels_disconnect(rdpChannels* channels, freerdp* instance);
FREERDP_API BOOL freerdp_channels_get_fds(rdpChannels* channels, freerdp* instance, void** read_fds,
int* read_count, void** write_fds, int* write_count);
FREERDP_API BOOL freerdp_channels_check_fds(rdpChannels* channels, freerdp* instance);

View File

@@ -200,8 +200,9 @@ UINT freerdp_drdynvc_on_channel_disconnected(DrdynvcClientContext* context, cons
* go through and inform all the libraries that we are initialized
* called only from main thread
*/
int freerdp_channels_pre_connect(rdpChannels* channels, freerdp* instance)
UINT freerdp_channels_pre_connect(rdpChannels* channels, freerdp* instance)
{
UINT error = CHANNEL_RC_OK;
int index;
CHANNEL_CLIENT_DATA* pChannelClientData;
@@ -212,10 +213,14 @@ int freerdp_channels_pre_connect(rdpChannels* channels, freerdp* instance)
pChannelClientData = &channels->clientDataList[index];
if (pChannelClientData->pChannelInitEventProc)
pChannelClientData->pChannelInitEventProc(pChannelClientData->pInitHandle, CHANNEL_EVENT_INITIALIZED, 0, 0);
error = pChannelClientData->pChannelInitEventProc(
pChannelClientData->pInitHandle,
CHANNEL_EVENT_INITIALIZED, 0, 0);
if (CHANNEL_RC_OK != error)
break;
}
return 0;
return error;
}
/**
@@ -223,8 +228,9 @@ int freerdp_channels_pre_connect(rdpChannels* channels, freerdp* instance)
* this will tell the libraries that its ok to call MyVirtualChannelOpen
* called only from main thread
*/
int freerdp_channels_post_connect(rdpChannels* channels, freerdp* instance)
UINT freerdp_channels_post_connect(rdpChannels* channels, freerdp* instance)
{
UINT error = CHANNEL_RC_OK;
int index;
char* name;
char* hostname;
@@ -246,7 +252,10 @@ int freerdp_channels_post_connect(rdpChannels* channels, freerdp* instance)
pChannelOpenData = &channels->openDataList[index];
pChannelClientData->pChannelInitEventProc(pChannelClientData->pInitHandle, CHANNEL_EVENT_CONNECTED, hostname, hostnameLength);
error = pChannelClientData->pChannelInitEventProc(pChannelClientData->pInitHandle,
CHANNEL_EVENT_CONNECTED, hostname, hostnameLength);
if (error != CHANNEL_RC_OK)
goto fail;
name = (char*) malloc(9);
if (!name)
@@ -272,7 +281,8 @@ int freerdp_channels_post_connect(rdpChannels* channels, freerdp* instance)
channels->drdynvc->OnChannelDisconnected = freerdp_drdynvc_on_channel_disconnected;
}
return 0;
fail:
return error;
}
int freerdp_channels_data(freerdp* instance, UINT16 channelId, BYTE* data, int dataSize, int flags, int totalSize)
@@ -437,8 +447,9 @@ BOOL freerdp_channels_check_fds(rdpChannels* channels, freerdp* instance)
return TRUE;
}
int freerdp_channels_disconnect(rdpChannels* channels, freerdp* instance)
UINT freerdp_channels_disconnect(rdpChannels* channels, freerdp* instance)
{
UINT error = CHANNEL_RC_OK;
int index;
char* name;
CHANNEL_OPEN_DATA* pChannelOpenData;
@@ -458,7 +469,11 @@ int freerdp_channels_disconnect(rdpChannels* channels, freerdp* instance)
pChannelClientData = &channels->clientDataList[index];
if (pChannelClientData->pChannelInitEventProc)
pChannelClientData->pChannelInitEventProc(pChannelClientData->pInitHandle, CHANNEL_EVENT_DISCONNECTED, 0, 0);
error = pChannelClientData->pChannelInitEventProc(
pChannelClientData->pInitHandle,
CHANNEL_EVENT_DISCONNECTED, 0, 0);
if (error != CHANNEL_RC_OK)
goto fail;
pChannelOpenData = &channels->openDataList[index];
@@ -476,7 +491,8 @@ int freerdp_channels_disconnect(rdpChannels* channels, freerdp* instance)
free(name);
}
return 0;
fail:
return error;
}
void freerdp_channels_close(rdpChannels* channels, freerdp* instance)

View File

@@ -400,7 +400,7 @@ BOOL rdp_client_reconnect(rdpRdp* rdp)
status = rdp_client_connect(rdp);
if (status)
status = (freerdp_channels_post_connect(channels, context->instance) >= 0);
status = (freerdp_channels_post_connect(channels, context->instance) == CHANNEL_RC_OK);
return status;
}

View File

@@ -133,9 +133,11 @@ BOOL shw_pre_connect(freerdp* instance)
PubSub_SubscribeChannelDisconnected(context->pubSub,
(pChannelDisconnectedEventHandler) shw_OnChannelDisconnectedEventHandler);
freerdp_client_load_addins(context->channels, instance->settings);
if (!freerdp_client_load_addins(context->channels, instance->settings))
return FALSE;
freerdp_channels_pre_connect(context->channels, instance);
if (freerdp_channels_pre_connect(context->channels, instance) != CHANNEL_RC_OK)
return FALSE;
return TRUE;
}
@@ -159,7 +161,7 @@ BOOL shw_post_connect(freerdp* instance)
instance->update->DesktopResize = shw_desktop_resize;
instance->update->SurfaceFrameMarker = shw_surface_frame_marker;
return (freerdp_channels_post_connect(instance->context->channels, instance) >= 0) ;
return (freerdp_channels_post_connect(instance->context->channels, instance) == CHANNEL_RC_OK) ;
}
void* shw_client_thread(void* arg)

View File

@@ -24,7 +24,7 @@
#include "shadow_channels.h"
int shadow_client_channels_post_connect(rdpShadowClient* client)
UINT shadow_client_channels_post_connect(rdpShadowClient* client)
{
if (WTSVirtualChannelManagerIsChannelJoined(client->vcm, ENCOMSP_SVC_CHANNEL_NAME))
{
@@ -43,7 +43,7 @@ int shadow_client_channels_post_connect(rdpShadowClient* client)
shadow_client_audin_init(client);
return 1;
return CHANNEL_RC_OK;
}
void shadow_client_channels_free(rdpShadowClient* client)

View File

@@ -33,7 +33,7 @@
extern "C" {
#endif
int shadow_client_channels_post_connect(rdpShadowClient* client);
UINT shadow_client_channels_post_connect(rdpShadowClient* client);
void shadow_client_channels_free(rdpShadowClient* client);
#ifdef __cplusplus

View File

@@ -235,7 +235,8 @@ BOOL shadow_client_post_connect(freerdp_peer* peer)
peer->update->DesktopResize(peer->update->context);
shadow_client_channels_post_connect(client);
if (shadow_client_channels_post_connect(client) != CHANNEL_RC_OK)
return FALSE;
invalidRect.left = 0;
invalidRect.top = 0;

View File

@@ -116,7 +116,7 @@ typedef struct tagCHANNEL_PDU_HEADER
#define VCEXPORT __export
#endif
typedef VOID VCAPITYPE CHANNEL_INIT_EVENT_FN(LPVOID pInitHandle,
typedef UINT VCAPITYPE CHANNEL_INIT_EVENT_FN(LPVOID pInitHandle,
UINT event, LPVOID pData, UINT dataLength);
typedef CHANNEL_INIT_EVENT_FN *PCHANNEL_INIT_EVENT_FN;