SàT: multi-profile: DBus signals and frontend adaptation (first draft)

- Quick App: new single_profile parameter in __init__ (default: yes), used to tell if the application use only one profile at the time or not
- Quick App: new __check_profile method, tell if the profile is used by the current frontend
- Quick App: new methods plug_profile, unplug_profile and clear_profile, must be called by the frontend to tell which profiles to use
- DBus Bridge: new methods getProfileName, getProfilesList and createProfile
This commit is contained in:
Goffi 2010-02-03 23:35:57 +11:00
commit ca242c7aee
9 changed files with 169 additions and 104 deletions

View file

@ -27,8 +27,10 @@ import pdb
class QuickApp():
"""This class contain the main methods needed for the frontend"""
def __init__(self):
def __init__(self, single_profile=True):
self.rosterList = {}
self.profiles = {}
self.single_profile = single_profile
## bridge ##
self.bridge=DBusBridgeFrontend()
@ -45,70 +47,113 @@ class QuickApp():
self.bridge.register("actionResult", self.actionResult, "request")
self.bridge.register("actionResultExt", self.actionResult, "request")
###now we get the essential params###
self.whoami=JID(self.bridge.getParamA("JabberID","Connection"))
self.watched=self.bridge.getParamA("Watched", "Misc").split() #TODO: put this in a plugin
## misc ##
self.current_action_ids = set()
self.current_action_ids_cb = {}
self.onlineContact = set() #FIXME: temporary
def __check_profile(self, profile):
"""Tell if the profile is currently followed by the application"""
return profile in self.profiles.keys()
if self.bridge.isConnected():
def plug_profile(self, profile_key='@DEFAULT@'):
"""Tell application which profile must be used"""
if self.single_profile and self.profiles:
error('There is already one profile plugged (we are in single profile mode) !')
return
profile = self.bridge.getProfileName(profile_key)
if not profile:
error("The profile asked doesn't exist")
if self.profiles.has_key(profile):
warning("The profile is already plugged")
return
self.profiles[profile]={}
if self.single_profile:
self.profile = profile
###now we get the essential params###
self.profiles[profile]['whoami']=JID(self.bridge.getParamA("JabberID","Connection", profile))
self.profiles[profile]['watched']=self.bridge.getParamA("Watched", "Misc", profile).split() #TODO: put this in a plugin
## misc ##
self.profiles[profile]['onlineContact'] = set() #FIXME: temporary
#TODO: managed multi-profiles here
if self.bridge.isConnected(profile):
self.setStatusOnline(True)
else:
self.setStatusOnline(False)
return
### now we fill the contact list ###
for contact in self.bridge.getContacts():
self.newContact(contact[0], contact[1], contact[2])
for contact in self.bridge.getContacts(profile):
self.newContact(contact[0], contact[1], contact[2], profile)
presences = self.bridge.getPresenceStatus()
presences = self.bridge.getPresenceStatus(profile)
for contact in presences:
for res in presences[contact]:
jabber_id = contact+('/'+res if res else '')
show = presences[contact][res][0]
priority = presences[contact][res][1]
statuses = presences[contact][res][2]
self.presenceUpdate(jabber_id, show, priority, statuses)
self.presenceUpdate(jabber_id, show, priority, statuses, profile)
waitingSub = self.bridge.getWaitingSub()
waitingSub = self.bridge.getWaitingSub(profile)
for sub in waitingSub:
self.subscribe(waitingSub[sub], sub)
self.subscribe(waitingSub[sub], sub, profile)
def unplug_profile(self, profile):
"""Tell the application to not follow anymore the profile"""
if not profile in self.profiles:
warning ("This profile is not plugged")
return
self.profiles.remove(profile)
def connected(self):
def clear_profile(self):
self.profiles.clear()
def connected(self, profile):
"""called when the connection is made"""
if not self.__check_profile(profile):
return
debug("Connected")
self.setStatusOnline(True)
def disconnected(self):
def disconnected(self, profile):
"""called when the connection is closed"""
if not self.__check_profile(profile):
return
debug("Disconnected")
self.CM.clear()
self.contactList.clear_contacts()
self.setStatusOnline(False)
def newContact(self, JabberId, attributes, groups):
def newContact(self, JabberId, attributes, groups, profile):
if not self.__check_profile(profile):
return
entity=JID(JabberId)
self.rosterList[entity.short]=(dict(attributes), list(groups))
def newMessage(self, from_jid, msg, type, to_jid):
def newMessage(self, from_jid, msg, type, to_jid, profile):
if not self.__check_profile(profile):
return
sender=JID(from_jid)
addr=JID(to_jid)
win = addr if sender.short == self.whoami.short else sender
self.chat_wins[win.short].printMessage(sender, msg)
win = addr if sender.short == self.profiles[profile]['whoami'].short else sender
self.current_action_ids = set()
self.current_action_ids_cb = {}
self.chat_wins[win.short].printMessage(sender, msg, profile)
def setStatusOnline(self, online=True):
pass
def presenceUpdate(self, jabber_id, show, priority, statuses):
def presenceUpdate(self, jabber_id, show, priority, statuses, profile):
if not self.__check_profile(profile):
return
print "check ok"
debug ("presence update for %s (show=%s, statuses=%s)", jabber_id, show, statuses);
from_jid=JID(jabber_id)
debug ("from_jid.short=%s whoami.short=%s", from_jid.short, self.whoami.short)
debug ("from_jid.short=%s whoami.short=%s", from_jid.short, self.profiles[profile]['whoami'].short)
if from_jid.short==self.whoami.short:
if from_jid.short==self.profiles[profile]['whoami'].short:
if not type:
self.setStatusOnline(True)
elif type=="unavailable":
@ -124,10 +169,10 @@ class QuickApp():
groups=self.rosterList[from_jid.short][1]
#FIXME: must be moved in a plugin
if from_jid.short in self.watched and not from_jid.short in self.onlineContact:
if from_jid.short in self.profiles[profile]['watched'] and not from_jid.short in self.profiles[profile]['onlineContact']:
self.showAlert("Watched jid [%s] is connected !" % from_jid.short)
self.onlineContact.add(from_jid) #FIXME onlineContact is useless with CM, must be removed
self.profiles[profile]['onlineContact'].add(from_jid) #FIXME onlineContact is useless with CM, must be removed
self.CM.add(from_jid)
self.CM.update(from_jid, 'name', name)
self.CM.update(from_jid, 'show', show)
@ -140,14 +185,16 @@ class QuickApp():
self.CM.update(from_jid, 'avatar', self.bridge.getAvatarFile(cache['avatar']))
self.contactList.replace(from_jid)
if show=="unavailable" and from_jid in self.onlineContact:
self.onlineContact.remove(from_jid)
if show=="unavailable" and from_jid in self.profiles[profile]['onlineContact']:
self.profiles[profile]['onlineContact'].remove(from_jid)
self.CM.remove(from_jid)
if not self.CM.isConnected(from_jid):
self.contactList.disconnect(from_jid)
def subscribe(self, type, raw_jid):
def subscribe(self, type, raw_jid, profile):
"""Called when a subsciption maangement signal is received"""
if not self.__check_profile(profile):
return
entity = JID(raw_jid)
if type=="subscribed":
# this is a subscription confirmation, we just have to inform user
@ -169,29 +216,35 @@ class QuickApp():
def showAlert(self, message):
pass #FIXME
def paramUpdate(self, name, value, namespace):
def paramUpdate(self, name, value, namespace, profile):
if not self.__check_profile(profile):
return
debug("param update: [%s] %s = %s", namespace, name, value)
if (namespace,name) == ("Connection", "JabberID"):
debug ("Changing ID to %s", value)
self.whoami=JID(value)
self.profiles[profile]['whoami']=JID(value)
elif (namespace,name) == ("Misc", "Watched"):
self.watched=value.split()
self.profiles[profile]['watched']=value.split()
def contactDeleted(self, jid):
def contactDeleted(self, jid, profile):
if not self.__check_profile(profile):
return
target = JID(jid)
self.CM.remove(target)
self.contactList.remove(self.CM.get_full(target))
try:
self.onlineContact.remove(target.short)
self.profiles[profile]['onlineContact'].remove(target.short)
except KeyError:
pass
def updatedValue(self, name, data):
if name == "profile_nick":
def updatedValue(self, name, data, profile):
if not self.__check_profile(profile):
return
if name == "card_nick":
target = JID(data['jid'])
self.CM.update(target, 'nick', data['nick'])
self.contactList.replace(target)
elif name == "profile_avatar":
elif name == "card_avatar":
target = JID(data['jid'])
filename = self.bridge.getAvatarFile(data['avatar'])
self.CM.update(target, 'avatar', filename)

