#include "isapi.h"
#pragma hdrstop


static
DWORD
BufferSize(
    PFAX_PORT_INFOW PortInfo,
    DWORD PortCount
    )
{
    DWORD i;
    DWORD Size = 0;

    for (i=0; i<PortCount; i++) {
        Size += sizeof(FAX_PORT_INFOW);
        Size += StringSize( PortInfo[i].DeviceName );
        Size += StringSize( PortInfo[i].Tsid );
        Size += StringSize( PortInfo[i].Csid );
    }

    return Size;
}


BOOL
IsapiFaxEnumPorts(
    LPEXTENSION_CONTROL_BLOCK Ecb
    )
{
    LPBYTE Data = (LPBYTE)(((LPBYTE)Ecb->lpbData)+sizeof(DWORD));
    HANDLE FaxHandle;
    PFAX_PORT_INFOW PortInfo = NULL;
    DWORD PortsReturned = 0;


    FaxHandle = (HANDLE) *((LPDWORD)Data);

    if (!FaxEnumPortsW( FaxHandle, (LPBYTE*)&PortInfo, &PortsReturned )) {
        SendError( Ecb, GetLastError() );
        return FALSE;
    }

    DWORD Size = BufferSize( PortInfo, PortsReturned );

    for (DWORD i=0; i<PortsReturned; i++) {
        FixupStringOut( PortInfo[i].DeviceName, PortInfo );
        FixupStringOut( PortInfo[i].Tsid, PortInfo );
        FixupStringOut( PortInfo[i].Csid, PortInfo );
    }

    SendResponseWithData( Ecb, (LPBYTE) &PortsReturned, sizeof(DWORD) );
    SendResponseWithData( Ecb, (LPBYTE) PortInfo, Size );

    FaxFreeBuffer( PortInfo );

    return TRUE;
}


BOOL
IsapiFaxGetPort(
    LPEXTENSION_CONTROL_BLOCK Ecb
    )
{
    PIFAX_GENERAL iFaxGeneral = (PIFAX_GENERAL) Ecb->lpbData;

    PFAX_PORT_INFOW PortInfo = NULL;

    if (!FaxGetPortW( iFaxGeneral->FaxHandle, (LPBYTE*)&PortInfo )) {
        SendError( Ecb, GetLastError() );
        return FALSE;
    }

    DWORD Size = BufferSize( PortInfo, 1 );

    FixupStringOut( PortInfo->DeviceName, PortInfo );
    FixupStringOut( PortInfo->Tsid, PortInfo );
    FixupStringOut( PortInfo->Csid, PortInfo );

    SendResponseWithData( Ecb, (LPBYTE) PortInfo, Size );

    FaxFreeBuffer( PortInfo );

    return TRUE;
}


BOOL
IsapiFaxSetPort(
    LPEXTENSION_CONTROL_BLOCK Ecb
    )
{
    PIFAX_SET_PORT iFaxSetPort = (PIFAX_SET_PORT) Ecb->lpbData;

    FixupStringIn( iFaxSetPort->PortInfo.DeviceName, &iFaxSetPort->PortInfo );
    FixupStringIn( iFaxSetPort->PortInfo.Tsid, &iFaxSetPort->PortInfo );
    FixupStringIn( iFaxSetPort->PortInfo.Csid, &iFaxSetPort->PortInfo );

    if (!FaxSetPortW( iFaxSetPort->FaxPortHandle, (LPBYTE)&iFaxSetPort->PortInfo )) {
        SendError( Ecb, GetLastError() );
        return FALSE;
    }

    return TRUE;
}


BOOL
IsapiFaxOpenPort(
    LPEXTENSION_CONTROL_BLOCK Ecb
    )
{
    PIFAX_OPEN_PORT iFaxOpenPort = (PIFAX_OPEN_PORT) Ecb->lpbData;

    HANDLE FaxPortHandle = NULL;

    if (!FaxOpenPort(
        iFaxOpenPort->FaxHandle,
        iFaxOpenPort->DeviceId,
        iFaxOpenPort->Flags,
        &FaxPortHandle ))
    {
        SendError( Ecb, GetLastError() );
        return FALSE;
    }

    SendResponseWithData( Ecb, (LPBYTE) &FaxPortHandle, sizeof(DWORD) );

    return TRUE;
}


DWORD
DeviceStatusSize(
    PFAX_DEVICE_STATUSW DeviceStatus
    )
{
    DWORD Size = sizeof(FAX_DEVICE_STATUSW);

    Size += StringSize( DeviceStatus->CallerId );
    Size += StringSize( DeviceStatus->Csid );
    Size += StringSize( DeviceStatus->DeviceName );
    Size += StringSize( DeviceStatus->DocumentName );
    Size += StringSize( DeviceStatus->PhoneNumber );
    Size += StringSize( DeviceStatus->RoutingString );
    Size += StringSize( DeviceStatus->SenderName );
    Size += StringSize( DeviceStatus->RecipientName );
    Size += StringSize( DeviceStatus->StatusString );
    Size += StringSize( DeviceStatus->Tsid );

    return Size;
}


BOOL
IsapiFaxGetDeviceStatus(
    LPEXTENSION_CONTROL_BLOCK Ecb
    )
{
    PIFAX_GENERAL iFaxGeneral = (PIFAX_GENERAL) Ecb->lpbData;

    PFAX_DEVICE_STATUSW DeviceStatus = NULL;

    if (!FaxGetDeviceStatusW( iFaxGeneral->FaxHandle, (LPBYTE*) &DeviceStatus )) {
        SendError( Ecb, GetLastError() );
        return FALSE;
    }

    DWORD Size = DeviceStatusSize( DeviceStatus );

    FixupStringOut( DeviceStatus->CallerId, DeviceStatus );
    FixupStringOut( DeviceStatus->Csid, DeviceStatus );
    FixupStringOut( DeviceStatus->DeviceName, DeviceStatus );
    FixupStringOut( DeviceStatus->DocumentName, DeviceStatus );
    FixupStringOut( DeviceStatus->PhoneNumber, DeviceStatus );
    FixupStringOut( DeviceStatus->RoutingString, DeviceStatus );
    FixupStringOut( DeviceStatus->SenderName, DeviceStatus );
    FixupStringOut( DeviceStatus->RecipientName, DeviceStatus );
    FixupStringOut( DeviceStatus->StatusString, DeviceStatus );
    FixupStringOut( DeviceStatus->Tsid, DeviceStatus );

    SendResponseWithData( Ecb, (LPBYTE) DeviceStatus, Size );

    FaxFreeBuffer( DeviceStatus );

    return TRUE;
}