From 1da78d13012e4f088b958ffa5aecabc8390f1e59 Mon Sep 17 00:00:00 2001 From: Goffi Date: Sat, 18 Jun 2011 16:22:50 +0200 Subject: [PATCH] =?UTF-8?q?core:=20configuration=20file=20S=C3=A0T's=20mai?= =?UTF-8?q?n=20options=20can=20now=20be=20put=20in=20a=20configuration=20f?= =?UTF-8?q?ile=20which=20can=20be=20in=20different=20locations=20Bridge:?= =?UTF-8?q?=20new=20getConfig=20option?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontends/src/bridge/DBus.py | 3 ++ src/bridge/DBus.py | 6 ++++ .../bridge_constructor/bridge_template.ini | 11 +++++++ src/core/default_config.py | 33 +++++++++++++++++++ src/core/sat_main.py | 13 +++++--- src/tools/memory.py | 23 +++++++++++++ 6 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 src/core/default_config.py diff --git a/frontends/src/bridge/DBus.py b/frontends/src/bridge/DBus.py index 447e9051..c0123075 100644 --- a/frontends/src/bridge/DBus.py +++ b/frontends/src/bridge/DBus.py @@ -81,6 +81,9 @@ class DBusBridgeFrontend(BridgeFrontend): 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 --git a/src/bridge/DBus.py b/src/bridge/DBus.py index c67ab692..d950c073 100755 --- a/src/bridge/DBus.py +++ b/src/bridge/DBus.py @@ -170,6 +170,12 @@ class DbusObject(dbus.service.Object): def disconnect(self, profile_key="@DEFAULT@"): 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) diff --git a/src/bridge/bridge_constructor/bridge_template.ini b/src/bridge/bridge_constructor/bridge_template.ini index dd7a3330..99d8f12f 100644 --- a/src/bridge/bridge_constructor/bridge_template.ini +++ b/src/bridge/bridge_constructor/bridge_template.ini @@ -320,6 +320,17 @@ doc_param_0=sub_type: as for [subscribe] 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 --git a/src/core/default_config.py b/src/core/default_config.py new file mode 100644 index 00000000..7e62ddb2 --- /dev/null +++ b/src/core/default_config.py @@ -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 --git a/src/core/sat_main.py b/src/core/sat_main.py index 0319e9ba..96dd49f3 100644 --- a/src/core/sat_main.py +++ b/src/core/sat_main.py @@ -97,20 +97,22 @@ class SAT(service.Service): 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 @@ class SAT(service.Service): 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 --git a/src/tools/memory.py b/src/tools/memory.py index ff89812f..c4d8aa7b 100644 --- a/src/tools/memory.py +++ b/src/tools/memory.py @@ -24,12 +24,14 @@ from __future__ import with_statement 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 @@ class Memory: 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')+