View file

@ -91,7 +91,7 @@ class QuickContactManagement():
if self.__contactlist.has_key(entity.short):
self.__contactlist[entity.short][key] = value
else:
debug ('Trying to update an uknown contact: %s', entity.short)
debug ('Trying to update an unknown contact: %s', entity.short)
def get_full(self, entity):
return entity.short+'/'+self.__contactlist[entity.short]['resources'][-1]

View file

@ -40,6 +40,15 @@ class DBusBridgeFrontend(BridgeFrontend):
elif iface == "request":
self.db_req_iface.connect_to_signal(functionName, handler)
def getProfileName(self, profile_key='@DEFAULT@'):
return self.db_req_iface.getProfileName(profile_key)
def getProfilesList(self):
return self.db_req_iface.getProfilesList()
def createProfile(self, profile):
return self.db_req_iface.getProfileName(profile)
def connect(self, profile_key='@DEFAULT@'):
return self.db_comm_iface.connect(profile_key)
@ -80,7 +89,7 @@ class DBusBridgeFrontend(BridgeFrontend):
return self.db_comm_iface.getParamsForCategory(category, profile_key)
def getParamsCategories(self):
return self.db_comm_iface.getParamsCategories(profile_key)
return self.db_comm_iface.getParamsCategories()
def getHistory(self, from_jid, to_jid, size):
return self.db_comm_iface.getHistory(from_jid, to_jid, size)

