Index: pkpgcounter/trunk/pkpgpdls/cfax.py
===================================================================
--- pkpgcounter/trunk/pkpgpdls/cfax.py (revision 539)
+++ pkpgcounter/trunk/pkpgpdls/cfax.py (revision 539)
@@ -0,0 +1,104 @@
+#! /usr/bin/env python
+# -*- coding: ISO-8859-15 -*-
+#
+# pkpgcounter : a generic Page Description Language parser
+#
+# (c) 2003, 2004, 2005, 2006, 2007 Jerome Alet <alet@librelogiciel.com>
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# $Id$
+#
+
+"""This modules implements a page counter for Structured Fax documents."""
+
+import struct
+
+import pdlparser
+
+class Parser(pdlparser.PDLParser) :
+    """A parser for Structured Fax documents."""
+    def isValid(self) :        
+        """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 Structured Fax document.
+        
+           Algorithm by Jerome Alet.
+           
+           The documentation used for this was :
+         
+           http://delphi.pjh2.de/articles/graphic/sff_format.php
+        """
+        unpack = struct.unpack
+        pagecount = 0
+        docheader = self.infile.read(20)
+        try :
+            (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)     
Index: pkpgcounter/trunk/pkpgpdls/analyzer.py
===================================================================
--- pkpgcounter/trunk/pkpgpdls/analyzer.py (revision 529)
+++ pkpgcounter/trunk/pkpgpdls/analyzer.py (revision 539)
@@ -28,6 +28,7 @@
 import tempfile
 
-import version, pdlparser, postscript, pdf, pcl345, pclxl, hbp, pil, mscrap, \
-       lidil, escp2, dvi, tiff, ooo, zjstream, qpdl, spl1, escpages03, plain
+import version, pdlparser, postscript, pdf, pcl345, pclxl, hbp, \
+       pil, mscrap, cfax, lidil, escp2, dvi, tiff, ooo, zjstream, \
+       qpdl, spl1, escpages03, plain
 import inkcoverage
 
@@ -155,4 +156,5 @@
                        dvi, \
                        tiff, \
+                       cfax, \
                        zjstream, \
                        ooo, \
Index: pkpgcounter/trunk/pkpgpdls/version.py
===================================================================
--- pkpgcounter/trunk/pkpgpdls/version.py (revision 531)
+++ pkpgcounter/trunk/pkpgpdls/version.py (revision 539)
@@ -22,5 +22,5 @@
 
 
-__version__ = "3.41alpha"
+__version__ = "3.50alpha"
 
 __doc__ = """pkpgcounter : a generic Page Description Languages parser."""
Index: pkpgcounter/trunk/bin/pkpgcounter
===================================================================
--- pkpgcounter/trunk/bin/pkpgcounter (revision 529)
+++ pkpgcounter/trunk/bin/pkpgcounter (revision 539)
@@ -56,6 +56,7 @@
     * Brother HBP
     * Hewlett-Packard LIDIL (hpijs)
+    * Structured Fax
 
-The seven latter ones, as well as some TIFF documents, are currently
+The eight latter ones, as well as some TIFF documents, are currently
 only supported in page counting mode.
 
Index: pkpgcounter/trunk/man/pkpgcounter.1
===================================================================
--- pkpgcounter/trunk/man/pkpgcounter.1 (revision 529)
+++ pkpgcounter/trunk/man/pkpgcounter.1 (revision 539)
@@ -1,8 +1,8 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.36.
-.TH PKPGCOUNTER "1" "November 2007" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.TH PKPGCOUNTER "1" "December 2007" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
 .SH NAME
 pkpgcounter \- count number of pages required to print various types of documents
 .SH DESCRIPTION
-pkpgcounter v3.40 (c) 2003, 2004, 2005, 2006, 2007 Jerome Alet
+pkpgcounter v3.50alpha (c) 2003, 2004, 2005, 2006, 2007 Jerome Alet
 .PP
 pkpgcounter is a generic Page Description Language parser.
@@ -33,6 +33,7 @@
 * Brother HBP
 * Hewlett\-Packard LIDIL (hpijs)
+* Structured Fax
 .PP
-The seven latter ones, as well as some TIFF documents, are currently
+The eight latter ones, as well as some TIFF documents, are currently
 only supported in page counting mode.
 .PP
Index: pkpgcounter/trunk/NEWS
===================================================================
--- pkpgcounter/trunk/NEWS (revision 529)
+++ pkpgcounter/trunk/NEWS (revision 539)
@@ -21,4 +21,10 @@
 pkpgcounter News :
 
+  * 3.50 :
+  
+    - Added support for Structured Fax documents in page counting mode.
+    
+    - Fixed a problem with the parsing of SPL1 (GDI) documents.
+    
   * 3.40 :
   
Index: pkpgcounter/trunk/README
===================================================================
--- pkpgcounter/trunk/README (revision 529)
+++ pkpgcounter/trunk/README (revision 539)
@@ -59,5 +59,7 @@
         - Hewlett-Packard Lightweight Imaging Device Interface Language
         
-The seven latter ones, as well as some TIFF documents, are currently 
+        - Structured Fax
+        
+The eight latter ones, as well as some TIFF documents, are currently 
 only supported in page counting mode. 
 
