Blob Blame History Raw
diff --git a/CUPS.xs b/CUPS.xs
index 2da9558..109f73f 100644
--- a/CUPS.xs
+++ b/CUPS.xs
@@ -5,9 +5,17 @@
 #include "ppport.h"
 
 #include <cups/cups.h>
+#if (CUPS_VERSION_MAJOR > 1) || (CUPS_VERSION_MINOR > 5)
+#define HAVE_CUPS_1_6 1
+#endif
+
 /*#include <cups/backend.h>*/
 #include <cups/http.h>
-#include <cups/image.h>
+#ifdef HAVE_CUPS_1_6
+ #include <cupsfilters/image.h>
+#else
+ #include <cups/image.h>
+#endif
 #include <cups/ipp.h>
 #include <cups/ppd.h>
 #include <cups/file.h>
@@ -19,6 +27,17 @@
 #include "const-c.inc"
 #include "packer.c"
 
+#ifndef HAVE_CUPS_1_6
+#define ippGetGroupTag(attr)  attr->group_tag
+#define ippGetName(attr)      attr->name
+#define ippGetValueTag(attr)  attr->value_tag
+#define ippGetInteger(attr, element) attr->values[element].integer
+#define ippGetString(attr, element, language) attr->values[element].string.text
+#define ippGetStatusCode(ipp)  ipp->request.status.status_code
+#define ippFirstAttribute(ipp) ipp->current = ipp->attrs
+#define ippNextAttribute(ipp)  ipp->current = ipp->current->next
+#endif
+
 static SV *password_cb = (SV*) NULL;
 
 const char *
@@ -200,7 +219,7 @@ NETCUPS_getPPDMakes()
 		if (response != NULL) {
 			attr = ippFindAttribute(response, "ppd-make", IPP_TAG_TEXT); 
 			rv = sv_newmortal();
-			sv_setpv(rv, attr->values[0].string.text);
+			sv_setpv(rv, ippGetString(attr, 0, NULL));
 			XPUSHs(rv);
 			count++;
 
@@ -211,7 +230,7 @@ NETCUPS_getPPDMakes()
 				}
 
 				rv = sv_newmortal();
-				sv_setpv(rv, attr->values[0].string.text);
+				sv_setpv(rv, ippGetString(attr, 0, NULL));
 				XPUSHs(rv);
 				count++;
 			}			
@@ -252,7 +271,7 @@ NETCUPS_getAllPPDs ()
 									"ppd-make-and-model", 
 									IPP_TAG_TEXT); 
 			rv = sv_newmortal();
-			sv_setpv(rv, attr->values[0].string.text);
+			sv_setpv(rv, ippGetString(attr, 0, NULL));
 			XPUSHs(rv);
 			count++;
 			while (attr != NULL) {
@@ -263,7 +282,7 @@ NETCUPS_getAllPPDs ()
 					break;
 				}
 				rv = sv_newmortal();
-				sv_setpv(rv, attr->values[0].string.text);
+				sv_setpv(rv, ippGetString(attr, 0, NULL));
 				XPUSHs(rv);
 				count++;
 			}			
@@ -356,14 +375,14 @@ NETCUPS_getPPDFileName(ppdfilename);
 		if (response != NULL) {
 			attr = ippFindAttribute(response, "ppd-name", IPP_TAG_NAME );
 			while ((attr != NULL) && (i < 1)) {
-				tmpppd = attr->values[0].string.text;	
+				tmpppd = ippGetString(attr, 0, NULL);	
 				attr = ippFindNextAttribute(response, 
 											"ppd-make", 
 											IPP_TAG_TEXT);
 				attr = ippFindNextAttribute(response, 
 											"ppd-make-and-model", 
 											IPP_TAG_TEXT);
-				if (strcmp(attr->values[0].string.text, ppdfilename) == 0 ) {
+				if (strcmp(ippGetString(attr, 0, NULL), ppdfilename) == 0 ) {
 					/* return tmpppd; */
 					strcpy(test, tmpppd);	
 					break;	
@@ -410,12 +429,12 @@ NETCUPS_getDeviceAttribute( device, attribute, attribute_type )
 			attr = ippFindNextAttribute(response, "printer-name", IPP_TAG_NAME);
 
 			while (attr != NULL) {
-				if (strcmp(attr->values[0].string.text, device) == 0) { 
+				if (strcmp(ippGetString(attr, 0, NULL), device) == 0) { 
 					attr = ippFindNextAttribute( response, 
 												 attribute, 
 												 attribute_type);
 					rv = sv_newmortal();  
-					sv_setpv( rv, attr->values[0].string.text); 
+					sv_setpv( rv, ippGetString(attr, 0, NULL)); 
 					XPUSHs( rv );
 					break;	
 				}					
@@ -858,15 +877,15 @@ NETCUPS_getAttributes( ipp )
 		SV* rv = NULL;
 		int count = 0;
 		ipp_attribute_t* attr = NULL;
-		for (attr = ipp->attrs; attr != NULL; attr = attr->next)
+		for (attr = ippFirstAttribute(ipp); attr != NULL; attr = ippNextAttribute(ipp))
 		{
-			while (attr != NULL && attr->group_tag != IPP_TAG_JOB)
- 		       attr = attr->next;
+			while (attr != NULL && ippGetGroupTag(attr) != IPP_TAG_JOB)
+ 		       attr = ippNextAttribute(ipp);
 
 			if (attr == NULL)
 				break;
 			rv = sv_newmortal();
-			sv_setpv( rv, attr->name );
+			sv_setpv( rv, ippGetName(attr) );
 			XPUSHs( rv );
 			count++;
 		}
@@ -880,27 +899,27 @@ NETCUPS_getAttributeValue( ipp, name )
 		SV* rv = NULL;
 		int count = 0;
 		ipp_attribute_t* attr = NULL;
-		for (attr = ipp->attrs; attr != NULL; attr = attr->next)
+		for (attr = ippFirstAttribute(ipp); attr != NULL; attr = ippNextAttribute(ipp))
 		{
-			while (attr != NULL && attr->group_tag != IPP_TAG_JOB)
- 		       attr = attr->next;
+			while (attr != NULL && ippGetGroupTag(attr) != IPP_TAG_JOB)
+ 		       attr = ippNextAttribute(ipp);
 
 			if (attr == NULL)
 				break;
 
-			if( !strcmp( attr->name, name ) )
+			if( !strcmp( ippGetName(attr), name ) )
 			{
 				rv = sv_newmortal();
-				if( ( attr->value_tag == IPP_TAG_INTEGER ) ||
-					( attr->value_tag == IPP_TAG_ENUM ) )
+				if( ( ippGetValueTag(attr) == IPP_TAG_INTEGER ) ||
+					( ippGetValueTag(attr) == IPP_TAG_ENUM ) )
 				{
 					/* We have a number with any luck ... */
-					sv_setiv( rv, attr->values[0].integer );
+					sv_setiv( rv, ippGetInteger(attr, 0) );
 				}
 				else
 				{
 					/* We have a string ... maybe ... try to set it. */
-					sv_setpv( rv, attr->values[0].string.text );
+					sv_setpv( rv, ippGetString(attr, 0, NULL) );
 				}
 
 				XPUSHs( rv );