windows-nt/Source/XPSP1/NT/printscan/fax/config/dll/devstat.c
2020-09-26 16:20:57 +08:00

597 lines
11 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
devstat.c
Abstract:
Functions for handling events in the "Device Status" tab of
the fax server configuration property sheet
Environment:
Fax configuration applet
Revision History:
03/13/96 -davidx-
Created it.
mm/dd/yy -author-
description
--*/
#include "faxcpl.h"
//
// Information about the fax device list view on "Send Options" page
//
static COLUMNINFO faxDeviceListViewColumnInfo[] = {
{ COLUMN_DEVICE_NAME, 2 },
{ COLUMN_STATUS, 1 },
{ 0, 0 },
};
VOID
DoActivateDeviceStatus(
HWND hDlg
)
/*++
Routine Description:
Called when the "Device Status" property page is activated
Arguments:
hDlg - Window handle to the "Device Status" property page
Return Value:
NONE
--*/
{
HWND hwndLV;
//
// Reinitialize the fax device list view if necessary
//
if (!IsFaxDeviceListInSync(DEVICE_STATUS_PAGE) &&
(hwndLV = GetDlgItem(hDlg, IDC_FAX_DEVICE_LIST)))
{
InitFaxDeviceListView(hwndLV, 0, faxDeviceListViewColumnInfo);
}
SetFaxDeviceListInSync(DEVICE_STATUS_PAGE);
}
VOID
DoRefreshDevStatus(
HWND hDlg
)
/*++
Routine Description:
Refresh the fax device list on "Device Status" property page
Arguments:
hDlg - Window handle to the "Device Status" property page
Return Value:
NONE
--*/
{
PFAX_PORT_INFO pFaxPortInfo, pSaved;
DWORD cPorts;
INT index;
//
// Talk with the fax service to get the current status of each device
//
if (gConfigData->hFaxSvc &&
(pSaved = pFaxPortInfo = FaxSvcEnumPorts(gConfigData->hFaxSvc, &cPorts)))
{
for (index=0; index < gConfigData->cDevices; index++)
gConfigData->pDevInfo[index].State = FPS_UNAVAILABLE;
for ( ; cPorts--; pFaxPortInfo++) {
for (index=0; index < gConfigData->cDevices; index++) {
if (gConfigData->pDevInfo[index].DeviceId == pFaxPortInfo->DeviceId) {
gConfigData->pDevInfo[index].State = pFaxPortInfo->State;
break;
}
}
}
//
// Redisplay the fax device status
//
FaxFreeBuffer(pSaved);
UpdateFaxDeviceListViewColumns(GetDlgItem(hDlg, IDC_FAX_DEVICE_LIST),
faxDeviceListViewColumnInfo,
1);
}
}
VOID
SetTimeField(
HWND hwnd,
PFILETIME pFileTime
)
/*++
Routine Description:
Display the specified time value in a text field
Arguments:
hwnd - Window handle to the text field
pFileTime - Time value to be displayed
Return Value:
NONE
--*/
{
SYSTEMTIME systemTime;
TCHAR timeString[64];
if (! FileTimeToSystemTime(pFileTime, &systemTime) ||
! GetTimeFormat(LOCALE_USER_DEFAULT, 0, &systemTime, NULL, timeString, 64))
{
Error(("Bad time value: error = %d\n", GetLastError()));
timeString[0] = NUL;
}
SetWindowText(hwnd, timeString);
}
BOOL CALLBACK
SendStatusProc(
HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
/*++
Routine Description:
Dialog procedure for displaying send device status dialog
Arguments:
hDlg - Handle to dialog window
uMsg - Message
wParam, lParam - Parameters
Return Value:
Depends on message
--*/
#define SetStatusTextField(hDlg, idc, p) \
SetDlgItemText(hDlg, idc, (p) ? (p) : TEXT(""))
{
PFAX_DEVICE_STATUS pDevStatus;
switch (uMsg) {
case WM_INITDIALOG:
pDevStatus = (PFAX_DEVICE_STATUS) lParam;
if (pDevStatus == NULL || pDevStatus->SizeOfStruct != sizeof(FAX_DEVICE_STATUS)) {
Error(("Corrupted FAX_DEVICE_STATUS structure\n"));
return TRUE;
}
SetStatusTextField(hDlg, IDC_DEVSTAT_DEVICE, pDevStatus->DeviceName);
SetStatusTextField(hDlg, IDC_DEVSTAT_SENDER, pDevStatus->SenderName);
SetStatusTextField(hDlg, IDC_DEVSTAT_DOCUMENT, pDevStatus->DocumentName);
SetStatusTextField(hDlg, IDC_DEVSTAT_TO, pDevStatus->RecipientName);
SetStatusTextField(hDlg, IDC_DEVSTAT_FAXNUMBER, pDevStatus->PhoneNumber);
SetDlgItemInt(hDlg, IDC_DEVSTAT_TOTAL_BYTES, pDevStatus->Size, FALSE);
SetDlgItemInt(hDlg, IDC_DEVSTAT_CURRENT_PAGE, pDevStatus->CurrentPage, FALSE);
SetDlgItemInt(hDlg, IDC_DEVSTAT_TOTAL_PAGES, pDevStatus->TotalPages, FALSE);
//
// Start time and submitted time
//
SetTimeField(GetDlgItem(hDlg, IDC_DEVSTAT_STARTEDAT),
&pDevStatus->StartTime);
SetTimeField(GetDlgItem(hDlg, IDC_DEVSTAT_SUBMITTEDAT),
&pDevStatus->SubmittedTime);
//
// Status string
//
if (pDevStatus->Status == 0) {
SetStatusTextField(hDlg, IDC_DEVSTAT_STATUS, pDevStatus->StatusString);
} else {
LPTSTR pStatusString;
pStatusString = MakeDeviceStatusString(pDevStatus->Status);
SetStatusTextField(hDlg, IDC_DEVSTAT_STATUS, pStatusString);
MemFree(pStatusString);
}
return TRUE;
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
case IDOK:
case IDCANCEL:
EndDialog(hDlg, IDCANCEL);
return TRUE;
}
break;
}
return FALSE;
}
BOOL CALLBACK
ReceiveStatusProc(
HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
/*++
Routine Description:
Dialog procedure for displaying receive device status dialog
Arguments:
hDlg - Handle to dialog window
uMsg - Message
wParam, lParam - Parameters
Return Value:
Depends on message
--*/
{
PFAX_DEVICE_STATUS pDevStatus;
switch (uMsg) {
case WM_INITDIALOG:
pDevStatus = (PFAX_DEVICE_STATUS) lParam;
if (pDevStatus == NULL || pDevStatus->SizeOfStruct != sizeof(FAX_DEVICE_STATUS)) {
Error(("Corrupted FAX_DEVICE_STATUS structure\n"));
return TRUE;
}
SetStatusTextField(hDlg, IDC_DEVSTAT_DEVICE, pDevStatus->DeviceName);
SetStatusTextField(hDlg, IDC_DEVSTAT_SENDER, pDevStatus->Tsid);
SetStatusTextField(hDlg, IDC_DEVSTAT_TO, pDevStatus->Csid);
//
// Start time
//
SetTimeField(GetDlgItem(hDlg, IDC_DEVSTAT_STARTEDAT),
&pDevStatus->StartTime);
//
// Status string
//
if (pDevStatus->Status == 0) {
SetStatusTextField(hDlg, IDC_DEVSTAT_STATUS, pDevStatus->StatusString);
} else {
LPTSTR pStatusString;
pStatusString = MakeDeviceStatusString(pDevStatus->Status);
SetStatusTextField(hDlg, IDC_DEVSTAT_STATUS, pStatusString);
MemFree(pStatusString);
}
return TRUE;
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
case IDOK:
case IDCANCEL:
EndDialog(hDlg, IDCANCEL);
return TRUE;
}
break;
}
return FALSE;
}
VOID
DoShowStatusDetails(
HWND hDlg
)
/*++
Routine Description:
Display detailed status of the currently selected fax device
Arguments:
hDlg - Window handle to the "Device Status" property page
Return Value:
NONE
--*/
{
HWND hwndLV;
INT index;
PFAX_DEVICE_STATUS pDevStatus = NULL;
//
// Get the index of the currently selected item and
// count the total number of items in the list view
//
if ((hwndLV = GetDlgItem(hDlg, IDC_FAX_DEVICE_LIST)) == NULL ||
(index = ListView_GetNextItem(hwndLV, -1, LVNI_ALL|LVNI_SELECTED)) < 0 ||
(index >= gConfigData->cDevices))
{
return;
}
//
// Call the fax service to get the status of the specified device
//
pDevStatus = FaxSvcGetDeviceStatus(gConfigData->hFaxSvc, gConfigData->pDevInfo[index].DeviceId);
if (pDevStatus == NULL) {
DisplayMessageDialog(hDlg,
0,
0,
IDS_DEVICE_STATUS_ERROR,
gConfigData->pDevInfo[index].DeviceName);
FaxFreeBuffer(pDevStatus);
return;
}
//
// Display appropriate status dialog depending on the current job type
//
switch (pDevStatus->JobType) {
case JT_SEND:
DialogBoxParam(ghInstance,
MAKEINTRESOURCE(IDD_SEND_STATUS),
hDlg,
SendStatusProc,
(LPARAM) pDevStatus);
break;
case JT_RECEIVE:
DialogBoxParam(ghInstance,
MAKEINTRESOURCE(IDD_RECEIVE_STATUS),
hDlg,
ReceiveStatusProc,
(LPARAM) pDevStatus);
break;
default:
if (pDevStatus->JobType != 0)
Error(("Unknown job type: %d\n", pDevStatus->JobType));
DisplayMessageDialog(hDlg,
MB_OK | MB_ICONINFORMATION,
IDS_DEVICE_STATUS,
IDS_DEVICE_STATUS_IDLE,
gConfigData->pDevInfo[index].DeviceName);
break;
}
FaxFreeBuffer(pDevStatus);
}
VOID
HandleDevStatusListViewMessage(
HWND hDlg,
LPNMHDR pNMHdr
)
/*++
Routine Description:
Handle notification events from the fax device list
Arguments:
hDlg - Window handle to the "Device Status" property page
pNMHdr - Points to an NMHDR structure
Return Value:
NONE
--*/
{
HWND hwndLV = pNMHdr->hwndFrom;
switch (pNMHdr->code) {
case LVN_KEYDOWN:
if (((LV_KEYDOWN *) pNMHdr)->wVKey != VK_RETURN)
break;
case NM_DBLCLK:
DoShowStatusDetails(hDlg);
break;
}
}
BOOL
DeviceStatusProc(
HWND hDlg,
UINT message,
UINT wParam,
LONG lParam
)
/*++
Routine Description:
Procedure for handling the "Device Status" 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 pNMHdr;
switch (message) {
case WM_INITDIALOG:
GetFaxDeviceAndConfigInfo();
return TRUE;
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
case IDC_REFRESH:
DoRefreshDevStatus(hDlg);
return TRUE;
case IDC_DETAILS:
DoShowStatusDetails(hDlg);
break;
}
break;
case WM_NOTIFY:
pNMHdr = (NMHDR *) lParam;
if (pNMHdr->hwndFrom == GetDlgItem(hDlg, IDC_FAX_DEVICE_LIST)) {
HandleDevStatusListViewMessage(hDlg, pNMHdr);
} else switch (pNMHdr->code) {
case PSN_SETACTIVE:
DoActivateDeviceStatus(hDlg);
break;
case PSN_APPLY:
return PSNRET_NOERROR;
}
break;
case WM_HELP:
case WM_CONTEXTMENU:
return HandleHelpPopup(hDlg, message, wParam, lParam, DEVICE_STATUS_PAGE);
}
return FALSE;
}