mirror of https://github.com/tongzx/nt5src
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.
596 lines
11 KiB
596 lines
11 KiB
/*++
|
|
|
|
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;
|
|
}
|
|
|