home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 July / CMCD0704.ISO / Software / Shareware / Comunicatii / jyte / jyte.exe / axsite.py < prev    next >
Text File  |  2002-06-01  |  4KB  |  130 lines

  1. import string
  2. import win32com.axscript.axscript
  3. import winerror
  4. from win32com.axscript import axscript
  5. from win32com.server import exception, util
  6. import pythoncom
  7.  
  8. class AXEngine:
  9.   def __init__(self, site, engine):
  10.     self.eScript = self.eParse = self.eSafety = None
  11.     if type(engine) == type(''):
  12.       engine = pythoncom.CoCreateInstance(engine,
  13.                                           None,
  14.                                           pythoncom.CLSCTX_SERVER,
  15.                                           pythoncom.IID_IUnknown)
  16.  
  17.     self.eScript = engine.QueryInterface(axscript.IID_IActiveScript)
  18.     self.eParse = engine.QueryInterface(axscript.IID_IActiveScriptParse)
  19.     self.eSafety = engine.QueryInterface(axscript.IID_IObjectSafety)
  20.  
  21.     self.eScript.SetScriptSite(site)
  22.     self.eParse.InitNew()
  23.   def __del__(self):
  24.     self.Close()
  25.   def GetScriptDispatch(self, name = None):
  26.     return self.eScript.GetScriptDispatch(name)
  27.   def AddNamedItem(self, item, flags):
  28.     return self.eScript.AddNamedItem(item, flags)
  29.   # Some helpers.  
  30.   def AddCode(self, code, flags=0):
  31.     self.eParse.ParseScriptText(code, None, None, None, 0, 0, flags)
  32.   def EvalCode(self, code):
  33.     return self.eParse.ParseScriptText(code, None, None, None, 0, 0, axscript.SCRIPTTEXT_ISEXPRESSION)
  34.   def Start(self):
  35.     # Should maybe check state?
  36.     # Do I need to transition through?
  37.     self.eScript.SetScriptState(axscript.SCRIPTSTATE_STARTED) 
  38. #    self.eScript.SetScriptState(axscript.SCRIPTSTATE_CONNECTED)
  39.  
  40.   def Close(self):
  41.     if self.eScript:
  42.       self.eScript.Close()
  43.     self.eScript = self.eParse = self.eSafety = None
  44.   def SetScriptState(self, state):
  45.     self.eScript.SetScriptState(state)
  46.         
  47. IActiveScriptSite_methods = [
  48.   'GetLCID',
  49.   'GetItemInfo',
  50.   'GetDocVersionString',
  51.   'OnScriptTerminate',
  52.   'OnStateChange',
  53.   'OnScriptError',
  54.   'OnEnterScript',
  55.   'OnLeaveScript',
  56.   ]
  57.  
  58. class AXSite:
  59.   """An Active Scripting site.  A Site can have exactly one engine.
  60.   """
  61.   _public_methods_ = IActiveScriptSite_methods
  62.   _com_interfaces_ = [ axscript.IID_IActiveScriptSite ]
  63.  
  64.   def __init__(self, objModel={}, engine = None, lcid=0):
  65.     self.lcid = lcid
  66.  
  67.     self.objModel = { }
  68.     for name, object in objModel.items():
  69.       # Gregs code did string.lower this - I think that is callers job if he wants!
  70.       self.objModel[name] = object
  71.  
  72.     self.engine = None
  73.     if engine:
  74.       self._AddEngine(engine)
  75.     
  76.   def AddEngine(self, engine):
  77.     """Adds a new engine to the site.
  78.     engine can be a string, or a fully wrapped engine object.
  79.     """
  80.     if type(engine)==type(''):
  81.       newEngine = AXEngine(util.wrap(self), engine)
  82.     else:
  83.       newEngine = engine
  84.     self.engine = newEngine
  85.     flags = axscript.SCRIPTITEM_ISVISIBLE | axscript.SCRIPTITEM_NOCODE | axscript.SCRIPTITEM_GLOBALMEMBERS | axscript.SCRIPTITEM_ISPERSISTENT
  86.     for name in self.objModel.keys():
  87.       newEngine.AddNamedItem(name, flags)
  88.       newEngine.SetScriptState(axscript.SCRIPTSTATE_INITIALIZED)
  89.     return newEngine
  90.  
  91.   # B/W compat
  92.   _AddEngine = AddEngine
  93.  
  94.   def _Close(self):
  95.     self.engine.Close()
  96.     self.objModel = {}
  97.  
  98.   def GetLCID(self):
  99.     return self.lcid
  100.  
  101.   def GetItemInfo(self, name, returnMask):
  102. #    name = string.lower(name)
  103.     if not self.objModel.has_key(name):
  104.       raise exception.Exception(scode=winerror.TYPE_E_ELEMENTNOTFOUND, desc='item not found')
  105.  
  106.     ### for now, we don't have any type information
  107.  
  108.     if returnMask & axscript.SCRIPTINFO_IUNKNOWN:
  109.       return (self.objModel[name], None)
  110.  
  111.     return (None, None)
  112.  
  113.   def GetDocVersionString(self):
  114.     return 'Python AXHost version 1.0'
  115.  
  116.   def OnScriptTerminate(self, result, excepInfo):
  117.     pass
  118.  
  119.   def OnStateChange(self, state):
  120.     pass
  121.  
  122.   def OnScriptError(self, errorInterface):
  123.     return winerror.S_FALSE  
  124.  
  125.   def OnEnterScript(self):
  126.     pass
  127.  
  128.   def OnLeaveScript(self):
  129.     pass
  130.