diff options
Diffstat (limited to 'backend/snmp-supplies.c')
-rw-r--r-- | backend/snmp-supplies.c | 103 |
1 files changed, 85 insertions, 18 deletions
diff --git a/backend/snmp-supplies.c b/backend/snmp-supplies.c index dc2b3f1a..17128acc 100644 --- a/backend/snmp-supplies.c +++ b/backend/snmp-supplies.c @@ -1,5 +1,5 @@ /* - * "$Id: snmp-supplies.c 10262 2012-02-12 05:48:09Z mike $" + * "$Id: snmp-supplies.c 10493 2012-05-21 22:33:19Z mike $" * * SNMP supplies functions for CUPS. * @@ -36,14 +36,21 @@ #define CUPS_MAX_SUPPLIES 32 /* Maximum number of supplies for a printer */ #define CUPS_SUPPLY_TIMEOUT 2.0 /* Timeout for SNMP lookups */ -#define CUPS_DEVELOPER_LOW 1 -#define CUPS_DEVELOPER_EMPTY 2 -#define CUPS_MARKER_SUPPLY_LOW 4 -#define CUPS_MARKER_SUPPLY_EMPTY 8 -#define CUPS_OPC_NEAR_EOL 16 -#define CUPS_OPC_LIFE_OVER 32 -#define CUPS_TONER_LOW 64 -#define CUPS_TONER_EMPTY 128 +#define CUPS_DEVELOPER_LOW 0x0001 +#define CUPS_DEVELOPER_EMPTY 0x0002 +#define CUPS_MARKER_SUPPLY_LOW 0x0004 +#define CUPS_MARKER_SUPPLY_EMPTY 0x0008 +#define CUPS_OPC_NEAR_EOL 0x0010 +#define CUPS_OPC_LIFE_OVER 0x0020 +#define CUPS_TONER_LOW 0x0040 +#define CUPS_TONER_EMPTY 0x0080 +#define CUPS_WASTE_ALMOST_FULL 0x0100 +#define CUPS_WASTE_FULL 0x0200 +#define CUPS_CLEANER_NEAR_EOL 0x0400 /* Proposed JPS3 */ +#define CUPS_CLEANER_LIFE_OVER 0x0800 /* Proposed JPS3 */ + +#define CUPS_SNMP_NONE 0x0000 +#define CUPS_SNMP_CAPACITY 0x0001 /* Supply levels reported as percentages */ /* @@ -75,6 +82,8 @@ static http_addr_t current_addr; /* Current address */ static int current_state = -1; /* Current device state bits */ static int charset = -1; /* Character set for supply names */ +static unsigned quirks = CUPS_SNMP_NONE; + /* Quirks we have to work around */ static int num_supplies = 0; /* Number of supplies found */ static backend_supplies_t supplies[CUPS_MAX_SUPPLIES]; @@ -146,10 +155,17 @@ static const int prtMarkerSuppliesType[] = (sizeof(prtMarkerSuppliesType) / sizeof(prtMarkerSuppliesType[0])); /* Offset to supply index */ +static const int prtMarkerSuppliesSupplyUnit[] = + { CUPS_OID_prtMarkerSuppliesSupplyUnit, -1 }, + /* Units OID */ + prtMarkerSuppliesSupplyUnitOffset = + (sizeof(prtMarkerSuppliesSupplyUnit) / + sizeof(prtMarkerSuppliesSupplyUnit[0])); + /* Offset to supply index */ static const backend_state_t const printer_states[] = { - { CUPS_TC_lowPaper, "media-low-report" }, + /* { CUPS_TC_lowPaper, "media-low-report" }, */ { CUPS_TC_noPaper | CUPS_TC_inputTrayEmpty, "media-empty-warning" }, /* { CUPS_TC_lowToner, "toner-low-report" }, */ /* now use prtMarkerSupplies */ /* { CUPS_TC_noToner, "toner-empty-warning" }, */ /* now use prtMarkerSupplies */ @@ -173,7 +189,11 @@ static const backend_state_t const supply_states[] = { CUPS_OPC_NEAR_EOL, "opc-near-eol-report" }, { CUPS_OPC_LIFE_OVER, "opc-life-over-warning" }, { CUPS_TONER_LOW, "toner-low-report" }, - { CUPS_TONER_EMPTY, "toner-empty-warning" } + { CUPS_TONER_EMPTY, "toner-empty-warning" }, + { CUPS_WASTE_ALMOST_FULL, "waste-receptacle-almost-full-report" }, + { CUPS_WASTE_FULL, "waste-receptacle-full-warning" }, + { CUPS_CLEANER_NEAR_EOL, "cleaner-life-almost-over-report" }, + { CUPS_CLEANER_LIFE_OVER, "cleaner-life-over-warning" }, }; @@ -231,6 +251,9 @@ backendSNMPSupplies( { if (supplies[i].max_capacity > 0 && supplies[i].level >= 0) percent = 100 * supplies[i].level / supplies[i].max_capacity; + else if (supplies[i].level >= 0 && supplies[i].level <= 100 && + (quirks & CUPS_SNMP_CAPACITY)) + percent = supplies[i].level; else percent = 50; @@ -245,9 +268,6 @@ backendSNMPSupplies( else new_supply_state |= CUPS_TONER_LOW; break; - case CUPS_TC_wasteToner : - case CUPS_TC_wasteInk : - break; case CUPS_TC_ink : case CUPS_TC_inkCartridge : case CUPS_TC_inkRibbon : @@ -273,13 +293,31 @@ backendSNMPSupplies( else new_supply_state |= CUPS_OPC_NEAR_EOL; break; + case CUPS_TC_wasteInk : + case CUPS_TC_wastePaper : + case CUPS_TC_wasteToner : + case CUPS_TC_wasteWater : + case CUPS_TC_wasteWax : + if (percent <= 1) + new_supply_state |= CUPS_WASTE_FULL; + else + new_supply_state |= CUPS_WASTE_ALMOST_FULL; + break; + case CUPS_TC_cleanerUnit : + case CUPS_TC_fuserCleaningPad : + if (percent <= 1) + new_supply_state |= CUPS_CLEANER_LIFE_OVER; + else + new_supply_state |= CUPS_CLEANER_NEAR_EOL; + break; } } if (i) *ptr++ = ','; - if (supplies[i].max_capacity > 0 && supplies[i].level >= 0) + if ((supplies[i].max_capacity > 0 || (quirks & CUPS_SNMP_CAPACITY)) && + supplies[i].level >= 0) sprintf(ptr, "%d", percent); else strcpy(ptr, "-1"); @@ -477,6 +515,12 @@ backend_init_supplies( return; } + if ((ppdattr = ppdFindAttr(ppd, "cupsSNMPQuirks", NULL)) != NULL) + { + if (!_cups_strcasecmp(ppdattr->value, "capacity")) + quirks |= CUPS_SNMP_CAPACITY; + } + ppdClose(ppd); /* @@ -903,7 +947,8 @@ backend_walk_cb(cups_snmp_t *packet, /* I - SNMP packet */ supplies[i - 1].level = packet->object_value.integer; } - else if (_cupsSNMPIsOIDPrefixed(packet, prtMarkerSuppliesMaxCapacity)) + else if (_cupsSNMPIsOIDPrefixed(packet, prtMarkerSuppliesMaxCapacity) && + !(quirks & CUPS_SNMP_CAPACITY)) { /* * Get max capacity... @@ -920,7 +965,9 @@ backend_walk_cb(cups_snmp_t *packet, /* I - SNMP packet */ if (i > num_supplies) num_supplies = i; - supplies[i - 1].max_capacity = packet->object_value.integer; + if (supplies[i - 1].max_capacity == 0 && + packet->object_value.integer > 0) + supplies[i - 1].max_capacity = packet->object_value.integer; } else if (_cupsSNMPIsOIDPrefixed(packet, prtMarkerSuppliesType)) { @@ -941,6 +988,26 @@ backend_walk_cb(cups_snmp_t *packet, /* I - SNMP packet */ supplies[i - 1].type = packet->object_value.integer; } + else if (_cupsSNMPIsOIDPrefixed(packet, prtMarkerSuppliesSupplyUnit)) + { + /* + * Get units for capacity... + */ + + i = packet->object_name[prtMarkerSuppliesSupplyUnitOffset]; + if (i < 1 || i > CUPS_MAX_SUPPLIES || + packet->object_type != CUPS_ASN1_INTEGER) + return; + + fprintf(stderr, "DEBUG2: prtMarkerSuppliesSupplyUnit.1.%d = %d\n", i, + packet->object_value.integer); + + if (i > num_supplies) + num_supplies = i; + + if (packet->object_value.integer == CUPS_TC_percent) + supplies[i - 1].max_capacity = 100; + } } @@ -1006,5 +1073,5 @@ utf16_to_utf8( /* - * End of "$Id: snmp-supplies.c 10262 2012-02-12 05:48:09Z mike $". + * End of "$Id: snmp-supplies.c 10493 2012-05-21 22:33:19Z mike $". */ |