View file

@ -92,10 +92,10 @@ class Chat(wx.Frame, QuickChat):
def printMessage(self, from_jid, msg, timestamp=""): #FIXME: factorize with printDistantMessage
def printMessage(self, from_jid, msg, profile, timestamp=""):
"""Print the message with differents colors depending on where it comes from."""
jid=JID(from_jid)
mymess = (jid.short == self.host.whoami.short) #mymess = True if message comes from local user
mymess = (jid.short == self.host.profiles[profile]['whoami'].short) #mymess = True if message comes from local user
_font = wx.Font(self.font["points"], self.font["family"], wx.NORMAL, wx.BOLD)
self.chatWindow.SetDefaultStyle(wx.TextAttr( "BLACK" if mymess else "BLUE", font=_font))
self.chatWindow.AppendText("[%s] " % jid)

View file

@ -223,6 +223,7 @@ class MainWindow(wx.Frame, QuickApp):
self.CM = QuickContactManagement() #FIXME: not the best place
#Frame elements
self.contactList = ContactList(self, self.CM)
self.contactList.registerActivatedCB(self.onContactActivated)
@ -253,6 +254,7 @@ class MainWindow(wx.Frame, QuickApp):
self.Bind(wx.EVT_CLOSE, self.onClose, self)
QuickApp.__init__(self)
self.plug_profile()
self.Show()
@ -329,10 +331,6 @@ class MainWindow(wx.Frame, QuickApp):
self.tools.Disable()
return
def presenceUpdate(self, jabber_id, show, priority, statuses):
QuickApp.presenceUpdate(self, jabber_id, show, priority, statuses)
def askConfirmation(self, type, id, data):
#TODO: refactor this in QuickApp
debug ("Confirmation asked")
@ -533,7 +531,7 @@ class MainWindow(wx.Frame, QuickApp):
def onFindGateways(self, e):
debug("Find Gateways request")
id = self.bridge.findGateways(self.whoami.domain)
id = self.bridge.findGateways(self.profiles[self.profile]['whoami'].domain)
self.current_action_ids.add(id)
self.current_action_ids_cb[id] = self.onGatewaysFound

View file

