/*++ 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; }