// // apihandl.c // // This file contains functions used for handle allocation // and handle state control (the Pause state) on the // TCLIENT2 connection handle. // // Copyright (C) 2001 Microsoft Corporation // // Author: a-devjen (Devin Jenson) // #include "apihandl.h" #include "connlist.h" // T2CreateHandle // // Create an internal handle, it does this simply by allocating // the memory, having it zero'd, and adding it to the linked list. // It also creates the "Pause" event for the handle, so it can // be used for pausing the handle. // // Returns a pointer to the new handle if successful. Otherwise, // NULL is returned. TSAPIHANDLE *T2CreateHandle(void) { // Allocate TSAPIHANDLE *Handle = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof (TSAPIHANDLE)); if (Handle == NULL) return NULL; // Initialize the pause event Handle->PauseEvent = CreateEvent(NULL, TRUE, TRUE, NULL); // Add it to the linked list if (T2ConnList_AddHandle((HANDLE)Handle, 0, 0) == FALSE) { HeapFree(GetProcessHeap(), 0, Handle); return NULL; } return Handle; } // T2DestroyHandle // // It does this by first removing it from the global linked list. // Then it Closes the "Pause" event, and frees the memory object. // Finally, if a timer was associated with it for idle-callback, // it is halted. // // No return value. void T2DestroyHandle(HANDLE Connection) { UINT_PTR TimerId = 0; // Remove from the linked list T2ConnList_GetData(Connection, &TimerId, NULL); T2ConnList_RemoveHandle(Connection); // Enter the exception clause, we are again in a freaky place. __try { // Kill the pause event CloseHandle(((TSAPIHANDLE *)Connection)->PauseEvent); // Deallocate HeapFree(GetProcessHeap(), 0, Connection); if (TimerId != -1 && TimerId != 0) KillTimer(NULL, TimerId); } __except(EXCEPTION_EXECUTE_HANDLER) { // No failure indication, if we got here the handle is hosed or // non-existant anyway. _ASSERT(FALSE); return; } } // T2WaitForPauseInput // // This function only returns when the "Pause" event is in signaled mode. // Therefore, to pause a handle, set its handle to non-signaled. // // No return value. void T2WaitForPauseInput(HANDLE Connection) { // Use exception handling because the handle may be invalid __try { WaitForSingleObject(((TSAPIHANDLE *)Connection)->PauseEvent, INFINITE); } __except(EXCEPTION_EXECUTE_HANDLER) { _ASSERT(FALSE); return; } } // T2WaitForLatency // // This function simply waits for the handles latency before returning. // // No return value. void T2WaitForLatency(HANDLE Connection) { // Use exception handling because the handle may be invalid __try { Sleep(((TSAPIHANDLE *)Connection)->Latency); } __except(EXCEPTION_EXECUTE_HANDLER) { _ASSERT(FALSE); return; } }