windows-nt/Source/XPSP1/NT/printscan/fax/exchange/xport/config.cpp
2020-09-26 16:20:57 +08:00

586 lines
19 KiB
C++

/*++
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 "faxxp.h"
#include "faxhelp.h"
#include "resource.h"
#pragma hdrstop
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( FaxXphInstance, 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;
}
}
}
VOID
DrawSampleText(
HWND hDlg,
HDC hDC,
PFAXXP_CONFIG FaxConfig
)
{
int PointSize;
TCHAR PointSizeBuffer[16];
TCHAR FontTypeBuffer[32];
BOOL bItalic = FALSE;
BOOL bBold = FALSE;
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(FaxXphInstance, IDS_FONT_BOLD, FontTypeBuffer,sizeof(FontTypeBuffer)/sizeof(TCHAR) );
// concat "italic"
if (bItalic) {
LoadString(FaxXphInstance,
IDS_FONT_ITALIC,
&FontTypeBuffer[lstrlen(FontTypeBuffer)],
sizeof(FontTypeBuffer)/sizeof(TCHAR) - lstrlen(FontTypeBuffer) );
}
} else if (bItalic) {
LoadString(FaxXphInstance, IDS_FONT_ITALIC, FontTypeBuffer,sizeof(FontTypeBuffer)/sizeof(TCHAR) );
} else {
LoadString(FaxXphInstance, IDS_FONT_REGULAR, FontTypeBuffer,sizeof(FontTypeBuffer)/sizeof(TCHAR) );
}
SetWindowText( GetDlgItem( hDlg, IDC_FONT_STYLE), FontTypeBuffer );
}
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;
static HWND hwndListPrn;
static HWND hwndListCov;
static const DWORD faxextHelpIDs[] = {
IDC_PRINTER_LIST, IDH_FAXMAILTRANSPORT_FAX_PRINTERS,
IDC_STATIC_PRINTERS, IDH_FAXMAILTRANSPORT_FAX_PRINTERS,
IDC_USE_COVERPAGE, IDH_FAXMAILTRANSPORT_INCLUDE_COVER_PAGE,
IDC_COVERPAGE_LIST, IDH_FAXMAILTRANSPORT_COVER_PAGES,
IDC_COVERPAGE_LIST_LABEL, IDH_FAXMAILTRANSPORT_COVER_PAGES,
IDCSTATIC_FONT_GROUP, IDH_FAXMAILTRANSPORT_DEFAULT_MESSAGE_FONT_GRP,
IDCSTATIC_FONT, IDH_FAXMAILTRANSPORT_FONT,
IDCSTATIC_FONTSTYLE, IDH_FAXMAILTRANSPORT_FONT_STYLE,
IDCSTATIC_FONTSIZE, IDH_FAXMAILTRANSPORT_SIZE,
IDC_FONT_NAME, IDH_FAXMAILTRANSPORT_FONT,
IDC_FONT_STYLE, IDH_FAXMAILTRANSPORT_FONT_STYLE,
IDC_FONT_SIZE, IDH_FAXMAILTRANSPORT_SIZE,
IDC_SET_FONT, IDH_FAXMAILTRANSPORT_SET_FONT,
IDC_STATIC, (LONG)IDH_INACTIVE,
IDC_STATIC_ICON, (LONG)IDH_INACTIVE,
IDC_STATIC_TITLE, (LONG)IDH_INACTIVE,
0, 0
};
PPRINTER_INFO_2 PrinterInfo;
DWORD CountPrinters;
DWORD Selection = 0;
CHAR Buffer[256];
CHAR CpDir[MAX_PATH];
LPSTR p;
PAINTSTRUCT ps;
#ifndef WIN95
HANDLE hFax;
PFAX_CONFIGURATION pFaxConfiguration;
#endif
switch( message ) {
case WM_INITDIALOG:
FaxConfig = (PFAXXP_CONFIG) lParam;
#ifndef WIN95
//
// 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);
}
#endif
hwndListPrn = GetDlgItem( hDlg, IDC_PRINTER_LIST );
hwndListCov = GetDlgItem( hDlg, IDC_COVERPAGE_LIST );
//
// populate the printers listbox
//
Buffer[0] = 0;
PrinterInfo = (PPRINTER_INFO_2) MyEnumPrinters( NULL, 2, &CountPrinters, PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS );
if (PrinterInfo) {
DWORD i,j;
for (i=0,j=0; i<CountPrinters; i++) {
if (strcmp( PrinterInfo[i].pDriverName, FAX_DRIVER_NAME ) == 0) {
SendMessage( hwndListPrn, CB_ADDSTRING, 0, (LPARAM) PrinterInfo[i].pPrinterName );
if (FaxConfig->PrinterName && strcmp( PrinterInfo[i].pPrinterName, FaxConfig->PrinterName ) == 0) {
#if defined(WIN95)
if (PrinterInfo[i].pPortName) {
strcpy( Buffer, PrinterInfo[i].pPortName );
}
#else
if (PrinterInfo[i].pServerName) {
strcpy( Buffer, PrinterInfo[i].pServerName );
}
#endif
}
j += 1;
}
}
MemFree( PrinterInfo );
SendMessage( hwndListPrn, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) FaxConfig->PrinterName );
}
if (FaxConfig->UseCoverPage) {
CheckDlgButton( hDlg, IDC_USE_COVERPAGE, BST_CHECKED );
} else {
EnableWindow( GetDlgItem( hDlg, IDC_COVERPAGE_LIST ), FALSE );
EnableWindow( GetDlgItem( hDlg, IDC_COVERPAGE_LIST_LABEL ), FALSE );
}
#if defined(WIN95)
if (Buffer[0]) {
char *LastWhack;
LastWhack = strrchr(Buffer, '\\');
if (LastWhack != NULL)
*LastWhack = '\0';
strcpy(CpDir, Buffer);
strcat(CpDir, "\\print$\\coverpg\\");
} else {
GetServerCpDir( NULL, CpDir, sizeof(CpDir) );
}
AddCoverPagesToList( hwndListCov, CpDir, TRUE );
GetWindowsDirectory( CpDir, sizeof(CpDir) );
strcat( CpDir, "\\spool\\fax\\coverpg\\" );
AddCoverPagesToList( hwndListCov, CpDir, FALSE );
#else
GetServerCpDir( Buffer[0] ? Buffer : NULL, CpDir, sizeof(CpDir) );
AddCoverPagesToList( hwndListCov, CpDir, TRUE );
if (!FaxConfig->ServerCpOnly) {
GetClientCpDir( CpDir, sizeof(CpDir) );
AddCoverPagesToList( hwndListCov, CpDir, FALSE );
}
#endif
strcpy( Buffer, FaxConfig->CoverPageName );
if ( ! FaxConfig->ServerCoverPage )
{
char szPersonal[30];
LoadString( FaxXphInstance, IDS_PERSONAL, szPersonal, 30 );
strcat( Buffer, (char *) " " );
strcat( Buffer, szPersonal );
}
Selection = (DWORD)SendMessage( hwndListCov, LB_FINDSTRING, 0, (LPARAM) Buffer );
if (Selection == LB_ERR) {
Selection = 0;
}
SendMessage( hwndListCov, LB_SETCURSEL, (WPARAM) Selection, 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) {
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 );
}
return FALSE;
}
}
if (HIWORD(wParam) == CBN_SELCHANGE && LOWORD(wParam) == IDC_PRINTER_LIST) {
char SelectedPrinter[50];
//
// delete the old items from the list
//
SendMessage(hwndListCov, LB_RESETCONTENT, 0, 0);
Selection = (DWORD)SendMessage( hwndListPrn, CB_GETCURSEL, 0, 0 );
SendMessage( hwndListPrn, CB_GETLBTEXT, Selection, (LPARAM) SelectedPrinter );
Buffer[0] = 0;
PrinterInfo = (PPRINTER_INFO_2) MyEnumPrinters( NULL, 2, &CountPrinters, PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS );
if (PrinterInfo) {
DWORD i;
for (i=0; i<CountPrinters; i++) {
if (strcmp( PrinterInfo[i].pDriverName, FAX_DRIVER_NAME ) == 0) {
if (strcmp( PrinterInfo[i].pPrinterName, SelectedPrinter ) == 0) {
if (PrinterInfo[i].pServerName) {
strcpy( Buffer, PrinterInfo[i].pServerName );
}
}
}
}
MemFree( PrinterInfo );
}
#ifndef WIN95
GetServerCpDir( Buffer[0] ? Buffer : NULL, CpDir, sizeof(CpDir) );
AddCoverPagesToList( hwndListCov, CpDir, TRUE );
BOOL ServerChanged = FALSE;
if (!FaxConfig->ServerName) {
if (Buffer[0]) {
ServerChanged = TRUE;
}
} else if (strcmp(Buffer,FaxConfig->ServerName) != 0) {
ServerChanged = TRUE;
}
if (ServerChanged) {
//
// refresh server name
//
if (FaxConfig->ServerName) MemFree(FaxConfig->ServerName);
FaxConfig->ServerName = Buffer[0] ? StringDup(Buffer) : NULL ;
HANDLE hFax;
PFAX_CONFIGURATION pFaxConfiguration;
//
// get the servercp flag
//
FaxConfig->ServerCpOnly = FALSE;
if (FaxConnectFaxServer(FaxConfig->ServerName,&hFax) ){
if (FaxGetConfiguration(hFax,&pFaxConfiguration) ) {
FaxConfig->ServerCpOnly = pFaxConfiguration->ServerCp;
FaxFreeBuffer(pFaxConfiguration);
}
FaxClose(hFax);
}
}
//
// don't add client coverpages if FaxConfig->ServerCpOnly is set to true
//
if (! FaxConfig->ServerCpOnly) {
GetClientCpDir( CpDir, sizeof(CpDir) );
AddCoverPagesToList( hwndListCov, CpDir, FALSE );
}
#else
if (Buffer[0]) {
strcpy(CpDir, Buffer);
strcat(CpDir, "\\print$\\coverpg\\");
} else {
GetServerCpDir( NULL, CpDir, sizeof(CpDir) );
}
AddCoverPagesToList( hwndListCov, CpDir, TRUE );
GetWindowsDirectory( CpDir, sizeof(CpDir) );
strcat( CpDir, "\\spool\\fax\\coverpg\\" );
AddCoverPagesToList( hwndListCov, CpDir, FALSE );
#endif
}
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 :
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 );
p = strrchr( Buffer, '(' );
if (p) {
p[-1] = 0;
FaxConfig->ServerCoverPage = FALSE;
} else {
FaxConfig->ServerCoverPage = TRUE;
}
FaxConfig->CoverPageName = StringDup( Buffer );
EndDialog( hDlg, TRUE );
break;
case IDCANCEL:
EndDialog( hDlg, TRUE );
break;
}
break;
case WM_HELP:
case WM_CONTEXTMENU:
FAXWINHELP( message, wParam, lParam, faxextHelpIDs );
break;
}
return FALSE;
}