#include "faxrtp.h"
#pragma hdrstop

LPVOID              InboundProfileInfo;




BOOL
InitializeEmailRouting(
    VOID
    )
{
    PLIST_ENTRY Next;
    PROUTING_TABLE RoutingEntry;


    //
    // initialize the profiles
    //

    EnterCriticalSection( &CsRouting );

    if (InboundProfileName && InboundProfileName[0]) {
        InboundProfileInfo = AddNewMapiProfile( InboundProfileName, TRUE, TRUE );
        if (!InboundProfileInfo) {
            DebugPrint(( TEXT("Could not initialize inbound mapi profile [%s]"), InboundProfileName ));
        }
    }

    Next = RoutingListHead.Flink;
    if (Next) {
        while ((ULONG)Next != (ULONG)&RoutingListHead) {
            RoutingEntry = CONTAINING_RECORD( Next, ROUTING_TABLE, ListEntry );
            Next = RoutingEntry->ListEntry.Flink;
            if (RoutingEntry->Mask & LR_INBOX && RoutingEntry->ProfileName && RoutingEntry->ProfileName[0]) {
                RoutingEntry->ProfileInfo = AddNewMapiProfile( RoutingEntry->ProfileName, FALSE, TRUE );
            }
        }
    }

    LeaveCriticalSection( &CsRouting );

    return TRUE;
}


BOOL
TiffMailDefault(
    PFAX_ROUTE FaxRoute,
    PROUTING_TABLE RoutingEntry
    )

/*++

Routine Description:

    Mails a TIFF file to the inbox in the specified profile.

Arguments:

    TiffFileName            - Name of TIFF file to mail
    ProfileName             - Profile name to use
    ResultCode              - The result of the failed API call

Return Value:

    TRUE for success, FALSE on error

--*/

{
    LPTSTR          BodyStr = NULL;
    BOOL            Failed = FALSE;
    DWORD           MsgCount;
    LPDWORD         MsgPtr[6];
    TCHAR           MsgStr[2048];
    TCHAR           PageCountStr[64];
    LPTSTR          SenderStr = NULL;
    LPTSTR          SubjectStr = NULL;
    LPTSTR          RecipStr = NULL;
    TCHAR           TimeStr[128];
    ULONG           ResultCode;


    if (!RoutingEntry->ProfileInfo) {
        ResultCode = ERROR_NO_SUCH_LOGON_SESSION;
        return FALSE;
    }

    ResultCode = ERROR_SUCCESS;

    FormatElapsedTimeStr(
        (FILETIME*)&FaxRoute->ElapsedTime,
        TimeStr,
        sizeof(TimeStr)
        );

    _ltot( (LONG) FaxRoute->PageCount, PageCountStr, 10 );

    MsgPtr[0] = (LPDWORD) FaxRoute->Csid;
    MsgPtr[1] = (LPDWORD) FaxRoute->CallerId;

    if (!FaxRoute->RoutingInfo || !FaxRoute->RoutingInfo[0]) {
        RecipStr = FaxRoute->Csid ? FaxRoute->Csid : TEXT("");
    } else {
        RecipStr = FaxRoute->RoutingInfo;
    }

    MsgPtr[2] = (LPDWORD) RecipStr;
    MsgPtr[3] = (LPDWORD) PageCountStr;
    MsgPtr[4] = (LPDWORD) TimeStr;
    MsgPtr[5] = (LPDWORD) FaxRoute->DeviceName;

    MsgCount = FormatMessage(
        FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ARGUMENT_ARRAY,
        NULL,
        MSG_MAIL_MSG_BODY,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),
        MsgStr,
        sizeof(MsgStr),
        (va_list *) MsgPtr
        );

    BodyStr = StringDup( MsgStr );

    if (FaxRoute->Csid != NULL && FaxRoute->Csid[0] != 0) {
        SenderStr = StringDup( FaxRoute->Csid );
    } else {
        MsgCount = FormatMessage(
            FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ARGUMENT_ARRAY,
            NULL,
            MSG_WHO_AM_I,
            MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),
            MsgStr,
            sizeof(MsgStr),
            NULL
            );
        if (MsgCount != 0) {
            SenderStr = StringDup(MsgStr);
        }
    }

    MsgCount = FormatMessage(
        FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ARGUMENT_ARRAY,
        NULL,
        MSG_SUBJECT_LINE,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),
        MsgStr,
        sizeof(MsgStr),
        NULL
        );
    if (MsgCount != 0) {
        SubjectStr = StringDup( MsgStr );
    }

    Failed = StoreMapiMessage(
        RoutingEntry->ProfileInfo,
        SenderStr,
        SubjectStr,
        BodyStr,
        FaxRoute->FileName,
        NULL,
        IMPORTANCE_NORMAL,
        NULL,
        &ResultCode
        );

    MemFree( BodyStr );
    MemFree( SubjectStr );
    MemFree( SenderStr );

    return Failed;
}


