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