449 lines
11 KiB
C
449 lines
11 KiB
C
/*++
|
|
|
|
Copyright (c) 1996 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
statopts.c
|
|
|
|
Abstract:
|
|
|
|
Functions to handle status monitor options dialog
|
|
|
|
Environment:
|
|
|
|
Fax configuration applet
|
|
|
|
Revision History:
|
|
|
|
12/3/96 -georgeje-
|
|
Created it.
|
|
|
|
mm/dd/yy -author-
|
|
description
|
|
|
|
--*/
|
|
|
|
#include <windows.h>
|
|
#include <windowsx.h>
|
|
#include <winfax.h>
|
|
#include <shellapi.h>
|
|
#include <tchar.h>
|
|
#include <winspool.h>
|
|
|
|
#include "faxcfg.h"
|
|
#include "faxutil.h"
|
|
#include "faxreg.h"
|
|
#include "faxcfgrs.h"
|
|
#include "faxhelp.h"
|
|
|
|
HMODULE hModWinfax = NULL;
|
|
PFAXCONNECTFAXSERVER pFaxConnectFaxServer;
|
|
PFAXCLOSE pFaxClose;
|
|
PFAXACCESSCHECK pFaxAccessCheck;
|
|
|
|
|
|
VOID
|
|
DoInitStatusOptions(
|
|
HWND hDlg
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initializes the Status Options property sheet page with information from the registry
|
|
|
|
Arguments:
|
|
|
|
hDlg - Handle to the Status Options property sheet page
|
|
|
|
Return Value:
|
|
|
|
NONE
|
|
|
|
--*/
|
|
|
|
|
|
#define InitStatusOptionsCheckBox(id, pValueName, DefaultValue) \
|
|
CheckDlgButton( hDlg, id, GetRegistryDword( hRegKey, pValueName ));
|
|
|
|
{
|
|
HKEY hRegKey;
|
|
HANDLE hFax;
|
|
|
|
//
|
|
// Open the user info registry key for reading
|
|
//
|
|
|
|
|
|
if (! (hRegKey = OpenRegistryKey(HKEY_CURRENT_USER, REGKEY_FAX_USERINFO, FALSE,KEY_READ)))
|
|
return;
|
|
|
|
//
|
|
// Fill in the edit text fields
|
|
//
|
|
|
|
InitStatusOptionsCheckBox(IDC_STATUS_TASKBAR, REGVAL_TASKBAR, BST_CHECKED);
|
|
InitStatusOptionsCheckBox(IDC_STATUS_ONTOP, REGVAL_ALWAYS_ON_TOP, BST_CHECKED);
|
|
InitStatusOptionsCheckBox(IDC_STATUS_VISUAL, REGVAL_VISUAL_NOTIFICATION, BST_CHECKED);
|
|
InitStatusOptionsCheckBox(IDC_STATUS_SOUND, REGVAL_SOUND_NOTIFICATION, BST_UNCHECKED);
|
|
InitStatusOptionsCheckBox(IDC_STATUS_MANUAL, REGVAL_ENABLE_MANUAL_ANSWER, BST_UNCHECKED);
|
|
|
|
//
|
|
// Close the registry key before returning to the caller
|
|
//
|
|
|
|
RegCloseKey(hRegKey);
|
|
|
|
//
|
|
// check if the user has permission to change manual answer, gray it out if he doesn't
|
|
//
|
|
if (!LoadWinfax()) {
|
|
return;
|
|
}
|
|
|
|
if (!pFaxConnectFaxServer(NULL, &hFax)) {
|
|
return;
|
|
}
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDC_STATUS_MANUAL), pFaxAccessCheck(hFax, FAX_PORT_QUERY | FAX_PORT_SET));
|
|
|
|
pFaxClose(hFax);
|
|
|
|
UnloadWinfax();
|
|
}
|
|
|
|
|
|
VOID
|
|
DoSaveStatusOptions(
|
|
HWND hDlg
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Save the information on the Status Options property sheet page to registry
|
|
|
|
Arguments:
|
|
|
|
hDlg - Handle to the Status Options property sheet page
|
|
|
|
Return Value:
|
|
|
|
NONE
|
|
|
|
--*/
|
|
|
|
#define SaveStatusOptionsCheckBox(id, pValueName) \
|
|
SetRegistryDword(hRegKey, pValueName, IsDlgButtonChecked(hDlg, id));
|
|
|
|
{
|
|
HKEY hRegKey;
|
|
BOOL fSaveConfig = FALSE;
|
|
|
|
HWND hWndFaxStat = NULL;
|
|
|
|
//
|
|
// Open the user registry key for writing and create it if necessary
|
|
//
|
|
|
|
if (! (hRegKey = OpenRegistryKey(HKEY_CURRENT_USER, REGKEY_FAX_USERINFO,TRUE, KEY_ALL_ACCESS)))
|
|
{
|
|
return;
|
|
}
|
|
|
|
SaveStatusOptionsCheckBox(IDC_STATUS_TASKBAR, REGVAL_TASKBAR);
|
|
SaveStatusOptionsCheckBox(IDC_STATUS_ONTOP, REGVAL_ALWAYS_ON_TOP);
|
|
SaveStatusOptionsCheckBox(IDC_STATUS_VISUAL, REGVAL_VISUAL_NOTIFICATION);
|
|
SaveStatusOptionsCheckBox(IDC_STATUS_SOUND, REGVAL_SOUND_NOTIFICATION);
|
|
SaveStatusOptionsCheckBox(IDC_STATUS_MANUAL, REGVAL_ENABLE_MANUAL_ANSWER);
|
|
|
|
//
|
|
// Close the registry key before returning to the caller
|
|
//
|
|
|
|
RegCloseKey(hRegKey);
|
|
|
|
// See if faxstat is running
|
|
hWndFaxStat = FindWindow(FAXSTAT_WINCLASS, NULL);
|
|
if (hWndFaxStat) {
|
|
PostMessage(hWndFaxStat, WM_FAXSTAT_CONTROLPANEL, IsDlgButtonChecked(hDlg, IDC_STATUS_MANUAL), 0);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
BOOL
|
|
StatusOptionsProc(
|
|
HWND hDlg,
|
|
UINT message,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Procedure for handling the "Status Options" tab
|
|
|
|
Arguments:
|
|
|
|
hDlg - Identifies the property sheet page
|
|
message - Specifies the message
|
|
wParam - Specifies additional message-specific information
|
|
lParam - Specifies additional message-specific information
|
|
|
|
Return Value:
|
|
|
|
Depends on the value of message parameter
|
|
|
|
--*/
|
|
|
|
{
|
|
LPNMHDR lpNMHdr = (LPNMHDR) lParam;
|
|
|
|
switch (message) {
|
|
|
|
case WM_INITDIALOG:
|
|
|
|
DoInitStatusOptions( hDlg );
|
|
return TRUE;
|
|
|
|
case WM_COMMAND:
|
|
|
|
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
|
|
case IDC_STATUS_TASKBAR:
|
|
case IDC_STATUS_ONTOP:
|
|
case IDC_STATUS_VISUAL:
|
|
case IDC_STATUS_SOUND:
|
|
case IDC_STATUS_MANUAL:
|
|
|
|
if (GET_WM_COMMAND_CMD(wParam, lParam) == BN_CLICKED)
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
SetChangedFlag(hDlg, TRUE);
|
|
return TRUE;
|
|
|
|
case WM_NOTIFY:
|
|
|
|
switch (lpNMHdr->code) {
|
|
|
|
case PSN_SETACTIVE:
|
|
|
|
break;
|
|
|
|
case PSN_APPLY:
|
|
|
|
//
|
|
// User pressed OK or Apply - validate inputs and save changes
|
|
//
|
|
|
|
DoSaveStatusOptions(hDlg);
|
|
SetChangedFlag(hDlg, FALSE);
|
|
return PSNRET_NOERROR;
|
|
}
|
|
break;
|
|
|
|
case WM_HELP:
|
|
case WM_CONTEXTMENU:
|
|
|
|
return HandleHelpPopup(hDlg, message, wParam, lParam,STATUS_OPTIONS_PAGE);
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL
|
|
AdvancedOptionsProc(
|
|
HWND hDlg,
|
|
UINT message,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Procedure for handling the "Status Options" tab
|
|
|
|
Arguments:
|
|
|
|
hDlg - Identifies the property sheet page
|
|
message - Specifies the message
|
|
wParam - Specifies additional message-specific information
|
|
lParam - Specifies additional message-specific information
|
|
|
|
Return Value:
|
|
|
|
Depends on the value of message parameter
|
|
|
|
--*/
|
|
|
|
{
|
|
LPNMHDR lpNMHdr = (LPNMHDR) lParam;
|
|
TCHAR Text[MAX_PATH], CommandLine[MAX_PATH], Caption[MAX_PATH];
|
|
WORD IconIndex;
|
|
HICON hIconMMC, hIconMMCHelp, hIconAddPrinter;
|
|
WCHAR FaxPrinterName[MAX_PATH];
|
|
|
|
HANDLE hPrinter, hChangeNotification;
|
|
DWORD dwWaitResult;
|
|
|
|
switch (message) {
|
|
|
|
case WM_INITDIALOG:
|
|
// Load and set the mmc icon
|
|
IconIndex = 0;
|
|
LoadString(ghInstance, IDS_MMC_CMDLINE, Text, MAX_PATH);
|
|
ExpandEnvironmentStrings(Text, CommandLine, MAX_PATH);
|
|
hIconMMC = ExtractAssociatedIcon(ghInstance, CommandLine, &IconIndex);
|
|
SendDlgItemMessage(hDlg, IDC_LAUNCH_MMC, BM_SETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM) hIconMMC);
|
|
|
|
// Load and set the mmc help icon
|
|
IconIndex = 0;
|
|
LoadString(ghInstance, IDS_MMC_HELP_CMDLINE, Text, MAX_PATH);
|
|
ExpandEnvironmentStrings(Text, CommandLine, MAX_PATH);
|
|
hIconMMCHelp = ExtractAssociatedIcon(ghInstance, CommandLine, &IconIndex);
|
|
SendDlgItemMessage(hDlg, IDC_LAUNCH_MMC_HELP, BM_SETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM) hIconMMCHelp);
|
|
|
|
// Load and set the add printer icon
|
|
IconIndex = 59;
|
|
LoadString(ghInstance, IDS_SHELL32_CMDLINE, Text, MAX_PATH);
|
|
ExpandEnvironmentStrings(Text, CommandLine, MAX_PATH);
|
|
hIconAddPrinter = ExtractAssociatedIcon(ghInstance, CommandLine, &IconIndex);
|
|
SendDlgItemMessage(hDlg, IDC_ADD_PRINTER, BM_SETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM) hIconAddPrinter);
|
|
|
|
return TRUE;
|
|
|
|
case WM_COMMAND:
|
|
|
|
switch (LOWORD(wParam)) {
|
|
|
|
case IDC_LAUNCH_MMC:
|
|
LoadString(ghInstance, IDS_MMC_CMDLINE, Text, MAX_PATH);
|
|
ExpandEnvironmentStrings(Text, CommandLine, MAX_PATH);
|
|
ShellExecute(
|
|
hDlg,
|
|
NULL,
|
|
CommandLine,
|
|
TEXT("/s"),
|
|
TEXT("."),
|
|
SW_SHOWNORMAL
|
|
);
|
|
return TRUE;
|
|
|
|
case IDC_LAUNCH_MMC_HELP:
|
|
LoadString(ghInstance, IDS_MMC_HELP_CMDLINE, Text, MAX_PATH);
|
|
ExpandEnvironmentStrings(Text, CommandLine, MAX_PATH);
|
|
ShellExecute(
|
|
hDlg,
|
|
NULL,
|
|
CommandLine,
|
|
NULL,
|
|
TEXT("."),
|
|
SW_SHOWNORMAL
|
|
);
|
|
return TRUE;
|
|
|
|
case IDC_ADD_PRINTER:
|
|
// Initialize the handles
|
|
hPrinter = NULL;
|
|
hChangeNotification = INVALID_HANDLE_VALUE;
|
|
|
|
// Initialize the wait result
|
|
dwWaitResult = WAIT_TIMEOUT;
|
|
|
|
// Open the local print server
|
|
if (OpenPrinter(NULL, &hPrinter, NULL) == TRUE)
|
|
{
|
|
hChangeNotification = FindFirstPrinterChangeNotification(hPrinter, PRINTER_CHANGE_ADD_PRINTER, 0, NULL);
|
|
}
|
|
|
|
// Add the fax printer
|
|
MyLoadString(ghInstance, IDS_DEFAULT_PRINTER_NAME, FaxPrinterName, MAX_PATH, GetSystemDefaultUILanguage());
|
|
swprintf(Text, TEXT("printui.dll,PrintUIEntry %s /q /if /b \"%s\" /f \"%%SystemRoot%%\\inf\\ntprint.inf\" /r \"MSFAX:\" /m \"%s\" /l \"%%SystemRoot%%\\system32\""), IsProductSuite() ? L"/Z" : L"/z", FaxPrinterName, FAX_DRIVER_NAME);
|
|
ExpandEnvironmentStrings(Text, CommandLine, MAX_PATH);
|
|
|
|
ExpandEnvironmentStrings(TEXT("%systemroot%\\system32\\rundll32.exe"), Text, MAX_PATH);
|
|
|
|
ShellExecute(
|
|
hDlg,
|
|
NULL,
|
|
Text,
|
|
CommandLine,
|
|
TEXT("."),
|
|
SW_SHOWNORMAL
|
|
);
|
|
|
|
if (hChangeNotification != INVALID_HANDLE_VALUE)
|
|
{
|
|
// Wait for the change notification
|
|
dwWaitResult = WaitForSingleObject(hChangeNotification, 60000);
|
|
|
|
// Close the change notification
|
|
FindClosePrinterChangeNotification(hChangeNotification);
|
|
}
|
|
|
|
if (hPrinter != NULL)
|
|
{
|
|
// Close the local printer server
|
|
ClosePrinter(hPrinter);
|
|
}
|
|
|
|
// Load the caption
|
|
LoadString(ghInstance, IDS_ADD_PRINTER_CAPTION, Caption, MAX_PATH);
|
|
|
|
// Load the text
|
|
if (dwWaitResult == WAIT_OBJECT_0)
|
|
{
|
|
LoadString(ghInstance, IDS_ADD_PRINTER_SUCCESS, Text, MAX_PATH);
|
|
}
|
|
else
|
|
{
|
|
LoadString(ghInstance, IDS_ADD_PRINTER_FAILED, Text, MAX_PATH);
|
|
}
|
|
|
|
// Display the message
|
|
MessageBox(hDlg, Text, Caption, dwWaitResult == WAIT_OBJECT_0 ? MB_ICONINFORMATION : MB_ICONWARNING);
|
|
|
|
return TRUE;
|
|
};
|
|
|
|
#if 0
|
|
case WM_NOTIFY:
|
|
|
|
switch (lpNMHdr->code) {
|
|
|
|
case PSN_APPLY:
|
|
|
|
//
|
|
// User pressed OK or Apply - validate inputs and save changes
|
|
//
|
|
|
|
DoSaveStatusOptions(hDlg);
|
|
SetChangedFlag(hDlg, FALSE);
|
|
return PSNRET_NOERROR;
|
|
}
|
|
break;
|
|
#endif
|
|
|
|
case WM_HELP:
|
|
case WM_CONTEXTMENU:
|
|
|
|
return HandleHelpPopup(hDlg, message, wParam, lParam,ADVNCD_OPTIONS_PAGE);
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|