Sorry, it just wasn't maintainable. The problem is the current libotr API. I'm sick of working around the strange libotr API, sick of getting HTML messages, sick of losing messages. The final argument for completely removing it was that we can't get the message ID of a sent msg anymore - which we need. I tried to work around this as well, but there seems to be no way to wait for a signal in glib the way I would need it for the workaround (I wanted to emit a signal in inject_message and then wait for it after the call to otr_message_fragment_and_send so the signal can pass us the message id). And the last reason is that we're heading towards a new release and thus want to stabilize the code, thus don't have time to work around even more libotr API strangeness. I will give feedback to the libotr developers, who are currently planning a new API, so that we can hopefully see OTR support once again as soon as libotr4 is released. Kjell already announced that he will continue his branch: https://code.launchpad.net/~afflux/gajim/otr I really hope the libotr devs will provide a sane API with libotr4 so we can integrate OTR support again. Oh, and I added one more try/except block for OS X.
320 lines
9.3 KiB
Python
320 lines
9.3 KiB
Python
## features_window.py
|
|
##
|
|
## Copyright (C) 2007 Yann Leboulanger <asterix@lagaule.org>
|
|
## Stephan Erb <steve-e@h3c.de>
|
|
##
|
|
## This file is part of Gajim.
|
|
##
|
|
## Gajim 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; version 3 only.
|
|
##
|
|
## Gajim 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 Gajim. If not, see <http://www.gnu.org/licenses/>.
|
|
##
|
|
|
|
import os
|
|
import sys
|
|
import gtk
|
|
import gtkgui_helpers
|
|
|
|
import dialogs
|
|
|
|
from common import gajim
|
|
from common import helpers
|
|
|
|
import random
|
|
from tempfile import gettempdir
|
|
from subprocess import Popen
|
|
|
|
class FeaturesWindow:
|
|
'''Class for features window'''
|
|
|
|
def __init__(self):
|
|
self.xml = gtkgui_helpers.get_glade('features_window.glade')
|
|
self.window = self.xml.get_widget('features_window')
|
|
treeview = self.xml.get_widget('features_treeview')
|
|
self.desc_label = self.xml.get_widget('feature_desc_label')
|
|
|
|
# {name: (available_function, unix_text, windows_text)}
|
|
self.features = {
|
|
_('PyOpenSSL'): (self.pyopenssl_available,
|
|
_('A library used to validate server certificates to ensure a secure connection.'),
|
|
_('Requires python-pyopenssl.'),
|
|
_('Requires python-pyopenssl.')),
|
|
_('Bonjour / Zeroconf'): (self.zeroconf_available,
|
|
_('Serverless chatting with autodetected clients in a local network.'),
|
|
_('Requires python-avahi.'),
|
|
_('Requires pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour).')),
|
|
_('gajim-remote'): (self.dbus_available,
|
|
_('A script to controle Gajim via commandline.'),
|
|
_('Requires python-dbus.'),
|
|
_('Feature not available under Windows.')),
|
|
_('OpenGPG'): (self.gpg_available,
|
|
_('Encrypting chatmessages with gpg keys.'),
|
|
_('Requires gpg and python-GnuPGInterface.'),
|
|
_('Feature not available under Windows.')),
|
|
_('network-manager'): (self.network_manager_available,
|
|
_('Autodetection of network status.'),
|
|
_('Requires gnome-network-manager and python-dbus.'),
|
|
_('Feature not available under Windows.')),
|
|
_('Session Management'): (self.session_management_available,
|
|
_('Gajim session is stored on logout and restored on login.'),
|
|
_('Requires python-gnome2.'),
|
|
_('Feature not available under Windows.')),
|
|
_('gnome-keyring'): (self.gnome_keyring_available,
|
|
_('Passwords can be stored securely and not just in plaintext.'),
|
|
_('Requires gnome-keyring and python-gnome2-desktop.'),
|
|
_('Feature not available under Windows.')),
|
|
_('SRV'): (self.srv_available,
|
|
_('Ability to connect to servers which are using SRV records.'),
|
|
_('Requires dnsutils.'),
|
|
_('Requires nslookup to use SRV records.')),
|
|
_('Spell Checker'): (self.speller_available,
|
|
_('Spellchecking of composed messages.'),
|
|
_('Requires python-gnome2-extras or compilation of gtkspell module from Gajim sources.'),
|
|
_('Feature not available under Windows.')),
|
|
_('Notification-daemon'): (self.notification_available,
|
|
_('Passive popups notifying for new events.'),
|
|
_('Requires python-notify or instead python-dbus in conjunction with notification-daemon.'),
|
|
_('Feature not available under Windows.')),
|
|
_('Trayicon'): (self.trayicon_available,
|
|
_('A icon in systemtray reflecting the current presence.'),
|
|
_('Requires python-gnome2-extras or compiled trayicon module from Gajim sources.'),
|
|
_('Requires PyGTK >= 2.10.')),
|
|
_('Idle'): (self.idle_available,
|
|
_('Ability to measure idle time, in order to set auto status.'),
|
|
_('Requires compilation of the idle module from Gajim sources.'),
|
|
_('Requires compilation of the idle module from Gajim sources.')),
|
|
_('LaTeX'): (self.latex_available,
|
|
_('Transform LaTeX expressions between $$ $$.'),
|
|
_('Requires texlive-latex-base, dvips and imagemagick. You have to set \'use_latex\' to True in the Advanced Configuration Editor.'),
|
|
_('Feature not available under Windows.')),
|
|
_('End to End Encryption'): (self.pycrypto_available,
|
|
_('Encrypting chatmessages.'),
|
|
_('Requires python-crypto.'),
|
|
_('Requires python-crypto.')),
|
|
_('RST Generator'): (self.docutils_available,
|
|
_('Generate XHTML output from RST code (see http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html).'),
|
|
_('Requires python-docutils.'),
|
|
_('Requires python-docutils.')),
|
|
_('libsexy'): (self.pysexy_available,
|
|
_('Ability to have clickable URLs in chat and groupchat window banners.'),
|
|
_('Requires python-sexy.'),
|
|
_('Requires python-sexy.')),
|
|
}
|
|
|
|
# name, supported
|
|
self.model = gtk.ListStore(str, bool)
|
|
treeview.set_model(self.model)
|
|
|
|
col = gtk.TreeViewColumn(_('Available'))
|
|
treeview.append_column(col)
|
|
cell = gtk.CellRendererToggle()
|
|
cell.set_property('radio', True)
|
|
col.pack_start(cell)
|
|
col.set_attributes(cell, active = 1)
|
|
|
|
col = gtk.TreeViewColumn(_('Feature'))
|
|
treeview.append_column(col)
|
|
cell = gtk.CellRendererText()
|
|
col.pack_start(cell, expand = True)
|
|
col.add_attribute(cell, 'text', 0)
|
|
|
|
# Fill model
|
|
for feature in self.features:
|
|
func = self.features[feature][0]
|
|
rep = func()
|
|
self.model.append([feature, rep])
|
|
self.xml.signal_autoconnect(self)
|
|
self.window.show_all()
|
|
self.xml.get_widget('close_button').grab_focus()
|
|
|
|
def on_close_button_clicked(self, widget):
|
|
self.window.destroy()
|
|
|
|
def on_features_treeview_cursor_changed(self, widget):
|
|
selection = widget.get_selection()
|
|
if not selection:
|
|
return
|
|
rows = selection.get_selected_rows()[1]
|
|
if not rows:
|
|
return
|
|
path = rows[0]
|
|
available = self.model[path][1]
|
|
feature = self.model[path][0].decode('utf-8')
|
|
text = self.features[feature][1] + '\n'
|
|
if os.name == 'nt':
|
|
text = text + self.features[feature][3]
|
|
else:
|
|
text = text + self.features[feature][2]
|
|
self.desc_label.set_text(text)
|
|
|
|
def pyopenssl_available(self):
|
|
try:
|
|
import OpenSSL.SSL
|
|
import OpenSSL.crypto
|
|
except:
|
|
return False
|
|
return True
|
|
|
|
def zeroconf_available(self):
|
|
try:
|
|
import avahi
|
|
except:
|
|
try:
|
|
import pybonjour
|
|
except:
|
|
return False
|
|
return True
|
|
|
|
def dbus_available(self):
|
|
if os.name == 'nt':
|
|
return False
|
|
from common import dbus_support
|
|
return dbus_support.supported
|
|
|
|
def gpg_available(self):
|
|
if os.name == 'nt':
|
|
return False
|
|
from common import gajim
|
|
return gajim.HAVE_GPG
|
|
|
|
def network_manager_available(self):
|
|
if os.name == 'nt':
|
|
return False
|
|
import network_manager_listener
|
|
return network_manager_listener.supported
|
|
|
|
def session_management_available(self):
|
|
if os.name == 'nt':
|
|
return False
|
|
try:
|
|
import gnome.ui
|
|
except:
|
|
return False
|
|
return True
|
|
|
|
def gnome_keyring_available(self):
|
|
if os.name == 'nt':
|
|
return False
|
|
try:
|
|
import gnomekeyring
|
|
except:
|
|
return False
|
|
return True
|
|
|
|
def srv_available(self):
|
|
return helpers.is_in_path('nslookup')
|
|
|
|
def speller_available(self):
|
|
if os.name == 'nt':
|
|
return False
|
|
try:
|
|
import gtkspell
|
|
except:
|
|
return False
|
|
return True
|
|
|
|
def notification_available(self):
|
|
if os.name == 'nt':
|
|
return False
|
|
elif sys.platform == 'darwin':
|
|
try:
|
|
import osx.growler
|
|
except:
|
|
return False
|
|
return True
|
|
from common import dbus_support
|
|
if self.dbus_available() and dbus_support.get_notifications_interface():
|
|
return True
|
|
try:
|
|
import pynotify
|
|
except:
|
|
return False
|
|
return True
|
|
|
|
def trayicon_available(self):
|
|
if os.name == 'nt' and gtk.pygtk_version >= (2, 10, 0) and \
|
|
gtk.gtk_version >= (2, 10, 0):
|
|
return True
|
|
try:
|
|
import systray
|
|
except:
|
|
return False
|
|
return True
|
|
|
|
def idle_available(self):
|
|
from common import sleepy
|
|
return sleepy.SUPPORTED
|
|
|
|
def latex_available(self):
|
|
'''check is latex is available and if it can create a picture.'''
|
|
|
|
if os.name == 'nt':
|
|
return False
|
|
|
|
exitcode = 0
|
|
random.seed()
|
|
tmpfile = os.path.join(gettempdir(), "gajimtex_" + \
|
|
random.randint(0,100).__str__())
|
|
|
|
# build latex string
|
|
texstr = '\\documentclass[12pt]{article}\\usepackage[dvips]{graphicx}'
|
|
texstr += '\\usepackage{amsmath}\\usepackage{amssymb}\\pagestyle{empty}'
|
|
texstr += '\\begin{document}\\begin{large}\\begin{gather*}test'
|
|
texstr += '\\end{gather*}\\end{large}\\end{document}'
|
|
|
|
file = open(os.path.join(tmpfile + ".tex"), "w+")
|
|
file.write(texstr)
|
|
file.flush()
|
|
file.close()
|
|
try:
|
|
p = Popen(['latex', '--interaction=nonstopmode', tmpfile + '.tex'],
|
|
cwd=gettempdir())
|
|
exitcode = p.wait()
|
|
except:
|
|
exitcode = 1
|
|
if exitcode == 0:
|
|
try:
|
|
p = Popen(['dvips', '-E', '-o', tmpfile + '.ps', tmpfile + '.dvi'],
|
|
cwd=gettempdir())
|
|
exitcode = p.wait()
|
|
except:
|
|
exitcode = 1
|
|
if exitcode == 0:
|
|
try:
|
|
p = Popen(['convert', tmpfile + '.ps', tmpfile + '.png'],
|
|
cwd=gettempdir())
|
|
exitcode = p.wait()
|
|
except:
|
|
exitcode = 1
|
|
extensions = [".tex", ".log", ".aux", ".dvi", ".ps", ".png"]
|
|
for ext in extensions:
|
|
try:
|
|
os.remove(tmpfile + ext)
|
|
except Exception:
|
|
pass
|
|
if exitcode == 0:
|
|
return True
|
|
return False
|
|
|
|
def pycrypto_available(self):
|
|
from common import gajim
|
|
return gajim.HAVE_PYCRYPTO
|
|
|
|
def docutils_available(self):
|
|
try:
|
|
import docutils
|
|
except:
|
|
return False
|
|
return True
|
|
|
|
def pysexy_available(self):
|
|
from common import gajim
|
|
return gajim.HAVE_PYSEXY
|