--- prnt/cupsext/cupsext.c.ipp_accessors	2012-06-18 12:41:19.000000000 +0200
+++ prnt/cupsext/cupsext.c	2012-07-19 17:11:47.606524137 +0200
@@ -87,6 +87,46 @@ typedef int Py_ssize_t;
 #define PY_SSIZE_T_MIN INT_MIN
 #endif

+#if (CUPS_VERSION_MAJOR > 1) || (CUPS_VERSION_MINOR > 5)
+#define HAVE_CUPS_1_6 1
+#endif
+
+#ifndef HAVE_CUPS_1_6
+#define ippGetCount(attr)     attr->num_values
+#define ippGetGroupTag(attr)  attr->group_tag
+#define ippGetValueTag(attr)  attr->value_tag
+#define ippGetName(attr)      attr->name
+#define ippGetBoolean(attr, element) attr->values[element].boolean
+#define ippGetInteger(attr, element) attr->values[element].integer
+#define ippGetStatusCode(ipp) ipp->request.status.status_code
+#define ippGetString(attr, element, language) attr->values[element].string.text
+
+static ipp_attribute_t * ippFirstAttribute( ipp_t *ipp )
+{
+    if (!ipp)
+        return (NULL);
+    return (ipp->current = ipp->attrs);
+}
+
+static ipp_attribute_t * ippNextAttribute( ipp_t *ipp )
+{
+    if (!ipp || !ipp->current)
+        return (NULL);
+    return (ipp->current = ipp->current->next);
+}
+
+static int ippSetOperation( ipp_t *ipp, ipp_op_t op )
+{
+    ipp->request.op.operation_id = op;
+    return (1);
+}
+
+static int ippSetRequestId( ipp_t *ipp, int request_id )
+{
+    ipp->request.any.request_id = request_id;
+    return (1);
+}
+#endif

 int g_num_options = 0;
 cups_option_t * g_options;
