changeset 364:312ca6f9d84a

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
author Goffi <goffi@goffi.org>
date Sat, 18 Jun 2011 16:22:50 +0200
parents 54c77a56b22f
children efbfccfed623
files frontends/src/bridge/DBus.py src/bridge/DBus.py src/bridge/bridge_constructor/bridge_template.ini src/core/default_config.py src/core/sat_main.py src/tools/memory.py
diffstat 6 files changed, 84 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- 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)
 
--- 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@"):
--- 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
--- /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 <http://www.gnu.org/licenses/>.
+"""
+
+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',
+}
--- 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)
--- 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')+