summaryrefslogtreecommitdiffstats
path: root/cups-snmp-quirks.patch
blob: fdc7cc5fd492dd5d32334b06b50d2bf4207207e2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
diff -up cups-1.5b1/backend/snmp-supplies.c.snmp-quirks cups-1.5b1/backend/snmp-supplies.c
--- cups-1.5b1/backend/snmp-supplies.c.snmp-quirks	2011-05-20 05:49:49.000000000 +0200
+++ cups-1.5b1/backend/snmp-supplies.c	2011-05-24 17:15:55.000000000 +0200
@@ -47,6 +47,13 @@
 
 
 /*
+ * Printer quirks...
+ */
+
+#define QUIRK_CAPACITY	(1<<0)
+
+
+/*
  * Local structures...
  */
 
@@ -66,6 +73,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...
@@ -77,6 +90,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;
@@ -176,6 +190,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...
@@ -229,6 +252,9 @@ backendSNMPSupplies(
 
     for (i = 0, ptr = value; i < num_supplies; i ++, ptr += strlen(ptr))
     {
+      if (quirks & QUIRK_CAPACITY)
+	supplies[i].max_capacity = 100;
+
       if (supplies[i].max_capacity > 0)
 	percent = 100 * supplies[i].level / supplies[i].max_capacity;
       else
@@ -401,6 +427,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 */
@@ -462,6 +489,7 @@ backend_init_supplies(
   current_state = -1;
   num_supplies  = -1;
   charset       = -1;
+  quirks	= 0;
 
   memset(supplies, 0, sizeof(supplies));
 
@@ -477,6 +505,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);
 
  /*