|
|
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
statopts.c
Abstract:
Property sheet handler for "Status Option" page
Environment:
Fax driver user interface
Revision History:
04/09/00 -taoyuan- Created it. Copy part of code from shell\ext\systray\dll\fax.cpp
mm/dd/yy -author- description
--*/
#include <stdio.h>
#include "faxui.h"
#include "resource.h"
HWND g_hwndTracking = NULL;
INT_PTR CALLBACK SoundDlgProc( HWND hwndDlg, // handle to dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
BOOL GetSelectedDeviceId( HWND hDlg, DWORD* pdwDeviceId ) /*++
Routine Description:
Returns selected divice ID from IDC_COMBO_MODEM combo box
Arguments:
hDlg - [in] Handle to the Status Options property sheet page pdwDeviceId - [out] selected device ID
Return Value:
TRUE for success, FALSE otherwise
--*/ { DWORD dwCount = 0; DWORD dwIndex = 0; HWND hComboModem = NULL;
hComboModem = GetDlgItem(hDlg, IDC_COMBO_MODEM); if(!hComboModem) { Assert(FALSE); Error(( "GetDlgItem(hDlg, IDC_COMBO_MODEM) failed, ec = %d.\n", GetLastError())); return FALSE; }
dwCount = (DWORD)SendMessage(hComboModem, CB_GETCOUNT,0,0); if(CB_ERR == dwCount || 0 == dwCount) { Error(( "SendMessage(hComboModem, CB_GETCOUNT,0,0) failed\n")); return FALSE; }
dwIndex = (DWORD)SendMessage(hComboModem, CB_GETCURSEL,0,0); if(CB_ERR == dwIndex) { Error(( "SendMessage(hComboModem, CB_GETCURSEL,0,0) failed\n")); return FALSE; }
*pdwDeviceId = (DWORD)SendMessage(hComboModem, CB_GETITEMDATA, dwIndex, 0); if(CB_ERR == *pdwDeviceId) { Error(( "SendMessage(hComboModem, CB_GETITEMDATA, dwIndex, 0) failed\n")); return FALSE; }
return TRUE; }
void OnDevSelectChanged( HWND hDlg ) /*++
Routine Description:
Change IDC_CHECK_MANUAL_ANSWER check box state according to device selection
Arguments:
hDlg - Handle to the Status Options property sheet page
Return Value:
NONE
--*/ { BOOL bFaxEnable = FALSE; DWORD dwSelectedDeviceId = 0;
PFAX_PORT_INFO_EX pPortInfo = NULL; TCHAR szDeviceNote[MAX_PATH] = {0};
GetSelectedDeviceId(hDlg, &dwSelectedDeviceId);
if(dwSelectedDeviceId) { pPortInfo = FindPortInfo(dwSelectedDeviceId); if(!pPortInfo) { Error(("FindPortInfo() failed\n")); Assert(FALSE); return; }
bFaxEnable = pPortInfo->bSend || (FAX_DEVICE_RECEIVE_MODE_OFF != pPortInfo->ReceiveMode); }
if(!bFaxEnable) { if(!LoadString(g_hResource, 0 == dwSelectedDeviceId ? IDS_NO_DEVICES : IDS_NOT_FAX_DEVICE, szDeviceNote, MAX_PATH)) { Error(( "LoadString() failed with %d.\n", GetLastError())); Assert(FALSE); } }
SetDlgItemText(hDlg, IDC_STATIC_DEVICE_NOTE, szDeviceNote); ShowWindow(GetDlgItem(hDlg, IDC_STATIC_NOTE_ICON), bFaxEnable ? SW_HIDE : SW_SHOW);
EnableWindow(GetDlgItem(hDlg, IDC_CHECK_MONITOR_ON_SEND), bFaxEnable); EnableWindow(GetDlgItem(hDlg, IDC_CHECK_MONITOR_ON_RECEIVE), bFaxEnable); EnableWindow(GetDlgItem(hDlg, IDC_CHECK_NOTIFY_PROGRESS), bFaxEnable); EnableWindow(GetDlgItem(hDlg, IDC_CHECK_NOTIFY_IN_COMPLETE), bFaxEnable); EnableWindow(GetDlgItem(hDlg, IDC_CHECK_NOTIFY_OUT_COMPLETE), bFaxEnable); EnableWindow(GetDlgItem(hDlg, IDC_STATIC_AUTO_OPEN), bFaxEnable); EnableWindow(GetDlgItem(hDlg, IDC_BUTTON_SOUND), bFaxEnable); }
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
--*/ { HKEY hRegKey;
DWORD dw; DWORD dwItem; DWORD dwSelectedDeviceId=0; DWORD dwSelectedItem=0; HWND hComboModem = NULL;
BOOL bDesktopSKU = IsDesktopSKU();
DWORD bNotifyProgress = bDesktopSKU; DWORD bNotifyInCompletion = bDesktopSKU; DWORD bNotifyOutCompletion = bDesktopSKU; DWORD bMonitorOnSend = bDesktopSKU; DWORD bMonitorOnReceive = bDesktopSKU;
//
// Open the user info registry key for reading
//
if ((hRegKey = OpenRegistryKey(HKEY_CURRENT_USER, REGKEY_FAX_USERINFO, FALSE,KEY_READ))) { GetRegistryDwordEx(hRegKey, REGVAL_MONITOR_ON_SEND, &bMonitorOnSend); GetRegistryDwordEx(hRegKey, REGVAL_MONITOR_ON_RECEIVE, &bMonitorOnReceive); GetRegistryDwordEx(hRegKey, REGVAL_NOTIFY_PROGRESS, &bNotifyProgress); GetRegistryDwordEx(hRegKey, REGVAL_NOTIFY_IN_COMPLETE, &bNotifyInCompletion); GetRegistryDwordEx(hRegKey, REGVAL_NOTIFY_OUT_COMPLETE, &bNotifyOutCompletion); GetRegistryDwordEx(hRegKey, REGVAL_DEVICE_TO_MONITOR, &dwSelectedDeviceId); RegCloseKey(hRegKey); }
CheckDlgButton( hDlg, IDC_CHECK_MONITOR_ON_SEND, bMonitorOnSend ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton( hDlg, IDC_CHECK_MONITOR_ON_RECEIVE, bMonitorOnReceive ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton( hDlg, IDC_CHECK_NOTIFY_PROGRESS, bNotifyProgress ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton( hDlg, IDC_CHECK_NOTIFY_IN_COMPLETE, bNotifyInCompletion ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton( hDlg, IDC_CHECK_NOTIFY_OUT_COMPLETE, bNotifyOutCompletion ? BST_CHECKED : BST_UNCHECKED);
hComboModem = GetDlgItem(hDlg, IDC_COMBO_MODEM); if(!hComboModem) { Assert(FALSE); return; }
for(dw=0; dw < g_dwPortsNum; ++dw) { dwItem = (DWORD)SendMessage(hComboModem, CB_ADDSTRING, 0, (LPARAM)g_pFaxPortInfo[dw].lpctstrDeviceName); if(CB_ERR != dwItem && CB_ERRSPACE != dwItem) { SendMessage(hComboModem, CB_SETITEMDATA, dwItem, g_pFaxPortInfo[dw].dwDeviceID); if(g_pFaxPortInfo[dw].dwDeviceID == dwSelectedDeviceId) { dwSelectedItem = dwItem; } } else { Error(( "SendMessage(hComboModem, CB_ADDSTRING, 0, pPortsInfo[dw].lpctstrDeviceName) failed\n")); }
SendMessage(hComboModem, CB_SETCURSEL, dwSelectedItem, 0); OnDevSelectChanged(hDlg); }
return; }
BOOL 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:
TRUE for success, FALSE otherwise
--*/
#define SaveStatusOptionsCheckBox(id, pValueName) \
SetRegistryDword(hRegKey, pValueName, IsDlgButtonChecked(hDlg, id));
{ HKEY hRegKey; HWND hWndFaxStat = NULL; DWORD dwSelectedDeviceId = 0; DWORD dwRes = 0;
//
// 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))) { dwRes = GetLastError(); Error(("Can't open registry to save data. Error = %d\n", dwRes)); DisplayErrorMessage(hDlg, 0, dwRes); return FALSE; }
SaveStatusOptionsCheckBox(IDC_CHECK_MONITOR_ON_SEND, REGVAL_MONITOR_ON_SEND); SaveStatusOptionsCheckBox(IDC_CHECK_MONITOR_ON_RECEIVE, REGVAL_MONITOR_ON_RECEIVE); SaveStatusOptionsCheckBox(IDC_CHECK_NOTIFY_PROGRESS, REGVAL_NOTIFY_PROGRESS); SaveStatusOptionsCheckBox(IDC_CHECK_NOTIFY_IN_COMPLETE, REGVAL_NOTIFY_IN_COMPLETE); SaveStatusOptionsCheckBox(IDC_CHECK_NOTIFY_OUT_COMPLETE, REGVAL_NOTIFY_OUT_COMPLETE);
if(GetSelectedDeviceId(hDlg, &dwSelectedDeviceId)) { SetRegistryDword(hRegKey, REGVAL_DEVICE_TO_MONITOR, dwSelectedDeviceId); }
//
// 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, 0, 0); }
return TRUE; }
INT_PTR CALLBACK StatusOptionDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
/*++
Routine Description:
Procedure for handling the "status option" tab
Arguments:
hDlg - Identifies the property sheet page uMsg - Specifies the message wParam - Specifies additional message-specific information lParam - Specifies additional message-specific information
Return Value:
Depends on the value of message parameter
--*/
{ switch (uMsg) { case WM_INITDIALOG : { DoInitStatusOptions(hDlg); g_hwndTracking = hDlg; return TRUE; }
case WM_DESTROY: g_hwndTracking = NULL; break;
case WM_COMMAND:
switch(LOWORD(wParam)) { case IDC_CHECK_MONITOR_ON_SEND: case IDC_CHECK_MONITOR_ON_RECEIVE: case IDC_CHECK_NOTIFY_PROGRESS: case IDC_CHECK_NOTIFY_IN_COMPLETE: case IDC_CHECK_NOTIFY_OUT_COMPLETE:
if( HIWORD(wParam) == BN_CLICKED ) // notification code
{ Notify_Change(hDlg); }
break;
case IDC_COMBO_MODEM:
if(HIWORD(wParam) == CBN_SELCHANGE) { OnDevSelectChanged(hDlg); Notify_Change(hDlg); } break;
case IDC_BUTTON_SOUND: //
// open sound dialog
//
DialogBoxParam(g_hResource, MAKEINTRESOURCE(IDD_SOUNDS), hDlg, SoundDlgProc, (LPARAM)NULL); break;
default: break; }
break;
case WM_NOTIFY: { LPNMHDR lpnm = (LPNMHDR) lParam;
switch (lpnm->code) { case PSN_SETACTIVE: OnDevSelectChanged(hDlg);
break;
case PSN_APPLY:
if(!DoSaveStatusOptions(hDlg)) { SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID); } else { Notify_UnChange(hDlg); }
return TRUE;
default : break; } // switch
break; }
case WM_HELP: WinHelpContextPopup(((LPHELPINFO)lParam)->dwContextId, hDlg); return TRUE;
default: break; }
return FALSE; }
INT_PTR CALLBACK SoundDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) /*++
Routine Description:
Procedure for handling the sound dialog
Arguments:
hDlg - Identifies the property sheet page uMsg - Specifies the message wParam - Specifies additional message-specific information lParam - Specifies additional message-specific information
Return Value:
Depends on the value of message parameter
--*/ { switch (uMsg) { case WM_INITDIALOG : { HKEY hRegKey; DWORD bSoundOnRing = IsDesktopSKU(); DWORD bSoundOnReceive = bSoundOnRing; DWORD bSoundOnSent = bSoundOnRing; DWORD bSoundOnError = bSoundOnRing;
if ((hRegKey = OpenRegistryKey(HKEY_CURRENT_USER, REGKEY_FAX_USERINFO, FALSE,KEY_READ))) { GetRegistryDwordEx(hRegKey, REGVAL_SOUND_ON_RING, &bSoundOnRing); GetRegistryDwordEx(hRegKey, REGVAL_SOUND_ON_RECEIVE, &bSoundOnReceive); GetRegistryDwordEx(hRegKey, REGVAL_SOUND_ON_SENT, &bSoundOnSent); GetRegistryDwordEx(hRegKey, REGVAL_SOUND_ON_ERROR, &bSoundOnError);
RegCloseKey(hRegKey); }
CheckDlgButton( hDlg, IDC_CHECK_RING, bSoundOnRing ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton( hDlg, IDC_CHECK_RECEIVE, bSoundOnReceive ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton( hDlg, IDC_CHECK_SENT, bSoundOnSent ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton( hDlg, IDC_CHECK_ERROR, bSoundOnError ? BST_CHECKED : BST_UNCHECKED);
return TRUE; }
case WM_COMMAND:
switch(LOWORD(wParam)) { case IDOK: { HKEY hRegKey; DWORD dwRes = 0;
//
// 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))) { SaveStatusOptionsCheckBox(IDC_CHECK_RING, REGVAL_SOUND_ON_RING); SaveStatusOptionsCheckBox(IDC_CHECK_RECEIVE, REGVAL_SOUND_ON_RECEIVE); SaveStatusOptionsCheckBox(IDC_CHECK_SENT, REGVAL_SOUND_ON_SENT); SaveStatusOptionsCheckBox(IDC_CHECK_ERROR, REGVAL_SOUND_ON_ERROR);
RegCloseKey(hRegKey);
EndDialog(hDlg, IDOK); } else { dwRes = GetLastError(); Error(("Can't open registry to save data. Error = %d\n", dwRes)); DisplayErrorMessage(hDlg, 0, dwRes); } } break; case IDCANCEL: EndDialog(hDlg, IDCANCEL); break; }
break;
case WM_HELP: WinHelpContextPopup(((LPHELPINFO)lParam)->dwContextId, hDlg); return TRUE; }
return FALSE; }
DWORD FindDeviceToMonitor () /*++
Routine name : FindDeviceToMonitor
Routine description:
Attempts to find a device which is either send or receive enabled
Author:
Eran Yariv (EranY), Apr, 2001
Arguments: Return Value:
Device id, zero if none found.
--*/ { DWORD dwIndex;
for (dwIndex = 0; dwIndex < g_dwPortsNum; dwIndex++) { if (g_pFaxPortInfo[dwIndex].bSend || // Device is send enabled or
(FAX_DEVICE_RECEIVE_MODE_OFF != g_pFaxPortInfo[dwIndex].ReceiveMode)) // device is receive enabled
{ //
// We have a match
//
return g_pFaxPortInfo[dwIndex].dwDeviceID; } } return 0; } // FindDeviceToMonitor
VOID NotifyDeviceUsageChanged () /*++
Routine name : NotifyDeviceUsageChanged
Routine description:
A notification function. Called whenever the usage of a device has changed.
Author:
Eran Yariv (EranY), Apr, 2001
Arguments:
Return Value:
None.
--*/ { DWORD dwMonitoredDeviceId; if (g_hwndTracking) { //
// Get data from the combo-box
//
if(!GetSelectedDeviceId(g_hwndTracking, &dwMonitoredDeviceId)) { //
// Can't read monitored device
//
return; } } else { HKEY hRegKey; //
// Get data from the registry
//
if ((hRegKey = OpenRegistryKey(HKEY_CURRENT_USER, REGKEY_FAX_USERINFO, FALSE, KEY_READ))) { if (ERROR_SUCCESS != GetRegistryDwordEx(hRegKey, REGVAL_DEVICE_TO_MONITOR, &dwMonitoredDeviceId)) { //
// Can't read monitored device
//
RegCloseKey (hRegKey); return; } RegCloseKey (hRegKey); } else { //
// Can't read monitored device
//
return; } } if (IsDeviceInUse(dwMonitoredDeviceId)) { //
// Monitored device is in use - no action required
//
return; } //
// Now we know that the monitored device is no longer in use.
// Try to find another device to monitor.
//
dwMonitoredDeviceId = FindDeviceToMonitor (); if (!dwMonitoredDeviceId) { //
// Can't find any device to monitor - do nothing.
//
return; } //
// Set the new device
//
if (g_hwndTracking) { //
// Set data to the combo-box
//
DWORD dwCount = 0; DWORD dwIndex = 0; HWND hComboModem = NULL;
hComboModem = GetDlgItem(g_hwndTracking, IDC_COMBO_MODEM); if(!hComboModem) { Assert(FALSE); return; } dwCount = (DWORD)SendMessage(hComboModem, CB_GETCOUNT,0,0); if(CB_ERR == dwCount || 0 == dwCount) { Error(("SendMessage(hComboModem, CB_GETCOUNT,0,0) failed\n")); return; } for (dwIndex = 0; dwIndex < dwCount; dwIndex++) { DWORD dwDeviceId; //
// Look for the device
//
dwDeviceId = (DWORD)SendMessage(hComboModem, CB_GETITEMDATA, dwIndex, 0); if (dwDeviceId != dwMonitoredDeviceId) { continue; } //
// Found the new device in the combo-box.
// Select it and mark the page as modified.
//
SendMessage(hComboModem, CB_SETCURSEL, dwIndex, 0); OnDevSelectChanged(g_hwndTracking); Notify_Change(g_hwndTracking); break; } } else { HKEY hRegKey; //
// Set data to the registry
//
if ((hRegKey = OpenRegistryKey(HKEY_CURRENT_USER, REGKEY_FAX_USERINFO, FALSE, KEY_WRITE))) { if (!SetRegistryDword(hRegKey, REGVAL_DEVICE_TO_MONITOR, dwMonitoredDeviceId)) { //
// Can't write monitored device
//
} RegCloseKey (hRegKey); } } } // NotifyDeviceUsageChanged
|