Changeset 3436 for pkpgcounter/trunk/pkpgpdls/qpdl.py
- Timestamp:
- 10/06/08 00:22:07 (16 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
pkpgcounter/trunk/pkpgpdls/qpdl.py
r3410 r3436 8 8 # the Free Software Foundation, either version 3 of the License, or 9 9 # (at your option) any later version. 10 # 10 # 11 11 # This program is distributed in the hope that it will be useful, 12 12 # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 14 # GNU General Public License for more details. 15 # 15 # 16 16 # You should have received a copy of the GNU General Public License 17 17 # along with this program. If not, see <http://www.gnu.org/licenses/>. … … 33 33 """A parser for QPDL (aka SPL2) documents.""" 34 34 format = "QPDL (aka SPL2)" 35 mediasizes = { 35 mediasizes = { 36 36 # The first values are identical to that of PCLXL 37 37 0 : "Letter", … … 57 57 23 : "C6", 58 58 24 : "Folio", 59 } 60 61 mediasources = { 59 } 60 61 mediasources = { 62 62 # Again, values are identical to that of PCLXL 63 63 0 : "Default", … … 70 70 7 : "ThirdCassette", 71 71 } 72 73 def isValid(self) : 72 73 def isValid(self) : 74 74 """Returns True if data is QPDL aka SPL2, else False.""" 75 75 if ((self.firstblock[:128].find("\033%-12345X") != -1) and \ … … 77 77 (self.firstblock.find("LANGUAGE = QPDL") != -1))) : 78 78 return True 79 else : 79 else : 80 80 return False 81 81 82 82 def beginPage(self, nextpos) : 83 83 """Indicates the beginning of a new page, and extracts media information.""" 84 84 self.pagecount += 1 85 85 86 86 copies = unpack(self.unpackShort, self.minfile[nextpos+1:nextpos+3])[0] 87 87 mediasize = ord(self.minfile[nextpos+3]) 88 88 mediasource = ord(self.minfile[nextpos+8]) 89 89 duplexmode = unpack(self.unpackShort, self.minfile[nextpos+10:nextpos+12])[0] 90 91 self.pages[self.pagecount] = { "copies" : copies, 90 91 self.pages[self.pagecount] = { "copies" : copies, 92 92 "mediasize" : self.mediasizes.get(mediasize, str(mediasize)), 93 93 "mediasource" : self.mediasources.get(mediasource, str(mediasource)), 94 94 "duplex" : duplexmode, 95 } 95 } 96 96 return 16 # Length of a page header 97 98 def endPage(self, nextpos) : 97 98 def endPage(self, nextpos) : 99 99 """Indicates the end of a page.""" 100 100 epcopies = unpack(self.unpackShort, self.minfile[nextpos:nextpos+2])[0] … … 103 103 self.logdebug("ERROR: discrepancy between beginPage (%i) and endPage (%i) copies" % (bpcopies, epcopies)) 104 104 return 2 # Length of a page footer 105 105 106 106 def beginBand(self, nextpos) : 107 107 """Indicates the beginning of a new band.""" 108 108 bandlength = unpack(self.unpackLong, self.minfile[nextpos+6:nextpos+10])[0] 109 109 return bandlength + 10 # Length of a band header - length of checksum 110 110 111 111 def littleEndian(self) : 112 112 """Toggles to little endianness.""" … … 115 115 self.unpackLong = self.unpackType[4] 116 116 return 0 117 117 118 118 def bigEndian(self) : 119 119 """Toggles to big endianness.""" … … 122 122 self.unpackLong = self.unpackType[4] 123 123 return 0 124 125 def escape(self, nextpos) : 124 125 def escape(self, nextpos) : 126 126 """Handles the ESC code.""" 127 127 pos = endpos = nextpos … … 137 137 quotes += 1 138 138 endpos += 1 139 140 # Store this in a per page mapping. 139 140 # Store this in a per page mapping. 141 141 # NB : First time will be at page 0 (i.e. **before** page 1) ! 142 142 stuff = self.escapedStuff.setdefault(self.pagecount, []) … … 144 144 self.logdebug("Escaped datas : [%s]" % repr(minfile[pos : endpos])) 145 145 return endpos - pos 146 147 def maybeEOF(self, nextpos) : 146 147 def maybeEOF(self, nextpos) : 148 148 """Tries to detect the EOF marker.""" 149 149 if self.minfile[nextpos:nextpos+9] == self.eofmarker : 150 150 return 9 151 else : 151 else : 152 152 return 0 153 153 154 154 def getJobSize(self) : 155 155 """Counts pages in a QPDL (SPL2) document. 156 156 157 157 Algorithm by Jerome Alet. 158 158 159 159 The documentation used for this was : 160 160 161 161 Sp�fication Technique (documentation non officielle) 162 162 Le Language SPL2 … … 165 165 """ 166 166 # Initialize table of tags 167 self.tags = [ lambda pos : 0 ] * 256 167 self.tags = [ lambda pos : 0 ] * 256 168 168 self.tags[0x00] = self.beginPage 169 169 self.tags[0x01] = self.endPage … … 171 171 self.tags[0x0c] = self.beginBand 172 172 self.tags[0x1b] = self.escape # The escape code 173 173 174 174 self.eofmarker = "\033%-12345X" 175 175 176 176 infileno = self.infile.fileno() 177 self.pages = { 0 : { "copies" : 1, 178 "orientation" : "Default", 179 "mediatype" : "Plain", 180 "mediasize" : "Default", 181 "mediasource" : "Default", 177 self.pages = { 0 : { "copies" : 1, 178 "orientation" : "Default", 179 "mediatype" : "Plain", 180 "mediasize" : "Default", 181 "mediasource" : "Default", 182 182 "duplex" : None, 183 } 184 } 183 } 184 } 185 185 self.minfile = minfile = mmap.mmap(infileno, os.fstat(infileno)[6], prot=mmap.PROT_READ, flags=mmap.MAP_SHARED) 186 186 self.pagecount = 0 … … 195 195 pos += 1 196 196 pos += tags[tag](pos) 197 except IndexError : # EOF ? 197 except IndexError : # EOF ? 198 198 pass 199 199 finally : 200 200 self.minfile.close() 201 201 202 202 defaultduplexmode = "Simplex" 203 203 defaultpapersize = "" 204 defaultpjlcopies = 1 204 defaultpjlcopies = 1 205 205 oldpjlcopies = -1 206 206 oldduplexmode = "" … … 208 208 for pnum in range(1, self.pagecount + 1) : 209 209 # NB : is number of copies is 0, the page won't be output 210 # but the formula below is still correct : we want 210 # but the formula below is still correct : we want 211 211 # to decrease the total number of pages in this case. 212 212 page = self.pages.get(pnum, self.pages.get(1, { "copies" : 1, "mediasize" : "Default", "duplex" : None })) … … 227 227 pjlcopies = nbqty 228 228 else : 229 if oldpjlcopies == -1 : 229 if oldpjlcopies == -1 : 230 230 pjlcopies = defaultpjlcopies 231 else : 232 pjlcopies = oldpjlcopies 233 if page["duplex"] : 231 else : 232 pjlcopies = oldpjlcopies 233 if page["duplex"] : 234 234 duplexmode = page["duplex"] 235 else : 235 else : 236 236 defaultdm = pjlparser.default_variables.get("DUPLEX", "") 237 237 if defaultdm : 238 238 if defaultdm.upper() == "ON" : 239 239 defaultduplexmode = "Duplex" 240 else : 240 else : 241 241 defaultduplexmode = "Simplex" 242 242 envdm = pjlparser.environment_variables.get("DUPLEX", "") … … 244 244 if envdm.upper() == "ON" : 245 245 duplexmode = "Duplex" 246 else : 246 else : 247 247 duplexmode = "Simplex" 248 else : 248 else : 249 249 if not oldduplexmode : 250 250 duplexmode = defaultduplexmode 251 else : 251 else : 252 252 duplexmode = oldduplexmode 253 253 defaultps = pjlparser.default_variables.get("PAPER", "") … … 257 257 if envps : 258 258 papersize = envps 259 else : 259 else : 260 260 if not oldpapersize : 261 261 papersize = defaultpapersize 262 else : 262 else : 263 263 papersize = oldpapersize 264 else : 264 else : 265 265 if oldpjlcopies == -1 : 266 266 pjlcopies = defaultpjlcopies 267 else : 267 else : 268 268 pjlcopies = oldpjlcopies 269 269 if not oldduplexmode : 270 270 duplexmode = defaultduplexmode 271 else : 271 else : 272 272 duplexmode = oldduplexmode 273 if not oldpapersize : 273 if not oldpapersize : 274 274 papersize = defaultpapersize 275 else : 275 else : 276 276 papersize = oldpapersize 277 277 duplexmode = oldduplexmode … … 279 279 if page["mediasize"] != "Default" : 280 280 papersize = page["mediasize"] 281 if not duplexmode : 281 if not duplexmode : 282 282 duplexmode = oldduplexmode or defaultduplexmode 283 oldpjlcopies = pjlcopies 283 oldpjlcopies = pjlcopies 284 284 oldduplexmode = duplexmode 285 285 oldpapersize = papersize 286 286 copies = max(pjlcopies, page["copies"]) # Was : pjlcopies * page["copies"] 287 287 self.pagecount += (copies - 1) 288 self.logdebug("%s*%s*%s*%s" % (copies, 289 papersize, 290 page["mediasource"], 288 self.logdebug("%s*%s*%s*%s" % (copies, 289 papersize, 290 page["mediasource"], 291 291 duplexmode)) 292 292 return self.pagecount