From 71e495b55f9ea10626a639d9b6ca19006dfea879 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger <asterix@lagaule.org> Date: Thu, 1 Dec 2011 18:55:39 +0100 Subject: [PATCH] finish removing plugins --- plugins/acronyms_expander/__init__.py | 1 - .../acronyms_expander/acronyms_expander.py | 98 --- plugins/acronyms_expander/manifest.ini | 9 - plugins/banner_tweaks/plugin.py | 204 ----- plugins/dbus_plugin/__init__.py | 1 - plugins/dbus_plugin/manifest.ini | 10 - plugins/dbus_plugin/plugin.py | 739 ----------------- plugins/events_dump/__init__.py | 1 - plugins/events_dump/manifest.ini | 8 - plugins/events_dump/plugin.py | 124 --- plugins/new_events_example/__init__.py | 1 - plugins/new_events_example/manifest.ini | 11 - plugins/new_events_example/plugin.py | 140 ---- plugins/roster_buttons/__init__.py | 4 - plugins/roster_buttons/manifest.ini | 10 - plugins/roster_buttons/plugin.py | 80 -- plugins/roster_buttons/roster_buttons.ui | 70 -- plugins/snarl_notifications/PySnarl.py | 772 ------------------ plugins/snarl_notifications/__init__.py | 1 - plugins/snarl_notifications/manifest.ini | 11 - plugins/snarl_notifications/plugin.py | 71 -- 21 files changed, 2366 deletions(-) delete mode 100644 plugins/acronyms_expander/__init__.py delete mode 100644 plugins/acronyms_expander/acronyms_expander.py delete mode 100644 plugins/acronyms_expander/manifest.ini delete mode 100644 plugins/banner_tweaks/plugin.py delete mode 100644 plugins/dbus_plugin/__init__.py delete mode 100644 plugins/dbus_plugin/manifest.ini delete mode 100644 plugins/dbus_plugin/plugin.py delete mode 100644 plugins/events_dump/__init__.py delete mode 100644 plugins/events_dump/manifest.ini delete mode 100644 plugins/events_dump/plugin.py delete mode 100644 plugins/new_events_example/__init__.py delete mode 100644 plugins/new_events_example/manifest.ini delete mode 100644 plugins/new_events_example/plugin.py delete mode 100644 plugins/roster_buttons/__init__.py delete mode 100644 plugins/roster_buttons/manifest.ini delete mode 100644 plugins/roster_buttons/plugin.py delete mode 100644 plugins/roster_buttons/roster_buttons.ui delete mode 100755 plugins/snarl_notifications/PySnarl.py delete mode 100644 plugins/snarl_notifications/__init__.py delete mode 100644 plugins/snarl_notifications/manifest.ini delete mode 100644 plugins/snarl_notifications/plugin.py diff --git a/plugins/acronyms_expander/__init__.py b/plugins/acronyms_expander/__init__.py deleted file mode 100644 index 25280942c4..0000000000 --- a/plugins/acronyms_expander/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from acronyms_expander import AcronymsExpanderPlugin diff --git a/plugins/acronyms_expander/acronyms_expander.py b/plugins/acronyms_expander/acronyms_expander.py deleted file mode 100644 index d98e255ff2..0000000000 --- a/plugins/acronyms_expander/acronyms_expander.py +++ /dev/null @@ -1,98 +0,0 @@ -# -*- coding: utf-8 -*- - -## This file is part of Gajim. -## -## Gajim is free software; you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published -## by the Free Software Foundation; version 3 only. -## -## Gajim is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with Gajim. If not, see <http://www.gnu.org/licenses/>. -## - -''' -Acronyms expander plugin. - -:author: Mateusz Biliński <mateusz@bilinski.it> -:since: 9th June 2008 -:copyright: Copyright (2008) Mateusz Biliński <mateusz@bilinski.it> -:license: GPL -''' - -import sys - -import gtk -import gobject - -from plugins import GajimPlugin -from plugins.helpers import log, log_calls - -class AcronymsExpanderPlugin(GajimPlugin): - - @log_calls('AcronymsExpanderPlugin') - def init(self): - self.description = _('Replaces acronyms (or other strings) ' - 'with given expansions/substitutes.') - self.config_dialog = None - - self.gui_extension_points = { - 'chat_control_base': (self.connect_with_chat_control_base, - self.disconnect_from_chat_control_base) - } - - self.config_default_values = { - 'INVOKER': (' ', ''), - 'ACRONYMS': ({'RTFM': 'Read The Friendly Manual', - '/slap': '/me slaps', - 'PS-': 'plug-in system', - 'G-': 'Gajim', - 'GNT-': 'http://trac.gajim.org/newticket', - 'GW-': 'http://trac.gajim.org/', - 'GTS-': 'http://trac.gajim.org/report', - }, - ''), - } - - @log_calls('AcronymsExpanderPlugin') - def textbuffer_live_acronym_expander(self, tb): - """ - @param tb gtk.TextBuffer - """ - #assert isinstance(tb,gtk.TextBuffer) - ACRONYMS = self.config['ACRONYMS'] - INVOKER = self.config['INVOKER'] - t = tb.get_text(tb.get_start_iter(), tb.get_end_iter()) - #log.debug('%s %d'%(t, len(t))) - if t and t[-1] == INVOKER: - #log.debug('changing msg text') - base, sep, head=t[:-1].rpartition(INVOKER) - log.debug('%s | %s | %s'%(base, sep, head)) - if head in ACRONYMS: - head = ACRONYMS[head] - #log.debug('head: %s'%(head)) - t = ''.join((base, sep, head, INVOKER)) - #log.debug("setting text: '%s'"%(t)) - gobject.idle_add(tb.set_text, t) - - @log_calls('AcronymsExpanderPlugin') - def connect_with_chat_control_base(self, chat_control): - d = {} - tv = chat_control.msg_textview - tb = tv.get_buffer() - h_id = tb.connect('changed', self.textbuffer_live_acronym_expander) - d['h_id'] = h_id - - chat_control.acronyms_expander_plugin_data = d - - return True - - @log_calls('AcronymsExpanderPlugin') - def disconnect_from_chat_control_base(self, chat_control): - d = chat_control.acronyms_expander_plugin_data - tv = chat_control.msg_textview - tv.get_buffer().disconnect(d['h_id']) diff --git a/plugins/acronyms_expander/manifest.ini b/plugins/acronyms_expander/manifest.ini deleted file mode 100644 index 0674c2f886..0000000000 --- a/plugins/acronyms_expander/manifest.ini +++ /dev/null @@ -1,9 +0,0 @@ -[info] -name: Acronyms Expander -short_name: acronyms_expander -version: 0.1 -description: Replaces acronyms (or other strings) with given expansions/substitutes. -authors: Mateusz Biliński <mateusz@bilinski.it> -homepage: http://blog.bilinski.it - - diff --git a/plugins/banner_tweaks/plugin.py b/plugins/banner_tweaks/plugin.py deleted file mode 100644 index 6e9d3a6816..0000000000 --- a/plugins/banner_tweaks/plugin.py +++ /dev/null @@ -1,204 +0,0 @@ -# -*- coding: utf-8 -*- - -## This file is part of Gajim. -## -## Gajim is free software; you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published -## by the Free Software Foundation; version 3 only. -## -## Gajim is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with Gajim. If not, see <http://www.gnu.org/licenses/>. -## - -''' -Adjustable chat window banner. - -Includes tweaks to make it compact. - -Based on patch by pb in ticket #4133: -http://trac.gajim.org/attachment/ticket/4133/gajim-chatbanneroptions-svn10008.patch - -:author: Mateusz Biliński <mateusz@bilinski.it> -:since: 30 July 2008 -:copyright: Copyright (2008) Mateusz Biliński <mateusz@bilinski.it> -:license: GPL -''' - -import sys - -import gtk -import gobject -import message_control -from common import gajim -from common import helpers - -from plugins import GajimPlugin -from plugins.helpers import log, log_calls -from plugins.gui import GajimPluginConfigDialog - -class BannerTweaksPlugin(GajimPlugin): - - @log_calls('BannerTweaksPlugin') - def init(self): - self.description = _('Allows user to tweak chat window banner ' - 'appearance (eg. make it compact).\n' - 'Based on patch by pb in ticket #4133:\n' - 'http://trac.gajim.org/attachment/ticket/4133.') - self.config_dialog = BannerTweaksPluginConfigDialog(self) - - self.gui_extension_points = { - 'chat_control_base_draw_banner': (self.chat_control_base_draw_banner_called, - self.chat_control_base_draw_banner_deactivation) - } - - self.config_default_values = { - 'show_banner_image': (True, 'If True, Gajim will display a status icon in the banner of chat windows.'), - 'show_banner_online_msg': (True, 'If True, Gajim will display the status message of the contact in the banner of chat windows.'), - 'show_banner_resource': (False, 'If True, Gajim will display the resource name of the contact in the banner of chat windows.'), - 'banner_small_fonts': (False, 'If True, Gajim will use small fonts for contact name and resource name in the banner of chat windows.'), - 'old_chat_avatar_height': (52, 'chat_avatar_height value before plugin was activated'), - } - - @log_calls('BannerTweaksPlugin') - def activate(self): - self.config['old_chat_avatar_height'] = gajim.config.get('chat_avatar_height') - #gajim.config.set('chat_avatar_height', 28) - - @log_calls('BannerTweaksPlugin') - def deactivate(self): - gajim.config.set('chat_avatar_height', self.config['old_chat_avatar_height']) - - @log_calls('BannerTweaksPlugin') - def chat_control_base_draw_banner_called(self, chat_control): - if not self.config['show_banner_online_msg']: - chat_control.banner_status_label.hide() - chat_control.banner_status_label.set_no_show_all(True) - status_text = '' - chat_control.banner_status_label.set_markup(status_text) - - if not self.config['show_banner_image']: - if chat_control.TYPE_ID == message_control.TYPE_GC: - banner_status_img = chat_control.xml.get_object( - 'gc_banner_status_image') - else: - banner_status_img = chat_control.xml.get_object( - 'banner_status_image') - banner_status_img.clear() - - # TODO: part below repeats a lot of code from ChatControl.draw_banner_text() - # This could be rewritten using re module: getting markup text from - # banner_name_label and replacing some elements based on plugin config. - # Would it be faster? - if self.config['show_banner_resource'] or self.config['banner_small_fonts']: - banner_name_label = chat_control.xml.get_object('banner_name_label') - label_text = banner_name_label.get_label() - - contact = chat_control.contact - jid = contact.jid - - name = contact.get_shown_name() - if chat_control.resource: - name += '/' + chat_control.resource - elif contact.resource and self.config['show_banner_resource']: - name += '/' + contact.resource - - if chat_control.TYPE_ID == message_control.TYPE_PM: - name = _('%(nickname)s from group chat %(room_name)s') %\ - {'nickname': name, 'room_name': chat_control.room_name} - name = gobject.markup_escape_text(name) - - # We know our contacts nick, but if another contact has the same nick - # in another account we need to also display the account. - # except if we are talking to two different resources of the same contact - acct_info = '' - for account in gajim.contacts.get_accounts(): - if account == chat_control.account: - continue - if acct_info: # We already found a contact with same nick - break - for jid in gajim.contacts.get_jid_list(account): - other_contact_ = \ - gajim.contacts.get_first_contact_from_jid(account, jid) - if other_contact_.get_shown_name() == chat_control.contact.get_shown_name(): - acct_info = ' (%s)' % \ - gobject.markup_escape_text(chat_control.account) - break - - font_attrs, font_attrs_small = chat_control.get_font_attrs() - if self.config['banner_small_fonts']: - font_attrs = font_attrs_small - - st = gajim.config.get('displayed_chat_state_notifications') - cs = contact.chatstate - if cs and st in ('composing_only', 'all'): - if contact.show == 'offline': - chatstate = '' - elif contact.composing_xep == 'XEP-0085': - if st == 'all' or cs == 'composing': - chatstate = helpers.get_uf_chatstate(cs) - else: - chatstate = '' - elif contact.composing_xep == 'XEP-0022': - if cs in ('composing', 'paused'): - # only print composing, paused - chatstate = helpers.get_uf_chatstate(cs) - else: - chatstate = '' - else: - # When does that happen ? See [7797] and [7804] - chatstate = helpers.get_uf_chatstate(cs) - - label_text = '<span %s>%s</span><span %s>%s %s</span>' % \ - (font_attrs, name, font_attrs_small, acct_info, chatstate) - else: - # weight="heavy" size="x-large" - label_text = '<span %s>%s</span><span %s>%s</span>' % \ - (font_attrs, name, font_attrs_small, acct_info) - - banner_name_label.set_markup(label_text) - - @log_calls('BannerTweaksPlugin') - def chat_control_base_draw_banner_deactivation(self, chat_control): - pass - #chat_control.draw_banner() - -class BannerTweaksPluginConfigDialog(GajimPluginConfigDialog): - def init(self): - self.GTK_BUILDER_FILE_PATH = self.plugin.local_file_path( - 'config_dialog.ui') - self.xml = gtk.Builder() - self.xml.set_translation_domain('gajim_plugins') - self.xml.add_objects_from_file(self.GTK_BUILDER_FILE_PATH, - ['banner_tweaks_config_vbox']) - self.config_vbox = self.xml.get_object('banner_tweaks_config_vbox') - self.child.pack_start(self.config_vbox) - - self.show_banner_image_checkbutton = self.xml.get_object('show_banner_image_checkbutton') - self.show_banner_online_msg_checkbutton = self.xml.get_object('show_banner_online_msg_checkbutton') - self.show_banner_resource_checkbutton = self.xml.get_object('show_banner_resource_checkbutton') - self.banner_small_fonts_checkbutton = self.xml.get_object('banner_small_fonts_checkbutton') - - self.xml.connect_signals(self) - - def on_run(self): - self.show_banner_image_checkbutton.set_active(self.plugin.config['show_banner_image']) - self.show_banner_online_msg_checkbutton.set_active(self.plugin.config['show_banner_online_msg']) - self.show_banner_resource_checkbutton.set_active(self.plugin.config['show_banner_resource']) - self.banner_small_fonts_checkbutton.set_active(self.plugin.config['banner_small_fonts']) - - def on_show_banner_image_checkbutton_toggled(self, button): - self.plugin.config['show_banner_image'] = button.get_active() - - def on_show_banner_online_msg_checkbutton_toggled(self, button): - self.plugin.config['show_banner_online_msg'] = button.get_active() - - def on_show_banner_resource_checkbutton_toggled(self, button): - self.plugin.config['show_banner_resource'] = button.get_active() - - def on_banner_small_fonts_checkbutton_toggled(self, button): - self.plugin.config['banner_small_fonts'] = button.get_active() diff --git a/plugins/dbus_plugin/__init__.py b/plugins/dbus_plugin/__init__.py deleted file mode 100644 index 3851c6bb99..0000000000 --- a/plugins/dbus_plugin/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from plugin import DBusPlugin diff --git a/plugins/dbus_plugin/manifest.ini b/plugins/dbus_plugin/manifest.ini deleted file mode 100644 index 6322eae999..0000000000 --- a/plugins/dbus_plugin/manifest.ini +++ /dev/null @@ -1,10 +0,0 @@ -[info] -name: D-Bus Support -short_name: dbus -version: 0.1 -description: D-Bus support. Based on remote_control module from - Gajim core but uses new events handling system. -authors = Mateusz Biliński <mateusz@bilinski.it> -homepage = http://blog.bilinski.it - - diff --git a/plugins/dbus_plugin/plugin.py b/plugins/dbus_plugin/plugin.py deleted file mode 100644 index 3a583a7cfa..0000000000 --- a/plugins/dbus_plugin/plugin.py +++ /dev/null @@ -1,739 +0,0 @@ -# -*- coding: utf-8 -*- - -## Copyright (C) 2005-2006 Yann Leboulanger <asterix@lagaule.org> -## Copyright (C) 2005-2006 Nikos Kouremenos <kourem@gmail.com> -## Copyright (C) 2005-2006 Dimitur Kirov <dkirov@gmail.com> -## Copyright (C) 2005-2006 Andrew Sayman <lorien420@myrealbox.com> -## Copyright (C) 2007 Lukas Petrovicky <lukas@petrovicky.net> -## Copyright (C) 2007 Julien Pivotto <roidelapluie@gmail.com> -## Copyright (C) 2007 Travis Shirk <travis@pobox.com> -## Copyright (C) 2008 Mateusz Biliński <mateusz@bilinski.it> -## -## This file is part of Gajim. -## -## Gajim is free software; you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published -## by the Free Software Foundation; version 3 only. -## -## Gajim is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with Gajim. If not, see <http://www.gnu.org/licenses/>. -## -''' -D-BUS Support plugin. - -Based on src/remote_control.py - -:author: Mateusz Biliński <mateusz@bilinski.it> -:since: 8th August 2008 -:copyright: Copyright (2008) Mateusz Biliński <mateusz@bilinski.it> -:license: GPL -''' -import os -import new - -import gobject - - -from common import dbus_support -if dbus_support.supported: - import dbus - if dbus_support: - INTERFACE = 'org.gajim.dbusplugin.RemoteInterface' - OBJ_PATH = '/org/gajim/dbusplugin/RemoteObject' - SERVICE = 'org.gajim.dbusplugin' - - import dbus.service - import dbus.glib - # type mapping - - # in most cases it is a utf-8 string - DBUS_STRING = dbus.String - - # general type (for use in dicts, where all values should have the same type) - DBUS_BOOLEAN = dbus.Boolean - DBUS_DOUBLE = dbus.Double - DBUS_INT32 = dbus.Int32 - # dictionary with string key and binary value - DBUS_DICT_SV = lambda : dbus.Dictionary({}, signature="sv") - # dictionary with string key and value - DBUS_DICT_SS = lambda : dbus.Dictionary({}, signature="ss") - # empty type (there is no equivalent of None on D-Bus, but historically gajim - # used 0 instead) - DBUS_NONE = lambda : dbus.Int32(0) - - def get_dbus_struct(obj): - ''' recursively go through all the items and replace - them with their casted dbus equivalents - ''' - if obj is None: - return DBUS_NONE() - if isinstance(obj, (unicode, str)): - return DBUS_STRING(obj) - if isinstance(obj, int): - return DBUS_INT32(obj) - if isinstance(obj, float): - return DBUS_DOUBLE(obj) - if isinstance(obj, bool): - return DBUS_BOOLEAN(obj) - if isinstance(obj, (list, tuple)): - result = dbus.Array([get_dbus_struct(i) for i in obj], - signature='v') - if result == []: - return DBUS_NONE() - return result - if isinstance(obj, dict): - result = DBUS_DICT_SV() - for key, value in obj.items(): - result[DBUS_STRING(key)] = get_dbus_struct(value) - if result == {}: - return DBUS_NONE() - return result - # unknown type - return DBUS_NONE() - - class SignalObject(dbus.service.Object): - ''' Local object definition for /org/gajim/dbus/RemoteObject. - (This docstring is not be visible, - because the clients can access only the remote object.)''' - - def __init__(self, bus_name): - self.first_show = True - self.vcard_account = None - - # register our dbus API - dbus.service.Object.__init__(self, bus_name, OBJ_PATH) - - @dbus.service.signal(INTERFACE, signature='av') - def Roster(self, account_and_data): - pass - - @dbus.service.signal(INTERFACE, signature='av') - def AccountPresence(self, status_and_account): - pass - - @dbus.service.signal(INTERFACE, signature='av') - def ContactPresence(self, account_and_array): - pass - - @dbus.service.signal(INTERFACE, signature='av') - def ContactAbsence(self, account_and_array): - pass - - @dbus.service.signal(INTERFACE, signature='av') - def ContactStatus(self, account_and_array): - pass - - @dbus.service.signal(INTERFACE, signature='av') - def NewMessage(self, account_and_array): - pass - - @dbus.service.signal(INTERFACE, signature='av') - def Subscribe(self, account_and_array): - pass - - @dbus.service.signal(INTERFACE, signature='av') - def Subscribed(self, account_and_array): - pass - - @dbus.service.signal(INTERFACE, signature='av') - def Unsubscribed(self, account_and_jid): - pass - - @dbus.service.signal(INTERFACE, signature='av') - def NewAccount(self, account_and_array): - pass - - @dbus.service.signal(INTERFACE, signature='av') - def VcardInfo(self, account_and_vcard): - pass - - @dbus.service.signal(INTERFACE, signature='av') - def LastStatusTime(self, account_and_array): - pass - - @dbus.service.signal(INTERFACE, signature='av') - def OsInfo(self, account_and_array): - pass - - @dbus.service.signal(INTERFACE, signature='av') - def GCPresence(self, account_and_array): - pass - - @dbus.service.signal(INTERFACE, signature='av') - def GCMessage(self, account_and_array): - pass - - @dbus.service.signal(INTERFACE, signature='av') - def RosterInfo(self, account_and_array): - pass - - @dbus.service.signal(INTERFACE, signature='av') - def NewGmail(self, account_and_array): - pass - - @dbus.service.signal(INTERFACE, signature='av') - def EntityTime(self, account_and_array): - pass - - def raise_signal(self, signal, arg): - '''raise a signal, with a single argument of unspecified type - Instead of obj.raise_signal("Foo", bar), use obj.Foo(bar).''' - getattr(self, signal)(arg) - - @dbus.service.method(INTERFACE, in_signature='s', out_signature='s') - def get_status(self, account): - '''Returns status (show to be exact) which is the global one - unless account is given''' - if not account: - # If user did not ask for account, returns the global status - return DBUS_STRING(helpers.get_global_show()) - # return show for the given account - index = gajim.connections[account].connected - return DBUS_STRING(gajim.SHOW_LIST[index]) - - @dbus.service.method(INTERFACE, in_signature='s', out_signature='s') - def get_status_message(self, account): - '''Returns status which is the global one - unless account is given''' - if not account: - # If user did not ask for account, returns the global status - return DBUS_STRING(str(helpers.get_global_status())) - # return show for the given account - status = gajim.connections[account].status - return DBUS_STRING(status) - - def _get_account_and_contact(self, account, jid): - '''get the account (if not given) and contact instance from jid''' - connected_account = None - contact = None - accounts = gajim.contacts.get_accounts() - # if there is only one account in roster, take it as default - # if user did not ask for account - if not account and len(accounts) == 1: - account = accounts[0] - if account: - if gajim.connections[account].connected > 1: # account is connected - connected_account = account - contact = gajim.contacts.get_contact_with_highest_priority(account, - jid) - else: - for account in accounts: - contact = gajim.contacts.get_contact_with_highest_priority(account, - jid) - if contact and gajim.connections[account].connected > 1: - # account is connected - connected_account = account - break - if not contact: - contact = jid - - return connected_account, contact - - def _get_account_for_groupchat(self, account, room_jid): - '''get the account which is connected to groupchat (if not given) - or check if the given account is connected to the groupchat''' - connected_account = None - accounts = gajim.contacts.get_accounts() - # if there is only one account in roster, take it as default - # if user did not ask for account - if not account and len(accounts) == 1: - account = accounts[0] - if account: - if gajim.connections[account].connected > 1 and \ - room_jid in gajim.gc_connected[account] and \ - gajim.gc_connected[account][room_jid]: - # account and groupchat are connected - connected_account = account - else: - for account in accounts: - if gajim.connections[account].connected > 1 and \ - room_jid in gajim.gc_connected[account] and \ - gajim.gc_connected[account][room_jid]: - # account and groupchat are connected - connected_account = account - break - return connected_account - - @dbus.service.method(INTERFACE, in_signature='sss', out_signature='b') - def send_file(self, file_path, jid, account): - '''send file, located at 'file_path' to 'jid', using account - (optional) 'account' ''' - jid = self._get_real_jid(jid, account) - connected_account, contact = self._get_account_and_contact(account, jid) - - if connected_account: - if file_path[:7] == 'file://': - file_path=file_path[7:] - if os.path.isfile(file_path): # is it file? - gajim.interface.instances['file_transfers'].send_file( - connected_account, contact, file_path) - return DBUS_BOOLEAN(True) - return DBUS_BOOLEAN(False) - - def _send_message(self, jid, message, keyID, account, type = 'chat', - subject = None): - '''can be called from send_chat_message (default when send_message) - or send_single_message''' - if not jid or not message: - return DBUS_BOOLEAN(False) - if not keyID: - keyID = '' - - connected_account, contact = self._get_account_and_contact(account, jid) - if connected_account: - connection = gajim.connections[connected_account] - connection.send_message(jid, message, keyID, type, subject) - return DBUS_BOOLEAN(True) - return DBUS_BOOLEAN(False) - - @dbus.service.method(INTERFACE, in_signature='ssss', out_signature='b') - def send_chat_message(self, jid, message, keyID, account): - '''Send chat 'message' to 'jid', using account (optional) 'account'. - if keyID is specified, encrypt the message with the pgp key ''' - jid = self._get_real_jid(jid, account) - return self._send_message(jid, message, keyID, account) - - @dbus.service.method(INTERFACE, in_signature='sssss', out_signature='b') - def send_single_message(self, jid, subject, message, keyID, account): - '''Send single 'message' to 'jid', using account (optional) 'account'. - if keyID is specified, encrypt the message with the pgp key ''' - jid = self._get_real_jid(jid, account) - return self._send_message(jid, message, keyID, account, type, subject) - - @dbus.service.method(INTERFACE, in_signature='sss', out_signature='b') - def send_groupchat_message(self, room_jid, message, account): - '''Send 'message' to groupchat 'room_jid', - using account (optional) 'account'.''' - if not room_jid or not message: - return DBUS_BOOLEAN(False) - connected_account = self._get_account_for_groupchat(account, room_jid) - if connected_account: - connection = gajim.connections[connected_account] - connection.send_gc_message(room_jid, message) - return DBUS_BOOLEAN(True) - return DBUS_BOOLEAN(False) - - @dbus.service.method(INTERFACE, in_signature='ss', out_signature='b') - def open_chat(self, jid, account): - '''Shows the tabbed window for new message to 'jid', using account - (optional) 'account' ''' - if not jid: - raise MissingArgument - return DBUS_BOOLEAN(False) - jid = self._get_real_jid(jid, account) - try: - jid = helpers.parse_jid(jid) - except: - # Jid is not conform, ignore it - return DBUS_BOOLEAN(False) - - if account: - accounts = [account] - else: - accounts = gajim.connections.keys() - if len(accounts) == 1: - account = accounts[0] - connected_account = None - first_connected_acct = None - for acct in accounts: - if gajim.connections[acct].connected > 1: # account is online - contact = gajim.contacts.get_first_contact_from_jid(acct, jid) - if gajim.interface.msg_win_mgr.has_window(jid, acct): - connected_account = acct - break - # jid is in roster - elif contact: - connected_account = acct - break - # we send the message to jid not in roster, because account is - # specified, or there is only one account - elif account: - connected_account = acct - elif first_connected_acct is None: - first_connected_acct = acct - - # if jid is not a conntact, open-chat with first connected account - if connected_account is None and first_connected_acct: - connected_account = first_connected_acct - - if connected_account: - gajim.interface.new_chat_from_jid(connected_account, jid) - # preserve the 'steal focus preservation' - win = gajim.interface.msg_win_mgr.get_window(jid, - connected_account).window - if win.get_property('visible'): - win.window.focus() - return DBUS_BOOLEAN(True) - return DBUS_BOOLEAN(False) - - @dbus.service.method(INTERFACE, in_signature='sss', out_signature='b') - def change_status(self, status, message, account): - ''' change_status(status, message, account). account is optional - - if not specified status is changed for all accounts. ''' - if status not in ('offline', 'online', 'chat', - 'away', 'xa', 'dnd', 'invisible'): - return DBUS_BOOLEAN(False) - if account: - gobject.idle_add(gajim.interface.roster.send_status, account, - status, message) - else: - # account not specified, so change the status of all accounts - for acc in gajim.contacts.get_accounts(): - if not gajim.config.get_per('accounts', acc, - 'sync_with_global_status'): - continue - gobject.idle_add(gajim.interface.roster.send_status, acc, - status, message) - return DBUS_BOOLEAN(False) - - @dbus.service.method(INTERFACE, in_signature='', out_signature='') - def show_next_pending_event(self): - '''Show the window(s) with next pending event in tabbed/group chats.''' - if gajim.events.get_nb_events(): - gajim.interface.systray.handle_first_event() - - @dbus.service.method(INTERFACE, in_signature='s', out_signature='a{sv}') - def contact_info(self, jid): - '''get vcard info for a contact. Return cached value of the vcard. - ''' - if not isinstance(jid, unicode): - jid = unicode(jid) - if not jid: - raise MissingArgument - return DBUS_DICT_SV() - jid = self._get_real_jid(jid) - - cached_vcard = gajim.connections.values()[0].get_cached_vcard(jid) - if cached_vcard: - return get_dbus_struct(cached_vcard) - - # return empty dict - return DBUS_DICT_SV() - - @dbus.service.method(INTERFACE, in_signature='', out_signature='as') - def list_accounts(self): - '''list register accounts''' - result = gajim.contacts.get_accounts() - result_array = dbus.Array([], signature='s') - if result and len(result) > 0: - for account in result: - result_array.append(DBUS_STRING(account)) - return result_array - - @dbus.service.method(INTERFACE, in_signature='s', out_signature='a{ss}') - def account_info(self, account): - '''show info on account: resource, jid, nick, prio, message''' - result = DBUS_DICT_SS() - if gajim.connections.has_key(account): - # account is valid - con = gajim.connections[account] - index = con.connected - result['status'] = DBUS_STRING(gajim.SHOW_LIST[index]) - 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'))) - return result - - @dbus.service.method(INTERFACE, in_signature='s', out_signature='aa{sv}') - def list_contacts(self, account): - '''list all contacts in the roster. If the first argument is specified, - then return the contacts for the specified account''' - result = dbus.Array([], signature='aa{sv}') - accounts = gajim.contacts.get_accounts() - if len(accounts) == 0: - return result - if account: - accounts_to_search = [account] - else: - accounts_to_search = accounts - for acct in accounts_to_search: - if acct in accounts: - for jid in gajim.contacts.get_jid_list(acct): - item = self._contacts_as_dbus_structure( - gajim.contacts.get_contacts(acct, jid)) - if item: - result.append(item) - return result - - @dbus.service.method(INTERFACE, in_signature='', out_signature='') - def toggle_roster_appearance(self): - ''' shows/hides the roster window ''' - win = gajim.interface.roster.window - if win.get_property('visible'): - gobject.idle_add(win.hide) - else: - win.present() - # preserve the 'steal focus preservation' - if self._is_first(): - win.window.focus() - else: - win.window.focus(long(time())) - - @dbus.service.method(INTERFACE, in_signature='', out_signature='') - def toggle_ipython(self): - ''' shows/hides the ipython window ''' - win = gajim.ipython_window - if win: - if win.window.is_visible(): - gobject.idle_add(win.hide) - else: - win.show_all() - win.present() - else: - gajim.interface.create_ipython_window() - - @dbus.service.method(INTERFACE, in_signature='', out_signature='a{ss}') - def prefs_list(self): - prefs_dict = DBUS_DICT_SS() - def get_prefs(data, name, path, value): - if value is None: - return - key = '' - if path is not None: - for node in path: - key += node + '#' - key += name - prefs_dict[DBUS_STRING(key)] = DBUS_STRING(value[1]) - gajim.config.foreach(get_prefs) - return prefs_dict - - @dbus.service.method(INTERFACE, in_signature='', out_signature='b') - def prefs_store(self): - try: - gajim.interface.save_config() - except Exception, e: - return DBUS_BOOLEAN(False) - return DBUS_BOOLEAN(True) - - @dbus.service.method(INTERFACE, in_signature='s', out_signature='b') - def prefs_del(self, key): - if not key: - return DBUS_BOOLEAN(False) - key_path = key.split('#', 2) - if len(key_path) != 3: - return DBUS_BOOLEAN(False) - if key_path[2] == '*': - gajim.config.del_per(key_path[0], key_path[1]) - else: - gajim.config.del_per(key_path[0], key_path[1], key_path[2]) - return DBUS_BOOLEAN(True) - - @dbus.service.method(INTERFACE, in_signature='s', out_signature='b') - def prefs_put(self, key): - if not key: - return DBUS_BOOLEAN(False) - key_path = key.split('#', 2) - if len(key_path) < 3: - subname, value = key.split('=', 1) - gajim.config.set(subname, value) - return DBUS_BOOLEAN(True) - subname, value = key_path[2].split('=', 1) - gajim.config.set_per(key_path[0], key_path[1], subname, value) - return DBUS_BOOLEAN(True) - - @dbus.service.method(INTERFACE, in_signature='ss', out_signature='b') - def add_contact(self, jid, account): - if account: - if account in gajim.connections and \ - gajim.connections[account].connected > 1: - # if given account is active, use it - AddNewContactWindow(account = account, jid = jid) - else: - # wrong account - return DBUS_BOOLEAN(False) - else: - # if account is not given, show account combobox - AddNewContactWindow(account = None, jid = jid) - return DBUS_BOOLEAN(True) - - @dbus.service.method(INTERFACE, in_signature='ss', out_signature='b') - def remove_contact(self, jid, account): - jid = self._get_real_jid(jid, account) - accounts = gajim.contacts.get_accounts() - - # if there is only one account in roster, take it as default - if account: - accounts = [account] - contact_exists = False - for account in accounts: - contacts = gajim.contacts.get_contacts(account, jid) - if contacts: - gajim.connections[account].unsubscribe(jid) - for contact in contacts: - gajim.interface.roster.remove_contact(contact, account) - gajim.contacts.remove_jid(account, jid) - contact_exists = True - return DBUS_BOOLEAN(contact_exists) - - def _is_first(self): - if self.first_show: - self.first_show = False - return True - return False - - def _get_real_jid(self, jid, account = None): - '''get the real jid from the given one: removes xmpp: or get jid from nick - if account is specified, search only in this account - ''' - if account: - accounts = [account] - else: - accounts = gajim.connections.keys() - if jid.startswith('xmpp:'): - return jid[5:] # len('xmpp:') = 5 - nick_in_roster = None # Is jid a nick ? - for account in accounts: - # Does jid exists in roster of one account ? - if gajim.contacts.get_contacts(account, jid): - return jid - if not nick_in_roster: - # look in all contact if one has jid as nick - for jid_ in gajim.contacts.get_jid_list(account): - c = gajim.contacts.get_contacts(account, jid_) - if c[0].name == jid: - nick_in_roster = jid_ - break - if nick_in_roster: - # We have not found jid in roster, but we found is as a nick - return nick_in_roster - # We have not found it as jid nor as nick, probably a not in roster jid - return jid - - def _contacts_as_dbus_structure(self, contacts): - ''' get info from list of Contact objects and create dbus dict ''' - if not contacts: - return None - prim_contact = None # primary contact - for contact in contacts: - if prim_contact is None or contact.priority > prim_contact.priority: - prim_contact = contact - contact_dict = DBUS_DICT_SV() - contact_dict['name'] = DBUS_STRING(prim_contact.name) - contact_dict['show'] = DBUS_STRING(prim_contact.show) - contact_dict['jid'] = DBUS_STRING(prim_contact.jid) - if prim_contact.keyID: - keyID = None - if len(prim_contact.keyID) == 8: - keyID = prim_contact.keyID - elif len(prim_contact.keyID) == 16: - keyID = prim_contact.keyID[8:] - if keyID: - contact_dict['openpgp'] = keyID - contact_dict['resources'] = dbus.Array([], signature='(sis)') - for contact in contacts: - resource_props = dbus.Struct((DBUS_STRING(contact.resource), - dbus.Int32(contact.priority), DBUS_STRING(contact.status))) - contact_dict['resources'].append(resource_props) - contact_dict['groups'] = dbus.Array([], signature='(s)') - for group in prim_contact.groups: - contact_dict['groups'].append((DBUS_STRING(group),)) - return contact_dict - - @dbus.service.method(INTERFACE, in_signature='', out_signature='s') - def get_unread_msgs_number(self): - return DBUS_STRING(str(gajim.events.get_nb_events())) - - @dbus.service.method(INTERFACE, in_signature='s', out_signature='b') - def start_chat(self, account): - if not account: - # error is shown in gajim-remote check_arguments(..) - return DBUS_BOOLEAN(False) - NewChatDialog(account) - return DBUS_BOOLEAN(True) - - @dbus.service.method(INTERFACE, in_signature='ss', out_signature='') - def send_xml(self, xml, account): - if account: - gajim.connections[account].send_stanza(xml) - else: - for acc in gajim.contacts.get_accounts(): - gajim.connections[acc].send_stanza(xml) - - @dbus.service.method(INTERFACE, in_signature='ssss', out_signature='') - def join_room(self, room_jid, nick, password, account): - if not account: - # get the first connected account - accounts = gajim.connections.keys() - for acct in accounts: - if gajim.account_is_connected(acct): - account = acct - break - if not account: - return - if not nick: - nick = '' - gajim.interface.instances[account]['join_gc'] = \ - JoinGroupchatWindow(account, room_jid, nick) - else: - gajim.interface.join_gc_room(account, room_jid, nick, password) - -from common import gajim -from common import helpers -from time import time -from dialogs import AddNewContactWindow, NewChatDialog, JoinGroupchatWindow - -from plugins import GajimPlugin -from plugins.helpers import log_calls, log -from common import ged - -class DBusPlugin(GajimPlugin): - - @log_calls('DBusPlugin') - def init(self): - self.description = _('D-Bus support.' - ' Based on remote_control module from' - '\nGajim core but uses new events handling system.') - self.config_dialog = None - #self.gui_extension_points = {} - #self.config_default_values = {} - - self.events_names = ['Roster', 'AccountPresence', 'ContactPresence', - 'ContactAbsence', 'ContactStatus', 'NewMessage', - 'Subscribe', 'Subscribed', 'Unsubscribed', - 'NewAccount', 'VcardInfo', 'LastStatusTime', - 'OsInfo', 'GCPresence', 'GCMessage', 'RosterInfo', - 'NewGmail', 'EntityTime'] - - self.signal_object = None - - self.events_handlers = {} - self._set_handling_methods() - - @log_calls('DBusPlugin') - def activate(self): - session_bus = dbus_support.session_bus.SessionBus() - - bus_name = dbus.service.BusName(SERVICE, bus=session_bus) - self.signal_object = SignalObject(bus_name) - - @log_calls('DBusPlugin') - def deactivate(self): - self.signal_object.remove_from_connection() - self.signal_object = None - - @log_calls('DBusPlugin') - def _set_handling_methods(self): - for event_name in self.events_names: - setattr(self, event_name, - new.instancemethod( - self._generate_handling_method(event_name), - self, - DBusPlugin)) - self.events_handlers[event_name] = (ged.POSTCORE, - getattr(self, event_name)) - - def _generate_handling_method(self, event_name): - def handler(self, arg): - #print "Handler of event %s called"%(event_name) - if self.signal_object: - getattr(self.signal_object, event_name)(get_dbus_struct(arg)) - - return handler diff --git a/plugins/events_dump/__init__.py b/plugins/events_dump/__init__.py deleted file mode 100644 index de174c1b9c..0000000000 --- a/plugins/events_dump/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from plugin import EventsDumpPlugin diff --git a/plugins/events_dump/manifest.ini b/plugins/events_dump/manifest.ini deleted file mode 100644 index de46bca7fc..0000000000 --- a/plugins/events_dump/manifest.ini +++ /dev/null @@ -1,8 +0,0 @@ -[info] -name: Events Dump -short_name: events_dump -version: 0.1 -description: Dumps info about selected events to console. -authors = Mateusz Biliński <mateusz@bilinski.it> -homepage = http://blog.bilinski.it - diff --git a/plugins/events_dump/plugin.py b/plugins/events_dump/plugin.py deleted file mode 100644 index 19c5eccfcf..0000000000 --- a/plugins/events_dump/plugin.py +++ /dev/null @@ -1,124 +0,0 @@ -# -*- coding: utf-8 -*- -## -## This file is part of Gajim. -## -## Gajim is free software; you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published -## by the Free Software Foundation; version 3 only. -## -## Gajim is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with Gajim. If not, see <http://www.gnu.org/licenses/>. -## -''' -Events Dump plugin. - -Dumps info about selected events to console. - -:author: Mateusz Biliński <mateusz@bilinski.it> -:since: 10th August 2008 -:copyright: Copyright (2008) Mateusz Biliński <mateusz@bilinski.it> -:license: GPL -''' - -import new -from pprint import pformat - -from plugins import GajimPlugin -from plugins.helpers import log_calls, log -from common import ged - -class EventsDumpPlugin(GajimPlugin): - - @log_calls('EventsDumpPlugin') - def init(self): - self.description = _('Dumps info about selected events to console.') - self.config_dialog = None - #self.gui_extension_points = {} - #self.config_default_values = {} - events_from_old_dbus_support = [ - 'Roster', 'AccountPresence', 'ContactPresence', - 'ContactAbsence', 'ContactStatus', 'NewMessage', - 'Subscribe', 'Subscribed', 'Unsubscribed', - 'NewAccount', 'VcardInfo', 'LastStatusTime', - 'OsInfo', 'GCPresence', 'GCMessage', 'RosterInfo', - 'NewGmail'] - - events_from_src_gajim = [ - 'ROSTER', 'WARNING', 'ERROR', - 'INFORMATION', 'ERROR_ANSWER', 'STATUS', - 'NOTIFY', 'MSGERROR', 'MSGSENT', 'MSGNOTSENT', - 'SUBSCRIBED', 'UNSUBSCRIBED', 'SUBSCRIBE', - 'AGENT_ERROR_INFO', 'AGENT_ERROR_ITEMS', - 'AGENT_REMOVED', 'REGISTER_AGENT_INFO', - 'AGENT_INFO_ITEMS', 'AGENT_INFO_INFO', - 'QUIT', 'NEW_ACC_CONNECTED', - 'NEW_ACC_NOT_CONNECTED', 'ACC_OK', 'ACC_NOT_OK', - 'MYVCARD', 'VCARD', 'LAST_STATUS_TIME', 'OS_INFO', - 'GC_NOTIFY', 'GC_MSG', 'GC_SUBJECT', 'GC_CONFIG', - 'GC_CONFIG_CHANGE', 'GC_INVITATION', - 'GC_AFFILIATION', 'GC_PASSWORD_REQUIRED', - 'BAD_PASSPHRASE', 'ROSTER_INFO', 'BOOKMARKS', - 'CON_TYPE', 'CONNECTION_LOST', 'FILE_REQUEST', - 'GMAIL_NOTIFY', 'FILE_REQUEST_ERROR', - 'FILE_SEND_ERROR', 'STANZA_ARRIVED', 'STANZA_SENT', - 'HTTP_AUTH', 'VCARD_PUBLISHED', - 'VCARD_NOT_PUBLISHED', 'ASK_NEW_NICK', 'SIGNED_IN', - 'METACONTACTS', 'ATOM_ENTRY', 'FAILED_DECRYPT', - 'PRIVACY_LISTS_RECEIVED', 'PRIVACY_LIST_RECEIVED', - 'PRIVACY_LISTS_ACTIVE_DEFAULT', - 'PRIVACY_LIST_REMOVED', 'ZC_NAME_CONFLICT', - 'PING_SENT', 'PING_REPLY', 'PING_ERROR', - 'SEARCH_FORM', 'SEARCH_RESULT', - 'RESOURCE_CONFLICT', 'PEP_CONFIG', - 'UNIQUE_ROOM_ID_UNSUPPORTED', - 'UNIQUE_ROOM_ID_SUPPORTED', 'SESSION_NEG', - 'GPG_PASSWORD_REQUIRED', 'SSL_ERROR', - 'FINGERPRINT_ERROR', 'PLAIN_CONNECTION', - 'PUBSUB_NODE_REMOVED', 'PUBSUB_NODE_NOT_REMOVED'] - - network_events_from_core = ['raw-message-received', - 'raw-iq-received', - 'raw-pres-received'] - - network_events_generated_in_nec = [ - 'customized-message-received', - 'more-customized-message-received', - 'modify-only-message-received', - 'enriched-chat-message-received'] - - self.events_names = [] - self.events_names += network_events_from_core - self.events_names += network_events_generated_in_nec - - self.events_handlers = {} - self._set_handling_methods() - - @log_calls('EventsDumpPlugin') - def activate(self): - pass - - @log_calls('EventsDumpPlugin') - def deactivate(self): - pass - - @log_calls('EventsDumpPlugin') - def _set_handling_methods(self): - for event_name in self.events_names: - setattr(self, event_name, - new.instancemethod( - self._generate_handling_method(event_name), - self, - EventsDumpPlugin)) - self.events_handlers[event_name] = (ged.POSTCORE, - getattr(self, event_name)) - - def _generate_handling_method(self, event_name): - def handler(self, *args): - print "Event '%s' occured. Arguments: %s\n\n===\n"%(event_name, pformat(args)) - - return handler diff --git a/plugins/new_events_example/__init__.py b/plugins/new_events_example/__init__.py deleted file mode 100644 index 523d43e14c..0000000000 --- a/plugins/new_events_example/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from plugin import NewEventsExamplePlugin diff --git a/plugins/new_events_example/manifest.ini b/plugins/new_events_example/manifest.ini deleted file mode 100644 index a18423d6ad..0000000000 --- a/plugins/new_events_example/manifest.ini +++ /dev/null @@ -1,11 +0,0 @@ -[info] -name: New Events Example -short_name: new_events_example -version: 0.1 -description: Shows how to generate new network events based on existing one using Network Events Controller. -authors = Mateusz Biliński <mateusz@bilinski.it> -homepage = http://blog.bilinski.it - - - - diff --git a/plugins/new_events_example/plugin.py b/plugins/new_events_example/plugin.py deleted file mode 100644 index f66c0dda23..0000000000 --- a/plugins/new_events_example/plugin.py +++ /dev/null @@ -1,140 +0,0 @@ -# -*- coding: utf-8 -*- -## -## This file is part of Gajim. -## -## Gajim is free software; you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published -## by the Free Software Foundation; version 3 only. -## -## Gajim is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with Gajim. If not, see <http://www.gnu.org/licenses/>. -## -''' -New Events Example plugin. - -Demonstrates how to use Network Events Controller to generate new events -based on existing one. - -:author: Mateusz Biliński <mateusz@bilinski.it> -:since: 15th August 2008 -:copyright: Copyright (2008) Mateusz Biliński <mateusz@bilinski.it> -:license: GPL -''' - -import new -from pprint import pformat - -from common import helpers -from common import gajim - -from plugins import GajimPlugin -from plugins.helpers import log_calls, log -from common import ged -from common import nec - -class NewEventsExamplePlugin(GajimPlugin): - - @log_calls('NewEventsExamplePlugin') - def init(self): - self.description = _('Shows how to generate new network events based ' - 'on existing one using Network Events Controller.') - self.config_dialog = None - #self.gui_extension_points = {} - #self.config_default_values = {} - - self.events_handlers = {'raw-message-received' : - (ged.POSTCORE, self.raw_message_received), - 'customized-message-received' : - (ged.POSTCORE, self.customized_message_received), - 'enriched-chat-message-received' : - (ged.POSTCORE, self.enriched_chat_message_received)} - - self.events = [CustomizedMessageReceivedEvent, - MoreCustomizedMessageReceivedEvent, - ModifyOnlyMessageReceivedEvent, - EnrichedChatMessageReceivedEvent] - - def enriched_chat_message_received(self, event_object): - pass - # print "Event '%s' occured. Event object: %s\n\n===\n" % \ - # (event_object.name, event_object) - - def raw_message_received(self, event_object): - pass - # print "Event '%s' occured. Event object: %s\n\n===\n" % \ - # (event_object.name,event_object) - - def customized_message_received(self, event_object): - pass - # print "Event '%s' occured. Event object: %s\n\n===\n" % \ - # (event_object.name, event_object - - @log_calls('NewEventsExamplePlugin') - def activate(self): - pass - - @log_calls('NewEventsExamplePlugin') - def deactivate(self): - pass - -class CustomizedMessageReceivedEvent(nec.NetworkIncomingEvent): - name = 'customized-message-received' - base_network_events = ['raw-message-received'] - - def generate(self): - return True - -class MoreCustomizedMessageReceivedEvent(nec.NetworkIncomingEvent): - ''' - Shows chain of custom created events. - - This one is based on custom 'customized-messsage-received'. - ''' - name = 'more-customized-message-received' - base_network_events = ['customized-message-received'] - - def generate(self): - return True - -class ModifyOnlyMessageReceivedEvent(nec.NetworkIncomingEvent): - name = 'modify-only-message-received' - base_network_events = ['raw-message-received'] - - def generate(self): - msg_type = self.base_event.stanza.attrs.get('type', None) - if msg_type == u'chat': - msg_text = ''.join(self.base_event.stanza.kids[0].data) - self.base_event.stanza.kids[0].setData( - u'%s [MODIFIED BY CUSTOM NETWORK EVENT]' % (msg_text)) - - return False - -class EnrichedChatMessageReceivedEvent(nec.NetworkIncomingEvent): - ''' - Generates more friendly (in use by handlers) network event for - received chat message. - ''' - name = 'enriched-chat-message-received' - base_network_events = ['raw-message-received'] - - def generate(self): - msg_type = self.base_event.stanza.attrs.get('type', None) - if msg_type == u'chat': - self.stanza = self.base_event.stanza - self.conn = self.base_event.conn - self.from_jid = helpers.get_full_jid_from_iq(self.stanza) - self.from_jid_without_resource = gajim.get_jid_without_resource( - self.from_jid) - self.account = self.conn.name - self.from_nickname = gajim.get_contact_name_from_jid( self.account, - self.from_jid_without_resource) - self.msg_text = ''.join(self.stanza.kids[0].data) - - return True - - return False diff --git a/plugins/roster_buttons/__init__.py b/plugins/roster_buttons/__init__.py deleted file mode 100644 index 48754d57c6..0000000000 --- a/plugins/roster_buttons/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ - -__all__ = ['RosterButtonsPlugin'] - -from plugin import RosterButtonsPlugin diff --git a/plugins/roster_buttons/manifest.ini b/plugins/roster_buttons/manifest.ini deleted file mode 100644 index f928c19166..0000000000 --- a/plugins/roster_buttons/manifest.ini +++ /dev/null @@ -1,10 +0,0 @@ -[info] -name: Roster Buttons -short_name: roster_buttons -version: 0.1 -description: Adds quick action buttons to roster window. -authors = Mateusz Biliński <mateusz@bilinski.it> -homepage = http://blog.bilinski.it - - - diff --git a/plugins/roster_buttons/plugin.py b/plugins/roster_buttons/plugin.py deleted file mode 100644 index 026658b5e7..0000000000 --- a/plugins/roster_buttons/plugin.py +++ /dev/null @@ -1,80 +0,0 @@ -# -*- coding: utf-8 -*- - -## This file is part of Gajim. -## -## Gajim is free software; you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published -## by the Free Software Foundation; version 3 only. -## -## Gajim is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with Gajim. If not, see <http://www.gnu.org/licenses/>. -## - -''' -Roster buttons plug-in. - -:author: Mateusz Biliński <mateusz@bilinski.it> -:since: 14th June 2008 -:copyright: Copyright (2008) Mateusz Biliński <mateusz@bilinski.it> -:license: GPL -''' - -import sys - -import gtk -from common import gajim - -from plugins import GajimPlugin -from plugins.helpers import log, log_calls - -class RosterButtonsPlugin(GajimPlugin): - - @log_calls('RosterButtonsPlugin') - def init(self): - self.description = _('Adds quick action buttons to roster window.') - self.GTK_BUILDER_FILE_PATH = self.local_file_path('roster_buttons.ui') - self.roster_vbox = gajim.interface.roster.xml.get_object('roster_vbox2') - self.show_offline_contacts_menuitem = gajim.interface.roster.xml.get_object('show_offline_contacts_menuitem') - - self.config_dialog = None - - @log_calls('RosterButtonsPlugin') - def activate(self): - self.xml = gtk.Builder() - self.xml.set_translation_domain('gajim_plugins') - self.xml.add_objects_from_file(self.GTK_BUILDER_FILE_PATH, - ['roster_buttons_buttonbox']) - self.buttonbox = self.xml.get_object('roster_buttons_buttonbox') - - self.roster_vbox.pack_start(self.buttonbox, expand=False) - self.roster_vbox.reorder_child(self.buttonbox, 0) - self.xml.connect_signals(self) - - @log_calls('RosterButtonsPlugin') - def deactivate(self): - self.roster_vbox.remove(self.buttonbox) - - self.buttonbox = None - self.xml = None - - @log_calls('RosterButtonsPlugin') - def on_roster_button_1_clicked(self, button): - #gajim.interface.roster.on_show_offline_contacts_menuitem_activate(None) - self.show_offline_contacts_menuitem.set_active(not self.show_offline_contacts_menuitem.get_active()) - - @log_calls('RosterButtonsPlugin') - def on_roster_button_2_clicked(self, button): - pass - - @log_calls('RosterButtonsPlugin') - def on_roster_button_3_clicked(self, button): - pass - - @log_calls('RosterButtonsPlugin') - def on_roster_button_4_clicked(self, button): - pass diff --git a/plugins/roster_buttons/roster_buttons.ui b/plugins/roster_buttons/roster_buttons.ui deleted file mode 100644 index 3ed25235b3..0000000000 --- a/plugins/roster_buttons/roster_buttons.ui +++ /dev/null @@ -1,70 +0,0 @@ -<?xml version="1.0"?> -<interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy toplevel-contextual --> - <object class="GtkWindow" id="window1"> - <child> - <object class="GtkHButtonBox" id="roster_buttons_buttonbox"> - <property name="visible">True</property> - <property name="homogeneous">True</property> - <property name="layout_style">spread</property> - <child> - <object class="GtkButton" id="roster_button_1"> - <property name="label">1</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <signal name="clicked" handler="on_roster_button_1_clicked"/> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="roster_button_2"> - <property name="label">2</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <signal name="clicked" handler="on_roster_button_2_clicked"/> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkButton" id="roster_button_3"> - <property name="label">3</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <signal name="clicked" handler="on_roster_button_3_clicked"/> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">2</property> - </packing> - </child> - <child> - <object class="GtkButton" id="roster_button_4"> - <property name="label">4</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <signal name="clicked" handler="on_roster_button_4_clicked"/> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">3</property> - </packing> - </child> - </object> - </child> - </object> -</interface> diff --git a/plugins/snarl_notifications/PySnarl.py b/plugins/snarl_notifications/PySnarl.py deleted file mode 100755 index c3c657e56f..0000000000 --- a/plugins/snarl_notifications/PySnarl.py +++ /dev/null @@ -1,772 +0,0 @@ -""" -A python version of the main functions to use Snarl -(http://www.fullphat.net/snarl) - -Version 1.0 - -This module can be used in two ways. One is the normal way -the other snarl interfaces work. This means you can call snShowMessage -and get an ID back for manipulations. - -The other way is there is a class this module exposes called SnarlMessage. -This allows you to keep track of the message as a python object. If you -use the send without specifying False as the argument it will set the ID -to what the return of the last SendMessage was. This is of course only -useful for the SHOW message. - -Requires one of: - pywin32 extensions from http://pywin32.sourceforge.net - ctypes (included in Python 2.5, downloadable for earlier versions) - -Creator: Sam Listopad II (samlii@users.sourceforge.net) - -Copyright 2006-2008 Samuel Listopad II - -Licensed under the Apache License, Version 2.0 (the "License"); you may not -use this file except in compliance with the License. You may obtain a copy -of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required -by applicable law or agreed to in writing, software distributed under the -License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS -OF ANY KIND, either express or implied. See the License for the specific -language governing permissions and limitations under the License. -""" - -import array, struct - -def LOWORD(dword): - """Return the low WORD of the passed in integer""" - return dword & 0x0000ffff -#get the hi word -def HIWORD(dword): - """Return the high WORD of the passed in integer""" - return dword >> 16 - -class Win32FuncException(Exception): - def __init__(self, value): - self.value = value - - def __str__(self): - return repr(self.value) - -class Win32Funcs: - """Just a little class to hide the details of finding and using the -correct win32 functions. The functions may throw a UnicodeEncodeError if -there is not a unicode version and it is sent a unicode string that cannot -be converted to ASCII.""" - WM_USER = 0x400 - WM_COPYDATA = 0x4a - #Type of String the functions are expecting. - #Used like function(myWin32Funcs.strType(param)). - __strType = str - #FindWindow function to use - __FindWindow = None - #FindWindow function to use - __FindWindowEx = None - #SendMessage function to use - __SendMessage = None - #SendMessageTimeout function to use - __SendMessageTimeout = None - #IsWindow function to use - __IsWindow = None - #RegisterWindowMessage to use - __RegisterWindowMessage = None - #GetWindowText to use - __GetWindowText = None - - def FindWindow(self, lpClassName, lpWindowName): - """Wraps the windows API call of FindWindow""" - if lpClassName is not None: - lpClassName = self.__strType(lpClassName) - if lpWindowName is not None: - lpWindowName = self.__strType(lpWindowName) - return self.__FindWindow(lpClassName, lpWindowName) - - def FindWindowEx(self, hwndParent, hwndChildAfter, lpClassName, lpWindowName): - """Wraps the windows API call of FindWindow""" - if lpClassName is not None: - lpClassName = self.__strType(lpClassName) - if lpWindowName is not None: - lpWindowName = self.__strType(lpWindowName) - return self.__FindWindowEx(hwndParent, hwndChildAfter, lpClassName, lpWindowName) - - def SendMessage(self, hWnd, Msg, wParam, lParam): - """Wraps the windows API call of SendMessage""" - return self.__SendMessage(hWnd, Msg, wParam, lParam) - - def SendMessageTimeout(self, hWnd, Msg, - wParam, lParam, fuFlags, - uTimeout, lpdwResult = None): - """Wraps the windows API call of SendMessageTimeout""" - idToRet = None - try: - idFromMsg = array.array('I', [0]) - result = idFromMsg.buffer_info()[0] - response = self.__SendMessageTimeout(hWnd, Msg, wParam, - lParam, fuFlags, - uTimeout, result) - if response == 0: - raise Win32FuncException, "SendMessageTimeout TimedOut" - - idToRet = idFromMsg[0] - except TypeError: - idToRet = self.__SendMessageTimeout(hWnd, Msg, wParam, - lParam, fuFlags, - uTimeout) - - if lpdwResult is not None and lpdwResult.typecode == 'I': - lpdwResult[0] = idToRet - - return idToRet - - def IsWindow(self, hWnd): - """Wraps the windows API call of IsWindow""" - return self.__IsWindow(hWnd) - - def RegisterWindowMessage(self, lpString): - """Wraps the windows API call of RegisterWindowMessage""" - return self.__RegisterWindowMessage(self.__strType(lpString)) - - def GetWindowText(self, hWnd, lpString = None, nMaxCount = None): - """Wraps the windows API call of SendMessageTimeout""" - text = '' - if hWnd == 0: - return text - - if nMaxCount is None: - nMaxCount = 1025 - - try: - arrayType = 'c' - if self.__strType == unicode: - arrayType = 'u' - path_string = array.array(arrayType, self.__strType('\x00') * nMaxCount) - path_buffer = path_string.buffer_info()[0] - result = self.__GetWindowText(hWnd, - path_buffer, - nMaxCount) - if result > 0: - if self.__strType == unicode: - text = path_string[0:result].tounicode() - else: - text = path_string[0:result].tostring() - except TypeError: - text = self.__GetWindowText(hWnd) - - if lpString is not None and lpString.typecode == 'c': - lpdwResult[0:len(text)] = array.array('c', str(text)); - - if lpString is not None and lpString.typecode == 'u': - lpdwResult[0:len(text)] = array.array('u', unicode(text)); - - return text - - def __init__(self): - """Load up my needed functions""" - # First see if they already have win32gui imported. If so use it. - # This has to be checked first since the auto check looks for ctypes - # first. - try: - self.__FindWindow = win32gui.FindWindow - self.__FindWindowEx = win32gui.FindWindowEx - self.__GetWindowText = win32gui.GetWindowText - self.__IsWindow = win32gui.IsWindow - self.__SendMessage = win32gui.SendMessage - self.__SendMessageTimeout = win32gui.SendMessageTimeout - self.__RegisterWindowMessage = win32gui.RegisterWindowMessage - self.__strType = unicode - - #Something threw a NameError, most likely the win32gui lines - #so do auto check - except NameError: - try: - from ctypes import windll - self.__FindWindow = windll.user32.FindWindowW - self.__FindWindowEx = windll.user32.FindWindowExW - self.__GetWindowText = windll.user32.GetWindowTextW - self.__IsWindow = windll.user32.IsWindow - self.__SendMessage = windll.user32.SendMessageW - self.__SendMessageTimeout = windll.user32.SendMessageTimeoutW - self.__RegisterWindowMessage = windll.user32.RegisterWindowMessageW - self.__strType = unicode - - #FindWindowW wasn't found, look for FindWindowA - except AttributeError: - try: - self.__FindWindow = windll.user32.FindWindowA - self.__FindWindowEx = windll.user32.FindWindowExA - self.__GetWindowText = windll.user32.GetWindowTextA - self.__IsWindow = windll.user32.IsWindow - self.__SendMessage = windll.user32.SendMessageA - self.__SendMessageTimeout = windll.user32.SendMessageTimeoutA - self.__RegisterWindowMessage = windll.user32.RegisterWindowMessageA - # Couldn't find either so Die and tell user why. - except AttributeError: - import sys - sys.stderr.write("Your Windows TM setup seems to be corrupt."+ - " No FindWindow found in user32.\n") - sys.stderr.flush() - sys.exit(3) - - except ImportError: - try: - import win32gui - self.__FindWindow = win32gui.FindWindow - self.__FindWindowEx = win32gui.FindWindowEx - self.__GetWindowText = win32gui.GetWindowText - self.__IsWindow = win32gui.IsWindow - self.__SendMessage = win32gui.SendMessage - self.__SendMessageTimeout = win32gui.SendMessageTimeout - self.__RegisterWindowMessage = win32gui.RegisterWindowMessage - self.__strType = unicode - - except ImportError: - import sys - sys.stderr.write("You need to have either"+ - " ctypes or pywin32 installed.\n") - sys.stderr.flush() - #sys.exit(2) - - -myWin32Funcs = Win32Funcs() - - -SHOW = 1 -HIDE = 2 -UPDATE = 3 -IS_VISIBLE = 4 -GET_VERSION = 5 -REGISTER_CONFIG_WINDOW = 6 -REVOKE_CONFIG_WINDOW = 7 -REGISTER_ALERT = 8 -REVOKE_ALERT = 9 -REGISTER_CONFIG_WINDOW_2 = 10 -GET_VERSION_EX = 11 -SET_TIMEOUT = 12 - -EX_SHOW = 32 - -GLOBAL_MESSAGE = "SnarlGlobalMessage" -GLOBAL_MSG = "SnarlGlobalEvent" - -#Messages That may be received from Snarl -SNARL_LAUNCHED = 1 -SNARL_QUIT = 2 -SNARL_ASK_APPLET_VER = 3 -SNARL_SHOW_APP_UI = 4 - -SNARL_NOTIFICATION_CLICKED = 32 #notification was right-clicked by user -SNARL_NOTIFICATION_CANCELLED = SNARL_NOTIFICATION_CLICKED #Name clarified -SNARL_NOTIFICATION_TIMED_OUT = 33 -SNARL_NOTIFICATION_ACK = 34 #notification was left-clicked by user - -#Snarl Test Message -WM_SNARLTEST = myWin32Funcs.WM_USER + 237 - -M_ABORTED = 0x80000007L -M_ACCESS_DENIED = 0x80000009L -M_ALREADY_EXISTS = 0x8000000CL -M_BAD_HANDLE = 0x80000006L -M_BAD_POINTER = 0x80000005L -M_FAILED = 0x80000008L -M_INVALID_ARGS = 0x80000003L -M_NO_INTERFACE = 0x80000004L -M_NOT_FOUND = 0x8000000BL -M_NOT_IMPLEMENTED = 0x80000001L -M_OK = 0x00000000L -M_OUT_OF_MEMORY = 0x80000002L -M_TIMED_OUT = 0x8000000AL - -ErrorCodeRev = { - 0x80000007L : "M_ABORTED", - 0x80000009L : "M_ACCESS_DENIED", - 0x8000000CL : "M_ALREADY_EXISTS", - 0x80000006L : "M_BAD_HANDLE", - 0x80000005L : "M_BAD_POINTER", - 0x80000008L : "M_FAILED", - 0x80000003L : "M_INVALID_ARGS", - 0x80000004L : "M_NO_INTERFACE", - 0x8000000BL : "M_NOT_FOUND", - 0x80000001L : "M_NOT_IMPLEMENTED", - 0x00000000L : "M_OK", - 0x80000002L : "M_OUT_OF_MEMORY", - 0x8000000AL : "M_TIMED_OUT" - } - -class SnarlMessage(object): - """The main Snarl interface object. - - ID = Snarl Message ID for most operations. See SDK for more info - as to other values to put here. - type = Snarl Message Type. Valid values are : SHOW, HIDE, UPDATE, - IS_VISIBLE, GET_VERSION, REGISTER_CONFIG_WINDOW, REVOKE_CONFIG_WINDOW - all which are constants in the PySnarl module. - timeout = Timeout in seconds for the Snarl Message - data = Snarl Message data. This is dependant upon message type. See SDK - title = Snarl Message title. - text = Snarl Message text. - icon = Path to the icon to display in the Snarl Message. - """ - __msgType = 0 - __msgID = 0 - __msgTimeout = 0 - __msgData = 0 - __msgTitle = "" - __msgText = "" - __msgIcon = "" - __msgClass = "" - __msgExtra = "" - __msgExtra2 = "" - __msgRsvd1 = 0 - __msgRsvd2 = 0 - __msgHWnd = 0 - - lastKnownHWnd = 0 - - def getType(self): - """Type Attribute getter.""" - return self.__msgType - def setType(self, value): - """Type Attribute setter.""" - if( isinstance(value, (int, long)) ): - self.__msgType = value - type = property(getType, setType, doc="The Snarl Message Type") - - def getID(self): - """ID Attribute getter.""" - return self.__msgID - def setID(self, value): - """ID Attribute setter.""" - if( isinstance(value, (int, long)) ): - self.__msgID = value - ID = property(getID, setID, doc="The Snarl Message ID") - - def getTimeout(self): - """Timeout Attribute getter.""" - return self.__msgTimeout - def updateTimeout(self, value): - """Timeout Attribute setter.""" - if( isinstance(value, (int, long)) ): - self.__msgTimeout = value - timeout = property(getTimeout, updateTimeout, - doc="The Snarl Message Timeout") - - def getData(self): - """Data Attribute getter.""" - return self.__msgData - def setData(self, value): - """Data Attribute setter.""" - if( isinstance(value, (int, long)) ): - self.__msgData = value - data = property(getData, setData, doc="The Snarl Message Data") - - def getTitle(self): - """Title Attribute getter.""" - return self.__msgTitle - def setTitle(self, value): - """Title Attribute setter.""" - if( isinstance(value, basestring) ): - self.__msgTitle = value - title = property(getTitle, setTitle, doc="The Snarl Message Title") - - def getText(self): - """Text Attribute getter.""" - return self.__msgText - def setText(self, value): - """Text Attribute setter.""" - if( isinstance(value, basestring) ): - self.__msgText = value - text = property(getText, setText, doc="The Snarl Message Text") - - def getIcon(self): - """Icon Attribute getter.""" - return self.__msgIcon - def setIcon(self, value): - """Icon Attribute setter.""" - if( isinstance(value, basestring) ): - self.__msgIcon = value - icon = property(getIcon, setIcon, doc="The Snarl Message Icon") - - def getClass(self): - """Class Attribute getter.""" - return self.__msgClass - def setClass(self, value): - """Class Attribute setter.""" - if( isinstance(value, basestring) ): - self.__msgClass = value - msgclass = property(getClass, setClass, doc="The Snarl Message Class") - - def getExtra(self): - """Extra Attribute getter.""" - return self.__msgExtra - def setExtra(self, value): - """Extra Attribute setter.""" - if( isinstance(value, basestring) ): - self.__msgExtra = value - extra = property(getExtra, setExtra, doc="Extra Info for the Snarl Message") - - def getExtra2(self): - """Extra2 Attribute getter.""" - return self.__msgExtra2 - def setExtra2(self, value): - """Extra2 Attribute setter.""" - if( isinstance(value, basestring) ): - self.__msgExtra2 = value - extra2 = property(getExtra2, setExtra2, - doc="More Extra Info for the Snarl Message") - - def getRsvd1(self): - """Rsvd1 Attribute getter.""" - return self.__msgRsvd1 - def setRsvd1(self, value): - """Rsvd1 Attribute setter.""" - if( isinstance(value, (int, long)) ): - self.__msgRsvd1 = value - rsvd1 = property(getRsvd1, setRsvd1, doc="The Snarl Message Field Rsvd1") - - def getRsvd2(self): - """Rsvd2 Attribute getter.""" - return self.__msgRsvd2 - def setRsvd2(self, value): - """Rsvd2 Attribute setter.""" - if( isinstance(value, (int, long)) ): - self.__msgRsvd2 = value - rsvd2 = property(getRsvd2, setRsvd2, doc="The Snarl Message Field Rsvd2") - - def getHwnd(self): - """hWnd Attribute getter.""" - return self.__msgHWnd - def setHwnd(self, value): - """hWnd Attribute setter.""" - if( isinstance(value, (int, long)) ): - self.__msgHWnd = value - - hWnd = property(getHwnd, setHwnd, doc="The hWnd of the window this message is being sent from") - - - def __init__(self, title="", text="", icon="", msg_type=1, msg_id=0): - self.__msgTimeout = 0 - self.__msgData = 0 - self.__msgClass = "" - self.__msgExtra = "" - self.__msgExtra2 = "" - self.__msgRsvd1 = 0 - self.__msgRsvd2 = 0 - self.__msgType = msg_type - self.__msgText = text - self.__msgTitle = title - self.__msgIcon = icon - self.__msgID = msg_id - - def createCopyStruct(self): - """Creates the struct to send as the copyData in the message.""" - return struct.pack("ILLL1024s1024s1024s1024s1024s1024sLL", - self.__msgType, - self.__msgID, - self.__msgTimeout, - self.__msgData, - self.__msgTitle.encode('utf-8'), - self.__msgText.encode('utf-8'), - self.__msgIcon.encode('utf-8'), - self.__msgClass.encode('utf-8'), - self.__msgExtra.encode('utf-8'), - self.__msgExtra2.encode('utf-8'), - self.__msgRsvd1, - self.__msgRsvd2 - ) - __lpData = None - __cds = None - - def packData(self, dwData): - """This packs the data in the necessary format for a -WM_COPYDATA message.""" - self.__lpData = None - self.__cds = None - item = self.createCopyStruct() - self.__lpData = array.array('c', item) - lpData_ad = self.__lpData.buffer_info()[0] - cbData = self.__lpData.buffer_info()[1] - self.__cds = array.array('c', - struct.pack("IIP", - dwData, - cbData, - lpData_ad) - ) - cds_ad = self.__cds.buffer_info()[0] - return cds_ad - - def reset(self): - """Reset this SnarlMessage to the default state.""" - self.__msgType = 0 - self.__msgID = 0 - self.__msgTimeout = 0 - self.__msgData = 0 - self.__msgTitle = "" - self.__msgText = "" - self.__msgIcon = "" - self.__msgClass = "" - self.__msgExtra = "" - self.__msgExtra2 = "" - self.__msgRsvd1 = 0 - self.__msgRsvd2 = 0 - - - def send(self, setid=True): - """Send this SnarlMessage to the Snarl window. -Args: - setid - Boolean defining whether or not to set the ID - of this SnarlMessage to the return value of - the SendMessage call. Default is True to - make simple case of SHOW easy. - """ - hwnd = myWin32Funcs.FindWindow(None, "Snarl") - if myWin32Funcs.IsWindow(hwnd): - if self.type == REGISTER_CONFIG_WINDOW or self.type == REGISTER_CONFIG_WINDOW_2: - self.hWnd = self.data - try: - response = myWin32Funcs.SendMessageTimeout(hwnd, - myWin32Funcs.WM_COPYDATA, - self.hWnd, self.packData(2), - 2, 500) - except Win32FuncException: - return False - - idFromMsg = response - if setid: - self.ID = idFromMsg - return True - else: - return idFromMsg - print "No snarl window found" - return False - - def hide(self): - """Hide this message. Type will revert to type before calling hide -to allow for better reuse of object.""" - oldType = self.__msgType - self.__msgType = HIDE - retVal = bool(self.send(False)) - self.__msgType = oldType - return retVal - - def isVisible(self): - """Is this message visible. Type will revert to type before calling -hide to allow for better reuse of object.""" - oldType = self.__msgType - self.__msgType = IS_VISIBLE - retVal = bool(self.send(False)) - self.__msgType = oldType - return retVal - - def update(self, title=None, text=None, icon=None): - """Update this message with given title and text. Type will revert -to type before calling hide to allow for better reuse of object.""" - oldType = self.__msgType - self.__msgType = UPDATE - if text: - self.__msgText = text - if title: - self.__msgTitle = title - if icon: - self.__msgIcon = icon - retVal = self.send(False) - self.__msgType = oldType - return retVal - - def setTimeout(self, timeout): - """Set the timeout in seconds of the message""" - oldType = self.__msgType - oldData = self.__msgData - self.__msgType = SET_TIMEOUT - #self.timeout = timeout - #self.__msgData = self.__msgTimeout - self.__msgData = timeout - retVal = self.send(False) - self.__msgType = oldType - self.__msgData = oldData - return retVal - - def show(self, timeout=None, title=None, - text=None, icon=None, - replyWindow=None, replyMsg=None, msgclass=None, soundPath=None): - """Show a message""" - oldType = self.__msgType - oldTimeout = self.__msgTimeout - self.__msgType = SHOW - if text: - self.__msgText = text - if title: - self.__msgTitle = title - if timeout: - self.__msgTimeout = timeout - if icon: - self.__msgIcon = icon - if replyWindow: - self.__msgID = replyMsg - if replyMsg: - self.__msgData = replyWindow - if soundPath: - self.__msgExtra = soundPath - if msgclass: - self.__msgClass = msgclass - - if ((self.__msgClass and self.__msgClass != "") or - (self.__msgExtra and self.__msgExtra != "")): - self.__msgType = EX_SHOW - - - retVal = bool(self.send()) - self.__msgType = oldType - self.__msgTimeout = oldTimeout - return retVal - - -def snGetVersion(): - """ Get the version of Snarl that is running as a tuple. (Major, Minor) - -If Snarl is not running or there was an error it will -return False.""" - msg = SnarlMessage(msg_type=GET_VERSION) - version = msg.send(False) - if not version: - return False - return (HIWORD(version), LOWORD(version)) - -def snGetVersionEx(): - """ Get the internal version of Snarl that is running. - -If Snarl is not running or there was an error it will -return False.""" - sm = SnarlMessage(msg_type=GET_VERSION_EX) - verNum = sm.send(False) - if not verNum: - return False - return verNum - -def snGetGlobalMessage(): - """Get the Snarl global message id from windows.""" - return myWin32Funcs.RegisterWindowMessage(GLOBAL_MSG) - -def snShowMessage(title, text, timeout=0, iconPath="", - replyWindow=0, replyMsg=0): - """Show a message using Snarl and return its ID. See SDK for arguments.""" - sm = SnarlMessage( title, text, iconPath, msg_id=replyMsg) - sm.data = replyWindow - if sm.show(timeout): - return sm.ID - else: - return False - -def snShowMessageEx(msgClass, title, text, timeout=0, iconPath="", - replyWindow=0, replyMsg=0, soundFile=None, hWndFrom=None): - """Show a message using Snarl and return its ID. See SDK for arguments. - One added argument is hWndFrom that allows one to make the messages appear - to come from a specific window. This window should be the one you registered - earlier with RegisterConfig""" - sm = SnarlMessage( title, text, iconPath, msg_id=replyMsg) - sm.data = replyWindow - if hWndFrom is not None: - sm.hWnd = hWndFrom - else: - sm.hWnd = SnarlMessage.lastKnownHWnd - if sm.show(timeout, msgclass=msgClass, soundPath=soundFile): - return sm.ID - else: - return False - -def snUpdateMessage(msgId, msgTitle, msgText, icon=None): - """Update a message""" - sm = SnarlMessage(msg_id=msgId) - if icon: - sm.icon = icon - return sm.update(msgTitle, msgText) - -def snHideMessage(msgId): - """Hide a message""" - return SnarlMessage(msg_id=msgId).hide() - -def snSetTimeout(msgId, timeout): - """Update the timeout of a message already shown.""" - sm = SnarlMessage(msg_id=msgId) - return sm.setTimeout(timeout) - -def snIsMessageVisible(msgId): - """Returns True if the message is visible False otherwise.""" - return SnarlMessage(msg_id=msgId).isVisible() - -def snRegisterConfig(replyWnd, appName, replyMsg): - """Register a config window. See SDK for more info.""" - global lastRegisteredSnarlMsg - sm = SnarlMessage(msg_type=REGISTER_CONFIG_WINDOW, - title=appName, - msg_id=replyMsg) - sm.data = replyWnd - SnarlMessage.lastKnownHWnd = replyWnd - - return sm.send(False) - -def snRegisterConfig2(replyWnd, appName, replyMsg, icon): - """Register a config window. See SDK for more info.""" - global lastRegisteredSnarlMsg - sm = SnarlMessage(msg_type=REGISTER_CONFIG_WINDOW_2, - title=appName, - msg_id=replyMsg, - icon=icon) - sm.data = replyWnd - SnarlMessage.lastKnownHWnd = replyWnd - return sm.send(False) - -def snRegisterAlert(appName, classStr) : - """Register an alert for an already registered config. See SDK for more info.""" - sm = SnarlMessage(msg_type=REGISTER_ALERT, - title=appName, - text=classStr) - return sm.send(False) - -def snRevokeConfig(replyWnd): - """Revoke a config window""" - sm = SnarlMessage(msg_type=REVOKE_CONFIG_WINDOW) - sm.data = replyWnd - if replyWnd == SnarlMessage.lastKnownHWnd: - SnarlMessage.lastKnownHWnd = 0 - return sm.send(False) - -def snGetSnarlWindow(): - """Returns the hWnd of the snarl window""" - return myWin32Funcs.FindWindow(None, "Snarl") - -def snGetAppPath(): - """Returns the application path of the currently running snarl window""" - app_path = None - snarl_handle = snGetSnarlWindow() - if snarl_handle != 0: - pathwin_handle = myWin32Funcs.FindWindowEx(snarl_handle, - 0, - "static", - None) - if pathwin_handle != 0: - try: - result = myWin32Funcs.GetWindowText(pathwin_handle) - app_path = result - except Win32FuncException: - pass - - - return app_path - -def snGetIconsPath(): - """Returns the path to the icons of the program""" - s = snGetAppPath() - if s is None: - return "" - else: - return s + "etc\\icons\\" - -def snSendTestMessage(data=None): - """Sends a test message to Snarl. Used to make sure the -api is connecting""" - param = 0 - command = 0 - if data: - param = struct.pack("I", data) - command = 1 - myWin32Funcs.SendMessage(snGetSnarlWindow(), WM_SNARLTEST, command, param) diff --git a/plugins/snarl_notifications/__init__.py b/plugins/snarl_notifications/__init__.py deleted file mode 100644 index b504dfd50a..0000000000 --- a/plugins/snarl_notifications/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from plugin import SnarlNotificationsPlugin diff --git a/plugins/snarl_notifications/manifest.ini b/plugins/snarl_notifications/manifest.ini deleted file mode 100644 index 45597bfc09..0000000000 --- a/plugins/snarl_notifications/manifest.ini +++ /dev/null @@ -1,11 +0,0 @@ -[info] -name: Snarl Notifications -short_name: snarl_notifications -version: 0.1 -description: Shows events notification using Snarl (http://www.fullphat.net/) under Windows. Snarl needs to be installed in system. - PySnarl bindings are used (http://code.google.com/p/pysnarl/). -authors = Mateusz Biliński <mateusz@bilinski.it> -homepage = http://blog.bilinski.it - - - diff --git a/plugins/snarl_notifications/plugin.py b/plugins/snarl_notifications/plugin.py deleted file mode 100644 index 82247c5e69..0000000000 --- a/plugins/snarl_notifications/plugin.py +++ /dev/null @@ -1,71 +0,0 @@ -# -*- coding: utf-8 -*- -## -## This file is part of Gajim. -## -## Gajim is free software; you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published -## by the Free Software Foundation; version 3 only. -## -## Gajim is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with Gajim. If not, see <http://www.gnu.org/licenses/>. -## -''' -Events notifications using Snarl - -Fancy events notifications under Windows using Snarl infrastructure. - -:note: plugin is at proof-of-concept state. - -:author: Mateusz Biliński <mateusz@bilinski.it> -:since: 15th August 2008 -:copyright: Copyright (2008) Mateusz Biliński <mateusz@bilinski.it> -:license: GPL -''' - -import new -from pprint import pformat - -#import PySnarl - -from common import gajim -from plugins import GajimPlugin -from plugins.helpers import log_calls, log -from common import ged - -class SnarlNotificationsPlugin(GajimPlugin): - - @log_calls('SnarlNotificationsPlugin') - def init(self): - self.description = _('Shows events notification using Snarl ' - '(http://www.fullphat.net/) under Windows. ' - 'Snarl needs to be installed in system.\n' - 'PySnarl bindings are used (http://code.google.com/p/pysnarl/).') - self.config_dialog = None - #self.gui_extension_points = {} - #self.config_default_values = {} - - self.events_handlers = {'notification' : (ged.POSTCORE, self.notif)} - - @log_calls('SnarlNotificationsPlugin') - def activate(self): - pass - - @log_calls('SnarlNotificationsPlugin') - def deactivate(self): - pass - - @log_calls('SnarlNotificationsPlugin') - def notif(self, obj): - print "Event '%s' occured.\n\n===\n" % obj.popup_event_type - - #if PySnarl.snGetVersion() != False: - #(major, minor) = PySnarl.snGetVersion() - #print "Found Snarl version",str(major)+"."+str(minor),"running." - #PySnarl.snShowMessage(obj.popup_title, obj.popup_text) - #else: - #print "Sorry Snarl does not appear to be running" -- GitLab