/*++

Copyright (c) 1996  Microsoft Corporation

Module Name:

    handle.c

Abstract:

    This module contains the handle table mgmt routines.

Author:

    Wesley Witt (wesw) 12-Nov-1996


Revision History:

--*/

#include "faxapi.h"
#pragma hdrstop




PHANDLE_ENTRY
CreateNewHandle(
    PFAX_HANDLE_DATA    FaxData,
    DWORD               Type,
    DWORD               Flags,
    HANDLE              FaxPortHandle
    )
{
    PHANDLE_ENTRY HandleEntry;


    HandleEntry = (PHANDLE_ENTRY) MemAlloc( sizeof(HANDLE_ENTRY) );
    if (!HandleEntry) {
        return NULL;
    }

    EnterCriticalSection( &FaxData->CsHandleTable );

    InsertTailList( &FaxData->HandleTableListHead, &HandleEntry->ListEntry );

    HandleEntry->Type           = Type;
    HandleEntry->Flags          = Flags;
    HandleEntry->FaxData        = FaxData;
    HandleEntry->FaxPortHandle  = FaxPortHandle;
    HandleEntry->DeviceId       = 0;
    HandleEntry->FaxContextHandle = NULL;

    LeaveCriticalSection( &FaxData->CsHandleTable );

    return HandleEntry;
}


PHANDLE_ENTRY
CreateNewServiceHandle(
    PFAX_HANDLE_DATA    FaxData
    )
{
    return CreateNewHandle(
        FaxData,
        FHT_SERVICE,
        0,
        NULL
        );
}


PHANDLE_ENTRY
CreateNewPortHandle(
    PFAX_HANDLE_DATA    FaxData,
    DWORD               Flags,
    HANDLE              FaxPortHandle
    )
{
    return CreateNewHandle(
        FaxData,
        FHT_PORT,
        Flags,
        FaxPortHandle       
        );
}


VOID
CloseFaxHandle(
    PFAX_HANDLE_DATA    FaxData,
    PHANDLE_ENTRY       HandleEntry
    )
{
    EnterCriticalSection( &FaxData->CsHandleTable );
    RemoveEntryList( &HandleEntry->ListEntry );
    HandleEntry->Type = 0;
    //
    // zero out this memory so we can't use it anymore
    //
    ZeroMemory(HandleEntry,sizeof(HANDLE_ENTRY));
    MemFree( HandleEntry );
    LeaveCriticalSection( &FaxData->CsHandleTable );
}