BOOL
TiffRouteEMail(
    PFAX_ROUTE FaxRoute,
    PROUTING_TABLE RoutingEntry
    )

/*++

Routine Description:

    Mails a TIFF file to the inbox in the specified profile.

Arguments:

    TiffFileName            - Name of TIFF file to mail
    ProfileName             - Profile name to use
    ResultCode              - The result of the failed API call

Return Value:

    TRUE for success, FALSE on error

--*/

{
    LPWSTR          BodyStr = NULL;
    BOOL            Failed = FALSE;
    DWORD           MsgCount;
    LPDWORD         MsgPtr[6];
    WCHAR           MsgStr[2048];
    WCHAR           PageCountStr[64];
    LPWSTR          SenderStr = NULL;
    LPWSTR          SubjectStr = NULL;
    WCHAR           TimeStr[128];
    LPWSTR          RecipientName = NULL;
    LPWSTR          ProxyAddress = NULL;
    ULONG           ResultCode;


    if (!InboundProfileInfo) {
        ResultCode = ERROR_NO_SUCH_LOGON_SESSION;
        return FALSE;
    }

    if (FaxRoute->RoutingInfo && FaxRoute->RoutingInfo[0]) {
        RecipientName = FaxRoute->RoutingInfo;
    } else if (FaxRoute->Csid && FaxRoute->Csid[0]) {
        RecipientName = FaxRoute->Csid;
    }

    if (!RecipientName) {
        return FALSE;
    }

    ProxyAddress = (LPTSTR) MemAlloc( StringSize( RecipientName ) + 32 );
    if (!ProxyAddress) {
        return FALSE;
    }

    _stprintf( ProxyAddress, TEXT("FAX:FAX[%s]"), RecipientName );

    ResultCode = ERROR_SUCCESS;

    FormatElapsedTimeStr(
        (FILETIME*)&FaxRoute->ElapsedTime,
        TimeStr,
        sizeof(TimeStr)
        );

    _ltot( (LONG) FaxRoute->PageCount, PageCountStr, 10 );

    MsgPtr[0] = (LPDWORD) FaxRoute->Csid;
    MsgPtr[1] = (LPDWORD) FaxRoute->CallerId;
    MsgPtr[2] = (LPDWORD) (FaxRoute->RoutingInfo ? FaxRoute->RoutingInfo : TEXT(""));
    MsgPtr[3] = (LPDWORD) PageCountStr;
    MsgPtr[4] = (LPDWORD) TimeStr;
    MsgPtr[5] = (LPDWORD) FaxRoute->DeviceName;

    MsgCount = FormatMessage(
        FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ARGUMENT_ARRAY,
        NULL,
        MSG_MAIL_MSG_BODY,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),
        MsgStr,
        sizeof(MsgStr),
        (va_list *) MsgPtr
        );

    BodyStr = StringDup( MsgStr );

    if (FaxRoute->Csid != NULL && FaxRoute->Csid[0] != 0) {
        SenderStr = StringDup( FaxRoute->Csid );
    } else {
        MsgCount = FormatMessage(
            FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ARGUMENT_ARRAY,
            NULL,
            MSG_WHO_AM_I,
            MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),
            MsgStr,
            sizeof(MsgStr),
            NULL
            );
        if (MsgCount != 0) {
            SenderStr = StringDup(MsgStr);
        }
    }

    MsgCount = FormatMessage(
        FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ARGUMENT_ARRAY,
        NULL,
        MSG_SUBJECT_LINE,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),
        MsgStr,
        sizeof(MsgStr),
        NULL
        );
    if (MsgCount != 0) {
        SubjectStr = StringDup( MsgStr );
    }

    Failed = MailMapiMessage(
        InboundProfileInfo,
        ProxyAddress,
        SubjectStr,
        BodyStr,
        FaxRoute->FileName,
        NULL,
        IMPORTANCE_NORMAL,
        &ResultCode
        );

    MemFree( BodyStr );
    MemFree( SubjectStr );
    MemFree( SenderStr );
    MemFree( ProxyAddress );

    return Failed;
}