/*++

Copyright (c) 1996  Microsoft Corporation

Module Name:

    print.c

Abstract:

    This module contains utilitarian functions.

Author:

    Wesley Witt (wesw) 29-Nov-1996


Revision History:

--*/

#include "faxapi.h"
#pragma hdrstop


BOOL
ConvertUnicodeMultiSZInPlace(
    LPCWSTR UnicodeString,
    DWORD ByteCount
    )
{
    LPWSTR StrW;
    LPWSTR From;
    LPSTR To;
    LPSTR StrA;

    StrW = MemAlloc( ByteCount );
    if (StrW == NULL) {
        return FALSE;
    }

    CopyMemory( StrW, UnicodeString, ByteCount );

    From = StrW;
    To = (LPSTR) UnicodeString;

    while (From && *From) {

        StrA = UnicodeStringToAnsiString( From );

        if (StrA == NULL) {
            MemFree( StrW );
            return FALSE;
        }

        strcpy( To, StrA );

        To += strlen( To ) + 1;

        From += wcslen( From ) + 1;

        MemFree( StrA );
    }

    MemFree( StrW );

    return TRUE;
}

VOID
ConvertUnicodeStringInPlace(
    LPCWSTR UnicodeString
    )
{
    LPSTR AnsiString = UnicodeStringToAnsiString( UnicodeString );
    if (AnsiString) {
        strcpy( (LPSTR)UnicodeString, AnsiString );
        MemFree( AnsiString );
    }
}


VOID
ConvertAnsiiStringInPlace(
    LPCSTR AnsiiString
    )
{
    LPWSTR UnicodeString = AnsiStringToUnicodeString( AnsiiString );
    if (UnicodeString) {
        wcscpy( (LPWSTR)AnsiiString, UnicodeString );
        MemFree( UnicodeString );
    }
}


VOID
StoreString(
    LPCWSTR String,
    PULONG_PTR DestString,
    LPBYTE Buffer,
    PULONG_PTR Offset
    )
{
    wcscpy( (LPWSTR) (Buffer+*Offset), String );
    *DestString = *Offset;
    *Offset += StringSize( String );
}


VOID
StoreStringA(
    LPCSTR String,
    PULONG_PTR DestString,
    LPBYTE Buffer,
    PULONG_PTR Offset
    )
{
    strcpy( (LPSTR) (Buffer+*Offset), String );
    ConvertAnsiiStringInPlace( (LPSTR) (Buffer+*Offset) );
    *DestString = *Offset;
    *Offset += StringSize( (LPWSTR) String );
}


BOOL
WINAPI
FaxCompleteJobParamsA(
    IN OUT PFAX_JOB_PARAMA *JobParamsBuffer,
    IN OUT PFAX_COVERPAGE_INFOA *CoverpageInfoBuffer
    )

{
   PFAX_JOB_PARAMA JobParams;
   PFAX_COVERPAGE_INFOA CoverpageInfo;

   if (!JobParamsBuffer || !CoverpageInfoBuffer) {
        SetLastError(ERROR_INVALID_PARAMETER);
        return FALSE;
   }

   *JobParamsBuffer = NULL;
   *CoverpageInfoBuffer = NULL;

    if (! FaxCompleteJobParamsW((PFAX_JOB_PARAMW *)JobParamsBuffer,(PFAX_COVERPAGE_INFOW *)CoverpageInfoBuffer) ) {
        return FALSE;
    }

   JobParams = *JobParamsBuffer;
   CoverpageInfo  = *CoverpageInfoBuffer;

    if (JobParams->Tsid)
        ConvertUnicodeStringInPlace( (LPWSTR) JobParams->Tsid);
    if (JobParams->SenderName)
        ConvertUnicodeStringInPlace( (LPWSTR) JobParams->SenderName);
    if (JobParams->SenderCompany)
        ConvertUnicodeStringInPlace( (LPWSTR) JobParams->SenderCompany);
    if (JobParams->SenderDept)
        ConvertUnicodeStringInPlace( (LPWSTR) JobParams->SenderDept);
    if (JobParams->BillingCode)
        ConvertUnicodeStringInPlace( (LPWSTR) JobParams->BillingCode);
    if (JobParams->DeliveryReportAddress)
        ConvertUnicodeStringInPlace( (LPWSTR) JobParams->DeliveryReportAddress);


    if (CoverpageInfo->SdrName)
        ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrName);
    if (CoverpageInfo->SdrFaxNumber)
        ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrFaxNumber);
    if (CoverpageInfo->SdrCompany)
        ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrCompany);
    if (CoverpageInfo->SdrAddress)
        ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrAddress);
    if (CoverpageInfo->SdrTitle)
        ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrTitle);
    if (CoverpageInfo->SdrDepartment)
        ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrDepartment);
    if (CoverpageInfo->SdrOfficeLocation)
        ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrOfficeLocation);
    if (CoverpageInfo->SdrHomePhone)
        ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrHomePhone);
    if (CoverpageInfo->SdrOfficePhone)
        ConvertUnicodeStringInPlace( (LPWSTR) CoverpageInfo->SdrOfficePhone);

    return TRUE;
}

