Index: pkpgcounter/trunk/pkpgpdls/cfax.py
===================================================================
--- pkpgcounter/trunk/pkpgpdls/dvi.py (revision 527)
+++ pkpgcounter/trunk/pkpgpdls/cfax.py (revision 539)
@@ -21,31 +21,22 @@
 #
 
-"""This modules implements a page counter for DVI documents."""
+"""This modules implements a page counter for Structured Fax documents."""
 
-import sys
-import os
-import mmap
-from struct import unpack
+import struct
 
 import pdlparser
 
 class Parser(pdlparser.PDLParser) :
-    """A parser for DVI documents."""
-    totiffcommands = [ 'dvips -q -o - "%(infname)s" | gs -sDEVICE=tiff24nc -dPARANOIDSAFER -dNOPAUSE -dBATCH -dQUIET -r"%(dpi)i" -sOutputFile="%(outfname)s" -' ]
-    required = [ "dvips", "gs" ]
+    """A parser for Structured Fax documents."""
     def isValid(self) :        
-        """Returns True if data is DVI, else False."""
-        try :
-            if (ord(self.firstblock[0]) == 0xf7) \
-                and (ord(self.lastblock[-1]) == 0xdf) :
-                self.logdebug("DEBUG: Input file is in the DVI format.")
-                return True
-            else :    
-                return False
-        except IndexError :          
+        """Returns True if data is Structured Fax, else False."""
+        if self.firstblock.startswith("Sfff") :
+            self.logdebug("DEBUG: Input file is in the Structured Fax format.")
+            return True
+        else :    
             return False
             
     def getJobSize(self) :
-        """Counts pages in a DVI document.
+        """Counts pages in a Structured Fax document.
         
            Algorithm by Jerome Alet.
@@ -53,26 +44,61 @@
            The documentation used for this was :
          
-           http://www.math.umd.edu/~asnowden/comp-cont/dvi.html
+           http://delphi.pjh2.de/articles/graphic/sff_format.php
         """
-        infileno = self.infile.fileno()
-        minfile = mmap.mmap(infileno, os.fstat(infileno)[6], prot=mmap.PROT_READ, flags=mmap.MAP_SHARED)
+        unpack = struct.unpack
         pagecount = 0
-        pos = -1
-        eofchar = chr(0xdf)
-        postchar = chr(0xf8)
+        docheader = self.infile.read(20)
         try :
-            try :
-                while minfile[pos] == eofchar :
-                    pos -= 1
-                idbyte = minfile[pos]    
-                if idbyte != minfile[1] :
-                    raise IndexError, "Invalid DVI file."
-                pos = unpack(">I", minfile[pos - 4:pos])[0]
-                if minfile[pos] != postchar :
-                    raise IndexError, "Invalid DVI file."
-                pagecount = unpack(">H", minfile[pos + 27: pos + 29])[0]
-            except IndexError : # EOF ?
-                pass
-        finally :        
-            minfile.close() # reached EOF
-        return pagecount
+            (sffid,
+             version,
+             reserved,
+             userinfo,
+             docpagecount,
+             offsetfirstpage,
+             offsetlastpage,
+             offsetdocumentend) = unpack("<4sBBHHHII", docheader)
+            self.infile.seek(offsetfirstpage - len(docheader), 1)     
+            while True :
+                headerid = self.infile.read(1)
+                if not headerid :
+                    break
+                headerid = ord(headerid)    
+                if 1 <= headerid <= 216 : # Normal record header
+                    self.infile.seek(headerid, 1)
+                elif headerid == 255 :    # Illegal line / Additional user info
+                    additionalbyte = self.infile.read(1)
+                    if not additionalbyte :
+                        break
+                    additionalbyte = ord(additionalbyte)    
+                    if 1 <= additionalbyte <= 255 :
+                        # Skip additional user information (reserved)
+                        self.infile.seek(additionalbyte, 1)
+                elif not headerid :        
+                    # Record with more than 216 MH-coded bytes
+                    recordlen = self.infile.read(2)
+                    if not recordlen :
+                        break
+                    recordlen = unpack("<H", recordlen)[0]    
+                    self.infile.seek(recordlen, 1)
+                elif headerid == 254 : # Page header
+                    pageheader = self.infile.read(17)
+                    if not pageheader : 
+                        break
+                    headerlen = ord(pageheader[0])
+                    if not headerlen :
+                        break # End Of Document
+                    (vres,
+                     hres,
+                     coding,
+                     reserved,
+                     linelen,
+                     pagelen,
+                     offsetpreviouspage,
+                     offsetnextpage) = unpack("<4BHHII", pageheader[1:])
+                    pagecount += 1    
+                    if (offsetnextpage == 1) or (vres == 255) :
+                        break # End Of Document
+                    self.infile.seek(offsetnextpage, 1)    
+        except struct.error :     
+             raise pdlparser.PDLParserError, "Invalid Structured Fax datas"
+        return max(docpagecount, pagecount)     
