# HG changeset patch # User Goffi # Date 1308406970 -7200 # Node ID 312ca6f9d84a6cd477e15aa8608d858880aa1052 # Parent 54c77a56b22f5993bfba6fe076da2bf73525c2c4 core: configuration file SàT's main options can now be put in a configuration file which can be in different locations Bridge: new getConfig option diff -r 54c77a56b22f -r 312ca6f9d84a frontends/src/bridge/DBus.py --- a/frontends/src/bridge/DBus.py Sun Jun 12 23:43:36 2011 +0200 +++ b/frontends/src/bridge/DBus.py Sat Jun 18 16:22:50 2011 +0200 @@ -81,6 +81,9 @@ def disconnect(self, profile_key="@DEFAULT@"): return self.db_comm_iface.disconnect(profile_key) + def getConfig(self, section, name, profile_key='@DEFAULT@'): + return unicode(self.db_comm_iface.getConfig(section, name, profile_key)) + def getContacts(self, profile_key="@DEFAULT@"): return self.db_comm_iface.getContacts(profile_key) diff -r 54c77a56b22f -r 312ca6f9d84a src/bridge/DBus.py --- a/src/bridge/DBus.py Sun Jun 12 23:43:36 2011 +0200 +++ b/src/bridge/DBus.py Sat Jun 18 16:22:50 2011 +0200 @@ -171,6 +171,12 @@ return self.cb["disconnect"](unicode(profile_key)) @dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX, + in_signature='sss', out_signature='s', + async_callbacks=None) + def getConfig(self, section, name, profile_key='@DEFAULT@'): + return self.cb["getConfig"](unicode(section), unicode(name), unicode(profile_key)) + + @dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX, in_signature='s', out_signature='a(sa{ss}as)', async_callbacks=None) def getContacts(self, profile_key="@DEFAULT@"): diff -r 54c77a56b22f -r 312ca6f9d84a src/bridge/bridge_constructor/bridge_template.ini --- a/src/bridge/bridge_constructor/bridge_template.ini Sun Jun 12 23:43:36 2011 +0200 +++ b/src/bridge/bridge_constructor/bridge_template.ini Sat Jun 18 16:22:50 2011 +0200 @@ -320,6 +320,17 @@ doc_param_1=entity: as for [subscribe] doc_param_2=%(doc_profile_key)s +[getConfig] +type=method +category=communication +sig_in=sss +sig_out=s +param_2_default='@DEFAULT@' +doc=get main configuration option +doc_param_0=section: section of the configuration file (empty string for DEFAULT) +doc_param_1=name: name of the option +doc_param_2=%(doc_profile_key)s + [setParam] type=method category=communication diff -r 54c77a56b22f -r 312ca6f9d84a src/core/default_config.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/core/default_config.py Sat Jun 18 16:22:50 2011 +0200 @@ -0,0 +1,33 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +""" +SAT: a jabber client +Copyright (C) 2009, 2010, 2011 Jérôme Poisson (goffi@goffi.org) + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +""" + +CONST = { + 'client_name' : u'SàT (Salut à toi)', + 'client_version' : u'0.2.0D', #Please add 'D' at the end for dev versions + 'local_dir' : '~/.sat' +} + +### Defaut configuration values ### + +default_config = { + 'local_dir': '~/.sat', + 'media_dir': '/usr/share/sat/media', +} diff -r 54c77a56b22f -r 312ca6f9d84a src/core/sat_main.py --- a/src/core/sat_main.py Sun Jun 12 23:43:36 2011 +0200 +++ b/src/core/sat_main.py Sat Jun 18 16:22:50 2011 +0200 @@ -97,20 +97,22 @@ def __init__(self): #TODO: standardize callback system - local_dir = os.path.expanduser(self.get_const('local_dir')) - if not os.path.exists(local_dir): - os.makedirs(local_dir) - self.__waiting_conf = {} #callback called when a confirmation is received self.__progress_cb_map = {} #callback called when a progress is requested (key = progress id) self.__general_cb_map = {} #callback called for general reasons (key = name) self.__private_data = {} #used for internal callbacks (key = id) - self.trigger = TriggerManager() #trigger are used to change SàT behaviour self.profiles = {} self.plugins = {} self.menus = {} #used to know which new menus are wanted by plugins self.memory=Memory(self) + + local_dir = os.path.expanduser(self.get_const('local_dir')) + if not os.path.exists(local_dir): + os.makedirs(local_dir) + + self.trigger = TriggerManager() #trigger are used to change SàT behaviour + self.bridge=DBusBridge() self.bridge.register("getVersion", lambda: self.get_const('client_version')) @@ -126,6 +128,7 @@ self.bridge.register("getPresenceStatus", self.memory.getPresenceStatus) self.bridge.register("getWaitingSub", self.memory.getWaitingSub) self.bridge.register("sendMessage", self.sendMessage) + self.bridge.register("getConfig", self.memory.getConfig) self.bridge.register("setParam", self.setParam) self.bridge.register("getParamA", self.memory.getParamA) self.bridge.register("getParamsUI", self.memory.getParamsUI) diff -r 54c77a56b22f -r 312ca6f9d84a src/tools/memory.py --- a/src/tools/memory.py Sun Jun 12 23:43:36 2011 +0200 +++ b/src/tools/memory.py Sat Jun 18 16:22:50 2011 +0200 @@ -24,12 +24,14 @@ import os.path import time import cPickle as pickle +from ConfigParser import SafeConfigParser, NoOptionError, NoSectionError from xml.dom import minidom from logging import debug, info, warning, error import pdb from twisted.internet import defer from twisted.words.protocols.jabber import jid from sat.tools.xml_tools import paramsXml2xmlUI +from sat.core.default_config import default_config SAVEFILE_PARAM_XML="/param" #xml parameters template SAVEFILE_PARAM_DATA="/param" #individual & general parameters; _ind and _gen suffixes will be added @@ -399,10 +401,31 @@ self.private={} #used to store private value self.server_features={} #used to store discovery's informations self.server_identities={} + self.config = self.parseMainConf() host.set_const('savefile_history', SAVEFILE_HISTORY) host.set_const('savefile_private', SAVEFILE_PRIVATE) self.load() + def parseMainConf(self): + """look for main .ini configuration file, and parse it""" + _config = SafeConfigParser(defaults=default_config) + _config.read(['/etc/sat.conf', os.path.expanduser('~/sat.conf'), 'sat.conf']) + return _config + + def getConfig(self, section, name, profile): + """Get the main configuration option + @param section: section of the config file (None or '' for DEFAULT) + @param name: name of the option + @param profile: %(doc_profile_key)s""" + if not section: + section='DEFAULT' + try: + _value = self.config.get(section, name) + except NoOptionError, NoSectionError: + _value = '' + + return os.path.expanduser(_value) if name.endswith('_path') or name.endswith('_dir') else _value + def load(self): """Load parameters and all memory things from file/db""" param_file_xml = os.path.expanduser(self.host.get_const('local_dir')+