diff -up cups-1.4.7/backend/snmp-supplies.c.snmp-quirks cups-1.4.7/backend/snmp-supplies.c --- cups-1.4.7/backend/snmp-supplies.c.snmp-quirks 2011-03-10 04:50:59.000000000 +0100 +++ cups-1.4.7/backend/snmp-supplies.c 2011-06-28 11:11:57.944155996 +0200 @@ -49,6 +49,13 @@ /* + * Printer quirks... + */ + +#define QUIRK_CAPACITY (1<<0) + + +/* * Local structures... */ @@ -68,6 +75,12 @@ typedef struct /**** Printer state ta const char *keyword; /* IPP printer-state-reasons keyword */ } backend_state_t; +typedef struct /**** Quirk names table ****/ +{ + int bit; /* Quirk bit */ + const char *keyword; /* cupsSNMPQuirks keyword */ +} quirk_name_t; + /* * Local globals... @@ -79,6 +92,7 @@ static int current_state = -1; static int charset = -1; /* Character set for supply names */ static int num_supplies = 0; /* Number of supplies found */ +static int quirks = 0; /* Printer quirks */ static backend_supplies_t supplies[CUPS_MAX_SUPPLIES]; /* Supply information */ static int supply_state = -1; @@ -180,6 +194,15 @@ static const backend_state_t const suppl { CUPS_TONER_EMPTY, "toner-empty-warning" } }; +static const quirk_name_t const quirk_names[] = + { + /* + * The prtMarkerSuppliesLevel values are + * percentages, not levels relative to the + * stated capacity. + */ + { QUIRK_CAPACITY, "capacity" } + }; /* * Local functions... @@ -233,6 +256,9 @@ backendSNMPSupplies( for (i = 0, ptr = value; i < num_supplies; i ++, ptr += strlen(ptr)) { + if (quirks & QUIRK_CAPACITY) + supplies[i].max_capacity = 100; + percent = 100 * supplies[i].level / supplies[i].max_capacity; if (percent <= 10) @@ -406,6 +432,7 @@ backend_init_supplies( http_addr_t *addr) /* I - Printer address */ { int i, /* Looping var */ + len, /* Quirk name length */ type; /* Current marker type */ cups_file_t *cachefile; /* Cache file */ const char *cachedir; /* CUPS_CACHEDIR value */ @@ -467,6 +494,7 @@ backend_init_supplies( current_state = -1; num_supplies = -1; charset = -1; + quirks = 0; memset(supplies, 0, sizeof(supplies)); @@ -482,6 +510,34 @@ backend_init_supplies( return; } + if (ppd && + (ppdattr = ppdFindAttr(ppd, "cupsSNMPQuirks", NULL)) != NULL && + ppdattr->value) + { + ptr = ppdattr->value; + while (*ptr != '\0') + { + /* + * Match keyword against quirk_names table. + */ + + for (i = 0; i < sizeof (quirk_names) / sizeof (quirk_names[0]); i++) + { + len = strlen (quirk_names[i].keyword); + if (!strncmp (ptr, quirk_names[i].keyword, len) && + (ptr[len] == '\0' || ptr[len] == ' ')) + quirks |= quirk_names[i].bit; + } + + /* + * Advance to next keyword. + */ + + ptr += strcspn (ptr, " "); + ptr += strspn (ptr, " "); + } + } + ppdClose(ppd); /*