/*++ 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 --*/ #include "faxext.h" #include "faxhelp.h" #include "resource.h" extern HINSTANCE hInstance; VOID AddCoverPagesToList( HWND hwndList, LPSTR 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; CHAR filename[MAX_PATH]; CHAR CpName[MAX_PATH]; HANDLE hFindFile; LPSTR pFilename; LPSTR pExtension; INT listIndex; INT dirLen; INT fileLen; INT flags = CPFLAG_LINK; INT Cnt = 2; // // Copy the directory path to a local buffer // if (pDirPath == NULL || pDirPath[0] == 0) { return; } if ((dirLen = strlen( pDirPath )) >= MAX_PATH - MAX_FILENAME_EXT - 1) { return; } strcpy( filename, pDirPath ); if (filename[dirLen] != '\\') { filename[dirLen] = '\\'; filename[dirLen+1] = '\0'; dirLen++; } // // Go through the following loop twice: // Once to add the files with .ncp extension // Again to add the files with .lnk extension // // Don't chase links for server based cover pages // while( Cnt ) { // // Generate a specification for the files we're interested in // pFilename = &filename[dirLen]; *pFilename = TEXT('*'); strcpy( pFilename+1, ServerCoverPage ? CP_FILENAME_EXT : (flags & CPFLAG_LINK) ? LNK_FILENAME_EXT : CP_FILENAME_EXT ); // // Call FindFirstFile/FindNextFile to enumerate the files // matching our specification // hFindFile = FindFirstFile( filename, &findData ); if (hFindFile != INVALID_HANDLE_VALUE) { do { // // 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 = strlen( findData.cFileName)) <= MAX_FILENAME_EXT ) { continue; } if (fileLen + dirLen >= MAX_PATH) { continue; } // // If we're chasing links, make sure the link refers to // a cover page file. // if (!ServerCoverPage && (flags & CPFLAG_LINK)) { strcpy( pFilename, findData.cFileName ); if (!IsCoverPageShortcut(filename)) { continue; } } // // Don't display the filename extension // if (pExtension = strrchr(findData.cFileName,'.')) { *pExtension = NULL; } // // Add the cover page name to the list window // strcpy( CpName, findData.cFileName ); if ( ! ServerCoverPage ) { char szPersonal[30]; LoadString( hInstance, IDS_PERSONAL, szPersonal, 30 ); strcat( CpName, (char *) " " ); strcat( CpName, szPersonal ); } listIndex = (INT)SendMessage( hwndList, LB_ADDSTRING, 0, (LPARAM) CpName ); if (listIndex != LB_ERR) { SendMessage( hwndList, LB_SETITEMDATA, listIndex, ServerCoverPage ); } } while (FindNextFile(hFindFile, &findData)); FindClose(hFindFile); } flags ^= CPFLAG_LINK; Cnt -= 1; if (ServerCoverPage) { Cnt -= 1; } } } LONG MyLineGetTransCaps( LPLINETRANSLATECAPS *LineTransCaps ) { DWORD LineTransCapsSize; LONG Rslt = ERROR_SUCCESS; // // allocate the initial linetranscaps structure // LineTransCapsSize = sizeof(LINETRANSLATECAPS) + 4096; *LineTransCaps = (LPLINETRANSLATECAPS) MemAlloc( LineTransCapsSize ); if (!*LineTransCaps) { Rslt = ERROR_NOT_ENOUGH_MEMORY; goto exit; } (*LineTransCaps)->dwTotalSize = LineTransCapsSize; Rslt = lineGetTranslateCaps( NULL, 0x00020000, *LineTransCaps ); if (Rslt != 0) { goto exit; } if ((*LineTransCaps)->dwNeededSize > (*LineTransCaps)->dwTotalSize) { // // re-allocate the LineTransCaps structure // LineTransCapsSize = (*LineTransCaps)->dwNeededSize; MemFree( *LineTransCaps ); *LineTransCaps = (LPLINETRANSLATECAPS) MemAlloc( LineTransCapsSize ); if (!*LineTransCaps) { Rslt = ERROR_NOT_ENOUGH_MEMORY; goto exit; } (*LineTransCaps)->dwTotalSize = LineTransCapsSize; Rslt = lineGetTranslateCaps( NULL, 0x00020000, *LineTransCaps ); if (Rslt != 0) { goto exit; } } exit: if (Rslt != ERROR_SUCCESS) { MemFree( *LineTransCaps ); *LineTransCaps = NULL; } return Rslt; } 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 LPLINETRANSLATECAPS LineTransCaps = NULL; static LPLINELOCATIONENTRY LineLocation = NULL; static PFAXXP_CONFIG FaxConfig; static HWND hwndListPrn; static HWND hwndListCov; static HWND hwndListLoc; static BOOL LocalPrinter; static const DWORD faxextHelpIDs[] = { IDC_PRINTER_LIST, IDH_FMA_FAX_PRINTERS, IDC_USE_COVERPAGE, IDH_FMA_INCLUDE_COVER_PAGE, IDC_COVERPAGE_LIST, IDH_FMA_COVER_PAGES, IDC_DIALING_LOCATION, IDH_FMA_DIALING_LOCATION, IDC_STATIC_DIALING_LOCATION,IDH_FMA_DIALING_LOCATION, IDC_STATIC_COVERPAGE_GRP, IDH_FMA_COVER_PAGES, IDC_STATIC_COVERPAGE, IDH_FMA_COVER_PAGES, IDC_STATIC_PRINTER_LIST, IDH_FMA_FAX_PRINTERS, IDC_STATIC, (ULONG)IDH_INACTIVE, 0, 0 }; PPRINTER_INFO_2 PrinterInfo; DWORD CountPrinters; DWORD Selection = 0; BOOL Match; CHAR Buffer[256]; CHAR CpDir[MAX_PATH]; LPSTR p; DWORD i; DWORD_PTR j; HANDLE hFax; PFAX_CONFIGURATION pFaxConfiguration; DWORD dwPermanentLocationID = 0; LPSTR pLocationName = NULL; switch( message ) { case WM_INITDIALOG: FaxConfig = (PFAXXP_CONFIG) lParam; // // defer the server CP check to this point so we don't fire up fax service // unless we really need this property // if (FaxConnectFaxServer(FaxConfig->ServerName,&hFax) ){ if (FaxGetConfiguration(hFax,&pFaxConfiguration) ){ FaxConfig->ServerCpOnly = pFaxConfiguration->ServerCp; FaxFreeBuffer(pFaxConfiguration); } FaxClose(hFax); } hwndListPrn = GetDlgItem( hDlg, IDC_PRINTER_LIST ); hwndListCov = GetDlgItem( hDlg, IDC_COVERPAGE_LIST ); hwndListLoc = GetDlgItem( hDlg, IDC_DIALING_LOCATION ); Buffer[0] = 0; PrinterInfo = (PPRINTER_INFO_2) MyEnumPrinters( NULL, 2, &CountPrinters, PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS ); Match = FALSE; if (PrinterInfo) { for (i=0,j=0; iPrinterName && strcmp( PrinterInfo[i].pPrinterName, FaxConfig->PrinterName ) == 0) { Match = TRUE; if (PrinterInfo[i].pServerName) { strcpy( Buffer, PrinterInfo[i].pServerName ); } } j += 1; } } if (j == 0) { // // no fax printers // goto cp; } if (!Match) { MemFree( FaxConfig->PrinterName ); FaxConfig->PrinterName = StringDup( PrinterInfo[0].pPrinterName ); } MemFree( PrinterInfo ); SendMessage( hwndListPrn, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) FaxConfig->PrinterName ); PrinterInfo = (PPRINTER_INFO_2) MyGetPrinter( FaxConfig->PrinterName, 2 ); if (PrinterInfo && (PrinterInfo->Attributes & PRINTER_ATTRIBUTE_LOCAL)) { LocalPrinter = TRUE; } else { LocalPrinter = FALSE; } MemFree( PrinterInfo ); } cp: if (FaxConfig->UseCoverPage) { CheckDlgButton( hDlg, IDC_USE_COVERPAGE, BST_CHECKED ); } else { EnableWindow( GetDlgItem( hDlg, IDC_COVERPAGE_LIST ), FALSE ); } GetServerCpDir( Buffer[0] ? Buffer : NULL, CpDir, sizeof(CpDir) ); AddCoverPagesToList( hwndListCov, CpDir, TRUE ); if (!FaxConfig->ServerCpOnly) { GetClientCpDir( CpDir, sizeof(CpDir) ); AddCoverPagesToList( hwndListCov, CpDir, FALSE ); } Selection = (DWORD)SendMessage( hwndListCov, LB_FINDSTRING, 0, (LPARAM) FaxConfig->CoverPageName ); if (Selection == LB_ERR) { Selection = 0; } SendMessage( hwndListCov, LB_SETCURSEL, (WPARAM) Selection, 0 ); MyLineGetTransCaps( &LineTransCaps ); if (LineTransCaps && LineTransCaps->dwLocationListSize && LineTransCaps->dwLocationListOffset) { LineLocation = (LPLINELOCATIONENTRY) ((LPBYTE)LineTransCaps + LineTransCaps->dwLocationListOffset); for (i=0; idwNumLocations; i++) { if (LineLocation[i].dwLocationNameSize && LineLocation[i].dwLocationNameOffset) { j = SendMessage( hwndListLoc, CB_ADDSTRING, 0, (LPARAM) (LPSTR) ((LPBYTE)LineTransCaps + LineLocation[i].dwLocationNameOffset) ); SendMessage( hwndListLoc, CB_SETITEMDATA, j, (LPARAM) LineLocation[i].dwPermanentLocationID ); if (LineLocation[i].dwPermanentLocationID == LineTransCaps->dwCurrentLocationID) { pLocationName = (LPSTR) ((LPBYTE)LineTransCaps + LineLocation[i].dwLocationNameOffset); } } } if (pLocationName) { SendMessage( hwndListLoc, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) pLocationName ); } } if (!LocalPrinter) { EnableWindow( hwndListLoc, FALSE ); } break; case WM_COMMAND: if (HIWORD(wParam) == BN_CLICKED) { if (LOWORD(wParam) == IDC_USE_COVERPAGE) { if (IsDlgButtonChecked( hDlg, IDC_USE_COVERPAGE ) == BST_CHECKED) { EnableWindow( GetDlgItem( hDlg, IDC_COVERPAGE_LIST ), TRUE ); } else { EnableWindow( GetDlgItem( hDlg, IDC_COVERPAGE_LIST ), FALSE ); } return FALSE; } } if (HIWORD(wParam) == LBN_SELCHANGE && LOWORD(wParam) == IDC_PRINTER_LIST) { Selection = (DWORD)SendMessage( hwndListPrn, CB_GETCURSEL, 0, 0 ); SendMessage( hwndListPrn, CB_GETLBTEXT, Selection, (LPARAM) Buffer ); PrinterInfo = (PPRINTER_INFO_2) MyGetPrinter( Buffer, 2 ); if (PrinterInfo && (PrinterInfo->Attributes & PRINTER_ATTRIBUTE_LOCAL)) { LocalPrinter = TRUE; } else { LocalPrinter = FALSE; } EnableWindow( hwndListLoc, LocalPrinter ); SendMessage( hwndListCov, LB_RESETCONTENT, 0, 0 ); GetServerCpDir( PrinterInfo ? PrinterInfo->pServerName : NULL, CpDir, sizeof(CpDir) ); AddCoverPagesToList( hwndListCov, CpDir, TRUE ); // // check if the server name has changed // (so we can update the "server CP only" flag) // BOOL ServerNameChange = FALSE; if (FaxConfig->ServerName) { if (PrinterInfo && PrinterInfo->pServerName) { if (strcmp(FaxConfig->ServerName,PrinterInfo->pServerName) != 0) { MemFree(FaxConfig->ServerName); FaxConfig->ServerName = StringDup(PrinterInfo->pServerName); ServerNameChange = TRUE; } } else { MemFree(FaxConfig->ServerName); FaxConfig->ServerName = NULL; ServerNameChange = TRUE; } } else if (PrinterInfo && PrinterInfo->pServerName) { FaxConfig->ServerName = StringDup(PrinterInfo->pServerName); ServerNameChange = TRUE; } if (ServerNameChange) { HANDLE hFax; PFAX_CONFIGURATION pFaxConfiguration; FaxConfig->ServerCpOnly = FALSE; if (FaxConnectFaxServer(FaxConfig->ServerName,&hFax) ){ if (FaxGetConfiguration(hFax,&pFaxConfiguration) ){ FaxConfig->ServerCpOnly = pFaxConfiguration->ServerCp; FaxFreeBuffer(pFaxConfiguration); } FaxClose(hFax); } } if (! FaxConfig->ServerCpOnly) { GetClientCpDir( CpDir, sizeof(CpDir) ); AddCoverPagesToList( hwndListCov, CpDir, FALSE ); } SendMessage( hwndListCov, LB_SETCURSEL, 0, 0 ); MemFree( PrinterInfo ); } switch (wParam) { case IDOK : FaxConfig->UseCoverPage = IsDlgButtonChecked( hDlg, IDC_USE_COVERPAGE ) == BST_CHECKED; Selection = (DWORD)SendMessage( hwndListPrn, CB_GETCURSEL, 0, 0 ); SendMessage( hwndListPrn, CB_GETLBTEXT, Selection, (LPARAM) Buffer ); MemFree( FaxConfig->PrinterName ); FaxConfig->PrinterName = StringDup( Buffer ); Selection = (DWORD)SendMessage( hwndListCov, LB_GETCURSEL, 0, 0 ); SendMessage( hwndListCov, LB_GETTEXT, Selection, (LPARAM) Buffer ); MemFree( FaxConfig->CoverPageName ); // Local cover page files are presented with the string " (Personal)" // appended to the base of the cover page file name. Note the presence // of a space character. The following code segment removes that string // if it is present, before setting the CoverPageName member of FaxConfig. p = strstr( Buffer, (const char *) " (" ); if ( p != NULL ) { *p = (CHAR) '\0'; } FaxConfig->CoverPageName = StringDup( Buffer ); FaxConfig->ServerCoverPage = (INT)SendMessage( hwndListCov, LB_GETITEMDATA, Selection, 0 ); Selection = (DWORD)SendMessage( hwndListLoc, CB_GETCURSEL, 0, 0 ); if (Selection >= 0 && LineTransCaps) { dwPermanentLocationID = (DWORD) SendMessage( hwndListLoc, CB_GETITEMDATA, Selection, 0); if (dwPermanentLocationID != LineTransCaps->dwCurrentLocationID) { lineSetCurrentLocation( NULL, dwPermanentLocationID ); } } if (LineTransCaps) { MemFree( LineTransCaps ); } EndDialog( hDlg, IDOK ); break; case IDCANCEL: MemFree( LineTransCaps ); EndDialog( hDlg, IDCANCEL ); break; } break; case WM_HELP: case WM_CONTEXTMENU: FAXWINHELP( message, wParam, lParam, faxextHelpIDs ); break; } return FALSE; }