@ -91,7 +91,7 @@ class XEP_0054():
if not old_value or value != old_value:
cache[name] = value
self.host.memory.setPrivate("vcard_cache", self.vcard_cache)
self.host.bridge.updatedValue('profile_'+name, {'jid':jid.userhost(), name:value})
self.host.bridge.updatedValue('card_'+name, {'jid':jid.userhost(), name:value})
def get_cache(self, jid, name):
"""return cached value for jid

26
sat.tac
View file

@ -83,7 +83,7 @@ class SatXMPPClient(client.XMPPClient):
self.__connected=True
print "********** [%s] CONNECTED **********" % self.profile
self.streamInitialized()
self.host_app.bridge.connected() #we send the signal to the clients
self.host_app.bridge.connected(self.profile) #we send the signal to the clients
def streamInitialized(self):
"""Called after _authd"""
@ -112,7 +112,7 @@ class SatXMPPClient(client.XMPPClient):
self.keep_alife.stop()
except AttributeError:
debug("No keep_alife")
self.host_app.bridge.disconnected() #we send the signal to the clients
self.host_app.bridge.disconnected(self.profile) #we send the signal to the clients
class SatMessageProtocol(xmppim.MessageProtocol):
@ -125,7 +125,7 @@ class SatMessageProtocol(xmppim.MessageProtocol):
debug (u"got_message from: %s", message["from"])
for e in message.elements():
if e.name == "body":
self.host.bridge.newMessage(message["from"], e.children[0])
self.host.bridge.newMessage(message["from"], e.children[0], self.parent.profile)
self.host.memory.addToHistory(self.parent.jid, jid.JID(message["from"]), self.parent.jid, "chat", e.children[0])
break
@ -165,7 +165,7 @@ class SatRosterProtocol(xmppim.RosterClientProtocol):
item_attr['name'] = item.name
info ("new contact in roster list: %s", item.jid.full())
self.host.memory.addContact(item.jid, item_attr, item.groups, self.parent.profile)
self.host.bridge.newContact(item.jid.full(), item_attr, item.groups)
self.host.bridge.newContact(item.jid.full(), item_attr, item.groups, self.parent.profile)
def onRosterRemove(self, entity):
"""Called when a roster removal event is received"""
@ -191,7 +191,7 @@ class SatPresenceProtocol(xmppim.PresenceClientProtocol):
#now it's time to notify frontends
self.host.bridge.presenceUpdate(entity.full(), show or "",
int(priority), statuses)
int(priority), statuses, self.parent.profile)
def unavailableReceived(self, entity, statuses=None):
if statuses and statuses.has_key(None): #we only want string keys
@ -200,7 +200,7 @@ class SatPresenceProtocol(xmppim.PresenceClientProtocol):
self.host.memory.addPresenceStatus(entity, "unavailable", 0, statuses, self.parent.profile)
#now it's time to notify frontends
self.host.bridge.presenceUpdate(entity.full(), "unavailable", 0, statuses)
self.host.bridge.presenceUpdate(entity.full(), "unavailable", 0, statuses, self.parent.profile)
def available(self, entity=None, show=None, statuses=None, priority=0):
@ -212,22 +212,22 @@ class SatPresenceProtocol(xmppim.PresenceClientProtocol):
def subscribedReceived(self, entity):
debug ("subscription approved for [%s]" % entity.userhost())
self.host.memory.delWaitingSub(entity.userhost(), self.parent.profile)
self.host.bridge.subscribe('subscribed', entity.userhost())
self.host.bridge.subscribe('subscribed', entity.userhost(), self.parent.profile)
def unsubscribedReceived(self, entity):
debug ("unsubscription confirmed for [%s]" % entity.userhost())
self.host.memory.delWaitingSub(entity.userhost(), self.parent.profile)
self.host.bridge.subscribe('unsubscribed', entity.userhost())
self.host.bridge.subscribe('unsubscribed', entity.userhost(), self.parent.profile)
def subscribeReceived(self, entity):
debug ("subscription request for [%s]" % entity.userhost())
self.host.memory.addWaitingSub('subscribe', entity.userhost(), self.parent.profile)
self.host.bridge.subscribe('subscribe', entity.userhost())
self.host.bridge.subscribe('subscribe', entity.userhost(), self.parent.profile)
def unsubscribeReceived(self, entity):
debug ("unsubscription asked for [%s]" % entity.userhost())
self.host.memory.addWaitingSub('unsubscribe', entity.userhost(), self.parent.profile)
self.host.bridge.subscribe('unsubscribe', entity.userhost())
self.host.bridge.subscribe('unsubscribe', entity.userhost(), self.parent.profile)
class SatDiscoProtocol(disco.DiscoClientProtocol):
def __init__(self, host):
@ -326,6 +326,7 @@ class SAT(service.Service):
self.server_features=[] #XXX: temp dic, need to be transfered into self.memory in the future
self.bridge=DBusBridge()
self.bridge.register("getProfileName", self.memory.getProfileName)
self.bridge.register("getProfilesList", self.memory.getProfilesList)
self.bridge.register("createProfile", self.memory.createProfile)
self.bridge.register("registerNewAccount", self.registerNewAccount)
@ -407,7 +408,6 @@ class SAT(service.Service):
debug ("setting plugins parents")
#FIXME: gof
for plugin in self.plugins.iteritems():
if plugin[1].is_handler:
plugin[1].getHandler().setHandlerParent(current)
@ -585,7 +585,7 @@ class SAT(service.Service):
message.addElement("body", "jabber:client", msg)
self.profiles[profile].xmlstream.send(message)
self.memory.addToHistory(current_jid, current_jid, jid.JID(to), message["type"], unicode(msg))
self.bridge.newMessage(message['from'], unicode(msg), to=message['to']) #We send back the message, so all clients are aware of it
self.bridge.newMessage(message['from'], unicode(msg), to=message['to'], profile=profile) #We send back the message, so all clients are aware of it
def setPresence(self, to="", show="", priority = 0, statuses={}, profile_key='@DEFAULT@'):
@ -630,7 +630,7 @@ class SAT(service.Service):
to_jid=jid.JID(to)
self.profiles[profile].roster.removeItem(to_jid)
self.profiles[profile].presence.unsubscribe(to_jid)
self.profiles[profile].bridge.contactDeleted(to)
self.host.bridge.contactDeleted(to, profile)
## callbacks ##

View file

@ -44,44 +44,44 @@ class DbusObject(dbus.service.Object):
### signals ###
@dbus.service.signal(const_INT_PREFIX+const_COMM_SUFFIX,
signature='')
def connected(self):
signature='s')
def connected(self, profile):
debug("Connected signal")
@dbus.service.signal(const_INT_PREFIX+const_COMM_SUFFIX,
signature='')
def disconnected(self):
signature='s')
def disconnected(self, profile):
debug("Disconnected signal")
@dbus.service.signal(const_INT_PREFIX+const_COMM_SUFFIX,
signature='sa{ss}as')
def newContact(self, contact, attributes, groups):
debug("new contact signal (%s) sended", contact)
signature='sa{ss}ass')
def newContact(self, contact, attributes, groups, profile):
debug("new contact signal (%s) sended (profile: %s)", contact, profile)
@dbus.service.signal(const_INT_PREFIX+const_COMM_SUFFIX,
signature='ssss')
def newMessage(self, from_jid, msg, type='chat', to=''):
signature='sssss')
def newMessage(self, from_jid, msg, type='chat', to='', profile='@NONE@'):
debug("new message signal (from:%s msg:%s type:%s to:%s) sended", from_jid, msg, type, to)
@dbus.service.signal(const_INT_PREFIX+const_COMM_SUFFIX,
signature='ssia{ss}')
def presenceUpdate(self, entity, show, priority, statuses):
debug("presence update signal (from:%s show:%s priority:%d statuses:%s) sended" , entity, show, priority, statuses)
signature='ssia{ss}s')
def presenceUpdate(self, entity, show, priority, statuses, profile):
debug("presence update signal (from:%s show:%s priority:%d statuses:%s profile:%s) sended" , entity, show, priority, statuses, profile)
@dbus.service.signal(const_INT_PREFIX+const_COMM_SUFFIX,
signature='sss')
def subscribe(self, type, entity, profile):
debug("subscribe (type: [%s] from:[%s] profile:[%s])" , type, entity, profile)
@dbus.service.signal(const_INT_PREFIX+const_COMM_SUFFIX,
signature='ssss')
def paramUpdate(self, name, value, category, profile):
debug("param update signal: %s=%s in category %s (profile: %s)", name, value, category, profile)
@dbus.service.signal(const_INT_PREFIX+const_COMM_SUFFIX,
signature='ss')
def subscribe(self, type, entity):
debug("subscribe (type: [%s] from:[%s])" , type, entity)
@dbus.service.signal(const_INT_PREFIX+const_COMM_SUFFIX,
signature='sss')
def paramUpdate(self, name, value, category):
debug("param update signal: %s=%s in category %s", name, value, category)
@dbus.service.signal(const_INT_PREFIX+const_COMM_SUFFIX,
signature='s')
def contactDeleted(self, entity):
debug("contact deleted signal: %s", entity)
def contactDeleted(self, entity, profile):
debug("contact deleted signal: %s (profile: %s)", entity, profile)
@dbus.service.signal(const_INT_PREFIX+const_REQ_SUFFIX,
signature='ssa{ss}')
@ -105,6 +105,11 @@ class DbusObject(dbus.service.Object):
### methods ###
@dbus.service.method(const_INT_PREFIX+const_REQ_SUFFIX,
in_signature='s', out_signature='s')
def getProfileName(self, profile_key):
return self.cb["getProfileName"](profile_key)
@dbus.service.method(const_INT_PREFIX+const_REQ_SUFFIX,
in_signature='', out_signature='as')
def getProfilesList(self):
@ -112,8 +117,8 @@ class DbusObject(dbus.service.Object):
return self.cb["getProfilesList"]()
@dbus.service.method(const_INT_PREFIX+const_REQ_SUFFIX,
in_signature='sb', out_signature='')
def createProfile(self, name, default=False):
in_signature='s', out_signature='')
def createProfile(self, name):
info ('Profile creation asked')
return self.cb["createProfile"](name, default)
@ -279,34 +284,34 @@ class DBusBridge(Bridge):
self.dbus_name = dbus.service.BusName(const_INT_PREFIX, self.session_bus)
self.dbus_bridge = DbusObject(self.session_bus, '/org/goffi/SAT/bridge')
def connected(self):
self.dbus_bridge.connected()
def connected(self, profile):
self.dbus_bridge.connected(profile)
def disconnected(self):
self.dbus_bridge.disconnected()
def disconnected(self, profile):
self.dbus_bridge.disconnected(profile)
def newContact(self, contact, attributes, groups):
self.dbus_bridge.newContact(contact, attributes, groups)
def newContact(self, contact, attributes, groups, profile):
self.dbus_bridge.newContact(contact, attributes, groups, profile)
def newMessage(self,from_jid,msg,type='chat', to=''):
def newMessage(self,from_jid, msg, type, to, profile):
debug("sending message...")
self.dbus_bridge.newMessage(from_jid, msg, type, to)
self.dbus_bridge.newMessage(from_jid, msg, type, to, profile)
def presenceUpdate(self, entity, show, priority, statuses):
def presenceUpdate(self, entity, show, priority, statuses, profile):
debug("updating presence for %s",entity)
self.dbus_bridge.presenceUpdate(entity, show, priority, statuses)
self.dbus_bridge.presenceUpdate(entity, show, priority, statuses, profile)
def subscribe(self, type, entity):
def subscribe(self, type, entity, profile):
debug("subscribe request for %s",entity)
self.dbus_bridge.subscribe(type, entity)
self.dbus_bridge.subscribe(type, entity, profile)
def paramUpdate(self, name, value, category):
def paramUpdate(self, name, value, category, profile):
debug("updating param [%s] %s ", category, name)
self.dbus_bridge.paramUpdate(name, value, category)
self.dbus_bridge.paramUpdate(name, value, category, profile)
def contactDeleted(self, entity):
def contactDeleted(self, entity, profile):
debug("sending contact deleted signal %s ", entity)
self.dbus_bridge.contactDeleted(entity)
self.dbus_bridge.contactDeleted(entity, profile)
def askConfirmation(self, type, id, data):
self.dbus_bridge.askConfirmation(type, id, data)
@ -321,7 +326,7 @@ class DBusBridge(Bridge):
self.dbus_bridge.updatedValue(name, value)
def register(self, name, callback):
debug("registering DBus bridge method [%s]",name)
debug("registering DBus bridge method [%s]", name)
self.dbus_bridge.register(name, callback)
def addMethod(self, name, int_suffix, in_sign, out_sign, method):

View file

@ -117,7 +117,7 @@ class Param():
def getProfilesList(self):
return self.params.keys()
def createProfile(self, name, default=False):
def createProfile(self, name):
"""Create a new profile
@param name: Name of the profile
@param default: True if default value"""
@ -135,12 +135,12 @@ class Param():
@return: requested profile name or None if it doesn't exist"""
if profile_key=='@DEFAULT@':
if not self.params:
return None
return ""
info('No default profile, returning first one') #TODO: manage real default profile
return self.params.keys()[0] #FIXME: gof: temporary, must use real default value, and fallback to first one if it doesn't exists
if not self.params.has_key(profile_key):
error ('Trying to access an unknown profile')
return None
return ""
return profile_key
def __get_unique_node(self, parent, tag, name):
@ -354,7 +354,7 @@ class Param():
print "clique",node.toxml()
else:
self.params[profile][(category, name)] = value
self.host.bridge.paramUpdate(name, value, category) #TODO: add profile in signal
self.host.bridge.paramUpdate(name, value, category, profile) #TODO: add profile in signal
class Memory:
"""This class manage all persistent informations"""
@ -605,8 +605,8 @@ class Memory:
def getParams(self):
return self.params.getParams()
def getParamsForCategory(self, category):
return self.params.getParamsForCategory(category)
def getParamsForCategory(self, category, profile_key='@DEFAULT@'):
return self.params.getParamsForCategory(category, profile_key)
def getParamsCategories(self):
return self.params.getParamsCategories()