int rdpgfx_get_surface_ids(RdpgfxClientContext* context, UINT16** ppSurfaceIds) { int count; int index; UINT16* pSurfaceIds; ULONG_PTR* pKeys = NULL; RDPGFX_PLUGIN* gfx = (RDPGFX_PLUGIN*) context->handle; count = HashTable_GetKeys(gfx->SurfaceTable, &pKeys); if (count < 1) return 0; pSurfaceIds = (UINT16*) malloc(count * sizeof(UINT16)); if (!pSurfaceIds) return -1; for (index = 0; index < count; index++) { pSurfaceIds[index] = pKeys[index] - 1; } free(pKeys); *ppSurfaceIds = pSurfaceIds; return count; }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ static UINT rdpgfx_get_surface_ids(RdpgfxClientContext* context, UINT16** ppSurfaceIds, UINT16* count_out) { int count; int index; UINT16* pSurfaceIds; ULONG_PTR* pKeys = NULL; RDPGFX_PLUGIN* gfx = (RDPGFX_PLUGIN*) context->handle; count = HashTable_GetKeys(gfx->SurfaceTable, &pKeys); if (count < 1) { *count_out = 0; return CHANNEL_RC_OK; } pSurfaceIds = (UINT16*) calloc(count, sizeof(UINT16)); if (!pSurfaceIds) { WLog_Print(gfx->log, WLOG_ERROR, "calloc failed!"); free(pKeys); return CHANNEL_RC_NO_MEMORY; } for (index = 0; index < count; index++) { pSurfaceIds[index] = pKeys[index] - 1; } free(pKeys); *ppSurfaceIds = pSurfaceIds; *count_out = (UINT16)count; return CHANNEL_RC_OK; }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ static UINT rdpgfx_on_close(IWTSVirtualChannelCallback* pChannelCallback) { int count; int index; ULONG_PTR* pKeys = NULL; RDPGFX_CHANNEL_CALLBACK* callback = (RDPGFX_CHANNEL_CALLBACK*) pChannelCallback; RDPGFX_PLUGIN* gfx = (RDPGFX_PLUGIN*) callback->plugin; RdpgfxClientContext* context = (RdpgfxClientContext*) gfx->iface.pInterface; WLog_DBG(TAG, "OnClose"); free(callback); gfx->UnacknowledgedFrames = 0; gfx->TotalDecodedFrames = 0; if (gfx->zgfx) { zgfx_context_free(gfx->zgfx); gfx->zgfx = zgfx_context_new(FALSE); if (!gfx->zgfx) return CHANNEL_RC_NO_MEMORY; } count = HashTable_GetKeys(gfx->SurfaceTable, &pKeys); for (index = 0; index < count; index++) { RDPGFX_DELETE_SURFACE_PDU pdu; pdu.surfaceId = ((UINT16) pKeys[index]) - 1; if (context && context->DeleteSurface) { context->DeleteSurface(context, &pdu); } } free(pKeys); for (index = 0; index < gfx->MaxCacheSlot; index++) { if (gfx->CacheSlots[index]) { RDPGFX_EVICT_CACHE_ENTRY_PDU pdu; pdu.cacheSlot = (UINT16) index; if (context && context->EvictCacheEntry) { context->EvictCacheEntry(context, &pdu); } gfx->CacheSlots[index] = NULL; } } return CHANNEL_RC_OK; }
static int rdpgfx_plugin_terminated(IWTSPlugin* pPlugin) { int count; int index; ULONG_PTR* pKeys = NULL; RDPGFX_PLUGIN* gfx = (RDPGFX_PLUGIN*) pPlugin; RdpgfxClientContext* context = (RdpgfxClientContext*) gfx->iface.pInterface; WLog_Print(gfx->log, WLOG_DEBUG, "Terminated"); if (gfx->listener_callback) free(gfx->listener_callback); zgfx_context_free(gfx->zgfx); count = HashTable_GetKeys(gfx->SurfaceTable, &pKeys); for (index = 0; index < count; index++) { RDPGFX_DELETE_SURFACE_PDU pdu; pdu.surfaceId = ((UINT16) pKeys[index]) - 1; if (context && context->DeleteSurface) { context->DeleteSurface(context, &pdu); } } free(pKeys); HashTable_Free(gfx->SurfaceTable); for (index = 0; index < gfx->MaxCacheSlot; index++) { if (gfx->CacheSlots[index]) { RDPGFX_EVICT_CACHE_ENTRY_PDU pdu; pdu.cacheSlot = (UINT16) index; if (context && context->EvictCacheEntry) { context->EvictCacheEntry(context, &pdu); } gfx->CacheSlots[index] = NULL; } } free(context); free(gfx); return 0; }
void xf_rail_invalidate_region(xfContext* xfc, REGION16* invalidRegion) { int index; int count; RECTANGLE_16 updateRect; RECTANGLE_16 windowRect; ULONG_PTR* pKeys = NULL; xfAppWindow* appWindow; const RECTANGLE_16* extents; REGION16 windowInvalidRegion; region16_init(&windowInvalidRegion); count = HashTable_GetKeys(xfc->railWindows, &pKeys); for (index = 0; index < count; index++) { appWindow = (xfAppWindow*) HashTable_GetItemValue(xfc->railWindows, (void*) pKeys[index]); if (appWindow) { windowRect.left = MAX(appWindow->x, 0); windowRect.top = MAX(appWindow->y, 0); windowRect.right = MAX(appWindow->x + appWindow->width, 0); windowRect.bottom = MAX(appWindow->y + appWindow->height, 0); region16_clear(&windowInvalidRegion); region16_intersect_rect(&windowInvalidRegion, invalidRegion, &windowRect); if (!region16_is_empty(&windowInvalidRegion)) { extents = region16_extents(&windowInvalidRegion); updateRect.left = extents->left - appWindow->x; updateRect.top = extents->top - appWindow->y; updateRect.right = extents->right - appWindow->x; updateRect.bottom = extents->bottom - appWindow->y; if (appWindow) { xf_UpdateWindowArea(xfc, appWindow, updateRect.left, updateRect.top, updateRect.right - updateRect.left, updateRect.bottom - updateRect.top); } } } } region16_uninit(&windowInvalidRegion); }
void freerdp_channels_free(rdpChannels* channels) { int index; int nkeys; ULONG_PTR* pKeys = NULL; CHANNEL_OPEN_DATA* pChannelOpenData; if (!channels) return; if (channels->queue) { MessageQueue_Free(channels->queue); channels->queue = NULL; } for (index = 0; index < channels->clientDataCount; index++) { pChannelOpenData = &channels->openDataList[index]; if (pChannelOpenData->pInterface) { free(pChannelOpenData->pInterface); pChannelOpenData->pInterface = NULL; } HashTable_Remove(g_OpenHandles, (void*) (UINT_PTR)pChannelOpenData->OpenHandle); } if (g_OpenHandles) { nkeys = HashTable_GetKeys(g_OpenHandles, &pKeys); if (nkeys == 0) { HashTable_Free(g_OpenHandles); DeleteCriticalSection(&g_channels_lock); g_OpenHandles = NULL; } free(pKeys); } free(channels); }
void wf_rail_invalidate_region(wfContext* wfc, REGION16* invalidRegion) { int index; int count; RECT updateRect; RECTANGLE_16 windowRect; ULONG_PTR* pKeys = NULL; wfRailWindow* railWindow; const RECTANGLE_16* extents; REGION16 windowInvalidRegion; region16_init(&windowInvalidRegion); count = HashTable_GetKeys(wfc->railWindows, &pKeys); for (index = 0; index < count; index++) { railWindow = (wfRailWindow*) HashTable_GetItemValue(wfc->railWindows, (void*) pKeys[index]); if (railWindow) { windowRect.left = railWindow->x; windowRect.top = railWindow->y; windowRect.right = railWindow->x + railWindow->width; windowRect.bottom = railWindow->y + railWindow->height; region16_clear(&windowInvalidRegion); region16_intersect_rect(&windowInvalidRegion, invalidRegion, &windowRect); if (!region16_is_empty(&windowInvalidRegion)) { extents = region16_extents(&windowInvalidRegion); updateRect.left = extents->left - railWindow->x; updateRect.top = extents->top - railWindow->y; updateRect.right = extents->right - railWindow->x; updateRect.bottom = extents->bottom - railWindow->y; InvalidateRect(railWindow->hWnd, &updateRect, FALSE); } } } region16_uninit(&windowInvalidRegion); }
xfAppWindow* xf_AppWindowFromX11Window(xfContext* xfc, Window wnd) { int index; int count; ULONG_PTR* pKeys = NULL; xfAppWindow* appWindow; count = HashTable_GetKeys(xfc->railWindows, &pKeys); for (index = 0; index < count; index++) { appWindow = (xfAppWindow*) HashTable_GetItemValue(xfc->railWindows, (void*) pKeys[index]); if (appWindow->handle == wnd) { free(pKeys); return appWindow; } } free(pKeys); return NULL; }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ static UINT rdpgfx_plugin_terminated(IWTSPlugin* pPlugin) { int count; int index; ULONG_PTR* pKeys = NULL; RDPGFX_PLUGIN* gfx = (RDPGFX_PLUGIN*) pPlugin; RdpgfxClientContext* context = (RdpgfxClientContext*) gfx->iface.pInterface; UINT error = CHANNEL_RC_OK; WLog_Print(gfx->log, WLOG_DEBUG, "Terminated"); if (gfx->listener_callback) { free(gfx->listener_callback); gfx->listener_callback = NULL; } if (gfx->zgfx) { zgfx_context_free(gfx->zgfx); gfx->zgfx = NULL; } count = HashTable_GetKeys(gfx->SurfaceTable, &pKeys); for (index = 0; index < count; index++) { RDPGFX_DELETE_SURFACE_PDU pdu; pdu.surfaceId = ((UINT16) pKeys[index]) - 1; if (context) { IFCALLRET(context->DeleteSurface, error, context, &pdu); if (error) { WLog_Print(gfx->log, WLOG_ERROR, "context->DeleteSurface failed with error %"PRIu32"", error); free(pKeys); free(context); free(gfx); return error; } } } free(pKeys); HashTable_Free(gfx->SurfaceTable); for (index = 0; index < gfx->MaxCacheSlot; index++) { if (gfx->CacheSlots[index]) { RDPGFX_EVICT_CACHE_ENTRY_PDU pdu; pdu.cacheSlot = (UINT16) index; if (context) { IFCALLRET(context->EvictCacheEntry, error, context, &pdu); if (error) { WLog_Print(gfx->log, WLOG_ERROR, "context->EvictCacheEntry failed with error %"PRIu32"", error); free(context); free(gfx); return error; } } gfx->CacheSlots[index] = NULL; } } free(context); free(gfx); return CHANNEL_RC_OK; }