Leaked source code of windows server 2003
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.
 
 
 
 
 
 

402 lines
12 KiB

/*****************************************************************************
*
* $Workfile: Status.cpp $
*
* Copyright (C) 1997 Hewlett-Packard Company.
* Copyright (C) 1997 Microsoft Corporation.
* All rights reserved.
*
* 11311 Chinden Blvd.
* Boise, Idaho 83714
*
*****************************************************************************/
#include "precomp.h"
#include "snmpmgr.h"
#include "stdoids.h"
#include "status.h"
/********************************************************
status notes:
1. ASYNCH_NETWORK_ERROR handled by calling function,
GetObjectSNMP() located in snmp.c
*********************************************************/
//constants==============================================
#define NA 0
#define OTHER_ALERTS MAX_ASYNCH_STATUS+1
#define WARNING_ALERTS MAX_ASYNCH_STATUS+2
#define CRITICAL_ALERTS MAX_ASYNCH_STATUS+3
//hrPrinterDetectedErrorState Masks
#define LOW_PAPER 0x00000080
#define NO_PAPER 0x00000040
#define LOW_TONER 0x00000020
#define NO_TONER 0x00000010
#define DOOR_OPEN 0x00000008
#define PAPER_JAM 0x00000004
#define OFF_LINE 0x00000002
#define SERVICE_REQUESTED 0x00000001
//subunit status
#define AVAIL_IDLE 0L //available and idle
#define AVAIL_STDBY 2L //available and in standby
#define AVAIL_ACTIVE 4L //available and active
#define AVAIL_BUSY 6L
#define UNAVAIL_ONREQ 1L //unavailable and on-request
#define UNAVAIL_BROKEN 3L //unavailable because broken
#define AVAIL_UNKNOWN 5L
#define NON_CRITICAL_ALERT 8L
#define CRITICAL_ALERT 16L
#define OFF_LINEx 32L
#define TRANS 64L //transitioning to intended state
#define NUM_TRAYS 2
/*************
Printer hrDeviceStatus hrPrinterStatus hrPrinterDetectedErrorState
Status
Normal running(2) idle(3) none set
Busy/ running(2) printing(4)
Temporarily
Unavailable
Non Critical warning(3) idle(3) or could be: lowPaper,
Alert Active printing(4) lowToner, or
serviceRequested
Critical down(5) other(1) could be: jammed,
Alert Active noPaper, noToner,
coverOpen, or
serviceRequested
Unavailable down(5) other(1)
Moving off- warning(3) idle(3) or offline
line printing(4)
Smith, Wright, Hastings, Zilles & Gyllenskog [Page 14]
RFC 1759 Printer MIB March 1995
Off-line down(5) other(1) offline
Moving down(5) warmup(5)
on-line
Standby running(2) other(1)
*************/
//lookup table for basic status
// [device status][printer status]
#define LOOKUP_TABLE_ROWS 5
#define LOOKUP_TABLE_COLS 5
BYTE basicStatusTable[LOOKUP_TABLE_COLS][LOOKUP_TABLE_ROWS] =
{
/*other unknown idle printing warmup*/
/*unknown*/ { NA, NA, NA, NA, NA },
/*running*/ { ASYNCH_POWERSAVE_MODE, NA, ASYNCH_ONLINE, ASYNCH_PRINTING, ASYNCH_WARMUP },
/*warning*/ { NA, NA, WARNING_ALERTS, WARNING_ALERTS, WARNING_ALERTS },
/*testing*/ { OTHER_ALERTS, NA, NA, ASYNCH_PRINTING_TEST_PAGE, NA },
/*down*/ { CRITICAL_ALERTS, NA, NA, NA, ASYNCH_WARMUP }
};
///////////////////////////////////////////////////////////////////////////////
// StdMibGetPeripheralStatus
// Returns Printer status ( Async Code )
// or ASYNCH_STATUS_UNKNOWN if Printer MIB is not supported on the device
DWORD
StdMibGetPeripheralStatus( const char in *pHost,
const char in *pCommunity,
DWORD in dwDevIndex)
{
DWORD dwRetCode = NO_ERROR;
DWORD errorState;
WORD wLookup = NA;
RFC1157VarBindList variableBindings;
UINT OID_HRMIB_hrDeviceStatus[] = { 1, 3, 6, 1, 2, 1, 25, 3, 2, 1, 5, dwDevIndex};
UINT OID_HRMIB_hrPrinterStatus[] = { 1, 3, 6, 1, 2, 1, 25, 3, 5, 1, 1, dwDevIndex};
UINT OID_HRMIB_hrPrinterDetectedErrorState[] = { 1, 3, 6, 1, 2, 1, 25, 3, 5, 1, 2, dwDevIndex};
AsnObjectIdentifier OT_DEVICE_STATUS[] = { { OID_SIZEOF(OID_HRMIB_hrDeviceStatus), OID_HRMIB_hrDeviceStatus },
{ OID_SIZEOF(OID_HRMIB_hrPrinterStatus), OID_HRMIB_hrPrinterStatus },
{ OID_SIZEOF(OID_HRMIB_hrPrinterDetectedErrorState), OID_HRMIB_hrPrinterDetectedErrorState },
{ 0, 0 } };
// build the variable bindings list
variableBindings.list = NULL;
variableBindings.len = 0;
CSnmpMgr *pSnmpMgr = new CSnmpMgr(pHost, pCommunity, dwDevIndex);
if ( !pSnmpMgr )
{
return ERROR_OUTOFMEMORY;
}
if (pSnmpMgr->GetLastError() != SNMPAPI_NOERROR )
{
delete pSnmpMgr;
return ASYNCH_STATUS_UNKNOWN;
}
dwRetCode = pSnmpMgr->BldVarBindList(OT_DEVICE_STATUS, &variableBindings);
if (dwRetCode != SNMPAPI_NOERROR)
{
SnmpUtilVarBindListFree(&variableBindings);
delete pSnmpMgr;
return ASYNCH_STATUS_UNKNOWN;
}
// get the status objects
dwRetCode = pSnmpMgr->Get(&variableBindings);
if (dwRetCode != NO_ERROR)
{
SnmpUtilVarBindListFree(&variableBindings);
delete pSnmpMgr;
if (dwRetCode == SNMP_ERRORSTATUS_NOSUCHNAME)
dwRetCode = ASYNCH_ONLINE;
else
dwRetCode = ASYNCH_STATUS_UNKNOWN;
return dwRetCode;
}
if(dwRetCode == NO_ERROR)
{
if( (variableBindings.list[0].value.asnValue.number-1 < 0) ||
(variableBindings.list[0].value.asnValue.number-1>=LOOKUP_TABLE_COLS) )
{
wLookup = OTHER_ALERTS;
}
else if( (variableBindings.list[1].value.asnValue.number-1 < 0) ||
(variableBindings.list[1].value.asnValue.number-1 >=LOOKUP_TABLE_ROWS) )
{
wLookup = OTHER_ALERTS;
}
else
{
wLookup = basicStatusTable[variableBindings.list[0].value.asnValue.number-1]
[variableBindings.list[1].value.asnValue.number-1];
}
switch(wLookup)
{
case NA:
dwRetCode = ASYNCH_STATUS_UNKNOWN;
break;
case CRITICAL_ALERTS:
GetBitsFromString((LPSTR)(variableBindings.list[2].value.asnValue.string.stream),
variableBindings.list[2].value.asnValue.string.length, &errorState );
dwRetCode = ProcessCriticalAlerts(errorState);
break;
case WARNING_ALERTS:
GetBitsFromString((LPSTR)(variableBindings.list[2].value.asnValue.string.stream),
variableBindings.list[2].value.asnValue.string.length, &errorState );
dwRetCode = ProcessWarningAlerts(errorState);
break;
case OTHER_ALERTS:
GetBitsFromString((LPSTR)(variableBindings.list[2].value.asnValue.string.stream),
variableBindings.list[2].value.asnValue.string.length, &errorState );
dwRetCode = ProcessOtherAlerts( errorState);
break;
default:
dwRetCode = wLookup;
break;
}
}
else
{
dwRetCode = ASYNCH_STATUS_UNKNOWN;
}
SnmpUtilVarBindListFree(&variableBindings);
delete pSnmpMgr;
return dwRetCode;
} // StdMibGetPeripheralStatus()
///////////////////////////////////////////////////////////////////////////////
// ProcessCriticalAlerts - determine active critical error
//
// returns the device status for Critical Alerts ( ASYNC_XXXXX )
DWORD
ProcessCriticalAlerts( DWORD errorState )
{
DWORD status = ASYNCH_ONLINE;
if ( errorState & DOOR_OPEN) {
status = ASYNCH_DOOR_OPEN;
}
else if( errorState & NO_TONER) {
status = ASYNCH_TONER_GONE;
}
else if( errorState & NO_PAPER) {
status = ASYNCH_PAPER_OUT;
}
else if( errorState & PAPER_JAM ) {
status = ASYNCH_PAPER_JAM;
}
else if(errorState & SERVICE_REQUESTED) {
status = ASYNCH_PRINTER_ERROR;
}
else if( errorState & OFF_LINE) {
status = ASYNCH_OFFLINE;
}
else
status = ASYNCH_PRINTER_ERROR;
return status;
} // ProcessCriticalAlerts()
///////////////////////////////////////////////////////////////////////////////
// ProcessWarningAlerts - determine active warning
//
// returns the device status for Critical Alerts ( ASYNC_XXXXX )
DWORD
ProcessWarningAlerts( DWORD errorState )
{
DWORD status = ASYNCH_ONLINE;
if( errorState & LOW_PAPER) {
status = ASYNCH_ONLINE;
}
else if(errorState & LOW_TONER) {
status = ASYNCH_TONER_LOW;
}
else if( errorState & SERVICE_REQUESTED) {
// Changed it from ASYNCH_INTERVENTION; since if hrDeviceStatus = warning,
// the printer can still print even though hrPrinterDetectedErrorState = serviceRequested
//
status = ASYNCH_ONLINE;
}
else if( errorState == 0) {
status = ASYNCH_ONLINE;
}
else {
status = ASYNCH_STATUS_UNKNOWN;
}
return status;
} // ProcessWarningAlerts()
///////////////////////////////////////////////////////////////////////////////
// ProcessWarningAlerts - determine status for other Alerts
// returns the device status for Critical Alerts ( ASYNC_XXXXX )
DWORD ProcessOtherAlerts( DWORD errorState )
{
DWORD status = ASYNCH_ONLINE;
//
// This is a place holder for future functionality
//
status = ASYNCH_STATUS_UNKNOWN;
return status;
} // ProcessOtherAlerts
///////////////////////////////////////////////////////////////////////////////
// GetBitsFromString -
// extracts the bin numbers from collection string returned by the get
//
void GetBitsFromString( LPSTR getVal,
DWORD getSiz,
LPDWORD bits)
{
char* ptr = (char*)bits;
*bits = 0;
#if defined(_INTEL) || defined(WINNT)
switch(getSiz)
{
case 1:
ptr[0] = getVal[0];
break;
case 2:
ptr[1] = getVal[0];
ptr[0] = getVal[1];
break;
case 3:
ptr[2] = getVal[0];
ptr[1] = getVal[1];
ptr[0] = getVal[2];
break;
case 4:
ptr[3] = getVal[0];
ptr[2] = getVal[1];
ptr[1] = getVal[2];
ptr[0] = getVal[3];
break;
}
#elif defined(_MOTOROLLA)
switch(getSiz)
{
case 1:
ptr[3] = getVal[0];
break;
case 2:
ptr[2] = getVal[0];
ptr[3] = getVal[1];
break;
case 3:
ptr[1] = getVal[0];
ptr[2] = getVal[1];
ptr[3] = getVal[2];
break;
case 4:
ptr[0] = getVal[0];
ptr[1] = getVal[1];
ptr[2] = getVal[2];
ptr[3] = getVal[3];
break;
}
#else
#error #define a swap method ( _INTEL, _MOTOROLLA )
#endif /* _INTEL, _MOTOROLLA */
} // GetBitsFromString()