/*++ 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; iPrinterName) && (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; }