annotate src/core/sat_main.py @ 1955:633b5c21aefd

backend, frontend: messages refactoring (huge commit, not finished): /!\ database schema has been modified, do a backup before updating message have been refactored, here are the main changes: - languages are now handled - all messages have an uid (internal to SàT) - message updating is anticipated - subject is now first class - new naming scheme is used newMessage => messageNew, getHistory => historyGet, sendMessage => messageSend - minimal compatibility refactoring in quick_frontend/Primitivus, better refactoring should follow - threads handling - delayed messages are saved into history - info messages may also be saved in history (e.g. to keep track of people joining/leaving a room) - duplicate messages should be avoided - historyGet return messages in right order, no need to sort again - plugins have been updated to follow new features, some of them need to be reworked (e.g. OTR) - XEP-0203 (Delayed Delivery) is now fully handled in core, the plugin just handle disco and creation of a delay element - /!\ jp and Libervia are currently broken, as some features of Primitivus It has been put in one huge commit to avoid breaking messaging between changes. This is the main part of message refactoring, other commits will follow to take profit of the new features/behaviour.
author Goffi <goffi@goffi.org>
date Tue, 24 May 2016 22:11:04 +0200
parents 2daf7b4c6756
children a2bc5089c2eb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1934
2daf7b4c6756 use of /usr/bin/env instead of /usr/bin/python in shebang
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
1 #!/usr/bin/env python2
0
goffi@necton2
parents:
diff changeset
2 # -*- coding: utf-8 -*-
goffi@necton2
parents:
diff changeset
3
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 605
diff changeset
4 # SAT: a jabber client
1766
d17772b0fe22 copyright update
Goffi <goffi@goffi.org>
parents: 1725
diff changeset
5 # Copyright (C) 2009-2016 Jérôme Poisson (goffi@goffi.org)
0
goffi@necton2
parents:
diff changeset
6
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 605
diff changeset
7 # This program is free software: you can redistribute it and/or modify
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 605
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 605
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 605
diff changeset
10 # (at your option) any later version.
0
goffi@necton2
parents:
diff changeset
11
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 605
diff changeset
12 # This program is distributed in the hope that it will be useful,
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 605
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 605
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 605
diff changeset
15 # GNU Affero General Public License for more details.
0
goffi@necton2
parents:
diff changeset
16
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 605
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 605
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
0
goffi@necton2
parents:
diff changeset
19
1376
28fd9e838f8f core: getRepositoryData now get the module in argument
Goffi <goffi@goffi.org>
parents: 1375
diff changeset
20 import sat
1591
0df9c6247474 core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents: 1587
diff changeset
21 from sat.core.i18n import _, languageSwitch
331
0a8eb0461f31 core: main SAT class now moved in its own module core.sat_main
Goffi <goffi@goffi.org>
parents: 330
diff changeset
22 from twisted.application import service
0a8eb0461f31 core: main SAT class now moved in its own module core.sat_main
Goffi <goffi@goffi.org>
parents: 330
diff changeset
23 from twisted.internet import defer
1037
6e975c6b0faf core, memory, bridge, plugin misc_register_account: move registerNewAccount to a new plugin:
souliane <souliane@mailoo.org>
parents: 1032
diff changeset
24 from twisted.words.protocols.jabber import jid
0
goffi@necton2
parents:
diff changeset
25 from twisted.words.xish import domish
goffi@necton2
parents:
diff changeset
26 from twisted.internet import reactor
346
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 341
diff changeset
27 from wokkel.xmppim import RosterItem
223
86d249b6d9b7 Files reorganisation
Goffi <goffi@goffi.org>
parents: 213
diff changeset
28 from sat.bridge.DBus import DBusBridge
332
8c9b9ef13ba1 core: minor refactoring
Goffi <goffi@goffi.org>
parents: 331
diff changeset
29 from sat.core import xmpp
627
d207c2186519 core, bridge, jp, quick_frontend: SàT stop more gracefully if bridge can't be initialised:
Goffi <goffi@goffi.org>
parents: 609
diff changeset
30 from sat.core import exceptions
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 991
diff changeset
31 from sat.core.log import getLogger
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 991
diff changeset
32 log = getLogger(__name__)
914
1a3ba959f0ab core (memory): moved Params in its own module + introduced a new core/constants module, and moved some constants there
Goffi <goffi@goffi.org>
parents: 909
diff changeset
33 from sat.core.constants import Const as C
1a3ba959f0ab core (memory): moved Params in its own module + introduced a new core/constants module, and moved some constants there
Goffi <goffi@goffi.org>
parents: 909
diff changeset
34 from sat.memory.memory import Memory
1374
0befb14ecf62 renamed tools.misc to tools.trigger
Goffi <goffi@goffi.org>
parents: 1365
diff changeset
35 from sat.tools import trigger
1375
3a20312d4012 core: if we are in dev version and it's possible, repository data are now checked and added to SàT version
Goffi <goffi@goffi.org>
parents: 1374
diff changeset
36 from sat.tools import utils
1032
b262ae6d53af stdui: add ui_profile_manager to interact with frontends when profile authentication is needed
souliane <souliane@mailoo.org>
parents: 1030
diff changeset
37 from sat.stdui import ui_contact_list, ui_profile_manager
0
goffi@necton2
parents:
diff changeset
38 from glob import glob
759
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
39 from uuid import uuid4
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 991
diff changeset
40 import sys
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 991
diff changeset
41 import os.path
1467
ceba6fd77739 core, bridge: new signal actionNew to launch an action from the backend (e.g. display a dialog message):
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
42 import uuid
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
43 import time
0
goffi@necton2
parents:
diff changeset
44
987
3a96920c07b7 core, frontends: unify the roster management UIs in sat/stdui/ui_contact_list.py
souliane <souliane@mailoo.org>
parents: 972
diff changeset
45 try:
3a96920c07b7 core, frontends: unify the roster management UIs in sat/stdui/ui_contact_list.py
souliane <souliane@mailoo.org>
parents: 972
diff changeset
46 from collections import OrderedDict # only available from python 2.7
3a96920c07b7 core, frontends: unify the roster management UIs in sat/stdui/ui_contact_list.py
souliane <souliane@mailoo.org>
parents: 972
diff changeset
47 except ImportError:
3a96920c07b7 core, frontends: unify the roster management UIs in sat/stdui/ui_contact_list.py
souliane <souliane@mailoo.org>
parents: 972
diff changeset
48 from ordereddict import OrderedDict
3a96920c07b7 core, frontends: unify the roster management UIs in sat/stdui/ui_contact_list.py
souliane <souliane@mailoo.org>
parents: 972
diff changeset
49
0
goffi@necton2
parents:
diff changeset
50
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
51 class SAT(service.Service):
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
52
0
goffi@necton2
parents:
diff changeset
53 def __init__(self):
759
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
54 self._cb_map = {} # map from callback_id to callbacks
987
3a96920c07b7 core, frontends: unify the roster management UIs in sat/stdui/ui_contact_list.py
souliane <souliane@mailoo.org>
parents: 972
diff changeset
55 self._menus = OrderedDict() # dynamic menus. key: callback_id, value: menu data (dictionnary)
759
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
56 self.__private_data = {} # used for internal callbacks (key = id) FIXME: to be removed
1591
0df9c6247474 core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents: 1587
diff changeset
57 self.initialised = defer.Deferred()
62
93cb45a7420f SàT multi-profile: connection using profiles
Goffi <goffi@goffi.org>
parents: 60
diff changeset
58 self.profiles = {}
22
bb72c29f3432 added action cb mechanism for buttons. Tested with a temporary new user registration button.
Goffi <goffi@goffi.org>
parents: 18
diff changeset
59 self.plugins = {}
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
60
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
61 self.memory = Memory(self)
1374
0befb14ecf62 renamed tools.misc to tools.trigger
Goffi <goffi@goffi.org>
parents: 1365
diff changeset
62 self.trigger = trigger.TriggerManager() # trigger are used to change SàT behaviour
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
63
627
d207c2186519 core, bridge, jp, quick_frontend: SàT stop more gracefully if bridge can't be initialised:
Goffi <goffi@goffi.org>
parents: 609
diff changeset
64 try:
d207c2186519 core, bridge, jp, quick_frontend: SàT stop more gracefully if bridge can't be initialised:
Goffi <goffi@goffi.org>
parents: 609
diff changeset
65 self.bridge = DBusBridge()
d207c2186519 core, bridge, jp, quick_frontend: SàT stop more gracefully if bridge can't be initialised:
Goffi <goffi@goffi.org>
parents: 609
diff changeset
66 except exceptions.BridgeInitError:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 991
diff changeset
67 log.error(u"Bridge can't be initialised, can't start SàT core")
627
d207c2186519 core, bridge, jp, quick_frontend: SàT stop more gracefully if bridge can't be initialised:
Goffi <goffi@goffi.org>
parents: 609
diff changeset
68 sys.exit(1)
1591
0df9c6247474 core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents: 1587
diff changeset
69 self.bridge.register("getReady", lambda: self.initialised)
1375
3a20312d4012 core: if we are in dev version and it's possible, repository data are now checked and added to SàT version
Goffi <goffi@goffi.org>
parents: 1374
diff changeset
70 self.bridge.register("getVersion", lambda: self.full_version)
1482
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
71 self.bridge.register("getFeatures", self.getFeatures)
66
8147b4f40809 SàT: multi-profile: DBus signals and frontend adaptation (first draft)
Goffi <goffi@goffi.org>
parents: 65
diff changeset
72 self.bridge.register("getProfileName", self.memory.getProfileName)
60
9764e027ecc0 SàT: multi-profile parameters, first draft
Goffi <goffi@goffi.org>
parents: 58
diff changeset
73 self.bridge.register("getProfilesList", self.memory.getProfilesList)
1314
bb9c32249778 core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
74 self.bridge.register("getEntityData", lambda jid_, keys, profile: self.memory.getEntityData(jid.JID(jid_), keys, profile))
bb9c32249778 core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
75 self.bridge.register("getEntitiesData", self.memory._getEntitiesData)
420
acd908528ef7 core: profile creation/deletion through database
Goffi <goffi@goffi.org>
parents: 416
diff changeset
76 self.bridge.register("asyncCreateProfile", self.memory.asyncCreateProfile)
893
308a96bc7c1b core, frontends: add method asyncDeleteProfile, remove synchronous methods createProfile and deleteProfile
souliane <souliane@mailoo.org>
parents: 853
diff changeset
77 self.bridge.register("asyncDeleteProfile", self.memory.asyncDeleteProfile)
1694
3c608d660f0b core (memory): profile is checked in startSession (an error is raised if it doesn't exist)
Goffi <goffi@goffi.org>
parents: 1650
diff changeset
78 self.bridge.register("profileStartSession", self.memory.startSession)
1592
d6d655238a93 bridge: new core method profileStartSession to start a session without connecting the profile
Goffi <goffi@goffi.org>
parents: 1591
diff changeset
79 self.bridge.register("profileIsSessionStarted", self.memory._isSessionStarted)
1595
a3d0cfa5b7a6 core, bridge: added a profileSetDefault method
Goffi <goffi@goffi.org>
parents: 1592
diff changeset
80 self.bridge.register("profileSetDefault", self.memory.profileSetDefault)
1591
0df9c6247474 core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents: 1587
diff changeset
81 self.bridge.register("asyncConnect", self._asyncConnect)
1
a06a151fc31f Disconnect first draft
Goffi <goffi@goffi.org>
parents: 0
diff changeset
82 self.bridge.register("disconnect", self.disconnect)
466
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 460
diff changeset
83 self.bridge.register("getContacts", self.getContacts)
501
e9634d2e7b38 core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents: 489
diff changeset
84 self.bridge.register("getContactsFromGroup", self.getContactsFromGroup)
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1262
diff changeset
85 self.bridge.register("getMainResource", self.memory._getMainResource)
943
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 941
diff changeset
86 self.bridge.register("getPresenceStatuses", self.memory._getPresenceStatuses)
50
daa1f01a5332 SàT improvement:
Goffi <goffi@goffi.org>
parents: 41
diff changeset
87 self.bridge.register("getWaitingSub", self.memory.getWaitingSub)
541
8b116fa42a31 core, bridge: waiting confirmation management (new getWaitingConf method)
Goffi <goffi@goffi.org>
parents: 538
diff changeset
88 self.bridge.register("getWaitingConf", self.getWaitingConf)
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
89 self.bridge.register("messageSend", self._messageSend)
1234
9c17bd37e6e5 core: better management of default value in getConfig
Goffi <goffi@goffi.org>
parents: 1189
diff changeset
90 self.bridge.register("getConfig", self._getConfig)
0
goffi@necton2
parents:
diff changeset
91 self.bridge.register("setParam", self.setParam)
538
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
92 self.bridge.register("getParamA", self.memory.getStringParamA)
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
93 self.bridge.register("asyncGetParamA", self.memory.asyncGetStringParamA)
1587
698d6755d62a core, bridge (params): added asyncGetParamsValuesFromCategory (yes that's a long name!) method to retrive params names and values for a given category
Goffi <goffi@goffi.org>
parents: 1586
diff changeset
94 self.bridge.register("asyncGetParamsValuesFromCategory", self.memory.asyncGetParamsValuesFromCategory)
105
d2630fba8dfd params to XMLUI tools
Goffi <goffi@goffi.org>
parents: 103
diff changeset
95 self.bridge.register("getParamsUI", self.memory.getParamsUI)
0
goffi@necton2
parents:
diff changeset
96 self.bridge.register("getParamsCategories", self.memory.getParamsCategories)
777
5642939d254e core, bridge: new method paramsRegisterApp to register frontend's specific parameters
souliane <souliane@mailoo.org>
parents: 773
diff changeset
97 self.bridge.register("paramsRegisterApp", self.memory.paramsRegisterApp)
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
98 self.bridge.register("historyGet", self.memory.historyGet)
807
be4c5e24dab9 plugin XEP-0077, plugin XEP-0100, frontends: gateways have been entirely implemented in backend using the new refactored XMLUI and AdvancedListContainer. The now useless code has been removed from frontends.
Goffi <goffi@goffi.org>
parents: 806
diff changeset
99 self.bridge.register("setPresence", self._setPresence)
50
daa1f01a5332 SàT improvement:
Goffi <goffi@goffi.org>
parents: 41
diff changeset
100 self.bridge.register("subscription", self.subscription)
807
be4c5e24dab9 plugin XEP-0077, plugin XEP-0100, frontends: gateways have been entirely implemented in backend using the new refactored XMLUI and AdvancedListContainer. The now useless code has been removed from frontends.
Goffi <goffi@goffi.org>
parents: 806
diff changeset
101 self.bridge.register("addContact", self._addContact)
be4c5e24dab9 plugin XEP-0077, plugin XEP-0100, frontends: gateways have been entirely implemented in backend using the new refactored XMLUI and AdvancedListContainer. The now useless code has been removed from frontends.
Goffi <goffi@goffi.org>
parents: 806
diff changeset
102 self.bridge.register("updateContact", self._updateContact)
be4c5e24dab9 plugin XEP-0077, plugin XEP-0100, frontends: gateways have been entirely implemented in backend using the new refactored XMLUI and AdvancedListContainer. The now useless code has been removed from frontends.
Goffi <goffi@goffi.org>
parents: 806
diff changeset
103 self.bridge.register("delContact", self._delContact)
0
goffi@necton2
parents:
diff changeset
104 self.bridge.register("isConnected", self.isConnected)
759
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
105 self.bridge.register("launchAction", self.launchCallback)
1622
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
106 self.bridge.register("actionsGet", self.actionsGet)
0
goffi@necton2
parents:
diff changeset
107 self.bridge.register("confirmationAnswer", self.confirmationAnswer)
1522
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
108 self.bridge.register("progressGet", self._progressGet)
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
109 self.bridge.register("progressGetAll", self._progressGetAll)
101
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents: 90
diff changeset
110 self.bridge.register("getMenus", self.getMenus)
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents: 90
diff changeset
111 self.bridge.register("getMenuHelp", self.getMenuHelp)
963
723f28cd15c7 core (disco): added discoInfos and discoItems bridge methods
Goffi <goffi@goffi.org>
parents: 951
diff changeset
112 self.bridge.register("discoInfos", self.memory.disco._discoInfos)
723f28cd15c7 core (disco): added discoInfos and discoItems bridge methods
Goffi <goffi@goffi.org>
parents: 951
diff changeset
113 self.bridge.register("discoItems", self.memory.disco._discoItems)
1015
fee00f2e11c2 memory, jp: added jp commands to load/save parameters template
souliane <souliane@mailoo.org>
parents: 1007
diff changeset
114 self.bridge.register("saveParamsTemplate", self.memory.save_xml)
fee00f2e11c2 memory, jp: added jp commands to load/save parameters template
souliane <souliane@mailoo.org>
parents: 1007
diff changeset
115 self.bridge.register("loadParamsTemplate", self.memory.load_xml)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
116
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
117 self.memory.initialized.addCallback(self._postMemoryInit)
0
goffi@necton2
parents:
diff changeset
118
1550
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
119 @property
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
120 def version(self):
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
121 """Return the short version of SàT"""
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
122 return C.APP_VERSION
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
123
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
124 @property
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
125 def full_version(self):
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
126 """Return the full version of SàT (with extra data when in development mode)"""
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
127 version = self.version
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
128 if version[-1] == 'D':
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
129 # we are in debug version, we add extra data
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
130 try:
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
131 return self._version_cache
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
132 except AttributeError:
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
133 self._version_cache = u"{} ({})".format(version, utils.getRepositoryData(sat))
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
134 return self._version_cache
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
135 else:
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
136 return version
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
137
412
62b17854254e database integration: first draft
Goffi <goffi@goffi.org>
parents: 399
diff changeset
138 def _postMemoryInit(self, ignore):
62b17854254e database integration: first draft
Goffi <goffi@goffi.org>
parents: 399
diff changeset
139 """Method called after memory initialization is done"""
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 991
diff changeset
140 log.info(_("Memory initialised"))
64
d46f849664aa SàT: multi-profile, plugins updated
Goffi <goffi@goffi.org>
parents: 63
diff changeset
141 self._import_plugins()
987
3a96920c07b7 core, frontends: unify the roster management UIs in sat/stdui/ui_contact_list.py
souliane <souliane@mailoo.org>
parents: 972
diff changeset
142 ui_contact_list.ContactList(self)
1032
b262ae6d53af stdui: add ui_profile_manager to interact with frontends when profile authentication is needed
souliane <souliane@mailoo.org>
parents: 1030
diff changeset
143 ui_profile_manager.ProfileManager(self)
1591
0df9c6247474 core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents: 1587
diff changeset
144 self.initialised.callback(None)
1145
4e1a0a1523f1 core: more robust plugins importation
Goffi <goffi@goffi.org>
parents: 1130
diff changeset
145 log.info(_("Backend is ready"))
0
goffi@necton2
parents:
diff changeset
146
goffi@necton2
parents:
diff changeset
147 def _import_plugins(self):
goffi@necton2
parents:
diff changeset
148 """Import all plugins found in plugins directory"""
226
d8bb72f00eec distutils install: fixed plugin import and log file path
Goffi <goffi@goffi.org>
parents: 225
diff changeset
149 import sat.plugins
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
150 plugins_path = os.path.dirname(sat.plugins.__file__)
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
151 plug_lst = [os.path.splitext(plugin)[0] for plugin in map(os.path.basename, glob(os.path.join(plugins_path, "plugin*.py")))]
1503
f681788097ba core (plugins): detect import_name conflicts
Goffi <goffi@goffi.org>
parents: 1491
diff changeset
152 plugins_to_import = {} # plugins we still have to import
0
goffi@necton2
parents:
diff changeset
153 for plug in plug_lst:
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
154 plugin_path = 'sat.plugins.' + plug
1145
4e1a0a1523f1 core: more robust plugins importation
Goffi <goffi@goffi.org>
parents: 1130
diff changeset
155 try:
4e1a0a1523f1 core: more robust plugins importation
Goffi <goffi@goffi.org>
parents: 1130
diff changeset
156 __import__(plugin_path)
1535
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
157 except exceptions.MissingModule as e:
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
158 try:
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
159 del sys.modules[plugin_path]
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
160 except KeyError:
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
161 pass
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
162 log.warning(u"Can't import plugin [{path}] because of an unavailale third party module:\n{msg}".format(
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
163 path=plugin_path, msg=e))
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
164 continue
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
165 except Exception as e:
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
166 import traceback
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
167 log.error(_(u"Can't import plugin [{path}]:\n{error}").format(path=plugin_path, error=traceback.format_exc()))
1145
4e1a0a1523f1 core: more robust plugins importation
Goffi <goffi@goffi.org>
parents: 1130
diff changeset
168 continue
287
2720536b5a22 core: added plugin dependency management
Goffi <goffi@goffi.org>
parents: 282
diff changeset
169 mod = sys.modules[plugin_path]
2720536b5a22 core: added plugin dependency management
Goffi <goffi@goffi.org>
parents: 282
diff changeset
170 plugin_info = mod.PLUGIN_INFO
1503
f681788097ba core (plugins): detect import_name conflicts
Goffi <goffi@goffi.org>
parents: 1491
diff changeset
171 import_name = plugin_info['import_name']
f681788097ba core (plugins): detect import_name conflicts
Goffi <goffi@goffi.org>
parents: 1491
diff changeset
172 if import_name in plugins_to_import:
f681788097ba core (plugins): detect import_name conflicts
Goffi <goffi@goffi.org>
parents: 1491
diff changeset
173 log.error(_(u"Name conflict for import name [{import_name}], can't import plugin [{name}]").format(**plugin_info))
f681788097ba core (plugins): detect import_name conflicts
Goffi <goffi@goffi.org>
parents: 1491
diff changeset
174 continue
f681788097ba core (plugins): detect import_name conflicts
Goffi <goffi@goffi.org>
parents: 1491
diff changeset
175 plugins_to_import[import_name] = (plugin_path, mod, plugin_info)
287
2720536b5a22 core: added plugin dependency management
Goffi <goffi@goffi.org>
parents: 282
diff changeset
176 while True:
1535
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
177 try:
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
178 self._import_plugins_from_dict(plugins_to_import)
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
179 except ImportError:
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
180 pass
1503
f681788097ba core (plugins): detect import_name conflicts
Goffi <goffi@goffi.org>
parents: 1491
diff changeset
181 if not plugins_to_import:
287
2720536b5a22 core: added plugin dependency management
Goffi <goffi@goffi.org>
parents: 282
diff changeset
182 break
2720536b5a22 core: added plugin dependency management
Goffi <goffi@goffi.org>
parents: 282
diff changeset
183
925
5c78cefd233f core: plugins now accepts recommendations:
Goffi <goffi@goffi.org>
parents: 923
diff changeset
184 def _import_plugins_from_dict(self, plugins_to_import, import_name=None, optional=False):
287
2720536b5a22 core: added plugin dependency management
Goffi <goffi@goffi.org>
parents: 282
diff changeset
185 """Recursively import and their dependencies in the right order
925
5c78cefd233f core: plugins now accepts recommendations:
Goffi <goffi@goffi.org>
parents: 923
diff changeset
186
1535
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
187 @param plugins_to_import(dict): key=import_name and values=(plugin_path, module, plugin_info)
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
188 @param import_name(unicode, None): name of the plugin to import as found in PLUGIN_INFO['import_name']
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
189 @param optional(bool): if False and plugin is not found, an ImportError exception is raised
925
5c78cefd233f core: plugins now accepts recommendations:
Goffi <goffi@goffi.org>
parents: 923
diff changeset
190 """
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
191 if import_name in self.plugins:
1535
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
192 log.debug(u'Plugin {} already imported, passing'.format(import_name))
287
2720536b5a22 core: added plugin dependency management
Goffi <goffi@goffi.org>
parents: 282
diff changeset
193 return
2720536b5a22 core: added plugin dependency management
Goffi <goffi@goffi.org>
parents: 282
diff changeset
194 if not import_name:
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
195 import_name, (plugin_path, mod, plugin_info) = plugins_to_import.popitem()
287
2720536b5a22 core: added plugin dependency management
Goffi <goffi@goffi.org>
parents: 282
diff changeset
196 else:
288
76247af9917c core: added plugin dependency not found import error
Goffi <goffi@goffi.org>
parents: 287
diff changeset
197 if not import_name in plugins_to_import:
925
5c78cefd233f core: plugins now accepts recommendations:
Goffi <goffi@goffi.org>
parents: 923
diff changeset
198 if optional:
1535
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
199 log.warning(_(u"Recommended plugin not found: {}").format(import_name))
925
5c78cefd233f core: plugins now accepts recommendations:
Goffi <goffi@goffi.org>
parents: 923
diff changeset
200 return
1535
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
201 msg = u"Dependency not found: {}".format(import_name)
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
202 log.error(msg)
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
203 raise ImportError(msg)
287
2720536b5a22 core: added plugin dependency management
Goffi <goffi@goffi.org>
parents: 282
diff changeset
204 plugin_path, mod, plugin_info = plugins_to_import.pop(import_name)
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
205 dependencies = plugin_info.setdefault("dependencies", [])
925
5c78cefd233f core: plugins now accepts recommendations:
Goffi <goffi@goffi.org>
parents: 923
diff changeset
206 recommendations = plugin_info.setdefault("recommendations", [])
5c78cefd233f core: plugins now accepts recommendations:
Goffi <goffi@goffi.org>
parents: 923
diff changeset
207 for to_import in dependencies + recommendations:
5c78cefd233f core: plugins now accepts recommendations:
Goffi <goffi@goffi.org>
parents: 923
diff changeset
208 if to_import not in self.plugins:
1409
3265a2639182 massive (preventive) addition of 'u' (unicode) before the strings passed to logging functions
souliane <souliane@mailoo.org>
parents: 1396
diff changeset
209 log.debug(u'Recursively import dependency of [%s]: [%s]' % (import_name, to_import))
1145
4e1a0a1523f1 core: more robust plugins importation
Goffi <goffi@goffi.org>
parents: 1130
diff changeset
210 try:
4e1a0a1523f1 core: more robust plugins importation
Goffi <goffi@goffi.org>
parents: 1130
diff changeset
211 self._import_plugins_from_dict(plugins_to_import, to_import, to_import not in dependencies)
4e1a0a1523f1 core: more robust plugins importation
Goffi <goffi@goffi.org>
parents: 1130
diff changeset
212 except ImportError as e:
1535
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
213 log.warning(_(u"Can't import plugin {name}: {error}").format(name=plugin_info['name'], error=e))
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
214 if optional:
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
215 return
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
216 raise e
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
217 log.info("importing plugin: {}".format(plugin_info['name']))
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
218 # we instanciate the plugin here
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
219 try:
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
220 self.plugins[import_name] = getattr(mod, plugin_info['main'])(self)
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
221 except Exception as e:
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
222 log.warning(u'Error while loading plugin "{name}", ignoring it: {error}'
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
223 .format(name=plugin_info['name'], error=e))
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
224 if optional:
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
225 return
c9ef16de3f13 core: more robust plugins loading:
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
226 raise ImportError(u"Error during initiation")
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
227 if 'handler' in plugin_info and plugin_info['handler'] == 'yes':
287
2720536b5a22 core: added plugin dependency management
Goffi <goffi@goffi.org>
parents: 282
diff changeset
228 self.plugins[import_name].is_handler = True
2720536b5a22 core: added plugin dependency management
Goffi <goffi@goffi.org>
parents: 282
diff changeset
229 else:
2720536b5a22 core: added plugin dependency management
Goffi <goffi@goffi.org>
parents: 282
diff changeset
230 self.plugins[import_name].is_handler = False
2720536b5a22 core: added plugin dependency management
Goffi <goffi@goffi.org>
parents: 282
diff changeset
231 #TODO: test xmppclient presence and register handler parent
0
goffi@necton2
parents:
diff changeset
232
1550
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
233 def pluginsUnload(self):
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
234 """Call unload method on every loaded plugin, if exists
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
235
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
236 @return (D): A deferred which return None when all method have been called
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
237 """
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
238 # TODO: in the futur, it should be possible to hot unload a plugin
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
239 # pluging depending on the unloaded one should be unloaded too
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
240 # for now, just a basic call on plugin.unload is done
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
241 defers_list = []
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
242 for plugin in self.plugins.itervalues():
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
243 try:
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
244 unload = plugin.unload
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
245 except AttributeError:
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
246 continue
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
247 else:
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
248 defers_list.append(defer.maybeDeferred(unload))
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
249 return defers_list
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
250
1591
0df9c6247474 core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents: 1587
diff changeset
251 def _asyncConnect(self, profile_key, password=''):
0df9c6247474 core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents: 1587
diff changeset
252 profile = self.memory.getProfileName(profile_key)
0df9c6247474 core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents: 1587
diff changeset
253 return self.asyncConnect(profile, password)
0df9c6247474 core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents: 1587
diff changeset
254
1725
c1be6363bfab core, plugin misc_account: set XMPP connection max retries to 0 when checking if an external account exists
souliane <souliane@mailoo.org>
parents: 1694
diff changeset
255 def asyncConnect(self, profile, password='', max_retries=C.XMPP_MAX_RETRIES):
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
256 """Retrieve the individual parameters, authenticate the profile
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
257 and initiate the connection to the associated XMPP server.
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
258
1725
c1be6363bfab core, plugin misc_account: set XMPP connection max retries to 0 when checking if an external account exists
souliane <souliane@mailoo.org>
parents: 1694
diff changeset
259 @param profile: %(doc_profile)s
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
260 @param password (string): the SàT profile password
1725
c1be6363bfab core, plugin misc_account: set XMPP connection max retries to 0 when checking if an external account exists
souliane <souliane@mailoo.org>
parents: 1694
diff changeset
261 @param max_retries (int): max number of connection retries
1591
0df9c6247474 core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents: 1587
diff changeset
262 @return (D(bool)):
0df9c6247474 core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents: 1587
diff changeset
263 - True if the XMPP connection was already established
0df9c6247474 core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents: 1587
diff changeset
264 - False if the XMPP connection has been initiated (it may still fail)
0df9c6247474 core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents: 1587
diff changeset
265 @raise exceptions.PasswordError: Profile password is wrong
423
6c20c76abdcc backend: - bridge async D-Bus method now automatically manage callback and errback, we just have to return a deferred
Goffi <goffi@goffi.org>
parents: 420
diff changeset
266 """
1591
0df9c6247474 core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents: 1587
diff changeset
267 def connectXMPPClient(dummy=None):
0df9c6247474 core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents: 1587
diff changeset
268 if self.isConnected(profile):
0df9c6247474 core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents: 1587
diff changeset
269 log.info(_("already connected !"))
0df9c6247474 core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents: 1587
diff changeset
270 return True
1725
c1be6363bfab core, plugin misc_account: set XMPP connection max retries to 0 when checking if an external account exists
souliane <souliane@mailoo.org>
parents: 1694
diff changeset
271 d = self._connectXMPPClient(profile, max_retries)
1591
0df9c6247474 core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents: 1587
diff changeset
272 return d.addCallback(lambda dummy: False)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
273
1591
0df9c6247474 core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents: 1587
diff changeset
274 d = self.memory.startSession(password, profile)
0df9c6247474 core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents: 1587
diff changeset
275 d.addCallback(connectXMPPClient)
0df9c6247474 core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents: 1587
diff changeset
276 return d
1019
6a16ec17a458 better PEP-8 compliance
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
277
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
278 @defer.inlineCallbacks
1725
c1be6363bfab core, plugin misc_account: set XMPP connection max retries to 0 when checking if an external account exists
souliane <souliane@mailoo.org>
parents: 1694
diff changeset
279 def _connectXMPPClient(self, profile, max_retries):
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
280 """This part is called from asyncConnect when we have loaded individual parameters from memory"""
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
281 try:
1088
b29452cab50b core, memory, plugins, stdui, frontends: look for DNS SRV records when server is not specified:
souliane <souliane@mailoo.org>
parents: 1063
diff changeset
282 port = int(self.memory.getParamA(C.FORCE_PORT_PARAM, "Connection", profile_key=profile))
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
283 except ValueError:
1096
77751f5b2242 core: use of debug log instead of error when port default value is used
Goffi <goffi@goffi.org>
parents: 1092
diff changeset
284 log.debug(_("Can't parse port value, using default value"))
1089
8e0072754413 core, plugins, stdui, frontends: fixes handling of "Force server" and "Force port" parameters:
souliane <souliane@mailoo.org>
parents: 1088
diff changeset
285 port = None # will use default value 5222 or be retrieved from a DNS SRV record
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
286
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
287 password = yield self.memory.asyncGetParamA("Password", "Connection", profile_key=profile)
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
288 current = self.profiles[profile] = xmpp.SatXMPPClient(self, profile,
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
289 jid.JID(self.memory.getParamA("JabberID", "Connection", profile_key=profile)),
1725
c1be6363bfab core, plugin misc_account: set XMPP connection max retries to 0 when checking if an external account exists
souliane <souliane@mailoo.org>
parents: 1694
diff changeset
290 password, self.memory.getParamA(C.FORCE_SERVER_PARAM, "Connection", profile_key=profile),
c1be6363bfab core, plugin misc_account: set XMPP connection max retries to 0 when checking if an external account exists
souliane <souliane@mailoo.org>
parents: 1694
diff changeset
291 port, max_retries)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
292
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
293 current.messageProt = xmpp.SatMessageProtocol(self)
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
294 current.messageProt.setHandlerParent(current)
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
295
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
296 current.roster = xmpp.SatRosterProtocol(self)
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
297 current.roster.setHandlerParent(current)
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
298
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
299 current.presence = xmpp.SatPresenceProtocol(self)
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
300 current.presence.setHandlerParent(current)
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
301
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
302 current.fallBack = xmpp.SatFallbackHandler(self)
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
303 current.fallBack.setHandlerParent(current)
412
62b17854254e database integration: first draft
Goffi <goffi@goffi.org>
parents: 399
diff changeset
304
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
305 current.versionHandler = xmpp.SatVersionHandler(C.APP_NAME_FULL,
1375
3a20312d4012 core: if we are in dev version and it's possible, repository data are now checked and added to SàT version
Goffi <goffi@goffi.org>
parents: 1374
diff changeset
306 self.full_version)
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
307 current.versionHandler.setHandlerParent(current)
14
a62d7d453f22 wokkel integration, part II
Goffi <goffi@goffi.org>
parents: 13
diff changeset
308
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
309 current.identityHandler = xmpp.SatIdentityHandler()
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
310 current.identityHandler.setHandlerParent(current)
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
311
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
312 log.debug(_("setting plugins parents"))
666
2a7185b8452c core: added SatIdentityHandler for Disco Identity, and set identity to "client/pc/Salut à Toi"
Goffi <goffi@goffi.org>
parents: 641
diff changeset
313
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
314 plugin_conn_cb = []
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
315 for plugin in self.plugins.iteritems():
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
316 if plugin[1].is_handler:
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
317 plugin[1].getHandler(profile).setHandlerParent(current)
1316
8adcdf2cdfe1 core: added a "profileConnecting" method check:
Goffi <goffi@goffi.org>
parents: 1314
diff changeset
318 connected_cb = getattr(plugin[1], "profileConnected", None) # profile connected is called after client is ready and roster is got
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
319 if connected_cb:
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
320 plugin_conn_cb.append((plugin[0], connected_cb))
1316
8adcdf2cdfe1 core: added a "profileConnecting" method check:
Goffi <goffi@goffi.org>
parents: 1314
diff changeset
321 try:
8adcdf2cdfe1 core: added a "profileConnecting" method check:
Goffi <goffi@goffi.org>
parents: 1314
diff changeset
322 yield plugin[1].profileConnecting(profile) # profile connecting is called before actually starting client
8adcdf2cdfe1 core: added a "profileConnecting" method check:
Goffi <goffi@goffi.org>
parents: 1314
diff changeset
323 except AttributeError:
8adcdf2cdfe1 core: added a "profileConnecting" method check:
Goffi <goffi@goffi.org>
parents: 1314
diff changeset
324 pass
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
325
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
326 current.startService()
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
327
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
328 yield current.getConnectionDeferred()
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
329 yield current.roster.got_roster # we want to be sure that we got the roster
14
a62d7d453f22 wokkel integration, part II
Goffi <goffi@goffi.org>
parents: 13
diff changeset
330
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
331 # Call profileConnected callback for all plugins, and print error message if any of them fails
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
332 conn_cb_list = []
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
333 for dummy, callback in plugin_conn_cb:
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
334 conn_cb_list.append(defer.maybeDeferred(callback, profile))
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
335 list_d = defer.DeferredList(conn_cb_list)
972
07b817f5a197 core: better plugin initialisation sequence:
Goffi <goffi@goffi.org>
parents: 963
diff changeset
336
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
337 def logPluginResults(results):
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
338 all_succeed = all([success for success, result in results])
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
339 if not all_succeed:
1409
3265a2639182 massive (preventive) addition of 'u' (unicode) before the strings passed to logging functions
souliane <souliane@mailoo.org>
parents: 1396
diff changeset
340 log.error(_(u"Plugins initialisation error"))
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
341 for idx, (success, result) in enumerate(results):
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
342 if not success:
1409
3265a2639182 massive (preventive) addition of 'u' (unicode) before the strings passed to logging functions
souliane <souliane@mailoo.org>
parents: 1396
diff changeset
343 log.error(u"error (plugin %(name)s): %(failure)s" %
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
344 {'name': plugin_conn_cb[idx][0], 'failure': result})
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
345
1189
7d640c303140 core (disco): added a timeout to get items
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
346 yield list_d.addCallback(logPluginResults) # FIXME: we should have a timeout here, and a way to know if a plugin freeze
1316
8adcdf2cdfe1 core: added a "profileConnecting" method check:
Goffi <goffi@goffi.org>
parents: 1314
diff changeset
347 # TODO: mesure launch time of each plugin
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
348
346
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 341
diff changeset
349 def disconnect(self, profile_key):
16
0a024d5e0cd0 New account creation (in-band registration)
Goffi <goffi@goffi.org>
parents: 15
diff changeset
350 """disconnect from jabber server"""
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
351 if not self.isConnected(profile_key):
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 991
diff changeset
352 log.info(_("not connected !"))
6
5799493fa548 connection and disconnection management
Goffi <goffi@goffi.org>
parents: 5
diff changeset
353 return
63
0db25931b60d SàT: multi-profiles: somes fixes in core
Goffi <goffi@goffi.org>
parents: 62
diff changeset
354 profile = self.memory.getProfileName(profile_key)
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 991
diff changeset
355 log.info(_("Disconnecting..."))
63
0db25931b60d SàT: multi-profiles: somes fixes in core
Goffi <goffi@goffi.org>
parents: 62
diff changeset
356 self.profiles[profile].stopService()
438
62145e50eae5 core: plugins can now have profileConnected/profileDisconnected method to initialise/free profile dependant resources
Goffi <goffi@goffi.org>
parents: 434
diff changeset
357 for plugin in self.plugins.iteritems():
62145e50eae5 core: plugins can now have profileConnected/profileDisconnected method to initialise/free profile dependant resources
Goffi <goffi@goffi.org>
parents: 434
diff changeset
358 disconnected_cb = getattr(plugin[1], "profileDisconnected", None)
62145e50eae5 core: plugins can now have profileConnected/profileDisconnected method to initialise/free profile dependant resources
Goffi <goffi@goffi.org>
parents: 434
diff changeset
359 if disconnected_cb:
62145e50eae5 core: plugins can now have profileConnected/profileDisconnected method to initialise/free profile dependant resources
Goffi <goffi@goffi.org>
parents: 434
diff changeset
360 disconnected_cb(profile)
6
5799493fa548 connection and disconnection management
Goffi <goffi@goffi.org>
parents: 5
diff changeset
361
1482
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
362 def getFeatures(self, profile_key=C.PROF_KEY_NONE):
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
363 """Get available features
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
364
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
365 Return list of activated plugins and plugin specific data
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
366 @param profile_key: %(doc_profile_key)s
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
367 C.PROF_KEY_NONE can be used to have general plugins data (i.e. not profile dependent)
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
368 @return (dict)[Deferred]: features data where:
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
369 - key is plugin import name, present only for activated plugins
1650
b08b828a87c9 quick frontend (blog): fixed group blog panels (displaying only, sending is not working yet)
Goffi <goffi@goffi.org>
parents: 1644
diff changeset
370 - value is a an other dict, when meaning is specific to each plugin.
1482
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
371 this dict is return by plugin's getFeature method.
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
372 If this method doesn't exists, an empty dict is returned.
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
373 """
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
374 try:
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
375 # FIXME: there is no method yet to check profile session
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
376 # as soon as one is implemented, it should be used here
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
377 self.getClient(profile_key)
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
378 except KeyError:
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
379 log.warning("Requesting features for a profile outside a session")
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
380 profile_key = C.PROF_KEY_NONE
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
381 except exceptions.ProfileNotSetError:
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
382 pass
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
383
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
384 features = []
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
385 for import_name, plugin in self.plugins.iteritems():
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
386 try:
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
387 features_d = defer.maybeDeferred(plugin.getFeatures, profile_key)
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
388 except AttributeError:
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
389 features_d = defer.succeed({})
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
390 features.append(features_d)
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
391
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
392 d_list = defer.DeferredList(features)
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
393 def buildFeatures(result, import_names):
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
394 assert len(result) == len(import_names)
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
395 ret = {}
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
396 for name, (success, data) in zip (import_names, result):
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
397 if success:
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
398 ret[name] = data
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
399 else:
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
400 log.warning(u"Error while getting features for {name}: {failure}".format(
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
401 name=name, failure=data))
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
402 ret[name] = {}
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
403 return ret
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
404
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
405 d_list.addCallback(buildFeatures, self.plugins.keys())
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
406 return d_list
80cd55dd5b04 core, bridge: added getFeatures method:
Goffi <goffi@goffi.org>
parents: 1470
diff changeset
407
466
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 460
diff changeset
408 def getContacts(self, profile_key):
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 460
diff changeset
409 client = self.getClient(profile_key)
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1234
diff changeset
410 def got_roster(dummy):
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1234
diff changeset
411 ret = []
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1234
diff changeset
412 for item in client.roster.getItems(): # we get all items for client's roster
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1234
diff changeset
413 # and convert them to expected format
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1234
diff changeset
414 attr = client.roster.getAttributes(item)
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1234
diff changeset
415 ret.append([item.jid.userhost(), attr, item.groups])
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1234
diff changeset
416 return ret
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1234
diff changeset
417
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1234
diff changeset
418 return client.roster.got_roster.addCallback(got_roster)
466
448ce3c9e2ac core: Roster cache refactoring: cache is now managed by client's SatRosterProtocol instance.
Goffi <goffi@goffi.org>
parents: 460
diff changeset
419
501
e9634d2e7b38 core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents: 489
diff changeset
420 def getContactsFromGroup(self, group, profile_key):
e9634d2e7b38 core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents: 489
diff changeset
421 client = self.getClient(profile_key)
941
c6d8fc63b1db core, plugins: host.getClient now raise an exception instead of returning None when no profile is found, plugins have been adapted consequently and a bit cleaned
Goffi <goffi@goffi.org>
parents: 930
diff changeset
422 return [jid_.full() for jid_ in client.roster.getJidsFromGroup(group)]
501
e9634d2e7b38 core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents: 489
diff changeset
423
416
32dc8b18c2ae core: param loading/purging on profile connection/disconnection
Goffi <goffi@goffi.org>
parents: 413
diff changeset
424 def purgeClient(self, profile):
32dc8b18c2ae core: param loading/purging on profile connection/disconnection
Goffi <goffi@goffi.org>
parents: 413
diff changeset
425 """Remove reference to a profile client and purge cache
32dc8b18c2ae core: param loading/purging on profile connection/disconnection
Goffi <goffi@goffi.org>
parents: 413
diff changeset
426 the garbage collector can then free the memory"""
32dc8b18c2ae core: param loading/purging on profile connection/disconnection
Goffi <goffi@goffi.org>
parents: 413
diff changeset
427 try:
32dc8b18c2ae core: param loading/purging on profile connection/disconnection
Goffi <goffi@goffi.org>
parents: 413
diff changeset
428 del self.profiles[profile]
32dc8b18c2ae core: param loading/purging on profile connection/disconnection
Goffi <goffi@goffi.org>
parents: 413
diff changeset
429 except KeyError:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 991
diff changeset
430 log.error(_("Trying to remove reference to a client not referenced"))
484
23cbdf0a0777 core: presence status + last resource refactored and kept in entitiesCache in memory.py, profile cache is purged on disconnection
Goffi <goffi@goffi.org>
parents: 480
diff changeset
431 self.memory.purgeProfileSession(profile)
416
32dc8b18c2ae core: param loading/purging on profile connection/disconnection
Goffi <goffi@goffi.org>
parents: 413
diff changeset
432
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
433 def startService(self):
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 991
diff changeset
434 log.info(u"Salut à toi ô mon frère !")
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
435
13
bd9e9997d540 wokkel integration (not finished yet)
Goffi <goffi@goffi.org>
parents: 12
diff changeset
436 def stopService(self):
1007
a7d33c7a8277 core (log): refactoring + twisted backend:
Goffi <goffi@goffi.org>
parents: 999
diff changeset
437 log.info(u"Salut aussi à Rantanplan")
1550
465d4d484e7c core: plugin unload:
Goffi <goffi@goffi.org>
parents: 1535
diff changeset
438 return self.pluginsUnload()
0
goffi@necton2
parents:
diff changeset
439
goffi@necton2
parents:
diff changeset
440 def run(self):
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 991
diff changeset
441 log.debug(_("running app"))
0
goffi@necton2
parents:
diff changeset
442 reactor.run()
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
443
0
goffi@necton2
parents:
diff changeset
444 def stop(self):
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 991
diff changeset
445 log.debug(_("stopping app"))
0
goffi@necton2
parents:
diff changeset
446 reactor.stop()
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
447
37
a61beb21d16d Gateway registration, unregistration & edition
Goffi <goffi@goffi.org>
parents: 36
diff changeset
448 ## Misc methods ##
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
449
64
d46f849664aa SàT: multi-profile, plugins updated
Goffi <goffi@goffi.org>
parents: 63
diff changeset
450 def getJidNStream(self, profile_key):
d46f849664aa SàT: multi-profile, plugins updated
Goffi <goffi@goffi.org>
parents: 63
diff changeset
451 """Convenient method to get jid and stream from profile key
d46f849664aa SàT: multi-profile, plugins updated
Goffi <goffi@goffi.org>
parents: 63
diff changeset
452 @return: tuple (jid, xmlstream) from profile, can be None"""
1573
6338677f3a89 core (client): added a sendError method to easily build error response from <IQ\> stanza
Goffi <goffi@goffi.org>
parents: 1550
diff changeset
453 # TODO: deprecate this method (getClient is enough)
64
d46f849664aa SàT: multi-profile, plugins updated
Goffi <goffi@goffi.org>
parents: 63
diff changeset
454 profile = self.memory.getProfileName(profile_key)
d46f849664aa SàT: multi-profile, plugins updated
Goffi <goffi@goffi.org>
parents: 63
diff changeset
455 if not profile or not self.profiles[profile].isConnected():
d46f849664aa SàT: multi-profile, plugins updated
Goffi <goffi@goffi.org>
parents: 63
diff changeset
456 return (None, None)
d46f849664aa SàT: multi-profile, plugins updated
Goffi <goffi@goffi.org>
parents: 63
diff changeset
457 return (self.profiles[profile].jid, self.profiles[profile].xmlstream)
d46f849664aa SàT: multi-profile, plugins updated
Goffi <goffi@goffi.org>
parents: 63
diff changeset
458
d46f849664aa SàT: multi-profile, plugins updated
Goffi <goffi@goffi.org>
parents: 63
diff changeset
459 def getClient(self, profile_key):
d46f849664aa SàT: multi-profile, plugins updated
Goffi <goffi@goffi.org>
parents: 63
diff changeset
460 """Convenient method to get client from profile key
1624
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
461
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
462 @return: client or None if it doesn't exist
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
463 @raise exceptions.ProfileKeyUnknown: the profile or profile key doesn't exist
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
464 @raise exceptions.NotFound: client is not available
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
465 This happen if profile has not been use yet
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
466 """
64
d46f849664aa SàT: multi-profile, plugins updated
Goffi <goffi@goffi.org>
parents: 63
diff changeset
467 profile = self.memory.getProfileName(profile_key)
d46f849664aa SàT: multi-profile, plugins updated
Goffi <goffi@goffi.org>
parents: 63
diff changeset
468 if not profile:
1624
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
469 raise exceptions.ProfileKeyUnknown
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
470 try:
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
471 return self.profiles[profile]
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
472 except KeyError:
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
473 raise exceptions.NotFound
64
d46f849664aa SàT: multi-profile, plugins updated
Goffi <goffi@goffi.org>
parents: 63
diff changeset
474
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents: 727
diff changeset
475 def getClients(self, profile_key):
1522
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
476 """Convenient method to get list of clients from profile key (manage list through profile_key like C.PROF_KEY_ALL)
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
477
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents: 727
diff changeset
478 @param profile_key: %(doc_profile_key)s
1522
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
479 @return: list of clients
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
480 """
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
481 try:
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
482 profile = self.memory.getProfileName(profile_key, True)
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
483 except exceptions.ProfileUnknownError:
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents: 727
diff changeset
484 return []
1522
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
485 if profile == C.PROF_KEY_ALL:
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents: 727
diff changeset
486 return self.profiles.values()
1522
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
487 elif profile.count('@') > 1:
1624
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
488 raise exceptions.ProfileKeyUnknown
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents: 727
diff changeset
489 return [self.profiles[profile]]
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents: 727
diff changeset
490
1234
9c17bd37e6e5 core: better management of default value in getConfig
Goffi <goffi@goffi.org>
parents: 1189
diff changeset
491 def _getConfig(self, section, name):
9c17bd37e6e5 core: better management of default value in getConfig
Goffi <goffi@goffi.org>
parents: 1189
diff changeset
492 """Get the main configuration option
9c17bd37e6e5 core: better management of default value in getConfig
Goffi <goffi@goffi.org>
parents: 1189
diff changeset
493
9c17bd37e6e5 core: better management of default value in getConfig
Goffi <goffi@goffi.org>
parents: 1189
diff changeset
494 @param section: section of the config file (None or '' for DEFAULT)
9c17bd37e6e5 core: better management of default value in getConfig
Goffi <goffi@goffi.org>
parents: 1189
diff changeset
495 @param name: name of the option
9c17bd37e6e5 core: better management of default value in getConfig
Goffi <goffi@goffi.org>
parents: 1189
diff changeset
496 @return: unicode representation of the option
9c17bd37e6e5 core: better management of default value in getConfig
Goffi <goffi@goffi.org>
parents: 1189
diff changeset
497 """
9c17bd37e6e5 core: better management of default value in getConfig
Goffi <goffi@goffi.org>
parents: 1189
diff changeset
498 return unicode(self.memory.getConfig(section, name, ''))
9c17bd37e6e5 core: better management of default value in getConfig
Goffi <goffi@goffi.org>
parents: 1189
diff changeset
499
16
0a024d5e0cd0 New account creation (in-band registration)
Goffi <goffi@goffi.org>
parents: 15
diff changeset
500 ## Client management ##
0
goffi@necton2
parents:
diff changeset
501
641
49587e170f53 core: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents: 636
diff changeset
502 def setParam(self, name, value, category, security_limit, profile_key):
0
goffi@necton2
parents:
diff changeset
503 """set wanted paramater and notice observers"""
641
49587e170f53 core: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents: 636
diff changeset
504 self.memory.setParam(name, value, category, security_limit, profile_key)
0
goffi@necton2
parents:
diff changeset
505
346
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 341
diff changeset
506 def isConnected(self, profile_key):
62
93cb45a7420f SàT multi-profile: connection using profiles
Goffi <goffi@goffi.org>
parents: 60
diff changeset
507 """Return connection status of profile
93cb45a7420f SàT multi-profile: connection using profiles
Goffi <goffi@goffi.org>
parents: 60
diff changeset
508 @param profile_key: key_word or profile name to determine profile name
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
509 @return: True if connected
62
93cb45a7420f SàT multi-profile: connection using profiles
Goffi <goffi@goffi.org>
parents: 60
diff changeset
510 """
93cb45a7420f SàT multi-profile: connection using profiles
Goffi <goffi@goffi.org>
parents: 60
diff changeset
511 profile = self.memory.getProfileName(profile_key)
93cb45a7420f SàT multi-profile: connection using profiles
Goffi <goffi@goffi.org>
parents: 60
diff changeset
512 if not profile:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 991
diff changeset
513 log.error(_('asking connection status for a non-existant profile'))
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1027
diff changeset
514 raise exceptions.ProfileUnknownError(profile_key)
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
515 if profile not in self.profiles:
62
93cb45a7420f SàT multi-profile: connection using profiles
Goffi <goffi@goffi.org>
parents: 60
diff changeset
516 return False
93cb45a7420f SàT multi-profile: connection using profiles
Goffi <goffi@goffi.org>
parents: 60
diff changeset
517 return self.profiles[profile].isConnected()
0
goffi@necton2
parents:
diff changeset
518
22
bb72c29f3432 added action cb mechanism for buttons. Tested with a temporary new user registration button.
Goffi <goffi@goffi.org>
parents: 18
diff changeset
519
1052
e88bff4c8b77 core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 1043
diff changeset
520 ## XMPP methods ##
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
521
541
8b116fa42a31 core, bridge: waiting confirmation management (new getWaitingConf method)
Goffi <goffi@goffi.org>
parents: 538
diff changeset
522 def getWaitingConf(self, profile_key=None):
8b116fa42a31 core, bridge: waiting confirmation management (new getWaitingConf method)
Goffi <goffi@goffi.org>
parents: 538
diff changeset
523 assert(profile_key)
8b116fa42a31 core, bridge: waiting confirmation management (new getWaitingConf method)
Goffi <goffi@goffi.org>
parents: 538
diff changeset
524 client = self.getClient(profile_key)
8b116fa42a31 core, bridge: waiting confirmation management (new getWaitingConf method)
Goffi <goffi@goffi.org>
parents: 538
diff changeset
525 ret = []
8b116fa42a31 core, bridge: waiting confirmation management (new getWaitingConf method)
Goffi <goffi@goffi.org>
parents: 538
diff changeset
526 for conf_id in client._waiting_conf:
8b116fa42a31 core, bridge: waiting confirmation management (new getWaitingConf method)
Goffi <goffi@goffi.org>
parents: 538
diff changeset
527 conf_type, data = client._waiting_conf[conf_id][:2]
8b116fa42a31 core, bridge: waiting confirmation management (new getWaitingConf method)
Goffi <goffi@goffi.org>
parents: 538
diff changeset
528 ret.append((conf_id, conf_type, data))
8b116fa42a31 core, bridge: waiting confirmation management (new getWaitingConf method)
Goffi <goffi@goffi.org>
parents: 538
diff changeset
529 return ret
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
530
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
531 def generateMessageXML(self, data):
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
532 """Generate <message/> stanza from message data
1052
e88bff4c8b77 core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 1043
diff changeset
533
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
534 @param data(dict): message data
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
535 domish element will be put in data['xml']
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
536 following keys are needed:
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
537 - from
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
538 - to
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
539 - uid: can be set to '' if uid attribute is not wanted
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
540 - message
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
541 - type
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
542 - subject
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
543 - extra
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
544 @return (dict) message data
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
545 """
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
546 data['xml'] = message_elt = domish.Element((None, 'message'))
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
547 message_elt["to"] = data["to"].full()
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
548 message_elt["from"] = data['from'].full()
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
549 message_elt["type"] = data["type"]
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
550 if data['uid']: # key must be present but can be set to ''
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
551 # by a plugin to avoid id on purpose
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
552 message_elt['id'] = data['uid']
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
553 for lang, subject in data["subject"].iteritems():
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
554 subject_elt = message_elt.addElement("subject", content=subject)
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
555 if lang:
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
556 subject_elt['xml:lang'] = lang
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
557 for lang, message in data["message"].iteritems():
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
558 body_elt = message_elt.addElement("body", content=message)
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
559 if lang:
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
560 body_elt['xml:lang'] = lang
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
561 try:
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
562 thread = data['extra']['thread']
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
563 except KeyError:
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
564 if 'thread_parent' in data['extra']:
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
565 raise exceptions.InternalError(u"thread_parent found while there is not associated thread")
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
566 else:
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
567 thread_elt = message_elt.addElement("thread", content=thread)
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
568 try:
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
569 thread_elt["parent"] = data["extra"]["thread_parent"]
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
570 except KeyError:
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
571 pass
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
572 return data
636
7ea6d5a86e58 plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents: 627
diff changeset
573
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
574 def _messageSend(self, to_jid_s, message, subject=None, mess_type='auto', extra=None, profile_key=C.PROF_KEY_NONE):
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
575 client = self.getClient(profile_key)
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
576 to_jid = jid.JID(to_jid_s)
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
577 #XXX: we need to use the dictionary comprehension because D-Bus return its own types, and pickle can't manage them. TODO: Need to find a better way
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
578 return self.messageSend(client, to_jid, message, subject, mess_type, {unicode(key): unicode(value) for key, value in extra.items()})
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
579
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
580 def messageSend(self, client, to_jid, message, subject=None, mess_type='auto', extra=None, uid=None, no_trigger=False):
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
581 """Send a message to an entity
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
582
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
583 @param to_jid(jid.JID): destinee of the message
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
584 @param message(dict): message body, key is the language (use '' when unknown)
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
585 @param subject(dict): message subject, key is the language (use '' when unknown)
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
586 @param mess_type(str): one of standard message type (cf RFC 6121 §5.2.2) or:
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
587 - auto: for automatic type detection
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
588 - info: for information ("info_type" can be specified in extra)
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
589 @param extra(dict, None): extra data. Key can be:
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
590 - info_type: information type, can be
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
591 TODO
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
592 @param uid(unicode, None): unique id:
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
593 should be unique at least in this XMPP session
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
594 if None, an uuid will be generated
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
595 @param no_trigger (bool): if True, messageSend trigger will no be used
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
596 useful when a message need to be sent without any modification
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
597 """
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
598 profile = client.profile
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
599 if subject is None:
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
600 subject = {}
698
d731ae066158 core: sendMessage's options parameter has been renamed to extra to be consistent with newMessage
Goffi <goffi@goffi.org>
parents: 697
diff changeset
601 if extra is None:
d731ae066158 core: sendMessage's options parameter has been renamed to extra to be consistent with newMessage
Goffi <goffi@goffi.org>
parents: 697
diff changeset
602 extra = {}
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
603 data = { # dict is similar to the one used in client.onMessage
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
604 "from": client.jid,
602
6fd1095b2b7b core: sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 589
diff changeset
605 "to": to_jid,
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
606 "uid": uid or unicode(uuid.uuid4()),
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
607 "message": message,
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
608 "subject": subject,
636
7ea6d5a86e58 plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents: 627
diff changeset
609 "type": mess_type,
698
d731ae066158 core: sendMessage's options parameter has been renamed to extra to be consistent with newMessage
Goffi <goffi@goffi.org>
parents: 697
diff changeset
610 "extra": extra,
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
611 "timestamp": time.time(),
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
612 }
922
c897c8d321b3 core: sendMessageTrigger now manage pre and post treatments, which happen before or after XML generation
Goffi <goffi@goffi.org>
parents: 919
diff changeset
613 pre_xml_treatments = defer.Deferred() # XXX: plugin can add their pre XML treatments to this deferred
c897c8d321b3 core: sendMessageTrigger now manage pre and post treatments, which happen before or after XML generation
Goffi <goffi@goffi.org>
parents: 919
diff changeset
614 post_xml_treatments = defer.Deferred() # XXX: plugin can add their post XML treatments to this deferred
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
615
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
616 if data["type"] == "auto":
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
617 # we try to guess the type
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
618 if data["subject"]:
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
619 data["type"] = 'normal'
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
620 elif not data["to"].resource: # if to JID has a resource, the type is not 'groupchat'
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
621 # we may have a groupchat message, we check if the we know this jid
489
f36c705a5310 core: sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 484
diff changeset
622 try:
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
623 entity_type = self.memory.getEntityData(data["to"], ['type'], profile)["type"]
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1262
diff changeset
624 #FIXME: should entity_type manage resources ?
627
d207c2186519 core, bridge, jp, quick_frontend: SàT stop more gracefully if bridge can't be initialised:
Goffi <goffi@goffi.org>
parents: 609
diff changeset
625 except (exceptions.UnknownEntityError, KeyError):
489
f36c705a5310 core: sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 484
diff changeset
626 entity_type = "contact"
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
627
489
f36c705a5310 core: sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 484
diff changeset
628 if entity_type == "chatroom":
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
629 data["type"] = 'groupchat'
489
f36c705a5310 core: sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 484
diff changeset
630 else:
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
631 data["type"] = 'chat'
489
f36c705a5310 core: sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 484
diff changeset
632 else:
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
633 data["type"] == 'chat'
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
634 data["type"] == "chat" if data["subject"] else "normal"
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
635
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
636 # FIXME: send_only is used by libervia's OTR plugin to avoid
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
637 # the triggers from frontend, and no_trigger do the same
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
638 # thing internally, this could be unified
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
639 send_only = data['extra'].get('send_only', None)
1148
8cdb97e89d9b core: sendMessage handles the extra data key 'send_only' to skip triggers, storage and echo
souliane <souliane@mailoo.org>
parents: 1145
diff changeset
640
8cdb97e89d9b core: sendMessage handles the extra data key 'send_only' to skip triggers, storage and echo
souliane <souliane@mailoo.org>
parents: 1145
diff changeset
641 if not no_trigger and not send_only:
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
642 if not self.trigger.point("messageSend", client, data, pre_xml_treatments, post_xml_treatments):
752
f49945d728de core,bridge: sendMessage bridge method is now async
Goffi <goffi@goffi.org>
parents: 748
diff changeset
643 return defer.succeed(None)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
644
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
645 log.debug(_(u"Sending message (type {type}, to {to})").format(type=data["type"], to=to_jid.full()))
922
c897c8d321b3 core: sendMessageTrigger now manage pre and post treatments, which happen before or after XML generation
Goffi <goffi@goffi.org>
parents: 919
diff changeset
646
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
647 pre_xml_treatments.addCallback(lambda dummy: self.generateMessageXML(data))
922
c897c8d321b3 core: sendMessageTrigger now manage pre and post treatments, which happen before or after XML generation
Goffi <goffi@goffi.org>
parents: 919
diff changeset
648 pre_xml_treatments.chainDeferred(post_xml_treatments)
1052
e88bff4c8b77 core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 1043
diff changeset
649 post_xml_treatments.addCallback(self._sendMessageToStream, client)
1148
8cdb97e89d9b core: sendMessage handles the extra data key 'send_only' to skip triggers, storage and echo
souliane <souliane@mailoo.org>
parents: 1145
diff changeset
650 if send_only:
8cdb97e89d9b core: sendMessage handles the extra data key 'send_only' to skip triggers, storage and echo
souliane <souliane@mailoo.org>
parents: 1145
diff changeset
651 log.debug(_("Triggers, storage and echo have been inhibited by the 'send_only' parameter"))
8cdb97e89d9b core: sendMessage handles the extra data key 'send_only' to skip triggers, storage and echo
souliane <souliane@mailoo.org>
parents: 1145
diff changeset
652 else:
8cdb97e89d9b core: sendMessage handles the extra data key 'send_only' to skip triggers, storage and echo
souliane <souliane@mailoo.org>
parents: 1145
diff changeset
653 post_xml_treatments.addCallback(self._storeMessage, client)
8cdb97e89d9b core: sendMessage handles the extra data key 'send_only' to skip triggers, storage and echo
souliane <souliane@mailoo.org>
parents: 1145
diff changeset
654 post_xml_treatments.addCallback(self.sendMessageToBridge, client)
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
655 post_xml_treatments.addErrback(self._cancelErrorTrap)
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
656 pre_xml_treatments.callback(data)
922
c897c8d321b3 core: sendMessageTrigger now manage pre and post treatments, which happen before or after XML generation
Goffi <goffi@goffi.org>
parents: 919
diff changeset
657 return pre_xml_treatments
742
03744d9ebc13 plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents: 728
diff changeset
658
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
659 def _cancelErrorTrap(failure):
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
660 """A message sending can be cancelled by a plugin treatment"""
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
661 failure.trap(exceptions.CancelError)
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
662
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
663 def _sendMessageToStream(self, data, client):
1052
e88bff4c8b77 core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 1043
diff changeset
664 """Actualy send the message to the server
e88bff4c8b77 core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 1043
diff changeset
665
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
666 @param data: message data dictionnary
1052
e88bff4c8b77 core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 1043
diff changeset
667 @param client: profile's client
742
03744d9ebc13 plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents: 728
diff changeset
668 """
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
669 client.xmlstream.send(data['xml'])
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
670 return data
1052
e88bff4c8b77 core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 1043
diff changeset
671
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
672 def _storeMessage(self, data, client):
1052
e88bff4c8b77 core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 1043
diff changeset
673 """Store message into database (for local history)
e88bff4c8b77 core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 1043
diff changeset
674
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
675 @param data: message data dictionnary
1052
e88bff4c8b77 core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 1043
diff changeset
676 @param client: profile's client
e88bff4c8b77 core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 1043
diff changeset
677 """
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
678 if data["type"] != C.MESS_TYPE_GROUPCHAT:
742
03744d9ebc13 plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents: 728
diff changeset
679 # we don't add groupchat message to history, as we get them back
03744d9ebc13 plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents: 728
diff changeset
680 # and they will be added then
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
681 if data['message']: # we need a message to save something
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
682 self.memory.addToHistory(client, data)
1052
e88bff4c8b77 core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 1043
diff changeset
683 else:
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
684 log.warning(u"No message found") # empty body should be managed by plugins before this point
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
685 return data
1052
e88bff4c8b77 core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 1043
diff changeset
686
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
687 def sendMessageToBridge(self, data, client):
1052
e88bff4c8b77 core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 1043
diff changeset
688 """Send message to bridge, so frontends can display it
e88bff4c8b77 core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 1043
diff changeset
689
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
690 @param data: message data dictionnary
1052
e88bff4c8b77 core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 1043
diff changeset
691 @param client: profile's client
e88bff4c8b77 core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 1043
diff changeset
692 """
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
693 if data["type"] != C.MESS_TYPE_GROUPCHAT:
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
694 # we don't send groupchat message to bridge, as we get them back
1052
e88bff4c8b77 core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 1043
diff changeset
695 # and they will be added the
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
696 if data['message']: # we need a message to send something
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
697 # We send back the message, so all frontends are aware of it
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
698 self.bridge.messageNew(data['uid'], data['timestamp'], data['from'].full(), data['to'].full(), data['message'], data['subject'], data['type'], data['extra'], profile=client.profile)
1052
e88bff4c8b77 core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 1043
diff changeset
699 else:
e88bff4c8b77 core (XMPP): sendMessage refactoring:
Goffi <goffi@goffi.org>
parents: 1043
diff changeset
700 log.warning(_("No message found"))
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
701 return data
16
0a024d5e0cd0 New account creation (in-band registration)
Goffi <goffi@goffi.org>
parents: 15
diff changeset
702
917
a9401694d2dc bridge, frontends: display presence with the highest priority + reset your own presence when you (dis)connect
souliane <souliane@mailoo.org>
parents: 916
diff changeset
703 def _setPresence(self, to="", show="", statuses=None, profile_key=C.PROF_KEY_NONE):
a9401694d2dc bridge, frontends: display presence with the highest priority + reset your own presence when you (dis)connect
souliane <souliane@mailoo.org>
parents: 916
diff changeset
704 return self.setPresence(jid.JID(to) if to else None, show, statuses, profile_key)
807
be4c5e24dab9 plugin XEP-0077, plugin XEP-0100, frontends: gateways have been entirely implemented in backend using the new refactored XMLUI and AdvancedListContainer. The now useless code has been removed from frontends.
Goffi <goffi@goffi.org>
parents: 806
diff changeset
705
917
a9401694d2dc bridge, frontends: display presence with the highest priority + reset your own presence when you (dis)connect
souliane <souliane@mailoo.org>
parents: 916
diff changeset
706 def setPresence(self, to_jid=None, show="", statuses=None, profile_key=C.PROF_KEY_NONE):
0
goffi@necton2
parents:
diff changeset
707 """Send our presence information"""
727
c1cd6c0c2c38 core: fixed statuses parameter in setPresence, and using @NONE@ instead of @DEFAULT@ for default profile_key
Goffi <goffi@goffi.org>
parents: 700
diff changeset
708 if statuses is None:
c1cd6c0c2c38 core: fixed statuses parameter in setPresence, and using @NONE@ instead of @DEFAULT@ for default profile_key
Goffi <goffi@goffi.org>
parents: 700
diff changeset
709 statuses = {}
63
0db25931b60d SàT: multi-profiles: somes fixes in core
Goffi <goffi@goffi.org>
parents: 62
diff changeset
710 profile = self.memory.getProfileName(profile_key)
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1234
diff changeset
711 assert profile
917
a9401694d2dc bridge, frontends: display presence with the highest priority + reset your own presence when you (dis)connect
souliane <souliane@mailoo.org>
parents: 916
diff changeset
712 priority = int(self.memory.getParamA("Priority", "Connection", profile_key=profile))
63
0db25931b60d SàT: multi-profiles: somes fixes in core
Goffi <goffi@goffi.org>
parents: 62
diff changeset
713 self.profiles[profile].presence.available(to_jid, show, statuses, priority)
313
cc8ffbfe938c QnD workaround for presence broadcast openfire bug
Goffi <goffi@goffi.org>
parents: 305
diff changeset
714 #XXX: FIXME: temporary fix to work around openfire 3.7.0 bug (presence is not broadcasted to generating resource)
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
715 if '' in statuses:
1417
176de79c8c39 core, plugin XEP-0045, frontends: change frontend method "setStatusOnline" for "setPresenceStatus":
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
716 statuses[C.PRESENCE_STATUSES_DEFAULT] = statuses.pop('')
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
717 self.bridge.presenceUpdate(self.profiles[profile].jid.full(), show,
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
718 int(priority), statuses, profile)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
719
346
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 341
diff changeset
720 def subscription(self, subs_type, raw_jid, profile_key):
187
12544ea2951f Core: removed addItem for roster list, according to http://wokkel.ik.nu/ticket/56
Goffi <goffi@goffi.org>
parents: 155
diff changeset
721 """Called to manage subscription
12544ea2951f Core: removed addItem for roster list, according to http://wokkel.ik.nu/ticket/56
Goffi <goffi@goffi.org>
parents: 155
diff changeset
722 @param subs_type: subsciption type (cf RFC 3921)
12544ea2951f Core: removed addItem for roster list, according to http://wokkel.ik.nu/ticket/56
Goffi <goffi@goffi.org>
parents: 155
diff changeset
723 @param raw_jid: unicode entity's jid
12544ea2951f Core: removed addItem for roster list, according to http://wokkel.ik.nu/ticket/56
Goffi <goffi@goffi.org>
parents: 155
diff changeset
724 @param profile_key: profile"""
63
0db25931b60d SàT: multi-profiles: somes fixes in core
Goffi <goffi@goffi.org>
parents: 62
diff changeset
725 profile = self.memory.getProfileName(profile_key)
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1234
diff changeset
726 assert profile
50
daa1f01a5332 SàT improvement:
Goffi <goffi@goffi.org>
parents: 41
diff changeset
727 to_jid = jid.JID(raw_jid)
1409
3265a2639182 massive (preventive) addition of 'u' (unicode) before the strings passed to logging functions
souliane <souliane@mailoo.org>
parents: 1396
diff changeset
728 log.debug(_(u'subsciption request [%(subs_type)s] for %(jid)s') % {'subs_type': subs_type, 'jid': to_jid.full()})
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
729 if subs_type == "subscribe":
63
0db25931b60d SàT: multi-profiles: somes fixes in core
Goffi <goffi@goffi.org>
parents: 62
diff changeset
730 self.profiles[profile].presence.subscribe(to_jid)
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
731 elif subs_type == "subscribed":
89
23caf1051099 multi-profile/subscription misc fixes
Goffi <goffi@goffi.org>
parents: 79
diff changeset
732 self.profiles[profile].presence.subscribed(to_jid)
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
733 elif subs_type == "unsubscribe":
63
0db25931b60d SàT: multi-profiles: somes fixes in core
Goffi <goffi@goffi.org>
parents: 62
diff changeset
734 self.profiles[profile].presence.unsubscribe(to_jid)
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
735 elif subs_type == "unsubscribed":
63
0db25931b60d SàT: multi-profiles: somes fixes in core
Goffi <goffi@goffi.org>
parents: 62
diff changeset
736 self.profiles[profile].presence.unsubscribed(to_jid)
0
goffi@necton2
parents:
diff changeset
737
807
be4c5e24dab9 plugin XEP-0077, plugin XEP-0100, frontends: gateways have been entirely implemented in backend using the new refactored XMLUI and AdvancedListContainer. The now useless code has been removed from frontends.
Goffi <goffi@goffi.org>
parents: 806
diff changeset
738 def _addContact(self, to_jid_s, profile_key):
846
59d486726577 core: fix mispelled argument
souliane <souliane@mailoo.org>
parents: 834
diff changeset
739 return self.addContact(jid.JID(to_jid_s), profile_key)
807
be4c5e24dab9 plugin XEP-0077, plugin XEP-0100, frontends: gateways have been entirely implemented in backend using the new refactored XMLUI and AdvancedListContainer. The now useless code has been removed from frontends.
Goffi <goffi@goffi.org>
parents: 806
diff changeset
740
be4c5e24dab9 plugin XEP-0077, plugin XEP-0100, frontends: gateways have been entirely implemented in backend using the new refactored XMLUI and AdvancedListContainer. The now useless code has been removed from frontends.
Goffi <goffi@goffi.org>
parents: 806
diff changeset
741 def addContact(self, to_jid, profile_key):
0
goffi@necton2
parents:
diff changeset
742 """Add a contact in roster list"""
63
0db25931b60d SàT: multi-profiles: somes fixes in core
Goffi <goffi@goffi.org>
parents: 62
diff changeset
743 profile = self.memory.getProfileName(profile_key)
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1234
diff changeset
744 assert profile
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1234
diff changeset
745 # presence is sufficient, as a roster push will be sent according to RFC 6121 §3.1.2
63
0db25931b60d SàT: multi-profiles: somes fixes in core
Goffi <goffi@goffi.org>
parents: 62
diff changeset
746 self.profiles[profile].presence.subscribe(to_jid)
0
goffi@necton2
parents:
diff changeset
747
807
be4c5e24dab9 plugin XEP-0077, plugin XEP-0100, frontends: gateways have been entirely implemented in backend using the new refactored XMLUI and AdvancedListContainer. The now useless code has been removed from frontends.
Goffi <goffi@goffi.org>
parents: 806
diff changeset
748 def _updateContact(self, to_jid_s, name, groups, profile_key):
be4c5e24dab9 plugin XEP-0077, plugin XEP-0100, frontends: gateways have been entirely implemented in backend using the new refactored XMLUI and AdvancedListContainer. The now useless code has been removed from frontends.
Goffi <goffi@goffi.org>
parents: 806
diff changeset
749 return self.updateContact(jid.JID(to_jid_s), name, groups, profile_key)
be4c5e24dab9 plugin XEP-0077, plugin XEP-0100, frontends: gateways have been entirely implemented in backend using the new refactored XMLUI and AdvancedListContainer. The now useless code has been removed from frontends.
Goffi <goffi@goffi.org>
parents: 806
diff changeset
750
be4c5e24dab9 plugin XEP-0077, plugin XEP-0100, frontends: gateways have been entirely implemented in backend using the new refactored XMLUI and AdvancedListContainer. The now useless code has been removed from frontends.
Goffi <goffi@goffi.org>
parents: 806
diff changeset
751 def updateContact(self, to_jid, name, groups, profile_key):
346
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 341
diff changeset
752 """update a contact in roster list"""
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 341
diff changeset
753 profile = self.memory.getProfileName(profile_key)
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1234
diff changeset
754 assert profile
346
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 341
diff changeset
755 groups = set(groups)
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 341
diff changeset
756 roster_item = RosterItem(to_jid)
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 341
diff changeset
757 roster_item.name = name or None
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 341
diff changeset
758 roster_item.groups = set(groups)
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1234
diff changeset
759 return self.profiles[profile].roster.setItem(roster_item)
346
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 341
diff changeset
760
807
be4c5e24dab9 plugin XEP-0077, plugin XEP-0100, frontends: gateways have been entirely implemented in backend using the new refactored XMLUI and AdvancedListContainer. The now useless code has been removed from frontends.
Goffi <goffi@goffi.org>
parents: 806
diff changeset
761 def _delContact(self, to_jid_s, profile_key):
be4c5e24dab9 plugin XEP-0077, plugin XEP-0100, frontends: gateways have been entirely implemented in backend using the new refactored XMLUI and AdvancedListContainer. The now useless code has been removed from frontends.
Goffi <goffi@goffi.org>
parents: 806
diff changeset
762 return self.delContact(jid.JID(to_jid_s), profile_key)
be4c5e24dab9 plugin XEP-0077, plugin XEP-0100, frontends: gateways have been entirely implemented in backend using the new refactored XMLUI and AdvancedListContainer. The now useless code has been removed from frontends.
Goffi <goffi@goffi.org>
parents: 806
diff changeset
763
be4c5e24dab9 plugin XEP-0077, plugin XEP-0100, frontends: gateways have been entirely implemented in backend using the new refactored XMLUI and AdvancedListContainer. The now useless code has been removed from frontends.
Goffi <goffi@goffi.org>
parents: 806
diff changeset
764 def delContact(self, to_jid, profile_key):
0
goffi@necton2
parents:
diff changeset
765 """Remove contact from roster list"""
63
0db25931b60d SàT: multi-profiles: somes fixes in core
Goffi <goffi@goffi.org>
parents: 62
diff changeset
766 profile = self.memory.getProfileName(profile_key)
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1234
diff changeset
767 assert profile
1355
33a21f06551d core: fixes bug introduced by 1262 (f8a8434dbac7) in SAT.delContact
souliane <souliane@mailoo.org>
parents: 1325
diff changeset
768 self.profiles[profile].presence.unsubscribe(to_jid) # is not asynchronous
33a21f06551d core: fixes bug introduced by 1262 (f8a8434dbac7) in SAT.delContact
souliane <souliane@mailoo.org>
parents: 1325
diff changeset
769 return self.profiles[profile].roster.removeItem(to_jid)
742
03744d9ebc13 plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents: 728
diff changeset
770
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
771 ## Discovery ##
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
772 # discovery methods are shortcuts to self.memory.disco
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
773 # the main difference with client.disco is that self.memory.disco manage cache
742
03744d9ebc13 plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents: 728
diff changeset
774
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
775 def hasFeature(self, *args, **kwargs):
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
776 return self.memory.disco.hasFeature(*args, **kwargs)
742
03744d9ebc13 plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents: 728
diff changeset
777
951
027a054c6dda core (disco): added checkFeature method + fixed hasFeature test
Goffi <goffi@goffi.org>
parents: 949
diff changeset
778 def checkFeature(self, *args, **kwargs):
027a054c6dda core (disco): added checkFeature method + fixed hasFeature test
Goffi <goffi@goffi.org>
parents: 949
diff changeset
779 return self.memory.disco.checkFeature(*args, **kwargs)
027a054c6dda core (disco): added checkFeature method + fixed hasFeature test
Goffi <goffi@goffi.org>
parents: 949
diff changeset
780
1491
704ca56f5ca9 core (disco): added checkFeatures to check several features at once + identities are now managed with a tuple in findFeaturesSet and checkFeatures
Goffi <goffi@goffi.org>
parents: 1482
diff changeset
781 def checkFeatures(self, *args, **kwargs):
704ca56f5ca9 core (disco): added checkFeatures to check several features at once + identities are now managed with a tuple in findFeaturesSet and checkFeatures
Goffi <goffi@goffi.org>
parents: 1482
diff changeset
782 return self.memory.disco.checkFeatures(*args, **kwargs)
704ca56f5ca9 core (disco): added checkFeatures to check several features at once + identities are now managed with a tuple in findFeaturesSet and checkFeatures
Goffi <goffi@goffi.org>
parents: 1482
diff changeset
783
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
784 def getDiscoInfos(self, *args, **kwargs):
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
785 return self.memory.disco.getInfos(*args, **kwargs)
0
goffi@necton2
parents:
diff changeset
786
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
787 def getDiscoItems(self, *args, **kwargs):
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
788 return self.memory.disco.getItems(*args, **kwargs)
0
goffi@necton2
parents:
diff changeset
789
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
790 def findServiceEntities(self, *args, **kwargs):
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
791 return self.memory.disco.findServiceEntities(*args, **kwargs)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
792
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
793 def findFeaturesSet(self, *args, **kwargs):
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
794 return self.memory.disco.findFeaturesSet(*args, **kwargs)
397
ccfd69d090c3 core: workaround to avoid a bug in item detection on jabber.fr. Need more investigation with jabber.fr admins (may be a bug in ejabberd)
Goffi <goffi@goffi.org>
parents: 391
diff changeset
795
742
03744d9ebc13 plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents: 728
diff changeset
796
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
797 ## Generic HMI ##
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 579
diff changeset
798
538
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
799 def actionResult(self, action_id, action_type, data, profile):
22
bb72c29f3432 added action cb mechanism for buttons. Tested with a temporary new user registration button.
Goffi <goffi@goffi.org>
parents: 18
diff changeset
800 """Send the result of an action
538
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
801 @param action_id: same action_id used with action
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
802 @param action_type: result action_type ("PARAM", "SUCCESS", "ERROR", "XMLUI")
37
a61beb21d16d Gateway registration, unregistration & edition
Goffi <goffi@goffi.org>
parents: 36
diff changeset
803 @param data: dictionary
22
bb72c29f3432 added action cb mechanism for buttons. Tested with a temporary new user registration button.
Goffi <goffi@goffi.org>
parents: 18
diff changeset
804 """
538
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
805 self.bridge.actionResult(action_type, action_id, data, profile)
22
bb72c29f3432 added action cb mechanism for buttons. Tested with a temporary new user registration button.
Goffi <goffi@goffi.org>
parents: 18
diff changeset
806
538
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
807 def actionResultExt(self, action_id, action_type, data, profile):
25
53e921c8a357 new plugin: gateways plugin, and first implementation of findGateways
Goffi <goffi@goffi.org>
parents: 23
diff changeset
808 """Send the result of an action, extended version
538
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
809 @param action_id: same action_id used with action
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
810 @param action_type: result action_type /!\ only "DICT_DICT" for this method
37
a61beb21d16d Gateway registration, unregistration & edition
Goffi <goffi@goffi.org>
parents: 36
diff changeset
811 @param data: dictionary of dictionaries
25
53e921c8a357 new plugin: gateways plugin, and first implementation of findGateways
Goffi <goffi@goffi.org>
parents: 23
diff changeset
812 """
538
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
813 if action_type != "DICT_DICT":
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 991
diff changeset
814 log.error(_("action_type for actionResultExt must be DICT_DICT, fixing it"))
538
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
815 action_type = "DICT_DICT"
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
816 self.bridge.actionResultExt(action_type, action_id, data, profile)
25
53e921c8a357 new plugin: gateways plugin, and first implementation of findGateways
Goffi <goffi@goffi.org>
parents: 23
diff changeset
817
538
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
818 def askConfirmation(self, conf_id, conf_type, data, cb, profile):
22
bb72c29f3432 added action cb mechanism for buttons. Tested with a temporary new user registration button.
Goffi <goffi@goffi.org>
parents: 18
diff changeset
819 """Add a confirmation callback
538
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
820 @param conf_id: conf_id used to get answer
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
821 @param conf_type: confirmation conf_type ("YES/NO", "FILE_TRANSFER")
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
822 @param data: data (depend of confirmation conf_type)
37
a61beb21d16d Gateway registration, unregistration & edition
Goffi <goffi@goffi.org>
parents: 36
diff changeset
823 @param cb: callback called with the answer
22
bb72c29f3432 added action cb mechanism for buttons. Tested with a temporary new user registration button.
Goffi <goffi@goffi.org>
parents: 18
diff changeset
824 """
759
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
825 # FIXME: use XMLUI and *callback methods for dialog
538
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
826 client = self.getClient(profile)
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
827 if conf_id in client._waiting_conf:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 991
diff changeset
828 log.error(_("Attempt to register two callbacks for the same confirmation"))
0
goffi@necton2
parents:
diff changeset
829 else:
541
8b116fa42a31 core, bridge: waiting confirmation management (new getWaitingConf method)
Goffi <goffi@goffi.org>
parents: 538
diff changeset
830 client._waiting_conf[conf_id] = (conf_type, data, cb)
8b116fa42a31 core, bridge: waiting confirmation management (new getWaitingConf method)
Goffi <goffi@goffi.org>
parents: 538
diff changeset
831 self.bridge.askConfirmation(conf_id, conf_type, data, profile)
0
goffi@necton2
parents:
diff changeset
832
538
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
833 def confirmationAnswer(self, conf_id, accepted, data, profile):
0
goffi@necton2
parents:
diff changeset
834 """Called by frontends to answer confirmation requests"""
538
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
835 client = self.getClient(profile)
1409
3265a2639182 massive (preventive) addition of 'u' (unicode) before the strings passed to logging functions
souliane <souliane@mailoo.org>
parents: 1396
diff changeset
836 log.debug(_(u"Received confirmation answer for conf_id [%(conf_id)s]: %(success)s") % {'conf_id': conf_id, 'success': _("accepted") if accepted else _("refused")})
589
d1b4805124a1 Fix pep8 support in src/core.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
837 if conf_id not in client._waiting_conf:
1409
3265a2639182 massive (preventive) addition of 'u' (unicode) before the strings passed to logging functions
souliane <souliane@mailoo.org>
parents: 1396
diff changeset
838 log.error(_(u"Received an unknown confirmation (%(id)s for %(profile)s)") % {'id': conf_id, 'profile': profile})
0
goffi@necton2
parents:
diff changeset
839 else:
541
8b116fa42a31 core, bridge: waiting confirmation management (new getWaitingConf method)
Goffi <goffi@goffi.org>
parents: 538
diff changeset
840 cb = client._waiting_conf[conf_id][-1]
538
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
841 del client._waiting_conf[conf_id]
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
842 cb(conf_id, accepted, data, profile)
0
goffi@necton2
parents:
diff changeset
843
1622
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
844 def _killAction(self, keep_id, client):
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
845 log.debug(u"Killing action {} for timeout".format(keep_id))
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
846 client.actions[keep_id]
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
847
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
848 def actionNew(self, action_data, security_limit=C.NO_SECURITY_LIMIT, keep_id=None, profile=C.PROF_KEY_NONE):
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
849 """Shortcut to bridge.actionNew which generate and id and keep for retrieval
1467
ceba6fd77739 core, bridge: new signal actionNew to launch an action from the backend (e.g. display a dialog message):
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
850
ceba6fd77739 core, bridge: new signal actionNew to launch an action from the backend (e.g. display a dialog message):
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
851 @param action_data(dict): action data (see bridge documentation)
1599
e2ed8009e66e backend, bridge, frontends: actionNew has now a security_limit argument + added some docstring to explain data argument
Goffi <goffi@goffi.org>
parents: 1598
diff changeset
852 @param security_limit: %(doc_security_limit)s
1622
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
853 @param keep_id(None, unicode): if not None, used to keep action for differed retrieval
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
854 must be set to the callback_id
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
855 action will be deleted after 30 min.
1467
ceba6fd77739 core, bridge: new signal actionNew to launch an action from the backend (e.g. display a dialog message):
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
856 @param profile: %(doc_profile)s
ceba6fd77739 core, bridge: new signal actionNew to launch an action from the backend (e.g. display a dialog message):
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
857 """
ceba6fd77739 core, bridge: new signal actionNew to launch an action from the backend (e.g. display a dialog message):
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
858 id_ = unicode(uuid.uuid4())
1622
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
859 if keep_id is not None:
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
860 client = self.getClient(profile)
1644
98a2eb768bb0 core: fixed session cleaning after actionNew timeout
Goffi <goffi@goffi.org>
parents: 1626
diff changeset
861 action_timer = reactor.callLater(60*30, self._killAction, keep_id, client)
1622
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
862 client.actions[keep_id] = (action_data, id_, security_limit, action_timer)
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
863
1599
e2ed8009e66e backend, bridge, frontends: actionNew has now a security_limit argument + added some docstring to explain data argument
Goffi <goffi@goffi.org>
parents: 1598
diff changeset
864 self.bridge.actionNew(action_data, id_, security_limit, profile)
1467
ceba6fd77739 core, bridge: new signal actionNew to launch an action from the backend (e.g. display a dialog message):
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
865
1622
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
866 def actionsGet(self, profile):
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
867 """Return current non answered actions
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
868
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
869 @param profile: %(doc_profile)s
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
870 """
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
871 client = self.getClient(profile)
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
872 return [action_tuple[:-1] for action_tuple in client.actions.itervalues()]
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
873
1626
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
874 def registerProgressCb(self, progress_id, callback, metadata=None, profile=C.PROF_KEY_NONE):
0
goffi@necton2
parents:
diff changeset
875 """Register a callback called when progress is requested for id"""
1626
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
876 if metadata is None:
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
877 metadata = {}
538
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
878 client = self.getClient(profile)
1522
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
879 if progress_id in client._progress_cb:
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
880 raise exceptions.ConflictError(u"Progress ID is not unique !")
1626
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
881 client._progress_cb[progress_id] = (callback, metadata)
0
goffi@necton2
parents:
diff changeset
882
1522
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
883 def removeProgressCb(self, progress_id, profile):
0
goffi@necton2
parents:
diff changeset
884 """Remove a progress callback"""
538
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
885 client = self.getClient(profile)
1522
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
886 try:
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
887 del client._progress_cb[progress_id]
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
888 except KeyError:
1585
846a39900fa6 plugins XEP-0096, XEP-0260, file: sendFile method is managed by file plugin, which choose the best available method + progress_id fix
Goffi <goffi@goffi.org>
parents: 1573
diff changeset
889 log.error(_(u"Trying to remove an unknow progress callback"))
1522
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
890
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
891 def _progressGet(self, progress_id, profile):
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
892 data = self.progressGet(progress_id, profile)
1598
b144babc2658 core, plugin file: fixed progress id + data is now returned by getProgress, instead of being an argument to fill
Goffi <goffi@goffi.org>
parents: 1595
diff changeset
893 return {k: unicode(v) for k,v in data.iteritems()}
0
goffi@necton2
parents:
diff changeset
894
1522
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
895 def progressGet(self, progress_id, profile):
0
goffi@necton2
parents:
diff changeset
896 """Return a dict with progress information
1522
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
897
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
898 @param progress_id(unicode): unique id of the progressing element
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
899 @param profile: %(doc_profile)s
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
900 @return (dict): data with the following keys:
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
901 'position' (int): current possition
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
902 'size' (int): end_position
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
903 if id doesn't exists (may be a finished progression), and empty dict is returned
0
goffi@necton2
parents:
diff changeset
904 """
538
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 536
diff changeset
905 client = self.getClient(profile)
0
goffi@necton2
parents:
diff changeset
906 try:
1626
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
907 data = client._progress_cb[progress_id][0](progress_id, profile)
0
goffi@necton2
parents:
diff changeset
908 except KeyError:
1598
b144babc2658 core, plugin file: fixed progress id + data is now returned by getProgress, instead of being an argument to fill
Goffi <goffi@goffi.org>
parents: 1595
diff changeset
909 data = {}
0
goffi@necton2
parents:
diff changeset
910 return data
goffi@necton2
parents:
diff changeset
911
1522
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
912 def _progressGetAll(self, profile_key):
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
913 progress_all = self.progressGetAll(profile_key)
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
914 for profile, progress_dict in progress_all.iteritems():
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
915 for progress_id, data in progress_dict.iteritems():
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
916 for key, value in data.iteritems():
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
917 data[key] = unicode(value)
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
918 return progress_all
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
919
1626
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
920 def progressGetAllMetadata(self, profile_key):
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
921 """Return all progress metadata at once
1522
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
922
1626
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
923 @param profile_key: %(doc_profile)s
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
924 if C.PROF_KEY_ALL is used, all progress metadata from all profiles are returned
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
925 @return (dict[dict[dict]]): a dict which map profile to progress_dict
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
926 progress_dict map progress_id to progress_data
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
927 progress_metadata is the same dict as sent by [progressStarted]
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
928 """
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
929 clients = self.getClients(profile_key)
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
930 progress_all = {}
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
931 for client in clients:
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
932 profile = client.profile
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
933 progress_dict = {}
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
934 progress_all[profile] = progress_dict
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
935 for progress_id, (dummy, progress_metadata) in client._progress_cb.iteritems():
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
936 progress_dict[progress_id] = progress_metadata
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
937 return progress_all
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
938
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
939 def progressGetAll(self, profile_key):
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
940 """Return all progress status at once
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
941
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
942 @param profile_key: %(doc_profile)s
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
943 if C.PROF_KEY_ALL is used, all progress status from all profiles are returned
1598
b144babc2658 core, plugin file: fixed progress id + data is now returned by getProgress, instead of being an argument to fill
Goffi <goffi@goffi.org>
parents: 1595
diff changeset
944 @return (dict[dict[dict]]): a dict which map profile to progress_dict
b144babc2658 core, plugin file: fixed progress id + data is now returned by getProgress, instead of being an argument to fill
Goffi <goffi@goffi.org>
parents: 1595
diff changeset
945 progress_dict map progress_id to progress_data
b144babc2658 core, plugin file: fixed progress id + data is now returned by getProgress, instead of being an argument to fill
Goffi <goffi@goffi.org>
parents: 1595
diff changeset
946 progress_data is the same dict as returned by [progressGet]
1522
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
947 """
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
948 clients = self.getClients(profile_key)
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
949 progress_all = {}
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
950 for client in clients:
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
951 profile = client.profile
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
952 progress_dict = {}
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
953 progress_all[profile] = progress_dict
1626
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
954 for progress_id, (progress_cb, dummy) in client._progress_cb.iteritems():
63cef4dbf2a4 core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents: 1624
diff changeset
955 progress_dict[progress_id] = progress_cb(progress_id, profile)
1522
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
956 return progress_all
7d7e57a84792 core: progression handling improvments:
Goffi <goffi@goffi.org>
parents: 1503
diff changeset
957
759
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
958 def registerCallback(self, callback, *args, **kwargs):
1603
2b82d846848e core: added callback_id in DataError message of launchCallback
Goffi <goffi@goffi.org>
parents: 1599
diff changeset
959 """Register a callback.
2b82d846848e core: added callback_id in DataError message of launchCallback
Goffi <goffi@goffi.org>
parents: 1599
diff changeset
960
759
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
961 Use with_data=True in kwargs if the callback use the optional data dict
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
962 use force_id=id to avoid generated id. Can lead to name conflict, avoid if possible
806
5d6c45d6ee1b core: added "one_shot" option to registered callback:
Goffi <goffi@goffi.org>
parents: 801
diff changeset
963 use one_shot=True to delete callback once it have been called
759
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
964 @param callback: any callable
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
965 @return: id of the registered callback
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
966 """
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
967 callback_id = kwargs.pop('force_id', None)
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
968 if callback_id is None:
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
969 callback_id = str(uuid4())
22
bb72c29f3432 added action cb mechanism for buttons. Tested with a temporary new user registration button.
Goffi <goffi@goffi.org>
parents: 18
diff changeset
970 else:
759
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
971 if callback_id in self._cb_map:
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
972 raise exceptions.ConflictError(_(u"id already registered"))
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
973 self._cb_map[callback_id] = (callback, args, kwargs)
806
5d6c45d6ee1b core: added "one_shot" option to registered callback:
Goffi <goffi@goffi.org>
parents: 801
diff changeset
974
5d6c45d6ee1b core: added "one_shot" option to registered callback:
Goffi <goffi@goffi.org>
parents: 801
diff changeset
975 if "one_shot" in kwargs: # One Shot callback are removed after 30 min
5d6c45d6ee1b core: added "one_shot" option to registered callback:
Goffi <goffi@goffi.org>
parents: 801
diff changeset
976 def purgeCallback():
5d6c45d6ee1b core: added "one_shot" option to registered callback:
Goffi <goffi@goffi.org>
parents: 801
diff changeset
977 try:
5d6c45d6ee1b core: added "one_shot" option to registered callback:
Goffi <goffi@goffi.org>
parents: 801
diff changeset
978 self.removeCallback(callback_id)
5d6c45d6ee1b core: added "one_shot" option to registered callback:
Goffi <goffi@goffi.org>
parents: 801
diff changeset
979 except KeyError:
5d6c45d6ee1b core: added "one_shot" option to registered callback:
Goffi <goffi@goffi.org>
parents: 801
diff changeset
980 pass
5d6c45d6ee1b core: added "one_shot" option to registered callback:
Goffi <goffi@goffi.org>
parents: 801
diff changeset
981 reactor.callLater(1800, purgeCallback)
5d6c45d6ee1b core: added "one_shot" option to registered callback:
Goffi <goffi@goffi.org>
parents: 801
diff changeset
982
759
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
983 return callback_id
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
984
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
985 def removeCallback(self, callback_id):
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
986 """ Remove a previously registered callback
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
987 @param callback_id: id returned by [registerCallback] """
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 991
diff changeset
988 log.debug("Removing callback [%s]" % callback_id)
759
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
989 del self._cb_map[callback_id]
22
bb72c29f3432 added action cb mechanism for buttons. Tested with a temporary new user registration button.
Goffi <goffi@goffi.org>
parents: 18
diff changeset
990
916
1a759096ccbd core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents: 914
diff changeset
991 def launchCallback(self, callback_id, data=None, profile_key=C.PROF_KEY_NONE):
759
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
992 """Launch a specific callback
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
993 @param callback_id: id of the action (callback) to launch
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
994 @param data: optional data
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
995 @profile_key: %(doc_profile_key)s
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
996 @return: a deferred which fire a dict where key can be:
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
997 - xmlui: a XMLUI need to be displayed
1262
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1234
diff changeset
998 - validated: if present, can be used to launch a callback, it can have the values
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1234
diff changeset
999 - C.BOOL_TRUE
f8a8434dbac7 core: improved roster management + misc:
Goffi <goffi@goffi.org>
parents: 1234
diff changeset
1000 - C.BOOL_FALSE
759
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
1001 """
1622
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
1002 try:
1624
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
1003 client = self.getClient(profile_key)
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
1004 except exceptions.NotFound:
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
1005 # client is not available yet
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
1006 profile = self.memory.getProfileName(profile_key)
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
1007 if not profile:
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
1008 raise exceptions.ProfileUnknownError(_('trying to launch action with a non-existant profile'))
1622
5b24d6bf5d15 core, bridge: actionsGet:
Goffi <goffi@goffi.org>
parents: 1603
diff changeset
1009 else:
1624
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
1010 profile = client.profile
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
1011 # we check if the action is kept, and remove it
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
1012 try:
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
1013 action_tuple = client.actions[callback_id]
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
1014 except KeyError:
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
1015 pass
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
1016 else:
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
1017 action_tuple[-1].cancel() # the last item is the action timer
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
1018 del client.actions[callback_id]
759
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
1019
22
bb72c29f3432 added action cb mechanism for buttons. Tested with a temporary new user registration button.
Goffi <goffi@goffi.org>
parents: 18
diff changeset
1020 try:
759
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
1021 callback, args, kwargs = self._cb_map[callback_id]
22
bb72c29f3432 added action cb mechanism for buttons. Tested with a temporary new user registration button.
Goffi <goffi@goffi.org>
parents: 18
diff changeset
1022 except KeyError:
1603
2b82d846848e core: added callback_id in DataError message of launchCallback
Goffi <goffi@goffi.org>
parents: 1599
diff changeset
1023 raise exceptions.DataError(u"Unknown callback id {}".format(callback_id))
759
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
1024
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
1025 if kwargs.get("with_data", False):
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
1026 if data is None:
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
1027 raise exceptions.DataError("Required data for this callback is missing")
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
1028 args,kwargs=list(args)[:],kwargs.copy() # we don't want to modify the original (kw)args
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
1029 args.insert(0, data)
1624
7e749e8eefd0 core: fixed launchAction:
Goffi <goffi@goffi.org>
parents: 1622
diff changeset
1030 kwargs["profile"] = profile
759
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
1031 del kwargs["with_data"]
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
1032
806
5d6c45d6ee1b core: added "one_shot" option to registered callback:
Goffi <goffi@goffi.org>
parents: 801
diff changeset
1033 if kwargs.pop('one_shot', False):
5d6c45d6ee1b core: added "one_shot" option to registered callback:
Goffi <goffi@goffi.org>
parents: 801
diff changeset
1034 self.removeCallback(callback_id)
5d6c45d6ee1b core: added "one_shot" option to registered callback:
Goffi <goffi@goffi.org>
parents: 801
diff changeset
1035
759
93bd868b8fb6 backend, frontends: callbacks refactoring:
Goffi <goffi@goffi.org>
parents: 755
diff changeset
1036 return defer.maybeDeferred(callback, *args, **kwargs)
0
goffi@necton2
parents:
diff changeset
1037
101
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents: 90
diff changeset
1038 #Menus management
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents: 90
diff changeset
1039
1092
0eefc74c346b core (menus): constants are used for menu types
Goffi <goffi@goffi.org>
parents: 1089
diff changeset
1040 def importMenu(self, path, callback, security_limit=C.NO_SECURITY_LIMIT, help_string="", type_=C.MENU_GLOBAL):
101
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents: 90
diff changeset
1041 """register a new menu for frontends
773
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1042 @param path: path to go to the menu (category/subcategory/.../item), must be an iterable (e.g.: ("File", "Open"))
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1043 /!\ use D_() instead of _() for translations (e.g. (D_("File"), D_("Open")))
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1044 @param callback: method to be called when menuitem is selected, callable or a callback id (string) as returned by [registerCallback]
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1045 @param security_limit: %(doc_security_limit)s
809
743b757777d3 core: security limit in menus
Goffi <goffi@goffi.org>
parents: 807
diff changeset
1046 /!\ security_limit MUST be added to data in launchCallback if used #TODO
773
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1047 @param help_string: string used to indicate what the menu do (can be show as a tooltip).
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1048 /!\ use D_() instead of _() for translations
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1049 @param type: one of:
1092
0eefc74c346b core (menus): constants are used for menu types
Goffi <goffi@goffi.org>
parents: 1089
diff changeset
1050 - C.MENU_GLOBAL: classical menu, can be shown in a menubar on top (e.g. something like File/Open)
0eefc74c346b core (menus): constants are used for menu types
Goffi <goffi@goffi.org>
parents: 1089
diff changeset
1051 - C.MENU_ROOM: like a global menu, but only shown in multi-user chat
0eefc74c346b core (menus): constants are used for menu types
Goffi <goffi@goffi.org>
parents: 1089
diff changeset
1052 menu_data must contain a "room_jid" data
0eefc74c346b core (menus): constants are used for menu types
Goffi <goffi@goffi.org>
parents: 1089
diff changeset
1053 - C.MENU_SINGLE: like a global menu, but only shown in one2one chat
0eefc74c346b core (menus): constants are used for menu types
Goffi <goffi@goffi.org>
parents: 1089
diff changeset
1054 menu_data must contain a "jid" data
0eefc74c346b core (menus): constants are used for menu types
Goffi <goffi@goffi.org>
parents: 1089
diff changeset
1055 - C.MENU_JID_CONTEXT: contextual menu, used with any jid (e.g.: ad hoc commands, jid is already filled)
0eefc74c346b core (menus): constants are used for menu types
Goffi <goffi@goffi.org>
parents: 1089
diff changeset
1056 menu_data must contain a "jid" data
0eefc74c346b core (menus): constants are used for menu types
Goffi <goffi@goffi.org>
parents: 1089
diff changeset
1057 - C.MENU_ROSTER_JID_CONTEXT: like JID_CONTEXT, but restricted to jids in roster.
0eefc74c346b core (menus): constants are used for menu types
Goffi <goffi@goffi.org>
parents: 1089
diff changeset
1058 menu_data must contain a "room_jid" data
0eefc74c346b core (menus): constants are used for menu types
Goffi <goffi@goffi.org>
parents: 1089
diff changeset
1059 - C.MENU_ROSTER_GROUP_CONTEXT: contextual menu, used with group (e.g.: publish microblog, group is already filled)
0eefc74c346b core (menus): constants are used for menu types
Goffi <goffi@goffi.org>
parents: 1089
diff changeset
1060 menu_data must contain a "group" data
773
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1061 @return: menu_id (same as callback_id)
755
e3ad48a2aab2 core, frontends: callMenu is now async and don't use callback_id anymore
Goffi <goffi@goffi.org>
parents: 752
diff changeset
1062 """
773
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1063
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1064 if callable(callback):
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1065 callback_id = self.registerCallback(callback, with_data=True)
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1066 elif isinstance(callback, basestring):
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1067 # The callback is already registered
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1068 callback_id = callback
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1069 try:
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1070 callback, args, kwargs = self._cb_map[callback_id]
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1071 except KeyError:
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1072 raise exceptions.DataError("Unknown callback id")
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1073 kwargs["with_data"] = True # we have to be sure that we use extra data
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1074 else:
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1075 raise exceptions.DataError("Unknown callback type")
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1076
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1077 for menu_data in self._menus.itervalues():
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1078 if menu_data['path'] == path and menu_data['type'] == type_:
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1079 raise exceptions.ConflictError(_("A menu with the same path and type already exists"))
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1080
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1081 menu_data = {'path': path,
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1082 'security_limit': security_limit,
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1083 'help_string': help_string,
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1084 'type': type_
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1085 }
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1086
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1087 self._menus[callback_id] = menu_data
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1088
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1089 return callback_id
101
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents: 90
diff changeset
1090
914
1a3ba959f0ab core (memory): moved Params in its own module + introduced a new core/constants module, and moved some constants there
Goffi <goffi@goffi.org>
parents: 909
diff changeset
1091 def getMenus(self, language='', security_limit=C.NO_SECURITY_LIMIT):
773
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1092 """Return all menus registered
1365
ba87b940f07a core, quick_frontends: added an "extra" item in getMenus + use of new quick_menus module in QuickApp
Goffi <goffi@goffi.org>
parents: 1355
diff changeset
1093
773
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1094 @param language: language used for translation, or empty string for default
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1095 @param security_limit: %(doc_security_limit)s
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1096 @return: array of tuple with:
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1097 - menu id (same as callback_id)
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1098 - menu type
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1099 - raw menu path (array of strings)
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1100 - translated menu path
1365
ba87b940f07a core, quick_frontends: added an "extra" item in getMenus + use of new quick_menus module in QuickApp
Goffi <goffi@goffi.org>
parents: 1355
diff changeset
1101 - extra (dict(unicode, unicode)): extra data where key can be:
ba87b940f07a core, quick_frontends: added an "extra" item in getMenus + use of new quick_menus module in QuickApp
Goffi <goffi@goffi.org>
parents: 1355
diff changeset
1102 - icon: name of the icon to use (TODO)
ba87b940f07a core, quick_frontends: added an "extra" item in getMenus + use of new quick_menus module in QuickApp
Goffi <goffi@goffi.org>
parents: 1355
diff changeset
1103 - help_url: link to a page with more complete documentation (TODO)
773
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1104 """
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1105 ret = []
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1106 for menu_id, menu_data in self._menus.iteritems():
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1107 type_ = menu_data['type']
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1108 path = menu_data['path']
809
743b757777d3 core: security limit in menus
Goffi <goffi@goffi.org>
parents: 807
diff changeset
1109 menu_security_limit = menu_data['security_limit']
914
1a3ba959f0ab core (memory): moved Params in its own module + introduced a new core/constants module, and moved some constants there
Goffi <goffi@goffi.org>
parents: 909
diff changeset
1110 if security_limit!=C.NO_SECURITY_LIMIT and (menu_security_limit==C.NO_SECURITY_LIMIT or menu_security_limit>security_limit):
809
743b757777d3 core: security limit in menus
Goffi <goffi@goffi.org>
parents: 807
diff changeset
1111 continue
773
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1112 languageSwitch(language)
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1113 path_i18n = [_(elt) for elt in path]
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1114 languageSwitch()
1365
ba87b940f07a core, quick_frontends: added an "extra" item in getMenus + use of new quick_menus module in QuickApp
Goffi <goffi@goffi.org>
parents: 1355
diff changeset
1115 extra = {} # TODO: manage extra data like icon
ba87b940f07a core, quick_frontends: added an "extra" item in getMenus + use of new quick_menus module in QuickApp
Goffi <goffi@goffi.org>
parents: 1355
diff changeset
1116 ret.append((menu_id, type_, path, path_i18n, extra))
773
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1117
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1118 return ret
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1119
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1120 def getMenuHelp(self, menu_id, language=''):
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1121 """
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1122 return the help string of the menu
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1123 @param menu_id: id of the menu (same as callback_id)
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1124 @param language: language used for translation, or empty string for default
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1125 @param return: translated help
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1126
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1127 """
101
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents: 90
diff changeset
1128 try:
773
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1129 menu_data = self._menus[menu_id]
101
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents: 90
diff changeset
1130 except KeyError:
755
e3ad48a2aab2 core, frontends: callMenu is now async and don't use callback_id anymore
Goffi <goffi@goffi.org>
parents: 752
diff changeset
1131 raise exceptions.DataError("Trying to access an unknown menu")
773
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1132 languageSwitch(language)
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1133 help_string = _(menu_data['help_string'])
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1134 languageSwitch()
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
1135 return help_string