diff --git a/plugins/dbus_plugin/plugin.py b/plugins/dbus_plugin/plugin.py index 43f3840e8..b8de568e9 100644 --- a/plugins/dbus_plugin/plugin.py +++ b/plugins/dbus_plugin/plugin.py @@ -407,7 +407,7 @@ if dbus_support.supported: return DBUS_DICT_SV() jid = self._get_real_jid(jid) - cached_vcard = gajim.connections.values()[0].get_cached_vcard(jid) + cached_vcard = list(gajim.connections.values())[0].get_cached_vcard(jid) if cached_vcard: return get_dbus_struct(cached_vcard) @@ -428,7 +428,7 @@ if dbus_support.supported: def account_info(self, account): '''show info on account: resource, jid, nick, prio, message''' result = DBUS_DICT_SS() - if gajim.connections.has_key(account): + if account in gajim.connections: # account is valid con = gajim.connections[account] index = con.connected @@ -508,7 +508,7 @@ if dbus_support.supported: def prefs_store(self): try: gajim.interface.save_config() - except Exception, e: + except Exception as e: return DBUS_BOOLEAN(False) return DBUS_BOOLEAN(True) diff --git a/src/adhoc_commands.py b/src/adhoc_commands.py index 8fd2559aa..5a5d81cfc 100644 --- a/src/adhoc_commands.py +++ b/src/adhoc_commands.py @@ -159,7 +159,7 @@ class CommandWindow: return self.stage_adhoc_commands_window_delete_event(self.window) def __del__(self): - print 'Object has been deleted.' + print('Object has been deleted.') # stage 1: waiting for command list def stage1(self): @@ -281,8 +281,6 @@ class CommandWindow: # close old stage self.stage_finish() - assert isinstance(self.commandnode, unicode) - self.form_status = None self.stages_notebook.set_current_page( @@ -452,7 +450,7 @@ class CommandWindow: note = command.getTag('note') if note: - self.notes_label.set_text(note.getData().decode('utf-8')) + self.notes_label.set_text(note.getData()) self.notes_label.set_no_show_all(False) self.notes_label.show() else: @@ -510,7 +508,7 @@ class CommandWindow: try: errorname = nbxmpp.NS_STANZAS + ' ' + str(errorid) errordesc = nbxmpp.ERRORS[errorname][2] - error = errordesc.decode('utf-8') + error = errordesc del errorname, errordesc except KeyError: # when stanza doesn't have error description error = _('Service returned an error.') @@ -608,7 +606,6 @@ class CommandWindow: Send the command with data form. Wait for reply """ # create the stanza - assert isinstance(self.commandnode, unicode) assert action in ('execute', 'prev', 'next', 'complete') stanza = nbxmpp.Iq(typ='set', to=self.jid) diff --git a/src/advanced_configuration_window.py b/src/advanced_configuration_window.py index 7463b6f7d..a2266a55f 100644 --- a/src/advanced_configuration_window.py +++ b/src/advanced_configuration_window.py @@ -141,8 +141,7 @@ class AdvancedConfigurationWindow(object): """ optname = model[iter_][C_PREFNAME] opttype = model[iter_][C_TYPE] - - if opttype.decode('utf-8') == self.types['boolean'] or optname == 'password': + if opttype == self.types['boolean'] or optname == 'password': cell.set_property('editable', False) else: cell.set_property('editable', True) @@ -153,10 +152,10 @@ class AdvancedConfigurationWindow(object): # path[1] is the key name # path[2] is the root of tree # last two is optional - path = [model[iter_][0].decode('utf-8')] + path = [model[iter_][0]] parent = model.iter_parent(iter_) while parent: - path.append(model[parent][0].decode('utf-8')) + path.append(model[parent][0]) parent = model.iter_parent(parent) return path @@ -194,17 +193,17 @@ class AdvancedConfigurationWindow(object): def on_advanced_treeview_row_activated(self, treeview, path, column): modelpath = self.modelfilter.convert_path_to_child_path(path) modelrow = self.model[modelpath] - option = modelrow[0].decode('utf-8') - if modelrow[2].decode('utf-8') == self.types['boolean']: + option = modelrow[0] + if modelrow[2] == self.types['boolean']: for key in self.right_true_dict.keys(): - if self.right_true_dict[key] == modelrow[1].decode('utf-8'): + if self.right_true_dict[key] == modelrow[1]: modelrow[1] = str(key) newval = {'False': True, 'True': False}[modelrow[1]] if len(modelpath.get_indices()) > 1: optnamerow = self.model[modelpath.get_indices()[0]] - optname = optnamerow[0].decode('utf-8') + optname = optnamerow[0] keyrow = self.model[modelpath.get_indices()[:2]] - key = keyrow[0].decode('utf-8') + key = keyrow[0] self.remember_option(option + '\n' + key + '\n' + optname, modelrow[1], newval) gajim.config.set_per(optname, key, option, newval) @@ -234,13 +233,12 @@ class AdvancedConfigurationWindow(object): modelpath = self.modelfilter.convert_path_to_child_path(path) modelrow = self.model[modelpath] modelpath = modelpath.get_indices() - option = modelrow[0].decode('utf-8') - text = text.decode('utf-8') + option = modelrow[0] if len(modelpath) > 1: optnamerow = self.model[modelpath[0]] - optname = optnamerow[0].decode('utf-8') + optname = optnamerow[0] keyrow = self.model[modelpath[:2]] - key = keyrow[0].decode('utf-8') + key = keyrow[0] self.remember_option(option + '\n' + key + '\n' + optname, modelrow[1], text) gajim.config.set_per(optname, key, option, text) @@ -269,12 +267,12 @@ class AdvancedConfigurationWindow(object): return modelpath = self.modelfilter.convert_path_to_child_path(path) modelrow = self.model[modelpath] - option = modelrow[0].decode('utf-8') + option = modelrow[0] if len(modelpath) > 1: optnamerow = self.model[modelpath[0]] - optname = optnamerow[0].decode('utf-8') + optname = optnamerow[0] keyrow = self.model[modelpath[:2]] - key = keyrow[0].decode('utf-8') + key = keyrow[0] self.remember_option(option + '\n' + key + '\n' + optname, modelrow[C_VALUE], default) gajim.config.set_per(optname, key, option, default) @@ -313,11 +311,10 @@ class AdvancedConfigurationWindow(object): value = str(option) except: value = option - value = helpers.ensure_utf8_string(value) self.model.append(parent, [name, value, type_]) def visible_func(self, model, treeiter, data): - search_string = self.entry.get_text().decode('utf-8').lower() + search_string = self.entry.get_text().lower() for it in tree_model_pre_order(model, treeiter): if model[it][C_TYPE] != '': opt_path = self.get_option_path(model, it) diff --git a/src/atom_window.py b/src/atom_window.py index f0cb83f76..247a20758 100644 --- a/src/atom_window.py +++ b/src/atom_window.py @@ -84,20 +84,20 @@ class AtomWindow: # fill the fields if newentry.feed_link is not None: self.feed_title_label.set_markup( - u'%s' % \ + '%s' % \ GObject.markup_escape_text(newentry.feed_title)) else: self.feed_title_label.set_markup( GObject.markup_escape_text(newentry.feed_title)) self.feed_tagline_label.set_markup( - u'%s' % \ + '%s' % \ GObject.markup_escape_text(newentry.feed_tagline)) if newentry.title: if newentry.uri is not None: self.entry_title_label.set_markup( - u'%s' % \ + '%s' % \ GObject.markup_escape_text(newentry.title)) else: self.entry_title_label.set_markup( diff --git a/src/chat_control.py b/src/chat_control.py index 85286956c..379c71e0b 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -620,7 +620,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): message_buffer = self.msg_textview.get_buffer() start_iter = message_buffer.get_start_iter() end_iter = message_buffer.get_end_iter() - message = message_buffer.get_text(start_iter, end_iter, False).decode('utf-8') + message = message_buffer.get_text(start_iter, end_iter, False) xhtml = self.msg_textview.get_xhtml() # send the message @@ -917,7 +917,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): scroll = False if pos == size else True # are we scrolling? # we don't want size of the buffer to grow indefinately max_size = gajim.config.get('key_up_lines') - for i in xrange(size - max_size + 1): + for i in range(size - max_size + 1): if pos == 0: break history.pop(0) @@ -1786,7 +1786,7 @@ class ChatControl(ChatControlBase): pep = self.contact.pep img = self._pep_images[pep_type] if pep_type in pep: - img.set_from_pixbuf(pep[pep_type].asPixbufIcon()) + img.set_from_pixbuf(gtkgui_helpers.get_pep_as_pixbuf(pep[pep_type])) img.set_tooltip_markup(pep[pep_type].asMarkupText()) img.show() else: @@ -2506,7 +2506,7 @@ class ChatControl(ChatControlBase): if num_unread == 1 and not gajim.config.get('show_unread_tab_icon'): unread = '*' elif num_unread > 1: - unread = '[' + unicode(num_unread) + ']' + unread = '[' + str(num_unread) + ']' # Draw tab label using chatstate theme = gajim.config.get('roster_theme') @@ -2843,7 +2843,7 @@ class ChatControl(ChatControlBase): type_ = model[iter_][2] if type_ != 'contact': # source is not a contact return - dropped_jid = data.decode('utf-8') + dropped_jid = data dropped_transport = gajim.get_transport_name_from_jid(dropped_jid) c_transport = gajim.get_transport_name_from_jid(c.jid) @@ -3021,7 +3021,7 @@ class ChatControl(ChatControlBase): # It's why I set it transparent. image = self.xml.get_object('avatar_image') pixbuf = image.get_pixbuf() - pixbuf.fill(0xffffff00L) # RGBA + pixbuf.fill(0xffffff00) # RGBA image.queue_draw() screen_w = Gdk.Screen.width() diff --git a/src/command_system/dispatcher.py b/src/command_system/dispatcher.py index cc9f0ea7a..4b88e5fb3 100644 --- a/src/command_system/dispatcher.py +++ b/src/command_system/dispatcher.py @@ -31,8 +31,7 @@ to automatic discovery and dispatching, also features manual control over the process. """ -from types import NoneType -from tools import remove +from .tools import remove COMMANDS = {} CONTAINERS = {} @@ -71,7 +70,7 @@ def is_command(attribute): return isinstance(attribute, Command) def is_root(namespace): - metaclass = namespace.get("__metaclass__", NoneType) + metaclass = namespace.get("__metaclass__", None) return issubclass(metaclass, Dispatchable) def get_command(host, name): @@ -83,7 +82,7 @@ def get_command(host, name): def list_commands(host): for container in CONTAINERS[host]: commands = COMMANDS[container] - for name, command in commands.iteritems(): + for name, command in commands.items(): yield name, command class Dispatchable(type): diff --git a/src/command_system/framework.py b/src/command_system/framework.py index 9c2dd4cb0..29ebe5c83 100644 --- a/src/command_system/framework.py +++ b/src/command_system/framework.py @@ -23,10 +23,10 @@ import re from types import FunctionType from inspect import getargspec, getdoc -from dispatcher import Host, Container -from dispatcher import get_command, list_commands -from mapping import parse_arguments, adapt_arguments -from errors import DefinitionError, CommandError, NoCommandError +from .dispatcher import Host, Container +from .dispatcher import get_command, list_commands +from .mapping import parse_arguments, adapt_arguments +from .errors import DefinitionError, CommandError, NoCommandError class CommandHost(object): """ @@ -153,7 +153,7 @@ class Command(object): # Automatically set all the properties passed to a constructor # by the command decorator. - for key, value in properties.iteritems(): + for key, value in properties.items(): setattr(self, key, value) def __call__(self, *args, **kwargs): @@ -165,7 +165,7 @@ class Command(object): # command or name attributes set. They will be set to a # corresponding values right here in case if they was not set by # the one who raised an exception. - except CommandError, error: + except CommandError as error: if not error.command and not error.name: raise CommandError(error.message, self) raise diff --git a/src/command_system/implementation/custom.py b/src/command_system/implementation/custom.py index cc33ae39c..95198fc52 100644 --- a/src/command_system/implementation/custom.py +++ b/src/command_system/implementation/custom.py @@ -35,7 +35,7 @@ detected. """ from ..framework import CommandContainer, command, doc -from hosts import * +from .hosts import * class CustomCommonCommands(CommandContainer): """ diff --git a/src/command_system/implementation/execute.py b/src/command_system/implementation/execute.py index 5089d5128..26fda9e81 100644 --- a/src/command_system/implementation/execute.py +++ b/src/command_system/implementation/execute.py @@ -35,10 +35,10 @@ commands as a frontend. from subprocess import Popen, PIPE from os.path import expanduser -from glib import timeout_add +from gi.repository import GObject from ..framework import CommandContainer, command, doc -from hosts import * +from .hosts import * class Execute(CommandContainer): AUTOMATIC = True @@ -64,11 +64,11 @@ class Execute(CommandContainer): @classmethod def monitor(cls, processor, popen): poller = cls.poller(processor, popen) - timeout_add(cls.POLL_INTERVAL, poller.next) + GObject.timeout_add(cls.POLL_INTERVAL, poller.next) @classmethod def poller(cls, processor, popen): - for x in xrange(cls.POLL_COUNT): + for x in list(range(cls.POLL_COUNT)): yield cls.brush(processor, popen) cls.overdue(processor, popen) yield False diff --git a/src/command_system/implementation/middleware.py b/src/command_system/implementation/middleware.py index 494444a32..40e4bdf4e 100644 --- a/src/command_system/implementation/middleware.py +++ b/src/command_system/implementation/middleware.py @@ -31,7 +31,6 @@ support interaction between the two and a few utility methods so you don't need to dig up the code itself to write basic commands. """ -from types import StringTypes from traceback import print_exc from gi.repository import Pango @@ -62,13 +61,13 @@ class ChatCommandProcessor(CommandProcessor): try: parents = super(ChatCommandProcessor, self) parents.execute_command(name, arguments) - except NoCommandError, error: + except NoCommandError as error: details = dict(name=error.name, message=error.message) message = "%(name)s: %(message)s\n" % details message += "Try using the //%(name)s or /say /%(name)s " % details message += "construct if you intended to send it as a text." self.echo_error(message) - except CommandError, error: + except CommandError as error: self.echo_error("%s: %s" % (error.name, error.message)) except Exception: self.echo_error(_("Error during command execution!")) @@ -98,7 +97,7 @@ class ChatCommandProcessor(CommandProcessor): def command_postprocessor(self, command, name, arguments, args, kwargs, value): # If command returns a string - print it to a user. A convenient # and sufficient in most simple cases shortcut to a using echo. - if value and isinstance(value, StringTypes): + if value and isinstance(value, str): self.echo(value) class CommandTools: diff --git a/src/command_system/implementation/standard.py b/src/command_system/implementation/standard.py index 7bdf96096..7bcd400a4 100644 --- a/src/command_system/implementation/standard.py +++ b/src/command_system/implementation/standard.py @@ -30,8 +30,8 @@ from ..errors import CommandError from ..framework import CommandContainer, command, doc from ..mapping import generate_usage -from hosts import * -import execute +from .hosts import * +from . import execute # This holds constants fron the logger, which we'll be using in some of our # commands. diff --git a/src/command_system/mapping.py b/src/command_system/mapping.py index 3ba68ff4c..82283df71 100644 --- a/src/command_system/mapping.py +++ b/src/command_system/mapping.py @@ -23,10 +23,9 @@ according to the command properties. """ import re -from types import BooleanType, UnicodeType from operator import itemgetter -from errors import DefinitionError, CommandError +from .errors import DefinitionError, CommandError # Quite complex piece of regular expression logic to parse options and # arguments. Might need some tweaking along the way. @@ -62,7 +61,7 @@ def parse_arguments(arguments): """ args, opts = [], [] - def intersects_opts((given_start, given_end)): + def intersects_opts(given_start, given_end): """ Check if given span intersects with any of options. """ @@ -71,7 +70,7 @@ def parse_arguments(arguments): return True return False - def intersects_args((given_start, given_end)): + def intersects_args(given_start, given_end): """ Check if given span intersects with any of arguments. """ @@ -97,14 +96,14 @@ def parse_arguments(arguments): # conflicted sectors. Remove any arguments that intersect with # options. for arg, position in args[:]: - if intersects_opts(position): + if intersects_opts(*position): args.remove((arg, position)) # Primitive but sufficiently effective way of disposing of # conflicted sectors. Remove any options that intersect with # arguments. for key, value, position in opts[:]: - if intersects_args(position): + if intersects_args(*position): opts.remove((key, value, position)) return args, opts @@ -207,7 +206,7 @@ def adapt_arguments(command, arguments, args, opts): # corresponding optin has been given. if command.expand: expanded = [] - for spec_key, spec_value in norm_kwargs.iteritems(): + for spec_key, spec_value in norm_kwargs.items(): letter = spec_key[0] if len(spec_key) > 1 else None if letter and letter not in expanded: for index, (key, value, position) in enumerate(opts): @@ -219,7 +218,7 @@ def adapt_arguments(command, arguments, args, opts): # Detect switches and set their values accordingly. If any of them # carries a value - append it to args. for index, (key, value, position) in enumerate(opts): - if isinstance(norm_kwargs.get(key), BooleanType): + if isinstance(norm_kwargs.get(key), bool): opts[index] = (key, True, position) if value: args.append((value, position)) @@ -231,8 +230,8 @@ def adapt_arguments(command, arguments, args, opts): # Stripping down position information supplied with arguments and # options as it won't be needed again. - args = map(lambda (arg, position): arg, args) - opts = map(lambda (key, value, position): (key, value), opts) + args = map(lambda t: t[0], t[1]) + opts = map(lambda t: (t[0], t[1]), opts) # If command has extra option enabled - collect all extra arguments # and pass them to a last positional argument command defines as a @@ -265,16 +264,10 @@ def adapt_arguments(command, arguments, args, opts): # Normally this does not happen unless overlapping is enabled. for key, value in opts: initial = norm_kwargs.get(key) - if isinstance(initial, BooleanType): - if not isinstance(value, BooleanType): + if isinstance(initial, bool): + if not isinstance(value, bool): raise CommandError("%s: Switch can not take an argument" % key, command) - # We need to encode every keyword argument to a simple string, not - # the unicode one, because ** expansion does not support it. - for index, (key, value) in enumerate(opts): - if isinstance(key, UnicodeType): - opts[index] = (key.encode(KEY_ENCODING), value) - # Inject the source arguments as a string as a first argument, if # command has enabled the corresponding option. if command.source: @@ -305,7 +298,7 @@ def generate_usage(command, complete=True): letter = key[0] key = key.replace('_', '-') - if isinstance(value, BooleanType): + if isinstance(value, bool): value = str() else: value = '=%s' % value diff --git a/src/common/atom.py b/src/common/atom.py index a5ec628ef..d9ec2f067 100644 --- a/src/common/atom.py +++ b/src/common/atom.py @@ -100,13 +100,13 @@ class OldEntry(nbxmpp.Node, object): if main_feed is not None and source_feed is not None: - return u'%s: %s' % (main_feed, source_feed) + return '%s: %s' % (main_feed, source_feed) elif main_feed is not None: return main_feed elif source_feed is not None: return source_feed else: - return u'' + return '' feed_title = property(get_feed_title, None, None, ''' Title of feed. It is built from entry''s original feed title and title of feed @@ -173,4 +173,4 @@ class OldEntry(nbxmpp.Node, object): updated = property(get_updated, None, None, ''' Last significant modification time. ''') - feed_tagline = u'' + feed_tagline = '' diff --git a/src/common/caps_cache.py b/src/common/caps_cache.py index 6c8286188..6bf9b62ed 100644 --- a/src/common/caps_cache.py +++ b/src/common/caps_cache.py @@ -130,7 +130,8 @@ def compute_caps_hash(identities, features, dataforms=[], hash_method='sha-1'): return 1 S = '' - identities.sort(cmp=sort_identities_func) + from functools import cmp_to_key + identities.sort(key=cmp_to_key(sort_identities_func)) for i in identities: c = i['category'] type_ = i.get('type', '') @@ -140,7 +141,7 @@ def compute_caps_hash(identities, features, dataforms=[], hash_method='sha-1'): features.sort() for f in features: S += '%s<' % f - dataforms.sort(cmp=sort_dataforms_func) + dataforms.sort(key=cmp_to_key(sort_dataforms_func)) for dataform in dataforms: # fields indexed by var fields = {} @@ -157,12 +158,12 @@ def compute_caps_hash(identities, features, dataforms=[], hash_method='sha-1'): S += '%s<' % value if hash_method == 'sha-1': - hash_ = hashlib.sha1(S) + hash_ = hashlib.sha1(S.encode('utf-8')) elif hash_method == 'md5': - hash_ = hashlib.md5(S) + hash_ = hashlib.md5(S.encode('utf-8')) else: return '' - return base64.b64encode(hash_.digest()) + return base64.b64encode(hash_.digest()).decode('utf-8') ################################################################################ diff --git a/src/common/check_paths.py b/src/common/check_paths.py index 3250f46a4..f9ad30983 100644 --- a/src/common/check_paths.py +++ b/src/common/check_paths.py @@ -29,16 +29,16 @@ import sys import stat from common import gajim -import logger +from common import logger from common import jingle_xtls # DO NOT MOVE ABOVE OF import gajim import sqlite3 as sqlite def create_log_db(): - print _('creating logs database') + print(_('creating logs database')) con = sqlite.connect(logger.LOG_DB_PATH) - os.chmod(logger.LOG_DB_PATH, 0600) # rw only for us + os.chmod(logger.LOG_DB_PATH, 0o600) # rw only for us cur = con.cursor() # create the tables # kind can be @@ -84,9 +84,9 @@ def create_log_db(): con.close() def create_cache_db(): - print _('creating cache database') + print(_('creating cache database')) con = sqlite.connect(logger.CACHE_DB_PATH) - os.chmod(logger.CACHE_DB_PATH, 0600) # rw only for us + os.chmod(logger.CACHE_DB_PATH, 0o600) # rw only for us cur = con.cursor() cur.executescript( ''' @@ -128,16 +128,16 @@ def create_cache_db(): con.close() def split_db(): - print 'spliting database' + print('spliting database') if os.name == 'nt': try: import configpaths OLD_LOG_DB_FOLDER = os.path.join(configpaths.fse( - os.environ[u'appdata']), u'Gajim') + os.environ['appdata']), 'Gajim') except KeyError: - OLD_LOG_DB_FOLDER = u'.' + OLD_LOG_DB_FOLDER = '.' else: - OLD_LOG_DB_FOLDER = os.path.expanduser(u'~/.gajim') + OLD_LOG_DB_FOLDER = os.path.expanduser('~/.gajim') tmp = logger.CACHE_DB_PATH logger.CACHE_DB_PATH = os.path.join(OLD_LOG_DB_FOLDER, 'cache.db') @@ -148,7 +148,7 @@ def split_db(): os.chdir(back) cur = con.cursor() cur.execute('''SELECT name FROM sqlite_master WHERE type = 'table';''') - tables = cur.fetchall() # we get [(u'jids',), (u'unread_messages',), ... + tables = cur.fetchall() # we get [('jids',), ('unread_messages',), ... tables = [t[0] for t in tables] cur.execute("ATTACH DATABASE '%s' AS cache" % logger.CACHE_DB_PATH) for table in ('caps_cache', 'rooms_last_message_time', 'roster_entry', @@ -161,9 +161,9 @@ def split_db(): con.commit() cur.executescript('DROP TABLE %s;' % table) con.commit() - except sqlite.OperationalError, e: - print >> sys.stderr, 'error moving table %s to cache.db: %s' % \ - (table, str(e)) + except sqlite.OperationalError as e: + print('error moving table %s to cache.db: %s' % (table, str(e)), + file=sys.stderr) con.close() logger.CACHE_DB_PATH = tmp @@ -177,7 +177,7 @@ def check_and_possibly_move_config(): vars['MY_ICONSETS_PATH'] = gajim.MY_ICONSETS_PATH vars['MY_MOOD_ICONSETS_PATH'] = gajim.MY_MOOD_ICONSETS_PATH vars['MY_ACTIVITY_ICONSETS_PATH'] = gajim.MY_ACTIVITY_ICONSETS_PATH - import configpaths + from common import configpaths MY_DATA = configpaths.gajimpaths['MY_DATA'] MY_CONFIG = configpaths.gajimpaths['MY_CONFIG'] MY_CACHE = configpaths.gajimpaths['MY_CACHE'] @@ -189,22 +189,22 @@ def check_and_possibly_move_config(): if os.name == 'nt': try: OLD_LOG_DB_FOLDER = os.path.join(configpaths.fse( - os.environ[u'appdata']), u'Gajim') + os.environ['appdata']), 'Gajim') except KeyError: - OLD_LOG_DB_FOLDER = u'.' + OLD_LOG_DB_FOLDER = '.' else: - OLD_LOG_DB_FOLDER = os.path.expanduser(u'~/.gajim') + OLD_LOG_DB_FOLDER = os.path.expanduser('~/.gajim') if not os.path.exists(OLD_LOG_DB_FOLDER): return - OLD_LOG_DB_PATH = os.path.join(OLD_LOG_DB_FOLDER, u'logs.db') - OLD_CACHE_DB_PATH = os.path.join(OLD_LOG_DB_FOLDER, u'cache.db') - vars['OLD_VCARD_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, u'vcards') - vars['OLD_AVATAR_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, u'avatars') - vars['OLD_MY_EMOTS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, u'emoticons') - vars['OLD_MY_ICONSETS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, u'iconsets') - vars['OLD_MY_MOOD_ICONSETS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, u'moods') + OLD_LOG_DB_PATH = os.path.join(OLD_LOG_DB_FOLDER, 'logs.db') + OLD_CACHE_DB_PATH = os.path.join(OLD_LOG_DB_FOLDER, 'cache.db') + vars['OLD_VCARD_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, 'vcards') + vars['OLD_AVATAR_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, 'avatars') + vars['OLD_MY_EMOTS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, 'emoticons') + vars['OLD_MY_ICONSETS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, 'iconsets') + vars['OLD_MY_MOOD_ICONSETS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, 'moods') vars['OLD_MY_ACTIVITY_ICONSETS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, - u'activities') + 'activities') OLD_CONFIG_FILES = [] OLD_DATA_FILES = [] for f in os.listdir(OLD_LOG_DB_FOLDER): @@ -249,7 +249,7 @@ def check_and_possibly_move_config(): continue if not os.path.exists(src): continue - print 'moving %s to %s' % (src, dst) + print(_('moving %s to %s') % (src, dst)) shutil.move(src, dst) gajim.logger.init_vars() gajim.logger.attach_cache_database() @@ -263,7 +263,7 @@ def check_and_possibly_create_paths(): VCARD_PATH = gajim.VCARD_PATH AVATAR_PATH = gajim.AVATAR_PATH - import configpaths + from common import configpaths MY_DATA = configpaths.gajimpaths['MY_DATA'] MY_CONFIG = configpaths.gajimpaths['MY_CONFIG'] MY_CACHE = configpaths.gajimpaths['MY_CACHE'] @@ -275,57 +275,57 @@ def check_and_possibly_create_paths(): if not os.path.exists(MY_DATA): create_path(MY_DATA) elif os.path.isfile(MY_DATA): - print _('%s is a file but it should be a directory') % MY_DATA - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % MY_DATA) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(MY_CONFIG): create_path(MY_CONFIG) elif os.path.isfile(MY_CONFIG): - print _('%s is a file but it should be a directory') % MY_CONFIG - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % MY_CONFIG) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(MY_CACHE): create_path(MY_CACHE) elif os.path.isfile(MY_CACHE): - print _('%s is a file but it should be a directory') % MY_CACHE - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % MY_CACHE) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(VCARD_PATH): create_path(VCARD_PATH) elif os.path.isfile(VCARD_PATH): - print _('%s is a file but it should be a directory') % VCARD_PATH - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % VCARD_PATH) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(AVATAR_PATH): create_path(AVATAR_PATH) elif os.path.isfile(AVATAR_PATH): - print _('%s is a file but it should be a directory') % AVATAR_PATH - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % AVATAR_PATH) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(LOG_DB_FOLDER): create_path(LOG_DB_FOLDER) elif os.path.isfile(LOG_DB_FOLDER): - print _('%s is a file but it should be a directory') % LOG_DB_FOLDER - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % LOG_DB_FOLDER) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(PLUGINS_CONFIG_PATH): create_path(PLUGINS_CONFIG_PATH) elif os.path.isfile(PLUGINS_CONFIG_PATH): - print _('%s is a file but it should be a directory') % PLUGINS_CONFIG_PATH - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % PLUGINS_CONFIG_PATH) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(CACHE_DB_FOLDER): create_path(CACHE_DB_FOLDER) elif os.path.isfile(CACHE_DB_FOLDER): - print _('%s is a file but it should be a directory') % CACHE_DB_FOLDER - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % CACHE_DB_FOLDER) + print(_('Gajim will now exit')) sys.exit() check_and_possibly_move_config() @@ -334,18 +334,18 @@ def check_and_possibly_create_paths(): create_log_db() gajim.logger.init_vars() elif os.path.isdir(LOG_DB_PATH): - print _('%s is a directory but should be a file') % LOG_DB_PATH - print _('Gajim will now exit') + print(_('%s is a directory but should be a file') % LOG_DB_PATH) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(CACHE_DB_PATH): create_cache_db() gajim.logger.attach_cache_database() elif os.path.isdir(CACHE_DB_PATH): - print _('%s is a directory but should be a file') % CACHE_DB_PATH - print _('Gajim will now exit') + print(_('%s is a directory but should be a file') % CACHE_DB_PATH) + print(_('Gajim will now exit')) sys.exit() - + if not os.path.exists(XTLS_CERTS): create_path(XTLS_CERTS) if not os.path.exists(LOCAL_XTLS_CERTS): @@ -363,5 +363,5 @@ def create_path(directory): create_path(head) if os.path.exists(directory): return - print _('creating %s directory') % directory - os.mkdir(directory, 0700) + print(('creating %s directory') % directory) + os.mkdir(directory, 0o700) diff --git a/src/common/commands.py b/src/common/commands.py index 4c2c90ad5..aaf6c8536 100644 --- a/src/common/commands.py +++ b/src/common/commands.py @@ -23,9 +23,9 @@ ## import nbxmpp -import helpers -import dataforms -import gajim +from common import helpers +from common import dataforms +from common import gajim import logging log = logging.getLogger('gajim.c.commands') @@ -104,12 +104,12 @@ class ChangeStatusCommand(AdHocCommand): var = 'presence-type', label = 'Type of presence:', options = [ - (u'chat', _('Free for chat')), - (u'online', _('Online')), - (u'away', _('Away')), - (u'xa', _('Extended away')), - (u'dnd', _('Do not disturb')), - (u'offline', _('Offline - disconnect'))], + ('chat', _('Free for chat')), + ('online', _('Online')), + ('away', _('Away')), + ('xa', _('Extended away')), + ('dnd', _('Do not disturb')), + ('offline', _('Offline - disconnect'))], value = 'online', required = True), dataforms.Field('text-multi', @@ -146,7 +146,7 @@ class ChangeStatusCommand(AdHocCommand): try: presencedesc = form['presence-desc'].value except Exception: # same exceptions as in last comment - presencedesc = u'' + presencedesc = '' response, cmd = self.buildResponse(request, status = 'completed') cmd.addChild('note', {}, _('The status has been changed.')) @@ -197,7 +197,7 @@ class LeaveGroupchatsCommand(AdHocCommand): options = [] account = self.connection.name for gc in find_current_groupchats(account): - options.append((u'%s' %(gc[0]), _('%(nickname)s on %(room_jid)s') % \ + options.append(('%s' %(gc[0]), _('%(nickname)s on %(room_jid)s') % \ {'nickname': gc[1], 'room_jid': gc[0]})) if not len(options): response, cmd = self.buildResponse(request, status = 'completed') @@ -363,11 +363,11 @@ class ConnectionCommands: # buildReply don't copy the node attribute. Re-add it q.setAttr('node', nbxmpp.NS_COMMANDS) - for node, cmd in self.__commands.iteritems(): + for node, cmd in self.__commands.items(): if cmd.isVisibleFor(self.isSameJID(jid)): q.addChild('item', { # TODO: find the jid - 'jid': self.getOurBareJID() + u'/' + self.server_resource, + 'jid': self.getOurBareJID() + '/' + self.server_resource, 'node': node, 'name': cmd.commandname}) diff --git a/src/common/config.py b/src/common/config.py index c31003f45..afda4bb7f 100644 --- a/src/common/config.py +++ b/src/common/config.py @@ -35,7 +35,7 @@ import sys import re import copy -import defs +from common import defs from gi.repository import GObject ( @@ -568,7 +568,7 @@ class Config: Tree-like interface """ if node is None: - for child, option in self.__options[1].iteritems(): + for child, option in self.__options[1].items(): yield (child, ), option for grandparent in self.__options_per_key: yield (grandparent, ), None @@ -579,7 +579,7 @@ class Config: elif len(node) == 2: grandparent, parent = node children = self.__options_per_key[grandparent][1][parent] - for child, option in children.iteritems(): + for child, option in children.items(): yield (grandparent, parent, child), option else: raise ValueError('Invalid node') @@ -625,11 +625,9 @@ class Config: def set(self, optname, value): if optname not in self.__options[1]: -# raise RuntimeError, 'option %s does not exist' % optname return value = self.is_valid(self.__options[0][optname][OPT_TYPE], value) if value is None: -# raise RuntimeError, 'value of %s cannot be None' % optname return self.__options[1][optname] = value @@ -637,7 +635,7 @@ class Config: def get(self, optname=None): if not optname: - return self.__options[1].keys() + return list(self.__options[1].keys()) if optname not in self.__options[1]: return None return self.__options[1][optname] @@ -666,7 +664,6 @@ class Config: def add_per(self, typename, name): # per_group_of_option if typename not in self.__options_per_key: -# raise RuntimeError, 'option %s does not exist' % typename return opt = self.__options_per_key[typename] @@ -680,7 +677,6 @@ class Config: def del_per(self, typename, name, subname = None): # per_group_of_option if typename not in self.__options_per_key: -# raise RuntimeError, 'option %s does not exist' % typename return opt = self.__options_per_key[typename] @@ -693,22 +689,18 @@ class Config: def set_per(self, optname, key, subname, value): # per_group_of_option if optname not in self.__options_per_key: -# raise RuntimeError, 'option %s does not exist' % optname return if not key: return dict_ = self.__options_per_key[optname][1] if key not in dict_: -# raise RuntimeError, '%s is not a key of %s' % (key, dict_) self.add_per(optname, key) obj = dict_[key] if subname not in obj: -# raise RuntimeError, '%s is not a key of %s' % (subname, obj) return typ = self.__options_per_key[optname][0][subname][OPT_TYPE] value = self.is_valid(typ, value) if value is None: -# raise RuntimeError, '%s of %s cannot be None' % optname return obj[subname] = value self._timeout_save() @@ -718,7 +710,7 @@ class Config: return None dict_ = self.__options_per_key[optname][1] if not key: - return dict_.keys() + return list(dict_.keys()) if key not in dict_: if subname in self.__options_per_key[optname][0]: return self.__options_per_key[optname][0][subname][1] diff --git a/src/common/configpaths.py b/src/common/configpaths.py index 93c2b996b..75df82e42 100644 --- a/src/common/configpaths.py +++ b/src/common/configpaths.py @@ -25,7 +25,7 @@ import os import sys import tempfile -import defs +from common import defs HAVE_XDG = True try: __import__(xdg) @@ -61,7 +61,7 @@ def fse(s): """ Convert from filesystem encoding if not already Unicode """ - return unicode(s, sys.getfilesystemencoding()) + return s def windowsify(s): if os.name == 'nt': @@ -82,10 +82,10 @@ class ConfigPaths: # variable 'appdata' is in? Assuming it to be in filesystem # encoding. self.config_root = self.cache_root = self.data_root = \ - os.path.join(fse(os.environ[u'appdata']), u'Gajim') + os.path.join(fse(os.environ['appdata']), 'Gajim') except KeyError: # win9x, in cwd - self.config_root = self.cache_root = self.data_root = u'.' + self.config_root = self.cache_root = self.data_root = '.' else: # Unices # Pass in an Unicode string, and hopefully get one back. if HAVE_XDG: @@ -93,23 +93,23 @@ class ConfigPaths: if not self.config_root: # Folder doesn't exist yet. self.config_root = os.path.join(xdg.BaseDirectory.\ - xdg_config_dirs[0], u'gajim') + xdg_config_dirs[0], 'gajim') self.cache_root = os.path.join(xdg.BaseDirectory.xdg_cache_home, - u'gajim') + 'gajim') self.data_root = xdg.BaseDirectory.save_data_path('gajim') if not self.data_root: self.data_root = os.path.join(xdg.BaseDirectory.\ - xdg_data_dirs[0], u'gajim') + xdg_data_dirs[0], 'gajim') else: expand = os.path.expanduser - base = os.getenv('XDG_CONFIG_HOME') or expand(u'~/.config') - self.config_root = os.path.join(base, u'gajim') - base = os.getenv('XDG_CACHE_HOME') or expand(u'~/.cache') - self.cache_root = os.path.join(base, u'gajim') - base = os.getenv('XDG_DATA_HOME') or expand(u'~/.local/share') - self.data_root = os.path.join(base, u'gajim') + base = os.getenv('XDG_CONFIG_HOME') or expand('~/.config') + self.config_root = os.path.join(base, 'gajim') + base = os.getenv('XDG_CACHE_HOME') or expand('~/.cache') + self.cache_root = os.path.join(base, 'gajim') + base = os.getenv('XDG_DATA_HOME') or expand('~/.local/share') + self.data_root = os.path.join(base, 'gajim') def add(self, name, type_, path): self.paths[name] = (type_, path) @@ -130,7 +130,7 @@ class ConfigPaths: except KeyError: return default - def iteritems(self): + def items(self): for key in self.paths.iterkeys(): yield (key, self[key]) @@ -138,32 +138,32 @@ class ConfigPaths: if root is not None: self.config_root = self.cache_root = self.data_root = root - d = {'MY_DATA': '', 'LOG_DB': u'logs.db', 'MY_CACERTS': u'cacerts.pem', - 'MY_EMOTS': u'emoticons', 'MY_ICONSETS': u'iconsets', - 'MY_MOOD_ICONSETS': u'moods', 'MY_ACTIVITY_ICONSETS': u'activities', - 'PLUGINS_USER': u'plugins', 'MY_PEER_CERTS': u'certs'} + d = {'MY_DATA': '', 'LOG_DB': 'logs.db', 'MY_CACERTS': 'cacerts.pem', + 'MY_EMOTS': 'emoticons', 'MY_ICONSETS': 'iconsets', + 'MY_MOOD_ICONSETS': 'moods', 'MY_ACTIVITY_ICONSETS': 'activities', + 'PLUGINS_USER': 'plugins', 'MY_PEER_CERTS': 'certs'} for name in d: self.add(name, TYPE_DATA, windowsify(d[name])) - d = {'MY_CACHE': '', 'CACHE_DB': u'cache.db', 'VCARD': u'vcards', - 'AVATAR': u'avatars'} + d = {'MY_CACHE': '', 'CACHE_DB': 'cache.db', 'VCARD': 'vcards', + 'AVATAR': 'avatars'} for name in d: self.add(name, TYPE_CACHE, windowsify(d[name])) self.add('MY_CONFIG', TYPE_CONFIG, '') self.add('MY_CERT', TYPE_CONFIG, '') - basedir = fse(os.environ.get(u'GAJIM_BASEDIR', defs.basedir)) - self.add('DATA', None, os.path.join(basedir, windowsify(u'data'))) - self.add('ICONS', None, os.path.join(basedir, windowsify(u'icons'))) + basedir = fse(os.environ.get('GAJIM_BASEDIR', defs.basedir)) + self.add('DATA', None, os.path.join(basedir, windowsify('data'))) + self.add('ICONS', None, os.path.join(basedir, windowsify('icons'))) self.add('HOME', None, fse(os.path.expanduser('~'))) self.add('PLUGINS_BASE', None, os.path.join(basedir, - windowsify(u'plugins'))) + windowsify('plugins'))) try: self.add('TMP', None, fse(tempfile.gettempdir())) - except IOError, e: - print >> sys.stderr, 'Error opening tmp folder: %s\nUsing %s' % ( - str(e), os.path.expanduser('~')) + except IOError as e: + print('Error opening tmp folder: %s\nUsing %s' % (str(e), + os.path.expanduser('~')), file=sys.stderr) self.add('TMP', None, fse(os.path.expanduser('~'))) try: @@ -173,17 +173,17 @@ class ConfigPaths: pass def init_profile(self, profile=''): - conffile = windowsify(u'config') - pidfile = windowsify(u'gajim') - secretsfile = windowsify(u'secrets') - pluginsconfdir = windowsify(u'pluginsconfig') + conffile = windowsify('config') + pidfile = windowsify('gajim') + secretsfile = windowsify('secrets') + pluginsconfdir = windowsify('pluginsconfig') if len(profile) > 0: - conffile += u'.' + profile - pidfile += u'.' + profile - secretsfile += u'.' + profile - pluginsconfdir += u'.' + profile - pidfile += u'.pid' + conffile += '.' + profile + pidfile += '.' + profile + secretsfile += '.' + profile + pluginsconfdir += '.' + profile + pidfile += '.pid' self.add('CONFIG_FILE', TYPE_CONFIG, conffile) self.add('PID_FILE', TYPE_CACHE, pidfile) self.add('SECRETS_FILE', TYPE_DATA, secretsfile) diff --git a/src/common/connection.py b/src/common/connection.py index be4641aac..861b51d96 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -59,7 +59,7 @@ from common import gpg from common import passwords from common import exceptions from common import check_X509 -from connection_handlers import * +from common.connection_handlers import * from nbxmpp import Smacks from string import Template @@ -455,7 +455,7 @@ class CommonConnection: log_msg = '%s' % ( nbxmpp.NS_XHTML, xhtml) gajim.logger.write(kind, jid, log_msg) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: self.dispatch('DB_ERROR', (_('Disk Write Error'), str(e))) except exceptions.DatabaseMalformed: @@ -616,7 +616,7 @@ class CommonConnection: if realm == '': if event == nbxmpp.transports_nb.DATA_RECEIVED: gajim.nec.push_incoming_event(StanzaReceivedEvent(None, - conn=self, stanza_str=unicode(data, errors='ignore'))) + conn=self, stanza_str=data)) elif event == nbxmpp.transports_nb.DATA_SENT: gajim.nec.push_incoming_event(StanzaSentEvent(None, conn=self, stanza_str=data)) @@ -1446,7 +1446,7 @@ class Connection(CommonConnection, ConnectionHandlers): self.connection.send(' ') def _on_xmpp_ping_answer(self, iq_obj): - id_ = unicode(iq_obj.getAttr('id')) + id_ = iq_obj.getAttr('id') assert id_ == self.awaiting_xmpp_ping_id self.awaiting_xmpp_ping_id = None @@ -1607,7 +1607,7 @@ class Connection(CommonConnection, ConnectionHandlers): self.activate_privacy_rule('invisible') self.connected = gajim.SHOW_LIST.index('invisible') self.status = msg - priority = unicode(gajim.get_priority(self.name, 'invisible')) + priority = gajim.get_priority(self.name, 'invisible') p = nbxmpp.Presence(priority=priority) p = self.add_sha(p, True) if msg: @@ -1781,7 +1781,7 @@ class Connection(CommonConnection, ConnectionHandlers): p.setStatus(msg) else: signed = self.get_signed_presence(msg) - priority = unicode(gajim.get_priority(self.name, sshow)) + priority = gajim.get_priority(self.name, sshow) p = nbxmpp.Presence(typ=None, priority=priority, show=sshow, to=jid) p = self.add_sha(p) if msg: @@ -1805,7 +1805,7 @@ class Connection(CommonConnection, ConnectionHandlers): def _update_status(self, show, msg): xmpp_show = helpers.get_xmpp_show(show) - priority = unicode(gajim.get_priority(self.name, xmpp_show)) + priority = gajim.get_priority(self.name, xmpp_show) p = nbxmpp.Presence(typ=None, priority=priority, show=xmpp_show) p = self.add_sha(p) if msg: diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index ffd112f40..df4710caf 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -39,7 +39,7 @@ from time import (altzone, daylight, gmtime, localtime, mktime, strftime, from calendar import timegm import nbxmpp -import common.caps_cache as capscache +from common import caps_cache as capscache from common import helpers from common import gajim @@ -181,8 +181,8 @@ class ConnectionDisco: if not self.connection or self.connected < 2: return frm = helpers.get_full_jid_from_iq(iq_obj) - to = unicode(iq_obj.getAttr('to')) - id_ = unicode(iq_obj.getAttr('id')) + to = iq_obj.getAttr('to') + id_ = iq_obj.getAttr('id') iq = nbxmpp.Iq(to=frm, typ='result', queryNS=nbxmpp.NS_DISCO, frm=to) iq.setAttr('id', id_) query = iq.setTag('query') @@ -235,7 +235,7 @@ class ConnectionDisco: if self.commandInfoQuery(con, iq_obj): raise nbxmpp.NodeProcessed - id_ = unicode(iq_obj.getAttr('id')) + id_ = iq_obj.getAttr('id') if id_[:6] == 'Gajim_': # We get this request from echo.server raise nbxmpp.NodeProcessed @@ -322,7 +322,7 @@ class ConnectionVcard: os.remove(path) # create folder if needed if not os.path.isdir(path): - os.mkdir(path, 0700) + os.mkdir(path, 0o700) puny_nick = helpers.sanitize_filename(nick) path_to_file = os.path.join(gajim.VCARD_PATH, puny_jid, puny_nick) else: @@ -331,7 +331,7 @@ class ConnectionVcard: fil = open(path_to_file, 'w') fil.write(str(card)) fil.close() - except IOError, e: + except IOError as e: gajim.nec.push_incoming_event(InformationEvent(None, conn=self, level='error', pri_txt=_('Disk Write Error'), sec_txt=str(e))) @@ -431,7 +431,8 @@ class ConnectionVcard: if 'PHOTO' in vcard and isinstance(vcard['PHOTO'], dict) and \ 'BINVAL' in vcard['PHOTO']: photo = vcard['PHOTO']['BINVAL'] - photo_decoded = base64.decodestring(photo) + photo_decoded = base64.b64decode(photo.encode('utf-8')).decode( + 'utf-8') gajim.interface.save_avatar_files(our_jid, photo_decoded) avatar_sha = hashlib.sha1(photo_decoded).hexdigest() iq2.getTag('PHOTO').setTagData('SHA', avatar_sha) @@ -593,7 +594,7 @@ class ConnectionVcard: elif self.awaiting_answers[id_][0] == ARCHIVING_COLLECTIONS_ARRIVED: # TODO - print 'ARCHIVING_COLLECTIONS_ARRIVED' + print('ARCHIVING_COLLECTIONS_ARRIVED') elif self.awaiting_answers[id_][0] == ARCHIVING_COLLECTION_ARRIVED: def save_if_not_exists(with_, nick, direction, tim, payload): @@ -603,7 +604,7 @@ class ConnectionVcard: gajim.logger.save_if_not_exists(with_, direction, tim, msg=payload[0].getData(), nick=nick) elif payload[0].getName() == 'message': - print 'Not implemented' + print('Not implemented') chat = iq_obj.getTag('chat') if chat: with_ = chat.getAttr('with') @@ -684,7 +685,7 @@ class ConnectionVcard: 'BINVAL' in vcard['PHOTO']: photo = vcard['PHOTO']['BINVAL'] try: - photo_decoded = base64.decodestring(photo) + photo_decoded = base64.b64decode(photo.encode('utf-8')).decode('utf-8') avatar_sha = hashlib.sha1(photo_decoded).hexdigest() except Exception: avatar_sha = '' @@ -706,7 +707,7 @@ class ConnectionVcard: puny_nick = helpers.sanitize_filename(resource) # create folder if needed if not os.path.isdir(begin_path): - os.mkdir(begin_path, 0700) + os.mkdir(begin_path, 0o700) begin_path = os.path.join(begin_path, puny_nick) frm_jid += '/' + resource if photo_decoded: @@ -947,7 +948,7 @@ class ConnectionHandlersBase: gajim.config.should_log(self.name, obj.jid): try: gajim.logger.write('status', obj.jid, obj.status, obj.show) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: self.dispatch('DB_ERROR', (_('Disk Write Error'), str(e))) except exceptions.DatabaseMalformed: pritext = _('Database Error') @@ -970,7 +971,7 @@ class ConnectionHandlersBase: decmsg = self.gpg.decrypt(encmsg, keyID) decmsg = self.connection.Dispatcher.replace_non_character(decmsg) # \x00 chars are not allowed in C (so in GTK) - obj.msgtxt = helpers.decode_string(decmsg.replace('\x00', '')) + obj.msgtxt = decmsg.replace('\x00', '') obj.encrypted = 'xep27' self.gpg_messages_to_decrypt.remove([encmsg, keyID, obj]) @@ -1017,7 +1018,7 @@ class ConnectionHandlersBase: gc_contact = gajim.contacts.get_gc_contact(self.name, obj.jid, nick) if obj.receipt_request_tag and gajim.config.get_per('accounts', self.name, 'answer_receipts') and ((contact and contact.sub \ - not in (u'to', u'none')) or gc_contact) and obj.mtype != 'error': + not in ('to', 'none')) or gc_contact) and obj.mtype != 'error': receipt = nbxmpp.Message(to=obj.fjid, typ='chat') receipt.setID(obj.id_) receipt.setTag('received', namespace='urn:xmpp:receipts', @@ -1069,7 +1070,7 @@ class ConnectionHandlersBase: try: gajim.logger.write('error', frm, error_msg, tim=tim, subject=subject) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: self.dispatch('DB_ERROR', (_('Disk Write Error'), str(e))) except exceptions.DatabaseMalformed: pritext = _('Database Error') @@ -1095,7 +1096,7 @@ class ConnectionHandlersBase: jid = gajim.get_jid_without_resource(jid) try: - return self.sessions[jid].values() + return list(self.sessions[jid].values()) except KeyError: return [] @@ -1157,7 +1158,7 @@ class ConnectionHandlersBase: received a thread_id yet and returns the session that we last sent a message to """ - sessions = self.sessions[jid].values() + sessions = list(self.sessions[jid].values()) # sessions that we haven't received a thread ID in idless = [s for s in sessions if not s.received_thread_id] @@ -1178,7 +1179,7 @@ class ConnectionHandlersBase: Find an active session that doesn't have a control attached """ try: - sessions = self.sessions[jid].values() + sessions = list(self.sessions[jid].values()) # filter out everything except the default session type chat_sessions = [s for s in sessions if isinstance(s, @@ -1549,9 +1550,8 @@ ConnectionJingle, ConnectionIBBytestream): iq_obj = obj.stanza.buildReply('result') qp = iq_obj.setQuery() qp.setTagData('utc', strftime('%Y%m%dT%H:%M:%S', gmtime())) - qp.setTagData('tz', helpers.decode_string(tzname[daylight])) - qp.setTagData('display', helpers.decode_string(strftime('%c', - localtime()))) + qp.setTagData('tz', tzname[daylight]) + qp.setTagData('display', strftime('%c', localtime())) else: iq_obj = obj.stanza.buildReply('error') err = nbxmpp.ErrorNode(name=nbxmpp.NS_STANZAS + \ diff --git a/src/common/connection_handlers_events.py b/src/common/connection_handlers_events.py index 9bb2e96a4..2f1ae0932 100644 --- a/src/common/connection_handlers_events.py +++ b/src/common/connection_handlers_events.py @@ -39,8 +39,6 @@ from nbxmpp.protocol import NS_CHATSTATES from common.jingle_transport import JingleTransportSocks5 from common.file_props import FilesProp -import gtkgui_helpers - import logging log = logging.getLogger('gajim.c.connection_handlers_events') @@ -220,11 +218,11 @@ class TimeResultReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): try: t = datetime.datetime.strptime(utc_time, '%Y-%m-%dT%H:%M:%SZ') - except ValueError, e: + except ValueError as e: try: t = datetime.datetime.strptime(utc_time, '%Y-%m-%dT%H:%M:%S.%fZ') - except ValueError, e: + except ValueError as e: log.info('Wrong time format: %s' % str(e)) return @@ -366,10 +364,10 @@ class RosterReceivedEvent(nec.NetworkIncomingEvent): try: j = helpers.parse_jid(jid) except Exception: - print >> sys.stderr, _('JID %s is not RFC compliant. It ' - 'will not be added to your roster. Use roster ' - 'management tools such as ' - 'http://jru.jabberstudio.org/ to remove it') % jid + print(_('JID %s is not RFC compliant. It will not be added ' + 'to your roster. Use roster management tools such as ' + 'http://jru.jabberstudio.org/ to remove it') % jid, + file=sys.stderr) else: infos = raw_roster[jid] if jid != our_jid and (not infos['subscription'] or \ @@ -905,7 +903,7 @@ class GcPresenceReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): try: gajim.logger.write('gcstatus', self.fjid, st, self.show) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: self.conn.dispatch('DB_ERROR', (_('Disk Write Error'), str(e))) except exceptions.DatabaseMalformed: @@ -1169,7 +1167,6 @@ class ZeroconfMessageReceivedEvent(MessageReceivedEvent): self.fjid = key break - self.fjid = unicode(self.fjid) self.jid, self.resource = gajim.get_room_and_nick_from_fjid(self.fjid) def generate(self): @@ -1986,7 +1983,7 @@ class FileRequestReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): self.FT_content.session.ourjid) self.FT_content.transport.set_connection( self.FT_content.session.connection) - sid = unicode(self.stanza.getTag('jingle').getAttr('sid')) + sid = self.stanza.getTag('jingle').getAttr('sid') self.file_props = FilesProp.getNewFileProp(self.conn.name, sid) self.file_props.transport_sid = self.FT_content.transport.sid self.FT_content.file_props = self.file_props @@ -2033,8 +2030,7 @@ class FileRequestReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): else: si = self.stanza.getTag('si') self.file_props = FilesProp.getNewFileProp(self.conn.name, - unicode(si.getAttr('id')) - ) + si.getAttr('id')) profile = si.getAttr('profile') if profile != nbxmpp.NS_FILE: self.conn.send_file_rejection(self.file_props, code='400', @@ -2183,8 +2179,6 @@ class NotificationEvent(nec.NetworkIncomingEvent): self.popup_title = _('New Message from %(nickname)s') % \ {'nickname': nick} - self.popup_image = gtkgui_helpers.get_icon_path(self.popup_image, 48) - if not gajim.config.get('notify_on_new_message') or \ not self.first_unread: self.do_popup = False @@ -2239,6 +2233,28 @@ class NotificationEvent(nec.NetworkIncomingEvent): self.do_popup = False + def get_path_to_generic_or_avatar(self, generic, jid=None, suffix=None): + """ + Choose between avatar image and default image + + Returns full path to the avatar image if it exists, otherwise returns full + path to the image. generic must be with extension and suffix without + """ + if jid: + # we want an avatar + puny_jid = helpers.sanitize_filename(jid) + path_to_file = os.path.join(gajim.AVATAR_PATH, puny_jid) + suffix + path_to_local_file = path_to_file + '_local' + for extension in ('.png', '.jpeg'): + path_to_local_file_full = path_to_local_file + extension + if os.path.exists(path_to_local_file_full): + return path_to_local_file_full + for extension in ('.png', '.jpeg'): + path_to_file_full = path_to_file + extension + if os.path.exists(path_to_file_full): + return path_to_file_full + return os.path.abspath(generic) + def handle_incoming_pres_event(self, pres_obj): if gajim.jid_is_transport(pres_obj.jid): return True @@ -2317,8 +2333,8 @@ class NotificationEvent(nec.NetworkIncomingEvent): iconset = gajim.config.get('iconset') img_path = os.path.join(helpers.get_iconset_path(iconset), '48x48', show_image) - self.popup_image = gtkgui_helpers.get_path_to_generic_or_avatar( - img_path, jid=self.jid, suffix=suffix) + self.popup_image = self.get_path_to_generic_or_avatar(img_path, + jid=self.jid, suffix=suffix) self.popup_timeout = gajim.config.get('notification_timeout') diff --git a/src/common/contacts.py b/src/common/contacts.py index 88c073242..3d411bf24 100644 --- a/src/common/contacts.py +++ b/src/common/contacts.py @@ -28,11 +28,13 @@ ## along with Gajim. If not, see . ## +from functools import cmp_to_key + try: from common import caps_cache from common.account import Account import common.gajim -except ImportError, e: +except ImportError as e: if __name__ != "__main__": raise ImportError(e) @@ -94,6 +96,8 @@ class Contact(CommonContact): sub='', ask='', resource='', priority=0, keyID='', client_caps=None, our_chatstate=None, chatstate=None, last_status_time=None, msg_id=None, last_activity_time=None): + if not isinstance(jid, str): + print('no str') CommonContact.__init__(self, jid, account, resource, show, status, name, our_chatstate, chatstate, client_caps=client_caps) @@ -494,7 +498,7 @@ class Contacts(): return self._contacts.keys() def get_contacts_jid_list(self): - return [jid for jid, contact in self._contacts.iteritems() if not + return [jid for jid, contact in self._contacts.items() if not contact[0].is_groupchat()] def get_contact_from_full_jid(self, fjid): @@ -846,7 +850,7 @@ class MetacontactManager(): Which of the family will be the big brother under wich all others will be ? """ - family.sort(cmp=self._compare_metacontacts) + family.sort(key=cmp_to_key(self._compare_metacontacts)) return family[-1] diff --git a/src/common/dataforms.py b/src/common/dataforms.py index 1129ba2e3..bab233bca 100644 --- a/src/common/dataforms.py +++ b/src/common/dataforms.py @@ -27,7 +27,7 @@ information how to use them, read documentation """ import nbxmpp -import helpers +from common import helpers # exceptions used in this module # base class @@ -195,7 +195,7 @@ class DataField(ExtendedNode): Human-readable description of field meaning """ def fget(self): - return self.getTagData('desc') or u'' + return self.getTagData('desc') or '' def fset(self, value): assert isinstance(value, basestring) @@ -345,10 +345,10 @@ class StringField(DataField): @nested_property def value(): """ - Value of field. May be any unicode string + Value of field. May be any string """ def fget(self): - return self.getTagData('value') or u'' + return self.getTagData('value') or '' def fset(self, value): assert isinstance(value, basestring) @@ -494,7 +494,7 @@ class TextMultiField(DataField): Value held in field """ def fget(self): - value = u'' + value = '' for element in self.iterTags('value'): value += '\n' + element.getData() return value[1:] @@ -643,7 +643,7 @@ class DataForm(ExtendedNode): """ # TODO: the same code is in TextMultiField. join them def fget(self): - value = u'' + value = '' for valuenode in self.getTags('instructions'): value += '\n' + valuenode.getData() return value[1:] diff --git a/src/common/dbus_support.py b/src/common/dbus_support.py index 12a3ed163..8109c36ed 100644 --- a/src/common/dbus_support.py +++ b/src/common/dbus_support.py @@ -38,8 +38,8 @@ try: except ImportError: supported = False if not os.name == 'nt': # only say that to non Windows users - print _('D-Bus python bindings are missing in this computer') - print _('D-Bus capabilities of Gajim cannot be used') + print(_('D-Bus python bindings are missing in this computer')) + print(_('D-Bus capabilities of Gajim cannot be used')) else: try: # test if dbus-x11 is installed @@ -49,14 +49,14 @@ else: except dbus.DBusException: supported = False if not os.name == 'nt': # only say that to non Windows users - print _('D-Bus does not run correctly on this machine') - print _('D-Bus capabilities of Gajim cannot be used') + print(_('D-Bus does not run correctly on this machine')) + print(_('D-Bus capabilities of Gajim cannot be used')) except exceptions.SystemBusNotPresent: - print _('D-Bus does not run correctly on this machine: system bus not ' - 'present') + print(_('D-Bus does not run correctly on this machine: system bus not ' + 'present')) except exceptions.SessionBusNotPresent: - print _('D-Bus does not run correctly on this machine: session bus not ' - 'present') + print(_('D-Bus does not run correctly on this machine: session bus not ' + 'present')) class SystemBus: """ @@ -154,7 +154,7 @@ def get_interface(interface, path, start_service=True): return None obj = bus.get_object(interface, path) return dbus.Interface(obj, interface) - except Exception, e: + except Exception as e: gajim.log.debug(str(e)) return None diff --git a/src/common/file_props.py b/src/common/file_props.py index 808db80fd..1d9684dcb 100644 --- a/src/common/file_props.py +++ b/src/common/file_props.py @@ -64,7 +64,7 @@ class FilesProp: @classmethod def getAllFileProp(cls): - return cls._files_props.values() + return list(cls._files_props.values()) @classmethod def setFileProp(cls, fp, account, sid): diff --git a/src/common/gajim.py b/src/common/gajim.py index 120e09018..b6f1db9ff 100644 --- a/src/common/gajim.py +++ b/src/common/gajim.py @@ -31,10 +31,10 @@ import sys import logging import locale -import config +from common import config import nbxmpp -import defs -import common.ged +from common import defs +from common import ged as ged_module interface = None # The actual interface (the gtk one for the moment) thread_interface = None # Interface to run a thread and then a callback @@ -43,16 +43,15 @@ version = config.get('version') connections = {} # 'account name': 'account (connection.Connection) instance' ipython_window = None -ged = common.ged.GlobalEventsDispatcher() # Global Events Dispatcher +ged = ged_module.GlobalEventsDispatcher() # Global Events Dispatcher nec = None # Network Events Controller plugin_manager = None # Plugins Manager log = logging.getLogger('gajim') -import logger -logger = logger.Logger() # init the logger +logger = None -import configpaths +from common import configpaths gajimpaths = configpaths.gajimpaths VCARD_PATH = gajimpaths['VCARD'] @@ -84,8 +83,8 @@ else: os_info = None # used to cache os information -from contacts import LegacyContactsAPI -from events import Events +from common.contacts import LegacyContactsAPI +from common.events import Events gmail_domains = ['gmail.com', 'googlemail.com'] @@ -221,9 +220,6 @@ gajim_optional_features = {} # Capabilities hash per account caps_hash = {} -import caps_cache -caps_cache.initialize(logger) - global_id = 0 def get_an_id(): global global_id @@ -280,13 +276,8 @@ def get_jid_without_resource(jid): return jid.split('/')[0] def construct_fjid(room_jid, nick): - """ - Nick is in UTF-8 (taken from treeview); room_jid is in unicode - """ # fake jid is the jid for a contact in a room # gaim@conference.jabber.org/nick - if isinstance(nick, str): - nick = unicode(nick, 'utf-8') return room_jid + '/' + nick def get_resource_from_jid(jid): diff --git a/src/common/ged.py b/src/common/ged.py index 9ac3604a2..d46214fc5 100644 --- a/src/common/ged.py +++ b/src/common/ged.py @@ -79,7 +79,7 @@ class GlobalEventsDispatcher(object): if event_name in self.handlers: try: self.handlers[event_name].remove((priority, handler)) - except ValueError, error: + except ValueError as error: log.warn('''Function (%s) with priority "%s" never registered as handler of event "%s". Couldn\'t remove. Error: %s''' %(handler, priority, event_name, error)) @@ -94,7 +94,7 @@ class GlobalEventsDispatcher(object): return True except NodeProcessed: node_processed = True - except Exception, e: + except Exception as e: log.error('Error while running an even handler: %s' % \ handler) traceback.print_exc() diff --git a/src/common/gpg.py b/src/common/gpg.py index 5a29a69fa..fafb56333 100644 --- a/src/common/gpg.py +++ b/src/common/gpg.py @@ -22,11 +22,11 @@ ## along with Gajim. If not, see . ## -from gajim import HAVE_GPG +from common.gajim import HAVE_GPG import os if HAVE_GPG: - import gnupg + from common import gnupg class GnuPG(gnupg.GPG): def __init__(self, use_agent=False): diff --git a/src/common/helpers.py b/src/common/helpers.py index 0dbac4c40..59ffe634b 100644 --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -35,14 +35,14 @@ import locale import os import subprocess import urllib -import urllib2 +import urllib import webbrowser import errno import select import base64 import hashlib import shlex -import caps_cache +from common import caps_cache import socket import time @@ -50,8 +50,8 @@ from gi.repository import GObject from encodings.punycode import punycode_encode from string import Template -from i18n import Q_ -from i18n import ngettext +from common.i18n import Q_ +from common.i18n import ngettext try: import winsound # windows-only built-in module for playing wav @@ -122,7 +122,7 @@ def idn_to_ascii(host): labels = idna.dots.split(host) converted_labels = [] for label in labels: - converted_labels.append(idna.ToASCII(label)) + converted_labels.append(idna.ToASCII(label).decode('utf-8')) return ".".join(converted_labels) def ascii_to_idn(host): @@ -144,9 +144,9 @@ def parse_resource(resource): if resource: try: from nbxmpp.stringprepare import resourceprep - return resourceprep.prepare(unicode(resource)) + return resourceprep.prepare(resource) except UnicodeError: - raise InvalidFormat, 'Invalid character in resource.' + raise InvalidFormat('Invalid character in resource.') def prep(user, server, resource): """ @@ -156,34 +156,34 @@ def prep(user, server, resource): #http://svn.twistedmatrix.com/cvs/trunk/twisted/words/protocols/jabber/jid.py if user is not None: if len(user) < 1 or len(user) > 1023: - raise InvalidFormat, _('Username must be between 1 and 1023 chars') + raise InvalidFormat(_('Username must be between 1 and 1023 chars')) try: from nbxmpp.stringprepare import nodeprep - user = nodeprep.prepare(unicode(user)) + user = nodeprep.prepare(user) except UnicodeError: - raise InvalidFormat, _('Invalid character in username.') + raise InvalidFormat(_('Invalid character in username.')) else: user = None if server is not None: if len(server) < 1 or len(server) > 1023: - raise InvalidFormat, _('Server must be between 1 and 1023 chars') + raise InvalidFormat(_('Server must be between 1 and 1023 chars')) try: from nbxmpp.stringprepare import nameprep - server = nameprep.prepare(unicode(server)) + server = nameprep.prepare(server) except UnicodeError: - raise InvalidFormat, _('Invalid character in hostname.') + raise InvalidFormat(_('Invalid character in hostname.')) else: - raise InvalidFormat, _('Server address required.') + raise InvalidFormat(_('Server address required.')) if resource is not None: if len(resource) < 1 or len(resource) > 1023: - raise InvalidFormat, _('Resource must be between 1 and 1023 chars') + raise InvalidFormat(_('Resource must be between 1 and 1023 chars')) try: from nbxmpp.stringprepare import resourceprep - resource = resourceprep.prepare(unicode(resource)) + resource = resourceprep.prepare(resource) except UnicodeError: - raise InvalidFormat, _('Invalid character in resource.') + raise InvalidFormat(_('Invalid character in resource.')) else: resource = None @@ -207,7 +207,7 @@ def temp_failure_retry(func, *args, **kwargs): while True: try: return func(*args, **kwargs) - except (os.error, IOError, select.error), ex: + except (os.error, IOError, select.error) as ex: if ex.errno == errno.EINTR: continue else: @@ -264,7 +264,7 @@ def get_uf_show(show, use_mnemonic = False): uf_show = Q_('?contact has status:Unknown') else: uf_show = Q_('?contact has status:Has errors') - return unicode(uf_show) + return uf_show def get_uf_sub(sub): if sub == 'none': @@ -278,7 +278,7 @@ def get_uf_sub(sub): else: uf_sub = sub - return unicode(uf_sub) + return uf_sub def get_uf_ask(ask): if ask is None: @@ -288,7 +288,7 @@ def get_uf_ask(ask): else: uf_ask = ask - return unicode(uf_ask) + return uf_ask def get_uf_role(role, plural = False): ''' plural determines if you get Moderators or Moderator''' @@ -448,43 +448,43 @@ def get_output_of_command(command): return output -def decode_string(string): - """ - Try to decode (to make it Unicode instance) given string - """ - if isinstance(string, unicode): - return string - # by the time we go to iso15 it better be the one else we show bad characters - encodings = (locale.getpreferredencoding(), 'utf-8', 'iso-8859-15') - for encoding in encodings: - try: - string = string.decode(encoding) - except UnicodeError: - continue - break +#def decode_string(string): + #""" + #Try to decode (to make it Unicode instance) given string + #""" + #if isinstance(string, unicode): + #return string + ## by the time we go to iso15 it better be the one else we show bad characters + #encodings = (locale.getpreferredencoding(), 'utf-8', 'iso-8859-15') + #for encoding in encodings: + #try: + #string = string.decode(encoding) + #except UnicodeError: + #continue + #break - return string + #return string -def ensure_utf8_string(string): - """ - Make sure string is in UTF-8 - """ - try: - string = decode_string(string).encode('utf-8') - except Exception: - pass - return string +#def ensure_utf8_string(string): + #""" + #Make sure string is in UTF-8 + #""" + #try: + #string = decode_string(string).encode('utf-8') + #except Exception: + #pass + #return string -def wrapped_ensure_utf8_string(fn): - def wrapped(n): - return ensure_utf8_string(n) - return wrapped +#def wrapped_ensure_utf8_string(fn): + #def wrapped(n): + #return ensure_utf8_string(n) + #return wrapped -@wrapped_ensure_utf8_string -def escape_text(text): - return GObject.markup_escape_text(text) +#@wrapped_ensure_utf8_string +#def escape_text(text): + #return GObject.markup_escape_text(text) -GObject.markup_escape_text = escape_text +#GObject.markup_escape_text = escape_text def get_windows_reg_env(varname, default=''): """ @@ -493,7 +493,7 @@ def get_windows_reg_env(varname, default=''): 'AppData' = %USERPROFILE%\Application Data (also an ENV) 'Desktop' = %USERPROFILE%\Desktop 'Favorites' = %USERPROFILE%\Favorites - 'NetHood' = %USERPROFILE%\NetHood + 'NetHood' = %USERPROFILE%\ NetHood 'Personal' = D:\My Documents (PATH TO MY DOCUMENTS) 'PrintHood' = %USERPROFILE%\PrintHood 'Programs' = %USERPROFILE%\Start Menu\Programs @@ -555,7 +555,8 @@ def sanitize_filename(filename): hash = hashlib.md5(filename) filename = base64.b64encode(hash.digest()) - filename = punycode_encode(filename) # make it latin chars only + # make it latin chars only + filename = punycode_encode(filename).decode('utf-8') filename = filename.replace('/', '_') if os.name == 'nt': filename = filename.replace('?', '_').replace(':', '_')\ @@ -577,9 +578,6 @@ def reduce_chars_newlines(text, max_chars = 0, max_lines = 0): string = string[:max_chars - 3] + '...' return string - if isinstance(text, str): - text = text.decode('utf-8') - if max_lines == 0: lines = text.split('\n') else: @@ -635,12 +633,10 @@ def datetime_tuple(timestamp): from time import strptime return strptime(timestamp, '%Y%m%dT%H:%M:%S') -# import gajim only when needed (after decode_string is defined) see #4764 - -import gajim +from common import gajim if gajim.HAVE_PYCURL: import pycurl - from cStringIO import StringIO + from io import StringIO def convert_bytes(string): suffix = '' @@ -648,13 +644,13 @@ def convert_bytes(string): # but do we use the standard? use_kib_mib = gajim.config.get('use_kib_mib') align = 1024. - bytes = float(string) - if bytes >= align: - bytes = round(bytes/align, 1) - if bytes >= align: - bytes = round(bytes/align, 1) - if bytes >= align: - bytes = round(bytes/align, 1) + bytes_ = float(string) + if bytes_ >= align: + bytes_ = round(bytes_/align, 1) + if bytes_ >= align: + bytes_ = round(bytes_/align, 1) + if bytes_ >= align: + bytes_ = round(bytes_/align, 1) if use_kib_mib: #GiB means gibibyte suffix = _('%s GiB') @@ -678,7 +674,7 @@ def convert_bytes(string): else: #B means bytes suffix = _('%s B') - return suffix % unicode(bytes) + return suffix % str(bytes_) def get_contact_dict_for_account(account): """ @@ -904,13 +900,13 @@ def get_icon_name_to_show(contact, account = None): def get_full_jid_from_iq(iq_obj): """ - Return the full jid (with resource) from an iq as unicode + Return the full jid (with resource) from an iq """ return parse_jid(str(iq_obj.getFrom())) def get_jid_from_iq(iq_obj): """ - Return the jid (without resource) from an iq as unicode + Return the jid (without resource) from an iq """ jid = get_full_jid_from_iq(iq_obj) return gajim.get_jid_without_resource(jid) @@ -1431,7 +1427,7 @@ def get_proxy_info(account): login = ['', ''] addr = env_http_proxy[0].split(':') - proxy = {'host': addr[0], 'type' : u'http', 'user':login[0]} + proxy = {'host': addr[0], 'type' : 'http', 'user':login[0]} if len(addr) == 2: proxy['port'] = addr[1] @@ -1442,7 +1438,7 @@ def get_proxy_info(account): proxy['pass'] = login[1] proxy['useauth'] = True else: - proxy['pass'] = u'' + proxy['pass'] = '' return proxy except Exception: @@ -1465,10 +1461,10 @@ def _get_img_direct(attrs): # Wait maximum 5s for connection socket.setdefaulttimeout(5) try: - req = urllib2.Request(attrs['src']) + req = urllib.request.Request(attrs['src']) req.add_header('User-Agent', 'Gajim ' + gajim.version) - f = urllib2.urlopen(req) - except Exception, ex: + f = urllib.request.urlopen(req) + except Exception as ex: log.debug('Error loading image %s ' % attrs['src'] + str(ex)) pixbuf = None alt = attrs.get('alt', 'Broken image') @@ -1491,7 +1487,7 @@ def _get_img_direct(attrs): break try: temp = f.read(100) - except socket.timeout, ex: + except socket.timeout as ex: log.debug('Timeout loading image %s ' % attrs['src'] + str(ex)) alt = attrs.get('alt', '') if alt: @@ -1543,7 +1539,7 @@ def _get_img_proxy(attrs, proxy): c.close() t = b.getvalue() return (t, attrs.get('alt', '')) - except pycurl.error, ex: + except pycurl.error as ex: alt = attrs.get('alt', '') if alt: alt += '\n' @@ -1553,7 +1549,7 @@ def _get_img_proxy(attrs, proxy): alt += _('Timeout loading image') else: alt += _('Error loading image') - except Exception, ex: + except Exception as ex: log.debug('Error loading image %s ' % attrs['src'] + str(ex)) pixbuf = None alt = attrs.get('alt', 'Broken image') diff --git a/src/common/i18n.py b/src/common/i18n.py index 6de7eee31..9c3c3bb03 100644 --- a/src/common/i18n.py +++ b/src/common/i18n.py @@ -24,7 +24,7 @@ import locale import gettext import os -import defs +from common import defs import unicodedata def paragraph_direction_mark(text): @@ -37,11 +37,11 @@ def paragraph_direction_mark(text): for char in text: bidi = unicodedata.bidirectional(char) if bidi == 'L': - return u'\u200E' + return '\u200E' elif bidi == 'AL' or bidi == 'R': - return u'\u200F' + return '\u200F' - return u'\u200E' + return '\u200E' APP = 'gajim' DIR = defs.localedir @@ -61,9 +61,9 @@ if os.name == 'nt': if lang: os.environ['LANG'] = lang -gettext.install(APP, DIR, unicode = True) +gettext.install(APP, DIR) if gettext._translations: - _translation = gettext._translations.values()[0] + _translation = list(gettext._translations.values())[0] else: _translation = gettext.NullTranslations() diff --git a/src/common/idle.py b/src/common/idle.py index 5e1bf4c0f..c2cccdd4b 100644 --- a/src/common/idle.py +++ b/src/common/idle.py @@ -68,7 +68,7 @@ try: rootwindow = libX11.XDefaultRootWindow(dpy_p) xss_available = True -except OSError, e: +except OSError as e: # Logging? xss_available = False @@ -94,6 +94,6 @@ def close(): if __name__ == '__main__': import time time.sleep(2.1) - print getIdleSec() + print(getIdleSec()) close() - print getIdleSec() + print(getIdleSec()) diff --git a/src/common/jingle.py b/src/common/jingle.py index 57e26c3b1..3fd311daa 100644 --- a/src/common/jingle.py +++ b/src/common/jingle.py @@ -27,14 +27,14 @@ Handles the jingle signalling protocol # - codecs import nbxmpp -import helpers -import gajim +from common import helpers +from common import gajim -from jingle_session import JingleSession, JingleStates +from common.jingle_session import JingleSession, JingleStates if gajim.HAVE_FARSTREAM: - from jingle_rtp import JingleAudio, JingleVideo -from jingle_ft import JingleFileTransfer -from jingle_transport import JingleTransportSocks5, JingleTransportIBB + from common.jingle_rtp import JingleAudio, JingleVideo +from common.jingle_ft import JingleFileTransfer +from common.jingle_transport import JingleTransportSocks5, JingleTransportIBB import logging logger = logging.getLogger('gajim.c.jingle') diff --git a/src/common/jingle_content.py b/src/common/jingle_content.py index df04d729f..04e3b8740 100644 --- a/src/common/jingle_content.py +++ b/src/common/jingle_content.py @@ -15,9 +15,9 @@ Handles Jingle contents (XEP 0166) """ -import gajim +from common import gajim import nbxmpp -from jingle_transport import JingleTransportIBB +from common.jingle_transport import JingleTransportIBB contents = {} diff --git a/src/common/jingle_ft.py b/src/common/jingle_ft.py index 8ac9330c4..c050cf6b3 100644 --- a/src/common/jingle_ft.py +++ b/src/common/jingle_ft.py @@ -20,16 +20,16 @@ Handles Jingle File Transfer (XEP 0234) """ import hashlib -import gajim +from common import gajim import nbxmpp -from jingle_content import contents, JingleContent -from jingle_transport import * +from common.jingle_content import contents, JingleContent +from common.jingle_transport import * from common import helpers from common.socks5 import Socks5ReceiverClient, Socks5SenderClient from common.connection_handlers_events import FileRequestReceivedEvent import threading import logging -from jingle_ftstates import * +from common.jingle_ftstates import * log = logging.getLogger('gajim.c.jingle_ft') STATE_NOT_STARTED = 0 diff --git a/src/common/jingle_ftstates.py b/src/common/jingle_ftstates.py index a83ab9e30..23e257392 100644 --- a/src/common/jingle_ftstates.py +++ b/src/common/jingle_ftstates.py @@ -11,9 +11,9 @@ ## GNU General Public License for more details. ## -import gajim +from common import gajim import nbxmpp -from jingle_transport import * +from common.jingle_transport import * from common.socks5 import Socks5ReceiverClient, Socks5SenderClient diff --git a/src/common/jingle_rtp.py b/src/common/jingle_rtp.py index c28a48457..3897e48cc 100644 --- a/src/common/jingle_rtp.py +++ b/src/common/jingle_rtp.py @@ -21,14 +21,15 @@ from gi.repository import GObject import socket import nbxmpp -import farstream, gst +import farstream +import gst from glib import GError -import gajim +from common import gajim -from jingle_transport import JingleTransportICEUDP -from jingle_content import contents, JingleContent, JingleContentSetupException -from connection_handlers_events import InformationEvent +from common.jingle_transport import JingleTransportICEUDP +from common.jingle_content import contents, JingleContent, JingleContentSetupException +from common.connection_handlers_events import InformationEvent import logging @@ -86,8 +87,8 @@ class JingleRTPContent(JingleContent): try: ip = socket.getaddrinfo(stun_server, 0, socket.AF_UNSPEC, socket.SOCK_STREAM)[0][4][0] - except socket.gaierror, (errnum, errstr): - log.warn('Lookup of stun ip failed: %s' % errstr) + except socket.gaierror as e: + log.warn('Lookup of stun ip failed: %s' % str(e)) else: params['stun-ip'] = ip @@ -104,7 +105,7 @@ class JingleRTPContent(JingleContent): try: bin = gst.parse_bin_from_description(pipeline, True) return bin - except GError, error_str: + except GError as error_str: gajim.nec.push_incoming_event(InformationEvent(None, conn=self.session.connection, level='error', pri_txt=_('%s configuration error') % text.capitalize(), diff --git a/src/common/jingle_session.py b/src/common/jingle_session.py index a19056f9b..bd9a0130b 100644 --- a/src/common/jingle_session.py +++ b/src/common/jingle_session.py @@ -26,12 +26,12 @@ Handles Jingle sessions (XEP 0166) # - Tie-breaking # * timeout -import gajim #Get rid of that? +from common import gajim import nbxmpp -from jingle_transport import get_jingle_transport, JingleTransportIBB -from jingle_content import get_jingle_content, JingleContentSetupException -from jingle_content import JingleContent -from jingle_ft import STATE_TRANSPORT_REPLACE +from common.jingle_transport import get_jingle_transport, JingleTransportIBB +from common.jingle_content import get_jingle_content, JingleContentSetupException +from common.jingle_content import JingleContent +from common.jingle_ft import STATE_TRANSPORT_REPLACE from common.connection_handlers_events import * import logging log = logging.getLogger("gajim.c.jingle_session") @@ -73,7 +73,6 @@ class JingleSession(object): self.contents = {} # negotiated contents self.connection = con # connection to use # our full jid - #FIXME: Get rid of gajim here? self.ourjid = gajim.get_jid_from_account(self.connection.name) if con.server_resource: self.ourjid = self.ourjid + '/' + con.server_resource diff --git a/src/common/jingle_transport.py b/src/common/jingle_transport.py index cb289ddfe..a31a5d535 100644 --- a/src/common/jingle_transport.py +++ b/src/common/jingle_transport.py @@ -296,7 +296,7 @@ class JingleTransportSocks5(JingleTransport): cid = host['candidate_id'] break if cid is None: - raise Exception, 'cid is missing' + raise Exception('cid is missing') activated.setAttr('cid', cid) transport.addChild(node=activated) content.addChild(node=transport) @@ -401,7 +401,7 @@ class JingleTransportICEUDP(JingleTransport): if 'type' in candidate and candidate['type'] in types: cand.type = types[candidate['type']] else: - print 'Unknown type %s', candidate['type'] + print('Unknown type %s' % candidate['type']) candidates.append(cand) self.remote_candidates.extend(candidates) return candidates diff --git a/src/common/jingle_xtls.py b/src/common/jingle_xtls.py index 39d62bca6..1c61fb610 100644 --- a/src/common/jingle_xtls.py +++ b/src/common/jingle_xtls.py @@ -20,7 +20,6 @@ import os import nbxmpp import logging -import common from common import gajim log = logging.getLogger('gajim.c.jingle_xtls') @@ -63,7 +62,7 @@ def load_cert_file(cert_path, cert_store): return try: f = open(cert_path) - except IOError, e: + except IOError as e: log.warning('Unable to open certificate file %s: %s' % (cert_path, str(e))) return @@ -79,7 +78,7 @@ def load_cert_file(cert_path, cert_store): x509cert = OpenSSL.crypto.load_certificate( OpenSSL.crypto.FILETYPE_PEM, cert) cert_store.add_cert(x509cert) - except OpenSSL.crypto.Error, exception_obj: + except OpenSSL.crypto.Error as exception_obj: log.warning('Unable to load a certificate from file %s: %s' %\ (cert_path, exception_obj.args[0][0][2])) except: @@ -158,7 +157,7 @@ def send_cert_request(con, to_jid): pubkey = iq.setTag('pubkeys') pubkey.setNamespace(nbxmpp.NS_PUBKEY_PUBKEY) con.connection.send(iq) - return unicode(id_) + return str(id_) # the following code is partly due to pyopenssl examples @@ -201,7 +200,7 @@ def createCertRequest(pkey, digest="md5", **name): req.sign(pkey, digest) return req -def createCertificate(req, (issuerCert, issuerKey), serial, (notBefore, notAfter), digest="md5"): +def createCertificate(req, issuerCert, issuerKey, serial, notBefore, notAfter, digest="md5"): """ Generate a certificate given a certificate request. @@ -235,7 +234,7 @@ def make_certs(filepath, CN): """ key = createKeyPair(TYPE_RSA, 1024) req = createCertRequest(key, CN=CN) - cert = createCertificate(req, (req, key), 0, (0, 60*60*24*365*5)) # five years + cert = createCertificate(req, req, key, 0, 0, 60*60*24*365*5) # five years open(filepath + '.pkey', 'w').write(crypto.dump_privatekey( crypto.FILETYPE_PEM, key)) open(filepath + '.cert', 'w').write(crypto.dump_certificate( diff --git a/src/common/kwalletbinding.py b/src/common/kwalletbinding.py index af320c2f8..750f3c8c1 100644 --- a/src/common/kwalletbinding.py +++ b/src/common/kwalletbinding.py @@ -46,14 +46,14 @@ def kwallet_get(folder, entry): • folder: The top-level category to use (normally the programme name) • entry: The key of the entry to retrieve - Returns the passphrase as unicode, False if it cannot be found, + Returns the passphrase, False if it cannot be found, or None if an error occured. """ p = subprocess.Popen(["kwalletcli", "-q", "-f", folder.encode('utf-8'), "-e", entry.encode('utf-8')], stdout=subprocess.PIPE) pw = p.communicate()[0] if p.returncode == 0: - return unicode(pw.decode('utf-8')) + return pw if p.returncode == 1 or p.returncode == 4: # ENOENT return False diff --git a/src/common/logger.py b/src/common/logger.py index 4c0d2bb67..3ce6fab62 100644 --- a/src/common/logger.py +++ b/src/common/logger.py @@ -33,16 +33,16 @@ import sys import time import datetime from gzip import GzipFile -from cStringIO import StringIO +from io import BytesIO from gi.repository import GObject -import exceptions -import gajim -import ged +from common import exceptions +from common import gajim +from common import ged import sqlite3 as sqlite -import configpaths +from common import configpaths LOG_DB_PATH = configpaths.gajimpaths['LOG_DB'] LOG_DB_FOLDER, LOG_DB_FILE = os.path.split(LOG_DB_PATH) CACHE_DB_PATH = configpaths.gajimpaths['CACHE_DB'] @@ -149,7 +149,7 @@ class Logger: def attach_cache_database(self): try: self.cur.execute("ATTACH DATABASE '%s' AS cache" % CACHE_DB_PATH) - except sqlite.Error, e: + except sqlite.Error as e: log.debug("Failed to attach cache database: %s" % str(e)) def set_synchronous(self, sync): @@ -158,7 +158,7 @@ class Logger: self.cur.execute("PRAGMA synchronous = NORMAL") else: self.cur.execute("PRAGMA synchronous = OFF") - except sqlite.Error, e: + except sqlite.Error as e: log.debug("Failed to set_synchronous(%s): %s" % (sync, str(e))) def init_vars(self): @@ -168,8 +168,8 @@ class Logger: def _really_commit(self): try: self.con.commit() - except sqlite.OperationalError, e: - print >> sys.stderr, str(e) + except sqlite.OperationalError as e: + print(str(e), file=sys.stderr) self.commit_timout_id = None return False @@ -188,7 +188,7 @@ class Logger: def get_jids_already_in_db(self): try: self.cur.execute('SELECT jid FROM jids') - # list of tupples: [(u'aaa@bbb',), (u'cc@dd',)] + # list of tupples: [('aaa@bbb',), ('cc@dd',)] rows = self.cur.fetchall() except sqlite.DatabaseError: raise exceptions.DatabaseMalformed @@ -256,11 +256,11 @@ class Logger: self.cur.execute('INSERT INTO jids (jid, type) VALUES (?, ?)', (jid, typ)) self.con.commit() - except sqlite.IntegrityError, e: + except sqlite.IntegrityError as e: # Jid already in DB, maybe added by another instance. re-read DB self.get_jids_already_in_db() return self.get_jid_id(jid, typestr) - except sqlite.OperationalError, e: + except sqlite.OperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) jid_id = self.cur.lastrowid self.jids_already_in.append(jid) @@ -407,15 +407,15 @@ class Logger: self.cur.execute(sql, values) except sqlite.DatabaseError: raise exceptions.DatabaseMalformed - except sqlite.OperationalError, e: + except sqlite.OperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) message_id = None if write_unread: try: self.con.commit() message_id = self.cur.lastrowid - except sqlite.OperationalError, e: - print >> sys.stderr, str(e) + except sqlite.OperationalError as e: + print(str(e), file=sys.stderr) else: self._timeout_commit() if message_id: @@ -522,7 +522,7 @@ class Logger: # status for roster items try: jid_id = self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) if show is None: # show is None (xmpp), but we say that 'online' show_col = constants.SHOW_ONLINE @@ -535,7 +535,7 @@ class Logger: try: # re-get jid_id for the new jid jid_id = self.get_jid_id(jid, 'ROOM') - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) contact_name_col = nick @@ -549,13 +549,13 @@ class Logger: try: # re-get jid_id for the new jid jid_id = self.get_jid_id(jid, 'ROOM') - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) contact_name_col = nick else: try: jid_id = self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) if kind == 'chat_msg_recv': if not self.jid_is_from_pm(jid): @@ -580,7 +580,7 @@ class Logger: """ try: self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: # Error trying to create a new jid_id. This means there is no log return [] where_sql, jid_tuple = self._build_contact_where(account, jid) @@ -624,7 +624,7 @@ class Logger: """ try: self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: # Error trying to create a new jid_id. This means there is no log return [] where_sql, jid_tuple = self._build_contact_where(account, jid) @@ -653,14 +653,14 @@ class Logger: """ try: self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: # Error trying to create a new jid_id. This means there is no log return [] if False: # query.startswith('SELECT '): # it's SQL query (FIXME) try: self.cur.execute(query) - except sqlite.OperationalError, e: + except sqlite.OperationalError as e: results = [('', '', '', '', str(e))] return results @@ -694,7 +694,7 @@ class Logger: """ try: self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: # Error trying to create a new jid_id. This means there is no log return [] days_with_logs = [] @@ -736,7 +736,7 @@ class Logger: else: try: jid_id = self.get_jid_id(jid, 'ROOM') - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: # Error trying to create a new jid_id. This means there is no log return None where_sql = 'jid_id = ?' @@ -762,7 +762,7 @@ class Logger: """ try: jid_id = self.get_jid_id(jid, 'ROOM') - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: # Error trying to create a new jid_id. This means there is no log return None where_sql = 'jid_id = %s' % jid_id @@ -802,7 +802,7 @@ class Logger: for user in family: try: jid_id = self.get_jid_id(user['jid']) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: continue where_sql += 'jid_id = ?' jid_tuple += (jid_id,) @@ -884,8 +884,7 @@ class Logger: # ..., 'FEAT', feature1, feature2, ...).join(' ')) # NOTE: if there's a need to do more gzip, put that to a function try: - data = GzipFile(fileobj=StringIO(str(data))).read().decode( - 'utf-8').split('\0') + data = GzipFile(fileobj=BytesIO(data)).read().decode('utf-8').split('\0') except IOError: # This data is corrupted. It probably contains non-ascii chars to_be_removed.append((hash_method, hash_)) @@ -927,7 +926,6 @@ class Logger: # if there's a need to do more gzip, put that to a function string = StringIO() gzip = GzipFile(fileobj=string, mode='w') - data = data.encode('utf-8') # the gzip module can't handle unicode objects gzip.write(data) gzip.close() data = string.getvalue() @@ -990,7 +988,7 @@ class Logger: try: account_jid_id = self.get_jid_id(account_jid) jid_id = self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) self.cur.execute( 'DELETE FROM roster_group WHERE account_jid_id=? AND jid_id=?', @@ -1012,7 +1010,7 @@ class Logger: try: account_jid_id = self.get_jid_id(account_jid) jid_id = self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) # Update groups information @@ -1048,6 +1046,8 @@ class Logger: FROM roster_entry re, jids j WHERE re.account_jid_id=? AND j.jid_id=re.jid_id''', (account_jid_id,)) for jid, jid_id, name, subscription, ask in self.cur: + jid = jid + name = name data[jid] = {} if name: data[jid]['name'] = name @@ -1071,6 +1071,7 @@ class Logger: WHERE account_jid_id=? AND jid_id=?''', (account_jid_id, data[jid]['id'])) for (group_name,) in self.cur: + group_name = group_name data[jid]['groups'].append(group_name) del data[jid]['id'] @@ -1149,7 +1150,7 @@ class Logger: # when we quit this muc obj.conn.last_history_time[obj.jid] = tim_f - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: obj.conn.dispatch('DB_ERROR', (_('Disk Write Error'), str(e))) except exceptions.DatabaseMalformed: pritext = _('Database Error') diff --git a/src/common/logging_helpers.py b/src/common/logging_helpers.py index d8f73bf65..22bc7ab73 100644 --- a/src/common/logging_helpers.py +++ b/src/common/logging_helpers.py @@ -19,7 +19,7 @@ ## import logging -import i18n +from common import i18n def parseLogLevel(arg): """ @@ -30,7 +30,7 @@ def parseLogLevel(arg): elif arg.isupper() and hasattr(logging, arg): return getattr(logging, arg) else: - print _('%s is not a valid loglevel') % repr(arg) + print(_('%s is not a valid loglevel') % repr(arg)) return 0 def parseLogTarget(arg): @@ -72,7 +72,7 @@ def parseAndSetLogLevels(arg): target = parseLogTarget(target.strip()) if target: logging.getLogger(target).setLevel(level) - print "Logger %s level set to %d" % (target, level) + print("Logger %s level set to %d" % (target, level)) class colors: @@ -152,6 +152,12 @@ def init(use_color=False): root_log.addHandler(consoleloghandler) root_log.propagate = False + # handle nbxmpp logs too + root_log = logging.getLogger('nbxmpp') + root_log.setLevel(logging.WARNING) + root_log.addHandler(consoleloghandler) + root_log.propagate = False + def set_loglevels(loglevels_string): parseAndSetLogLevels(loglevels_string) diff --git a/src/common/message_archiving.py b/src/common/message_archiving.py index 5a5388f63..69cf9a21d 100644 --- a/src/common/message_archiving.py +++ b/src/common/message_archiving.py @@ -96,7 +96,7 @@ class ConnectionArchive: def get_item_pref(self, jid): jid = nbxmpp.JID(jid) - if unicode(jid) in self.items: + if str(jid) in self.items: return self.items[jid] if jid.getStripped() in self.items: diff --git a/src/common/multimedia_helpers.py b/src/common/multimedia_helpers.py index 98a91a26a..24bfd465c 100644 --- a/src/common/multimedia_helpers.py +++ b/src/common/multimedia_helpers.py @@ -50,7 +50,7 @@ class DeviceManager(object): except ImportError: pass except gst.ElementNotFoundError: - print 'element \'%s\' not found' % name + print('element \'%s\' not found' % name) class AudioInputManager(DeviceManager): diff --git a/src/common/nec.py b/src/common/nec.py index eb4fdccf0..b699085c1 100644 --- a/src/common/nec.py +++ b/src/common/nec.py @@ -153,7 +153,7 @@ class NetworkEvent(object): return True def _set_kwargs_as_attributes(self, **kwargs): - for k, v in kwargs.iteritems(): + for k, v in kwargs.items(): setattr(self, k, v) diff --git a/src/common/optparser.py b/src/common/optparser.py index fa270d748..520bd94d0 100644 --- a/src/common/optparser.py +++ b/src/common/optparser.py @@ -36,7 +36,7 @@ from common import helpers from common import caps_cache import sqlite3 as sqlite -import logger +from common import logger class OptionsParser: def __init__(self, filename): @@ -50,7 +50,8 @@ class OptionsParser: except Exception: if os.path.exists(self.__filename): #we talk about a file - print _('Error: cannot open %s for reading') % self.__filename + print(_('Error: cannot open %s for reading') % self.__filename, + file=sys.stderr) return False new_version = gajim.config.get('version') @@ -59,10 +60,6 @@ class OptionsParser: regex = re.compile(r"(?P[^.]+)(?:(?:\.(?P.+))?\.(?P[^.]+))?\s=\s(?P.*)") for line in fd: - try: - line = line.decode('utf-8') - except UnicodeDecodeError: - line = line.decode(locale.getpreferredencoding()) optname, key, subname, value = regex.match(line).groups() if key is None: self.old_values[optname] = value @@ -86,19 +83,12 @@ class OptionsParser: if value is None: return # convert to utf8 before writing to file if needed - if isinstance(value, unicode): - value = value.encode('utf-8') - else: - value = str(value) - if isinstance(opt, unicode): - opt = opt.encode('utf-8') + value = str(value) s = '' if parents: if len(parents) == 1: return for p in parents: - if isinstance(p, unicode): - p = p.encode('utf-8') s += p + '.' s += opt fd.write(s + ' = ' + value + '\n') @@ -108,11 +98,11 @@ class OptionsParser: self.__tempfile = os.path.join(base_dir, '.' + filename) try: f = open(self.__tempfile, 'w') - except IOError, e: + except IOError as e: return str(e) try: gajim.config.foreach(self.write_line, f) - except IOError, e: + except IOError as e: return str(e) f.flush() os.fsync(f.fileno()) @@ -126,9 +116,9 @@ class OptionsParser: pass try: os.rename(self.__tempfile, self.__filename) - except IOError, e: + except IOError as e: return str(e) - os.chmod(self.__filename, 0600) + os.chmod(self.__filename, 0o600) def update_config(self, old_version, new_version): old_version_list = old_version.split('.') # convert '0.x.y' to (0, x, y) @@ -381,7 +371,7 @@ class OptionsParser: """ Apply indeces to the logs database """ - print _('migrating logs database to indices') + print(_('migrating logs database to indices')) # FIXME see #2812 back = os.getcwd() os.chdir(logger.LOG_DB_FOLDER) @@ -654,7 +644,7 @@ class OptionsParser: ''' ) con.commit() - except sqlite.OperationalError, e: + except sqlite.OperationalError as e: pass con.close() gajim.config.set('version', '0.11.4.4') @@ -714,7 +704,7 @@ class OptionsParser: """ dirs = ['../data', gajim.gajimpaths.data_root, gajim.DATA_DIR] if os.name != 'nt': - dirs.append(os.path.expanduser(u'~/.gajim')) + dirs.append(os.path.expanduser('~/.gajim')) for evt in gajim.config.get_per('soundevents'): path = gajim.config.get_per('soundevents', evt, 'path') # absolute and relative passes are necessary diff --git a/src/common/passwords.py b/src/common/passwords.py index 5a5cbd5f8..d61d2afd9 100644 --- a/src/common/passwords.py +++ b/src/common/passwords.py @@ -81,7 +81,7 @@ class GnomePasswordStorage(PasswordStorage): ## migrate the password over to keyring try: self.save_password(account_name, password, update=False) - except GnomeKeyringError, e: + except GnomeKeyringError as e: if e.error == GnomeKeyring.Result.NO_KEYRING_DAEMON: ## no keyring daemon: in the future, stop using it set_storage(SimplePasswordStorage()) diff --git a/src/common/pep.py b/src/common/pep.py index a2cb84c8f..92bc962d7 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -225,8 +225,6 @@ from common import helpers import nbxmpp from common import gajim -import gtkgui_helpers - class AbstractPEP(object): @@ -269,10 +267,6 @@ class AbstractPEP(object): else: acc.pep[self.type_] = self - def asPixbufIcon(self): - '''SHOULD be implemented by subclasses''' - return None - def asMarkupText(self): '''SHOULD be implemented by subclasses''' return '' @@ -300,13 +294,6 @@ class UserMoodPEP(AbstractPEP): retracted = items.getTag('retract') or not 'mood' in mood_dict return (mood_dict, retracted) - def asPixbufIcon(self): - assert not self._retracted - received_mood = self._pep_specific_data['mood'] - mood = received_mood if received_mood in MOODS else 'unknown' - pixbuf = gtkgui_helpers.load_mood_icon(mood).get_pixbuf() - return pixbuf - def asMarkupText(self): assert not self._retracted untranslated_mood = self._pep_specific_data['mood'] @@ -346,11 +333,6 @@ class UserTunePEP(AbstractPEP): 'title' in tune_dict) return (tune_dict, retracted) - def asPixbufIcon(self): - import os - path = os.path.join(gajim.DATA_DIR, 'emoticons', 'static', 'music.png') - return GdkPixbuf.Pixbuf.new_from_file(path) - def asMarkupText(self): assert not self._retracted tune = self._pep_specific_data @@ -396,24 +378,6 @@ class UserActivityPEP(AbstractPEP): retracted = items.getTag('retract') or not 'activity' in activity_dict return (activity_dict, retracted) - def asPixbufIcon(self): - assert not self._retracted - pep = self._pep_specific_data - activity = pep['activity'] - - has_known_activity = activity in ACTIVITIES - has_known_subactivity = (has_known_activity and ('subactivity' in pep) - and (pep['subactivity'] in ACTIVITIES[activity])) - - if has_known_activity: - if has_known_subactivity: - subactivity = pep['subactivity'] - return gtkgui_helpers.load_activity_icon(activity, subactivity).get_pixbuf() - else: - return gtkgui_helpers.load_activity_icon(activity).get_pixbuf() - else: - return gtkgui_helpers.load_activity_icon('unknown').get_pixbuf() - def asMarkupText(self): assert not self._retracted pep = self._pep_specific_data @@ -491,10 +455,6 @@ class UserLocationPEP(AbstractPEP): con = gajim.connections[account].location_info = \ self._pep_specific_data - def asPixbufIcon(self): - path = gtkgui_helpers.get_icon_path('gajim-earth') - return GdkPixbuf.Pixbuf.new_from_file(path) - def asMarkupText(self): assert not self._retracted location = self._pep_specific_data diff --git a/src/common/protocol/bytestream.py b/src/common/protocol/bytestream.py index e362dec5c..4077dbe18 100644 --- a/src/common/protocol/bytestream.py +++ b/src/common/protocol/bytestream.py @@ -163,7 +163,7 @@ class ConnectionBytestream: session.approve_content('file', content.name) return - iq = nbxmpp.Iq(to=unicode(file_props.sender), typ='result') + iq = nbxmpp.Iq(to=file_props.sender, typ='result') iq.setAttr('id', file_props.request_id) si = iq.setTag('si', namespace=nbxmpp.NS_SI) if file_props.offset: @@ -195,7 +195,7 @@ class ConnectionBytestream: jingle = self._sessions[file_props.sid] jingle.cancel_session() return - iq = nbxmpp.Iq(to=unicode(file_props.sender), typ='error') + iq = nbxmpp.Iq(to=file_props.sender, typ='error') iq.setAttr('id', file_props.request_id) if code == '400' and typ in ('stream', 'profile'): name = 'bad-request' @@ -296,7 +296,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): for file_props in FilesProp.getAllFileProp(): if is_transfer_stopped(file_props): continue - receiver_jid = unicode(file_props.receiver) + receiver_jid = file_props.receiver if contact.get_full_jid() == receiver_jid: file_props.error = -5 self.remove_transfer(file_props) @@ -305,7 +305,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): gajim.nec.push_incoming_event(FileRequestErrorEvent(None, conn=self, jid=contact.jid, file_props=file_props, error_msg='')) - sender_jid = unicode(file_props.sender) + sender_jid = file_props.sender if contact.get_full_jid() == sender_jid: file_props.error = -3 self.remove_transfer(file_props) @@ -354,11 +354,11 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): file_props.error = -5 from common.connection_handlers_events import FileRequestErrorEvent gajim.nec.push_incoming_event(FileRequestErrorEvent(None, conn=self, - jid=unicode(receiver), file_props=file_props, error_msg='')) - self._connect_error(unicode(receiver), file_props.sid, + jid=receiver, file_props=file_props, error_msg='')) + self._connect_error(receiver, file_props.sid, file_props.sid, code=406) else: - iq = nbxmpp.Iq(to=unicode(receiver), typ='set') + iq = nbxmpp.Iq(to=receiver, typ='set') file_props.request_id = 'id_' + file_props.sid iq.setID(file_props.request_id) query = iq.setTag('query', namespace=nbxmpp.NS_BYTESTREAM) @@ -374,7 +374,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): for host in hosts: streamhost = nbxmpp.Node(tag='streamhost') query.addChild(node=streamhost) - streamhost.setAttr('port', unicode(port)) + streamhost.setAttr('port', str(port)) streamhost.setAttr('host', host) streamhost.setAttr('jid', sender) @@ -489,8 +489,8 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): def _add_proxy_streamhosts_to_query(self, query, file_props): proxyhosts = self._get_file_transfer_proxies_from_config(file_props) if proxyhosts: - file_props.proxy_receiver = unicode(file_props.receiver) - file_props.proxy_sender = unicode(file_props.sender) + file_props.proxy_receiver = file_props.receiver + file_props.proxy_sender = file_props.sender file_props.proxyhosts = proxyhosts for proxyhost in proxyhosts: @@ -518,12 +518,12 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): continue host_dict = { 'state': 0, - 'target': unicode(file_props.receiver), + 'target': file_props.receiver, 'id': file_props.sid, 'sid': file_props.sid, 'initiator': proxy, 'host': host, - 'port': unicode(_port), + 'port': str(_port), 'jid': jid } proxyhost_dicts.append(host_dict) @@ -563,7 +563,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): iq = nbxmpp.Iq(to=to, typ='error') iq.setAttr('id', file_props.sid) err = iq.setTag('error') - err.setAttr('code', unicode(code)) + err.setAttr('code', str(code)) err.setData(msg) self.connection.send(iq) if code == 404: @@ -593,7 +593,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): # register xmpppy handlers for bytestream and FT stanzas def _bytestreamErrorCB(self, con, iq_obj): - id_ = unicode(iq_obj.getAttr('id')) + id_ = iq_obj.getAttr('id') frm = helpers.get_full_jid_from_iq(iq_obj) query = iq_obj.getTag('query') gajim.proxy65_manager.error_cb(frm, query) @@ -609,10 +609,10 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): raise nbxmpp.NodeProcessed def _bytestreamSetCB(self, con, iq_obj): - target = unicode(iq_obj.getAttr('to')) - id_ = unicode(iq_obj.getAttr('id')) + target = iq_obj.getAttr('to') + id_ = iq_obj.getAttr('id') query = iq_obj.getTag('query') - sid = unicode(query.getAttr('sid')) + sid = query.getAttr('sid') file_props = FilesProp.getFileProp(self.name, sid) streamhosts = [] for item in query.getChildren(): @@ -657,7 +657,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): def _ResultCB(self, con, iq_obj): # if we want to respect xep-0065 we have to check for proxy # activation result in any result iq - real_id = unicode(iq_obj.getAttr('id')) + real_id = iq_obj.getAttr('id') if not real_id.startswith('au_'): return frm = self._ft_get_from(iq_obj) @@ -671,7 +671,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): def _bytestreamResultCB(self, con, iq_obj): frm = self._ft_get_from(iq_obj) - real_id = unicode(iq_obj.getAttr('id')) + real_id = iq_obj.getAttr('id') query = iq_obj.getTag('query') gajim.proxy65_manager.resolve_result(frm, query) @@ -692,7 +692,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): raise nbxmpp.NodeProcessed for host in file_props.proxyhosts: if host['initiator'] == frm and \ - unicode(query.getAttr('sid')) == file_props.sid: + query.getAttr('sid') == file_props.sid: gajim.socks5queue.activate_proxy(host['idx']) break raise nbxmpp.NodeProcessed @@ -852,7 +852,8 @@ class ConnectionIBBytestream(ConnectionBytestream): chunk = file_props.fp.read(file_props.block_size) if chunk: datanode = nbxmpp.Node(nbxmpp.NS_IBB + ' data', {'sid': sid, - 'seq': file_props.seq}, base64.encodestring(chunk)) + 'seq': file_props.seq}, base64.b64encode(chunk.encode( + 'utf-8')).decode('utf-8')) file_props.seq += 1 file_props.started = True if file_props.seq == 65536: @@ -887,7 +888,7 @@ class ConnectionIBBytestream(ConnectionBytestream): log.debug('ReceiveHandler called sid->%s seq->%s' % (sid, seq)) try: seq = int(seq) - data = base64.decodestring(data) + data = base64.b64decode(data.encode('utf-8')).decode('utf-8') except Exception: seq = '' data = '' @@ -898,7 +899,7 @@ class ConnectionIBBytestream(ConnectionBytestream): else: if not data: err = nbxmpp.ERR_BAD_REQUEST - elif seq <> file_props.seq: + elif seq != file_props.seq: err = nbxmpp.ERR_UNEXPECTED_REQUEST else: log.debug('Successfull receive sid->%s %s+%s bytes' % (sid, @@ -983,7 +984,7 @@ class ConnectionIBBytestream(ConnectionBytestream): class ConnectionSocks5BytestreamZeroconf(ConnectionSocks5Bytestream): def _ft_get_from(self, iq_obj): - return unicode(iq_obj.getFrom()) + return iq_obj.getFrom() def _ft_get_our_jid(self): return gajim.get_jid_from_account(self.name) diff --git a/src/common/proxy65_manager.py b/src/common/proxy65_manager.py index 8a906a01b..38464b578 100644 --- a/src/common/proxy65_manager.py +++ b/src/common/proxy65_manager.py @@ -29,7 +29,7 @@ log = logging.getLogger('gajim.c.proxy65_manager') import nbxmpp from common import gajim from common import helpers -from socks5 import Socks5 +from common.socks5 import Socks5 from nbxmpp.idlequeue import IdleObject from common.file_props import FilesProp @@ -117,7 +117,7 @@ class ProxyResolver: """ self.host = str(host) self.port = int(port) - self.jid = unicode(jid) + self.jid = str(jid) if not self.testit: self.state = S_FINISHED return @@ -333,7 +333,7 @@ class HostTester(Socks5, IdleObject): log.debug('Host Connecting to %s:%s' % (self.host, self.port)) self._send = self._sock.send self._recv = self._sock.recv - except Exception, ee: + except Exception as ee: errnum = ee[0] # 56 is for freebsd if errnum in (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK): @@ -461,7 +461,7 @@ class ReceiverTester(Socks5, IdleObject): log.debug('Receiver Connecting to %s:%s' % (self.host, self.port)) self._send = self._sock.send self._recv = self._sock.recv - except Exception, ee: + except Exception as ee: errnum = ee[0] # 56 is for freebsd if errnum in (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK): diff --git a/src/common/pubsub.py b/src/common/pubsub.py index d2bde78ed..6028088ff 100644 --- a/src/common/pubsub.py +++ b/src/common/pubsub.py @@ -22,11 +22,13 @@ ## import nbxmpp -import gajim -import connection_handlers -import ged -from connection_handlers_events import PubsubReceivedEvent -from connection_handlers_events import PubsubBookmarksReceivedEvent +from common import gajim +#TODO: Doesn't work +#from common.connection_handlers import PEP_CONFIG +PEP_CONFIG = 'pep_config' +from common import ged +from common.connection_handlers_events import PubsubReceivedEvent +from common.connection_handlers_events import PubsubBookmarksReceivedEvent import logging log = logging.getLogger('gajim.c.pubsub') @@ -218,5 +220,5 @@ class ConnectionPubSub: e = e.addChild('configure', {'node': node}) id_ = self.connection.getAnID() query.setID(id_) - self.awaiting_answers[id_] = (connection_handlers.PEP_CONFIG,) + self.awaiting_answers[id_] = (PEP_CONFIG,) self.connection.send(query) diff --git a/src/common/resolver.py b/src/common/resolver.py index 5c8fc3571..6f1200d54 100644 --- a/src/common/resolver.py +++ b/src/common/resolver.py @@ -70,33 +70,33 @@ class CommonResolver(): # empty host, return empty list of srv records on_ready([]) return - if self.resolved_hosts.has_key(host+type): + if host + type in self.resolved_hosts: # host is already resolved, return cached values log.debug('%s already resolved: %s' % (host, - self.resolved_hosts[host+type])) - on_ready(host, self.resolved_hosts[host+type]) + self.resolved_hosts[host + type])) + on_ready(host, self.resolved_hosts[host + type]) return - if self.handlers.has_key(host+type): + if host + type in self.handlers: # host is about to be resolved by another connection, # attach our callback log.debug('already resolving %s' % host) - self.handlers[host+type].append(on_ready) + self.handlers[host + type].append(on_ready) else: # host has never been resolved, start now log.debug('Starting to resolve %s using %s' % (host, self)) - self.handlers[host+type] = [on_ready] + self.handlers[host + type] = [on_ready] self.start_resolve(host, type) def _on_ready(self, host, type, result_list): # practically it is impossible to be the opposite, but who knows :) host = host.lower() log.debug('Resolving result for %s: %s' % (host, result_list)) - if not self.resolved_hosts.has_key(host+type): - self.resolved_hosts[host+type] = result_list - if self.handlers.has_key(host+type): - for callback in self.handlers[host+type]: + if host + type not in self.resolved_hosts: + self.resolved_hosts[host + type] = result_list + if host + type in self.handlers: + for callback in self.handlers[host + type]: callback(host, result_list) - del(self.handlers[host+type]) + del(self.handlers[host + type]) def start_resolve(self, host, type): pass @@ -251,8 +251,7 @@ class NSLookupResolver(CommonResolver): domain = None if line.startswith(fqdn): domain = fqdn # For nslookup 9.5 - elif helpers.decode_string(line).startswith(ufqdn): - line = helpers.decode_string(line) + elif line.startswith(ufqdn): domain = ufqdn # For nslookup 9.6 if domain: rest = line[len(domain):].split('=') @@ -329,7 +328,7 @@ if __name__ == '__main__': global resolver host = text_view.get_text() def on_result(host, result_array): - print 'Result:\n' + repr(result_array) + print('Result:\n' + repr(result_array)) resolver.resolve(host, on_result) win = Gtk.Window() win.set_border_width(6) diff --git a/src/common/rst_xhtml_generator.py b/src/common/rst_xhtml_generator.py index 28f25c77e..7d4e366ff 100644 --- a/src/common/rst_xhtml_generator.py +++ b/src/common/rst_xhtml_generator.py @@ -28,7 +28,7 @@ try: from docutils import nodes, utils from docutils.parsers.rst.roles import set_classes except ImportError: - print "Requires docutils 0.4 for set_classes to be available" + print("Requires docutils 0.4 for set_classes to be available") def create_xhtml(text): return None else: @@ -65,7 +65,7 @@ else: options={}, content=[]): try: valid_text = validator(text) - except ValueError, e: + except ValueError as e: msg = inliner.reporter.error( e.message % dict(text=text), line=lineno) prb = inliner.problematic(rawtext, rawtext, msg) return [prb], [msg] @@ -120,7 +120,7 @@ else: # in the JEP #   == u"\u00a0" self.pub.writer.translator_class.attribution_formats['dash'] = ( - u'\u2014', '') + '\u2014', '') self.pub.process_programmatic_settings(settings_spec, settings_overrides, config_section) @@ -137,7 +137,7 @@ else: output = self.pub.publish(enable_exit_status=enable_exit_status) # kludge until we can get docutils to stop generating (rare)   # entities - return u'\u00a0'.join(self.pub.writer.parts['fragment'].strip().split( + return '\u00a0'.join(self.pub.writer.parts['fragment'].strip().split( ' ')) Generator = HTMLGenerator() @@ -147,7 +147,7 @@ else: if __name__ == '__main__': - print "test 1\n", Generator.create_xhtml(""" + print("test 1\n" + Generator.create_xhtml(""" test:: >>> print 1 @@ -157,10 +157,10 @@ test:: this `` should trigger`` should trigger the   problem. -""") - print "test 2\n", Generator.create_xhtml(""" +""")) + print("test 2\n" + Generator.create_xhtml(""" *test1 test2_ -""") - print "test 3\n", Generator.create_xhtml(""":ticket:`316` implements :xep:`71`""") +""")) + print("test 3\n" + Generator.create_xhtml(""":ticket:`316` implements :xep:`71`""")) diff --git a/src/common/sleepy.py b/src/common/sleepy.py index 14568cb5c..ed5fd2022 100644 --- a/src/common/sleepy.py +++ b/src/common/sleepy.py @@ -22,7 +22,8 @@ ## from common import gajim -import os, sys +import os +import sys STATE_UNKNOWN = 'OS probably not supported' diff --git a/src/common/socks5.py b/src/common/socks5.py index a8ce7ecd5..c57be17a5 100644 --- a/src/common/socks5.py +++ b/src/common/socks5.py @@ -33,9 +33,9 @@ from errno import EISCONN from errno import EINPROGRESS from errno import EAFNOSUPPORT from nbxmpp.idlequeue import IdleObject -from file_props import FilesProp +from common.file_props import FilesProp from common import gajim -import jingle_xtls +from common import jingle_xtls if jingle_xtls.PYOPENSSL_PRESENT: import OpenSSL import logging @@ -463,7 +463,7 @@ class Socks5: self._sock.setblocking(False) self._server = ai[4] break - except socket.error, e: + except socket.error as e: if not isinstance(e, basestring) and e[0] == EINPROGRESS: break # for all other errors, we try other addresses @@ -481,7 +481,7 @@ class Socks5: self._sock.setblocking(False) self._send=self._sock.send self._recv=self._sock.recv - except Exception, ee: + except Exception as ee: errnum = ee[0] self.connect_timeout += 1 if errnum == 111 or self.connect_timeout > 1000: @@ -533,9 +533,9 @@ class Socks5: self.size = self.file_props.offset self.file.seek(self.size) self.file_props.received_len = self.size - except IOError, e: + except IOError as e: self.close_file() - raise IOError, e + raise IOError(str(e)) def close_file(self): if self.file: @@ -583,7 +583,7 @@ class Socks5: try: add = self._recv(64) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('SSL rehandshake request : ' + repr(e)) raise e except Exception: @@ -600,10 +600,10 @@ class Socks5: try: self._send(raw_data) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('SSL rehandshake request :' + repr(e)) raise e - except Exception, e: + except Exception as e: self.disconnect() return len(raw_data) @@ -614,7 +614,7 @@ class Socks5: else: try: self.open_file_for_reading() - except IOError, e: + except IOError as e: self.state = 8 # end connection self.disconnect() self.file_props.error = -7 # unable to read from file @@ -625,10 +625,10 @@ class Socks5: try: lenn = self._send(buff) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('SSL rehandshake request :' + repr(e)) raise e - except Exception, e: + except Exception as e: if e.args[0] not in (EINTR, ENOBUFS, EWOULDBLOCK): # peer stopped reading self.state = 8 # end connection @@ -671,7 +671,7 @@ class Socks5: if self.remaining_buff != '': try: fd = self.get_fd() - except IOError, e: + except IOError as e: self.disconnect(False) self.file_props.error = -6 # file system error return 0 @@ -692,14 +692,14 @@ class Socks5: else: try: fd = self.get_fd() - except IOError, e: + except IOError as e: self.disconnect(False) self.file_props.error = -6 # file system error return 0 try: buff = self._recv(MAX_BUFF_LEN) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('SSL rehandshake request :' + repr(e)) raise e except Exception: @@ -718,7 +718,7 @@ class Socks5: return 0 try: fd.write(buff) - except IOError, e: + except IOError as e: self.rem_fd(fd) self.disconnect() self.file_props.error = -6 # file system error @@ -781,7 +781,7 @@ class Socks5: auth_mechanisms = [] try: num_auth = struct.unpack('!xB', buff[:2])[0] - for i in xrange(num_auth): + for i in list(range(num_auth)): mechanism, = struct.unpack('!B', buff[1 + i]) auth_mechanisms.append(mechanism) except Exception: @@ -842,7 +842,7 @@ class Socks5: try: buff = self._recv() except (SSL.WantReadError, SSL.WantWriteError, - SSL.WantX509LookupError), e: + SSL.WantX509LookupError) as e: log.info("SSL rehandshake request : " + repr(e)) raise e try: @@ -1085,7 +1085,7 @@ class Socks5Server(Socks5): result = self.start_transfer() # send self.queue.process_result(result, self) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('caught SSL exception, ignored') else: self.disconnect() @@ -1123,7 +1123,7 @@ class Socks5Server(Socks5): else: self.disconnect() except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('caught SSL exception, ignored') return if self.state < 5: @@ -1229,7 +1229,7 @@ class Socks5Client(Socks5): result = self.start_transfer() # receive self.queue.process_result(result, self) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('caught SSL exception, ignored') return else: @@ -1253,7 +1253,7 @@ class Socks5Client(Socks5): self.queue.process_result(result, self) return except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('caught SSL exception, ignored') return self.state += 1 @@ -1346,7 +1346,7 @@ class Socks5Listener(IdleObject): if self.fingerprint is not None: self._serv = OpenSSL.SSL.Connection( jingle_xtls.get_context('server'), self._serv) - except socket.error, e: + except socket.error as e: if e.args[0] == EAFNOSUPPORT: self.ai = None continue diff --git a/src/common/stanza_session.py b/src/common/stanza_session.py index 2dc4bf151..2cf146b74 100644 --- a/src/common/stanza_session.py +++ b/src/common/stanza_session.py @@ -45,7 +45,7 @@ if gajim.HAVE_PYCRYPTO: from Crypto.PublicKey import RSA from common import dh - import secrets + from . import secrets XmlDsig = 'http://www.w3.org/2000/09/xmldsig#' diff --git a/src/common/zeroconf/client_zeroconf.py b/src/common/zeroconf/client_zeroconf.py index 52a7ca1f0..3d5b43f43 100644 --- a/src/common/zeroconf/client_zeroconf.py +++ b/src/common/zeroconf/client_zeroconf.py @@ -173,7 +173,7 @@ class P2PClient(IdleObject): id_ = stanza.getID() if not id_: id_ = self.Dispatcher.getAnID() - if self.conn_holder.ids_of_awaiting_messages.has_key(self.fd): + if self.fd in self.conn_holder.ids_of_awaiting_messages: self.conn_holder.ids_of_awaiting_messages[self.fd].append(( id_, thread_id)) else: @@ -195,7 +195,7 @@ class P2PClient(IdleObject): id_ = stanza.getID() if not id_: id_ = self.Dispatcher.getAnID() - if self.conn_holder.ids_of_awaiting_messages.has_key(self.fd): + if self.fd in self.conn_holder.ids_of_awaiting_messages: self.conn_holder.ids_of_awaiting_messages[self.fd].append((id_, thread_id)) else: @@ -253,10 +253,10 @@ class P2PClient(IdleObject): 'Incorrect answer from server.') return if self.sock_type == TYPE_SERVER: - if attrs.has_key('from'): + if 'from' in attrs: self.to = attrs['from'] self.send_stream_header() - if attrs.has_key('version') and attrs['version'] == '1.0': + if 'version' in attrs and attrs['version'] == '1.0': # other part supports stream features features = Node('stream:features') self.Dispatcher.send(features) @@ -270,12 +270,12 @@ class P2PClient(IdleObject): def on_disconnect(self): if self.conn_holder: - if self.conn_holder.ids_of_awaiting_messages.has_key(self.fd): + if self.fd in self.conn_holder.ids_of_awaiting_messages: del self.conn_holder.ids_of_awaiting_messages[self.fd] self.conn_holder.remove_connection(self.sock_hash) - if self.__dict__.has_key('Dispatcher'): + if 'Dispatcher' in self.__dict__: self.Dispatcher.PlugOut() - if self.__dict__.has_key('P2PConnection'): + if 'P2PConnection' in self.__dict__: self.P2PConnection.PlugOut() self.Connection = None self._caller = None @@ -294,7 +294,7 @@ class P2PClient(IdleObject): self.Dispatcher.Stream._document_attrs is None: return self.onreceive(None) - if self.Dispatcher.Stream._document_attrs.has_key('version') and \ + if 'version' in self.Dispatcher.Stream._document_attrs and \ self.Dispatcher.Stream._document_attrs['version'] == '1.0': #~ self.onreceive(self._on_receive_stream_features) #XXX continue with TLS @@ -356,7 +356,7 @@ class P2PConnection(IdleObject, PlugIn): try: self.ais = socket.getaddrinfo(host, port, socket.AF_UNSPEC, socket.SOCK_STREAM) - except socket.gaierror, e: + except socket.gaierror as e: log.info('Lookup failure for %s: %s[%s]', host, e[1], repr(e[0]), exc_info=True) else: @@ -418,19 +418,12 @@ class P2PConnection(IdleObject, PlugIn): """ Append stanza to the queue of messages to be send if now is False, else send it instantly - - If supplied data is unicode string, encode it to UTF-8. """ if self.state <= 0: return r = packet - if isinstance(r, unicode): - r = r.encode('utf-8') - elif not isinstance(r, str): - r = ustr(r).encode('utf-8') - if now: self.sendqueue.insert(0, (r, is_message)) self._do_send() @@ -455,7 +448,7 @@ class P2PConnection(IdleObject, PlugIn): try: self._sock.connect(self._server) self._sock.setblocking(False) - except Exception, ee: + except Exception as ee: (errnum, errstr) = ee errors = (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK) if 'WSAEINVAL' in errno.__dict__: @@ -495,7 +488,7 @@ class P2PConnection(IdleObject, PlugIn): try: # get as many bites, as possible, but not more than RECV_BUFSIZE received = self._sock.recv(MAX_BUFF_LEN) - except Exception, e: + except Exception as e: if len(e.args) > 0 and isinstance(e.args[0], int): errnum = e[0] # "received" will be empty anyhow @@ -566,7 +559,7 @@ class P2PConnection(IdleObject, PlugIn): self._plug_idle() self._on_send() - except socket.error, e: + except socket.error as e: if e[0] == socket.SSL_ERROR_WANT_WRITE: return True if self.state < 0: @@ -717,7 +710,7 @@ class ClientZeroconf: if self.ip_to_hash[i] == sock_hash: del self.ip_to_hash[i] break - if self.hash_to_port.has_key(sock_hash): + if sock_hash in self.hash_to_port: del self.hash_to_port[sock_hash] def start_listener(self, port): @@ -737,7 +730,7 @@ class ClientZeroconf: def send(self, stanza, is_message=False, now=False, on_ok=None, on_not_ok=None): stanza.setFrom(self.roster.zeroconf.name) - to = unicode(stanza.getTo()) + to = stanza.getTo() to = gajim.get_jid_without_resource(to) try: @@ -802,7 +795,7 @@ class ClientZeroconf: def on_ok(_waitid): # if timeout: # self._owner.set_timeout(timeout) - to = unicode(stanza.getTo()) + to = stanza.getTo() to = gajim.get_jid_without_resource(to) try: diff --git a/src/common/zeroconf/connection_zeroconf.py b/src/common/zeroconf/connection_zeroconf.py index 2b7967a67..c3c5beaf9 100644 --- a/src/common/zeroconf/connection_zeroconf.py +++ b/src/common/zeroconf/connection_zeroconf.py @@ -46,7 +46,7 @@ from common import gajim from common import ged from common.zeroconf import client_zeroconf from common.zeroconf import zeroconf -from connection_handlers_zeroconf import * +from common.zeroconf.connection_handlers_zeroconf import * from common.connection_handlers_events import * import locale @@ -91,7 +91,7 @@ class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf): 'is_zeroconf', True) gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'use_ft_proxies', False) - self.host = unicode(socket.gethostname(), locale.getpreferredencoding()) + self.host = socket.gethostname() gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'hostname', self.host) self.port = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, @@ -110,8 +110,7 @@ class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf): 'zeroconf_email') if not self.username: - self.username = unicode(getpass.getuser(), - locale.getpreferredencoding()) + self.username = getpass.getuser() gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'name', self.username) else: @@ -427,7 +426,7 @@ class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf): if realm == '': if event == nbxmpp.transports_nb.DATA_ERROR: thread_id = data[1] - frm = unicode(data[0]) + frm = data[0] session = self.get_or_create_session(frm, thread_id) gajim.nec.push_incoming_event(MessageErrorEvent( None, conn=self, fjid=frm, error_code=-1, error_msg=_( diff --git a/src/common/zeroconf/roster_zeroconf.py b/src/common/zeroconf/roster_zeroconf.py index 307fd392e..472ded7b6 100644 --- a/src/common/zeroconf/roster_zeroconf.py +++ b/src/common/zeroconf/roster_zeroconf.py @@ -32,7 +32,6 @@ class Roster: self.setItem(val[zeroconf.C_NAME]) def getRoster(self): - #print 'roster_zeroconf.py: getRoster' if self._data is None: self._data = {} self.update_roster() @@ -50,11 +49,9 @@ class Roster: if key in self._data: if old_data[key] != self._data[key]: diffs[key] = self._data[key]['status'] - #print 'roster_zeroconf.py: diffs:' + str(diffs) return diffs def setItem(self, jid, name='', groups=''): - #print 'roster_zeroconf.py: setItem %s' % jid contact = self.zeroconf.get_contact(jid) if not contact: return @@ -96,34 +93,27 @@ class Roster: self.setItem(jid=i['jid'], name=i['name'], groups=i['groups']) def delItem(self, jid): - #print 'roster_zeroconf.py: delItem %s' % jid if jid in self._data: del self._data[jid] def getItem(self, jid): - #print 'roster_zeroconf.py: getItem: %s' % jid if jid in self._data: return self._data[jid] def __getitem__(self, jid): - #print 'roster_zeroconf.py: __getitem__' return self._data[jid] def getItems(self): - #print 'roster_zeroconf.py: getItems' # Return list of all [bare] JIDs that the roster currently tracks. return self._data.keys() def keys(self): - #print 'roster_zeroconf.py: keys' return self._data.keys() def getRaw(self): - #print 'roster_zeroconf.py: getRaw' return self._data def getResources(self, jid): - #print 'roster_zeroconf.py: getResources(%s)' % jid return {} def getGroups(self, jid): @@ -142,14 +132,12 @@ class Roster: return self._data[jid]['txt_dict']['msg'] def getShow(self, jid): - #print 'roster_zeroconf.py: getShow' return self.getStatus(jid) def getPriority(self, jid): return 5 def getSubscription(self, jid): - #print 'roster_zeroconf.py: getSubscription' return 'both' def Subscribe(self, jid): diff --git a/src/common/zeroconf/zeroconf_avahi.py b/src/common/zeroconf/zeroconf_avahi.py index 5ce4f8398..73f091928 100644 --- a/src/common/zeroconf/zeroconf_avahi.py +++ b/src/common/zeroconf/zeroconf_avahi.py @@ -22,7 +22,7 @@ log = logging.getLogger('gajim.c.z.zeroconf_avahi') try: import dbus.exceptions -except ImportError, e: +except ImportError as e: pass from common.zeroconf.zeroconf import C_BARE_NAME, C_INTERFACE, C_PROTOCOL, C_DOMAIN @@ -224,14 +224,7 @@ class Zeroconf: return show def avahi_txt(self): - utf8_dict = {} - for key in self.txt: - val = self.txt[key] - if isinstance(val, unicode): - utf8_dict[key] = val.encode('utf-8') - else: - utf8_dict[key] = val - return self.avahi.dict_to_txt_array(utf8_dict) + return self.avahi.dict_to_txt_array(self.txt) def create_service(self): try: @@ -246,7 +239,7 @@ class Zeroconf: txt = {} # remove empty keys - for key, val in self.txt.iteritems(): + for key, val in self.txt.items(): if val: txt[key] = val @@ -274,7 +267,7 @@ class Zeroconf: return True - except dbus.DBusException, e: + except dbus.DBusException as e: log.debug(str(e)) return False @@ -334,7 +327,7 @@ class Zeroconf: self.bus.add_signal_receiver(self.avahi_dbus_connect_cb, 'NameOwnerChanged', 'org.freedesktop.DBus', arg0='org.freedesktop.Avahi') - except Exception, e: + except Exception as e: # System bus is not present self.bus = None log.debug(str(e)) @@ -361,7 +354,7 @@ class Zeroconf: self.avahi.DBUS_PATH_SERVER), self.avahi.DBUS_INTERFACE_SERVER) self.server.connect_to_signal('StateChanged', self.server_state_changed_callback) - except Exception, e: + except Exception as e: # Avahi service is not present self.server = None log.debug(str(e)) @@ -402,14 +395,14 @@ class Zeroconf: if self.service_browser: try: self.service_browser.Free() - except dbus.DBusException, e: + except dbus.DBusException as e: log.debug(str(e)) self.service_browser._obj._bus = None self.service_browser._obj = None if self.domain_browser: try: self.domain_browser.Free() - except dbus.DBusException, e: + except dbus.DBusException as e: log.debug(str(e)) self.domain_browser._obj._bus = None self.domain_browser._obj = None diff --git a/src/common/zeroconf/zeroconf_bonjour.py b/src/common/zeroconf/zeroconf_bonjour.py index c8270c178..7d1566e34 100644 --- a/src/common/zeroconf/zeroconf_bonjour.py +++ b/src/common/zeroconf/zeroconf_bonjour.py @@ -24,7 +24,7 @@ from common.zeroconf.zeroconf import C_BARE_NAME, C_DOMAIN try: import pybonjour -except ImportError, e: +except ImportError as e: pass @@ -224,7 +224,7 @@ class Zeroconf: regtype = self.stype, port = self.port, txtRecord = self.txt, callBack = self.service_added_callback) self.service_sdRef = sdRef - except pybonjour.BonjourError, e: + except pybonjour.BonjourError as e: self.service_add_fail_callback(e) else: gajim.log.debug('Publishing service %s of type %s' % (self.name, self.stype)) @@ -248,7 +248,7 @@ class Zeroconf: self.service_sdRef.close() self.announced = False return True - except pybonjour.BonjourError, e: + except pybonjour.BonjourError as e: gajim.log.debug(e) return False @@ -282,7 +282,7 @@ class Zeroconf: gajim.log.debug('starting to browse') try: self.browse_sdRef = pybonjour.DNSServiceBrowse(regtype=self.stype, domain=domain, callBack=self.browse_callback) - except pybonjour.BonjourError, e: + except pybonjour.BonjourError as e: self.error_CB("Error while browsing: %s" % e) def browse_loop(self): diff --git a/src/config.py b/src/config.py index 8b22f571e..597c74876 100644 --- a/src/config.py +++ b/src/config.py @@ -173,7 +173,7 @@ class PreferencesWindow: if dir_ != '.svn': l.append(dir_) l.append(_('Disabled')) - for i in xrange(len(l)): + for i in range(len(l)): model.append([l[i]]) if gajim.config.get('emoticons_theme') == l[i]: emoticons_combobox.set_active(i) @@ -243,7 +243,7 @@ class PreferencesWindow: l.append(dir) if l.count == 0: l.append(' ') - for i in xrange(len(l)): + for i in range(len(l)): preview = Gtk.Image() files = [] files.append(os.path.join(helpers.get_iconset_path(l[i]), '16x16', @@ -455,8 +455,8 @@ class PreferencesWindow: else: config = gajim.config.get(opt_name + '_device') - for index, (name, value) in enumerate(sorted(device_dict.\ - iteritems(), key=key)): + for index, (name, value) in enumerate(sorted(device_dict.items(), + key=key)): model.append((name, value)) if config == value: combobox.set_active(index) @@ -684,7 +684,7 @@ class PreferencesWindow: def on_emoticons_combobox_changed(self, widget): active = widget.get_active() model = widget.get_model() - emot_theme = model[active][0].decode('utf-8') + emot_theme = model[active][0] if emot_theme == _('Disabled'): gajim.config.set('emoticons_theme', '') else: @@ -770,7 +770,7 @@ class PreferencesWindow: def on_theme_combobox_changed(self, widget): model = widget.get_model() active = widget.get_active() - config_theme = model[active][0].decode('utf-8').replace(' ', '_') + config_theme = model[active][0].replace(' ', '_') gajim.config.set('roster_theme', config_theme) @@ -800,7 +800,7 @@ class PreferencesWindow: def on_iconset_combobox_changed(self, widget): model = widget.get_model() active = widget.get_active() - icon_string = model[active][1].decode('utf-8') + icon_string = model[active][1] gajim.config.set('iconset', icon_string) gtkgui_helpers.reload_jabber_state_images() @@ -1019,7 +1019,7 @@ class PreferencesWindow: gajim.config.get('autoxatime') * 60) def on_auto_away_message_entry_changed(self, widget): - gajim.config.set('autoaway_message', widget.get_text().decode('utf-8')) + gajim.config.set('autoaway_message', widget.get_text()) def on_auto_xa_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'autoxa', @@ -1033,7 +1033,7 @@ class PreferencesWindow: gajim.config.get('autoxatime') * 60) def on_auto_xa_message_entry_changed(self, widget): - gajim.config.set('autoxa_message', widget.get_text().decode('utf-8')) + gajim.config.set('autoxa_message', widget.get_text()) def on_prompt_online_status_message_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'ask_online_status') @@ -1067,7 +1067,7 @@ class PreferencesWindow: def on_default_msg_treemodel_row_changed(self, model, path, iter_): status = model[iter_][0] - message = model[iter_][2].decode('utf-8') + message = model[iter_][2] message = helpers.to_one_line(message) gajim.config.set_per('defaultstatusmsg', status, 'enabled', model[iter_][3]) @@ -1084,20 +1084,18 @@ class PreferencesWindow: gajim.config.del_per('statusmsg', msg) iter_ = model.get_iter_first() while iter_: - val = model[iter_][0].decode('utf-8') + val = model[iter_][0] if model[iter_][1]: # we have a preset message if not val: # no title, use message text for title val = model[iter_][1] gajim.config.add_per('statusmsg', val) - msg = helpers.to_one_line(model[iter_][1].decode('utf-8')) + msg = helpers.to_one_line(model[iter_][1]) gajim.config.set_per('statusmsg', val, 'message', msg) i = 2 # store mood / activity for subname in ('activity', 'subactivity', 'activity_text', 'mood', 'mood_text'): val = model[iter_][i] - if val: - val = val.decode('utf-8') gajim.config.set_per('statusmsg', val, subname, val) i += 1 iter_ = model.iter_next(iter_) @@ -1111,7 +1109,7 @@ class PreferencesWindow: def on_av_combobox_changed(self, combobox, config_name): model = combobox.get_model() active = combobox.get_active() - device = model[active][1].decode('utf-8') + device = model[active][1] gajim.config.set(config_name, device) def on_audio_input_combobox_changed(self, widget): @@ -1137,7 +1135,7 @@ class PreferencesWindow: [self.xml.get_object('stun_server_entry')]) def stun_server_entry_changed(self, widget): - gajim.config.set('stun_server', widget.get_text().decode('utf-8')) + gajim.config.set('stun_server', widget.get_text()) def on_applications_combobox_changed(self, widget): if widget.get_active() == 0: @@ -1148,13 +1146,13 @@ class PreferencesWindow: self.xml.get_object('custom_apps_frame').show() def on_custom_browser_entry_changed(self, widget): - gajim.config.set('custombrowser', widget.get_text().decode('utf-8')) + gajim.config.set('custombrowser', widget.get_text()) def on_custom_mail_client_entry_changed(self, widget): - gajim.config.set('custommailapp', widget.get_text().decode('utf-8')) + gajim.config.set('custommailapp', widget.get_text()) def on_custom_file_manager_entry_changed(self, widget): - gajim.config.set('custom_file_manager', widget.get_text().decode('utf-8')) + gajim.config.set('custom_file_manager', widget.get_text()) def on_log_show_changes_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'log_contact_status_changes') @@ -1260,7 +1258,7 @@ class PreferencesWindow: def on_proxies_combobox_changed(self, widget): active = widget.get_active() - proxy = widget.get_model()[active][0].decode('utf-8') + proxy = widget.get_model()[active][0] if proxy == _('None'): proxy = '' @@ -1281,7 +1279,7 @@ class PreferencesWindow: model.clear() l = gajim.config.get_per('proxies') l.insert(0, _('None')) - for i in xrange(len(l)): + for i in range(len(l)): model.append([l[i]]) if our_proxy == l[i]: proxy_combobox.set_active(i) @@ -1357,11 +1355,11 @@ class ManageProxiesWindow: model = self.proxies_treeview.get_model() proxies = gajim.config.get_per('proxies') i = 1 - while ('proxy' + unicode(i)) in proxies: + while ('proxy' + str(i)) in proxies: i += 1 iter_ = model.append() - model.set(iter_, 0, 'proxy' + unicode(i)) - gajim.config.add_per('proxies', 'proxy' + unicode(i)) + model.set(iter_, 0, 'proxy' + str(i)) + gajim.config.add_per('proxies', 'proxy' + str(i)) self.proxies_treeview.set_cursor(model.get_path(iter_)) def on_remove_proxy_button_clicked(self, widget): @@ -1371,7 +1369,7 @@ class ManageProxiesWindow: (model, iter_) = sel.get_selected() if not iter_: return - proxy = model[iter_][0].decode('utf-8') + proxy = model[iter_][0] model.remove(iter_) gajim.config.del_per('proxies', proxy) self.xml.get_object('remove_proxy_button').set_sensitive(False) @@ -1386,7 +1384,7 @@ class ManageProxiesWindow: if self.block_signal: return act = widget.get_active() - proxy = self.proxyname_entry.get_text().decode('utf-8') + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'useauth', act) self.xml.get_object('proxyuser_entry').set_sensitive(act) self.xml.get_object('proxypass_entry').set_sensitive(act) @@ -1395,7 +1393,7 @@ class ManageProxiesWindow: if self.block_signal: return act = widget.get_active() - proxy = self.proxyname_entry.get_text().decode('utf-8') + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'bosh_useproxy', act) self.xml.get_object('proxyhost_entry').set_sensitive(act) self.xml.get_object('proxyport_entry').set_sensitive(act) @@ -1455,7 +1453,7 @@ class ManageProxiesWindow: self.xml.get_object('proxy_table').set_sensitive(True) proxyhost_entry.set_text(gajim.config.get_per('proxies', proxy, 'host')) - proxyport_entry.set_text(unicode(gajim.config.get_per('proxies', + proxyport_entry.set_text(str(gajim.config.get_per('proxies', proxy, 'port'))) proxyuser_entry.set_text(gajim.config.get_per('proxies', proxy, 'user')) @@ -1484,8 +1482,8 @@ class ManageProxiesWindow: (model, iter_) = sel.get_selected() if not iter_: return - old_name = model.get_value(iter_, 0).decode('utf-8') - new_name = widget.get_text().decode('utf-8') + old_name = model.get_value(iter_, 0) + new_name = widget.get_text() if new_name == '': return if new_name == old_name: @@ -1503,42 +1501,42 @@ class ManageProxiesWindow: types = ['http', 'socks5', 'bosh'] type_ = self.proxytype_combobox.get_active() self.show_bosh_fields(types[type_]=='bosh') - proxy = self.proxyname_entry.get_text().decode('utf-8') + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'type', types[type_]) def on_proxyhost_entry_changed(self, widget): if self.block_signal: return - value = widget.get_text().decode('utf-8') - proxy = self.proxyname_entry.get_text().decode('utf-8') + value = widget.get_text() + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'host', value) def on_proxyport_entry_changed(self, widget): if self.block_signal: return - value = widget.get_text().decode('utf-8') - proxy = self.proxyname_entry.get_text().decode('utf-8') + value = widget.get_text() + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'port', value) def on_proxyuser_entry_changed(self, widget): if self.block_signal: return - value = widget.get_text().decode('utf-8') - proxy = self.proxyname_entry.get_text().decode('utf-8') + value = widget.get_text() + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'user', value) def on_boshuri_entry_changed(self, widget): if self.block_signal: return - value = widget.get_text().decode('utf-8') - proxy = self.proxyname_entry.get_text().decode('utf-8') + value = widget.get_text() + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'bosh_uri', value) def on_proxypass_entry_changed(self, widget): if self.block_signal: return - value = widget.get_text().decode('utf-8') - proxy = self.proxyname_entry.get_text().decode('utf-8') + value = widget.get_text() + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'pass', value) @@ -1613,7 +1611,7 @@ class AccountsWindow: model = self.accounts_treeview.get_model() iter_ = model.get_iter_first() while iter_: - acct = model[iter_][0].decode('utf-8') + acct = model[iter_][0] if account == acct: self.accounts_treeview.set_cursor(model.get_path(iter_)) return @@ -1693,7 +1691,7 @@ class AccountsWindow: if sel: (model, iter_) = sel.get_selected() if iter_: - account = model[iter_][0].decode('utf-8') + account = model[iter_][0] else: account = None else: @@ -1768,7 +1766,7 @@ class AccountsWindow: proxy_combobox.set_model(model) l = gajim.config.get_per('proxies') l.insert(0, _('None')) - for i in xrange(len(l)): + for i in range(len(l)): model.append([l[i]]) if our_proxy == l[i]: proxy_combobox.set_active(i) @@ -1957,7 +1955,7 @@ class AccountsWindow: if not custom_port: custom_port = 5222 gajim.config.set_per('accounts', account, 'custom_port', custom_port) - self.xml.get_object('custom_port_entry1').set_text(unicode(custom_port)) + self.xml.get_object('custom_port_entry1').set_text(str(custom_port)) # Personal tab gpg_key_label = self.xml.get_object('gpg_key_label1') @@ -2163,7 +2161,7 @@ class AccountsWindow: # check if jid is conform to RFC and stringprep it try: jid = helpers.parse_jid(jid) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: if not widget.is_focus(): pritext = _('Invalid Jabber ID') dialogs.ErrorDialog(pritext, str(s)) @@ -2240,7 +2238,7 @@ class AccountsWindow: 'utf-8') try: resource = helpers.parse_resource(resource) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: if not widget.is_focus(): pritext = _('Invalid Jabber ID') dialogs.ErrorDialog(pritext, str(s)) @@ -2342,7 +2340,7 @@ class AccountsWindow: def on_proxies_combobox1_changed(self, widget): active = widget.get_active() - proxy = widget.get_model()[active][0].decode('utf-8') + proxy = widget.get_model()[active][0] if proxy == _('None'): proxy = '' @@ -2384,7 +2382,7 @@ class AccountsWindow: def on_custom_host_entry1_changed(self, widget): if self.ignore_events: return - host = widget.get_text().decode('utf-8') + host = widget.get_text() if self.option_changed('custom_host', host): self.need_relogin = True gajim.config.set_per('accounts', self.current_account, 'custom_host', @@ -2655,7 +2653,7 @@ class AccountsWindow: def on_first_name_entry2_changed(self, widget): if self.ignore_events: return - name = widget.get_text().decode('utf-8') + name = widget.get_text() if self.option_changed('zeroconf_first_name', name): self.need_relogin = True gajim.config.set_per('accounts', self.current_account, @@ -2664,7 +2662,7 @@ class AccountsWindow: def on_last_name_entry2_changed(self, widget): if self.ignore_events: return - name = widget.get_text().decode('utf-8') + name = widget.get_text() if self.option_changed('zeroconf_last_name', name): self.need_relogin = True gajim.config.set_per('accounts', self.current_account, @@ -2673,7 +2671,7 @@ class AccountsWindow: def on_jabber_id_entry2_changed(self, widget): if self.ignore_events: return - id_ = widget.get_text().decode('utf-8') + id_ = widget.get_text() if self.option_changed('zeroconf_jabber_id', id_): self.need_relogin = True gajim.config.set_per('accounts', self.current_account, @@ -2682,7 +2680,7 @@ class AccountsWindow: def on_email_entry2_changed(self, widget): if self.ignore_events: return - email = widget.get_text().decode('utf-8') + email = widget.get_text() if self.option_changed('zeroconf_email', email): self.need_relogin = True gajim.config.set_per('accounts', self.current_account, @@ -2733,7 +2731,7 @@ class FakeDataForm(Gtk.Table, object): def get_infos(self): for name in self.entries.keys(): - self.infos[name] = self.entries[name].get_text().decode('utf-8') + self.infos[name] = self.entries[name].get_text() return self.infos class ServiceRegistrationWindow: @@ -2906,7 +2904,7 @@ class GroupchatConfigWindow: def on_cell_edited(self, cell, path, new_text): model = self.affiliation_treeview['outcast'].get_model() - new_text = new_text.decode('utf-8') + new_text = new_text iter_ = model.get_iter(path) model[iter_][1] = new_text @@ -2984,12 +2982,12 @@ class GroupchatConfigWindow: iter_ = model.get_iter_first() # add new jid while iter_: - jid = model[iter_][0].decode('utf-8') + jid = model[iter_][0] actual_jid_list.append(jid) if jid not in self.start_users_dict[affiliation] or \ (affiliation == 'outcast' and 'reason' in self.start_users_dict[ affiliation][jid] and self.start_users_dict[affiliation][jid]\ - ['reason'] != model[iter_][1].decode('utf-8')): + ['reason'] != model[iter_][1]): users_dict[jid] = {'affiliation': affiliation} if affiliation == 'outcast': users_dict[jid]['reason'] = model[iter_][1].decode( @@ -3236,7 +3234,7 @@ class ManageBookmarksWindow: # No parent, so we got an account -> add to this. add_to = iter_ - account = model[add_to][1].decode('utf-8') + account = model[add_to][1] nick = gajim.nicks[account] iter_ = self.treestore.append(add_to, [account, _('New Group Chat'), '@', False, False, '', nick, 'in_and_out']) @@ -3269,8 +3267,8 @@ class ManageBookmarksWindow: #Account data can't be changed return - if self.server_entry.get_text().decode('utf-8') == '' or \ - self.room_entry.get_text().decode('utf-8') == '': + if self.server_entry.get_text() == '' or \ + self.room_entry.get_text() == '': dialogs.ErrorDialog(_('This bookmark has invalid data'), _('Please be sure to fill out server and room fields or remove this' ' bookmark.')) @@ -3290,34 +3288,26 @@ class ManageBookmarksWindow: return for account in self.treestore: - account_unicode = account[1].decode('utf-8') - gajim.connections[account_unicode].bookmarks = [] + acct = account[1] + gajim.connections[acct].bookmarks = [] for bm in account.iterchildren(): # Convert True/False/None to '1' or '0' - autojoin = unicode(int(bm[3])) - minimize = unicode(int(bm[4])) + autojoin = str(int(bm[3])) + minimize = str(int(bm[4])) name = bm[1] - if name: - name = name.decode('utf-8') jid = bm[2] - if jid: - jid = jid.decode('utf-8') pw = bm[5] - if pw: - pw = pw.decode('utf-8') nick = bm[6] - if nick: - nick = nick.decode('utf-8') # create the bookmark-dict bmdict = { 'name': name, 'jid': jid, 'autojoin': autojoin, 'minimize': minimize, 'password': pw, 'nick': nick, 'print_status': bm[7]} - gajim.connections[account_unicode].bookmarks.append(bmdict) + gajim.connections[acct].bookmarks.append(bmdict) - gajim.connections[account_unicode].store_bookmarks() + gajim.connections[acct].store_bookmarks() gajim.interface.roster.set_actions_menu_needs_rebuild() self.window.destroy() @@ -3353,7 +3343,7 @@ class ManageBookmarksWindow: # Fill in the data for childs self.title_entry.set_text(model[iter_][1]) - room_jid = model[iter_][2].decode('utf-8') + room_jid = model[iter_][2] (room, server) = room_jid.split('@') self.room_entry.set_text(room) self.server_entry.set_text(server) @@ -3364,7 +3354,7 @@ class ManageBookmarksWindow: self.minimize_checkbutton.set_sensitive(model[iter_][3]) if model[iter_][5] is not None: - password = model[iter_][5].decode('utf-8') + password = model[iter_][5] else: password = None @@ -3374,7 +3364,6 @@ class ManageBookmarksWindow: self.pass_entry.set_text('') nick = model[iter_][6] if nick: - nick = nick.decode('utf-8') self.nick_entry.set_text(nick) else: self.nick_entry.set_text('') @@ -3393,10 +3382,10 @@ class ManageBookmarksWindow: def on_nick_entry_changed(self, widget): (model, iter_) = self.selection.get_selected() if iter_: - nick = self.nick_entry.get_text().decode('utf-8') + nick = self.nick_entry.get_text() try: nick = helpers.parse_resource(nick) - except helpers.InvalidFormat, e: + except helpers.InvalidFormat as e: dialogs.ErrorDialog(_('Invalid nickname'), _('Character not allowed')) self.nick_entry.set_text(model[iter_][6]) @@ -3407,16 +3396,16 @@ class ManageBookmarksWindow: (model, iter_) = self.selection.get_selected() if not iter_: return - server = widget.get_text().decode('utf-8') + server = widget.get_text() if '@' in server: dialogs.ErrorDialog(_('Invalid server'), _('Character not allowed')) widget.set_text(server.replace('@', '')) - room_jid = self.room_entry.get_text().decode('utf-8').strip() + '@' + \ + room_jid = self.room_entry.get_text().strip() + '@' + \ server.strip() try: room_jid = helpers.parse_resource(room_jid) - except helpers.InvalidFormat, e: + except helpers.InvalidFormat as e: dialogs.ErrorDialog(_('Invalid server'), _('Character not allowed')) self.server_entry.set_text(model[iter_][2].split('@')[1]) @@ -3427,15 +3416,15 @@ class ManageBookmarksWindow: (model, iter_) = self.selection.get_selected() if not iter_: return - room = widget.get_text().decode('utf-8') + room = widget.get_text() if '@' in room: dialogs.ErrorDialog(_('Invalid server'), _('Character not allowed')) widget.set_text(room.replace('@', '')) room_jid = room.strip() + '@' + \ - self.server_entry.get_text().decode('utf-8').strip() + self.server_entry.get_text().strip() try: room_jid = helpers.parse_resource(room_jid) - except helpers.InvalidFormat, e: + except helpers.InvalidFormat as e: dialogs.ErrorDialog(_('Invalid room'), _('Character not allowed')) self.room_entry.set_text(model[iter_][2].split('@')[0]) @@ -3641,7 +3630,7 @@ class AccountCreationWizardWindow: dialogs.ErrorDialog(pritext, sectext) return server = self.xml.get_object('server_comboboxentry').get_child().\ - get_text().decode('utf-8').strip() + get_text().strip() savepass = self.xml.get_object('save_password_checkbutton').\ get_active() password = self.xml.get_object('password_entry').get_text().decode( @@ -3655,7 +3644,7 @@ class AccountCreationWizardWindow: # check if jid is conform to RFC and stringprep it try: jid = helpers.parse_jid(jid) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: pritext = _('Invalid Jabber ID') dialogs.ErrorDialog(pritext, str(s)) return @@ -3675,7 +3664,7 @@ class AccountCreationWizardWindow: elif cur_page == 2: # We are creating a new account server = self.xml.get_object('server_comboboxentry1').get_child().\ - get_text().decode('utf-8') + get_text() if not server: dialogs.ErrorDialog(_('Invalid server'), @@ -3691,7 +3680,7 @@ class AccountCreationWizardWindow: # Get advanced options proxies_combobox = self.xml.get_object('proxies_combobox') active = proxies_combobox.get_active() - proxy = proxies_combobox.get_model()[active][0].decode('utf-8') + proxy = proxies_combobox.get_model()[active][0] if proxy == _('None'): proxy = '' config['proxy'] = proxy @@ -3707,7 +3696,7 @@ class AccountCreationWizardWindow: return config['custom_port'] = custom_port config['custom_host'] = self.xml.get_object( - 'custom_host_entry').get_text().decode('utf-8') + 'custom_host_entry').get_text() if self.xml.get_object('anonymous_checkbutton2').get_active(): self.modify = True @@ -3768,7 +3757,7 @@ class AccountCreationWizardWindow: proxies_combobox.set_model(model) l = gajim.config.get_per('proxies') l.insert(0, _('None')) - for i in xrange(len(l)): + for i in range(len(l)): model.append([l[i]]) proxies_combobox.set_active(0) @@ -4161,11 +4150,11 @@ class ManageSoundsWindow: self.window.show_all() def on_sounds_treemodel_row_changed(self, model, path, iter_): - sound_event = model[iter_][3].decode('utf-8') + sound_event = model[iter_][3] gajim.config.set_per('soundevents', sound_event, 'enabled', - bool(model[path][0])) + bool(model[path][0])) gajim.config.set_per('soundevents', sound_event, 'path', - model[iter_][2].decode('utf-8')) + model[iter_][2]) def sound_toggled_cb(self, cell, path): model = self.sound_tree.get_model() @@ -4238,7 +4227,7 @@ class ManageSoundsWindow: def on_cancel(widget): self.dialog.destroy() - path_to_snd_file = model[iter_][2].decode('utf-8') + path_to_snd_file = model[iter_][2] self.dialog = dialogs.SoundChooserDialog(path_to_snd_file, on_ok, on_cancel) diff --git a/src/conversation_textview.py b/src/conversation_textview.py index 06e7ed800..4b1550fd2 100644 --- a/src/conversation_textview.py +++ b/src/conversation_textview.py @@ -39,7 +39,7 @@ import os import tooltips import dialogs import locale -import Queue +import queue import urllib import gtkgui_helpers @@ -336,7 +336,7 @@ class ConversationTextview(GObject.GObject): # One mark at the begining then 2 marks between each lines size = gajim.config.get('max_conversation_lines') size = 2 * size - 1 - self.marks_queue = Queue.Queue(size) + self.marks_queue = queue.Queue(size) self.allow_focus_out_line = True # holds a mark at the end of --- line @@ -711,7 +711,7 @@ class ConversationTextview(GObject.GObject): buffer_.delete(start, end) size = gajim.config.get('max_conversation_lines') size = 2 * size - 1 - self.marks_queue = Queue.Queue(size) + self.marks_queue = queue.Queue(size) self.focus_out_end_mark = None self.just_cleared = True @@ -1173,7 +1173,7 @@ class ConversationTextview(GObject.GObject): all_tags = [(ttt.lookup(t) if isinstance(t, str) else t) for t in all_tags] buffer_.insert_with_tags(end_iter, special_text, *all_tags) if 'url' in tags: - puny_text = puny_encode(special_text) + puny_text = puny_encode(special_text).decode('utf-8') if not puny_text.endswith('-'): end_iter = buffer_.get_end_iter() buffer_.insert(end_iter, " (%s)" % puny_text) @@ -1315,10 +1315,6 @@ class ConversationTextview(GObject.GObject): timestamp_str = helpers.from_one_line(timestamp_str) format_ += timestamp_str tim_format = time.strftime(format_, tim) - if locale.getpreferredencoding() not in ('KOI8-R', 'cp1251'): - # if tim_format comes as unicode because of day_str. - # we convert it to the encoding that we want (and that is utf-8) - tim_format = helpers.ensure_utf8_string(tim_format) return tim_format def detect_other_text_tag(self, text, kind): @@ -1372,7 +1368,7 @@ class ConversationTextview(GObject.GObject): xhtml = xhtml.replace('/me', '* %s' % (name,), 1) self.tv.display_html(xhtml.encode('utf-8'), self) return - except Exception, e: + except Exception as e: gajim.log.debug('Error processing xhtml' + str(e)) gajim.log.debug('with |' + xhtml + '|') diff --git a/src/dataforms_widget.py b/src/dataforms_widget.py index 425a42ec3..1d17be1de 100644 --- a/src/dataforms_widget.py +++ b/src/dataforms_widget.py @@ -75,7 +75,7 @@ class DataFormWidget(Gtk.Alignment, object): selection.set_mode(Gtk.SelectionMode.MULTIPLE) def on_data_form_vbox_key_press_event(self, widget, event): - print 'key pressed' + print('key pressed') def set_data_form(self, dataform): """ @@ -113,13 +113,13 @@ class DataFormWidget(Gtk.Alignment, object): def get_title(self): """ - Get the title of data form, as a unicode object. If no title or no form, - returns u''. Useful for setting window title + Get the title of data form. If no title or no form, + returns ''. Useful for setting window title """ if self._data_form is not None: if self._data_form.title is not None: return self._data_form.title - return u'' + return '' title = property(get_title, None, None, 'Data form title') @@ -277,7 +277,7 @@ class DataFormWidget(Gtk.Alignment, object): selection = self.records_treeview.get_selection() model, rowrefs = selection.get_selected_rows() # rowref is a list of paths - for i in xrange(len(rowrefs)): + for i in list(range(len(rowrefs))): rowrefs[i] = Gtk.TreeRowReference(model, rowrefs[i]) # rowref is a list of row references; need to convert because we will # modify the model, paths would change @@ -540,7 +540,7 @@ class SingleForm(Gtk.Table, object): field) widget.set_sensitive(readwrite) if field.value is None: - field.value = u'' + field.value = '' widget.set_text(field.value) else: commonwidget=False @@ -629,7 +629,7 @@ class SingleForm(Gtk.Table, object): return try: newtext = helpers.parse_jid(newtext) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: dialogs.ErrorDialog(_('Invalid Jabber ID'), str(s)) return if newtext in field.values: diff --git a/src/dialogs.py b/src/dialogs.py index dad6765f5..cdcb7c252 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -127,7 +127,7 @@ class EditGroupsDialog: gajim.interface.roster.draw_group(_('General'), account) def on_add_button_clicked(self, widget): - group = self.xml.get_object('group_entry').get_text().decode('utf-8') + group = self.xml.get_object('group_entry').get_text() if not group: return # Do not allow special groups @@ -137,7 +137,7 @@ class EditGroupsDialog: model = self.treeview.get_model() iter_ = model.get_iter_first() while iter_: - if model.get_value(iter_, 0).decode('utf-8') == group: + if model.get_value(iter_, 0) == group: return iter_ = model.iter_next(iter_) self.changes_made = True @@ -153,7 +153,7 @@ class EditGroupsDialog: model[path][1] = True else: model[path][1] = not model[path][1] - group = model[path][0].decode('utf-8') + group = model[path][0] if model[path][1]: self.add_group(group) else: @@ -251,7 +251,7 @@ class PassphraseDialog: if not self.ok_handler: return - passph = self.passphrase_entry.get_text().decode('utf-8') + passph = self.passphrase_entry.get_text() if self.check: checked = self.xml.get_object('save_passphrase_checkbutton').\ @@ -325,8 +325,7 @@ class ChooseGPGKeyDialog: selection = self.keys_treeview.get_selection() (model, iter_) = selection.get_selected() if iter_ and response == Gtk.ResponseType.OK: - keyID = [ model[iter_][0].decode('utf-8'), - model[iter_][1].decode('utf-8') ] + keyID = [ model[iter_][0], model[iter_][1] ] else: keyID = None self.on_response(keyID) @@ -458,7 +457,7 @@ class ChangeActivityDialog: """ if self.checkbutton.get_active(): self.on_response(self.activity, self.subactivity, - self.entry.get_text().decode('utf-8')) + self.entry.get_text()) else: self.on_response(None, None, '') self.window.destroy() @@ -541,7 +540,7 @@ class ChangeMoodDialog: def on_ok_button_clicked(self, widget): '''Return mood and messsage (None if no mood selected)''' - message = self.entry.get_text().decode('utf-8') + message = self.entry.get_text() self.on_response(self.mood, message) self.window.destroy() @@ -713,8 +712,7 @@ class ChangeStatusMessageDialog(TimeoutDialog): def on_dialog_response(self, dialog, response): if response == Gtk.ResponseType.OK: beg, end = self.message_buffer.get_bounds() - message = self.message_buffer.get_text(beg, end, True).decode('utf-8')\ - .strip() + message = self.message_buffer.get_text(beg, end, True).strip() message = helpers.remove_invalid_xml_chars(message) msg = helpers.to_one_line(message) if self.show: @@ -742,7 +740,7 @@ class ChangeStatusMessageDialog(TimeoutDialog): active = widget.get_active() if active < 0: return None - name = model[active][0].decode('utf-8') + name = model[active][0] self.message_buffer.set_text(self.preset_messages_dict[name][0]) self.pep_dict['activity'] = self.preset_messages_dict[name][1] self.pep_dict['subactivity'] = self.preset_messages_dict[name][2] @@ -778,10 +776,10 @@ class ChangeStatusMessageDialog(TimeoutDialog): status_message_to_save_as_preset = self.message_buffer.get_text( start_iter, finish_iter, True) def on_ok(msg_name): - msg_text = status_message_to_save_as_preset.decode('utf-8') + msg_text = status_message_to_save_as_preset msg_text_1l = helpers.to_one_line(msg_text) if not msg_name: # msg_name was '' - msg_name = msg_text_1l.decode('utf-8') + msg_name = msg_text_1l def on_ok2(): self.preset_messages_dict[msg_name] = [ @@ -1034,7 +1032,7 @@ class AddNewContactWindow: self._nec_gateway_prompt_received) def on_register_button_clicked(self, widget): - jid = self.protocol_jid_combobox.get_active_text().decode('utf-8') + jid = self.protocol_jid_combobox.get_active_text() gajim.connections[self.account].request_register_agent_info(jid) def on_add_new_contact_window_key_press_event(self, widget, event): @@ -1051,7 +1049,7 @@ class AddNewContactWindow: """ When Subscribe button is clicked """ - jid = self.uid_entry.get_text().decode('utf-8').strip() + jid = self.uid_entry.get_text().strip() if not jid: return @@ -1075,7 +1073,7 @@ class AddNewContactWindow: # check if jid is conform to RFC and stringprep it try: jid = helpers.parse_jid(jid) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: pritext = _('Invalid User ID') ErrorDialog(pritext, str(s)) return @@ -1091,7 +1089,7 @@ class AddNewContactWindow: ErrorDialog(pritext, _('You cannot add yourself to your roster.')) return - nickname = self.nickname_entry.get_text().decode('utf-8') or '' + nickname = self.nickname_entry.get_text() or '' # get value of account combobox, if account was not specified if not self.account: model = self.account_combobox.get_model() @@ -1110,14 +1108,14 @@ class AddNewContactWindow: message_buffer = self.message_textview.get_buffer() start_iter = message_buffer.get_start_iter() end_iter = message_buffer.get_end_iter() - message = message_buffer.get_text(start_iter, end_iter, True).decode('utf-8') + message = message_buffer.get_text(start_iter, end_iter, True) if self.save_message_checkbutton.get_active(): msg = helpers.to_one_line(message) gajim.config.set_per('accounts', self.account, 'subscription_request_msg', msg) else: message= '' - group = self.group_comboboxentry.get_child().get_text().decode('utf-8') + group = self.group_comboboxentry.get_child().get_text() groups = [] if group: groups = [group] @@ -1268,7 +1266,7 @@ class AboutDialog: dlg.set_transient_for(gajim.interface.roster.window) dlg.set_name('Gajim') dlg.set_version(gajim.version) - s = u'Copyright © 2003-2012 Gajim Team' + s = 'Copyright © 2003-2012 Gajim Team' dlg.set_copyright(s) copying_file_path = self.get_path('COPYING') if copying_file_path: @@ -1299,13 +1297,12 @@ class AboutDialog: if thanks_file_path: authors.append('\n' + _('THANKS:')) - text = helpers.ensure_utf8_string(open(thanks_file_path).read()) + text = open(thanks_file_path).read() text_splitted = text.split('\n') text = '\n'.join(text_splitted[:-2]) # remove one english sentence # and add it manually as translatable - text += helpers.ensure_utf8_string('\n%s\n' % _('Last but not ' - 'least, we would like to thank all the package maintainers.' - )) + text += '\n%s\n' % _('Last but not least, we would like to ' + 'thank all the package maintainers.') authors.append(text) dlg.set_authors(authors) @@ -2007,7 +2004,7 @@ class InputDialog(CommonInputDialog): self.input_entry.select_region(0, -1) # select all def get_text(self): - return self.input_entry.get_text().decode('utf-8') + return self.input_entry.get_text() class InputDialogCheck(InputDialog): """ @@ -2033,7 +2030,7 @@ class InputDialogCheck(InputDialog): def on_okbutton_clicked(self, widget): user_input = self.get_text() if user_input: - user_input = user_input.decode('utf-8') + user_input = user_input self.cancel_handler = None self.dialog.destroy() if isinstance(self.ok_handler, tuple): @@ -2042,7 +2039,7 @@ class InputDialogCheck(InputDialog): self.ok_handler(user_input, self.is_checked()) def get_text(self): - return self.input_entry.get_text().decode('utf-8') + return self.input_entry.get_text() def is_checked(self): """ @@ -2111,7 +2108,7 @@ class ChangeNickDialog(InputDialogCheck): def on_okbutton_clicked(self, widget): nick = self.get_text() if nick: - nick = nick.decode('utf-8') + nick = nick # send presence to room try: nick = helpers.parse_resource(nick) @@ -2163,7 +2160,7 @@ class InputTextDialog(CommonInputDialog): def get_text(self): start_iter, end_iter = self.input_buffer.get_bounds() - return self.input_buffer.get_text(start_iter, end_iter, True).decode('utf-8') + return self.input_buffer.get_text(start_iter, end_iter, True) class DoubleInputDialog: """ @@ -2208,8 +2205,8 @@ class DoubleInputDialog: self.cancel_handler() def on_okbutton_clicked(self, widget): - user_input1 = self.input_entry1.get_text().decode('utf-8') - user_input2 = self.input_entry2.get_text().decode('utf-8') + user_input1 = self.input_entry1.get_text() + user_input2 = self.input_entry2.get_text() self.cancel_handler = None self.dialog.destroy() if not self.ok_handler: @@ -2325,13 +2322,13 @@ class JoinGroupchatWindow: if room_jid != '' and room_jid in gajim.gc_connected[account] and\ gajim.gc_connected[account][room_jid]: ErrorDialog(_('You are already in group chat %s') % room_jid) - raise GajimGeneralException, 'You are already in this group chat' + raise GajimGeneralException('You are already in this group chat') if nick == '': nick = gajim.nicks[account] if gajim.connections[account].connected < 2: ErrorDialog(_('You are not connected to the server'), _('You can not join a group chat unless you are connected.')) - raise GajimGeneralException, 'You must be connected to join a groupchat' + raise GajimGeneralException('You must be connected to join a groupchat') self.xml = gtkgui_helpers.get_gtk_builder('join_groupchat_window.ui') @@ -2464,7 +2461,7 @@ class JoinGroupchatWindow: def on_account_combobox_changed(self, widget): model = widget.get_model() iter_ = widget.get_active_iter() - self.account = model[iter_][0].decode('utf-8') + self.account = model[iter_][0] self.on_required_entry_changed(self._nickname_entry) def _set_room_jid(self, room_jid): @@ -2477,11 +2474,11 @@ class JoinGroupchatWindow: def on_recently_combobox_changed(self, widget): model = widget.get_model() iter_ = widget.get_active_iter() - room_jid = model[iter_][0].decode('utf-8') + room_jid = model[iter_][0] self._set_room_jid(room_jid) def on_browse_rooms_button_clicked(self, widget): - server = self.server_comboboxentry.get_child().get_text().decode('utf-8') + server = self.server_comboboxentry.get_child().get_text() if server in gajim.interface.instances[self.account]['disco']: gajim.interface.instances[self.account]['disco'][server].window.\ present() @@ -2517,13 +2514,13 @@ class JoinGroupchatWindow: _('You have to choose an account from which you want to join the ' 'groupchat.')) return - nickname = self._nickname_entry.get_text().decode('utf-8') + nickname = self._nickname_entry.get_text() row = self.server_comboboxentry.get_child().get_displayed_row() model = self.server_comboboxentry.get_model() - server = model[row][0].decode('utf-8').strip() + server = model[row][0].strip() room = self._room_jid_entry.get_text().decode('utf-8').strip() room_jid = room + '@' + server - password = self._password_entry.get_text().decode('utf-8') + password = self._password_entry.get_text() try: nickname = helpers.parse_resource(nickname) except Exception: @@ -2578,7 +2575,7 @@ class SynchroniseSelectAccountDialog: if not account or gajim.connections[account].connected < 2: ErrorDialog(_('You are not connected to the server'), _('Without a connection, you can not synchronise your contacts.')) - raise GajimGeneralException, 'You are not connected to the server' + raise GajimGeneralException('You are not connected to the server') self.account = account self.xml = gtkgui_helpers.get_gtk_builder('synchronise_select_account_dialog.ui') self.dialog = self.xml.get_object('synchronise_select_account_dialog') @@ -2623,7 +2620,7 @@ class SynchroniseSelectAccountDialog: (model, iter_) = sel.get_selected() if not iter_: return - remote_account = model.get_value(iter_, 0).decode('utf-8') + remote_account = model.get_value(iter_, 0) if gajim.connections[remote_account].connected < 2: ErrorDialog(_('This account is not connected to the server'), @@ -2696,7 +2693,7 @@ class SynchroniseSelectContactsDialog: while iter_: if model[iter_][0]: # it is selected - remote_jid = model[iter_][1].decode('utf-8') + remote_jid = model[iter_][1] message = 'I\'m synchronizing my contacts from my %s account, could you please add this address to your contact list?' % \ gajim.get_hostname_from_account(self.remote_account) remote_contact = gajim.contacts.get_first_contact_from_jid( @@ -2753,7 +2750,7 @@ class NewChatDialog(InputDialog): else: try: jid = helpers.parse_jid(jid) - except helpers.InvalidFormat, e: + except helpers.InvalidFormat as e: ErrorDialog(_('Invalid JID'), e[0]) return except: @@ -2767,7 +2764,7 @@ class ChangePasswordDialog: if not account or gajim.connections[account].connected < 2: ErrorDialog(_('You are not connected to the server'), _('Without a connection, you can not change your password.')) - raise GajimGeneralException, 'You are not connected to the server' + raise GajimGeneralException('You are not connected to the server') self.account = account self.on_response = on_response self.xml = gtkgui_helpers.get_gtk_builder('change_password_dialog.ui') @@ -2783,11 +2780,11 @@ class ChangePasswordDialog: dialog.destroy() self.on_response(None) return - password1 = self.password1_entry.get_text().decode('utf-8') + password1 = self.password1_entry.get_text() if not password1: ErrorDialog(_('Invalid password'), _('You must enter a password.')) return - password2 = self.password2_entry.get_text().decode('utf-8') + password2 = self.password2_entry.get_text() if password1 != password2: ErrorDialog(_('Passwords do not match'), _('The passwords typed in both fields must be identical.')) @@ -3123,7 +3120,7 @@ class SingleMessageWindow: def update_char_counter(self, widget): characters_no = self.message_tv_buffer.get_char_count() - self.count_chars_label.set_text(unicode(characters_no)) + self.count_chars_label.set_text(characters_no) def send_single_message(self): if gajim.connections[self.account].connected <= 1: @@ -3139,7 +3136,7 @@ class SingleMessageWindow: else: sender_list.append(i[0].jid) else: - sender_list = [self.to_entry.get_text().decode('utf-8')] + sender_list = [self.to_entry.get_text()] for to_whom_jid in sender_list: if to_whom_jid in self.completion_dict: @@ -3152,9 +3149,9 @@ class SingleMessageWindow: 'valid.') % to_whom_jid) return True - subject = self.subject_entry.get_text().decode('utf-8') + subject = self.subject_entry.get_text() begin, end = self.message_tv_buffer.get_bounds() - message = self.message_tv_buffer.get_text(begin, end, True).decode('utf-8') + message = self.message_tv_buffer.get_text(begin, end, True) if '/announce/' in to_whom_jid: gajim.connections[self.account].send_motd(to_whom_jid, subject, @@ -3561,14 +3558,14 @@ class RosterItemExchangeWindow: if model[iter_][0]: a+=1 # it is selected - #remote_jid = model[iter_][1].decode('utf-8') + #remote_jid = model[iter_][1] message = _('%s suggested me to add you in my roster.' % self.jid_from) # keep same groups and same nickname groups = model[iter_][3].split(', ') if groups == ['']: groups = [] - jid = model[iter_][1].decode('utf-8') + jid = model[iter_][1] if gajim.jid_is_transport(self.jid_from): gajim.connections[self.account].automatically_added.append( jid) @@ -3584,7 +3581,7 @@ class RosterItemExchangeWindow: if model[iter_][0]: a+=1 # it is selected - jid = model[iter_][1].decode('utf-8') + jid = model[iter_][1] # keep same groups and same nickname groups = model[iter_][3].split(', ') if groups == ['']: @@ -3609,7 +3606,7 @@ class RosterItemExchangeWindow: if model[iter_][0]: a+=1 # it is selected - jid = model[iter_][1].decode('utf-8') + jid = model[iter_][1] gajim.connections[self.account].unsubscribe(jid) gajim.interface.roster.remove_contact(jid, self.account) gajim.contacts.remove_jid(self.account, jid) @@ -3685,7 +3682,7 @@ class ItemArchivingPreferencesWindow: if self.item != 'Default': try: item = helpers.parse_jid(item) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: pritext = _('Invalid User ID') ErrorDialog(pritext, str(s)) return @@ -4164,7 +4161,7 @@ class PrivacyListWindow: self.active_rule = '' else: self.active_rule = \ - self.list_of_rules_combobox.get_active_text().decode('utf-8') + self.list_of_rules_combobox.get_active_text() if self.active_rule != '': rule_info = self.global_rules[self.active_rule] self.edit_order_spinbutton.set_value(int(rule_info['order'])) @@ -4822,7 +4819,6 @@ class AddSpecialNotificationDialog: if active == 1: # user selected 'choose sound' def on_ok(widget, path_to_snd_file): pass - #print path_to_snd_file def on_cancel(widget): widget.set_active(0) # go back to No Sound @@ -4954,7 +4950,7 @@ class TransformChatToMUC: def on_invite_button_clicked(self, widget): row = self.server_list_comboboxentry.get_child().get_displayed_row() model = self.server_list_comboboxentry.get_model() - server = model[row][0].decode('utf-8').strip() + server = model[row][0].strip() if server == '': return gajim.connections[self.account].check_unique_room_id_support(server, self) @@ -4966,7 +4962,7 @@ class TransformChatToMUC: guests = self.guests_treeview.get_selection().get_selected_rows() for guest in guests[1]: iter_ = self.store.get_iter(guest) - guest_list.append(self.store[iter_][2].decode('utf-8')) + guest_list.append(self.store[iter_][2]) for guest in self.auto_jids: guest_list.append(guest) room_jid = obj.room_id + '@' + obj.server diff --git a/src/disco.py b/src/disco.py index c3a51f7a9..9eb75e616 100644 --- a/src/disco.py +++ b/src/disco.py @@ -193,7 +193,6 @@ class CacheDictionary: def __contains__(self, key): return key in self.cache - has_key = __contains__ _icon_cache = CacheDictionary(15) @@ -223,7 +222,7 @@ class Closure(object): self.removeargs = removeargs if isinstance(cb, types.MethodType): self.meth_self = weakref.ref(cb.im_self, self._remove) - self.meth_name = cb.func_name + self.meth_name = cb.__name__ elif callable(cb): self.meth_self = None self.cb = weakref.ref(cb, self._remove) @@ -515,7 +514,7 @@ class ServiceDiscoveryWindow(object): if gajim.connections[account].connected < 2: dialogs.ErrorDialog(_('You are not connected to the server'), _('Without a connection, you can not browse available services')) - raise RuntimeError, 'You must be connected to browse services' + raise RuntimeError('You must be connected to browse services') # Get a ServicesCache object. try: @@ -800,20 +799,20 @@ _('This type of service does not contain any items to browse.')) def on_address_comboboxentry_changed(self, widget): if self.address_comboboxentry.get_active() != -1: # user selected one of the entries so do auto-visit - jid = self.address_comboboxentry.get_child().get_text().decode('utf-8') + jid = self.address_comboboxentry.get_child().get_text() try: jid = helpers.parse_jid(jid) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: pritext = _('Invalid Server Name') dialogs.ErrorDialog(pritext, str(s)) return self.travel(jid, '') def on_go_button_clicked(self, widget): - jid = self.address_comboboxentry.get_child().get_text().decode('utf-8') + jid = self.address_comboboxentry.get_child().get_text() try: jid = helpers.parse_jid(jid) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: pritext = _('Invalid Server Name') dialogs.ErrorDialog(pritext, str(s)) return @@ -998,9 +997,9 @@ class AgentBrowser: model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - jid = model[iter_][0].decode('utf-8') + jid = model[iter_][0] if jid: - node = model[iter_][1].decode('utf-8') + node = model[iter_][1] self.window.open(jid, node) def update_actions(self): @@ -1012,8 +1011,8 @@ class AgentBrowser: model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - jid = model[iter_][0].decode('utf-8') - node = model[iter_][1].decode('utf-8') + jid = model[iter_][0] + node = model[iter_][1] if jid: self.cache.get_info(jid, node, self._update_actions, nofetch = True) @@ -1035,8 +1034,8 @@ class AgentBrowser: model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - jid = model[iter_][0].decode('utf-8') - node = model[iter_][1].decode('utf-8') + jid = model[iter_][0] + node = model[iter_][1] if jid: self.cache.get_info(jid, node, self._default_action, nofetch = True) @@ -1077,8 +1076,8 @@ class AgentBrowser: """ iter_ = self.model.get_iter_first() while iter_: - cjid = self.model.get_value(iter_, 0).decode('utf-8') - cnode = self.model.get_value(iter_, 1).decode('utf-8') + cjid = self.model.get_value(iter_, 0) + cnode = self.model.get_value(iter_, 1) if jid == cjid and node == cnode: break iter_ = self.model.iter_next(iter_) @@ -1226,10 +1225,10 @@ class ToplevelAgentBrowser(AgentBrowser): # These can be None, apparently descr1 = model.get_value(iter1, 3) if descr1: - descr1 = descr1.decode('utf-8') + descr1 = descr1 descr2 = model.get_value(iter2, 3) if descr2: - descr2 = descr2.decode('utf-8') + descr2 = descr2 # Compare strings return cmp(descr1, descr2) return statecmp @@ -1402,7 +1401,7 @@ class ToplevelAgentBrowser(AgentBrowser): model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - service = model[iter_][0].decode('utf-8') + service = model[iter_][0] if service in gajim.interface.instances[self.account]['search']: gajim.interface.instances[self.account]['search'][service].window.\ present() @@ -1428,8 +1427,8 @@ class ToplevelAgentBrowser(AgentBrowser): model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - service = model[iter_][0].decode('utf-8') - node = model[iter_][1].decode('utf-8') + service = model[iter_][0] + node = model[iter_][1] adhoc_commands.CommandWindow(self.account, service, commandnode=node) def on_register_button_clicked(self, widget = None): @@ -1440,7 +1439,7 @@ class ToplevelAgentBrowser(AgentBrowser): model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - jid = model[iter_][0].decode('utf-8') + jid = model[iter_][0] if jid: gajim.connections[self.account].request_register_agent_info(jid) self.window.destroy(chain = True) @@ -1453,7 +1452,7 @@ class ToplevelAgentBrowser(AgentBrowser): model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - service = model[iter_][0].decode('utf-8') + service = model[iter_][0] if 'join_gc' not in gajim.interface.instances[self.account]: try: dialogs.JoinGroupchatWindow(self.account, service) @@ -1486,7 +1485,7 @@ class ToplevelAgentBrowser(AgentBrowser): self.register_button.set_sensitive(True) # Guess what kind of service we're dealing with if self.browse_button: - jid = model[iter_][0].decode('utf-8') + jid = model[iter_][0] type_ = gajim.get_transport_name_from_jid(jid, use_config_setting = False) if type_: @@ -1614,7 +1613,7 @@ class ToplevelAgentBrowser(AgentBrowser): cat = self._friendly_category(cat, type_)[0] iter_ = self.model.get_iter_first() while iter_: - if self.model.get_value(iter_, 3).decode('utf-8') == cat: + if self.model.get_value(iter_, 3) == cat: break iter_ = self.model.iter_next(iter_) if iter_: @@ -1627,8 +1626,8 @@ class ToplevelAgentBrowser(AgentBrowser): while cat_iter and not iter_: iter_ = self.model.iter_children(cat_iter) while iter_: - cjid = self.model.get_value(iter_, 0).decode('utf-8') - cnode = self.model.get_value(iter_, 1).decode('utf-8') + cjid = self.model.get_value(iter_, 0) + cnode = self.model.get_value(iter_, 1) if jid == cjid and node == cnode: break iter_ = self.model.iter_next(iter_) @@ -1699,7 +1698,7 @@ class ToplevelAgentBrowser(AgentBrowser): # Check if we have to move categories old_cat_iter = self.model.iter_parent(iter_) - old_cat = self.model.get_value(old_cat_iter, 3).decode('utf-8') + old_cat = self.model.get_value(old_cat_iter, 3) if self.model.get_value(old_cat_iter, 3) == cat: # Already in the right category, just update self.model[iter_][2] = pix @@ -1819,7 +1818,7 @@ class MucBrowser(AgentBrowser): if not iter: return name = gajim.config.get_per('accounts', self.account, 'name') - room_jid = model[iter][0].decode('utf-8') + room_jid = model[iter][0] bm = { 'name': room_jid.split('@')[0], 'jid': room_jid, @@ -1853,7 +1852,7 @@ class MucBrowser(AgentBrowser): model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - service = model[iter_][0].decode('utf-8') + service = model[iter_][0] if 'join_gc' not in gajim.interface.instances[self.account]: try: dialogs.JoinGroupchatWindow(self.account, service) @@ -1926,8 +1925,8 @@ class MucBrowser(AgentBrowser): pass while iter_ and self.model.get_path(iter_) != end: if not self.model.get_value(iter_, 6): - jid = self.model.get_value(iter_, 0).decode('utf-8') - node = self.model.get_value(iter_, 1).decode('utf-8') + jid = self.model.get_value(iter_, 0) + node = self.model.get_value(iter_, 1) self.cache.get_info(jid, node, self._agent_info) self._fetch_source = True return diff --git a/src/features_window.py b/src/features_window.py index 1bf2bbe1a..396080a51 100644 --- a/src/features_window.py +++ b/src/features_window.py @@ -149,7 +149,7 @@ class FeaturesWindow: if not rows: return path = rows[0] - feature = self.model[path][0].decode('utf-8') + feature = self.model[path][0] text = self.features[feature][1] + '\n' if os.name == 'nt': text = text + self.features[feature][3] diff --git a/src/filetransfers_window.py b/src/filetransfers_window.py index 33ae185b8..42b0f3851 100644 --- a/src/filetransfers_window.py +++ b/src/filetransfers_window.py @@ -153,12 +153,12 @@ class FileTransfersWindow: for file_props in allfp: if file_props.type_ == 's' and file_props.tt_account == account: # 'account' is the sender - receiver_jid = unicode(file_props.receiver).split('/')[0] + receiver_jid = file_props.receiver.split('/')[0] if jid == receiver_jid and not is_transfer_stopped(file_props): active_transfers[0].append(file_props) elif file_props.type_ == 'r' and file_props.tt_account == account: # 'account' is the recipient - sender_jid = unicode(file_props.sender).split('/')[0] + sender_jid = file_props.sender.split('/')[0] if jid == sender_jid and not is_transfer_stopped(file_props): active_transfers[1].append(file_props) else: @@ -188,7 +188,7 @@ class FileTransfersWindow: sectext += '\n\t' + _('Size: %s') % \ helpers.convert_bytes(file_props.size) if file_props.type_ == 'r': - jid = unicode(file_props.sender).split('/')[0] + jid = file_props.sender.split('/')[0] sender_name = gajim.contacts.get_first_contact_from_jid( file_props.tt_account, jid).get_shown_name() sender = sender_name @@ -198,7 +198,7 @@ class FileTransfersWindow: sectext += '\n\t' + _('Sender: %s') % sender sectext += '\n\t' + _('Recipient: ') if file_props.type_ == 's': - jid = unicode(file_props.receiver).split('/')[0] + jid = file_props.receiver.split('/')[0] receiver_name = gajim.contacts.get_first_contact_from_jid( file_props.tt_account, jid).get_shown_name() recipient = receiver_name @@ -484,7 +484,7 @@ class FileTransfersWindow: iter_ = self.get_iter_by_sid(file_props.type_, file_props.sid) if iter_ is None: return - self.model[iter_][C_SID].decode('utf-8') + self.model[iter_][C_SID] if status == 'stop': file_props.stopped = True elif status == 'ok': @@ -533,7 +533,7 @@ class FileTransfersWindow: _str += ' ' if percent < 10: _str += ' ' - _str += unicode(percent) + '% \n' + _str += str(percent) + '% \n' return _str def _format_time(self, _time): @@ -585,7 +585,7 @@ class FileTransfersWindow: other = file_props.sender else: # we send a file other = file_props.receiver - if isinstance(other, unicode): + if isinstance(other, str): jid = gajim.get_jid_without_resource(other) else: # It's a Contact instance jid = other.jid @@ -677,7 +677,7 @@ class FileTransfersWindow: """ iter_ = self.model.get_iter_first() while iter_: - if typ + sid == self.model[iter_][C_SID].decode('utf-8'): + if typ + sid == self.model[iter_][C_SID]: return iter_ iter_ = self.model.iter_next(iter_) @@ -713,7 +713,7 @@ class FileTransfersWindow: file_props.type_ = 's' file_props.desc = file_desc file_props.elapsed_time = 0 - file_props.size = unicode(stat[6]) + file_props.size = str(stat[6]) file_props.sender = account file_props.receiver = contact file_props.tt_account = account @@ -769,7 +769,7 @@ class FileTransfersWindow: except Exception: self.tooltip.hide_tooltip() return - sid = self.model[iter_][C_SID].decode('utf-8') + sid = self.model[iter_][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) if file_props is not None: if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: @@ -824,7 +824,7 @@ class FileTransfersWindow: self.set_all_insensitive() return current_iter = self.model.get_iter(path) - sid = self.model[current_iter][C_SID].decode('utf-8') + sid = self.model[current_iter][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) self.remove_menuitem.set_sensitive(is_row_selected) self.open_folder_menuitem.set_sensitive(is_row_selected) @@ -882,7 +882,7 @@ class FileTransfersWindow: i = len(self.model) - 1 while i >= 0: iter_ = self.model.get_iter((i)) - sid = self.model[iter_][C_SID].decode('utf-8') + sid = self.model[iter_][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) if is_transfer_stopped(file_props): self._remove_transfer(iter_, sid, file_props) @@ -917,7 +917,7 @@ class FileTransfersWindow: if selected is None or selected[1] is None: return s_iter = selected[1] - sid = self.model[s_iter][C_SID].decode('utf-8') + sid = self.model[s_iter][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) if is_transfer_paused(file_props): file_props.last_time = time.time() @@ -939,7 +939,7 @@ class FileTransfersWindow: if selected is None or selected[1] is None: return s_iter = selected[1] - sid = self.model[s_iter][C_SID].decode('utf-8') + sid = self.model[s_iter][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) account = file_props.tt_account if account not in gajim.connections: @@ -958,7 +958,7 @@ class FileTransfersWindow: # as it was before setting the timeout if props and self.tooltip.id == props[0]: iter_ = self.model.get_iter(props[0]) - sid = self.model[iter_][C_SID].decode('utf-8') + sid = self.model[iter_][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) # bounding rectangle of coordinates for the cell within the treeview rect = self.tree.get_cell_area(props[0], props[1]) @@ -1046,7 +1046,7 @@ class FileTransfersWindow: if not selected or not selected[1]: return s_iter = selected[1] - sid = self.model[s_iter][C_SID].decode('utf-8') + sid = self.model[s_iter][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) if not file_props.file_name: return @@ -1068,7 +1068,7 @@ class FileTransfersWindow: if not selected or not selected[1]: return s_iter = selected[1] - sid = self.model[s_iter][C_SID].decode('utf-8') + sid = self.model[s_iter][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) self._remove_transfer(s_iter, sid, file_props) self.set_all_insensitive() diff --git a/src/gajim-remote.py b/src/gajim-remote.py index 4de6866b6..c01ac6f10 100644 --- a/src/gajim-remote.py +++ b/src/gajim-remote.py @@ -42,7 +42,7 @@ except Exception: def send_error(error_message): '''Writes error message to stderr and exits''' - print >> sys.stderr, error_message.encode(PREFERRED_ENCODING) + print(error_message, file=sys.stderr) sys.exit(1) try: @@ -52,7 +52,7 @@ try: # test if dbus-x11 is installed bus = dbus.SessionBus() except Exception: - print _('D-Bus is not present on this machine or python module is missing') + print(_('D-Bus is not present on this machine or python module is missing')) sys.exit(1) OBJ_PATH = '/org/gajim/dbus/RemoteObject' @@ -310,14 +310,15 @@ class GajimRemote: self.command = sys.argv[1] if self.command == 'help': if self.argv_len == 3: - print self.help_on_command(sys.argv[2]).encode(PREFERRED_ENCODING) + print(self.help_on_command(sys.argv[2]).encode( + PREFERRED_ENCODING)) else: - print self.compose_help().encode(PREFERRED_ENCODING) + print(self.compose_help().encode(PREFERRED_ENCODING)) sys.exit(0) if self.command == 'handle_uri': self.handle_uri() if self.command == 'check_gajim_running': - print self.check_gajim_running() + print(self.check_gajim_running()) sys.exit(0) self.init_connection() self.check_arguments() @@ -353,28 +354,22 @@ class GajimRemote: elif self.command == 'list_accounts': if isinstance(res, list): for account in res: - if isinstance(account, unicode): - print account.encode(PREFERRED_ENCODING) - else: - print account + print(account) elif self.command == 'account_info': if res: - print self.print_info(0, res, True) + print(self.print_info(0, res, True)) elif self.command == 'list_contacts': for account_dict in res: - print self.print_info(0, account_dict, True) + print(self.print_info(0, account_dict, True)) elif self.command == 'prefs_list': pref_keys = sorted(res.keys()) for pref_key in pref_keys: result = '%s = %s' % (pref_key, res[pref_key]) - if isinstance(result, unicode): - print result.encode(PREFERRED_ENCODING) - else: - print result + print(result) elif self.command == 'contact_info': - print self.print_info(0, res, True) + print(self.print_info(0, res, True)) elif res: - print unicode(res).encode(PREFERRED_ENCODING) + print(res) def check_gajim_running(self): if not self.sbus: @@ -469,7 +464,7 @@ class GajimRemote: ret_str +='\t' elif isinstance(val, int): ret_str +='\t' + str(val) - elif isinstance(val, (str, unicode)): + elif isinstance(val, str): ret_str +='\t' + val elif isinstance(val, (list, tuple)): res = '' @@ -484,7 +479,7 @@ class GajimRemote: for key in prop_dict.keys(): val = prop_dict[key] spacing = ' ' * level * 4 - if isinstance(val, (unicode, int, str)): + if isinstance(val, (int, str)): if val is not None: val = val.strip() ret_str += '%s%-10s: %s\n' % (spacing, key, val) diff --git a/src/gajim.py b/src/gajim.py index 825a96e5f..be2a01d00 100644 --- a/src/gajim.py +++ b/src/gajim.py @@ -42,7 +42,7 @@ import warnings if os.name == 'nt': log_path = os.path.join(os.environ['APPDATA'], 'Gajim') if not os.path.exists(log_path): - os.mkdir(log_path, 0700) + os.mkdir(log_path, 0o700) log_file = os.path.join(log_path, 'gajim.log') fout = open(log_file, 'a') sys.stdout = fout @@ -65,7 +65,7 @@ if os.name == 'nt': try: import nbxmpp except ImportError: - print 'Gajim needs python-nbxmpp to run. Quiting...' + print('Gajim needs python-nbxmpp to run. Quiting...') sys.exit() #from common import demandimport @@ -84,7 +84,7 @@ if os.name == 'nt': os.environ['LANG'] = lang gettext.bindtextdomain(APP, DIR) gettext.textdomain(APP) - gettext.install(APP, DIR, unicode=True) + gettext.install(APP, DIR) locale.setlocale(locale.LC_ALL, '') import ctypes @@ -131,15 +131,15 @@ def parseOpts(): longargs += ' class= name= screen= gtk-module= sync g-fatal-warnings' longargs += ' sm-client-id= sm-client-state-file= sm-disable' opts = getopt.getopt(sys.argv[1:], shortargs, longargs.split())[0] - except getopt.error, msg1: - print msg1 - print 'for help use --help' + except getopt.error as msg1: + print(msg1) + print('for help use --help') sys.exit(2) for o, a in opts: if o in ('-h', '--help'): - print 'gajim [--help] [--quiet] [--verbose] ' + \ + print('gajim [--help] [--quiet] [--verbose] ' + \ '[--loglevel subsystem=level[,subsystem=level[...]]] ' + \ - '[--profile name] [--config-path]' + '[--profile name] [--config-path]') sys.exit() elif o in ('-q', '--quiet'): logging_helpers.set_quiet() @@ -155,12 +155,8 @@ def parseOpts(): import locale profile, config_path = parseOpts() -if config_path: - config_path = unicode(config_path, locale.getpreferredencoding()) del parseOpts -profile = unicode(profile, locale.getpreferredencoding()) - import common.configpaths common.configpaths.gajimpaths.init(config_path) del config_path @@ -182,7 +178,7 @@ if os.name == 'nt': if self._file is None and self._error is None: try: self._file = open(fname, 'a') - except Exception, details: + except Exception as details: self._error = details if self._file is not None: self._file.write(text) @@ -200,11 +196,11 @@ try: GObject.set_prgname('gajim') from gi.repository import Gtk from gi.repository import Gdk -except Warning, msg2: +except Warning as msg2: if str(msg2) == 'could not open display': - print >> sys.stderr, _('Gajim needs X server to run. Quiting...') + print(_('Gajim needs X server to run. Quiting...'), file=sys.stderr) else: - print >> sys.stderr, _('importing PyGTK failed: %s') % str(msg2) + print(_('importing PyGTK failed: %s') % str(msg2), file=sys.stderr) sys.exit() warnings.resetwarnings() @@ -223,6 +219,10 @@ except exceptions.DatabaseMalformed: 'http://trac.gajim.org/wiki/DatabaseBackup) or remove it (all history ' 'will be lost).') % common.logger.LOG_DB_PATH else: + from common import logger + gajim.logger = logger.Logger() + from common import caps_cache + caps_cache.initialize(gajim.logger) from common import dbus_support if dbus_support.supported: from music_track_listener import MusicTrackListener @@ -357,7 +357,7 @@ def pid_alive(): try: f1 = open('/proc/%d/cmdline'% pid) - except IOError, e1: + except IOError as e1: if e1.errno == errno.ENOENT: return False # file/pid does not exist raise @@ -419,7 +419,7 @@ try: f2 = open(pid_filename, 'w') f2.write(str(os.getpid())) f2.close() -except IOError, e2: +except IOError as e2: dlg = dialogs.ErrorDialog(_('Disk Write Error'), str(e2)) dlg.run() dlg.destroy() @@ -464,4 +464,4 @@ if __name__ == '__main__': if os.name != 'nt': Gdk.threads_leave() except KeyboardInterrupt: - print >> sys.stderr, 'KeyboardInterrupt' + print('KeyboardInterrupt', file=sys.stderr) diff --git a/src/gajim_themes_window.py b/src/gajim_themes_window.py index b6ff4e4af..e6c715942 100644 --- a/src/gajim_themes_window.py +++ b/src/gajim_themes_window.py @@ -89,8 +89,7 @@ class GajimThemesWindow: def on_theme_cell_edited(self, cell, row, new_name): model = self.themes_tree.get_model() iter_ = model.get_iter_from_string(row) - old_name = model.get_value(iter_, 0).decode('utf-8') - new_name = new_name.decode('utf-8') + old_name = model.get_value(iter_, 0) if old_name == new_name: return if old_name == 'default': @@ -150,7 +149,7 @@ class GajimThemesWindow: self.theme_options_vbox.set_sensitive(False) self.theme_options_table.set_sensitive(False) return - self.current_theme = model.get_value(iter_, 0).decode('utf-8') + self.current_theme = model.get_value(iter_, 0) self.current_theme = self.current_theme.replace(' ', '_') self.set_theme_options(self.current_theme) if self.current_theme == 'default': @@ -169,10 +168,10 @@ class GajimThemesWindow: # don't confuse translators theme_name = _('theme name') theme_name_ns = theme_name.replace(' ', '_') - while theme_name_ns + unicode(i) in gajim.config.get_per('themes'): + while theme_name_ns + str(i) in gajim.config.get_per('themes'): i += 1 - model.set_value(iter_, 0, theme_name + unicode(i)) - gajim.config.add_per('themes', theme_name_ns + unicode(i)) + model.set_value(iter_, 0, theme_name + str(i)) + gajim.config.add_per('themes', theme_name_ns + str(i)) self.themes_tree.get_selection().select_iter(iter_) col = self.themes_tree.get_column(0) path = model.get_path(iter_) diff --git a/src/groupchat_control.py b/src/groupchat_control.py index 023795914..e744e07b9 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -364,7 +364,7 @@ class GroupchatControl(ChatControlBase): self.handlers[id_] = widget self.room_jid = self.contact.jid - self.nick = contact.name.decode('utf-8') + self.nick = contact.name self.new_nick = '' self.name = '' for bm in gajim.connections[self.account].bookmarks: @@ -528,8 +528,6 @@ class GroupchatControl(ChatControlBase): nick2 = model[iter2][C_NICK] if not nick1 or not nick2: return 0 - nick1 = nick1.decode('utf-8') - nick2 = nick2.decode('utf-8') if type1 == 'role': return locale.strcoll(nick1, nick2) if type1 == 'contact': @@ -632,7 +630,7 @@ class GroupchatControl(ChatControlBase): """ # Get the room_jid from treeview for contact in self.iter_contact_rows(): - nick = contact[C_NICK].decode('utf-8') + nick = contact[C_NICK] self.draw_contact(nick) def on_list_treeview_selection_changed(self, selection): @@ -644,7 +642,7 @@ class GroupchatControl(ChatControlBase): self._last_selected_contact = None return contact = model[selected_iter] - nick = contact[C_NICK].decode('utf-8') + nick = contact[C_NICK] self._last_selected_contact = nick if contact[C_TYPE] != 'contact': return @@ -690,7 +688,7 @@ class GroupchatControl(ChatControlBase): if num_unread == 1: unread = '*' elif num_unread > 1: - unread = '[' + unicode(num_unread) + ']' + unread = '[' + str(num_unread) + ']' label_str = unread + label_str return (label_str, color) @@ -1043,7 +1041,7 @@ class GroupchatControl(ChatControlBase): while role_iter: user_iter = self.model.iter_children(role_iter) while user_iter: - if nick == self.model[user_iter][C_NICK].decode('utf-8'): + if nick == self.model[user_iter][C_NICK]: return user_iter else: user_iter = self.model.iter_next(user_iter) @@ -1051,9 +1049,7 @@ class GroupchatControl(ChatControlBase): return None def print_old_conversation(self, text, contact='', tim=None, xhtml = None, - displaymarking=None): - if isinstance(text, str): - text = unicode(text, 'utf-8') + displaymarking=None): if contact: if contact == self.nick: # it's us kind = 'outgoing' @@ -1079,8 +1075,6 @@ class GroupchatControl(ChatControlBase): (contact = 'info' in such a case). If contact is not set: it's a message from the server or help. """ - if isinstance(text, str): - text = unicode(text, 'utf-8') other_tags_for_name = [] other_tags_for_text = [] if contact: @@ -1380,7 +1374,7 @@ class GroupchatControl(ChatControlBase): contact in a room """ if nick is None: - nick = model[iter_][C_NICK].decode('utf-8') + nick = model[iter_][C_NICK] ctrl = self._start_private_message(nick) if ctrl and msg: @@ -1833,7 +1827,7 @@ class GroupchatControl(ChatControlBase): def get_role_iter(self, role): role_iter = self.model.get_iter_first() while role_iter: - role_name = self.model[role_iter][C_NICK].decode('utf-8') + role_name = self.model[role_iter][C_NICK] if role == role_name: return role_iter role_iter = self.model.iter_next(role_iter) @@ -2138,7 +2132,7 @@ class GroupchatControl(ChatControlBase): type_ = model[iter_][2] if type_ != 'contact': # source is not a contact return - contact_jid = data.decode('utf-8') + contact_jid = data gajim.connections[self.account].send_invite(self.room_jid, contact_jid) self.print_conversation(_('%(jid)s has been invited in this room') % { 'jid': contact_jid}, graphics=False) @@ -2203,7 +2197,7 @@ class GroupchatControl(ChatControlBase): self.nick_hits = [] # clear the hit list list_nick = gajim.contacts.get_nick_list(self.account, self.room_jid) - list_nick.sort(key=unicode.lower) # case-insensitive sort + list_nick.sort(key=str.lower) # case-insensitive sort if begin == '': # empty message, show lasts nicks that highlighted us first for nick in self.attention_list: @@ -2312,7 +2306,7 @@ class GroupchatControl(ChatControlBase): """ Make contact's popup menu """ - nick = self.model[iter_][C_NICK].decode('utf-8') + nick = self.model[iter_][C_NICK] c = gajim.contacts.get_gc_contact(self.account, self.room_jid, nick) fjid = self.room_jid + '/' + nick jid = c.jid @@ -2479,7 +2473,7 @@ class GroupchatControl(ChatControlBase): else: widget.expand_row(path, False) else: # We want to send a private message - nick = self.model[path][C_NICK].decode('utf-8') + nick = self.model[path][C_NICK] self._start_private_message(nick) def on_list_treeview_row_activated(self, widget, path, col=0): @@ -2512,7 +2506,7 @@ class GroupchatControl(ChatControlBase): widget.get_selection().select_path(path) iter_ = self.model.get_iter(path) if len(path) == 2: - nick = self.model[iter_][C_NICK].decode('utf-8') + nick = self.model[iter_][C_NICK] self._start_private_message(nick) return True @@ -2522,7 +2516,7 @@ class GroupchatControl(ChatControlBase): return True else: iter_ = self.model.get_iter(path) - nick = self.model[iter_][C_NICK].decode('utf-8') + nick = self.model[iter_][C_NICK] if not nick in gajim.contacts.get_nick_list(self.account, self.room_jid): # it's a group @@ -2565,13 +2559,13 @@ class GroupchatControl(ChatControlBase): except Exception: self.tooltip.hide_tooltip() return - typ = self.model[iter_][C_TYPE].decode('utf-8') + typ = self.model[iter_][C_TYPE] if typ == 'contact': account = self.account if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: self.tooltip.id = row - nick = self.model[iter_][C_NICK].decode('utf-8') + nick = self.model[iter_][C_NICK] self.tooltip.timeout = GObject.timeout_add(500, self.show_tooltip, gajim.contacts.get_gc_contact( account, self.room_jid, nick)) @@ -2708,8 +2702,8 @@ class GroupchatControl(ChatControlBase): connection = gajim.connections[self.account] if fjid in connection.blocked_contacts: return - new_rule = {'order': u'1', 'type': u'jid', 'action': u'deny', - 'value' : fjid, 'child': [u'message', u'iq', u'presence-out']} + new_rule = {'order': '1', 'type': 'jid', 'action': 'deny', + 'value' : fjid, 'child': ['message', 'iq', 'presence-out']} connection.blocked_list.append(new_rule) connection.blocked_contacts.append(fjid) self.draw_contact(nick) diff --git a/src/gtkexcepthook.py b/src/gtkexcepthook.py index 9ba17ba29..4ca60d8e3 100644 --- a/src/gtkexcepthook.py +++ b/src/gtkexcepthook.py @@ -29,9 +29,9 @@ from gi.repository import Gtk from gi.repository import Gdk from gi.repository import Pango from common import i18n # installs _() function -import dialogs +from dialogs import HigDialog -from cStringIO import StringIO +from io import StringIO from common import helpers _exception_in_progress = threading.Lock() @@ -43,7 +43,7 @@ def _info(type_, value, tb): _excepthook_save(type_, value, tb) return - dialog = dialogs.HigDialog(None, Gtk.MessageType.WARNING, Gtk.ButtonsType.NONE, + dialog = HigDialog(None, Gtk.MessageType.WARNING, Gtk.ButtonsType.NONE, _('A programming error has been detected'), _('It probably is not fatal, but should be reported ' 'to the developers nonetheless.')) diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py index d97b7e29a..b9df9e42b 100644 --- a/src/gtkgui_helpers.py +++ b/src/gtkgui_helpers.py @@ -41,6 +41,7 @@ log = logging.getLogger('gajim.gtkgui_helpers') from common import i18n from common import gajim +from common import pep gtk_icon_theme = Gtk.IconTheme.get_default() gtk_icon_theme.append_search_path(gajim.ICONS_DIR) @@ -48,7 +49,7 @@ gtk_icon_theme.append_search_path(gajim.ICONS_DIR) def get_icon_pixmap(icon_name, size=16): try: return gtk_icon_theme.load_icon(icon_name, size, 0) - except GObject.GError, e: + except GObject.GError as e: log.error('Unable to load icon %s: %s' % (icon_name, str(e))) def get_icon_path(icon_name, size=16): @@ -59,7 +60,7 @@ def get_icon_path(icon_name, size=16): return "" else: return icon_info.get_filename() - except GObject.GError, e: + except GObject.GError as e: log.error("Unable to find icon %s: %s" % (icon_name, str(e))) import vcard @@ -195,11 +196,11 @@ def get_default_font(): for line in open(xfce_config_file): if line.find('name="Gtk/FontName"') != -1: start = line.find('value="') + 7 - return line[start:line.find('"', start)].decode('utf-8') + return line[start:line.find('"', start)] except Exception: #we talk about file - print >> sys.stderr, _('Error: cannot open %s for reading') % \ - xfce_config_file + print(_('Error: cannot open %s for reading') % xfce_config_file, + file=sys.stderr) elif os.path.exists(kde_config_file): try: @@ -211,11 +212,11 @@ def get_default_font(): font_name = values[0] font_size = values[1] font_string = '%s %s' % (font_name, font_size) # Verdana 9 - return font_string.decode('utf-8') + return font_string except Exception: #we talk about file - print >> sys.stderr, _('Error: cannot open %s for reading') % \ - kde_config_file + print(_('Error: cannot open %s for reading') % kde_config_file, + file=sys.stderr) return None @@ -316,7 +317,7 @@ class HashDigest: def __str__(self): prettydigest = '' - for i in xrange(0, len(self.digest), 2): + for i in list(range(0, len(self.digest), 2)): prettydigest += self.digest[i:i + 2] + ':' return prettydigest[:-1] @@ -342,11 +343,11 @@ def parse_server_xml(path_to_file): xml.sax.parse(path_to_file, handler) return handler.servers # handle exception if unable to open file - except IOError, message: - print >> sys.stderr, _('Error reading file:'), message + except IOError as message: + print(_('Error reading file:') + message, file=sys.stderr) # handle exception parsing file - except xml.sax.SAXParseException, message: - print >> sys.stderr, _('Error parsing file:'), message + except xml.sax.SAXParseException as message: + print(_('Error parsing file:') + message, file=sys.stderr) def set_unset_urgency_hint(window, unread_messages_no): """ @@ -384,12 +385,12 @@ def get_abspath_for_script(scriptname, want_type = False): script += '\nexec python -OOt gajim.py $0 $@\n' f.write(script) f.close() - os.chmod(path_to_script, 0700) + os.chmod(path_to_script, 0o700) except OSError: # do not traceback (could be a permission problem) #we talk about a file here s = _('Could not write to %s. Session Management support will ' 'not work') % path_to_script - print >> sys.stderr, s + print(s, file=sys.stderr) else: # normal user (not svn user) type_ = 'install' @@ -607,7 +608,7 @@ def get_avatar_pixbuf_from_cache(fjid, use_local=True): if not os.path.isfile(path): return 'ask' - vcard_dict = gajim.connections.values()[0].get_cached_vcard(fjid, + vcard_dict = list(gajim.connections.values())[0].get_cached_vcard(fjid, is_groupchat_contact) if not vcard_dict: # This can happen if cached vcard is too old return 'ask' @@ -645,28 +646,6 @@ def make_pixbuf_grayscale(pixbuf): pixbuf.saturate_and_pixelate(pixbuf2, 0.0, False) return pixbuf2 -def get_path_to_generic_or_avatar(generic, jid = None, suffix = None): - """ - Choose between avatar image and default image - - Returns full path to the avatar image if it exists, otherwise returns full - path to the image. generic must be with extension and suffix without - """ - if jid: - # we want an avatar - puny_jid = helpers.sanitize_filename(jid) - path_to_file = os.path.join(gajim.AVATAR_PATH, puny_jid) + suffix - path_to_local_file = path_to_file + '_local' - for extension in ('.png', '.jpeg'): - path_to_local_file_full = path_to_local_file + extension - if os.path.exists(path_to_local_file_full): - return path_to_local_file_full - for extension in ('.png', '.jpeg'): - path_to_file_full = path_to_file + extension - if os.path.exists(path_to_file_full): - return path_to_file_full - return os.path.abspath(generic) - def decode_filechooser_file_paths(file_paths): """ Decode as UTF-8 under Windows and ask sys.getfilesystemencoding() in POSIX @@ -684,7 +663,7 @@ def decode_filechooser_file_paths(file_paths): file_path = file_path.decode(sys.getfilesystemencoding()) except Exception: try: - file_path = file_path.decode('utf-8') + file_path = file_path except Exception: pass file_paths_list.append(file_path) @@ -829,7 +808,7 @@ def on_avatar_save_as_menuitem_activate(widget, jid, default_name=''): # Save image try: pixbuf.savev(file_path, image_format, [], []) - except Exception, e: + except Exception as e: log.debug('Error saving avatar: %s' % str(e)) if os.path.exists(file_path): os.remove(file_path) @@ -974,6 +953,38 @@ def load_activity_icon(category, activity = None): icon_list = _load_icon_list([activity], path) return icon_list[activity] +def get_pep_as_pixbuf(pep_class): + if isinstance(pep_class, pep.UserMoodPEP): + assert not pep_class._retracted + received_mood = pep_class._pep_specific_data['mood'] + mood = received_mood if received_mood in pep.MOODS else 'unknown' + pixbuf = load_mood_icon(mood).get_pixbuf() + return pixbuf + elif isinstance(pep_class, pep.UserTunePEP): + path = os.path.join(gajim.DATA_DIR, 'emoticons', 'static', 'music.png') + return GdkPixbuf.Pixbuf.new_from_file(path) + elif isinstance(pep_class, pep.UserActivityPEP): + assert not pep_class._retracted + pep_ = pep_class._pep_specific_data + activity = pep_['activity'] + + has_known_activity = activity in pep.ACTIVITIES + has_known_subactivity = (has_known_activity and ('subactivity' in pep_) + and (pep_['subactivity'] in pep.ACTIVITIES[activity])) + + if has_known_activity: + if has_known_subactivity: + subactivity = pep_['subactivity'] + return load_activity_icon(activity, subactivity).get_pixbuf() + else: + return load_activity_icon(activity).get_pixbuf() + else: + return load_activity_icon('unknown').get_pixbuf() + elif isinstance(pep_class, pep.UserLocationPEP): + path = get_icon_path('gajim-earth') + return GdkPixbuf.Pixbuf.new_from_file(path) + return None + def load_icons_meta(): """ Load and return - AND + small icons to put on top left of an icon for meta @@ -1091,7 +1102,7 @@ def label_set_autowrap(widget): """ if isinstance (widget, Gtk.Container): children = widget.get_children() - for i in xrange (len (children)): + for i in list(range (len (children))): label_set_autowrap(children[i]) elif isinstance(widget, Gtk.Label): widget.set_line_wrap(True) diff --git a/src/gui_interface.py b/src/gui_interface.py index 2aea36174..0e6708f46 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -68,7 +68,7 @@ from groupchat_control import PrivateChatControl from atom_window import AtomWindow from session import ChatControlSession -import common.sleepy +from common import sleepy from nbxmpp import idlequeue from nbxmpp import Hashes @@ -93,7 +93,7 @@ import config from threading import Thread from common import ged -gajimpaths = common.configpaths.gajimpaths +from common.configpaths import gajimpaths config_filename = gajimpaths['CONFIG_FILE'] from common import optparser @@ -164,7 +164,7 @@ class Interface: def handle_event_iq_error(self, obj): #('ERROR_ANSWER', account, (id_, fjid, errmsg, errcode)) - if unicode(obj.errcode) in ('400', '403', '406') and obj.id_: + if str(obj.errcode) in ('400', '403', '406') and obj.id_: # show the error dialog ft = self.instances['file_transfers'] sid = obj.id_ @@ -172,7 +172,7 @@ class Interface: sid = obj.id_[3:] file_props = FilesProp.getFileProp(obj.conn.name, sid) if file_props : - if unicode(obj.errcode) == '400': + if str(obj.errcode) == '400': file_props.error = -3 else: file_props.error = -4 @@ -181,7 +181,7 @@ class Interface: error_msg=obj.errmsg)) obj.conn.disconnect_transfer(file_props) return - elif unicode(obj.errcode) == '404': + elif str(obj.errcode) == '404': sid = obj.id_ if len(obj.id_) > 3 and obj.id_[2] == '_': sid = obj.id_[3:] @@ -951,7 +951,7 @@ class Interface: ft_win = self.instances['file_transfers'] if not file_props.hash_: # We disn't get the hash, sender probably don't support that - jid = unicode(file_props.sender) + jid = file_props.sender self.popup_ft_result(account, jid, file_props) ft_win.set_status(file_props, 'ok') h = Hashes() @@ -963,7 +963,7 @@ class Interface: file_.close() # If the hash we received and the hash of the file are the same, # then the file is not corrupt - jid = unicode(file_props.sender) + jid = file_props.sender if file_props.hash_ == hash_: GObject.idle_add(self.popup_ft_result, account, jid, file_props) GObject.idle_add(ft_win.set_status, file_props, 'ok') @@ -995,7 +995,7 @@ class Interface: self.hashThread.start() gajim.socks5queue.remove_receiver(file_props.sid, True, True) else: # we send a file - jid = unicode(file_props.receiver) + jid = file_props.receiver gajim.socks5queue.remove_sender(file_props.sid, True, True) self.popup_ft_result(account, jid, file_props) @@ -1042,7 +1042,7 @@ class Interface: if file_props is not None: if file_props.type_ == 'r': # get the name of the sender, as it is in the roster - sender = unicode(file_props.sender).split('/')[0] + sender = file_props.sender.split('/')[0] name = gajim.contacts.get_first_contact_from_jid(account, sender).get_shown_name() filename = os.path.basename(file_props.file_name) @@ -1111,11 +1111,11 @@ class Interface: # Ask offline status in 1 minute so w'are sure we got all online # presences GObject.timeout_add_seconds(60, self.ask_offline_status, account) - if state != common.sleepy.STATE_UNKNOWN and connected in (2, 3): + if state != sleepy.STATE_UNKNOWN and connected in (2, 3): # we go online or free for chat, so we activate auto status gajim.sleeper_state[account] = 'online' - elif not ((state == common.sleepy.STATE_AWAY and connected == 4) or \ - (state == common.sleepy.STATE_XA and connected == 5)): + elif not ((state == sleepy.STATE_AWAY and connected == 4) or \ + (state == sleepy.STATE_XA and connected == 5)): # If we are autoaway/xa and come back after a disconnection, do # nothing # Else disable autoaway @@ -1568,7 +1568,7 @@ class Interface: This is part of rewriting whole events handling system to use GED. """ - for event_name, event_handlers in self.handlers.iteritems(): + for event_name, event_handlers in self.handlers.items(): for event_handler in event_handlers: prio = ged.GUI1 if type(event_handler) == tuple: @@ -1906,8 +1906,8 @@ class Interface: self.sth_at_sth_dot_sth = r'\S+@\S+\.\S*[^\s)?]' # Invalid XML chars - self.invalid_XML_chars = u'[\x00-\x08]|[\x0b-\x0c]|[\x0e-\x1f]|'\ - u'[\ud800-\udfff]|[\ufffe-\uffff]' + self.invalid_XML_chars = '[\x00-\x08]|[\x0b-\x0c]|[\x0e-\x1f]|'\ + '[\ud800-\udfff]|[\ufffe-\uffff]' def popup_emoticons_under_button(self, button, parent_win): """ @@ -1969,7 +1969,7 @@ class Interface: if not self.image_is_ok(emot_file): continue for emot in emots[emot_filename]: - emot = emot.decode('utf-8') + emot = emot # This avoids duplicated emoticons with the same image eg. :) # and :-) if not emot_file in self.emoticons.values(): @@ -2342,14 +2342,14 @@ class Interface: if account not in gajim.sleeper_state or \ not gajim.sleeper_state[account]: continue - if state == common.sleepy.STATE_AWAKE and \ + if state == sleepy.STATE_AWAKE and \ gajim.sleeper_state[account] in ('autoaway', 'autoxa'): # we go online self.roster.send_status(account, 'online', gajim.status_before_autoaway[account]) gajim.status_before_autoaway[account] = '' gajim.sleeper_state[account] = 'online' - elif state == common.sleepy.STATE_AWAY and \ + elif state == sleepy.STATE_AWAY and \ gajim.sleeper_state[account] == 'online' and \ gajim.config.get('autoaway'): # we save out online status @@ -2369,7 +2369,7 @@ class Interface: self.roster.send_status(account, 'away', auto_message, auto=True) gajim.sleeper_state[account] = 'autoaway' - elif state == common.sleepy.STATE_XA and \ + elif state == sleepy.STATE_XA and \ gajim.sleeper_state[account] in ('online', 'autoaway', 'autoaway-forced') and gajim.config.get('autoxa'): # we go extended away [we pass True to auto param] @@ -2447,7 +2447,7 @@ class Interface: def save_config(self): err_str = parser.write() if err_str is not None: - print >> sys.stderr, err_str + print(err_str, file=sys.stderr) # it is good to notify the user # in case he or she cannot see the output of the console dialogs.ErrorDialog(_('Could not save your settings and ' @@ -2491,7 +2491,7 @@ class Interface: path_to_original_file = path_to_file + extension try: pixbuf.savev(path_to_original_file, typ, [], []) - except Exception, e: + except Exception as e: log.error('Error writing avatar file %s: %s' % ( path_to_original_file, str(e))) # Generate and save the resized, color avatar @@ -2501,7 +2501,7 @@ class Interface: extension try: pixbuf.savev(path_to_normal_file, 'png', [], []) - except Exception, e: + except Exception as e: log.error('Error writing avatar file %s: %s' % \ (path_to_original_file, str(e))) # Generate and save the resized, black and white avatar @@ -2511,7 +2511,7 @@ class Interface: path_to_bw_file = path_to_file + '_notif_size_bw' + extension try: bwbuf.savev(path_to_bw_file, 'png', [], []) - except Exception, e: + except Exception as e: log.error('Error writing avatar file %s: %s' % \ (path_to_original_file, str(e))) @@ -2609,7 +2609,7 @@ class Interface: try: from ipython_view import IPythonView except ImportError: - print 'ipython_view not found' + print('ipython_view not found') return from gi.repository import Pango @@ -2913,7 +2913,7 @@ class Interface: self.show_vcard_when_connect = [] - self.sleeper = common.sleepy.Sleepy( + self.sleeper = sleepy.Sleepy( gajim.config.get('autoawaytime') * 60, # make minutes to seconds gajim.config.get('autoxatime') * 60) diff --git a/src/gui_menu_builder.py b/src/gui_menu_builder.py index 17364b08f..fabef8dc8 100644 --- a/src/gui_menu_builder.py +++ b/src/gui_menu_builder.py @@ -122,7 +122,7 @@ def build_invite_submenu(invite_menuitem, list_, ignore_rooms=[]): minimized_controls = [] for account in connected_accounts: minimized_controls += \ - gajim.interface.minimized_controls[account].values() + list(gajim.interface.minimized_controls[account].values()) for gc_control in gajim.interface.msg_win_mgr.get_controls( message_control.TYPE_GC) + minimized_controls: acct = gc_control.account diff --git a/src/history_manager.py b/src/history_manager.py index 1d005cb2a..dc2d0b15f 100644 --- a/src/history_manager.py +++ b/src/history_manager.py @@ -64,13 +64,13 @@ def parseOpts(): shortargs = 'hc:' longargs = 'help config_path=' opts = getopt.getopt(sys.argv[1:], shortargs, longargs.split())[0] - except getopt.error, msg: - print str(msg) - print 'for help use --help' + except getopt.error as msg: + print(str(msg)) + print('for help use --help') sys.exit(2) for o, a in opts: if o in ('-h', '--help'): - print 'history_manager [--help] [--config-path]' + print('history_manager [--help] [--config-path]') sys.exit() elif o in ('-c', '--config-path'): config_path = a @@ -264,7 +264,7 @@ class HistoryManager: # get those jids that have at least one entry in logs self.cur.execute('SELECT jid, jid_id FROM jids WHERE jid_id IN (' 'SELECT distinct logs.jid_id FROM logs) ORDER BY jid') - # list of tupples: [(u'aaa@bbb',), (u'cc@dd',)] + # list of tupples: [('aaa@bbb',), ('cc@dd',)] rows = self.cur.fetchall() for row in rows: self.jids_already_in.append(row[0]) # jid @@ -291,7 +291,7 @@ class HistoryManager: path = rowref.get_path() if path is None: continue - jid = liststore[path][0].decode('utf-8') # jid + jid = liststore[path][0] # jid self._fill_logs_listview(jid) def _get_jid_id(self, jid): @@ -642,7 +642,7 @@ class HistoryManager: dialog.set_transient_for(self.window) def on_search_db_button_clicked(self, widget): - text = self.search_entry.get_text().decode('utf-8') + text = self.search_entry.get_text() if not text: return @@ -655,7 +655,7 @@ class HistoryManager: def on_search_results_listview_row_activated(self, widget, path, column): # get log_line_id, jid_id from row we double clicked log_line_id = self.search_results_liststore[path][0] - jid = self.search_results_liststore[path][1].decode('utf-8') + jid = self.search_results_liststore[path][1] # make it string as in gtk liststores I have them all as strings # as this is what db returns so I don't have to fight with types jid_id = self._get_jid_id(jid) diff --git a/src/history_window.py b/src/history_window.py index a774b83b0..d305e8799 100644 --- a/src/history_window.py +++ b/src/history_window.py @@ -165,7 +165,7 @@ class HistoryWindow: keys = completion_dict.keys() # Move the actual jid at first so we load history faster - actual_jid = self.jid_entry.get_text().decode('utf-8') + actual_jid = self.jid_entry.get_text() if actual_jid in keys: keys.remove(actual_jid) keys.insert(0, actual_jid) @@ -244,7 +244,7 @@ class HistoryWindow: # Don't disable querybox when we have changed the combobox # to GC or All and hit enter return - jid = self.jid_entry.get_text().decode('utf-8') + jid = self.jid_entry.get_text() account = None # we don't know the account, could be any. Search for it! self._load_history(jid, account) self.results_window.set_property('visible', False) @@ -352,7 +352,7 @@ class HistoryWindow: try: log_days = gajim.logger.get_days_with_logs(self.jid, year, month, days_in_this_month, self.account) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: dialogs.ErrorDialog(_('Disk Error'), str(e)) return for day in log_days: diff --git a/src/htmltextview.py b/src/htmltextview.py index ab6411ae7..7cc18ecd7 100644 --- a/src/htmltextview.py +++ b/src/htmltextview.py @@ -42,8 +42,8 @@ from gi.repository import Gdk from gi.repository import GdkPixbuf import xml.sax, xml.sax.handler import re -from cStringIO import StringIO -import urllib2 +from io import StringIO +import urllib import operator if __name__ == '__main__': @@ -491,9 +491,10 @@ class HtmlHandler(xml.sax.handler.ContentHandler): tag.title = title return tag - def _update_img(self, (mem, alt), attrs, img_mark): + def _update_img(self, output, attrs, img_mark): '''Callback function called after the function helpers.download_image. ''' + mem, alt = output self._process_img(attrs, (mem, alt, img_mark)) def _process_img(self, attrs, loaded=None): @@ -509,7 +510,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler): # The "data" URL scheme http://tools.ietf.org/html/rfc2397 import base64 img = attrs['src'].split(',')[1] - mem = base64.standard_b64decode(urllib2.unquote(img)) + mem = base64.standard_b64decode(urllib.parse.unquote(img)) elif loaded is not None: (mem, alt, replace_mark) = loaded update = True @@ -587,7 +588,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler): self.textbuf.delete_mark(tmpmark) else: self._insert_text('[IMG: %s]' % alt, working_iter) - except Exception, ex: + except Exception as ex: log.error('Error loading image ' + str(ex)) pixbuf = None alt = attrs.get('alt', 'Broken image') @@ -762,9 +763,9 @@ class HtmlHandler(xml.sax.handler.ContentHandler): try: self.textbuf.insert_pixbuf(self.iter, self.textview.focus_out_line_pixbuf) - #self._insert_text(u'\u2550'*40) + #self._insert_text('\u2550'*40) self._jump_line() - except Exception, e: + except Exception as e: log.debug(str('Error in hr'+e)) elif name in LIST_ELEMS: self.list_counters.pop() @@ -913,7 +914,7 @@ class HtmlTextView(Gtk.TextView): while (search_iter.compare(end)): character = search_iter.get_char() - if character == u'\ufffc': + if character == '\ufffc': anchor = search_iter.get_child_anchor() if anchor: text = anchor.get_data('plaintext') diff --git a/src/ipython_view.py b/src/ipython_view.py index e816c7805..763f05950 100644 --- a/src/ipython_view.py +++ b/src/ipython_view.py @@ -309,11 +309,11 @@ class IterableIPShell: @param header: Header to be printed before output @type header: string """ - if verbose or debug: print header+cmd + if verbose or debug: print(header+cmd) # flush stdout so we don't mangle python's buffering if not debug: input_, output = os.popen4(cmd) - print output.read() + print(output.read()) output.close() input_.close() diff --git a/src/message_window.py b/src/message_window.py index 2cf5cdaeb..13b4ed7d3 100644 --- a/src/message_window.py +++ b/src/message_window.py @@ -106,7 +106,7 @@ class MessageWindow(object): 'b', 'F4', 'w', 'Page_Up', 'Page_Down', 'Right', 'Left', 'd', 'c', 'm', 't', 'Escape'] + \ - [''+str(i) for i in xrange(10)] + [''+str(i) for i in list(range(10))] accel_group = Gtk.AccelGroup() for key in keys: keyval, mod = Gtk.accelerator_parse(key) @@ -498,7 +498,7 @@ class MessageWindow(object): unread_str = '' if unread > 1: - unread_str = '[' + unicode(unread) + '] ' + unread_str = '[' + str(unread) + '] ' elif unread == 1: unread_str = '* ' else: @@ -693,10 +693,8 @@ class MessageWindow(object): Return the MessageControl for jid or n, where n is a notebook page index. When key is an int index acct may be None """ - if isinstance(key, str): - key = unicode(key, 'utf-8') - if isinstance(key, unicode): + if isinstance(key, str): jid = key try: return self._controls[acct][jid] @@ -858,7 +856,7 @@ class MessageWindow(object): to_right = False horiz = self.notebook.get_tab_pos() == Gtk.PositionType.TOP or \ self.notebook.get_tab_pos() == Gtk.PositionType.BOTTOM - for i in xrange(self.notebook.get_n_pages()): + for i in list(range(self.notebook.get_n_pages())): page = self.notebook.get_nth_page(i) tab = self.notebook.get_tab_label(page) tab_alloc = tab.get_allocation() @@ -884,7 +882,7 @@ class MessageWindow(object): Find the page num of the tab label """ page_num = -1 - for i in xrange(self.notebook.get_n_pages()): + for i in list(range(self.notebook.get_n_pages())): page = self.notebook.get_nth_page(i) tab = self.notebook.get_tab_label(page) if tab == tab_label: diff --git a/src/music_track_listener.py b/src/music_track_listener.py index 30ee57ce3..4d68901ac 100644 --- a/src/music_track_listener.py +++ b/src/music_track_listener.py @@ -290,14 +290,14 @@ class MusicTrackListener(GObject.GObject): if __name__ == '__main__': def music_track_change_cb(listener, music_track_info): if music_track_info is None: - print 'Stop!' + print('Stop!') else: - print music_track_info.title + print(music_track_info.title) listener = MusicTrackListener.get() listener.connect('music-track-changed', music_track_change_cb) track = listener.get_playing_track() if track is None: - print 'Now not playing anything' + print('Now not playing anything') else: - print 'Now playing: "%s" by %s' % (track.title, track.artist) + print('Now playing: "%s" by %s' % (track.title, track.artist)) GObject.MainLoop().run() diff --git a/src/notify.py b/src/notify.py index f2b8d5b11..6979235dd 100644 --- a/src/notify.py +++ b/src/notify.py @@ -91,10 +91,10 @@ text=None, timeout=-1): DesktopNotification(event_type, jid, account, msg_type, path_to_image, title, GObject.markup_escape_text(text), timeout) return # sucessfully did D-Bus Notification procedure! - except dbus.DBusException, e: + except dbus.DBusException as e: # Connection to D-Bus failed gajim.log.debug(str(e)) - except TypeError, e: + except TypeError as e: # This means that we sent the message incorrectly gajim.log.debug(str(e)) @@ -129,7 +129,7 @@ text=None, timeout=-1): try: notification.show() return - except GObject.GError, e: + except GObject.GError as e: # Connection to notification-daemon failed, see #2893 gajim.log.debug(str(e)) @@ -156,6 +156,9 @@ class Notification: def _nec_notification(self, obj): if obj.do_popup: + if isinstance(obj.popup_image, str): + obj.popup_image = gtkgui_helpers.get_icon_path(obj.popup_image, + 48) popup(obj.popup_event_type, obj.jid, obj.conn.name, obj.popup_msg_type, path_to_image=obj.popup_image, title=obj.popup_title, text=obj.popup_text, @@ -397,7 +400,7 @@ class DesktopNotification: dbus.UInt32(self.timeout*1000), reply_handler=self.attach_by_id, error_handler=self.notify_another_way) - except Exception, e: + except Exception as e: self.notify_another_way(e) else: try: @@ -412,7 +415,7 @@ class DesktopNotification: dbus.UInt32(self.timeout*1000), reply_handler=self.attach_by_id, error_handler=self.notify_another_way) - except Exception, e: + except Exception as e: self.notify_another_way(e) def attach_by_id(self, id_): diff --git a/src/plugins/__init__.py b/src/plugins/__init__.py index 0d5d18fda..07b0b6c56 100644 --- a/src/plugins/__init__.py +++ b/src/plugins/__init__.py @@ -24,7 +24,7 @@ Main file of plugins package. :license: GPL ''' -from pluginmanager import PluginManager -from plugin import GajimPlugin +from .pluginmanager import PluginManager +from .plugin import GajimPlugin __all__ = ['PluginManager', 'GajimPlugin'] diff --git a/src/plugins/gui.py b/src/plugins/gui.py index 1ace7a595..142121839 100644 --- a/src/plugins/gui.py +++ b/src/plugins/gui.py @@ -196,7 +196,7 @@ class PluginsWindow(object): else: try: gajim.plugin_manager.activate_plugin(plugin) - except GajimPluginActivateException, e: + except GajimPluginActivateException as e: WarningDialog(_('Plugin failed'), str(e), transient_for=self.window) return @@ -237,11 +237,11 @@ class PluginsWindow(object): model, iter = selection.get_selected() if iter: plugin = model.get_value(iter, PLUGIN) - plugin_name = model.get_value(iter, NAME).decode('utf-8') + plugin_name = model.get_value(iter, NAME) is_active = model.get_value(iter, ACTIVE) try: gajim.plugin_manager.remove_plugin(plugin) - except PluginsystemError, e: + except PluginsystemError as e: WarningDialog(_('Unable to properly remove the plugin'), str(e), self.window) return @@ -264,7 +264,7 @@ class PluginsWindow(object): return model = self.installed_plugins_model - for row in xrange(len(model)): + for row in list(range(len(model))): if plugin == model[row][PLUGIN]: model.remove(model.get_iter((row, PLUGIN))) break @@ -280,7 +280,7 @@ class PluginsWindow(object): def _try_install(zip_filename): try: plugin = gajim.plugin_manager.install_from_zip(zip_filename) - except PluginsystemError, er_type: + except PluginsystemError as er_type: error_text = str(er_type) if error_text == _('Plugin already exists'): _on_plugin_exists(zip_filename) diff --git a/src/plugins/helpers.py b/src/plugins/helpers.py index 18c747527..b37076a87 100644 --- a/src/plugins/helpers.py +++ b/src/plugins/helpers.py @@ -97,7 +97,7 @@ class log_calls(object): :rtype: function ''' - self.full_func_name += f.func_name + self.full_func_name += f.__name__ if self.log_this_class: @functools.wraps(f) def wrapper(*args, **kwargs): diff --git a/src/plugins/plugin.py b/src/plugins/plugin.py index b668c2765..b3a54a1cf 100644 --- a/src/plugins/plugin.py +++ b/src/plugins/plugin.py @@ -40,30 +40,30 @@ class GajimPlugin(object): ''' Base class for implementing Gajim plugins. ''' - name = u'' + name = '' ''' Name of plugin. Will be shown in plugins management GUI. - :type: unicode + :type: str ''' - short_name = u'' + short_name = '' ''' Short name of plugin. Used for quick indentification of plugin. - :type: unicode + :type: str :todo: decide whether we really need this one, because class name (with module name) can act as such short name ''' - version = u'' + version = '' ''' Version of plugin. - :type: unicode + :type: str :todo: decide how to compare version between each other (which one is higher). Also rethink: do we really need to compare versions @@ -71,11 +71,11 @@ class GajimPlugin(object): same plugin class but with different version and we want only the newest one to be active - is such policy good? ''' - description = u'' + description = '' ''' Plugin description. - :type: unicode + :type: str :todo: should be allow rich text here (like HTML or reStructuredText)? ''' @@ -83,16 +83,16 @@ class GajimPlugin(object): ''' Plugin authors. - :type: [] of unicode + :type: [] of str :todo: should we decide on any particular format of author strings? Especially: should we force format of giving author's e-mail? ''' - homepage = u'' + homepage = '' ''' URL to plug-in's homepage. - :type: unicode + :type: str :todo: should we check whether provided string is valid URI? (Maybe using 'property') @@ -120,7 +120,7 @@ class GajimPlugin(object): Values are tuples: (default_value, option_description). The first one can be anything (this is the advantage of using shelve/pickle instead of - custom-made config I/O handling); the second one should be unicode (gettext + custom-made config I/O handling); the second one should be str (gettext can be used if need and/or translation is planned). :type: {} of 2-element tuples @@ -196,7 +196,7 @@ class GajimPlugin(object): def deactivate(self): pass -import cPickle +import pickle class GajimPluginConfig(): @log_calls('GajimPluginConfig') @@ -242,7 +242,7 @@ class GajimPluginConfig(): @log_calls('GajimPluginConfig') def save(self): fd = open(self.FILE_PATH, 'wb') - cPickle.dump(self.data, fd) + pickle.dump(self.data, fd) fd.close() @log_calls('GajimPluginConfig') @@ -250,14 +250,14 @@ class GajimPluginConfig(): if os.path.isfile(self.FILE_PATH): fd = open(self.FILE_PATH, 'rb') try: - self.data = cPickle.load(fd) + self.data = pickle.load(fd) fd.close() except: fd.close() try: import shelve s = shelve.open(self.FILE_PATH) - for (k, v) in s.iteritems(): + for (k, v) in s.items(): self.data[k] = v if not isinstance(self.data, dict): raise GajimPluginException diff --git a/src/plugins/pluginmanager.py b/src/plugins/pluginmanager.py index 0a3dc9b75..71c0c2e61 100644 --- a/src/plugins/pluginmanager.py +++ b/src/plugins/pluginmanager.py @@ -31,7 +31,7 @@ import sys import fnmatch import zipfile from shutil import rmtree -import ConfigParser +import configparser from common import gajim from common import nec @@ -158,7 +158,7 @@ class PluginManager(object): active yet). :param gui_extpoint_name: name of GUI extension point. - :type gui_extpoint_name: unicode + :type gui_extpoint_name: str :param args: parameters to be passed to extension point handlers (typically and object that invokes `gui_extension_point`; however, this can be practically anything) @@ -209,7 +209,7 @@ class PluginManager(object): freedom, but is this necessary? :param gui_extpoint_name: name of GUI extension point. - :type gui_extpoint_name: unicode + :type gui_extpoint_name: str :param args: arguments that `PluginManager.gui_extension_point` was called with for this extension point. This is used (along with extension point name) to identify element to be removed. @@ -258,14 +258,14 @@ class PluginManager(object): handlers[0](*args) def _register_events_handlers_in_ged(self, plugin): - for event_name, handler in plugin.events_handlers.iteritems(): + for event_name, handler in plugin.events_handlers.items(): priority = handler[0] handler_function = handler[1] gajim.ged.register_event_handler(event_name, priority, handler_function) def _remove_events_handler_from_ged(self, plugin): - for event_name, handler in plugin.events_handlers.iteritems(): + for event_name, handler in plugin.events_handlers.items(): priority = handler[0] handler_function = handler[1] gajim.ged.remove_event_handler(event_name, priority, @@ -302,7 +302,7 @@ class PluginManager(object): self.active_plugins.append(plugin) try: plugin.activate() - except GajimPluginException, e: + except GajimPluginException as e: self.deactivate_plugin(plugin) raise GajimPluginActivateException(str(e)) self._set_plugin_active_in_global_config(plugin) @@ -312,7 +312,7 @@ class PluginManager(object): # remove GUI extension points handlers (provided by plug-in) from # handlers list for gui_extpoint_name, gui_extpoint_handlers in \ - plugin.gui_extension_points.iteritems(): + plugin.gui_extension_points.items(): self.gui_extension_points_handlers[gui_extpoint_name].remove( gui_extpoint_handlers) @@ -320,7 +320,7 @@ class PluginManager(object): # cleaning up method that must be provided by plug-in developer # for each handled GUI extension point) for gui_extpoint_name, gui_extpoint_handlers in \ - plugin.gui_extension_points.iteritems(): + plugin.gui_extension_points.items(): if gui_extpoint_name in self.gui_extension_points: for gui_extension_point_args in self.gui_extension_points[ gui_extpoint_name]: @@ -344,14 +344,14 @@ class PluginManager(object): @log_calls('PluginManager') def _add_gui_extension_points_handlers_from_plugin(self, plugin): for gui_extpoint_name, gui_extpoint_handlers in \ - plugin.gui_extension_points.iteritems(): + plugin.gui_extension_points.items(): self.gui_extension_points_handlers.setdefault(gui_extpoint_name, []).append(gui_extpoint_handlers) @log_calls('PluginManager') def _handle_all_gui_extension_points_with_plugin(self, plugin): for gui_extpoint_name, gui_extpoint_handlers in \ - plugin.gui_extension_points.iteritems(): + plugin.gui_extension_points.items(): if gui_extpoint_name in self.gui_extension_points: for gui_extension_point_args in self.gui_extension_points[ gui_extpoint_name]: @@ -394,7 +394,7 @@ class PluginManager(object): Scans given directory for plugin classes. :param path: directory to scan for plugins - :type path: unicode + :type path: str :return: list of found plugin classes (subclasses of `GajimPlugin` :rtype: [] of class objects @@ -407,7 +407,7 @@ class PluginManager(object): ''' from plugins.plugins_i18n import _ plugins_found = [] - conf = ConfigParser.ConfigParser() + conf = configparser.ConfigParser() fields = ('name', 'short_name', 'version', 'description', 'authors', 'homepage') if not os.path.isdir(path): @@ -426,9 +426,9 @@ class PluginManager(object): module_name = os.path.splitext(elem_name)[0] try: module = __import__(module_name) - except ValueError, value_error: + except ValueError as value_error: log.debug(value_error) - except ImportError, import_error: + except ImportError as import_error: log.debug(import_error) elif os.path.isdir(file_path) and scan_dirs: @@ -439,9 +439,9 @@ class PluginManager(object): file_path += os.path.sep try: module = __import__(module_name) - except ValueError, value_error: + except ValueError as value_error: log.debug(value_error) - except ImportError, import_error: + except ImportError as import_error: log.debug(import_error) @@ -471,27 +471,27 @@ class PluginManager(object): conf.readfp(open(manifest_path, 'r')) for option in fields: if conf.get('info', option) is '': - raise ConfigParser.NoOptionError, 'field empty' + raise configparser.NoOptionError('field empty') setattr(module_attr, option, conf.get('info', option)) conf.remove_section('info') plugins_found.append(module_attr) - except TypeError, type_error: + except TypeError as type_error: # set plugin localization try: module_attr._ = _ - except AttributeError, type_error: + except AttributeError as type_error: pass - except ConfigParser.NoOptionError, type_error: + except configparser.NoOptionError as type_error: # all fields are required log.debug('%s : %s' % (module_attr_name, 'wrong manifest file. all fields are required!')) - except ConfigParser.NoSectionError, type_error: + except configparser.NoSectionError as type_error: # info section are required log.debug('%s : %s' % (module_attr_name, 'wrong manifest file. info section are required!')) - except ConfigParser.MissingSectionHeaderError, type_error: + except configparser.MissingSectionHeaderError as type_error: # info section are required log.debug('%s : %s' % (module_attr_name, 'wrong manifest file. section are required!')) @@ -504,10 +504,10 @@ class PluginManager(object): ''' try: zip_file = zipfile.ZipFile(zip_filename) - except zipfile.BadZipfile, e: + except zipfile.BadZipfile as e: # it is not zip file raise PluginsystemError(_('Archive corrupted')) - except IOError,e: + except IOError as e: raise PluginsystemError(_('Archive empty')) if zip_file.testzip(): diff --git a/src/plugins/plugins_i18n.py b/src/plugins/plugins_i18n.py index 769d8b060..9eb983eff 100644 --- a/src/plugins/plugins_i18n.py +++ b/src/plugins/plugins_i18n.py @@ -36,6 +36,6 @@ if os.name != 'nt': try: t = gettext.translation(APP, plugins_locale_dir) _ = t.gettext -except IOError, msg: +except IOError as msg: from common import i18n _ = gettext.gettext diff --git a/src/profile_window.py b/src/profile_window.py index 7e7fc76e7..696c66beb 100644 --- a/src/profile_window.py +++ b/src/profile_window.py @@ -139,7 +139,7 @@ class ProfileWindow: # and hope that user did not specify in ACE crazy size scaled_pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'tooltip') - except GObject.GError, msg: # unknown format + except GObject.GError as msg: # unknown format # msg should be string, not object instance msg = str(msg) invalid_file = True @@ -171,7 +171,8 @@ class ProfileWindow: button.show() text_button = self.xml.get_object('NOPHOTO_button') text_button.hide() - self.avatar_encoded = base64.encodestring(data) + self.avatar_encoded = base64.b64encode(data.encode('utf-8')).decode( + 'utf-8') # returns None if unknown type self.avatar_mime_type = mimetypes.guess_type(path_to_file)[0] if must_delete: @@ -344,7 +345,7 @@ class ProfileWindow: 'ADR_WORK_REGION', 'ADR_WORK_PCODE', 'ADR_WORK_CTRY'] vcard_ = {} for e in entries: - txt = self.xml.get_object(e + '_entry').get_text().decode('utf-8') + txt = self.xml.get_object(e + '_entry').get_text() if txt != '': vcard_ = self.add_to_vcard(vcard_, e, txt) @@ -354,7 +355,7 @@ class ProfileWindow: end_iter = buff.get_end_iter() txt = buff.get_text(start_iter, end_iter, False) if txt != '': - vcard_['DESC'] = txt.decode('utf-8') + vcard_['DESC'] = txt # Avatar if self.avatar_encoded: diff --git a/src/remote_control.py b/src/remote_control.py index 5216201bb..26b8d7020 100644 --- a/src/remote_control.py +++ b/src/remote_control.py @@ -72,7 +72,7 @@ def get_dbus_struct(obj): """ if obj is None: return DBUS_NONE() - if isinstance(obj, (unicode, str)): + if isinstance(obj, str): return DBUS_STRING(obj) if isinstance(obj, int): return DBUS_INT32(obj) @@ -613,13 +613,13 @@ class SignalObject(dbus.service.Object): """ Get vcard info for a contact. Return cached value of the vcard """ - if not isinstance(jid, unicode): - jid = unicode(jid) + if not isinstance(jid, str): + jid = str(jid) if not jid: raise dbus_support.MissingArgument() jid = self._get_real_jid(jid) - cached_vcard = gajim.connections.values()[0].get_cached_vcard(jid) + cached_vcard = list(gajim.connections.values())[0].get_cached_vcard(jid) if cached_vcard: return get_dbus_struct(cached_vcard) @@ -652,9 +652,9 @@ class SignalObject(dbus.service.Object): result['name'] = DBUS_STRING(con.name) result['jid'] = DBUS_STRING(gajim.get_jid_from_account(con.name)) result['message'] = DBUS_STRING(con.status) - result['priority'] = DBUS_STRING(unicode(con.priority)) - result['resource'] = DBUS_STRING(unicode(gajim.config.get_per( - 'accounts', con.name, 'resource'))) + result['priority'] = DBUS_STRING(str(con.priority)) + result['resource'] = DBUS_STRING(gajim.config.get_per('accounts', + con.name, 'resource')) return result @dbus.service.method(INTERFACE, in_signature='s', out_signature='aa{sv}') @@ -743,7 +743,7 @@ class SignalObject(dbus.service.Object): def prefs_store(self): try: gajim.interface.save_config() - except Exception, e: + except Exception as e: return DBUS_BOOLEAN(False) return DBUS_BOOLEAN(True) @@ -907,7 +907,7 @@ class SignalObject(dbus.service.Object): if not invalid_file and filesize < 16384: fd = open(picture, 'rb') data = fd.read() - avatar = base64.encodestring(data) + avatar = base64.b64encode(data.encode('utf-8')).decode('utf-8') avatar_mime_type = mimetypes.guess_type(picture)[0] vcard={} vcard['PHOTO'] = {'BINVAL': avatar} diff --git a/src/roster_window.py b/src/roster_window.py index b14973be8..762406359 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -460,7 +460,7 @@ class RosterWindow: account_group = 'MERGED' else: account_group = account - group = self.model[parent_i][C_JID].decode('utf-8') + group = self.model[parent_i][C_JID] if group in gajim.groups[account]: del gajim.groups[account][group] to_be_removed = parent_i @@ -1063,28 +1063,28 @@ class RosterWindow: pep_dict = gajim.connections[account].pep if gajim.config.get('show_mood_in_roster') and 'mood' in pep_dict: - self.model[child_iter][C_MOOD_PIXBUF] = pep_dict['mood'].\ - asPixbufIcon() + self.model[child_iter][C_MOOD_PIXBUF] = \ + gtkgui_helpers.get_pep_as_pixbuf(pep_dict['mood']) else: self.model[child_iter][C_MOOD_PIXBUF] = empty_pixbuf if gajim.config.get('show_activity_in_roster') and 'activity' in \ pep_dict: - self.model[child_iter][C_ACTIVITY_PIXBUF] = pep_dict['activity'].\ - asPixbufIcon() + self.model[child_iter][C_ACTIVITY_PIXBUF] = \ + gtkgui_helpers.get_pep_as_pixbuf(pep_dict['activity']) else: self.model[child_iter][C_ACTIVITY_PIXBUF] = empty_pixbuf if gajim.config.get('show_tunes_in_roster') and 'tune' in pep_dict: - self.model[child_iter][C_TUNE_PIXBUF] = pep_dict['tune'].\ - asPixbufIcon() + self.model[child_iter][C_TUNE_PIXBUF] = \ + gtkgui_helpers.get_pep_as_pixbuf(pep_dict['tune']) else: self.model[child_iter][C_TUNE_PIXBUF] = empty_pixbuf if gajim.config.get('show_location_in_roster') and 'location' in \ pep_dict: - self.model[child_iter][C_LOCATION_PIXBUF] = pep_dict['location'].\ - asPixbufIcon() + self.model[child_iter][C_LOCATION_PIXBUF] = \ + gtkgui_helpers.get_pep_as_pixbuf(pep_dict['location']) else: self.model[child_iter][C_LOCATION_PIXBUF] = empty_pixbuf @@ -1145,8 +1145,8 @@ class RosterWindow: if self.model[parent_iter][C_TYPE] != 'contact': # parent is not a contact return - parent_jid = self.model[parent_iter][C_JID].decode('utf-8') - parent_account = self.model[parent_iter][C_ACCOUNT].decode('utf-8') + parent_jid = self.model[parent_iter][C_JID] + parent_account = self.model[parent_iter][C_ACCOUNT] self.draw_contact(parent_jid, parent_account) return False @@ -1203,8 +1203,8 @@ class RosterWindow: nb_connected_contact += 1 if nb_connected_contact > 1: # switch back to default writing direction - name += i18n.paragraph_direction_mark(unicode(name)) - name += u' (%d)' % nb_connected_contact + name += i18n.paragraph_direction_mark(name) + name += ' (%d)' % nb_connected_contact # add status msg, if not empty, under contact name in # the treeview @@ -1257,8 +1257,8 @@ class RosterWindow: iterC = self.model.iter_children(child_iter) while iterC: # a child has awaiting messages? - jidC = self.model[iterC][C_JID].decode('utf-8') - accountC = self.model[iterC][C_ACCOUNT].decode('utf-8') + jidC = self.model[iterC][C_JID] + accountC = self.model[iterC][C_ACCOUNT] if len(gajim.events.get_events(accountC, jidC)): icon_name = 'event' break @@ -1341,7 +1341,7 @@ class RosterWindow: if not contact: contact = gajim.contacts.get_contact(account, jid) if pep_type in contact.pep: - pixbuf = contact.pep[pep_type].asPixbufIcon() + pixbuf = gtkgui_helpers.get_pep_as_pixbuf(contact.pep[pep_type]) else: pixbuf = empty_pixbuf for child_iter in iters: @@ -1351,7 +1351,7 @@ class RosterWindow: iters = self._get_contact_iter(jid, account, model=self.model) if not iters or not gajim.config.get('show_avatars_in_roster'): return - jid = self.model[iters[0]][C_JID].decode('utf-8') + jid = self.model[iters[0]][C_JID] pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(jid) if pixbuf in (None, 'ask'): scaled_pixbuf = empty_pixbuf @@ -1500,8 +1500,8 @@ class RosterWindow: def _readjust_expand_collapse_state(self): def func(model, path, iter_): type_ = model[iter_][C_TYPE] - acct = model[iter_][C_ACCOUNT].decode('utf-8') - jid = model[iter_][C_JID].decode('utf-8') + acct = model[iter_][C_ACCOUNT] + jid = model[iter_][C_JID] key = None if type_ == 'account': key = acct @@ -1511,7 +1511,7 @@ class RosterWindow: parent_iter = model.iter_parent(iter_) ptype = model[parent_iter][C_TYPE] if ptype == 'group': - grp = model[parent_iter][C_JID].decode('utf-8') + grp = model[parent_iter][C_JID] key = acct + grp + jid if key: if key in self.collapsed_rows: @@ -1615,11 +1615,10 @@ class RosterWindow: if not account: return False - account = account.decode('utf-8') jid = model[titer][C_JID] if not jid: return False - jid = jid.decode('utf-8') + if type_ == 'group': group = jid if group == _('Transports'): @@ -1717,8 +1716,8 @@ class RosterWindow: name2 = model[iter2][C_NAME] if not name1 or not name2: return 0 - name1 = name1.decode('utf-8') - name2 = name2.decode('utf-8') + name1 = name1 + name2 = name2 type1 = model[iter1][C_TYPE] type2 = model[iter2][C_TYPE] if type1 == 'self_contact': @@ -1728,10 +1727,10 @@ class RosterWindow: if type1 == 'group': name1 = model[iter1][C_JID] if name1: - name1 = name1.decode('utf-8') + name1 = name1 name2 = model[iter2][C_JID] if name2: - name2 = name2.decode('utf-8') + name2 = name2 if name1 == _('Transports'): return 1 if name2 == _('Transports'): @@ -1748,12 +1747,12 @@ class RosterWindow: account2 = model[iter2][C_ACCOUNT] if not account1 or not account2: return 0 - account1 = account1.decode('utf-8') - account2 = account2.decode('utf-8') + account1 = account1 + account2 = account2 if type1 == 'account': return locale.strcoll(account1, account2) - jid1 = model[iter1][C_JID].decode('utf-8') - jid2 = model[iter2][C_JID].decode('utf-8') + jid1 = model[iter1][C_JID] + jid2 = model[iter2][C_JID] if type1 == 'contact': lcontact1 = gajim.contacts.get_contacts(account1, jid1) contact1 = gajim.contacts.get_first_contact_from_jid(account1, jid1) @@ -2191,7 +2190,7 @@ class RosterWindow: gajim.interface.status_sent_to_groups[account] = {} for gc_control in gajim.interface.msg_win_mgr.get_controls( message_control.TYPE_GC) + \ - gajim.interface.minimized_controls[account].values(): + list(gajim.interface.minimized_controls[account].values()): if gc_control.account == account: if gajim.gc_connected[account][gc_control.room_jid]: gajim.connections[account].send_gc_status( @@ -2865,8 +2864,8 @@ class RosterWindow: if model[titer][C_TYPE] in ('contact', 'self_contact'): # we're on a contact entry in the roster if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: - account = model[titer][C_ACCOUNT].decode('utf-8') - jid = model[titer][C_JID].decode('utf-8') + account = model[titer][C_ACCOUNT] + jid = model[titer][C_JID] self.tooltip.id = row contacts = gajim.contacts.get_contacts(account, jid) connected_contacts = [] @@ -2881,8 +2880,8 @@ class RosterWindow: self.show_tooltip, connected_contacts) elif model[titer][C_TYPE] == 'groupchat': if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: - account = model[titer][C_ACCOUNT].decode('utf-8') - jid = model[titer][C_JID].decode('utf-8') + account = model[titer][C_ACCOUNT] + jid = model[titer][C_JID] self.tooltip.id = row contact = gajim.contacts.get_contacts(account, jid) self.tooltip.account = account @@ -2891,7 +2890,7 @@ class RosterWindow: elif model[titer][C_TYPE] == 'account': # we're on an account entry in the roster if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: - account = model[titer][C_ACCOUNT].decode('utf-8') + account = model[titer][C_ACCOUNT] if account == 'all': self.tooltip.id = row self.tooltip.account = None @@ -3029,9 +3028,9 @@ class RosterWindow: continue accounts.append(account) self.send_status(account, 'offline', msg, to=contact.jid) - new_rule = {'order': u'1', 'type': u'jid', - 'action': u'deny', 'value' : contact.jid, - 'child': [u'message', u'iq', u'presence-out']} + new_rule = {'order': '1', 'type': 'jid', + 'action': 'deny', 'value' : contact.jid, + 'child': ['message', 'iq', 'presence-out']} gajim.connections[account].blocked_list.append(new_rule) # needed for draw_contact: gajim.connections[account].blocked_contacts.append( @@ -3049,9 +3048,9 @@ class RosterWindow: self.draw_group(group, account) self.send_status(account, 'offline', msg, to=contact.jid) self.draw_contact(contact.jid, account) - new_rule = {'order': u'1', 'type': u'group', 'action': u'deny', - 'value' : group, 'child': [u'message', u'iq', - u'presence-out']} + new_rule = {'order': '1', 'type': 'group', 'action': 'deny', + 'value' : group, 'child': ['message', 'iq', + 'presence-out']} # account is the same for all when we block a group gajim.connections[list_[0][1]].blocked_list.append(new_rule) for account in accounts: @@ -3230,7 +3229,7 @@ class RosterWindow: 'attached_gpg_keys').split() keys = {} keyID = _('None') - for i in xrange(len(attached_keys)/2): + for i in list(range(len(attached_keys)/2)): keys[attached_keys[2*i]] = attached_keys[2*i+1] if attached_keys[2*i] == contact.jid: keyID = attached_keys[2*i+1] @@ -3287,7 +3286,7 @@ class RosterWindow: # get the image at 'tooltip size' # and hope that user did not specify in ACE crazy size pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'tooltip') - except GObject.GError, msg: # unknown format + except GObject.GError as msg: # unknown format # msg should be string, not object instance msg = str(msg) dialogs.ErrorDialog(_('Could not load image'), msg) @@ -3489,8 +3488,8 @@ class RosterWindow: path = list_of_paths[0] type_ = model[path][C_TYPE] if type_ in ('contact', 'group', 'agent'): - jid = model[path][C_JID].decode('utf-8') - account = model[path][C_ACCOUNT].decode('utf-8') + jid = model[path][C_JID] + account = model[path][C_ACCOUNT] self.on_rename(widget, type_, jid, account) elif event.keyval == Gdk.KEY_Delete: @@ -3499,7 +3498,7 @@ class RosterWindow: if not len(list_of_paths): return type_ = model[list_of_paths[0]][C_TYPE] - account = model[list_of_paths[0]][C_ACCOUNT].decode('utf-8') + account = model[list_of_paths[0]][C_ACCOUNT] if type_ in ('account', 'group', 'self_contact') or \ account == gajim.ZEROCONF_ACC_NAME: return @@ -3507,8 +3506,8 @@ class RosterWindow: for path in list_of_paths: if model[path][C_TYPE] != type_: return - jid = model[path][C_JID].decode('utf-8') - account = model[path][C_ACCOUNT].decode('utf-8') + jid = model[path][C_JID] + account = model[path][C_ACCOUNT] contact = gajim.contacts.get_contact_with_highest_priority( account, jid) list_.append((contact, account)) @@ -3517,8 +3516,8 @@ class RosterWindow: elif type_ == 'agent': self.on_remove_agent(widget, list_) - elif not (event.get_state() & (Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.MOD1_MASK)) and\ - Gdk.keyval_to_unicode(event.keyval): + elif not (event.get_state() & (Gdk.ModifierType.CONTROL_MASK | \ + Gdk.ModifierType.MOD1_MASK)) and Gdk.keyval_to_unicode(event.keyval): # if we got unicode symbol without ctrl / alt num = Gdk.keyval_to_unicode(event.keyval) self.enable_rfilter(unichr(num)) @@ -3620,7 +3619,7 @@ class RosterWindow: if type_ in ('agent', 'contact', 'self_contact', 'groupchat'): self.on_row_activated(widget, path) elif type_ == 'account': - account = model[path][C_ACCOUNT].decode('utf-8') + account = model[path][C_ACCOUNT] if account != 'all': show = gajim.connections[account].connected if show > 1: # We are connected @@ -3834,7 +3833,7 @@ class RosterWindow: 'contacts.')) self.update_status_combobox() return - status = model[active][2].decode('utf-8') + status = model[active][2] # status "desync'ed" or not statuses_unified = helpers.statuses_unified() if (active == 7 and statuses_unified) or (active == 9 and \ @@ -3928,7 +3927,7 @@ class RosterWindow: ) def on_plugins_menuitem_activate(self, widget): - if gajim.interface.instances.has_key('plugins'): + if 'plugins' in gajim.interface.instances: gajim.interface.instances['plugins'].window.present() else: gajim.interface.instances['plugins'] = plugins.gui.PluginsWindow() @@ -4051,7 +4050,7 @@ class RosterWindow: """ jid = contact.jid if resource is not None: - jid = jid + u'/' + resource + jid = jid + '/' + resource adhoc_commands.CommandWindow(account, jid) def on_roster_window_focus_in_event(self, widget, event): @@ -4099,8 +4098,8 @@ class RosterWindow: for path in list_of_paths: type_ = model[path][C_TYPE] if type_ in ('contact', 'agent'): - jid = model[path][C_JID].decode('utf-8') - account = model[path][C_ACCOUNT].decode('utf-8') + jid = model[path][C_JID] + account = model[path][C_ACCOUNT] contact = gajim.contacts.get_first_contact_from_jid(account, jid) self.on_info(widget, contact, account) @@ -4113,8 +4112,8 @@ class RosterWindow: path = list_of_paths[0] type_ = model[path][C_TYPE] if type_ in ('contact', 'agent'): - jid = model[path][C_JID].decode('utf-8') - account = model[path][C_ACCOUNT].decode('utf-8') + jid = model[path][C_JID] + account = model[path][C_ACCOUNT] contact = gajim.contacts.get_first_contact_from_jid(account, jid) self.on_history(widget, contact, account) @@ -4129,7 +4128,7 @@ class RosterWindow: this way) """ model = self.modelfilter - account = model[path][C_ACCOUNT].decode('utf-8') + account = model[path][C_ACCOUNT] type_ = model[path][C_TYPE] if type_ in ('group', 'account'): if self.tree.row_expanded(path): @@ -4137,7 +4136,7 @@ class RosterWindow: else: self.tree.expand_row(path, False) return - jid = model[path][C_JID].decode('utf-8') + jid = model[path][C_JID] resource = None contact = gajim.contacts.get_contact_with_highest_priority(account, jid) titer = model.get_iter(path) @@ -4164,7 +4163,7 @@ class RosterWindow: if not first_ev and model.iter_has_child(titer): child_iter = model.iter_children(titer) while not first_ev and child_iter: - child_jid = model[child_iter][C_JID].decode('utf-8') + child_jid = model[child_iter][C_JID] first_ev = gajim.events.get_first_event(account, child_jid) if first_ev: jid = child_jid @@ -4209,11 +4208,11 @@ class RosterWindow: if self.regroup: # merged accounts accounts = gajim.connections.keys() else: - accounts = [model[titer][C_ACCOUNT].decode('utf-8')] + accounts = [model[titer][C_ACCOUNT]] type_ = model[titer][C_TYPE] if type_ == 'group': - group = model[titer][C_JID].decode('utf-8') + group = model[titer][C_JID] child_model[child_iter][C_IMG] = \ gajim.interface.jabber_state_images['16']['opened'] if self.rfilter_enabled: @@ -4246,8 +4245,8 @@ class RosterWindow: self.tree.expand_row(path, False) elif type_ == 'contact': # Metacontact got toggled, update icon - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] contact = gajim.contacts.get_contact(account, jid) for group in contact.groups: if account + group + jid in self.collapsed_rows: @@ -4273,7 +4272,7 @@ class RosterWindow: if self.regroup: # merged accounts accounts = gajim.connections.keys() else: - accounts = [model[titer][C_ACCOUNT].decode('utf-8')] + accounts = [model[titer][C_ACCOUNT]] type_ = model[titer][C_TYPE] if type_ == 'group': @@ -4281,7 +4280,7 @@ class RosterWindow: jabber_state_images['16']['closed'] if self.rfilter_enabled: return - group = model[titer][C_JID].decode('utf-8') + group = model[titer][C_JID] for account in accounts: if group in gajim.groups[account]: # This account has this group gajim.groups[account][group]['expand'] = False @@ -4294,8 +4293,8 @@ class RosterWindow: self.draw_account(account) elif type_ == 'contact': # Metacontact got toggled, update icon - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] contact = gajim.contacts.get_contact(account, jid) groups = contact.groups if not groups: @@ -4327,8 +4326,6 @@ class RosterWindow: if not account: return - account = account.decode('utf-8') - if type_ == 'contact': child_iter = model.convert_iter_to_child_iter(titer) if self.model.iter_has_child(child_iter): @@ -4336,10 +4333,10 @@ class RosterWindow: # redraw us to show/hide expand icon if self.filtering: # Prevent endless loops - jid = model[titer][C_JID].decode('utf-8') + jid = model[titer][C_JID] GObject.idle_add(self.draw_contact, jid, account) elif type_ == 'group': - group = model[titer][C_JID].decode('utf-8') + group = model[titer][C_JID] self._adjust_group_expand_collapse_state(group, account) elif type_ == 'account': self._adjust_account_expand_collapse_state(account) @@ -4369,8 +4366,8 @@ class RosterWindow: # if row[C_TYPE] != 'contact': # self._last_selected_contact = [] # return -# jid = row[C_JID].decode('utf-8') -# account = row[C_ACCOUNT].decode('utf-8') +# jid = row[C_JID] +# account = row[C_ACCOUNT] # self._last_selected_contact.append((jid, account)) # GObject.idle_add(self.draw_contact, jid, account, True) @@ -4708,9 +4705,9 @@ class RosterWindow: path_dest = (path_dest[0], path_dest[1]-1) # destination: the row something got dropped on iter_dest = model.get_iter(path_dest) - type_dest = model[iter_dest][C_TYPE].decode('utf-8') - jid_dest = model[iter_dest][C_JID].decode('utf-8') - account_dest = model[iter_dest][C_ACCOUNT].decode('utf-8') + type_dest = model[iter_dest][C_TYPE] + jid_dest = model[iter_dest][C_JID] + account_dest = model[iter_dest][C_ACCOUNT] # drop on account row in merged mode, we cannot know the desired account if account_dest == 'all': @@ -4774,7 +4771,7 @@ class RosterWindow: path_source = treeview.get_selection().get_selected_rows()[1][0] iter_source = model.get_iter(path_source) type_source = model[iter_source][C_TYPE] - account_source = model[iter_source][C_ACCOUNT].decode('utf-8') + account_source = model[iter_source][C_ACCOUNT] if gajim.config.get_per('accounts', account_source, 'is_zeroconf'): return @@ -4792,14 +4789,14 @@ class RosterWindow: if account_source != account_dest: # drop on another account return - grp_source = model[iter_source][C_JID].decode('utf-8') + grp_source = model[iter_source][C_JID] delimiter = gajim.connections[account_source].nested_group_delimiter grp_source_list = grp_source.split(delimiter) new_grp = None if type_dest == 'account': new_grp = grp_source_list[-1] elif type_dest == 'group': - new_grp = model[iter_dest][C_JID].decode('utf-8') + delimiter +\ + new_grp = model[iter_dest][C_JID] + delimiter +\ grp_source_list[-1] if new_grp: self.move_group(grp_source, new_grp, account_source) @@ -4821,26 +4818,26 @@ class RosterWindow: it = iter_source while model[it][C_TYPE] == 'contact': it = model.iter_parent(it) - grp_source = model[it][C_JID].decode('utf-8') + grp_source = model[it][C_JID] if grp_source in helpers.special_groups and \ grp_source not in ('Not in Roster', 'Observers'): # a transport or a minimized groupchat was dragged # we can add it to other accounts but not move it to another group, # see below return - jid_source = data.decode('utf-8') + jid_source = data c_source = gajim.contacts.get_contact_with_highest_priority( account_source, jid_source) # Get destination group grp_dest = None if type_dest == 'group': - grp_dest = model[iter_dest][C_JID].decode('utf-8') + grp_dest = model[iter_dest][C_JID] elif type_dest in ('contact', 'agent'): it = iter_dest while model[it][C_TYPE] != 'group': it = model.iter_parent(it) - grp_dest = model[it][C_JID].decode('utf-8') + grp_dest = model[it][C_JID] if grp_dest in helpers.special_groups: return @@ -5096,8 +5093,8 @@ class RosterWindow: if not model[titer][C_JID] or not model[titer][C_ACCOUNT]: # This can append when at the moment we add the row return - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] self._set_contact_row_background_color(renderer, jid, account) parent_iter = model.iter_parent(titer) if model[parent_iter][C_TYPE] == 'contact': @@ -5145,8 +5142,8 @@ class RosterWindow: if not model[titer][C_JID] or not model[titer][C_ACCOUNT]: # This can append when at the moment we add the row return - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] color = None if type_ == 'groupchat': ctrl = gajim.interface.minimized_controls[account].get(jid, @@ -5194,8 +5191,8 @@ class RosterWindow: if not model[titer][C_JID] or not model[titer][C_ACCOUNT]: # This can append at the moment we add the row return - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] self._set_contact_row_background_color(renderer, jid, account) def _fill_avatar_pixbuf_renderer(self, column, renderer, model, titer, @@ -5221,8 +5218,8 @@ class RosterWindow: if not model[titer][C_JID] or not model[titer][C_ACCOUNT]: # This can append at the moment we add the row return - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] self._set_contact_row_background_color(renderer, jid, account) else: renderer.set_property('visible', False) @@ -5731,7 +5728,7 @@ class RosterWindow: Make account's popup menu """ model = self.modelfilter - account = model[titer][C_ACCOUNT].decode('utf-8') + account = model[titer][C_ACCOUNT] if account != 'all': # not in merged mode menu = self.build_account_menu(account) @@ -5766,8 +5763,8 @@ class RosterWindow: """ model = self.modelfilter path = model.get_path(titer) - group = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + group = model[titer][C_JID] + account = model[titer][C_ACCOUNT] list_ = [] # list of (jid, account) tuples list_online = [] # list of (jid, account) tuples @@ -5927,8 +5924,8 @@ class RosterWindow: Make contact's popup menu """ model = self.modelfilter - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] contact = gajim.contacts.get_contact_with_highest_priority(account, jid) menu = gui_menu_builder.get_contact_menu(contact, account) event_button = gtkgui_helpers.get_possible_button_event(event) @@ -5945,8 +5942,8 @@ class RosterWindow: is_blocked = True privacy_rules_supported = True for titer in iters: - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] if gajim.connections[account].connected < 2: one_account_offline = True if not gajim.connections[account].privacy_rules_supported: @@ -6044,9 +6041,9 @@ class RosterWindow: Make transport's popup menu """ model = self.modelfilter - jid = model[titer][C_JID].decode('utf-8') + jid = model[titer][C_JID] path = model.get_path(titer) - account = model[titer][C_ACCOUNT].decode('utf-8') + account = model[titer][C_ACCOUNT] contact = gajim.contacts.get_contact_with_highest_priority(account, jid) menu = Gtk.Menu() @@ -6181,8 +6178,8 @@ class RosterWindow: def make_groupchat_menu(self, event, titer): model = self.modelfilter - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] contact = gajim.contacts.get_contact_with_highest_priority(account, jid) menu = Gtk.Menu() diff --git a/src/session.py b/src/session.py index c43f5c930..eb3df3f19 100644 --- a/src/session.py +++ b/src/session.py @@ -90,7 +90,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): msg_to_log = obj.msgtxt obj.msg_id = gajim.logger.write(log_type, obj.fjid, msg_to_log, tim=obj.timestamp, subject=obj.subject) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: gajim.nec.push_incoming_event(InformationEvent(None, conn=self.conn, level='error', pri_txt=_('Disk Write Error'), sec_txt=str(e))) @@ -423,7 +423,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): 'submit': try: self.archiving_accepted(form) - except exceptions.NegotiationError, details: + except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) return @@ -452,7 +452,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): try: self.accept_e2e_alice(form, negotiated) - except exceptions.NegotiationError, details: + except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) def reject_nondefault_options(): @@ -476,7 +476,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): else: try: self.accept_e2e_alice(form, negotiated) - except exceptions.NegotiationError, details: + except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) return @@ -484,21 +484,21 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): 'result': try: self.we_accept_archiving(form) - except exceptions.NegotiationError, details: + except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) return elif self.status == 'responded-e2e' and form.getType() == 'result': try: self.accept_e2e_bob(form) - except exceptions.NegotiationError, details: + except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) return elif self.status == 'identified-alice' and form.getType() == 'result': try: self.final_steps_alice(form) - except exceptions.NegotiationError, details: + except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) return diff --git a/src/statusicon.py b/src/statusicon.py index ceb4a5bee..8f5b82a38 100644 --- a/src/statusicon.py +++ b/src/statusicon.py @@ -477,7 +477,7 @@ class StatusIcon: def on_change_status_message_activate(self, widget): model = gajim.interface.roster.status_combobox.get_model() active = gajim.interface.roster.status_combobox.get_active() - status = model[active][2].decode('utf-8') + status = model[active][2] def on_response(message, pep_dict): if message is None: # None if user press Cancel return diff --git a/src/tooltips.py b/src/tooltips.py index 40c189d80..6fe799a89 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -235,13 +235,10 @@ class StatusTable: self.current_row + 1) def get_status_info(self, resource, priority, show, status): - str_status = resource + ' (' + unicode(priority) + ')' + str_status = resource + ' (' + str(priority) + ')' if status: status = status.strip() if status != '': - # make sure 'status' is unicode before we send to to reduce_chars - if isinstance(status, str): - status = unicode(status, encoding='utf-8') # reduce to 100 chars, 1 line status = helpers.reduce_chars_newlines(status, 100, 1) str_status = GObject.markup_escape_text(str_status) @@ -301,10 +298,6 @@ class NotificationAreaTooltip(BaseTooltip, StatusTable): file_path = os.path.join(helpers.get_iconset_path(iconset), '16x16') for acct in accounts: message = acct['message'] - # before reducing the chars we should assure we send unicode, else - # there are possible pango TBs on 'set_markup' - if isinstance(message, str): - message = unicode(message, encoding = 'utf-8') message = helpers.reduce_chars_newlines(message, 100, 1) message = GObject.markup_escape_text(message) if acct['name'] in gajim.con_types and \ @@ -606,7 +599,7 @@ class RosterTooltip(NotificationAreaTooltip): if num_resources == 1 and contact.resource: properties.append((_('Resource: '), GObject.markup_escape_text(contact.resource) +\ - ' (' + unicode(contact.priority) + ')')) + ' (' + str(contact.priority) + ')')) if self.account and prim_contact.sub and prim_contact.sub != 'both' and\ prim_contact.jid not in gajim.gc_connected[self.account]: @@ -644,9 +637,9 @@ class RosterTooltip(NotificationAreaTooltip): 'tooltip_idle_color') cs += '%s' properties.append((str(), None)) - idle_since = helpers.ensure_utf8_string(cs % _("Idle since %s")) + idle_since = cs % _("Idle since %s") properties.append((idle_since % formatted, None)) - idle_for = helpers.ensure_utf8_string(cs % _("Idle for %s")) + idle_for = cs % _("Idle for %s") properties.append((idle_for % str(diff), None)) while properties: @@ -670,7 +663,7 @@ class RosterTooltip(NotificationAreaTooltip): vcard_current_row + 1, Gtk.AttachOptions.EXPAND | \ Gtk.AttachOptions.FILL, vertical_fill, 0, 0) else: - if isinstance(property_[0], (unicode, str)): # FIXME: rm unicode? + if isinstance(property_[0], str): label.set_markup(property_[0]) label.set_line_wrap(True) else: @@ -743,7 +736,7 @@ class FileTransfersTooltip(BaseTooltip): if file_props.type_ == 'r': type_ = _('Download') actor = _('Sender: ') - sender = unicode(file_props.sender).split('/')[0] + sender = file_props.sender.split('/')[0] name = gajim.contacts.get_first_contact_from_jid( file_props.tt_account, sender).get_shown_name() else: diff --git a/src/vcard.py b/src/vcard.py index 4adf4f961..8fa203c10 100644 --- a/src/vcard.py +++ b/src/vcard.py @@ -61,7 +61,7 @@ def get_avatar_pixbuf_encoded_mime(photo): img_encoded = photo['BINVAL'] avatar_encoded = img_encoded try: - img_decoded = base64.decodestring(img_encoded) + img_decoded = base64.b64decode(img_encoded.encode('utf-8')).decode('utf-8') except Exception: pass if img_decoded: @@ -408,10 +408,10 @@ class VcardWindow: tt_text = _("There is no pending subscription request.") eb.set_tooltip_text(tt_text) - resources = '%s (%s)' % (self.contact.resource, unicode( - self.contact.priority)) + resources = '%s (%s)' % (self.contact.resource, str( + self.contact.priority)) uf_resources = self.contact.resource + _(' resource with priority ')\ - + unicode(self.contact.priority) + + str(self.contact.priority) if not self.contact.status: self.contact.status = '' @@ -462,9 +462,9 @@ class VcardWindow: for c in contact_list: if c.resource != self.contact.resource: resources += '\n%s (%s)' % (c.resource, - unicode(c.priority)) + str(c.priority)) uf_resources += '\n' + c.resource + \ - _(' resource with priority ') + unicode(c.priority) + _(' resource with priority ') + str(c.priority) if c.show not in ('offline', 'error'): GObject.idle_add( gajim.connections[self.account].request_os_info, c.jid, @@ -584,10 +584,10 @@ class ZeroconfVcardWindow: '') self.xml.get_object('local_jid_label').set_text(self.contact.jid) - resources = '%s (%s)' % (self.contact.resource, unicode( - self.contact.priority)) + resources = '%s (%s)' % (self.contact.resource, str( + self.contact.priority)) uf_resources = self.contact.resource + _(' resource with priority ')\ - + unicode(self.contact.priority) + + str(self.contact.priority) if not self.contact.status: self.contact.status = '' diff --git a/test/integration/test_resolver.py b/test/integration/test_resolver.py index d80ffee87..2de36d8e8 100644 --- a/test/integration/test_resolver.py +++ b/test/integration/test_resolver.py @@ -46,7 +46,7 @@ class TestResolver(unittest.TestCase): def testLibAsyncNSResolver(self): self._reset() if not resolver.USE_LIBASYNCNS: - print 'testLibAsyncResolver: libasyncns-python not installed' + print('testLibAsyncResolver: libasyncns-python not installed') return self.resolver = resolver.LibAsyncNSResolver() diff --git a/test/integration/test_roster.py b/test/integration/test_roster.py index 43f40ed76..5b81f5824 100644 --- a/test/integration/test_roster.py +++ b/test/integration/test_roster.py @@ -186,13 +186,13 @@ class TestRosterWindowMetaContacts(TestRosterWindowRegrouped): def test_connect_new_metacontact(self): self.test_fill_roster_model() - jid = u'coolstuff@gajim.org' + jid = 'coolstuff@gajim.org' contact = gajim.contacts.create_contact(jid, account1) gajim.contacts.add_contact(account1, contact) self.roster.add_contact(jid, account1) self.roster.chg_contact_status(contact, 'offline', '', account1) - gajim.contacts.add_metacontact(account1, u'samejid@gajim.org', + gajim.contacts.add_metacontact(account1, 'samejid@gajim.org', account1, jid) self.roster.chg_contact_status(contact, 'online', '', account1) diff --git a/test/integration/test_xmpp_client_nb.py b/test/integration/test_xmpp_client_nb.py index 971f321de..3159552ba 100644 --- a/test/integration/test_xmpp_client_nb.py +++ b/test/integration/test_xmpp_client_nb.py @@ -132,7 +132,7 @@ class TestNonBlockingClient(unittest.TestCase): self.assert_(self.connection.con) features = self.client.Dispatcher.Stream.features if not features.getTag('auth'): - print "Server doesn't support old authentication type, ignoring test" + print("Server doesn't support old authentication type, ignoring test") else: self.assert_(self.connection.auth=='old_auth', msg='Unable to auth via old_auth') diff --git a/test/integration/test_xmpp_transports_nb.py b/test/integration/test_xmpp_transports_nb.py index 98f2c87fc..9f7fb0d5d 100644 --- a/test/integration/test_xmpp_transports_nb.py +++ b/test/integration/test_xmpp_transports_nb.py @@ -72,7 +72,7 @@ class TestNonBlockingTCP(AbstractTransportTest): ips = socket.getaddrinfo('gajim.org', 5222, socket.AF_UNSPEC, socket.SOCK_STREAM) ip = ips[0] - except socket.error, e: + except socket.error as e: self.testcase.fail(msg=str(e)) self.socket = transports_nb.NonBlockingTCP( diff --git a/test/lib/data.py b/test/lib/data.py index af2a87057..584af050e 100755 --- a/test/lib/data.py +++ b/test/lib/data.py @@ -1,77 +1,77 @@ # -*- coding: utf-8 -*- -account1 = u'acc1' -account2 = u'Cool"chârßéµö' -account3 = u'dingdong.org' +account1 = 'acc1' +account2 = 'Cool"chârßéµö' +account3 = 'dingdong.org' contacts = {} contacts[account1] = { - u'myjid@'+account1: { + 'myjid@'+account1: { 'ask': None, 'groups': [], 'name': None, 'resources': {}, - 'subscription': u'both'}, - u'default1@gajim.org': { + 'subscription': 'both'}, + 'default1@gajim.org': { 'ask': None, 'groups': [], 'name': None, 'resources': {}, - 'subscription': u'both'}, - u'default2@gajim.org': { - 'ask': None, 'groups': [u'GroupA',], 'name': None, 'resources': {}, - 'subscription': u'both'}, - u'Cool"chârßéµö@gajim.org': { - 'ask': None, 'groups': [u'= 0' + print('verbose must be a number >= 0') sys.exit(2) # new test modules need to be added manually diff --git a/test/unit/test_jingle.py b/test/unit/test_jingle.py index 94131ede7..ce9edeb66 100644 --- a/test/unit/test_jingle.py +++ b/test/unit/test_jingle.py @@ -17,7 +17,7 @@ from common.socks5 import SocksQueue import common -session_init = ''' +session_init = ''' @@ -38,10 +38,10 @@ session_init = ''' - + ''' - - + + transport_info = ''' ") - + def _simulate_jingle_session(self): - + self.dispatcher.RegisterHandler('iq', self.con._JingleCB, 'set' , common.xmpp.NS_JINGLE) self.dispatcher.ProcessNonBlocking(session_init) - session = self.con._sessions.values()[0] # The only session we have - jft = session.contents.values()[0] # jingleFT object + session = list(self.con._sessions.values())[0] # The only session we have + jft = list(session.contents.values())[0] # jingleFT object jft.file_props = self.recieve_file # We plug file_props manually # The user accepts to recieve the file # we have to manually simulate this behavior session.approve_session() self.con.send_file_approval(self.recieve_file) - + self.dispatcher.ProcessNonBlocking(transport_info) - + def test_jingle_session(self): self._simulate_connect() self._simulate_jingle_session() - - + + if __name__ == '__main__': diff --git a/test/unit/test_socks5.py b/test/unit/test_socks5.py index 3d5d92943..86f46d033 100644 --- a/test/unit/test_socks5.py +++ b/test/unit/test_socks5.py @@ -16,10 +16,10 @@ from common import jingle_xtls class fake_sock(Mock): def __init__(self, sockobj): Mock.__init__(self) - + self.sockobj = sockobj - - + + def setup_stream(self): sha1 = self.sockobj._get_sha1_auth() @@ -36,29 +36,29 @@ class fake_sock(Mock): def switch_stream(self): # Roles are reversed, client will be expecting server stream # and server will be expecting client stream - + temp = self.incoming self.incoming = self.outgoing self.outgoing = temp def _recv(self, foo): return self.incoming.pop(0) - + def _send(self, data): - # This method is surrounded by a try block, + # This method is surrounded by a try block, # we can't use assert here - + if data != self.outgoing[0]: - print 'FAILED SENDING TEST' + print('FAILED SENDING TEST') self.outgoing.pop(0) class fake_idlequeue(Mock): def __init__(self): - Mock.__init__(self) - + Mock.__init__(self) + def plug_idle(self, obj, writable=True, readable=True): - + if readable: obj.pollin() if writable: @@ -77,7 +77,7 @@ class TestSocks5(unittest.TestCase): queue.file_props = {} #self.sockobj = Socks5Receiver(fake_idlequeue(), streamhost, None) self.sockobj = Socks5Sender(fake_idlequeue(), None, 'server', Mock() , - None, None, True, file_props={}) + None, None, True, file_props={}) sock = fake_sock(self.sockobj) self.sockobj._sock = sock self.sockobj._recv = sock._recv @@ -85,70 +85,70 @@ class TestSocks5(unittest.TestCase): self.sockobj.state = 1 self.sockobj.connected = True self.sockobj.pollend = self._pollend - + # Something that the receiver needs #self.sockobj.file_props['type'] = 'r' - + # Something that the sender needs self.sockobj.file_props = {} self.sockobj.file_props['type'] = 'r' self.sockobj.file_props['paused'] = '' self.sockobj.queue = Mock() self.sockobj.queue.process_result = self._pollend - + def _pollend(self, foo = None, duu = None): # This is a disconnect function sys.exit("end of the road") def _check_inout(self): # Check if there isn't anything else to receive or send - sock = self.sockobj._sock + sock = self.sockobj._sock assert(sock.incoming == []) assert(sock.outgoing == []) - + def test_connection_server(self): return mocksock = self.sockobj._sock mocksock.setup_stream() - #self.sockobj._sock.switch_stream() + #self.sockobj._sock.switch_stream() s = socket.socket(2, 1, 6) server = ('127.0.0.1', 28000) s.connect(server) - - s.send(mocksock.outgoing.pop(0)) - self.assertEquals(s.recv(64), mocksock.incoming.pop(0)) - + s.send(mocksock.outgoing.pop(0)) self.assertEquals(s.recv(64), mocksock.incoming.pop(0)) - + + s.send(mocksock.outgoing.pop(0)) + self.assertEquals(s.recv(64), mocksock.incoming.pop(0)) + def test_connection_client(self): - - + + mocksock = self.sockobj._sock mocksock.setup_stream() - mocksock.switch_stream() + mocksock.switch_stream() s = socket.socket(10, 1, 6) - - + + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) - + netadd = ('::', 28000, 0, 0) s.bind(netadd) s.listen(socket.SOMAXCONN) (s, address) = s.accept() - - - self.assertEquals(s.recv(64), mocksock.incoming.pop(0)) + + + self.assertEquals(s.recv(64), mocksock.incoming.pop(0)) s.send(mocksock.outgoing.pop(0)) - + buff = s.recv(64) inco = mocksock.incoming.pop(0) #self.assertEquals(s.recv(64), mocksock.incoming.pop(0)) s.send(mocksock.outgoing.pop(0)) - + def test_client_negoc(self): return self.sockobj._sock.setup_stream() @@ -156,22 +156,22 @@ class TestSocks5(unittest.TestCase): self.sockobj.pollout() except SystemExit: pass - - self._check_inout() - + + self._check_inout() + def test_server_negoc(self): return self.sockobj._sock.setup_stream() - self.sockobj._sock.switch_stream() + self.sockobj._sock.switch_stream() try: self.sockobj.idlequeue.plug_idle(self.sockobj, False, True) except SystemExit: pass self._check_inout() - - - + + + if __name__ == '__main__': - + unittest.main() diff --git a/test/unit/test_xmpp_transports_nb.py b/test/unit/test_xmpp_transports_nb.py index 633549560..771bf5f1b 100644 --- a/test/unit/test_xmpp_transports_nb.py +++ b/test/unit/test_xmpp_transports_nb.py @@ -40,38 +40,38 @@ class TestModuleLevelFunctions(unittest.TestCase): self.assertEqual(_user, user) self.assertEqual(_passwd, passwd) - bosh_dict = {'bosh_content': u'text/xml; charset=utf-8', + bosh_dict = {'bosh_content': 'text/xml; charset=utf-8', 'bosh_hold': 2, 'bosh_http_pipelining': False, - 'bosh_uri': u'http://gajim.org:5280/http-bind', + 'bosh_uri': 'http://gajim.org:5280/http-bind', 'bosh_useproxy': False, 'bosh_wait': 30, 'bosh_wait_for_restart_response': False, - 'host': u'172.16.99.11', - 'pass': u'pass', + 'host': '172.16.99.11', + 'pass': 'pass', 'port': 3128, - 'type': u'bosh', + 'type': 'bosh', 'useauth': True, - 'user': u'user'} - check_dict(bosh_dict, host=u'gajim.org', port=5280, user=u'user', - passwd=u'pass') + 'user': 'user'} + check_dict(bosh_dict, host='gajim.org', port=5280, user='user', + passwd='pass') - proxy_dict = {'bosh_content': u'text/xml; charset=utf-8', + proxy_dict = {'bosh_content': 'text/xml; charset=utf-8', 'bosh_hold': 2, 'bosh_http_pipelining': False, 'bosh_port': 5280, - 'bosh_uri': u'', + 'bosh_uri': '', 'bosh_useproxy': True, 'bosh_wait': 30, 'bosh_wait_for_restart_response': False, - 'host': u'172.16.99.11', - 'pass': u'pass', + 'host': '172.16.99.11', + 'pass': 'pass', 'port': 3128, 'type': 'socks5', 'useauth': True, - 'user': u'user'} - check_dict(proxy_dict, host=u'172.16.99.11', port=3128, user=u'user', - passwd=u'pass') + 'user': 'user'} + check_dict(proxy_dict, host='172.16.99.11', port=3128, user='user', + passwd='pass') if __name__ == '__main__':