# Various utilities for working with nsISupportsPrimitive from xpcom import components _primitives_map = {} def _build_map(): ifaces = components.interfaces iface = ifaces.nsISupportsPrimitive m = _primitives_map m[iface.TYPE_ID] = ifaces.nsISupportsID m[iface.TYPE_CSTRING] = ifaces.nsISupportsCString m[iface.TYPE_STRING] = ifaces.nsISupportsString m[iface.TYPE_PRBOOL] = ifaces.nsISupportsPRBool m[iface.TYPE_PRUINT8] = ifaces.nsISupportsPRUint8 m[iface.TYPE_PRUINT16] = ifaces.nsISupportsPRUint16 m[iface.TYPE_PRUINT32] = ifaces.nsISupportsPRUint32 m[iface.TYPE_PRUINT64] = ifaces.nsISupportsPRUint64 m[iface.TYPE_PRINT16] = ifaces.nsISupportsPRInt16 m[iface.TYPE_PRINT32] = ifaces.nsISupportsPRInt32 m[iface.TYPE_PRINT64] = ifaces.nsISupportsPRInt64 m[iface.TYPE_PRTIME] = ifaces.nsISupportsPRTime m[iface.TYPE_CHAR] = ifaces.nsISupportsChar m[iface.TYPE_FLOAT] = ifaces.nsISupportsFloat m[iface.TYPE_DOUBLE] = ifaces.nsISupportsDouble # Do interface pointer specially - it provides the IID. #m[iface.TYPE_INTERFACE_POINTER] = ifaces.nsISupportsDouble def GetPrimitive(ob): if len(_primitives_map)==0: _build_map() prin = ob.QueryInterface(components.interfaces.nsISupportsPrimitive) try: better = _primitives_map[prin.type] except KeyError: raise ValueError("This primitive type (%d) is not supported" % (prin.type,)) prin = prin.QueryInterface(better) return prin.data