Show
Ignore:
Timestamp:
11/20/07 00:04:09 (16 years ago)
Author:
jerome
Message:

Major code cleaning. Now clearer, although probably a bit slower since
a file can be opened several times.
Now universal line opening mode is only used when needed (PS, PDF and plain
text), and binary opening mode is used for the other formats.
This mean we will be able to remove mmap calls wherever possible, finally.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • pkpgcounter/trunk/pkpgpdls/lidil.py

    r488 r491  
    2929""" 
    3030 
    31 import sys 
    32 import os 
    33 import mmap 
    3431import struct 
    3532 
    3633import pdlparser 
     34 
     35HEADERSIZE = 10 # LIDIL header is 10 bytes long 
    3736 
    3837# Packet types taken from hplip-2.7.10/prnt/ldl.py 
     
    7473        unpack = struct.unpack 
    7574        ejectpage = loadpage = 0 
    76         infileno = self.infile.fileno() 
    77         minfile = mmap.mmap(infileno, os.fstat(infileno)[6], prot=mmap.PROT_READ, flags=mmap.MAP_SHARED) 
    78         pos = 0 
    79         try : 
    80             try : 
    81                 while 1 : 
    82                     if minfile[pos] != "$" :    # Frame Sync 
    83                         raise pdlparser.PDLParserError, "This file doesn't seem to be valid Hewlett-Packard LIDIL datas" 
    84                     try :     
    85                         (framesync,      
    86                          cmdlength, 
    87                          dummy, 
    88                          packettype, 
    89                          commandnumber, 
    90                          referencenumber, 
    91                          datalength) = unpack(">BHBBBHH", minfile[pos:pos+10]) 
    92                     except struct.error :     
    93                         raise pdlparser.PDLParserError, "This file doesn't seem to be valid Hewlett-Packard LIDIL datas" 
    94                     if packettype == PACKET_TYPE_COMMAND : 
    95                         if commandnumber == LDL_LOAD_PAGE : 
    96                             loadpage += 1 
    97                         elif commandnumber == LDL_EJECT_PAGE : 
    98                             ejectpage += 1 
    99                     pos += (cmdlength + datalength) 
    100             except IndexError : # EOF ? 
    101                 pass  
    102         finally :         
    103             minfile.close() 
     75        while True : 
     76            header = self.infile.read(HEADERSIZE) 
     77            if not header : 
     78                break 
     79            if (len(header) != HEADERSIZE) or (header[0] != "$") : 
     80                # Invalid header or no Frame Sync byte. 
     81                raise pdlparser.PDLParserError, "This file doesn't seem to be valid Hewlett-Packard LIDIL datas." 
     82            try :     
     83                (framesync,      
     84                 cmdlength, 
     85                 dummy, 
     86                 packettype, 
     87                 commandnumber, 
     88                 referencenumber, 
     89                 datalength) = unpack(">BHBBBHH", header) 
     90            except struct.error :     
     91                raise pdlparser.PDLParserError, "This file doesn't seem to be valid Hewlett-Packard LIDIL datas." 
     92            if packettype == PACKET_TYPE_COMMAND : 
     93                if commandnumber == LDL_LOAD_PAGE : 
     94                    loadpage += 1 
     95                elif commandnumber == LDL_EJECT_PAGE : 
     96                    ejectpage += 1 
     97            self.infile.seek(cmdlength + datalength - len(header), 1) # relative seek 
    10498             
    10599        # Number of page eject commands should be sufficient, 
     
    110104        self.logdebug("Load : %i    Eject : %i" % (loadpage, ejectpage)) 
    111105        return max(loadpage, ejectpage) 
    112  
    113 if __name__ == "__main__" :     
    114     pdlparser.test(Parser)