home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2009 May / maximum-cd-2009-05.iso / DiscContents / XBMC_for_Windows-8.10.exe / system / python / spyce / modules / error.py < prev    next >
Encoding:
Python Source  |  2008-11-03  |  5.8 KB  |  171 lines

  1. ##################################################
  2. # SPYCE - Python-based HTML Scripting
  3. # Copyright (c) 2002 Rimon Barr.
  4. #
  5. # Refer to spyce.py
  6. # CVS: $Id: error.py 5659 2006-04-27 16:15:15Z jwnmulder $
  7. ##################################################
  8.  
  9. from spyceModule import spyceModule
  10. import spyceException
  11. import os
  12.  
  13. __doc__ = '''Error module provides error-handling functionality.'''
  14.  
  15. class error(spyceModule):
  16.   def start(self):
  17.     self._error = None
  18.     pageerrorType, pageerrorData = self._api.getPageError()
  19.     self.handler = lambda self: spyceHandler(self, pageerrorData, pageerrorType)
  20.   def finish(self, theError=None):
  21.     self._error = theError
  22.     self._fromFile = self._api.getFilename()
  23.     if theError:
  24.       self.handler(self)
  25.   def setHandler(self, fn):
  26.     if not type(fn)==type(spyceHandler):
  27.       raise 'parameter should be a function'
  28.     self.handler = fn
  29.   def setStringHandler(self, s):
  30.     if not type(s)==type(''):
  31.       raise 'parameter should be a string of spyce code'
  32.     self.handler = lambda self, s=s: spyceHandler(self, s, 'string')
  33.   def setFileHandler(self, f):
  34.     if not type(f)==type(''):
  35.       raise 'parameter should be a filename'
  36.     self.handler = lambda self, f=f: spyceHandler(self, f)
  37.   def getHandler(self):
  38.     return self.handler
  39.   def isError(self):
  40.     return not not self._error
  41.   def getMessage(self):
  42.     if self._error: return self._error.msg
  43.   def getType(self):
  44.     if self._error: return self._error.type
  45.   def getFile(self):
  46.     if self._error: return self._fromFile
  47.   def getTraceback(self):
  48.     if self._error: return self._error.traceback
  49.   def getString(self):
  50.     if self._error: return self._error.str
  51.   def __repr__(self):
  52.     if not self._error: return 'None'
  53.     return 'type: %s, string: %s, msg: %s, file: %s' % (
  54.       self.getType(), self.getString(), self.getMessage(), self.getFile())
  55.  
  56. def spyceHandler(errorModule, spyceCode, type='file'):
  57.   try:
  58.     responseModule = errorModule._api.getModule('response')
  59.     responseModule.clear()
  60.     responseModule.clearHeaders()
  61.     responseModule.setContentType('text/html')
  62.     responseModule.setReturnCode(errorModule._api.getResponse().RETURN_OK)
  63.   except: pass
  64.   try:
  65.     s, file = None, None
  66.     if type=='file':
  67.       file = os.path.join(os.path.dirname(errorModule._api.getFilename()), spyceCode)
  68.       code = errorModule._api.spyceFile(file)
  69.     elif type=='string':
  70.       file = '<string>'
  71.       code = errorModule._api.spyceString(spyceCode)
  72.     else:
  73.       raise 'unrecognized handler type'
  74.     try:
  75.       s = code.newWrapper()
  76.       modules = errorModule._api.getModules()
  77.       for name in modules.keys():
  78.         s.setModule(name, modules[name])  # include module as well!
  79.       s.spyceInit(errorModule._api.getRequest(), errorModule._api.getResponse())
  80.       errmod = s._startModule('error', None, None, 1)
  81.       errmod._error = errorModule._error
  82.       errmod._fromFile = errorModule._fromFile
  83.       s.spyceProcess()
  84.     finally:
  85.       if s: 
  86.         s.spyceDestroy()
  87.         code.returnWrapper(s)
  88.   except spyceException.spyceRuntimeException, e:
  89.     errorModule._error = e
  90.     errorModule._fromFile = file
  91.     if (type, spyceCode) == ('string', defaultErrorTemplate):
  92.       raise  # avoid infinite loop
  93.     else:
  94.       spyceHandler(errorModule, defaultErrorTemplate, 'string')
  95.  
  96. defaultErrorTemplate = '''
  97. [[.module name=transform]]
  98. [[transform.expr('html_encode')]]
  99. <html>
  100. <title>Spyce exception: [[=error.getMessage()]]</title>
  101. <body>
  102. <table border=0>
  103.   <tr><td colspan=2><h1>Spyce exception</h1></td></tr>
  104.   <tr><td valign=top><b>File:</b></td><td>[[=error.getFile()]]</tr>
  105.   <tr><td valign=top><b>Message:</b></td>
  106.     <td><pre>[[=error.getMessage()]]</pre></tr>
  107.   <tr><td valign=top><b>Stack:</b></td><td>
  108.     [[ for frame in error.getTraceback(): { ]]
  109.       [[=frame[0] ]]:[[=frame[1] ]], in [[=frame[2] ]]:<br>
  110.       <table border=0><tr><td width=10></td><td>
  111.         <pre>[[=frame[3] ]]</pre>
  112.       </td></tr></table>
  113.     [[ } ]]
  114.     </td></tr>
  115. </table>
  116. </body></html>
  117. '''
  118.  
  119. def serverHandler(theServer, theRequest, theResponse, theError):
  120.   try:
  121.     theResponse.clear()
  122.     theResponse.clearHeaders()
  123.     theResponse.setContentType('text/html')
  124.     theResponse.setReturnCode(theResponse.RETURN_OK)
  125.   except: pass
  126.   s = None
  127.   try:
  128.     spycecode = theServer.spyce_cache[('string', serverErrorTemplate)]
  129.     s = spycecode.newWrapper()
  130.     s.spyceInit(theRequest, theResponse)
  131.     s.getModule('error')._error = theError
  132.     s.spyceProcess()
  133.   finally:
  134.     if s: 
  135.       s.spyceDestroy()
  136.       spycecode.returnWrapper(s)
  137.  
  138.  
  139. serverErrorTemplate = '''
  140. [[.module name=transform]]
  141. [[import string, spyceException
  142.   if isinstance(error._error, spyceException.spyceNotFound): { ]]
  143.   <html><body>
  144.   [[=error._error.file]] not found
  145.   [[response.setReturnCode(response._api.getResponse().RETURN_NOT_FOUND)]]
  146.   </body></html>
  147. [[ } elif isinstance(error._error, spyceException.spyceForbidden): { ]]
  148.   <html><body>
  149.   [[=error._error.file]] forbidden
  150.   [[response.setReturnCode(response._api.getResponse().RETURN_FORBIDDEN)]]
  151.   </body></html>
  152. [[ } elif isinstance(error._error, spyceException.spyceSyntaxError): { ]]
  153.   <html><body><pre>
  154.   [[=transform.html_encode(`error._error`)]]
  155.   </pre></body></html>
  156. [[ } elif isinstance(error._error, spyceException.pythonSyntaxError): { ]]
  157.   <html><body><pre>
  158.   [[=transform.html_encode(`error._error`)]]
  159.   </pre></body></html>
  160. [[ } elif isinstance(error._error, SyntaxError): { ]]
  161.   <html><body><pre>
  162.   Syntax error at [[=error._error.filename]]:[[=error._error.lineno]] - 
  163.     [[=transform.html_encode(error._error.text)]]    [[
  164.       if not error._error.offset==None: {
  165.         print ' '*error._error.offset+'^'
  166.       }
  167.     ]]
  168.   </pre></body></html>
  169. [[ } else: { raise error._error } ]]
  170. '''
  171.