def _CallMethod_(self, com_object, index, info, params): #print "_CallMethod_", index, info, params flags, name, param_descs, ret = info assert ret[1][0] == xpcom_consts.TD_UINT32, "Expected an nsresult (%s)" % (ret,) if XPT_MD_IS_GETTER(flags): # Look for a function of that name func = getattr(self._obj_, "get_" + name, None) if func is None: assert len(param_descs)==1 and len(params)==0, "Can only handle a single [out] arg for a default getter" ret = getattr(self._obj_, name) # Let attribute error go here! else: ret = func(*params) return 0, ret elif XPT_MD_IS_SETTER(flags): # Look for a function of that name func = getattr(self._obj_, "set_" + name, None) if func is None: assert len(param_descs)==1 and len(params)==1, "Can only handle a single [in] arg for a default setter" setattr(self._obj_, name, params[0]) # Let attribute error go here! else: func(*params) return 0 elif callable(self._obj_): if self._is_function_ is None: iim = _xpcom.XPTI_GetInterfaceInfoManager() interface_info = iim.GetInfoForIID(self._iid_) self._is_function_ = interface_info.GetIsFunction() if self._is_function_: return 0, self._obj_(*params) # A regular method. func = getattr(self._obj_, name) return 0, func(*params)
def _QueryInterface_(self, com_object, iid): # Framework allows us to return a single boolean integer, # or a COM object. if iid in self._nominated_interfaces_: # We return the underlying object re-wrapped # in a new gateway - which is desirable, as one gateway should only support # one interface (this wont affect the users of this policy - we can have as many # gateways as we like pointing to the same Python objects - the users never # see what object the call came in from. # NOTE: We could have simply returned the instance and let the framework # do the auto-wrap for us - but this way we prevent a round-trip back into Python # code just for the autowrap. return xpcom.server.WrapObject(self._obj_, iid, bWrapClient=0) # Always support nsIClassInfo if iid == _xpcom.IID_nsIClassInfo: return GetClassInfoForObject(self._obj_) # See if the instance has a QI # use lower-case "_query_interface_" as win32com does, and it doesnt really matter. delegate = getattr(self._obj_, "_query_interface_", None) if delegate is not None: # The COM object itself doesnt get passed to the child # (again, as win32com doesnt). It is rarely needed # (in win32com, we dont even pass it to the policy, although we have identified # one place where we should - for marshalling - so I figured I may as well pass it # to the policy layer here, but no all the way down to the object. return delegate(iid) # Finally see if we are being queried for one of the "nsISupports primitives" if not _supports_primitives_map_: iim = _xpcom.XPTI_GetInterfaceInfoManager() for (iid_name, attr, cvt) in _supports_primitives_data_: special_iid = iim.GetInfoForName(iid_name).GetIID() _supports_primitives_map_[special_iid] = (attr, cvt) attr, cvt = _supports_primitives_map_.get(iid, (None, None)) if attr is not None and hasattr(self._obj_, attr): return xpcom.server.WrapObject(SupportsPrimitive( iid, self._obj_, attr, cvt), iid, bWrapClient=0) # Out of clever things to try! return None # We dont support this IID.
# The contents of this file are subject to the Mozilla Public License Version
def _get_good_iid(iid): if iid is None: iid = _xpcom.IID_nsISupports elif type(iid) in StringTypes and len(iid)>0 and iid[0] != "{": iid = getattr(interfaces, iid) return iid # The "manager" object. manager = xpcom.client.Component(_xpcom.GetComponentManager(), _xpcom.IID_nsIComponentManager) # The component registrar registrar = xpcom.client.Component(_xpcom.GetComponentManager(), _xpcom.IID_nsIComponentRegistrar) # The "interfaceInfoManager" object - JS doesnt have this. interfaceInfoManager = _xpcom.XPTI_GetInterfaceInfoManager() # The serviceManager - JS doesnt have this either! serviceManager = _xpcom.GetServiceManager() # The "Exception" object Exception = xpcom.COMException # Base class for our collections. # It appears that all objects supports "." and "[]" notation. # eg, "interface.nsISupports" or interfaces["nsISupports"] class _ComponentCollection: # Bases are to over-ride 2 methods. # _get_one(self, name) - to return one object by name # _build_dict - to return a dictionary which provide access into def __init__(self):