BOOL
WINAPI
FaxCompleteJobParamsW(
    IN OUT PFAX_JOB_PARAMW *JobParamsBuffer,
    IN OUT PFAX_COVERPAGE_INFOW *CoverpageInfoBuffer
    )

{


#define RegStrLen(pValueName,lpdwNeeded) \
        RegQueryValueEx(hKey,pValueName,NULL,NULL,NULL,lpdwNeeded)        


#define RegStrCpy(pValueName, szPointer, Offset) \
        dwNeeded = 256*sizeof(WCHAR); \
        rslt = RegQueryValueEx(hKey,pValueName,NULL,NULL,(LPBYTE)TempBuffer,&dwNeeded);\
        if (rslt == ERROR_SUCCESS) { \
         szPointer = Offset; \
         lstrcpy(Offset,TempBuffer); \
         Offset = Offset + lstrlen(Offset) +1; \
        } 

    PFAX_JOB_PARAM JobParams = NULL;
    PFAX_COVERPAGE_INFO CoverpageInfo = NULL;
    HKEY hKey;
    BOOL fSuccess=FALSE;
    long rslt = ERROR_SUCCESS;
    DWORD dwJobNeeded = sizeof (FAX_JOB_PARAMW);
    DWORD dwCoverNeeded = sizeof (FAX_COVERPAGE_INFOW);
    DWORD dwNeeded = 0;
    WCHAR *CPOffset = NULL, *JobOffset = NULL;
    WCHAR TempBuffer[256];
    
    if (!JobParamsBuffer || !CoverpageInfoBuffer) {
        SetLastError(ERROR_INVALID_PARAMETER);
        return FALSE;
    }
    *JobParamsBuffer = NULL;
    *CoverpageInfoBuffer = NULL;

    //
    // open the key holding our data
    //
    rslt = RegOpenKeyEx(HKEY_CURRENT_USER,REGKEY_FAX_USERINFO,0,KEY_READ,&hKey);

    if (rslt != ERROR_SUCCESS) {
       return FALSE;
    }

    //
    // find out how much space we need
    //
    
    RegStrLen(REGVAL_FULLNAME,&dwNeeded);
    dwCoverNeeded += dwNeeded+1;
    dwJobNeeded +=dwNeeded+1;

    RegStrLen(REGVAL_COMPANY,&dwNeeded);
    dwCoverNeeded += dwNeeded+1;
    dwJobNeeded +=dwNeeded+1;

    RegStrLen(REGVAL_DEPT,&dwNeeded);
    dwCoverNeeded += dwNeeded+1;
    dwJobNeeded +=dwNeeded+1;

    RegStrLen(REGVAL_FAX_NUMBER,&dwNeeded);
    dwCoverNeeded += dwNeeded+1;
    dwJobNeeded +=dwNeeded+1;

    RegStrLen(REGVAL_ADDRESS,&dwNeeded);
    dwCoverNeeded += dwNeeded+1;
    
    RegStrLen(REGVAL_TITLE,&dwNeeded);
    dwCoverNeeded += dwNeeded+1;
    
    RegStrLen(REGVAL_OFFICE,&dwNeeded);
    dwCoverNeeded += dwNeeded+1;

    RegStrLen(REGVAL_HOME_PHONE,&dwNeeded);
    dwCoverNeeded += dwNeeded+1;
    
    RegStrLen(REGVAL_OFFICE_PHONE,&dwNeeded);
    dwCoverNeeded += dwNeeded+1;
    
    RegStrLen(REGVAL_BILLING_CODE,&dwNeeded);
    dwJobNeeded +=dwNeeded+1;

    RegStrLen(REGVAL_MAILBOX,&dwNeeded);
    // one for email address, one for DR address
    dwJobNeeded +=dwNeeded+1;
    dwJobNeeded +=dwNeeded+1;
    
    //
    // alloc the space
    //
    JobParams = MemAlloc(dwJobNeeded*sizeof(WCHAR));
    CoverpageInfo = MemAlloc(dwCoverNeeded*sizeof(WCHAR));

    if (!JobParams || !CoverpageInfo ) {
       RegCloseKey(hKey);

       if (JobParams) {
           MemFree( JobParams );
       }

       if (CoverpageInfo) {
           MemFree( CoverpageInfo );
       }

       SetLastError (ERROR_NOT_ENOUGH_MEMORY);
       return FALSE;
    }

    //
    // fill in the data
    //

    ZeroMemory(JobParams,sizeof(FAX_JOB_PARAMW) );
    JobParams->SizeOfStruct = sizeof(FAX_JOB_PARAMW);
    JobParams->ScheduleAction = JSA_NOW;
    JobParams->DeliveryReportType = DRT_NONE;

    ZeroMemory(CoverpageInfo,sizeof(FAX_COVERPAGE_INFOW));
    CoverpageInfo->SizeOfStruct = sizeof(FAX_COVERPAGE_INFOW);    

    CPOffset = (WCHAR *) (  (LPBYTE) CoverpageInfo + sizeof(FAX_COVERPAGE_INFOW));
    JobOffset = (WCHAR *)(  (LPBYTE) JobParams + sizeof(FAX_JOB_PARAMW));              

    RegStrCpy(REGVAL_FULLNAME,CoverpageInfo->SdrName,CPOffset);                                                    
    RegStrCpy(REGVAL_FULLNAME,JobParams->SenderName,JobOffset);                                                   

    RegStrCpy(REGVAL_COMPANY,CoverpageInfo->SdrCompany,CPOffset);                                                    
    RegStrCpy(REGVAL_COMPANY,JobParams->SenderCompany,JobOffset);                                                   

    RegStrCpy(REGVAL_DEPT,CoverpageInfo->SdrDepartment,CPOffset);                                                    
    RegStrCpy(REGVAL_DEPT,JobParams->SenderDept,JobOffset);                                                   
    
    RegStrCpy(REGVAL_FAX_NUMBER,CoverpageInfo->SdrFaxNumber,CPOffset);                                                    
    RegStrCpy(REGVAL_FAX_NUMBER,JobParams->Tsid,JobOffset);                                                   

    RegStrCpy(REGVAL_ADDRESS,CoverpageInfo->SdrAddress,CPOffset);                                                    
    RegStrCpy(REGVAL_TITLE,CoverpageInfo->SdrTitle,CPOffset);
    RegStrCpy(REGVAL_OFFICE,CoverpageInfo->SdrOfficeLocation,CPOffset);
    RegStrCpy(REGVAL_HOME_PHONE,CoverpageInfo->SdrHomePhone,CPOffset);
    RegStrCpy(REGVAL_OFFICE_PHONE,CoverpageInfo->SdrOfficePhone,CPOffset);
    
    RegStrCpy(REGVAL_BILLING_CODE,JobParams->BillingCode,CPOffset);
    RegStrCpy(REGVAL_MAILBOX,JobParams->DeliveryReportAddress,CPOffset);

    *JobParamsBuffer = (PFAX_JOB_PARAM)JobParams;
    *CoverpageInfoBuffer = (PFAX_COVERPAGE_INFO) CoverpageInfo;
    fSuccess = TRUE;

    RegCloseKey(hKey);
    return fSuccess;
}

BOOL
IsLocalFaxConnection( 
    HANDLE FaxHandle
    ) 
{
    WCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1];
    DWORD Size = MAX_COMPUTERNAME_LENGTH + 1;
    PWSTR lpMachineName;

    if (!FaxHandle) {
        SetLastError( ERROR_INVALID_HANDLE );
        return FALSE;
    }

    if (FH_DATA(FaxHandle)->MachineName == NULL) {
        return TRUE;
    }

    lpMachineName = FH_DATA(FaxHandle)->MachineName;

    if (wcscmp( lpMachineName, L"." ) == 0) {
        return TRUE;
    }

    if (GetComputerName( ComputerName, &Size )) {
        if (_wcsicmp( lpMachineName, ComputerName ) == 0) {
            return TRUE;
        }
    
        if (lpMachineName[0] == '\\' &&
            lpMachineName[1] == '\\' &&
            _wcsicmp( &lpMachineName[2], ComputerName ) == 0
            ) {
            return TRUE;
        }
    }
    
    return FALSE;

}