Detect dependencys only on demand
This allows us to import the app module without triggering dependency detection Also add is_installed() for checking if a dependency is installed and disable_dependency() in case we dont want to use a dependency
This commit is contained in:
parent
986898f69d
commit
e265514d88
|
@ -384,9 +384,10 @@ class Account(Gtk.Box):
|
||||||
|
|
||||||
def set_activatable(self):
|
def set_activatable(self):
|
||||||
if self.account == app.ZEROCONF_ACC_NAME:
|
if self.account == app.ZEROCONF_ACC_NAME:
|
||||||
self.get_parent().set_activatable(app.HAVE_ZEROCONF)
|
zeroconf = app.is_installed('ZEROCONF')
|
||||||
self.get_parent().set_sensitive(app.HAVE_ZEROCONF)
|
self.get_parent().set_activatable(zeroconf)
|
||||||
if not app.HAVE_ZEROCONF:
|
self.get_parent().set_sensitive(zeroconf)
|
||||||
|
if not zeroconf:
|
||||||
self.get_parent().set_tooltip_text(
|
self.get_parent().set_tooltip_text(
|
||||||
_('Please check if Avahi or Bonjour is installed.'))
|
_('Please check if Avahi or Bonjour is installed.'))
|
||||||
|
|
||||||
|
@ -482,7 +483,7 @@ class GenericOptionPage(Gtk.Box):
|
||||||
switch.set_vexpand(False)
|
switch.set_vexpand(False)
|
||||||
switch.set_valign(Gtk.Align.CENTER)
|
switch.set_valign(Gtk.Align.CENTER)
|
||||||
switch.set_halign(Gtk.Align.END)
|
switch.set_halign(Gtk.Align.END)
|
||||||
if self.account == app.ZEROCONF_ACC_NAME and not app.HAVE_ZEROCONF:
|
if self.account == app.ZEROCONF_ACC_NAME and not app.is_installed('ZEROCONF'):
|
||||||
switch.set_sensitive(False)
|
switch.set_sensitive(False)
|
||||||
switch.set_active(False)
|
switch.set_active(False)
|
||||||
|
|
||||||
|
|
|
@ -394,7 +394,7 @@ class ChatControl(ChatControlBase):
|
||||||
|
|
||||||
# Jingle detection
|
# Jingle detection
|
||||||
if self.contact.supports(NS_JINGLE_ICE_UDP) and \
|
if self.contact.supports(NS_JINGLE_ICE_UDP) and \
|
||||||
app.HAVE_FARSTREAM and self.contact.resource:
|
app.is_installed('FARSTREAM') and self.contact.resource:
|
||||||
self.audio_available = self.contact.supports(NS_JINGLE_RTP_AUDIO)
|
self.audio_available = self.contact.supports(NS_JINGLE_RTP_AUDIO)
|
||||||
self.video_available = self.contact.supports(NS_JINGLE_RTP_VIDEO)
|
self.video_available = self.contact.supports(NS_JINGLE_RTP_VIDEO)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -63,7 +63,7 @@ from gajim.command_system.implementation.middleware import CommandTools
|
||||||
from gajim.command_system.implementation import standard
|
from gajim.command_system.implementation import standard
|
||||||
from gajim.command_system.implementation import execute
|
from gajim.command_system.implementation import execute
|
||||||
|
|
||||||
if app.HAVE_SPELL:
|
if app.is_installed('GSPELL'):
|
||||||
from gi.repository import Gspell
|
from gi.repository import Gspell
|
||||||
|
|
||||||
|
|
||||||
|
@ -487,7 +487,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools):
|
||||||
Gtk.IconSize.MENU)
|
Gtk.IconSize.MENU)
|
||||||
|
|
||||||
def set_speller(self):
|
def set_speller(self):
|
||||||
if not app.HAVE_SPELL or not app.config.get('use_speller'):
|
if not app.is_installed('GSPELL') or not app.config.get('use_speller'):
|
||||||
return
|
return
|
||||||
|
|
||||||
gspell_lang = self.get_speller_language()
|
gspell_lang = self.get_speller_language()
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
## Copyright (C) 2007-2008 Brendan Taylor <whateley AT gmail.com>
|
## Copyright (C) 2007-2008 Brendan Taylor <whateley AT gmail.com>
|
||||||
## Stephan Erb <steve-e AT h3c.de>
|
## Stephan Erb <steve-e AT h3c.de>
|
||||||
## Copyright (C) 2008 Jonathan Schleifer <js-gajim AT webkeks.org>
|
## Copyright (C) 2008 Jonathan Schleifer <js-gajim AT webkeks.org>
|
||||||
|
## Copyright (C) 2018 Philipp Hörist <philipp @ hoerist.com>
|
||||||
##
|
##
|
||||||
## This file is part of Gajim.
|
## This file is part of Gajim.
|
||||||
##
|
##
|
||||||
|
@ -34,10 +35,8 @@ import locale
|
||||||
import uuid
|
import uuid
|
||||||
from distutils.version import LooseVersion as V
|
from distutils.version import LooseVersion as V
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
import gi
|
|
||||||
import nbxmpp
|
|
||||||
|
|
||||||
from gi.repository import GLib
|
import nbxmpp
|
||||||
|
|
||||||
from gajim.common import config as c_config
|
from gajim.common import config as c_config
|
||||||
from gajim.common import configpaths
|
from gajim.common import configpaths
|
||||||
|
@ -58,8 +57,6 @@ ged = ged_module.GlobalEventsDispatcher() # Global Events Dispatcher
|
||||||
nec = None # Network Events Controller
|
nec = None # Network Events Controller
|
||||||
plugin_manager = None # Plugins Manager
|
plugin_manager = None # Plugins Manager
|
||||||
|
|
||||||
glog = logging.getLogger('gajim')
|
|
||||||
|
|
||||||
logger = None
|
logger = None
|
||||||
|
|
||||||
# For backwards compatibility needed
|
# For backwards compatibility needed
|
||||||
|
@ -152,122 +149,6 @@ ZEROCONF_ACC_NAME = 'Local'
|
||||||
idlequeue = None
|
idlequeue = None
|
||||||
socks5queue = None
|
socks5queue = None
|
||||||
|
|
||||||
HAVE_ZEROCONF = True
|
|
||||||
try:
|
|
||||||
__import__('avahi')
|
|
||||||
except ImportError:
|
|
||||||
try:
|
|
||||||
__import__('pybonjour')
|
|
||||||
except Exception: # Linux raises ImportError, Windows raises WindowsError
|
|
||||||
HAVE_ZEROCONF = False
|
|
||||||
|
|
||||||
HAVE_PYCRYPTO = True
|
|
||||||
try:
|
|
||||||
__import__('Crypto')
|
|
||||||
except ImportError:
|
|
||||||
HAVE_PYCRYPTO = False
|
|
||||||
|
|
||||||
HAVE_GPG = True
|
|
||||||
GPG_BINARY = 'gpg'
|
|
||||||
try:
|
|
||||||
import gnupg
|
|
||||||
'''
|
|
||||||
We need https://pypi.python.org/pypi/python-gnupg
|
|
||||||
but https://pypi.python.org/pypi/gnupg shares the same package name.
|
|
||||||
It cannot be used as a drop-in replacement.
|
|
||||||
We test with a version check if python-gnupg is installed as it is
|
|
||||||
on a much lower version number than gnupg
|
|
||||||
Also we need at least python-gnupg 0.3.8
|
|
||||||
'''
|
|
||||||
v_gnupg = gnupg.__version__
|
|
||||||
if V(v_gnupg) < V('0.3.8') or V(v_gnupg) > V('1.0.0'):
|
|
||||||
glog.info('Gajim needs python-gnupg >= 0.3.8')
|
|
||||||
HAVE_GPG = False
|
|
||||||
except ImportError:
|
|
||||||
HAVE_GPG = False
|
|
||||||
else:
|
|
||||||
import subprocess
|
|
||||||
def test_gpg(binary='gpg'):
|
|
||||||
if os.name == 'nt':
|
|
||||||
gpg_cmd = binary + ' -h >nul 2>&1'
|
|
||||||
else:
|
|
||||||
gpg_cmd = binary + ' -h >/dev/null 2>&1'
|
|
||||||
if subprocess.call(gpg_cmd, shell=True):
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
if test_gpg(binary='gpg2'):
|
|
||||||
GPG_BINARY = 'gpg2'
|
|
||||||
if not test_gpg(binary='gpg'):
|
|
||||||
HAVE_GPG = False
|
|
||||||
|
|
||||||
HAVE_FARSTREAM = True
|
|
||||||
try:
|
|
||||||
if os.name == 'nt':
|
|
||||||
os.environ['FS_PLUGIN_PATH'] = 'gtk\\lib\\farstream-0.1'
|
|
||||||
os.environ['GST_PLUGIN_PATH'] = 'gtk\\lib\\gstreamer-0.10'
|
|
||||||
gi.require_version('Farstream', '0.2')
|
|
||||||
from gi.repository import Farstream
|
|
||||||
gi.require_version('Gst', '1.0')
|
|
||||||
from gi.repository import Gst
|
|
||||||
from gi.repository import GLib
|
|
||||||
try:
|
|
||||||
Gst.init(None)
|
|
||||||
conference = Gst.ElementFactory.make('fsrtpconference', None)
|
|
||||||
session = conference.new_session(Farstream.MediaType.AUDIO)
|
|
||||||
del session
|
|
||||||
del conference
|
|
||||||
except Exception as e:
|
|
||||||
glog.info(e)
|
|
||||||
HAVE_FARSTREAM = False
|
|
||||||
|
|
||||||
except (ImportError, ValueError):
|
|
||||||
HAVE_FARSTREAM = False
|
|
||||||
|
|
||||||
HAVE_GEOCLUE = True
|
|
||||||
try:
|
|
||||||
gi.require_version('Geoclue', '2.0')
|
|
||||||
from gi.repository import Geoclue
|
|
||||||
except (ImportError, ValueError):
|
|
||||||
HAVE_GEOCLUE = False
|
|
||||||
|
|
||||||
HAVE_UPNP_IGD = True
|
|
||||||
try:
|
|
||||||
gi.require_version('GUPnPIgd', '1.0')
|
|
||||||
from gi.repository import GUPnPIgd
|
|
||||||
gupnp_igd = GUPnPIgd.SimpleIgd()
|
|
||||||
except ValueError:
|
|
||||||
HAVE_UPNP_IGD = False
|
|
||||||
|
|
||||||
HAVE_PYCURL = True
|
|
||||||
try:
|
|
||||||
__import__('pycurl')
|
|
||||||
except ImportError:
|
|
||||||
HAVE_PYCURL = False
|
|
||||||
|
|
||||||
try:
|
|
||||||
from gajim.common import sleepy
|
|
||||||
if sleepy.SUPPORTED:
|
|
||||||
HAVE_IDLE = True
|
|
||||||
except Exception:
|
|
||||||
glog.info(_('Unable to load idle module'))
|
|
||||||
HAVE_IDLE = False
|
|
||||||
|
|
||||||
HAVE_SPELL = False
|
|
||||||
try:
|
|
||||||
spell_log = logging.getLogger('gajim.speller')
|
|
||||||
gi.require_version('Gspell', '1')
|
|
||||||
from gi.repository import Gspell
|
|
||||||
langs = Gspell.language_get_available()
|
|
||||||
for lang in langs:
|
|
||||||
spell_log.info('%s (%s) dict available',
|
|
||||||
lang.get_name(), lang.get_code())
|
|
||||||
if langs:
|
|
||||||
HAVE_SPELL = True
|
|
||||||
else:
|
|
||||||
spell_log.info('No dicts available')
|
|
||||||
except (ImportError, ValueError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
gajim_identity = {'type': 'pc', 'category': 'client', 'name': 'Gajim'}
|
gajim_identity = {'type': 'pc', 'category': 'client', 'name': 'Gajim'}
|
||||||
gajim_common_features = [nbxmpp.NS_BYTESTREAM, nbxmpp.NS_SI, nbxmpp.NS_FILE,
|
gajim_common_features = [nbxmpp.NS_BYTESTREAM, nbxmpp.NS_SI, nbxmpp.NS_FILE,
|
||||||
nbxmpp.NS_MUC, nbxmpp.NS_MUC_USER, nbxmpp.NS_MUC_ADMIN, nbxmpp.NS_MUC_OWNER,
|
nbxmpp.NS_MUC, nbxmpp.NS_MUC_USER, nbxmpp.NS_MUC_ADMIN, nbxmpp.NS_MUC_OWNER,
|
||||||
|
@ -287,6 +168,161 @@ gajim_optional_features = {}
|
||||||
# Capabilities hash per account
|
# Capabilities hash per account
|
||||||
caps_hash = {}
|
caps_hash = {}
|
||||||
|
|
||||||
|
_dependencies = {
|
||||||
|
'AVAHI': False,
|
||||||
|
'PYBONJOUR': False,
|
||||||
|
'PYCRYPTO': False,
|
||||||
|
'PYGPG': False,
|
||||||
|
'GPG_BINARY': False,
|
||||||
|
'FARSTREAM': False,
|
||||||
|
'GEOCLUE': False,
|
||||||
|
'UPNP': False,
|
||||||
|
'PYCURL': False,
|
||||||
|
'GSPELL': False,
|
||||||
|
'IDLE': False,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def is_installed(dependency):
|
||||||
|
if dependency == 'GPG':
|
||||||
|
# Alias for checking python-gnupg and the GPG binary
|
||||||
|
return _dependencies['PYGPG'] and _dependencies['GPG_BINARY']
|
||||||
|
if dependency == 'ZEROCONF':
|
||||||
|
# Alias for checking zeroconf libs
|
||||||
|
return _dependencies['AVAHI'] or _dependencies['PYBONJOUR']
|
||||||
|
return _dependencies[dependency]
|
||||||
|
|
||||||
|
def disable_dependency(dependency):
|
||||||
|
_dependencies[dependency] = False
|
||||||
|
|
||||||
|
def detect_dependencies():
|
||||||
|
import gi
|
||||||
|
|
||||||
|
# ZEROCONF
|
||||||
|
try:
|
||||||
|
if os.name == 'nt':
|
||||||
|
import pybonjour
|
||||||
|
_dependencies['PYBONJOUR'] = True
|
||||||
|
else:
|
||||||
|
import avahi
|
||||||
|
_dependencies['AVAHI'] = True
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# PYCRYPTO
|
||||||
|
try:
|
||||||
|
import Crypto
|
||||||
|
_dependencies['PYCRYPTO'] = True
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# python-gnupg
|
||||||
|
try:
|
||||||
|
import gnupg
|
||||||
|
'''
|
||||||
|
We need https://pypi.python.org/pypi/python-gnupg
|
||||||
|
but https://pypi.python.org/pypi/gnupg shares the same package name.
|
||||||
|
It cannot be used as a drop-in replacement.
|
||||||
|
We test with a version check if python-gnupg is installed as it is
|
||||||
|
on a much lower version number than gnupg
|
||||||
|
Also we need at least python-gnupg 0.3.8
|
||||||
|
'''
|
||||||
|
v_gnupg = gnupg.__version__
|
||||||
|
if V(v_gnupg) < V('0.3.8') or V(v_gnupg) > V('1.0.0'):
|
||||||
|
log('gajim').info('Gajim needs python-gnupg >= 0.3.8')
|
||||||
|
raise ImportError
|
||||||
|
_dependencies['PYGPG'] = True
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# GPG BINARY
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
def test_gpg(binary='gpg'):
|
||||||
|
if os.name == 'nt':
|
||||||
|
gpg_cmd = binary + ' -h >nul 2>&1'
|
||||||
|
else:
|
||||||
|
gpg_cmd = binary + ' -h >/dev/null 2>&1'
|
||||||
|
if subprocess.call(gpg_cmd, shell=True):
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
if test_gpg(binary='gpg2'):
|
||||||
|
_dependencies['GPG_BINARY'] = 'gpg2'
|
||||||
|
elif test_gpg(binary='gpg'):
|
||||||
|
_dependencies['GPG_BINARY'] = 'gpg'
|
||||||
|
|
||||||
|
# FARSTREAM
|
||||||
|
try:
|
||||||
|
if os.name == 'nt':
|
||||||
|
os.environ['FS_PLUGIN_PATH'] = 'gtk\\lib\\farstream-0.1'
|
||||||
|
os.environ['GST_PLUGIN_PATH'] = 'gtk\\lib\\gstreamer-0.10'
|
||||||
|
gi.require_version('Farstream', '0.2')
|
||||||
|
from gi.repository import Farstream
|
||||||
|
gi.require_version('Gst', '1.0')
|
||||||
|
from gi.repository import Gst
|
||||||
|
try:
|
||||||
|
Gst.init(None)
|
||||||
|
conference = Gst.ElementFactory.make('fsrtpconference', None)
|
||||||
|
session = conference.new_session(Farstream.MediaType.AUDIO)
|
||||||
|
except Exception as error:
|
||||||
|
log('gajim').info(error)
|
||||||
|
_dependencies['FARSTREAM'] = True
|
||||||
|
except (ImportError, ValueError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
# GEOCLUE
|
||||||
|
try:
|
||||||
|
gi.require_version('Geoclue', '2.0')
|
||||||
|
from gi.repository import Geoclue
|
||||||
|
_dependencies['GEOCLUE'] = True
|
||||||
|
except (ImportError, ValueError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
# UPNP
|
||||||
|
try:
|
||||||
|
gi.require_version('GUPnPIgd', '1.0')
|
||||||
|
from gi.repository import GUPnPIgd
|
||||||
|
gupnp_igd = GUPnPIgd.SimpleIgd()
|
||||||
|
_dependencies['UPNP'] = True
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# PYCURL
|
||||||
|
try:
|
||||||
|
import pycurl
|
||||||
|
_dependencies['PYCURL'] = True
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# IDLE
|
||||||
|
try:
|
||||||
|
from gajim.common import sleepy
|
||||||
|
if sleepy.SUPPORTED:
|
||||||
|
_dependencies['IDLE'] = True
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# GSPELL
|
||||||
|
try:
|
||||||
|
gi.require_version('Gspell', '1')
|
||||||
|
from gi.repository import Gspell
|
||||||
|
langs = Gspell.language_get_available()
|
||||||
|
for lang in langs:
|
||||||
|
log('gajim').info('%s (%s) dict available',
|
||||||
|
lang.get_name(), lang.get_code())
|
||||||
|
if langs:
|
||||||
|
_dependencies['GSPELL'] = True
|
||||||
|
except (ImportError, ValueError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Print results
|
||||||
|
for dep, val in _dependencies.items():
|
||||||
|
log('gajim').info('%-13s %s', dep, val)
|
||||||
|
|
||||||
|
def get_gpg_binary():
|
||||||
|
return _dependencies['GPG_BINARY']
|
||||||
|
|
||||||
def get_an_id():
|
def get_an_id():
|
||||||
return str(uuid.uuid4())
|
return str(uuid.uuid4())
|
||||||
|
|
||||||
|
@ -556,8 +592,9 @@ def get_priority(account, show):
|
||||||
return prio
|
return prio
|
||||||
|
|
||||||
def log(domain):
|
def log(domain):
|
||||||
root = 'gajim.'
|
if domain != 'gajim':
|
||||||
return logging.getLogger(root + domain)
|
domain = 'gajim.%s' % domain
|
||||||
|
return logging.getLogger(domain)
|
||||||
|
|
||||||
def prefers_app_menu():
|
def prefers_app_menu():
|
||||||
if sys.platform == 'darwin':
|
if sys.platform == 'darwin':
|
||||||
|
|
|
@ -136,7 +136,7 @@ class CommonConnection:
|
||||||
self.server_resource = self._compute_resource()
|
self.server_resource = self._compute_resource()
|
||||||
self.gpg = None
|
self.gpg = None
|
||||||
self.USE_GPG = False
|
self.USE_GPG = False
|
||||||
if app.HAVE_GPG:
|
if app.is_installed('GPG'):
|
||||||
self.USE_GPG = True
|
self.USE_GPG = True
|
||||||
self.gpg = gpg.GnuPG()
|
self.gpg = gpg.GnuPG()
|
||||||
self.status = ''
|
self.status = ''
|
||||||
|
@ -598,7 +598,7 @@ class CommonConnection:
|
||||||
self.old_show = show
|
self.old_show = show
|
||||||
self.on_purpose = False
|
self.on_purpose = False
|
||||||
self.server_resource = self._compute_resource()
|
self.server_resource = self._compute_resource()
|
||||||
if app.HAVE_GPG:
|
if app.is_installed('GPG'):
|
||||||
self.USE_GPG = True
|
self.USE_GPG = True
|
||||||
self.gpg = gpg.GnuPG()
|
self.gpg = gpg.GnuPG()
|
||||||
app.nec.push_incoming_event(BeforeChangeShowEvent(None,
|
app.nec.push_incoming_event(BeforeChangeShowEvent(None,
|
||||||
|
@ -638,7 +638,7 @@ class CommonConnection:
|
||||||
self.connected = app.SHOW_LIST.index(show)
|
self.connected = app.SHOW_LIST.index(show)
|
||||||
idle_time = None
|
idle_time = None
|
||||||
if auto:
|
if auto:
|
||||||
if app.HAVE_IDLE and app.config.get('autoaway'):
|
if app.is_installed('IDLE') and app.config.get('autoaway'):
|
||||||
idle_sec = int(app.interface.sleeper.getIdleSec())
|
idle_sec = int(app.interface.sleeper.getIdleSec())
|
||||||
idle_time = time.strftime('%Y-%m-%dT%H:%M:%SZ',
|
idle_time = time.strftime('%Y-%m-%dT%H:%M:%SZ',
|
||||||
time.gmtime(time.time() - idle_sec))
|
time.gmtime(time.time() - idle_sec))
|
||||||
|
@ -898,7 +898,7 @@ class Connection(CommonConnection, ConnectionHandlers):
|
||||||
app.nec.push_incoming_event(AccountNotCreatedEvent(
|
app.nec.push_incoming_event(AccountNotCreatedEvent(
|
||||||
None, conn=self, reason=reason))
|
None, conn=self, reason=reason))
|
||||||
return
|
return
|
||||||
if app.HAVE_GPG:
|
if app.is_installed('GPG'):
|
||||||
self.USE_GPG = True
|
self.USE_GPG = True
|
||||||
self.gpg = gpg.GnuPG()
|
self.gpg = gpg.GnuPG()
|
||||||
app.nec.push_incoming_event(
|
app.nec.push_incoming_event(
|
||||||
|
@ -2755,7 +2755,7 @@ class Connection(CommonConnection, ConnectionHandlers):
|
||||||
p = self.add_sha(p, ptype != 'unavailable')
|
p = self.add_sha(p, ptype != 'unavailable')
|
||||||
self.add_lang(p)
|
self.add_lang(p)
|
||||||
if auto:
|
if auto:
|
||||||
if app.HAVE_IDLE and app.config.get('autoaway'):
|
if app.is_installed('IDLE') and app.config.get('autoaway'):
|
||||||
idle_sec = int(app.interface.sleeper.getIdleSec())
|
idle_sec = int(app.interface.sleeper.getIdleSec())
|
||||||
idle_time = time.strftime('%Y-%m-%dT%H:%M:%SZ',
|
idle_time = time.strftime('%Y-%m-%dT%H:%M:%SZ',
|
||||||
time.gmtime(time.time() - idle_sec))
|
time.gmtime(time.time() - idle_sec))
|
||||||
|
|
|
@ -1712,7 +1712,7 @@ ConnectionHTTPUpload):
|
||||||
def _nec_last_request_received(self, obj):
|
def _nec_last_request_received(self, obj):
|
||||||
if obj.conn.name != self.name:
|
if obj.conn.name != self.name:
|
||||||
return
|
return
|
||||||
if app.HAVE_IDLE and app.config.get_per('accounts', self.name,
|
if app.is_installed('IDLE') and app.config.get_per('accounts', self.name,
|
||||||
'send_idle_time'):
|
'send_idle_time'):
|
||||||
iq_obj = obj.stanza.buildReply('result')
|
iq_obj = obj.stanza.buildReply('result')
|
||||||
qp = iq_obj.setQuery()
|
qp = iq_obj.setQuery()
|
||||||
|
|
|
@ -26,14 +26,14 @@ import os
|
||||||
import logging
|
import logging
|
||||||
from gajim.common import app
|
from gajim.common import app
|
||||||
|
|
||||||
if app.HAVE_GPG:
|
if app.is_installed('GPG'):
|
||||||
import gnupg
|
import gnupg
|
||||||
gnupg.logger = logging.getLogger('gajim.c.gnupg')
|
gnupg.logger = logging.getLogger('gajim.c.gnupg')
|
||||||
|
|
||||||
class GnuPG(gnupg.GPG):
|
class GnuPG(gnupg.GPG):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
use_agent = app.config.get('use_gpg_agent')
|
use_agent = app.config.get('use_gpg_agent')
|
||||||
gnupg.GPG.__init__(self, gpgbinary=app.GPG_BINARY, use_agent=use_agent)
|
gnupg.GPG.__init__(self, gpgbinary=app.get_gpg_binary(), use_agent=use_agent)
|
||||||
encoding = app.config.get('pgp_encoding')
|
encoding = app.config.get('pgp_encoding')
|
||||||
if encoding:
|
if encoding:
|
||||||
self.encoding = encoding
|
self.encoding = encoding
|
||||||
|
|
|
@ -732,7 +732,7 @@ def parse_datetime(timestring, check_utc=False, convert='utc', epoch=False):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
from gajim.common import app
|
from gajim.common import app
|
||||||
if app.HAVE_PYCURL:
|
if app.is_installed('PYCURL'):
|
||||||
import pycurl
|
import pycurl
|
||||||
from io import StringIO
|
from io import StringIO
|
||||||
|
|
||||||
|
@ -1360,13 +1360,13 @@ def update_optional_features(account = None):
|
||||||
app.gajim_optional_features[a].append(nbxmpp.NS_CHATSTATES)
|
app.gajim_optional_features[a].append(nbxmpp.NS_CHATSTATES)
|
||||||
if not app.config.get('ignore_incoming_xhtml'):
|
if not app.config.get('ignore_incoming_xhtml'):
|
||||||
app.gajim_optional_features[a].append(nbxmpp.NS_XHTML_IM)
|
app.gajim_optional_features[a].append(nbxmpp.NS_XHTML_IM)
|
||||||
if app.HAVE_PYCRYPTO \
|
if app.is_installed('PYCRYPTO') \
|
||||||
and app.config.get_per('accounts', a, 'enable_esessions'):
|
and app.config.get_per('accounts', a, 'enable_esessions'):
|
||||||
app.gajim_optional_features[a].append(nbxmpp.NS_ESESSION)
|
app.gajim_optional_features[a].append(nbxmpp.NS_ESESSION)
|
||||||
if app.config.get_per('accounts', a, 'answer_receipts'):
|
if app.config.get_per('accounts', a, 'answer_receipts'):
|
||||||
app.gajim_optional_features[a].append(nbxmpp.NS_RECEIPTS)
|
app.gajim_optional_features[a].append(nbxmpp.NS_RECEIPTS)
|
||||||
app.gajim_optional_features[a].append(nbxmpp.NS_JINGLE)
|
app.gajim_optional_features[a].append(nbxmpp.NS_JINGLE)
|
||||||
if app.HAVE_FARSTREAM:
|
if app.is_installed('FARSTREAM'):
|
||||||
app.gajim_optional_features[a].append(nbxmpp.NS_JINGLE_RTP)
|
app.gajim_optional_features[a].append(nbxmpp.NS_JINGLE_RTP)
|
||||||
app.gajim_optional_features[a].append(nbxmpp.NS_JINGLE_RTP_AUDIO)
|
app.gajim_optional_features[a].append(nbxmpp.NS_JINGLE_RTP_AUDIO)
|
||||||
app.gajim_optional_features[a].append(nbxmpp.NS_JINGLE_RTP_VIDEO)
|
app.gajim_optional_features[a].append(nbxmpp.NS_JINGLE_RTP_VIDEO)
|
||||||
|
@ -1545,7 +1545,7 @@ def _get_img_proxy(attrs, proxy):
|
||||||
Download an image through a proxy. This function should be launched in a
|
Download an image through a proxy. This function should be launched in a
|
||||||
separated thread.
|
separated thread.
|
||||||
"""
|
"""
|
||||||
if not app.HAVE_PYCURL:
|
if not app.is_installed('PYCURL'):
|
||||||
return '', _('PyCURL is not installed')
|
return '', _('PyCURL is not installed')
|
||||||
mem, alt, max_size = '', '', 2*1024*1024
|
mem, alt, max_size = '', '', 2*1024*1024
|
||||||
if 'max_size' in attrs:
|
if 'max_size' in attrs:
|
||||||
|
|
|
@ -37,7 +37,7 @@ from gajim.common import app
|
||||||
from gajim.common.jingle_session import JingleSession, JingleStates
|
from gajim.common.jingle_session import JingleSession, JingleStates
|
||||||
from gajim.common.jingle_ft import JingleFileTransfer
|
from gajim.common.jingle_ft import JingleFileTransfer
|
||||||
from gajim.common.jingle_transport import JingleTransportSocks5, JingleTransportIBB
|
from gajim.common.jingle_transport import JingleTransportSocks5, JingleTransportIBB
|
||||||
if app.HAVE_FARSTREAM:
|
if app.is_installed('FARSTREAM'):
|
||||||
from gajim.common.jingle_rtp import JingleAudio, JingleVideo
|
from gajim.common.jingle_rtp import JingleAudio, JingleVideo
|
||||||
|
|
||||||
logger = logging.getLogger('gajim.c.jingle')
|
logger = logging.getLogger('gajim.c.jingle')
|
||||||
|
|
|
@ -416,7 +416,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream):
|
||||||
self._add_streamhosts_to_query(query, sender, port, additional_hosts)
|
self._add_streamhosts_to_query(query, sender, port, additional_hosts)
|
||||||
|
|
||||||
def _add_upnp_igd_as_streamhost_to_query(self, query, file_props, iq):
|
def _add_upnp_igd_as_streamhost_to_query(self, query, file_props, iq):
|
||||||
if not app.HAVE_UPNP_IGD:
|
if not app.is_installed('UPNP'):
|
||||||
self.connection.send(iq)
|
self.connection.send(iq)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -487,7 +487,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream):
|
||||||
def no_upnp_reply():
|
def no_upnp_reply():
|
||||||
log.debug('Got not GUPnP-IGD answer')
|
log.debug('Got not GUPnP-IGD answer')
|
||||||
# stop trying to use it
|
# stop trying to use it
|
||||||
app.HAVE_UPNP_IGD = False
|
app.disable_dependency('UPNP')
|
||||||
self.no_gupnp_reply_id = 0
|
self.no_gupnp_reply_id = 0
|
||||||
self.connection.send(iq)
|
self.connection.send(iq)
|
||||||
cleanup_gupnp()
|
cleanup_gupnp()
|
||||||
|
|
|
@ -40,7 +40,7 @@ from gajim.common import crypto
|
||||||
import logging
|
import logging
|
||||||
log = logging.getLogger('gajim.c.stanza_session')
|
log = logging.getLogger('gajim.c.stanza_session')
|
||||||
|
|
||||||
if app.HAVE_PYCRYPTO:
|
if app.is_installed('PYCRYPTO'):
|
||||||
from Crypto.Cipher import AES
|
from Crypto.Cipher import AES
|
||||||
from Crypto.PublicKey import RSA
|
from Crypto.PublicKey import RSA
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,7 @@ try:
|
||||||
except (ImportError, ValueError):
|
except (ImportError, ValueError):
|
||||||
HAS_GST = False
|
HAS_GST = False
|
||||||
|
|
||||||
if app.HAVE_SPELL:
|
if app.is_installed('GSPELL'):
|
||||||
from gi.repository import Gspell
|
from gi.repository import Gspell
|
||||||
|
|
||||||
#---------- PreferencesWindow class -------------#
|
#---------- PreferencesWindow class -------------#
|
||||||
|
@ -179,7 +179,7 @@ class PreferencesWindow:
|
||||||
self.xml.get_object('xhtml_checkbutton').set_active(st)
|
self.xml.get_object('xhtml_checkbutton').set_active(st)
|
||||||
|
|
||||||
# use speller
|
# use speller
|
||||||
if app.HAVE_SPELL:
|
if app.is_installed('GSPELL'):
|
||||||
st = app.config.get('use_speller')
|
st = app.config.get('use_speller')
|
||||||
self.xml.get_object('speller_checkbutton').set_active(st)
|
self.xml.get_object('speller_checkbutton').set_active(st)
|
||||||
else:
|
else:
|
||||||
|
@ -400,7 +400,7 @@ class PreferencesWindow:
|
||||||
if config == value:
|
if config == value:
|
||||||
combobox.set_active(index)
|
combobox.set_active(index)
|
||||||
|
|
||||||
if HAS_GST and app.HAVE_FARSTREAM:
|
if HAS_GST and app.is_installed('FARSTREAM'):
|
||||||
create_av_combobox('audio_input', AudioInputManager().get_devices())
|
create_av_combobox('audio_input', AudioInputManager().get_devices())
|
||||||
create_av_combobox('audio_output', AudioOutputManager().get_devices(
|
create_av_combobox('audio_output', AudioOutputManager().get_devices(
|
||||||
))
|
))
|
||||||
|
|
|
@ -62,7 +62,7 @@ from gajim.common.caps_cache import muc_caps_cache
|
||||||
from gajim.common.exceptions import GajimGeneralException
|
from gajim.common.exceptions import GajimGeneralException
|
||||||
from gajim.common.connection_handlers_events import MessageOutgoingEvent
|
from gajim.common.connection_handlers_events import MessageOutgoingEvent
|
||||||
|
|
||||||
if app.HAVE_SPELL:
|
if app.is_installed('GSPELL'):
|
||||||
from gi.repository import Gspell
|
from gi.repository import Gspell
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
@ -3322,7 +3322,7 @@ class SingleMessageWindow:
|
||||||
else:
|
else:
|
||||||
self.to_entry.set_text(to)
|
self.to_entry.set_text(to)
|
||||||
|
|
||||||
if app.config.get('use_speller') and app.HAVE_SPELL and action == 'send':
|
if app.config.get('use_speller') and app.is_installed('GSPELL') and action == 'send':
|
||||||
lang = app.config.get('speller_language')
|
lang = app.config.get('speller_language')
|
||||||
gspell_lang = Gspell.language_lookup(lang)
|
gspell_lang = Gspell.language_lookup(lang)
|
||||||
if gspell_lang is None:
|
if gspell_lang is None:
|
||||||
|
|
|
@ -140,14 +140,14 @@ class FeaturesWindow:
|
||||||
self.desc_label.set_text(text)
|
self.desc_label.set_text(text)
|
||||||
|
|
||||||
def zeroconf_available(self):
|
def zeroconf_available(self):
|
||||||
return app.HAVE_ZEROCONF
|
return app.is_installed('ZEROCONF')
|
||||||
|
|
||||||
def dbus_available(self):
|
def dbus_available(self):
|
||||||
from gajim.common import dbus_support
|
from gajim.common import dbus_support
|
||||||
return dbus_support.supported
|
return dbus_support.supported
|
||||||
|
|
||||||
def gpg_available(self):
|
def gpg_available(self):
|
||||||
return app.HAVE_GPG
|
return app.is_installed('GPG')
|
||||||
|
|
||||||
def some_keyring_available(self):
|
def some_keyring_available(self):
|
||||||
if os.name == 'nt':
|
if os.name == 'nt':
|
||||||
|
@ -160,14 +160,14 @@ class FeaturesWindow:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def speller_available(self):
|
def speller_available(self):
|
||||||
return app.HAVE_SPELL
|
return app.is_installed('GSPELL')
|
||||||
|
|
||||||
def idle_available(self):
|
def idle_available(self):
|
||||||
from gajim.common import sleepy
|
from gajim.common import sleepy
|
||||||
return sleepy.SUPPORTED
|
return sleepy.SUPPORTED
|
||||||
|
|
||||||
def pycrypto_available(self):
|
def pycrypto_available(self):
|
||||||
return app.HAVE_PYCRYPTO
|
return app.is_installed('PYCRYPTO')
|
||||||
|
|
||||||
def docutils_available(self):
|
def docutils_available(self):
|
||||||
try:
|
try:
|
||||||
|
@ -177,8 +177,8 @@ class FeaturesWindow:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def farstream_available(self):
|
def farstream_available(self):
|
||||||
return app.HAVE_FARSTREAM
|
return app.is_installed('FARSTREAM')
|
||||||
|
|
||||||
def gupnp_igd_available(self):
|
def gupnp_igd_available(self):
|
||||||
return app.HAVE_UPNP_IGD
|
return app.is_installed('UPNP')
|
||||||
|
|
||||||
|
|
|
@ -156,6 +156,7 @@ class GajimApplication(Gtk.Application):
|
||||||
|
|
||||||
# Create and initialize Application Paths & Databases
|
# Create and initialize Application Paths & Databases
|
||||||
from gajim.common import app
|
from gajim.common import app
|
||||||
|
app.detect_dependencies()
|
||||||
configpaths.create_paths()
|
configpaths.create_paths()
|
||||||
from gajim.common import exceptions
|
from gajim.common import exceptions
|
||||||
from gajim.common import logger
|
from gajim.common import logger
|
||||||
|
|
|
@ -56,7 +56,7 @@ from gajim.common import events
|
||||||
|
|
||||||
from gajim.music_track_listener import MusicTrackListener
|
from gajim.music_track_listener import MusicTrackListener
|
||||||
|
|
||||||
if app.HAVE_GEOCLUE:
|
if app.is_installed('GEOCLUE'):
|
||||||
from gajim.common import location_listener
|
from gajim.common import location_listener
|
||||||
|
|
||||||
from gajim import gtkgui_helpers
|
from gajim import gtkgui_helpers
|
||||||
|
@ -1138,7 +1138,7 @@ class Interface:
|
||||||
app.config.get_per('accounts', account, 'publish_tune')):
|
app.config.get_per('accounts', account, 'publish_tune')):
|
||||||
self.enable_music_listener()
|
self.enable_music_listener()
|
||||||
# enable location listener
|
# enable location listener
|
||||||
if (obj.conn.pep_supported and app.HAVE_GEOCLUE and
|
if (obj.conn.pep_supported and app.is_installed('GEOCLUE') and
|
||||||
app.config.get_per('accounts', account, 'publish_location')):
|
app.config.get_per('accounts', account, 'publish_location')):
|
||||||
location_listener.enable()
|
location_listener.enable()
|
||||||
|
|
||||||
|
@ -2881,7 +2881,7 @@ class Interface:
|
||||||
|
|
||||||
self.create_zeroconf_default_config()
|
self.create_zeroconf_default_config()
|
||||||
if app.config.get_per('accounts', app.ZEROCONF_ACC_NAME, 'active') \
|
if app.config.get_per('accounts', app.ZEROCONF_ACC_NAME, 'active') \
|
||||||
and app.HAVE_ZEROCONF:
|
and app.is_installed('ZEROCONF'):
|
||||||
app.connections[app.ZEROCONF_ACC_NAME] = \
|
app.connections[app.ZEROCONF_ACC_NAME] = \
|
||||||
connection_zeroconf.ConnectionZeroconf(app.ZEROCONF_ACC_NAME)
|
connection_zeroconf.ConnectionZeroconf(app.ZEROCONF_ACC_NAME)
|
||||||
for account in app.config.get_per('accounts'):
|
for account in app.config.get_per('accounts'):
|
||||||
|
|
|
@ -30,7 +30,7 @@ from gi.repository import Pango
|
||||||
from gajim.common import app
|
from gajim.common import app
|
||||||
from gajim import gtkgui_helpers
|
from gajim import gtkgui_helpers
|
||||||
|
|
||||||
if app.HAVE_SPELL:
|
if app.is_installed('GSPELL'):
|
||||||
from gi.repository import Gspell
|
from gi.repository import Gspell
|
||||||
|
|
||||||
|
|
||||||
|
@ -133,7 +133,7 @@ class MessageTextView(Gtk.TextView):
|
||||||
self.toggle_speller(False)
|
self.toggle_speller(False)
|
||||||
|
|
||||||
def toggle_speller(self, activate):
|
def toggle_speller(self, activate):
|
||||||
if app.HAVE_SPELL and app.config.get('use_speller'):
|
if app.is_installed('GSPELL') and app.config.get('use_speller'):
|
||||||
spell_view = Gspell.TextView.get_from_gtk_text_view(self)
|
spell_view = Gspell.TextView.get_from_gtk_text_view(self)
|
||||||
spell_view.set_inline_spell_checking(activate)
|
spell_view.set_inline_spell_checking(activate)
|
||||||
|
|
||||||
|
|
|
@ -598,4 +598,4 @@ class GPGOption(DialogOption):
|
||||||
|
|
||||||
def set_activatable(self, name, value):
|
def set_activatable(self, name, value):
|
||||||
active = self.account in app.connections
|
active = self.account in app.connections
|
||||||
self.get_parent().set_activatable(app.HAVE_GPG and active)
|
self.get_parent().set_activatable(app.is_installed('GPG') and active)
|
||||||
|
|
|
@ -64,7 +64,7 @@ from gajim.common import app
|
||||||
from gajim.common import helpers
|
from gajim.common import helpers
|
||||||
from gajim.common.exceptions import GajimGeneralException
|
from gajim.common.exceptions import GajimGeneralException
|
||||||
from gajim.common import i18n
|
from gajim.common import i18n
|
||||||
if app.HAVE_GEOCLUE:
|
if app.is_installed('GEOCLUE'):
|
||||||
from gajim.common import location_listener
|
from gajim.common import location_listener
|
||||||
from gajim.common import ged
|
from gajim.common import ged
|
||||||
from gajim.message_window import MessageWindowMgr
|
from gajim.message_window import MessageWindowMgr
|
||||||
|
@ -4940,7 +4940,7 @@ class RosterWindow:
|
||||||
|
|
||||||
item = Gtk.CheckMenuItem(_('Publish Location'))
|
item = Gtk.CheckMenuItem(_('Publish Location'))
|
||||||
pep_submenu.append(item)
|
pep_submenu.append(item)
|
||||||
if not app.HAVE_GEOCLUE:
|
if not app.is_installed('GEOCLUE'):
|
||||||
item.set_sensitive(False)
|
item.set_sensitive(False)
|
||||||
else:
|
else:
|
||||||
activ = app.config.get_per('accounts', account,
|
activ = app.config.get_per('accounts', account,
|
||||||
|
|
Loading…
Reference in New Issue