home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_1986 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  5.0 KB  |  133 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import sys
  5. from isapi import isapicon, ExtensionError
  6. import isapi.simple as isapi
  7. from win32file import GetQueuedCompletionStatus, CreateIoCompletionPort, PostQueuedCompletionStatus, CloseHandle
  8. from win32security import SetThreadToken
  9. from win32event import INFINITE
  10. from pywintypes import OVERLAPPED
  11. if sys.hexversion < 33816576:
  12.     import locale
  13.     locale.setlocale(locale.LC_NUMERIC, 'C')
  14.  
  15. import threading
  16. import traceback
  17. ISAPI_REQUEST = 1
  18. ISAPI_SHUTDOWN = 2
  19.  
  20. class WorkerThread(threading.Thread):
  21.     
  22.     def __init__(self, extension, io_req_port):
  23.         self.running = False
  24.         self.io_req_port = io_req_port
  25.         self.extension = extension
  26.         threading.Thread.__init__(self)
  27.  
  28.     
  29.     def run(self):
  30.         self.running = True
  31.         while self.running:
  32.             (errCode, bytes, key, overlapped) = GetQueuedCompletionStatus(self.io_req_port, INFINITE)
  33.             if key == ISAPI_SHUTDOWN and overlapped is None:
  34.                 break
  35.             
  36.             dispatcher = self.extension.dispatch_map.get(key)
  37.             if dispatcher is None:
  38.                 raise RuntimeError, "Bad request '%s'" % (key,)
  39.             dispatcher is None
  40.             dispatcher(errCode, bytes, key, overlapped)
  41.  
  42.     
  43.     def call_handler(self, cblock):
  44.         self.extension.Dispatch(cblock)
  45.  
  46.  
  47.  
  48. class ThreadPoolExtension(isapi.simple.SimpleExtension):
  49.     max_workers = 20
  50.     worker_shutdown_wait = 15000
  51.     
  52.     def __init__(self):
  53.         self.workers = []
  54.         self.dispatch_map = {
  55.             ISAPI_REQUEST: self.DispatchConnection }
  56.  
  57.     
  58.     def GetExtensionVersion(self, vi):
  59.         isapi.simple.SimpleExtension.GetExtensionVersion(self, vi)
  60.         self.io_req_port = CreateIoCompletionPort(-1, None, 0, 0)
  61.         self.workers = []
  62.         for i in range(self.max_workers):
  63.             worker = WorkerThread(self, self.io_req_port)
  64.             worker.start()
  65.             self.workers.append(worker)
  66.         
  67.  
  68.     
  69.     def HttpExtensionProc(self, control_block):
  70.         overlapped = OVERLAPPED()
  71.         overlapped.object = control_block
  72.         PostQueuedCompletionStatus(self.io_req_port, 0, ISAPI_REQUEST, overlapped)
  73.         return isapicon.HSE_STATUS_PENDING
  74.  
  75.     
  76.     def TerminateExtension(self, status):
  77.         for worker in self.workers:
  78.             worker.running = False
  79.         
  80.         for worker in self.workers:
  81.             PostQueuedCompletionStatus(self.io_req_port, 0, ISAPI_SHUTDOWN, None)
  82.         
  83.         for worker in self.workers:
  84.             worker.join(self.worker_shutdown_wait)
  85.         
  86.         self.dispatch_map = { }
  87.         CloseHandle(self.io_req_port)
  88.  
  89.     
  90.     def DispatchConnection(self, errCode, bytes, key, overlapped):
  91.         control_block = overlapped.object
  92.         hRequestToken = control_block.GetImpersonationToken()
  93.         SetThreadToken(None, hRequestToken)
  94.         
  95.         try:
  96.             self.Dispatch(control_block)
  97.         except:
  98.             self.HandleDispatchError(control_block)
  99.         finally:
  100.             SetThreadToken(None, None)
  101.  
  102.  
  103.     
  104.     def Dispatch(self, ecb):
  105.         raise NotImplementedError, 'sub-classes should override Dispatch'
  106.  
  107.     
  108.     def HandleDispatchError(self, ecb):
  109.         ecb.HttpStatusCode = isapicon.HSE_STATUS_ERROR
  110.         (exc_typ, exc_val, exc_tb) = sys.exc_info()
  111.         limit = None
  112.         
  113.         try:
  114.             import cgi
  115.             ecb.SendResponseHeaders('200 OK', 'Content-type: text/html\r\n\r\n', False)
  116.             print >>ecb
  117.             print >>ecb, '<H3>Traceback (most recent call last):</H3>'
  118.             list = traceback.format_tb(exc_tb, limit) + traceback.format_exception_only(exc_typ, exc_val)
  119.             print >>ecb, '<PRE>%s<B>%s</B></PRE>' % (cgi.escape(''.join(list[:-1])), cgi.escape(list[-1]))
  120.         except ExtensionError:
  121.             pass
  122.         except:
  123.             print 'FAILED to render the error message!'
  124.             traceback.print_exc()
  125.             print 'ORIGINAL extension error:'
  126.             traceback.print_exception(exc_typ, exc_val, exc_tb)
  127.         finally:
  128.             exc_tb = None
  129.             ecb.DoneWithSession()
  130.  
  131.  
  132.  
  133.