@@ -333,8 +373,8 @@ PyObject * getPrinters( PyObject * self,
     request = ippNew();
     language = cupsLangDefault();

-    request->request.op.operation_id = CUPS_GET_PRINTERS;
-    request->request.any.request_id = 1;
+    ippSetOperation( request, CUPS_GET_PRINTERS );
+    ippSetRequestId ( request, 1);

     ippAddString( request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
                   "attributes-charset", NULL, cupsLangEncoding( language ) );
@@ -378,10 +418,10 @@ PyObject * getPrinters( PyObject * self,
         ipp_pstate_t state;
         int i = 0;

-        for ( attr = response->attrs; attr != NULL; attr = attr->next )
+        for ( attr = ippFirstAttribute( response ); attr != NULL; attr = ippNextAttribute( response ) )
         {
-            while ( attr != NULL && attr->group_tag != IPP_TAG_PRINTER )
-                attr = attr->next;
+            while ( attr != NULL && ippGetGroupTag( attr ) != IPP_TAG_PRINTER )
+                attr = ippNextAttribute( response );

             if ( attr == NULL )
                 break;
@@ -390,41 +430,41 @@ PyObject * getPrinters( PyObject * self,
             state = IPP_PRINTER_IDLE;
             accepting = 0;

-            while ( attr != NULL && attr->group_tag == IPP_TAG_PRINTER )
+            while ( attr != NULL && ippGetGroupTag( attr ) == IPP_TAG_PRINTER )
             {
-                if ( strcmp( attr->name, "printer-name" ) == 0 &&
-                        attr->value_tag == IPP_TAG_NAME )
-                    name = attr->values[ 0 ].string.text;
-
-                else if ( strcmp( attr->name, "device-uri" ) == 0 &&
-                        attr->value_tag == IPP_TAG_URI )
-                    device_uri = attr->values[ 0 ].string.text;
-
-                else if ( strcmp( attr->name, "printer-uri-supported" ) == 0 &&
-                        attr->value_tag == IPP_TAG_URI )
-                    printer_uri = attr->values[ 0 ].string.text;
-
-                else if ( strcmp( attr->name, "printer-info" ) == 0 &&
-                        attr->value_tag == IPP_TAG_TEXT )
-                    info = attr->values[ 0 ].string.text;
-
-                else if ( strcmp( attr->name, "printer-location" ) == 0 &&
-                        attr->value_tag == IPP_TAG_TEXT )
-                    location = attr->values[ 0 ].string.text;
-
-                else if ( strcmp( attr->name, "printer-make-and-model" ) == 0 &&
-                        attr->value_tag == IPP_TAG_TEXT )
-                    make_model = attr->values[ 0 ].string.text;
-
-                else if ( strcmp( attr->name, "printer-state" ) == 0 &&
-                        attr->value_tag == IPP_TAG_ENUM )
-                    state = ( ipp_pstate_t ) attr->values[ 0 ].integer;
-
-                else if (!strcmp(attr->name, "printer-is-accepting-jobs") &&
-                        attr->value_tag == IPP_TAG_BOOLEAN)
-                    accepting = attr->values[ 0 ].boolean;
+                if ( strcmp( ippGetName( attr ), "printer-name" ) == 0 &&
+                        ippGetValueTag( attr ) == IPP_TAG_NAME )
+                    name = ippGetString( attr, 0, NULL );
+
+                else if ( strcmp( ippGetName( attr ), "device-uri" ) == 0 &&
+                        ippGetValueTag( attr ) == IPP_TAG_URI )
+                    device_uri = ippGetString( attr, 0, NULL );
+
+                else if ( strcmp( ippGetName( attr ), "printer-uri-supported" ) == 0 &&
+                        ippGetValueTag( attr ) == IPP_TAG_URI )
+                    printer_uri = ippGetString( attr, 0, NULL );
+
+                else if ( strcmp( ippGetName( attr ), "printer-info" ) == 0 &&
+                        ippGetValueTag( attr ) == IPP_TAG_TEXT )
+                    info = ippGetString( attr, 0, NULL );
+
+                else if ( strcmp( ippGetName( attr ), "printer-location" ) == 0 &&
+                        ippGetValueTag( attr ) == IPP_TAG_TEXT )
+                    location = ippGetString( attr, 0, NULL );
+
+                else if ( strcmp( ippGetName( attr ), "printer-make-and-model" ) == 0 &&
+                        ippGetValueTag( attr ) == IPP_TAG_TEXT )
+                    make_model = ippGetString( attr, 0, NULL );
+
+                else if ( strcmp( ippGetName( attr ), "printer-state" ) == 0 &&
+                        ippGetValueTag( attr ) == IPP_TAG_ENUM )
+                    state = ( ipp_pstate_t ) ippGetInteger( attr, 0 );
+
+                else if (!strcmp(ippGetName( attr ), "printer-is-accepting-jobs") &&
+                        ippGetValueTag( attr ) == IPP_TAG_BOOLEAN)
+                    accepting = ippGetBoolean( attr, 0 );

-                attr = attr->next;
+                attr = ippNextAttribute( response );
             }

             if ( device_uri == NULL )
@@ -522,8 +562,8 @@ PyObject * addPrinter( PyObject * self,
     request = ippNew();
     language = cupsLangDefault();

-    request->request.op.operation_id = CUPS_ADD_PRINTER;
-    request->request.any.request_id = 1;
+    ippSetOperation( request, CUPS_ADD_PRINTER );
+    ippSetRequestId ( request, 1 );

     ippAddString( request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
                   "attributes-charset", NULL, cupsLangEncoding( language ) );
@@ -568,7 +608,7 @@ PyObject * addPrinter( PyObject * self,
     }
     else
     {
-        status = response->request.status.status_code;
+        status = ippGetStatusCode( response );
         //ippDelete( response );
         r = 1;
     }
@@ -631,8 +671,8 @@ PyObject * delPrinter( PyObject * self,
        */
     request = ippNew();

-    request->request.op.operation_id = CUPS_DELETE_PRINTER;
-    request->request.op.request_id = 1;
+    ippSetOperation( request, CUPS_DELETE_PRINTER );
+    ippSetRequestId ( request, 1 );

     language = cupsLangDefault();

@@ -650,7 +690,7 @@ PyObject * delPrinter( PyObject * self,
      */
     response = cupsDoRequest( http, request, "/admin/" );

-    if ( ( response != NULL ) && ( response->request.status.status_code <= IPP_OK_CONFLICT ) )
+    if ( ( response != NULL ) && ( ippGetStatusCode( response ) <= IPP_OK_CONFLICT ) )
     {
         r = 1;
     }
@@ -721,8 +761,8 @@ PyObject * setDefaultPrinter( PyObject *

     request = ippNew();

-    request->request.op.operation_id = CUPS_SET_DEFAULT;
-    request->request.op.request_id = 1;
+    ippSetOperation( request, CUPS_SET_DEFAULT );
+    ippSetRequestId ( request, 1 );

     language = cupsLangDefault();

@@ -743,7 +783,7 @@ PyObject * setDefaultPrinter( PyObject *

     response = cupsDoRequest( http, request, "/admin/" );

-    if ( ( response != NULL ) && ( response->request.status.status_code <= IPP_OK_CONFLICT ) )
+    if ( ( response != NULL ) && ( ippGetStatusCode( response ) <= IPP_OK_CONFLICT ) )
     {
         r = 1;
     }
@@ -797,8 +837,8 @@ PyObject * controlPrinter( PyObject * se

     request = ippNew();

-    request->request.op.operation_id = op;
-    request->request.op.request_id = 1;
+    ippSetOperation( request, op );
+    ippSetRequestId ( request, 1 );

     language = cupsLangDefault();

@@ -822,7 +862,7 @@ PyObject * controlPrinter( PyObject * se

     response = cupsDoRequest(http, request, "/admin/");

-    if (( response != NULL ) && (response->request.status.status_code <= IPP_OK_CONFLICT))
+    if (( response != NULL ) && (ippGetStatusCode( response ) <= IPP_OK_CONFLICT))
     {
         r = 1;
     }
@@ -837,7 +877,7 @@ abort:
     if ( response != NULL )
         ippDelete( response );

-    return Py_BuildValue( "i", r );;
+    return Py_BuildValue( "i", r );
 }


@@ -1116,8 +1156,8 @@ PyObject * getPPDList( PyObject * self,

     request = ippNew();

-    request->request.op.operation_id = CUPS_GET_PPDS;
-    request->request.op.request_id   = 1;
+    ippSetOperation( request, CUPS_GET_PPDS );
+    ippSetRequestId ( request, 1 );

     language = cupsLangDefault();

@@ -1143,43 +1183,43 @@ PyObject * getPPDList( PyObject * self,
     if ((response = cupsDoRequest(http, request, "/")) != NULL)
     {

-        for (attr = response->attrs; attr; attr = attr->next)
+        for (attr = ippFirstAttribute( response ); attr; attr = ippNextAttribute( response ))
         {
             PyObject *dict;
             char *ppdname = NULL;

-            while (attr && attr->group_tag != IPP_TAG_PRINTER)
-                attr = attr->next;
+            while (attr && ippGetGroupTag( attr ) != IPP_TAG_PRINTER)
+                attr = ippNextAttribute( response );

             if (!attr)
                 break;

             dict = PyDict_New ();

-            for (; attr && attr->group_tag == IPP_TAG_PRINTER; attr = attr->next)
+            for (; attr && ippGetGroupTag( attr ) == IPP_TAG_PRINTER; attr = ippNextAttribute( response ))
             {
                 PyObject *val = NULL;

-                if (!strcmp (attr->name, "ppd-name") && attr->value_tag == IPP_TAG_NAME)
+                if (!strcmp (ippGetName( attr ), "ppd-name") && ippGetValueTag( attr ) == IPP_TAG_NAME)
                 {
-                    ppdname = attr->values[0].string.text;
+                    ppdname = ippGetString( attr, 0, NULL );

                     //sprintf( buf, "print '%s'", ppdname);
                     //PyRun_SimpleString( buf );
                 }

-                else if (attr->value_tag == IPP_TAG_TEXT || attr->value_tag == IPP_TAG_NAME || attr->value_tag == IPP_TAG_KEYWORD)
-                //else if ((!strcmp (attr->name, "ppd-natural-language") && attr->value_tag == IPP_TAG_LANGUAGE) ||
-                //    (!strcmp (attr->name, "ppd-make-and-model") && attr->value_tag == IPP_TAG_TEXT) ||
-                //    (!strcmp (attr->name, "ppd-make") && attr->value_tag == IPP_TAG_TEXT) ||
-                //    (!strcmp (attr->name, "ppd-device-id") && attr->value_tag == IPP_TAG_TEXT))
+                else if (ippGetValueTag( attr ) == IPP_TAG_TEXT || ippGetValueTag( attr ) == IPP_TAG_NAME || ippGetValueTag( attr ) == IPP_TAG_KEYWORD)
+                //else if ((!strcmp (ippGetName( attr ), "ppd-natural-language") && ippGetValueTag( attr ) == IPP_TAG_LANGUAGE) ||
+                //    (!strcmp (ippGetName( attr ), "ppd-make-and-model") && ippGetValueTag( attr ) == IPP_TAG_TEXT) ||
+                //    (!strcmp (ippGetName( attr ), "ppd-make") && ippGetValueTag( attr ) == IPP_TAG_TEXT) ||
+                //    (!strcmp (ippGetName( attr ), "ppd-device-id") && ippGetValueTag( attr ) == IPP_TAG_TEXT))
                 {
-                    val = PyObj_from_UTF8(attr->values[0].string.text);
+                    val = PyObj_from_UTF8(ippGetString( attr, 0, NULL ));
                 }

                 if (val)
                 {
-                    PyDict_SetItemString (dict, attr->name, val);
+                    PyDict_SetItemString (dict, ippGetName( attr ), val);
                     Py_DECREF (val);
                 }
             }
--- scan/sane/hpaio.c.ipp_accessors	2012-06-18 12:42:51.000000000 +0200
+++ scan/sane/hpaio.c	2012-07-19 17:12:34.557848760 +0200
@@ -47,6 +47,43 @@
 #define DEBUG_DECLARE_ONLY
 #include "sanei_debug.h"

+#if (CUPS_VERSION_MAJOR > 1) || (CUPS_VERSION_MINOR > 5)
+#define HAVE_CUPS_1_6 1
+#endif
+
+#ifndef HAVE_CUPS_1_6
+#define ippGetGroupTag(attr)  attr->group_tag
+#define ippGetValueTag(attr)  attr->value_tag
+#define ippGetName(attr)      attr->name
+#define ippGetString(attr, element, language) attr->values[element].string.text
+
+static ipp_attribute_t * ippFirstAttribute( ipp_t *ipp )
+{
+    if (!ipp)
+        return (NULL);
+    return (ipp->current = ipp->attrs);
+}
+
+static ipp_attribute_t * ippNextAttribute( ipp_t *ipp )
+{
+    if (!ipp || !ipp->current)
+        return (NULL);
+    return (ipp->current = ipp->current->next);
+}
+
+static int ippSetOperation( ipp_t *ipp, ipp_op_t op )
+{
+    ipp->request.op.operation_id = op;
+    return (1);
+}
+
+static int ippSetRequestId( ipp_t *ipp, int request_id )
+{
+    ipp->request.any.request_id = request_id;
+    return (1);
+}
+#endif
+
 static SANE_Device **DeviceList = NULL;

 static int AddDeviceList(char *uri, char *model, SANE_Device ***pd)
@@ -186,8 +223,8 @@ static int GetCupsPrinters(char ***print
    /* Assemble the IPP request */
    request = ippNew();

-   request->request.op.operation_id = CUPS_GET_PRINTERS;
-   request->request.any.request_id  = 1;
+   ippSetOperation( request, CUPS_GET_PRINTERS );
+   ippSetRequestId( request, 1 );

    ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, "utf-8");
    ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NULL, "en");
@@ -197,20 +234,20 @@ static int GetCupsPrinters(char ***print
    if ((response = cupsDoRequest(http, request, "/")) == NULL)
       goto bugout;

-   for (attr = response->attrs; attr != NULL; attr = attr->next)
+   for (attr = ippFirstAttribute ( response ); attr != NULL; attr = ippNextAttribute( response ))
    {
       /* Skip leading attributes until we hit a printer. */
-      while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER)
-         attr = attr->next;
+      while (attr != NULL && ippGetGroupTag( attr ) != IPP_TAG_PRINTER)
+         attr = ippNextAttribute( response );

       if (attr == NULL)
          break;

-      while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER)
+      while (attr != NULL && ippGetGroupTag( attr ) == IPP_TAG_PRINTER)
       {
-         if (strcmp(attr->name, "device-uri") == 0 && attr->value_tag == IPP_TAG_URI && AddCupsList(attr->values[0].string.text, printer) == 0)
+         if (strcmp(ippGetName( attr ), "device-uri") == 0 && ippGetValueTag( attr ) == IPP_TAG_URI && AddCupsList(ippGetString( attr, 0, NULL ), printer) == 0)
             cnt++;
-         attr = attr->next;
+         attr = ippNextAttribute( response );
       }

       if (attr == NULL)