commit 5917ee1ecaecb951de9bf890b69f028fdfd9ddaa
parent a8de6492f20d207f49172a67a56cc66cf4f0511f
Author: Tomas Hlavaty <tom@logand.com>
Date:   Sat, 10 Aug 2013 23:31:19 +0200
create-job and get-jobs implemented
Diffstat:
| M | ipp.lisp |  |  | 141 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- | 
1 file changed, 134 insertions(+), 7 deletions(-)
diff --git a/ipp.lisp b/ipp.lisp
@@ -22,8 +22,10 @@
 
 (defpackage :ipp
   (:use :cl)
-  (:export :print-job
-           :list-printers))
+  (:export :create-job
+           :get-jobs
+           :list-printers
+           :print-job))
 
 (in-package :ipp)
 
@@ -86,7 +88,9 @@
                     (:job-uri . nil)
                     (:job-id . nil)
                     (:job-state . nil)
-                    (:job-state-reasons . nil))))
+                    (:job-state-reasons . nil)
+                    (:limit . :integer)
+                    (:requested-attributes . :keyword))))
 
   (defun attribute-tag (attribute)
     (or (cdr (assoc attribute attributes))
@@ -199,11 +203,18 @@
       (loop
          for (k v) on plist by #'cddr
          when v
-         do (let ((tag (attribute-tag k)))
-              ;; TODO additional value (when v is list)
-              (rw:write-u8 writer (tag tag))
+         do (let* ((tag (attribute-tag k))
+                   (n (tag tag)))
+              (rw:write-u8 writer n)
               (write-text writer (attribute-name k))
-              (write-value writer tag v))))))
+              (if (atom v)
+                  (write-value writer tag v)
+                  (progn
+                    (write-value writer tag (attribute-name (car v)))
+                    (dolist (v (cdr v))
+                      (rw:write-u8 writer n)
+                      (rw:write-u16 writer 0)
+                      (write-value writer tag (attribute-name v))))))))))
 
 (defun operation-code (operation)
   (cdr (assoc operation '((:print-job 1 0 #x0002)
@@ -337,6 +348,90 @@
            :copies ,copies
            :sides ,sides))))
 
+;; TODO validate-job
+
+(defun create-job (ipp-client
+                   printer-uri
+                   request-file
+                   response-file
+                   request-id
+                   &key
+                     (attributes-charset "utf-8")
+                     (attributes-natural-language "en"))
+  (ipp ipp-client
+       printer-uri
+       request-file
+       response-file
+       nil
+       request-id
+       :create-job
+       `((,(tag :operation-attributes-tag)
+           :attributes-charset ,attributes-charset
+           :attributes-natural-language ,attributes-natural-language
+           :printer-uri ,printer-uri))))
+
+;; TODO send-document
+;; TODO cancel-job
+;; TODO get-job-attributes
+
+(defun get-jobs (ipp-client
+                 printer-uri
+                 request-file
+                 response-file
+                 request-id
+                 &key
+                   (attributes-charset "utf-8")
+                   (attributes-natural-language "en")
+                   limit
+                   requested-attributes)
+  (ipp ipp-client
+       printer-uri
+       request-file
+       response-file
+       nil
+       request-id
+       :get-jobs
+       `((,(tag :operation-attributes-tag)
+           :attributes-charset ,attributes-charset
+           :attributes-natural-language ,attributes-natural-language
+           :printer-uri ,printer-uri
+           :limit ,limit
+           :requested-attributes ,requested-attributes))))
+
+;; TODO get-printer-attributes
+;; TODO hold-job
+;; TODO release-job
+;; TODO restart-job
+;; TODO pause-printer
+;; TODO resume-printer
+;; TODO purge-jobs
+;; TODO set-job-attributes
+;; TODO create-printer-subscription
+;; TODO create-job-subscription
+;; TODO get-subscription-attributes
+;; TODO get-subscriptions
+;; TODO renew-subscription
+;; TODO cancel-subscription
+;; TODO get-notifications
+;; TODO enable-printer
+;; TODO disable-printer
+;; TODO cups-get-default
+;; TODO cups-get-printers
+;; TODO cups-add-modify-printer
+;; TODO cups-delete-printer
+;; TODO cups-get-classes
+;; TODO cups-add-modify-class
+;; TODO cups-delete-class
+;; TODO cups-accept-jobs
+;; TODO cups-reject-jobs
+;; TODO cups-set-default
+;; TODO cups-get-devices
+;; TODO cups-get-ppds
+;; TODO cups-move-job
+;; TODO cups-authenticate-job
+;; TODO cups-get-ppd
+;; TODO cups-get-document
+
 (defun printer-search-reader (reader)
   (let* ((k '#.(coerce "\"/printers/" 'list)) ;; TODO #\' as attribute quote
          (n (length k))
@@ -434,6 +529,7 @@
      ,url)))
 
 ;;(curl "http://localhost:631/printers/" :response-file "printers.html")
+;;(curl "http://localhost:631/jobs/82" :response-file "job-status.html")
 
 (defun ipp-client (content-type printer-uri request-file response-file)
   (curl printer-uri
@@ -454,6 +550,37 @@
                )
 
 #+nil
+(ipp:create-job 'ipp-client
+                "http://localhost:631/printers/Virtual_PDF_Printer"
+                "create-jobs.in"
+                "create-jobs.out"
+                314)
+
+#+nil
+(ipp:get-jobs 'ipp-client
+              "http://localhost:631/printers/Virtual_PDF_Printer"
+              "request2.dat"
+              "response2.dat"
+              314)
+
+#+nil
+(ipp:get-jobs 'ipp-client
+              "http://localhost:631/printers/Virtual_PDF_Printer"
+              "request2.dat"
+              "response2.dat"
+              314
+              :limit 2)
+
+#+nil
+(ipp:get-jobs 'ipp-client
+              "http://localhost:631/printers/Virtual_PDF_Printer"
+              "request2.dat"
+              "response2.dat"
+              314
+              :limit 2
+              :requested-attributes '(:job-id))
+
+#+nil
 (ipp:list-printers 'ipp-client
                    "http://localhost:631/printers/"
                    "printers.html")