windows-nt/Source/XPSP1/NT/printscan/fax/service/client/util.c
2020-09-26 16:20:57 +08:00

385 lines
10 KiB
C

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