home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 January / maximum-cd-2011-01.iso / DiscContents / xbmc-9.11.exe / system / python / spyce / modules / error.py < prev    next >
Encoding:
Python Source  |  2009-12-23  |  5.9 KB  |  172 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 20864 2009-06-02 06:16:47Z ceros7 $
  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, pageerrorType=pageerrorType, pageerrorData=pageerrorData: 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.clearFilters()
  62.     responseModule.setContentType('text/html')
  63.     responseModule.setReturnCode(errorModule._api.getResponse().RETURN_OK)
  64.   except: pass
  65.   try:
  66.     s, file = None, None
  67.     if type=='file':
  68.       file = os.path.join(os.path.dirname(errorModule._api.getFilename()), spyceCode)
  69.       code = errorModule._api.spyceFile(file)
  70.     elif type=='string':
  71.       file = '<string>'
  72.       code = errorModule._api.spyceString(spyceCode)
  73.     else:
  74.       raise 'unrecognized handler type'
  75.     try:
  76.       s = code.newWrapper()
  77.       modules = errorModule._api.getModules()
  78.       for name in modules.keys():
  79.         s.setModule(name, modules[name])  # include modules as well!
  80.       s.spyceInit(errorModule._api.getRequest(), errorModule._api.getResponse())
  81.       errmod = s._startModule('error', None, None, 1)
  82.       errmod._error = errorModule._error
  83.       errmod._fromFile = errorModule._fromFile
  84.       s.spyceProcess()
  85.     finally:
  86.       if s: 
  87.         s.spyceDestroy()
  88.         code.returnWrapper(s)
  89.   except spyceException.spyceRuntimeException, e:
  90.     errorModule._error = e
  91.     errorModule._fromFile = file
  92.     if (type, spyceCode) == ('string', defaultErrorTemplate):
  93.       raise  # avoid infinite loop
  94.     else:
  95.       spyceHandler(errorModule, defaultErrorTemplate, 'string')
  96.  
  97. defaultErrorTemplate = '''
  98. [[.module name=transform]]
  99. [[transform.expr('html_encode')]]
  100. <html>
  101. <title>Spyce exception: [[=error.getMessage()]]</title>
  102. <body>
  103. <table border=0>
  104.   <tr><td colspan=2><h1>Spyce exception</h1></td></tr>
  105.   <tr><td valign=top><b>File:</b></td><td>[[=error.getFile()]]</tr>
  106.   <tr><td valign=top><b>Message:</b></td>
  107.     <td><pre>[[=error.getMessage()]]</pre></tr>
  108.   <tr><td valign=top><b>Stack:</b></td><td>
  109.     [[ for frame in error.getTraceback(): { ]]
  110.       [[=frame[0] ]]:[[=frame[1] ]], in [[=frame[2] ]]:<br>
  111.       <table border=0><tr><td width=10></td><td>
  112.         <pre>[[=frame[3] ]]</pre>
  113.       </td></tr></table>
  114.     [[ } ]]
  115.     </td></tr>
  116. </table>
  117. </body></html>
  118. '''
  119.  
  120. def serverHandler(theServer, theRequest, theResponse, theError):
  121.   try:
  122.     theResponse.clear()
  123.     theResponse.clearHeaders()
  124.     theResponse.setContentType('text/html')
  125.     theResponse.setReturnCode(theResponse.RETURN_OK)
  126.   except: pass
  127.   s = None
  128.   try:
  129.     spycecode = theServer.spyce_cache[('string', serverErrorTemplate)]
  130.     s = spycecode.newWrapper()
  131.     s.spyceInit(theRequest, theResponse)
  132.     s.getModule('error')._error = theError
  133.     s.spyceProcess()
  134.   finally:
  135.     if s: 
  136.       s.spyceDestroy()
  137.       spycecode.returnWrapper(s)
  138.  
  139.  
  140. serverErrorTemplate = '''
  141. [[.module name=transform]]
  142. [[import string, spyceException
  143.   if isinstance(error._error, spyceException.spyceNotFound): { ]]
  144.   <html><body>
  145.   [[=error._error.file]] not found
  146.   [[response.setReturnCode(response._api.getResponse().RETURN_NOT_FOUND)]]
  147.   </body></html>
  148. [[ } elif isinstance(error._error, spyceException.spyceForbidden): { ]]
  149.   <html><body>
  150.   [[=error._error.file]] forbidden
  151.   [[response.setReturnCode(response._api.getResponse().RETURN_FORBIDDEN)]]
  152.   </body></html>
  153. [[ } elif isinstance(error._error, spyceException.spyceSyntaxError): { ]]
  154.   <html><body><pre>
  155.   [[=transform.html_encode(`error._error`)]]
  156.   </pre></body></html>
  157. [[ } elif isinstance(error._error, spyceException.pythonSyntaxError): { ]]
  158.   <html><body><pre>
  159.   [[=transform.html_encode(`error._error`)]]
  160.   </pre></body></html>
  161. [[ } elif isinstance(error._error, SyntaxError): { ]]
  162.   <html><body><pre>
  163.   Syntax error at [[=error._error.filename]]:[[=error._error.lineno]] - 
  164.     [[=transform.html_encode(error._error.text)]]    [[
  165.       if not error._error.offset==None: {
  166.         print ' '*error._error.offset+'^'
  167.       }
  168.     ]]
  169.   </pre></body></html>
  170. [[ } else: { raise error._error } ]]
  171. '''
  172.