diff -up cups-1.4.3/backend/snmp-supplies.c.snmp-quirks cups-1.4.3/backend/snmp-supplies.c --- cups-1.4.3/backend/snmp-supplies.c.snmp-quirks 2009-11-20 01:27:57.000000000 +0000 +++ cups-1.4.3/backend/snmp-supplies.c 2010-06-09 16:27:05.515019804 +0100 @@ -38,6 +38,13 @@ /* + * Printer quirks... + */ + +#define QUIRK_CAPACITY (1<<0) + + +/* * Local structures... */ @@ -57,6 +64,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... @@ -68,6 +81,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 */ @@ -153,6 +167,15 @@ static const backend_state_t const print { CUPS_TC_outputFull, "output-area-full-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... @@ -208,6 +231,9 @@ backendSNMPSupplies( if (i) *ptr++ = ','; + if (quirks & QUIRK_CAPACITY) + supplies[i].max_capacity = 100; + if (supplies[i].max_capacity > 0) sprintf(ptr, "%d", 100 * supplies[i].level / supplies[i].max_capacity); else @@ -305,6 +331,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 */ @@ -366,6 +393,7 @@ backend_init_supplies( current_state = -1; num_supplies = -1; charset = -1; + quirks = 0; memset(supplies, 0, sizeof(supplies)); @@ -381,6 +409,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 (value, quirk_names[i].keyword, len) && + (value[len] == '\0' || value[len] == ' ')) + quirks |= quirk_names[i].bit; + } + + /* + * Advance to next keyword. + */ + + ptr += strcspn (ptr, " "); + ptr += strspn (ptr, " "); + } + } + ppdClose(ppd); /*