00001
00002 import sys
00003 import org.isis.jaut
00004 jaut = org.isis.jaut
00005
00006 CLSCTX_INPROC_SERVER = 1
00007 CLSCTX_INPROC_HANDLER = 2
00008 CLSCTX_LOCAL_SERVER = 4
00009 CLSCTX_INPROC = 3
00010 CLSCTX_SERVER = 5
00011 CLSCTX_ALL = 7
00012 CLSCTX_INPROC_SERVER16 = 8
00013 CLSCTX_REMOTE_SERVER = 16
00014 CLSCTX_INPROC_HANDLER16 = 32
00015 CLSCTX_RESERVED1 = 64
00016 CLSCTX_RESERVED2 = 128
00017 CLSCTX_RESERVED3 = 256
00018 CLSCTX_RESERVED4 = 512
00019 CLSCTX_NO_CODE_DOWNLOAD = 1024
00020 CLSCTX_RESERVED5 = 2048
00021 CLSCTX_NO_CUSTOM_MARSHAL = 4096
00022 CLSCTX_ENABLE_CODE_DOWNLOAD = 8192
00023 CLSCTX_NO_FAILURE_LOG = 16384
00024 CLSCTX_DISABLE_AAA = 32768
00025 CLSCTX_ENABLE_AAA = 65536
00026 CLSCTX_FROM_DEFAULT_CONTEXT = 131072
00027
00028 _argkludge = { 'GetXMLInfo': (jaut.Variant.VT_BSTR, jaut.Variant.VT_BSTR, jaut.Variant.VT_NULL, jaut.Variant.VT_BSTR, jaut.Variant.VT_BSTR),
00029 'QueryParadigm': (jaut.Variant.VT_BSTR, jaut.Variant.VT_NULL),
00030 'OpenObj': (jaut.Variant.VT_UNKNOWN,),
00031 'CreateTerritory': (jaut.Variant.VT_NULL, jaut.Variant.VT_UNKNOWN),
00032 }
00033 _getterkludge = { 'Item': 1,
00034 'Status': 1,
00035 'ObjectByPath': 1,
00036 'LegalChildFolderByName': 1,
00037 'DefinedFCOByName': 1,
00038 'RoleByName': 1,
00039 }
00040
00041 _debug = False
00042 _dbgout = sys.stderr
00043
00044 def _translate_java(v):
00045 if isinstance(v, jaut.Dispatch):
00046 return JautDispatch(v)
00047 return v
00048
00049 _vt_falses = ( jaut.Variant.VT_NULL, jaut.Variant.VT_EMPTY )
00050 def __nonzero__(self):
00051 vt = self.getVartype()
00052 if vt in _vt_falses:
00053 return False
00054 return True
00055
00056 del __nonzero__
00057
00058 def _translate_variant(v):
00059 if v is None:
00060 return None
00061 vt = v.getVartype()
00062
00063 if _debug:
00064 _dbgout.write('_translate_variant: type ' + str(vt) + "\n")
00065 if vt == jaut.Variant.VT_BSTR | jaut.Variant.VT_ARRAY:
00066 arr = v.getStringArray()
00067 return list(arr)
00068 elif vt == jaut.Variant.VT_BSTR or vt == (jaut.Variant.VT_BSTR | jaut.Variant.VT_BYREF):
00069 return v.toString()
00070 elif vt == jaut.Variant.VT_DISPATCH | jaut.Variant.VT_BYREF:
00071 return JautDispatch(v.getDispatch())
00072 elif vt == jaut.Variant.VT_DISPATCH:
00073 return JautDispatch(v.getDispatch())
00074 elif vt == jaut.Variant.VT_UNKNOWN | jaut.Variant.VT_BYREF:
00075 return JautDispatch(v.getDispatch())
00076 elif vt == 0:
00077 return None
00078 elif vt == jaut.Variant.VT_I4:
00079 return v.getInt()
00080
00081 return v
00082
00083 def _arg_map(arg):
00084 if isinstance(arg, JautDispatch):
00085 return arg.dispatch
00086 return arg
00087
00088 class JautDispatch(object):
00089 @staticmethod
00090 def CoCreateInstance(progid, clsctx):
00091 dispatch = jaut.Dispatch()
00092 dispatch.attachNewInstance(progid, clsctx)
00093 return JautDispatch(dispatch)
00094
00095 def __init__(self, dispatch, **kwargs):
00096 super(JautDispatch, self).__init__(self, **kwargs)
00097 super(JautDispatch, self).__setattr__('dispatch', dispatch)
00098
00099 def __nonzero__(self):
00100 return self.dispatch.pDispatch != 0
00101
00102 def __iter__(self):
00103 class JautIter(object):
00104 def __iter__(self):
00105 return self
00106 def next():
00107 pass
00108
00109
00110
00111
00112 class GMEIter(object):
00113 def __iter__(self):
00114 return self
00115 def next(self):
00116 if self.i > self.coll.Count:
00117 raise StopIteration()
00118 ret = self.coll.Item(self.i)
00119 self.i = self.i + 1
00120 return ret
00121 iter = GMEIter()
00122 iter.i = 1
00123 iter.coll = self
00124 return iter
00125
00126 def __setattr__(self, name, value):
00127 self.dispatch.put(name, _arg_map(value))
00128
00129 def __getattr__(self, name):
00130
00131 id = self.dispatch.getIDOfName(name)
00132 try:
00133 ret = self.dispatch.get(name)
00134
00135
00136 return _translate_java(ret)
00137 except org.isis.jaut.ComException:
00138 pass
00139 if _debug:
00140 _dbgout.write('__getattr__: name ' + name + "\n")
00141 def invoke(*args):
00142 import time
00143 args = [_arg_map(arg) for arg in args]
00144 if name == 'Status':
00145 args = (jaut.Variant(jaut.Variant.create(jaut.Variant.VT_I4)),)
00146 self.dispatch.invoke(name, jaut.Dispatch.DISPATCH_PROPERTYGET, args, None)
00147 return args[0].getInt()
00148 if name in _getterkludge:
00149 return _translate_java(self.dispatch.invoke(name, jaut.Dispatch.DISPATCH_PROPERTYGET, args, None))
00150 if name in _argkludge:
00151 len_args = len(args)
00152 args = list(args)
00153 def kludgearg(t):
00154 if t == jaut.Variant.VT_BSTR|jaut.Variant.VT_ARRAY:
00155 return jaut.Variant()
00156 return None
00157 args.extend([jaut.Variant(jaut.Variant.create(t)) for t in _argkludge[name]])
00158 self.dispatch.callSub(name, args)
00159 ret = map(_translate_variant, args[len_args:])
00160 if len(ret) == 1:
00161 return ret[0]
00162 return ret
00163 return _translate_java(self.dispatch.call(name, args))
00164
00165 return invoke
00166
00167
00168 def DispatchEx(progid, clsctx=CLSCTX_LOCAL_SERVER):
00169 return JautDispatch.CoCreateInstance(progid, clsctx)