Index: server/lib/gutenbach/server/printer.py
===================================================================
--- server/lib/gutenbach/server/printer.py	(revision 92253512a365e2c69f963b7b11d480cc2a48133b)
+++ server/lib/gutenbach/server/printer.py	(revision 57bc2dca8c24215f23d2db575746bec4b66fc245)
@@ -9,4 +9,5 @@
 import traceback
 import sys
+import tempfile
 from . import sync
 
@@ -361,9 +362,39 @@
     ######################################################################
 
-    def print_job(self):
-        pass
-
-    def validate_job(self):
-        pass
+    def print_job(self, document, document_name=None, document_format=None,
+                  document_natural_language=None, requesting_user_name=None,
+                  compression=None, job_name=None, job_k_octets=None):
+
+        # create the job
+        job_id = self.create_job(
+            requesting_user_name=requesting_user_name,
+            job_name=job_name,
+            job_k_octets=job_k_octets)
+        
+        # send the document
+        self.send_document(
+            job_id,
+            document,
+            document_name=document_name,
+            document_format=document_format,
+            document_natural_language=document_natural_language,
+            requesting_user_name=requesting_user_name,
+            compression=compression,
+            last_document=False)
+
+        return job_id
+
+    def verify_job(self, document_name=None, document_format=None,
+                  document_natural_language=None, requesting_user_name=None,
+                  compression=None, job_name=None, job_k_octets=None):
+
+        job_id = self._next_job_id
+        job = GutenbachJob(
+            job_id,
+            creator=requesting_user_name,
+            name=job_name)
+        job.spool(tempfile.TemporaryFile())
+        job.abort()
+        del job
 
     def get_jobs(self, requesting_user_name=None, which_jobs=None,
@@ -397,5 +428,7 @@
         pass
 
-    def create_job(self, requesting_user_name=None, job_name=None, job_k_octets=None):
+    def create_job(self, requesting_user_name=None, job_name=None,
+                   job_k_octets=None):
+
         job_id = self._next_job_id
         self._next_job_id += 1
@@ -405,5 +438,5 @@
             creator=requesting_user_name,
             name=job_name)
-        
+
         self.jobs[job_id] = job
         self.pending_jobs.append(job_id)
@@ -425,6 +458,4 @@
         self.paused = True
 
-
-
     @sync
     def resume_printer(self):
@@ -441,4 +472,5 @@
         self.paused = False
 
+    @sync
     def get_printer_attributes(self, requested_attributes=None):
         if requested_attributes is None:
@@ -452,4 +484,5 @@
         return attributes
 
+    @sync
     def set_printer_attributes(self, job_id, attributes):
         for attr in attributes:
@@ -459,4 +492,5 @@
                 raise ipp.errors.ClientErrorAttributes
 
+    @sync
     def cancel_job(self, job_id, requesting_user_name=None):
         job = self.get_job(job_id)
@@ -467,4 +501,5 @@
             raise
 
+    @sync
     def send_document(self, job_id, document, document_name=None,
                       document_format=None, document_natural_language=None,
@@ -475,4 +510,5 @@
         job.spool(document)
 
+    @sync
     def send_uri(self, job_id, document_uri, document_name=None,
                  document_format=None, document_natural_language=None,
@@ -484,4 +520,5 @@
         #job.spool_uri(document_uri)
 
+    @sync
     def get_job_attributes(self, job_id, requested_attributes=None):
         if requested_attributes is None:
@@ -495,4 +532,5 @@
         return attributes
 
+    @sync
     def set_job_attributes(self, job_id, attributes):
         job = self.get_job(job_id)
@@ -504,5 +542,6 @@
             elif attr == "job-originating-user-name":
                 job.creator = attributes[attr] # XXX: do we want this?
-                
+
+    @sync
     def restart_job(self, job_id, requesting_user_name=None):
         job = self.get_job(job_id)
@@ -513,8 +552,8 @@
             raise ipp.errors.ClientErrorNotPossible
 
-        with self.lock:
-            self.finished_jobs.remove(job_id)
-            self.pending_jobs.append(job_id)
-
+        self.finished_jobs.remove(job_id)
+        self.pending_jobs.append(job_id)
+
+    @sync
     def promote_job(self, job_id, requesting_user_name=None):
         # According to RFC 3998, we need to put the job at the front
