Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1165 lines
41 KiB

/** FILE: ups.c ********* Module Header ********************************
*
* Control panel applet for UPS configuration.
* This applet let the user to specify the ups capabilities, including:
* - signalling on power failure
* - ability to turn itself off
* - signal low battery power
* - battery life and recharge time
* - signal voltage
* It also allows the user to specify the time of first notification
* and the notification interval thereafter
*
* History:
* 1pm on Wed 08 Apr 1992 -by- Mark Cliggett [markcl]
* Created
* Saturday 05 Sept 1992 -by- Congpa You [congpay]
* Rewrite the code for the new UPS dialog.
*
* Copyright (C) 1992 Microsoft Corporation
*
*************************************************************************/
//==========================================================================
// Include files
//==========================================================================
// C Runtime
#define _CTYPE_DISABLE_MACROS
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
// Application specific
#include "ups.h"
//==========================================================================
// Local Functions
//==========================================================================
/* EnableCONFIG enable/disable the UPS configuration groupbox
* and the comport combobox if bVal = TRUE/FALSE.
*/
void EnableCONFIG (HWND hDlg, BOOL bVal)
{
EnableWindow (GetDlgItem (hDlg, IDD_UPS_PORTCB), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_UPSGROUP), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_TEXT), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_PFSIGNAL), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_LOWBATTERY), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_TURNOFF), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_COMMANDFILE), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_SIGN), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_TURNOFFHIGH), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_TURNOFFLOW), bVal);
}
/* EnablePFSINGNAL deals with power failure signal checkbox and radiobutton. */
void EnablePFSIGNAL (HWND hDlg, BOOL bVal)
{
EnableWindow (GetDlgItem (hDlg, IDD_UPS_PFSIGNALHIGH), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_PFSIGNALLOW), bVal);
}
/* EnableLOWBATTERY deals with low battery signal checkbox and radiobutton. */
void EnableLOWBATTERY (HWND hDlg, BOOL bVal)
{
EnableWindow (GetDlgItem (hDlg, IDD_UPS_LOWBATTERYHIGH), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_LOWBATTERYLOW), bVal);
}
/* EnableFILENAME deals with the Filename text field. */
void EnableFILENAME (HWND hDlg, BOOL bVal)
{
EnableWindow (GetDlgItem (hDlg, IDD_UPS_FILETEXT), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_FILENAME), bVal);
}
/* EnableCHARACTER deals with the UPS characteristics groupbox. */
void EnableCHARACTER (HWND hDlg, BOOL bVal)
{
EnableWindow (GetDlgItem (hDlg, IDD_UPS_CHARACTER), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_BLTEXT1), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_BLEDIT), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_BATTERYLIFE), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_BLTEXT2), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_RPMTEXT1), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_RPMEDIT), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_RECHARGEPERMINUTE), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_RPMTEXT2), bVal);
}
/* EnableSERVICE deals with the UPS service groupbox. */
void EnableSERVICE (HWND hDlg, BOOL bVal)
{
EnableWindow (GetDlgItem (hDlg, IDD_UPS_SERVICE), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_FWTEXT1), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_FWEDIT), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_FIRSTWARNING), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_FWTEXT2), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_WITEXT1), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_WIEDIT), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_WARNINGINTERVAL), bVal);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_WITEXT2), bVal);
}
/* Show draws the UPS dialog according to the UPS configuation.
* There are only 8 cases because there are three check box in
* UPS configuration groupbox.
*/
void Show (HWND hDlg, ULONG ulOptions)
{
switch (ulOptions) {
case UPS_POWERFAILSIGNAL:
CheckDlgButton (hDlg, IDD_UPS_PFSIGNAL, TRUE);
EnablePFSIGNAL (hDlg, TRUE);
EnableLOWBATTERY (hDlg, FALSE);
EnableCHARACTER (hDlg, TRUE);
EnableSERVICE (hDlg, TRUE);
break;
case UPS_LOWBATTERYSIGNAL:
CheckDlgButton (hDlg, IDD_UPS_LOWBATTERY, TRUE);
EnablePFSIGNAL (hDlg, FALSE);
EnableLOWBATTERY (hDlg, TRUE);
EnableCHARACTER (hDlg, FALSE);
EnableSERVICE (hDlg, FALSE);
break;
case UPS_CANTURNOFF:
CheckDlgButton (hDlg, IDD_UPS_TURNOFF, TRUE);
EnablePFSIGNAL (hDlg, FALSE);
EnableLOWBATTERY (hDlg, FALSE);
EnableCHARACTER (hDlg, FALSE);
EnableSERVICE (hDlg, FALSE);
break;
case UPS_POWERFAILSIGNAL | UPS_LOWBATTERYSIGNAL:
CheckDlgButton (hDlg, IDD_UPS_PFSIGNAL, TRUE);
CheckDlgButton (hDlg, IDD_UPS_LOWBATTERY, TRUE);
EnablePFSIGNAL (hDlg, TRUE);
EnableLOWBATTERY (hDlg, TRUE);
EnableCHARACTER (hDlg, FALSE);
EnableSERVICE (hDlg, TRUE);
break;
case UPS_POWERFAILSIGNAL | UPS_CANTURNOFF:
CheckDlgButton (hDlg, IDD_UPS_PFSIGNAL, TRUE);
CheckDlgButton (hDlg, IDD_UPS_TURNOFF, TRUE);
EnablePFSIGNAL (hDlg, TRUE);
EnableLOWBATTERY (hDlg, FALSE);
EnableCHARACTER (hDlg, TRUE);
EnableSERVICE (hDlg, TRUE);
break;
case UPS_LOWBATTERYSIGNAL | UPS_CANTURNOFF:
CheckDlgButton (hDlg, IDD_UPS_LOWBATTERY, TRUE);
CheckDlgButton (hDlg, IDD_UPS_TURNOFF, TRUE);
EnablePFSIGNAL (hDlg, FALSE);
EnableLOWBATTERY (hDlg, TRUE);
EnableCHARACTER (hDlg, FALSE);
EnableSERVICE (hDlg, FALSE);
break;
case UPS_POWERFAILSIGNAL | UPS_LOWBATTERYSIGNAL | UPS_CANTURNOFF:
CheckDlgButton (hDlg, IDD_UPS_PFSIGNAL, TRUE);
CheckDlgButton (hDlg, IDD_UPS_LOWBATTERY, TRUE);
CheckDlgButton (hDlg, IDD_UPS_TURNOFF, TRUE);
EnablePFSIGNAL (hDlg, TRUE);
EnableLOWBATTERY (hDlg, TRUE);
EnableCHARACTER (hDlg, FALSE);
EnableSERVICE (hDlg, TRUE);
break;
default: // All checkboxes in configuration groupbox are not checked.
EnablePFSIGNAL (hDlg, FALSE);
EnableLOWBATTERY (hDlg, FALSE);
EnableCHARACTER (hDlg, FALSE);
EnableSERVICE (hDlg, FALSE);
}
}
// Local function. Used by UPSDlg. and ErrorOut.
void ShowError (HWND hDlg,
DWORD dwError)
{
TCHAR szErrorMessage[LONGBZ];
if (!FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dwError,
0,
szErrorMessage,
LONGBZ,
NULL))
{
MessageBox (hDlg, szErrMem, szCtlPanel, MB_OK|MB_ICONSTOP); //szErrMem is loaded in cpl.c.
}
else
{
MessageBox (hDlg, szErrorMessage, szCtlPanel, MB_OK|MB_ICONSTOP);
}
}
// Local Function. Used by UPSDlg.
BOOL ErrorOut (HWND hDlg,
DWORD dwError,
SC_HANDLE hups,
SC_HANDLE hsc,
HKEY vhKey)
{
ShowError(hDlg, dwError);
CloseServiceHandle(hups);
CloseServiceHandle(hsc);
RegCloseKey(vhKey);
EndDialog(hDlg, 0L);
return(FALSE);
}
// Called after trying to start or stop service. Return TRUE if it gets to
// the final state. Otherwise return FALSE
BOOL FinishCheck (DWORD dwFinalState,
SERVICE_STATUS * pss,
SC_HANDLE hups)
{
int max_tries = MAXTRIES;
int i = 0;
DWORD sleep_time;
DWORD old_checkpoint = 0;
DWORD new_checkpoint = 0;
DWORD dwStartState;
DWORD dwPendingState;
if (dwFinalState == SERVICE_STOPPED)
{
dwStartState = SERVICE_RUNNING;
dwPendingState = SERVICE_STOP_PENDING;
}
else if (dwFinalState == SERVICE_RUNNING)
{
dwStartState = SERVICE_STOPPED;
dwPendingState = SERVICE_START_PENDING;
}
else
return(FALSE);
while ((pss->dwCurrentState != dwFinalState) &&
(i++ < max_tries))
{
if (!QueryServiceStatus (hups, pss))
return(FALSE);
if (pss->dwCurrentState != dwPendingState)
break;
new_checkpoint = pss->dwCheckPoint;
if (old_checkpoint != new_checkpoint)
{
sleep_time = pss->dwWaitHint;
if (sleep_time > SLEEP_TIME)
{
max_tries = ((3 * sleep_time)/SLEEP_TIME);
sleep_time = SLEEP_TIME;
i = 0;
}
}
else
sleep_time = SLEEP_TIME;
old_checkpoint = new_checkpoint;
Sleep (sleep_time);
}
if (pss->dwCurrentState != dwFinalState)
{
return(FALSE);
}
return(TRUE);
}
BOOL IsFilename (TCHAR * szFilename)
{
if (strchr (szFilename, '\\') == NULL)
return(TRUE);
else
return(FALSE);
}
BOOL IsExecutable (TCHAR * szFilename)
{
szFilename += (strlen(szFilename) -4);
if ((_strnicmp (szFilename, ".cmd", 5) == 0) ||
(_strnicmp (szFilename, ".com", 5) == 0) ||
(_strnicmp (szFilename, ".exe", 5) == 0) ||
(_strnicmp (szFilename, ".bat", 5) == 0))
{
return(TRUE);
}
else
return(FALSE);
}
//==========================================================================
// Local Data Declarations
//==========================================================================
TCHAR szUpsReg[] = "System\\CurrentControlSet\\Services\\UPS";
TCHAR szPort[] = "Port";
TCHAR szPortDefault[]= "COM1:";
TCHAR szOptions[] = "Options";
TCHAR szBatteryLife[] = "BatteryLife";
TCHAR szRechargePerMinute[] = "RechargeRate";
TCHAR szFirstWarning[] = "FirstMessageDelay";
TCHAR szWarningInterval[] = "MessageInterval";
TCHAR szCommandFile[] = "CommandFile";
TCHAR szCOM[] = "COM";
TCHAR szCOLON[] = ":";
HKEY vhKey; // handle to registry node
WNDPROC lpDefWndProc;
ARROWVSCROLL avs[4] = { { 1, -1, 5, -5, 720, 2, 12, 12 },
{ 1, -1, 5, -5, 250, 1, 30, 30 },
{ 1, -1, 5, -5, 120, 0, 30, 30 },
{ 1, -1, 4, -4, 300, 5, 0, 0 } };
LRESULT NewEditWndProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CHAR:
if ((wParam < L'0' || wParam > L'9') &&
(wParam != VK_BACK) &&
(wParam != VK_DELETE) &&
(wParam != VK_END) &&
(wParam != VK_HOME))
{
MessageBeep (0);
return TRUE;
}
default:
break;
}
return(CallWindowProc(lpDefWndProc, hDlg, message, wParam, lParam));
}
//==========================================================================
// UPSDlg is the dlgproc for ups dialog.
//==========================================================================
INT_PTR UPSDlg (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
int n;
int selection;
int num;
int focusid;
int id;
int i;
int RetVal;
int rc;
DWORD ulOptions;
DWORD ulBatteryLife;
DWORD ulRechargePerMinute;
DWORD ulFirstWarning;
DWORD ulWarningInterval;
DWORD cb;
DWORD dwStart;
DWORD dwError;
DWORD type;
TCHAR * pMemory;
TCHAR * pszKeyName;
TCHAR * pszAug;
TCHAR szTemport[PORTLEN];
TCHAR szTemp[LONGBZ];
TCHAR szFilename[PATHMAX];
TCHAR szErrorMessage[10*LONGBZ];
TCHAR szSysDir[PATHMAX];
TCHAR szNum[SHORTBZ];
TCHAR szStatus[MIDBZ];
BOOL bOK;
BOOL fUpsSelected = FALSE;
static BOOL bPFSIGNAL = FALSE;
static BOOL bLOWBATTERY = FALSE;
static BOOL bTURNOFF = FALSE;
static BOOL bFILENAME = FALSE;
SC_HANDLE hsc;
SC_HANDLE hups;
SERVICE_STATUS ss;
WIN32_FIND_DATA ffd;
HANDLE hFile;
LONG lpfnWndProc;
switch (message)
{
case WM_INITDIALOG:
HourGlass (TRUE);
// Read UPS info from registry
//rc = RegOpenKey(HKEY_LOCAL_MACHINE, szUpsReg, &vhKey);
rc = RegOpenKey(HKEY_LOCAL_MACHINE, szUpsReg, &vhKey);
if (rc == ERROR_ACCESS_DENIED)
{
MyMessageBox (hDlg, UPS_ACCESS_ERROR, CPCAPTION, MB_OK|MB_ICONSTOP);
RegCloseKey (vhKey);
EndDialog (hDlg, 0L);
return(FALSE);
}
else if (rc)
{
HourGlass (FALSE);
MyMessageBox (hDlg, UPS_REGISTRY_ERROR, CPCAPTION, MB_OK|MB_ICONSTOP);
RegCloseKey (vhKey);
EndDialog (hDlg, 0L);
return(FALSE);
}
// get UPS values
cb = sizeof(ULONG);
if (RegQueryValueEx(vhKey, szOptions, NULL, &type,
(LPTSTR)&ulOptions, &cb))
// if no data exists, UPS is not installed
ulOptions = 0;
cb = sizeof(ulOptions);
if (RegQueryValueEx(vhKey, szBatteryLife, NULL, &type,
(LPTSTR)&ulBatteryLife, &cb))
ulBatteryLife = DEFAULTBATTERYLIFE;
cb = sizeof(ulOptions);
if (RegQueryValueEx(vhKey, szRechargePerMinute, NULL, &type,
(LPTSTR)&ulRechargePerMinute, &cb))
ulRechargePerMinute = DEFAULTRECHARGEPERMINUTE;
cb = sizeof(ulOptions);
if (RegQueryValueEx(vhKey, szFirstWarning, NULL, &type,
(LPTSTR)&ulFirstWarning, &cb))
ulFirstWarning = DEFAULTFIRSTWARNING;
cb = sizeof(ulOptions);
if (RegQueryValueEx(vhKey, szWarningInterval, NULL, &type,
(LPTSTR)&ulWarningInterval, &cb))
ulWarningInterval = DEFAULTWARNINGINTERVAL;
cb = sizeof (szTemport) / sizeof (szTemport[0]);
if (RegQueryValueEx(vhKey, szPort, NULL, &type, szTemport, &cb))
szTemport[0] = 0;
cb = sizeof (szFilename) / sizeof (szFilename[0]);
if (RegQueryValueEx(vhKey, szCommandFile, NULL, &type, szFilename, &cb))
szFilename[0] = 0;
// check to see if the current user can change settings
if (RegSetValueEx(vhKey, szOptions, 0, REG_DWORD,
(LPSTR)&ulOptions, sizeof(ulOptions)) ==
ERROR_ACCESS_DENIED)
{
MyMessageBox(hDlg, UPS_ACCESS_ERROR, CPCAPTION, MB_OK|MB_ICONSTOP);
RegCloseKey (vhKey);
EndDialog (hDlg, 0L);
return(FALSE);
}
SetDlgItemText (hDlg, IDD_UPS_FILENAME, szFilename);
// Show recorded time values in registry.
_itoa (ulBatteryLife, szNum, 10);
SetDlgItemText (hDlg, IDD_UPS_BLEDIT, (LPSTR)szNum);
_itoa (ulRechargePerMinute, szNum, 10);
SetDlgItemText (hDlg, IDD_UPS_RPMEDIT, (LPSTR)szNum);
_itoa (ulFirstWarning, szNum, 10);
SetDlgItemText (hDlg, IDD_UPS_FWEDIT, (LPSTR)szNum);
_itoa (ulWarningInterval, szNum, 10);
SetDlgItemText (hDlg, IDD_UPS_WIEDIT, (LPSTR)szNum);
// Show recorded signal voltage.
CheckRadioButton(hDlg, IDD_UPS_PFSIGNALHIGH, IDD_UPS_PFSIGNALLOW,
ulOptions & UPS_POWERFAIL_LOW ?
IDD_UPS_PFSIGNALLOW : IDD_UPS_PFSIGNALHIGH);
CheckRadioButton(hDlg, IDD_UPS_LOWBATTERYHIGH, IDD_UPS_LOWBATTERYLOW,
ulOptions & UPS_LOWBATTERY_LOW ?
IDD_UPS_LOWBATTERYLOW : IDD_UPS_LOWBATTERYHIGH);
CheckRadioButton(hDlg, IDD_UPS_TURNOFFHIGH, IDD_UPS_TURNOFFLOW,
ulOptions & UPS_TURNOFF_LOW ?
IDD_UPS_TURNOFFLOW : IDD_UPS_TURNOFFHIGH);
// Show port names from WIN.INI [ports] section
SendDlgItemMessage (hDlg, IDD_UPS_PORTCB, CB_RESETCONTENT, 0, 0L);
if (!(pszKeyName = pMemory = AllocMem(KEYBZ)))
{
MessageBox (hDlg, szErrMem, szCtlPanel, MB_OK|MB_ICONSTOP);
RegCloseKey (vhKey);
EndDialog (hDlg, 0L);
return(FALSE);
}
GetProfileString ("ports", NULL, (LPSTR) szPortDefault, (LPSTR) pszKeyName, KEYBZ);
n = selection = 0;
while (*pszKeyName)
{
// Check if the string is COM?:
if ((_strnicmp (pszKeyName, szCOM, 3) == 0) &&
(isdigit (*(pszKeyName + 3))) &&
(_strnicmp (pszKeyName + 4, szCOLON, 1) == 0))
{
SendDlgItemMessage(hDlg, IDD_UPS_PORTCB, CB_INSERTSTRING,
(WPARAM)-1, (LPARAM)pszKeyName);
if (!strcmp (pszKeyName, szTemport))
selection = n;
n++;
}
SendMessage (GetDlgItem(hDlg, IDD_UPS_PORTCB),
CB_SETCURSEL, selection, 0L);
/* Point to next string in buffer */
pszKeyName += strlen (pszKeyName) + sizeof(TCHAR);
}
FreeMem(pMemory, KEYBZ);
// Display other fields properly.
if (ulOptions & UPS_INSTALLED)
{
CheckDlgButton (hDlg, IDD_UPS_EXISTS, TRUE);
EnableCONFIG (hDlg, TRUE);
// MASK gets the choice in configuration groupbox.
Show (hDlg, ulOptions & MASK);
// Enable command file selection?
if (ulOptions & UPS_COMMANDFILE)
{
CheckDlgButton (hDlg, IDD_UPS_COMMANDFILE, TRUE);
EnableFILENAME (hDlg, TRUE);
}
else
EnableFILENAME (hDlg, FALSE);
}
// Set the ranges of the edit fields
SendMessage(GetDlgItem(hDlg, IDD_UPS_FILENAME),
EM_LIMITTEXT,
PATHMAX-1,
0L);
SendMessage(GetDlgItem(hDlg, IDD_UPS_BLEDIT),
EM_LIMITTEXT,
3,
0L);
SendMessage(GetDlgItem(hDlg, IDD_UPS_RPMEDIT),
EM_LIMITTEXT,
3,
0L);
SendMessage(GetDlgItem(hDlg, IDD_UPS_FWEDIT),
EM_LIMITTEXT,
3,
0L);
SendMessage(GetDlgItem(hDlg, IDD_UPS_WIEDIT),
EM_LIMITTEXT,
3,
0L);
// Change the window proc of the edit fields.
lpDefWndProc = (WNDPROC)GetWindowLongPtr(GetDlgItem(hDlg, IDD_UPS_BLEDIT),
GWLP_WNDPROC);
SetWindowLongPtr (GetDlgItem(hDlg, IDD_UPS_BLEDIT),
GWLP_WNDPROC,
(LONG_PTR)NewEditWndProc);
SetWindowLongPtr (GetDlgItem(hDlg, IDD_UPS_RPMEDIT),
GWLP_WNDPROC,
(LONG_PTR)NewEditWndProc);
SetWindowLongPtr (GetDlgItem(hDlg, IDD_UPS_FWEDIT),
GWLP_WNDPROC,
(LONG_PTR)NewEditWndProc);
SetWindowLongPtr (GetDlgItem(hDlg, IDD_UPS_WIEDIT),
GWLP_WNDPROC,
(LONG_PTR)NewEditWndProc);
if (!(ulOptions & UPS_INSTALLED))
{
EnableCONFIG (hDlg, FALSE);
EnablePFSIGNAL (hDlg, FALSE);
EnableLOWBATTERY (hDlg, FALSE);
EnableCHARACTER (hDlg, FALSE);
EnableSERVICE (hDlg, FALSE);
EnableFILENAME (hDlg, FALSE);
EnableWindow (GetDlgItem (hDlg, IDD_UPS_SIGN), FALSE);
}
HourGlass (FALSE);
break;
case WM_VSCROLL:
focusid = GetWindowLong(GetFocus(), GWL_ID);
switch (HIWORD(wParam))
{
case IDD_UPS_BATTERYLIFE:
id = IDD_UPS_BLEDIT;
i = 0;
break;
case IDD_UPS_RECHARGEPERMINUTE:
id = IDD_UPS_RPMEDIT;
i = 1;
break;
case IDD_UPS_FIRSTWARNING:
id = IDD_UPS_FWEDIT;
i = 2;
break;
case IDD_UPS_WARNINGINTERVAL:
id = IDD_UPS_WIEDIT;
i = 3;
break;
default:
return (FALSE);
}
if (focusid != id)
SetFocus(GetDlgItem(hDlg, id));
switch(LOWORD(wParam))
{
case SB_THUMBTRACK:
case SB_ENDSCROLL:
return (TRUE);
break;
default:
num = GetDlgItemInt (hDlg, id, &bOK, FALSE);
num = ArrowVScrollProc (LOWORD(wParam), (short)num,
(LPARROWVSCROLL) (avs + i));
_itoa (num, szNum, 10);
SetDlgItemText (hDlg, id, (LPSTR)szNum);
SendDlgItemMessage (hDlg, id, EM_SETSEL, 0, -1L);
break;
}
break;
case WM_COMMAND:
// Initialize ulOptions to 0 in order to avoid side effect.
ulOptions = 0;
switch (LOWORD(wParam))
{
case IDD_UPS_EXISTS:
// Enable/Disable UPS options controls.
if (!IsDlgButtonChecked (hDlg, IDD_UPS_EXISTS))
{
if (IsDlgButtonChecked (hDlg, IDD_UPS_PFSIGNAL))
{
bPFSIGNAL = TRUE;
}
if (IsDlgButtonChecked (hDlg, IDD_UPS_LOWBATTERY))
{
bLOWBATTERY = TRUE;
}
if (IsDlgButtonChecked (hDlg, IDD_UPS_TURNOFF))
{
bTURNOFF = TRUE;
}
if (IsDlgButtonChecked (hDlg, IDD_UPS_COMMANDFILE))
{
bFILENAME = TRUE;
}
SendMessage (GetDlgItem (hDlg, IDD_UPS_PFSIGNAL), BM_SETCHECK, FALSE, 0L);
SendMessage (GetDlgItem (hDlg, IDD_UPS_LOWBATTERY), BM_SETCHECK, FALSE, 0L);
SendMessage (GetDlgItem (hDlg, IDD_UPS_TURNOFF), BM_SETCHECK, FALSE, 0L);
SendMessage (GetDlgItem (hDlg, IDD_UPS_COMMANDFILE), BM_SETCHECK, FALSE, 0L);
EnableCONFIG (hDlg, FALSE);
EnablePFSIGNAL (hDlg, FALSE);
EnableLOWBATTERY (hDlg, FALSE);
EnableCHARACTER (hDlg, FALSE);
EnableSERVICE (hDlg, FALSE);
EnableFILENAME (hDlg, FALSE);
}
else
{
EnableCONFIG (hDlg, TRUE);
if (bPFSIGNAL)
{
ulOptions |= UPS_POWERFAILSIGNAL;
}
if (bLOWBATTERY)
{
ulOptions |= UPS_LOWBATTERYSIGNAL;
}
if (bTURNOFF)
{
ulOptions |= UPS_CANTURNOFF;
}
Show (hDlg, (ulOptions & MASK));
CheckDlgButton (hDlg, IDD_UPS_COMMANDFILE, bFILENAME);
EnableFILENAME (hDlg, bFILENAME);
}
break;
case IDD_UPS_PFSIGNAL:
case IDD_UPS_LOWBATTERY:
case IDD_UPS_TURNOFF:
// Show the config properly.
if (IsDlgButtonChecked (hDlg, IDD_UPS_PFSIGNAL))
{
bPFSIGNAL = TRUE;
ulOptions |= UPS_POWERFAILSIGNAL;
}
else
bPFSIGNAL = FALSE;
if (IsDlgButtonChecked (hDlg, IDD_UPS_LOWBATTERY))
{
bLOWBATTERY = TRUE;
ulOptions |= UPS_LOWBATTERYSIGNAL;
}
else
bLOWBATTERY = FALSE;
if (IsDlgButtonChecked (hDlg, IDD_UPS_TURNOFF))
{
bTURNOFF = TRUE;
ulOptions |= UPS_CANTURNOFF;
}
else
bTURNOFF = FALSE;
Show (hDlg, (ulOptions & MASK));
break;
case IDD_UPS_COMMANDFILE:
if (IsDlgButtonChecked (hDlg, IDD_UPS_COMMANDFILE))
{
bFILENAME = TRUE;
ulOptions |= UPS_COMMANDFILE;
EnableFILENAME (hDlg, TRUE);
}
else
{
bFILENAME = FALSE;
EnableFILENAME (hDlg, FALSE);
}
break;
case IDD_UPS_PFSIGNALHIGH:
case IDD_UPS_PFSIGNALLOW:
case IDD_UPS_LOWBATTERYHIGH:
case IDD_UPS_LOWBATTERYLOW:
case IDD_UPS_TURNOFFHIGH:
case IDD_UPS_TURNOFFLOW:
case IDD_UPS_BATTERYLIFE:
case IDD_UPS_RECHARGEPERMINUTE:
case IDD_UPS_FIRSTWARNING:
case IDD_UPS_WARNINGINTERVAL:
break;
case IDOK:
ulOptions = 0;
HourGlass (TRUE);
// Get the current status of UPS service.
if (!(hsc = OpenSCManager(NULL, NULL, GENERIC_ALL)) ||
!(hups = OpenService(hsc, "UPS", GENERIC_ALL)) ||
!(QueryServiceStatus(hups, &ss)) )
{
dwError = GetLastError();
return( ErrorOut (hDlg, dwError, hups, hsc, vhKey));
}
// Check whether the parameters are set correctly.
if (IsDlgButtonChecked (hDlg, IDD_UPS_EXISTS)) // If UPS is selected.
{
// If neither Power failure signal nor Low battery signal is select,
// popup a message box to tell the use to select one.
if (!(IsDlgButtonChecked (hDlg, IDD_UPS_PFSIGNAL)) &&
!(IsDlgButtonChecked (hDlg, IDD_UPS_LOWBATTERY)))
{
MyMessageBox(hDlg, UPS_OPTIONS_ERROR, CPCAPTION, MB_OK|MB_ICONSTOP);
break;
}
}
else // If UPS is not selected set static variable bPFSIGNAL etc to 0.
{
bPFSIGNAL = FALSE;
bLOWBATTERY = FALSE;
bTURNOFF = FALSE;
bFILENAME = FALSE;
}
//Get ulOptions
if (IsDlgButtonChecked (hDlg, IDD_UPS_PFSIGNAL))
ulOptions |= UPS_POWERFAILSIGNAL;
if (IsDlgButtonChecked (hDlg, IDD_UPS_LOWBATTERY))
ulOptions |= UPS_LOWBATTERYSIGNAL;
if (IsDlgButtonChecked (hDlg, IDD_UPS_TURNOFF))
ulOptions |= UPS_CANTURNOFF;
if (IsDlgButtonChecked (hDlg, IDD_UPS_PFSIGNALLOW))
ulOptions |= UPS_POWERFAIL_LOW;
if (IsDlgButtonChecked (hDlg, IDD_UPS_LOWBATTERYLOW))
ulOptions |= UPS_LOWBATTERY_LOW;
if (IsDlgButtonChecked (hDlg, IDD_UPS_TURNOFFLOW))
ulOptions |= UPS_TURNOFF_LOW;
if (IsDlgButtonChecked (hDlg, IDD_UPS_COMMANDFILE))
ulOptions |= UPS_COMMANDFILE;
fUpsSelected = IsDlgButtonChecked (hDlg, IDD_UPS_EXISTS);
if (fUpsSelected)
{
ulOptions |= UPS_INSTALLED;
}
//Get the UPS parameters
GetDlgItemText(hDlg, IDD_UPS_PORTCB, szTemport, PORTLEN);
GetDlgItemText(hDlg, IDD_UPS_FWEDIT, szNum, 10);
ulFirstWarning = atoi(szNum);
GetDlgItemText(hDlg, IDD_UPS_WIEDIT, szNum, 10);
ulWarningInterval = atoi(szNum);
GetDlgItemText(hDlg, IDD_UPS_BLEDIT, szNum, 10);
ulBatteryLife = atoi(szNum);
GetDlgItemText(hDlg, IDD_UPS_RPMEDIT, szNum, 10);
ulRechargePerMinute = atoi(szNum);
if (fUpsSelected && (ulOptions & UPS_POWERFAILSIGNAL))
{
// Give warning if ulFirstWarning is not in the valid range.
if ((ulFirstWarning < (ULONG) avs[2].bottom) | (ulFirstWarning > (ULONG) avs[2].top))
{
MyMessageBox (hDlg, UPS_FWRange, CPCAPTION, MB_OK|MB_ICONSTOP);
SetFocus (GetDlgItem (hDlg, IDD_UPS_FWEDIT));
SendMessage(GetDlgItem (hDlg, IDD_UPS_FWEDIT),
EM_SETSEL,
0,
-1L);
break;
}
// Give warning if ulWarningInterval is not in the valid range.
if ((ulWarningInterval < (ULONG) avs[3].bottom) | (ulWarningInterval > (ULONG) avs[3].top))
{
MyMessageBox (hDlg, UPS_WIRange, CPCAPTION, MB_OK|MB_ICONSTOP);
SetFocus (GetDlgItem (hDlg, IDD_UPS_WIEDIT));
SendMessage(GetDlgItem (hDlg, IDD_UPS_WIEDIT),
EM_SETSEL,
0,
-1L);
break;
}
}
if (fUpsSelected &&
(ulOptions & UPS_POWERFAILSIGNAL) &&
!(ulOptions & UPS_LOWBATTERYSIGNAL))
{
// Give warning if ulBatteryLife is not in the valid range.
if ((ulBatteryLife < (ULONG) avs[0].bottom) | (ulBatteryLife > (ULONG) avs[0].top))
{
MyMessageBox (hDlg, UPS_BLRange, CPCAPTION, MB_OK|MB_ICONSTOP);
SetFocus (GetDlgItem (hDlg, IDD_UPS_BLEDIT));
SendMessage(GetDlgItem (hDlg, IDD_UPS_BLEDIT),
EM_SETSEL,
0,
-1L);
break;
}
// Give warning if ulRechargePerMinute is not in the valid range.
if ((ulRechargePerMinute < (ULONG) avs[1].bottom) | (ulRechargePerMinute > (ULONG) avs[1].top))
{
MyMessageBox (hDlg, UPS_RPMRange, CPCAPTION, MB_OK|MB_ICONSTOP);
SetFocus (GetDlgItem (hDlg, IDD_UPS_RPMEDIT));
SendMessage(GetDlgItem (hDlg, IDD_UPS_RPMEDIT),
EM_SETSEL,
0,
-1L);
break;
}
// Give warning if set first warning comes later then battery life.
if (ulFirstWarning > ulBatteryLife * 60)
{
MyMessageBox(hDlg, UPS_FW_WARNING, CPCAPTION, MB_OK|MB_ICONSTOP);
SetFocus (GetDlgItem (hDlg, IDD_UPS_FWEDIT));
SendMessage(GetDlgItem (hDlg, IDD_UPS_FWEDIT),
EM_SETSEL,
0,
-1L);
break;
}
// Give warning if set warning interval time longer than battery life.
if (ulWarningInterval > ulBatteryLife * 60)
{
MyMessageBox(hDlg, UPS_DELAY_WARNING, CPCAPTION, MB_OK|MB_ICONSTOP);
SetFocus (GetDlgItem (hDlg, IDD_UPS_WIEDIT));
SendMessage(GetDlgItem (hDlg, IDD_UPS_WIEDIT),
EM_SETSEL,
0,
-1L);
break;
}
}
if (fUpsSelected && (ulOptions & UPS_COMMANDFILE))
{
GetDlgItemText(hDlg, IDD_UPS_FILENAME, szFilename, PATHMAX);
if (!IsFilename (szFilename))
{
MyMessageBox(hDlg, UPS_INVALID_PATH, CPCAPTION, MB_OK|MB_ICONSTOP);
SetFocus (GetDlgItem (hDlg, IDD_UPS_FILENAME));
SendMessage(GetDlgItem (hDlg, IDD_UPS_FILENAME),
EM_SETSEL,
0,
-1L);
break;
}
if (!IsExecutable (szFilename))
{
MyMessageBox(hDlg, UPS_INVALID_FILENAME, CPCAPTION, MB_OK|MB_ICONSTOP);
SetFocus (GetDlgItem (hDlg, IDD_UPS_FILENAME));
SendMessage(GetDlgItem (hDlg, IDD_UPS_FILENAME),
EM_SETSEL,
0,
-1L);
break;
}
// Check if the file is in the system directory.
n = GetSystemDirectory(szSysDir, PATHMAX);
if ((n == 0) || (n > PATHMAX))
{
MyMessageBox(hDlg, UPS_CANT_FIND_SYSDIR, CPCAPTION, MB_OK|MB_ICONSTOP);
break;
}
else
{
strcpy (szTemp, szSysDir);
strcat (szTemp, "\\");
strcat (szTemp, szFilename);
hFile = FindFirstFile (szTemp, &ffd);
if (hFile == INVALID_HANDLE_VALUE)
{
if (!LoadString (hModule, UPS_FILE_NOT_EXIST, szTemp, sizeof(szTemp)))
{
ErrLoadString (hDlg);
break;
}
pszAug = szSysDir;
if (!FormatMessage (FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY,
szTemp,
0,
0,
szErrorMessage,
LONGBZ,
(va_list *)&(pszAug)))
{
ShowError (hDlg, GetLastError());
}
else
{
MessageBox (hDlg, szErrorMessage, szCtlPanel, MB_OK|MB_ICONSTOP);
}
SetFocus (GetDlgItem (hDlg, IDD_UPS_FILENAME));
SendMessage(GetDlgItem (hDlg, IDD_UPS_FILENAME),
EM_SETSEL,
0,
-1L);
break;
}
else
{
FindClose (hFile);
}
}
RegSetValueEx(vhKey, szCommandFile, 0, REG_SZ, szFilename, (strlen(szFilename)+1));
}
// Write the configuration to registry.
RegSetValueEx(vhKey, szPort, 0, REG_SZ, szTemport, (strlen(szTemport)+1));
RegSetValueEx(vhKey, szOptions, 0, REG_DWORD,
(LPSTR)&ulOptions, sizeof(ulOptions));
RegSetValueEx(vhKey, szBatteryLife, 0, REG_DWORD,
(LPSTR)&ulBatteryLife, sizeof(ulBatteryLife));
RegSetValueEx(vhKey, szRechargePerMinute, 0, REG_DWORD,
(LPSTR)&ulRechargePerMinute, sizeof(ulRechargePerMinute));
RegSetValueEx(vhKey, szFirstWarning, 0, REG_DWORD,
(LPSTR)&ulFirstWarning, sizeof(ulFirstWarning));
RegSetValueEx(vhKey, szWarningInterval, 0, REG_DWORD,
(LPSTR)&ulWarningInterval, sizeof(ulWarningInterval));
// Start or stop the service according to user's choice.
// If user select UPS, and the service is not running, start it.
if (ss.dwCurrentState == SERVICE_STOPPED && fUpsSelected)
{
RetVal = MyMessageBox (hDlg, UPS_START_MSG, CPCAPTION, MB_YESNOCANCEL|MB_ICONINFORMATION);
if (RetVal == IDCANCEL)
{
break;
}
if (RetVal == IDYES)
{
if (!StartService (hups, 0, NULL))
{
dwError = GetLastError();
return (ErrorOut (hDlg, dwError, hups, hsc, vhKey));
}
if (!FinishCheck (SERVICE_RUNNING, &ss, hups))
{
if (MyMessageBox (hDlg, UPS_STARTFAIL_MSG, CPCAPTION, MB_OKCANCEL|MB_ICONSTOP)
== IDOK)
{
break;
}
}
}
}
// If the service is running, stop it first.
else if ((ss.dwCurrentState == SERVICE_RUNNING) ||
(ss.dwCurrentState == SERVICE_PAUSED))
{
RetVal = MyMessageBox (hDlg,
fUpsSelected? UPS_RESTART_MSG: UPS_STOP_MSG,
CPCAPTION,
MB_YESNOCANCEL|MB_ICONINFORMATION);
if (RetVal == IDCANCEL)
{
break;
}
if (RetVal == IDYES)
{
// Stop the service first.
if (!ControlService (hups, SERVICE_CONTROL_STOP, &ss))
{
dwError = GetLastError();
return( ErrorOut (hDlg, dwError, hups, hsc, vhKey));
}
if (!FinishCheck (SERVICE_STOPPED, &ss, hups))
{
if (MyMessageBox (hDlg, UPS_STOPFAIL_MSG, CPCAPTION, MB_OKCANCEL|MB_ICONSTOP)
== IDCANCEL)
{
break;
}
else
fUpsSelected = FALSE; // For error break out.
}
// If user selected UPS, start it again. Otherwise exit.
if (fUpsSelected)
{
if (!StartService (hups, 0, NULL))
{
dwError = GetLastError();
return (ErrorOut (hDlg, dwError, hups, hsc, vhKey));
}
if (!FinishCheck (SERVICE_RUNNING, &ss, hups))
{
if (MyMessageBox (hDlg, UPS_STARTFAIL_MSG, CPCAPTION, MB_OKCANCEL|MB_ICONSTOP)
== IDOK)
{
break;
}
}
}
}
}
// If the service is in pending state. ask user to use Services applet.
else if ((ss.dwCurrentState == SERVICE_START_PENDING) ||
(ss.dwCurrentState == SERVICE_STOP_PENDING) ||
(ss.dwCurrentState == SERVICE_CONTINUE_PENDING) ||
(ss.dwCurrentState == SERVICE_PAUSE_PENDING))
{
if (MyMessageBox (hDlg, UPS_PENDING_MSG, CPCAPTION, MB_OKCANCEL|MB_ICONSTOP)
== IDCANCEL)
break;
}
// If the service in Unknow state, report error.
else
MyMessageBox (hDlg, UPS_UNKNOWNSTATE_MSG, CPCAPTION, MB_OK|MB_ICONSTOP);
// Set UPS service to be auto start if the UPS installed box is checked.
// Set UPS service to be manual start if the installed box is not checked.
dwStart = fUpsSelected? SERVICE_AUTO_START : SERVICE_DEMAND_START;
if (!ChangeServiceConfig (hups,
SERVICE_NO_CHANGE,
dwStart,
SERVICE_ERROR_NORMAL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL))
{
dwError = GetLastError();
return (ErrorOut (hDlg, dwError, hups, hsc, vhKey));
}
// Close opened services handles.
CloseServiceHandle(hups);
CloseServiceHandle(hsc);
// Close registry handle and exit dialog.
RegCloseKey(vhKey);
EndDialog (hDlg, 0L);
break;
case IDCANCEL:
RegCloseKey(vhKey);
EndDialog (hDlg, 0L);
break;
case IDD_HELP:
CPHelp(hDlg);
break;
default:
break;
}
break;
default:
if (message == wHelpMessage)
{
CPHelp(hDlg);
}
else
return FALSE;
break;
}
return(TRUE);
}
// Turn hourglass on or off
void HourGlass (BOOL bOn)
{
if (!GetSystemMetrics(SM_MOUSEPRESENT))
ShowCursor(bOn);
SetCursor(LoadCursor(NULL, bOn ? IDC_WAIT : IDC_ARROW));
}