Show
Ignore:
Timestamp:
11/13/03 00:29:24 (21 years ago)
Author:
jalet
Message:

More work on new backend. This commit may be unstable.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • pykota/trunk/pykota/accounters/querying.py

    r1144 r1180  
    2222# 
    2323# $Log$ 
     24# Revision 1.7  2003/11/12 23:29:24  jalet 
     25# More work on new backend. This commit may be unstable. 
     26# 
    2427# Revision 1.6  2003/10/07 09:07:29  jalet 
    2528# Character encoding added to please latest version of Python 
     
    4447 
    4548import sys 
     49import os 
    4650import time 
    4751from pykota.accounter import AccounterBase, PyKotaAccounterError 
     
    5256 
    5357class Accounter(AccounterBase) : 
     58    def __init__(self, kotabackend, arguments) : 
     59        """Initializes querying accounter.""" 
     60        AccounterBase.__init__(self, kotabackend, arguments) 
     61        self.requester = openRequester(kotabackend.config, kotabackend.printername) 
     62         
     63    def getPrinterInternalPageCounter(self) :     
     64        """Returns the printer's internal page counter.""" 
     65        global MAXTRIES, TIMETOSLEEP 
     66        for i in range(MAXTRIES) : 
     67            try : 
     68                counter = self.requester.getPrinterPageCounter(self.filter.printerhostname) 
     69            except PyKotaRequesterError, msg : 
     70                # can't get actual page counter, assume printer is off or warming up 
     71                # log the message anyway. 
     72                self.filter.logger.log_message("%s" % msg, "warn") 
     73                counter = None 
     74            else :     
     75                # printer answered, it is on so we can exit the loop 
     76                break 
     77            time.sleep(TIMETOSLEEP)     
     78        return counter     
     79         
     80    def beginJob(self, printer, user) :     
     81        """Saves printer internal page counter at start of job.""" 
     82        # save page counter before job 
     83        self.LastPageCounter = self.counterbefore = self.getPrinterInternalPageCounter() 
     84         
     85    def endJob(self, printer, user) :     
     86        """Saves printer internal page counter at end of job.""" 
     87        # save page counter after job 
     88        self.LastPageCounter = self.counterafter = self.getPrinterInternalPageCounter() 
     89         
     90    def getJobSize(self) :     
     91        """Returns the actual job size.""" 
     92        try : 
     93            jobsize = (self.counterafter - self.counterbefore)     
     94            if jobsize < 0 : 
     95                # Try to take care of HP printers  
     96                # Their internal page counter is saved to NVRAM 
     97                # only every 10 pages. If the printer was switched 
     98                # off then back on during the job, and that the 
     99                # counters difference is negative, we know  
     100                # the formula (we can't know if more than eleven 
     101                # pages were printed though) : 
     102                if jobsize > -10 : 
     103                    jobsize += 10 
     104                else :     
     105                    # here we may have got a printer being replaced 
     106                    # DURING the job. This is HIGHLY improbable ! 
     107                    jobsize = 0 
     108        except :     
     109            # takes care of the case where one counter (or both) was never set. 
     110            jobsize = 0 
     111        return jobsize 
     112         
    54113    def doAccounting(self, printer, user) : 
    55114        """Does print accounting and returns if the job status is ALLOW or DENY.""" 
     
    57116        # Tries MAXTRIES times, sleeping two seconds each time, in case the printer is sleeping. 
    58117        # This was seen with my Apple LaserWriter 16/600 PS which doesn't answer before having warmed up. 
    59         global MAXTRIES, TIMETOSLEEP 
    60         requester = openRequester(self.filter.config, self.filter.printername) 
    61         for i in range(MAXTRIES) : 
    62             try : 
    63                 counterbeforejob = requester.getPrinterPageCounter(self.filter.printerhostname) 
    64             except PyKotaRequesterError, msg : 
    65                 # can't get actual page counter, assume printer is off or warming up 
    66                 # log the message anyway. 
    67                 self.filter.logger.log_message("%s" % msg, "warn") 
    68                 counterbeforejob = None 
    69                 printerIsOff = 1 
    70             else :     
    71                 # printer answered, it is on so we can exit the loop 
    72                 printerIsOff = 0 
    73                 break 
    74             time.sleep(TIMETOSLEEP)     
     118        counterbeforejob = self.getPrinterInternalPageCounter() 
    75119         
    76120        # get last job information for this printer 
     
    85129             
    86130        # if printer is off then we assume the correct counter value is the last one 
    87         if printerIsOff : 
     131        if counterbeforejob is None : 
    88132            counterbeforejob = lastpagecounter 
    89133