Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

829 lines
27 KiB

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
config.cpp
Abstract:
This module contains routines for the fax config dialog.
Author:
Wesley Witt (wesw) 13-Aug-1996
Revision History:
20/10/99 -danl-
Fix ConfigDlgProc to view proper printer properties.
dd/mm/yy -author-
description
--*/
#include "faxxp.h"
#include "faxutil.h"
#include "faxreg.h"
#include "resource.h"
#include "debugex.h"
#pragma hdrstop
VOID
AddCoverPagesToList(
HWND hwndList,
LPTSTR pDirPath,
BOOL ServerCoverPage
)
/*++
Routine Description:
Add the cover page files in the specified directory to a listbox
Arguments:
hwndList - Handle to a list window
pDirPath - Directory to look for coverpage files
ServerCoverPage - TRUE if the dir contains server cover pages
Return Value:
NONE
--*/
{
WIN32_FIND_DATA findData;
TCHAR tszDirName[MAX_PATH] = {0};
TCHAR CpName[MAX_PATH] = {0};
HANDLE hFindFile = INVALID_HANDLE_VALUE;
TCHAR tszFileName[MAX_PATH] = {0};
TCHAR tszPathName[MAX_PATH] = {0};
TCHAR* pPathEnd;
LPTSTR pExtension;
INT listIndex;
INT dirLen;
INT fileLen;
BOOL bGotFile = FALSE;
DBG_ENTER(TEXT("AddCoverPagesToList"));
//
// Copy the directory path to a local buffer
//
if (pDirPath == NULL || pDirPath[0] == 0)
{
return;
}
if ((dirLen = _tcslen( pDirPath )) >= MAX_PATH - MAX_FILENAME_EXT - 1)
{
return;
}
_tcscpy( tszDirName, pDirPath );
TCHAR* pLast = NULL;
pLast = _tcsrchr(tszDirName,TEXT('\\'));
if( !( pLast && (*_tcsinc(pLast)) == '\0' ) )
{
// the last character is not a backslash, add one...
_tcscat(tszDirName, TEXT("\\"));
dirLen += sizeof(TCHAR);
}
_tcsncpy(tszPathName, tszDirName, ARR_SIZE(tszPathName)-1);
pPathEnd = _tcschr(tszPathName, '\0');
TCHAR file_to_find[MAX_PATH] = {0};
_tcscpy(file_to_find,tszDirName);
_tcscat(file_to_find, FAX_COVER_PAGE_MASK );
//
// Call FindFirstFile/FindNextFile to enumerate the files
// matching our specification
//
hFindFile = FindFirstFile( file_to_find, &findData );
if (hFindFile == INVALID_HANDLE_VALUE)
{
CALL_FAIL(GENERAL_ERR, TEXT("FindFirstFile"), ::GetLastError());
bGotFile = FALSE;
}
else
{
bGotFile = TRUE;
}
while (bGotFile)
{
_tcsncpy(pPathEnd, findData.cFileName, MAX_PATH - dirLen);
if(!IsValidCoverPage(tszPathName))
{
goto next;
}
//
// Exclude directories and hidden files
//
if (findData.dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_DIRECTORY))
{
continue;
}
//
// Make sure we have enough room to store the full pathname
//
if ((fileLen = _tcslen( findData.cFileName)) <= MAX_FILENAME_EXT )
{
continue;
}
if (fileLen + dirLen >= MAX_PATH)
{
continue;
}
//
// Add the cover page name to the list window,
// but don't display the filename extension
//
_tcscpy( CpName, findData.cFileName );
if (pExtension = _tcsrchr(CpName,TEXT('.')))
{
*pExtension = NULL;
}
if ( ! ServerCoverPage )
{
TCHAR szPersonal[30];
LoadString( g_hResource, IDS_PERSONAL, szPersonal, 30 );
_tcscat( CpName, TEXT(" "));
_tcscat( CpName, szPersonal );
}
listIndex = (INT)SendMessage(
hwndList,
LB_ADDSTRING,
0,
(LPARAM) CpName);
if (listIndex != LB_ERR)
{
SendMessage(hwndList,
LB_SETITEMDATA,
listIndex,
ServerCoverPage ? SERVER_COVER_PAGE : 0);
}
next:
bGotFile = FindNextFile(hFindFile, &findData);
if (! bGotFile)
{
VERBOSE(DBG_MSG, TEXT("FindNextFile"), ::GetLastError());
break;
}
}
if(INVALID_HANDLE_VALUE != hFindFile)
{
FindClose(hFindFile);
}
}
VOID
DrawSampleText(
HWND hDlg,
HDC hDC,
PFAXXP_CONFIG FaxConfig
)
{
int PointSize;
TCHAR PointSizeBuffer[16];
TCHAR FontTypeBuffer[32];
BOOL bItalic = FALSE;
BOOL bBold = FALSE;
DBG_ENTER(TEXT("DrawSampleText"));
PointSize = abs ( MulDiv((int) FaxConfig->FontStruct.lfHeight, 72, GetDeviceCaps( hDC, LOGPIXELSY)));
_stprintf( PointSizeBuffer, TEXT("%d"), PointSize );
SetWindowText( GetDlgItem( hDlg, IDC_FONT_SIZE ), PointSizeBuffer );
SetWindowText( GetDlgItem( hDlg, IDC_FONT_NAME), FaxConfig->FontStruct.lfFaceName );
//
// get the font type
//
ZeroMemory(FontTypeBuffer, sizeof(FontTypeBuffer) );
if (FaxConfig->FontStruct.lfItalic)
{
bItalic = TRUE;
}
if ( FaxConfig->FontStruct.lfWeight == FW_BOLD )
{
bBold = TRUE;
}
if (bBold)
{
LoadString(g_hResource, IDS_FONT_BOLD, FontTypeBuffer, sizeof(FontTypeBuffer) / sizeof(FontTypeBuffer[0]) );
// concat "italic"
if (bItalic)
{
LoadString(g_hResource,
IDS_FONT_ITALIC,
&FontTypeBuffer[lstrlen(FontTypeBuffer)],
sizeof(FontTypeBuffer) / sizeof(FontTypeBuffer[0]) - lstrlen(FontTypeBuffer) );
}
}
else if (bItalic)
{
LoadString(g_hResource, IDS_FONT_ITALIC, FontTypeBuffer, sizeof(FontTypeBuffer) / sizeof(FontTypeBuffer[0]) );
}
else
{
LoadString(g_hResource, IDS_FONT_REGULAR, FontTypeBuffer, sizeof(FontTypeBuffer) / sizeof(FontTypeBuffer[0]) );
}
SetWindowText( GetDlgItem( hDlg, IDC_FONT_STYLE), FontTypeBuffer );
}
void EnableCoverPageList(HWND hDlg)
{
DBG_ENTER(TEXT("EnableCoverPageList"));
if (IsDlgButtonChecked( hDlg, IDC_USE_COVERPAGE ) == BST_CHECKED)
{
EnableWindow( GetDlgItem( hDlg, IDC_COVERPAGE_LIST ), TRUE );
EnableWindow( GetDlgItem( hDlg, IDC_COVERPAGE_LIST_LABEL ), TRUE );
}
else
{
EnableWindow( GetDlgItem( hDlg, IDC_COVERPAGE_LIST ), FALSE );
EnableWindow( GetDlgItem( hDlg, IDC_COVERPAGE_LIST_LABEL ), FALSE );
}
}
INT_PTR CALLBACK
ConfigDlgProc(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam
)
/*++
Routine Description:
Dialog procedure for the fax mail transport configuration
Arguments:
hDlg - Window handle for this dialog
message - Message number
wParam - Parameter #1
lParam - Parameter #2
Return Value:
TRUE - Message was handled
FALSE - Message was NOT handled
--*/
{
static PFAXXP_CONFIG FaxConfig = NULL;
static HWND hwndListPrn = NULL;
static HWND hwndListCov = NULL;
PPRINTER_INFO_2 PrinterInfo = NULL;
DWORD CountPrinters = 0;
DWORD dwSelectedItem = 0;
DWORD dwNewSelectedItem = 0;
TCHAR Buffer[256] = {0};
TCHAR CpDir[MAX_PATH] = {0};
LPTSTR p = NULL;
PAINTSTRUCT ps;
HANDLE hFax = NULL;
DWORD dwError = 0;
DWORD dwMask = 0;
BOOL bShortCutCp = FALSE;
BOOL bGotFaxPrinter = FALSE;
BOOL bIsCpLink = FALSE;
DBG_ENTER(TEXT("ConfigDlgProc"));
switch( message )
{
case WM_INITDIALOG:
FaxConfig = (PFAXXP_CONFIG) lParam;
hwndListPrn = GetDlgItem( hDlg, IDC_PRINTER_LIST );
hwndListCov = GetDlgItem( hDlg, IDC_COVERPAGE_LIST );
//
// populate the printers combobox
//
PrinterInfo = (PPRINTER_INFO_2) MyEnumPrinters(NULL,
2,
&CountPrinters);
if (NULL != PrinterInfo)
{
DWORD j = 0;
for (DWORD i=0; i<CountPrinters; i++)
{
if ((NULL != PrinterInfo[i].pDriverName) &&
(_tcscmp( PrinterInfo[i].pDriverName, FAX_DRIVER_NAME ) == 0))
{
//
//if the current printer is a fax printer, add it to the CB list
//
bGotFaxPrinter = TRUE;
SendMessage( hwndListPrn, CB_ADDSTRING, 0, (LPARAM) PrinterInfo[i].pPrinterName );
if ((NULL != FaxConfig->PrinterName) &&
(NULL != PrinterInfo[i].pPrinterName) &&
(_tcscmp( PrinterInfo[i].pPrinterName, FaxConfig->PrinterName ) == 0))
{
//
//if it is also the default printer according to transport config.
//place the default selection on it
//
dwSelectedItem = j;
}
if(FaxConfig->PrinterName == NULL || _tcslen(FaxConfig->PrinterName) == 0)
{
//
// There is no default fax printer
// Choose the first one
//
MemFree(FaxConfig->PrinterName);
FaxConfig->PrinterName = StringDup(PrinterInfo[i].pPrinterName);
if(FaxConfig->PrinterName == NULL)
{
CALL_FAIL(MEM_ERR, TEXT("StringDup"), ERROR_NOT_ENOUGH_MEMORY);
ErrorMsgBox(g_hResource, IDS_OUT_OF_MEM);
EndDialog( hDlg, IDABORT);
return FALSE;
}
if(PrinterInfo[i].pServerName)
{
MemFree(FaxConfig->ServerName);
FaxConfig->ServerName = StringDup(PrinterInfo[i].pServerName);
if(FaxConfig->ServerName == NULL)
{
CALL_FAIL(MEM_ERR, TEXT("StringDup"), ERROR_NOT_ENOUGH_MEMORY);
ErrorMsgBox(g_hResource, IDS_OUT_OF_MEM);
EndDialog( hDlg, IDABORT);
return FALSE;
}
}
dwSelectedItem = j;
}
j += 1;
} // if fax printer
} // for
MemFree( PrinterInfo );
PrinterInfo = NULL;
SendMessage( hwndListPrn, CB_SETCURSEL, (WPARAM)dwSelectedItem, 0 );
}
if (! bGotFaxPrinter)
{
//
// there were no printers at all, or non of the printers is a fax printer.
//
CALL_FAIL(GENERAL_ERR, TEXT("MyEnumPrinters"), ::GetLastError());
ErrorMsgBox(g_hResource, IDS_NO_FAX_PRINTER);
EndDialog( hDlg, IDABORT);
break;
}
//
// Get the Server CP flag and receipts options
//
FaxConfig->ServerCpOnly = FALSE;
if (FaxConnectFaxServer(FaxConfig->ServerName,&hFax))
{
DWORD dwReceiptOptions;
BOOL bEnableReceiptsCheckboxes = FALSE;
if(!FaxGetPersonalCoverPagesOption(hFax, &FaxConfig->ServerCpOnly))
{
CALL_FAIL(GENERAL_ERR, TEXT("FaxGetPersonalCoverPagesOption"), ::GetLastError());
ErrorMsgBox(g_hResource, IDS_CANT_ACCESS_SERVER);
}
else
{
//
// Inverse logic
//
FaxConfig->ServerCpOnly = !FaxConfig->ServerCpOnly;
}
if (!FaxGetReceiptsOptions (hFax, &dwReceiptOptions))
{
CALL_FAIL(GENERAL_ERR, TEXT("FaxGetPersonalCoverPagesOption"), GetLastError());
}
else
{
if (DRT_EMAIL & dwReceiptOptions)
{
//
// Server supports receipts by email - enable the checkboxes
//
bEnableReceiptsCheckboxes = TRUE;
}
}
EnableWindow( GetDlgItem( hDlg, IDC_ATTACH_FAX), bEnableReceiptsCheckboxes);
EnableWindow( GetDlgItem( hDlg, IDC_SEND_SINGLE_RECEIPT), bEnableReceiptsCheckboxes);
FaxClose(hFax);
hFax = NULL;
}
else
{
CALL_FAIL(GENERAL_ERR, TEXT("FaxConnectFaxServer"), ::GetLastError());
ErrorMsgBox(g_hResource, IDS_CANT_ACCESS_SERVER);
}
//
//send single receipt for a fax sent to multiple recipients?
//
if(FaxConfig->SendSingleReceipt)
{
CheckDlgButton( hDlg, IDC_SEND_SINGLE_RECEIPT, BST_CHECKED );
}
//
// Attach fax document?
//
if (FaxConfig->bAttachFax)
{
CheckDlgButton( hDlg, IDC_ATTACH_FAX, BST_CHECKED );
}
//
//cover page CB & LB enabling
//
if (FaxConfig->UseCoverPage)
{
CheckDlgButton( hDlg, IDC_USE_COVERPAGE, BST_CHECKED );
}
EnableCoverPageList(hDlg);
//
// Emulate printer's selection change, in order to collect printer config info.
// including cover pages LB population
//
ConfigDlgProc(hDlg, WM_COMMAND,MAKEWPARAM(IDC_PRINTER_LIST,CBN_SELCHANGE),(LPARAM)0);
break;
case ( WM_PAINT ) :
if (BeginPaint( hDlg, &ps ))
{
DrawSampleText( hDlg, ps.hdc, FaxConfig );
EndPaint( hDlg, &ps );
}
break;
case WM_COMMAND:
if (HIWORD(wParam) == BN_CLICKED)
{
if (LOWORD(wParam) == IDC_USE_COVERPAGE)
{
EnableCoverPageList(hDlg);
return FALSE;
}
}
if (HIWORD(wParam) == CBN_SELCHANGE && LOWORD(wParam) == IDC_PRINTER_LIST)
{
//
// refresh cover pages list
//
TCHAR SelectedPrinter[MAX_PATH];
DWORD dwPrinterNameLength = 0;
//
// a new fax printer was selected - delete all old coverpages from the list
// because they might include the old fax server's cover pages
//
SendMessage(hwndListCov, LB_RESETCONTENT, 0, 0);
if (CB_ERR != (dwSelectedItem = (DWORD)SendMessage( hwndListPrn, CB_GETCURSEL, 0, 0 )))
//
// get the 0 based index of the currently pointed printer
//
{
if (CB_ERR != (dwPrinterNameLength = (DWORD)SendMessage( hwndListPrn, CB_GETLBTEXTLEN, dwSelectedItem, 0)))
{
if (dwPrinterNameLength < MAX_PATH)
{
if (CB_ERR != SendMessage( hwndListPrn, CB_GETLBTEXT, dwSelectedItem, (LPARAM) SelectedPrinter ))
//
// get that printer's name into SelectedPrinter
//
{
if (NULL != (PrinterInfo = (PPRINTER_INFO_2) MyGetPrinter( SelectedPrinter, 2 )))
{
LPTSTR lptszServerName = NULL;
if (GetServerNameFromPrinterInfo(PrinterInfo,&lptszServerName))
{
if (GetServerCpDir( lptszServerName, CpDir, sizeof(CpDir)/sizeof(CpDir[0]) ))
{
AddCoverPagesToList( hwndListCov, CpDir, TRUE );
}
if ((NULL == FaxConfig->ServerName) ||(NULL == lptszServerName) ||
(_tcscmp(FaxConfig->ServerName,lptszServerName) != 0))
{
//
// the server's name and config are not updated - refresh them
//
MemFree(FaxConfig->ServerName);
FaxConfig->ServerName = lptszServerName;
//
// get the new server's ServerCpOnly flag
//
FaxConfig->ServerCpOnly = FALSE;
if (FaxConnectFaxServer(FaxConfig->ServerName,&hFax) )
{
DWORD dwReceiptOptions;
BOOL bEnableReceiptsCheckboxes = FALSE;
if (!FaxGetPersonalCoverPagesOption(hFax,&FaxConfig->ServerCpOnly))
{
CALL_FAIL(GENERAL_ERR, TEXT("FaxGetPersonalCoverPagesOption"), GetLastError());
}
else
{
//
// inverse logic
//
FaxConfig->ServerCpOnly = !FaxConfig->ServerCpOnly;
}
if (!FaxGetReceiptsOptions (hFax, &dwReceiptOptions))
{
CALL_FAIL(GENERAL_ERR, TEXT("FaxGetPersonalCoverPagesOption"), GetLastError());
}
else
{
if (DRT_EMAIL & dwReceiptOptions)
{
//
// Server supports receipts by email - enable the checkboxes
//
bEnableReceiptsCheckboxes = TRUE;
}
}
EnableWindow( GetDlgItem( hDlg, IDC_ATTACH_FAX), bEnableReceiptsCheckboxes);
EnableWindow( GetDlgItem( hDlg, IDC_SEND_SINGLE_RECEIPT), bEnableReceiptsCheckboxes);
FaxClose(hFax);
hFax = NULL;
}
}
else
{
//
// The server's name hasn't changed, all details are OK
//
MemFree(lptszServerName);
lptszServerName = NULL;
}
}
else
//
// GetServerNameFromPrinterInfo failed
//
{
FaxConfig->ServerCpOnly = FALSE;
}
//
// don't add client coverpages if FaxConfig->ServerCpOnly is set to true
//
if (! FaxConfig->ServerCpOnly)
{
if(GetClientCpDir( CpDir, sizeof(CpDir) / sizeof(CpDir[0])))
{
//
// if the function failes- the ext. is installed on a machine
// that doesn't have a client on it,
// so we shouldn't look for personal cp
//
AddCoverPagesToList( hwndListCov, CpDir, FALSE );
}
}
MemFree( PrinterInfo );
PrinterInfo = NULL;
//
// check if we have any cp in the LB, if not- don't allow the user to
// ask for a cp with he's fax
//
DWORD dwItemCount = (DWORD)SendMessage(hwndListCov, LB_GETCOUNT, NULL, NULL);
if(LB_ERR == dwItemCount)
{
CALL_FAIL(GENERAL_ERR, TEXT("SendMessage (LB_GETCOUNT)"), ::GetLastError());
}
else
{
EnableWindow( GetDlgItem( hDlg, IDC_USE_COVERPAGE ), dwItemCount ? TRUE : FALSE );
}
if(FaxConfig->CoverPageName)
{
_tcscpy( Buffer, FaxConfig->CoverPageName );
}
if ( ! FaxConfig->ServerCoverPage )
{
TCHAR szPersonal[30] = _T("");
LoadString( g_hResource, IDS_PERSONAL, szPersonal, 30 );
_tcscat( Buffer, _T(" ") );
_tcscat( Buffer, szPersonal );
}
dwSelectedItem = (DWORD)SendMessage( hwndListCov, LB_FINDSTRING, -1, (LPARAM) Buffer );
//
// get the index of the default CP
// if it is supposed to be a link, and the cp that we found is not a link,
// find the next string that matches.
// this can happen if there's al ink to a cp named X, and a regular cp named X.
//
if (dwSelectedItem == LB_ERR)
{
dwSelectedItem = 0;
}
SendMessage( hwndListCov, LB_SETCURSEL, (WPARAM) dwSelectedItem, 0 );
//
// place the default selection on that CP
//
}
}
}
}
}
break;
}
switch (wParam)
{
case IDC_SET_FONT:
{
CHOOSEFONT cf;
LOGFONT FontStruct;
CopyMemory( &FontStruct, &FaxConfig->FontStruct, sizeof(LOGFONT) );
cf.lStructSize = sizeof(CHOOSEFONT);
cf.hwndOwner = hDlg;
cf.lpLogFont = &FontStruct;
cf.Flags = CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS;
cf.rgbColors = 0;
cf.lCustData = 0;
cf.lpfnHook = NULL;
cf.lpTemplateName = NULL;
cf.hInstance = NULL;
cf.lpszStyle = NULL;
cf.nFontType = SCREEN_FONTTYPE;
cf.nSizeMin = 0;
cf.nSizeMax = 0;
if (ChooseFont(&cf))
{
CopyMemory( &FaxConfig->FontStruct, &FontStruct, sizeof(LOGFONT) );
InvalidateRect(hDlg, NULL, TRUE);
UpdateWindow( hDlg );
}
}
break;
case IDOK :
//
// Update UseCoverPage
//
FaxConfig->UseCoverPage = (IsDlgButtonChecked( hDlg, IDC_USE_COVERPAGE ) == BST_CHECKED);
//
// Update SendSingleReceipt
//
FaxConfig->SendSingleReceipt = (IsDlgButtonChecked(hDlg, IDC_SEND_SINGLE_RECEIPT) == BST_CHECKED);
//
// Update AttachFax
//
FaxConfig->bAttachFax = (IsDlgButtonChecked(hDlg, IDC_ATTACH_FAX) == BST_CHECKED);
//
// Update selected printer
//
dwSelectedItem = (DWORD)SendMessage( hwndListPrn, CB_GETCURSEL, 0, 0 );
if (dwSelectedItem != CB_ERR)
{
if (CB_ERR != SendMessage( hwndListPrn, CB_GETLBTEXT, dwSelectedItem, (LPARAM) Buffer ))
{
MemFree( FaxConfig->PrinterName );
FaxConfig->PrinterName = StringDup( Buffer );
if(!FaxConfig->PrinterName)
{
CALL_FAIL(MEM_ERR, TEXT("StringDup"), ERROR_NOT_ENOUGH_MEMORY);
ErrorMsgBox(g_hResource, IDS_OUT_OF_MEM);
EndDialog( hDlg, IDABORT);
break;
}
}
}
//
// Update cover page
//
dwSelectedItem = (DWORD)SendMessage( hwndListCov, LB_GETCURSEL, 0, 0 );
if (dwSelectedItem != LB_ERR) //LB_ERR when no items in list
{
if (LB_ERR != SendMessage( hwndListCov, LB_GETTEXT, dwSelectedItem, (LPARAM) Buffer ))
//
// get the selected CP name into the buffer
//
{
dwMask = (DWORD)SendMessage( hwndListCov, LB_GETITEMDATA, dwSelectedItem, 0 );
if (dwMask != LB_ERR)
{
FaxConfig->ServerCoverPage = (dwMask & SERVER_COVER_PAGE) == SERVER_COVER_PAGE;
if (!FaxConfig->ServerCoverPage)
{
//
// if the selected CP in the LB is not a server's CP
// Omit the suffix: "(personal)"
//
p = _tcsrchr( Buffer, '(' );
Assert(p);
if( p )
{
p = _tcsdec(Buffer,p);
if( p )
{
_tcsnset(p,TEXT('\0'),1);
}
}
}
}
//
// update CP name to the selected one in the LB
//
MemFree( FaxConfig->CoverPageName );
FaxConfig->CoverPageName = StringDup( Buffer );
if(!FaxConfig->CoverPageName)
{
CALL_FAIL(MEM_ERR, TEXT("StringDup"), ERROR_NOT_ENOUGH_MEMORY);
ErrorMsgBox(g_hResource, IDS_OUT_OF_MEM);
EndDialog( hDlg, IDABORT);
break;
}
}
}
EndDialog( hDlg, IDOK );
break;
case IDCANCEL:
EndDialog( hDlg, IDCANCEL );
break;
}
break;
case WM_HELP:
WinHelpContextPopup(((LPHELPINFO)lParam)->dwContextId, hDlg);
return TRUE;
case WM_CONTEXTMENU:
WinHelpContextPopup(GetWindowContextHelpId((HWND)wParam), hDlg);
return TRUE;
}
return FALSE;
}