annotate frontends/src/jp/base.py @ 853:c2f6ada7858f

core (sqlite): automatic database update: - new Updater class check database consistency (by calculating a hash on the .schema), and updates base if necessary - database now has a version (1 for current, 0 will be for 0.3's database), for each change this version will be increased - creation statements and update statements are in the form of dict of dict with tuples. There is a help text at the top of the module to explain how it works - if we are on a development version, the updater try to update the database automaticaly (without deleting table or columns). The Updater.generateUpdateData method can be used to ease the creation of update data (i.e. the dictionary at the top, see the one for the key 1 for an example). - if there is an inconsistency, an exception is raised, and a message indicate the SQL statements that should fix the situation. - well... this is rather complicated, a KISS method would maybe have been better. The future will say if we need to simplify it :-/ - new DatabaseError exception
author Goffi <goffi@goffi.org>
date Sun, 23 Feb 2014 23:30:32 +0100
parents 300b4de701a6
children 241f6baa6687
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
goffi@necton2
parents:
diff changeset
1 #! /usr/bin/python
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: 601
diff changeset
4 # jp: a SAT command line tool
811
1fe00f0c9a91 dates update
Goffi <goffi@goffi.org>
parents: 776
diff changeset
5 # Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 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: 601
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: 601
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: 601
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: 601
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: 601
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: 601
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: 601
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: 601
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: 601
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: 601
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
0
goffi@necton2
parents:
diff changeset
19
771
bfabeedbf32e core: i18n refactoring:
Goffi <goffi@goffi.org>
parents: 721
diff changeset
20 from sat.core.i18n import _
402
f03688bdb858 jp: use with statement to open fifo
Goffi <goffi@goffi.org>
parents: 401
diff changeset
21
0
goffi@necton2
parents:
diff changeset
22 global pbar_available
goffi@necton2
parents:
diff changeset
23 pbar_available = True #checked before using ProgressBar
goffi@necton2
parents:
diff changeset
24
goffi@necton2
parents:
diff changeset
25 ### logging ###
goffi@necton2
parents:
diff changeset
26 import logging
goffi@necton2
parents:
diff changeset
27 from logging import debug, info, error, warning
goffi@necton2
parents:
diff changeset
28 logging.basicConfig(level=logging.DEBUG,
goffi@necton2
parents:
diff changeset
29 format='%(message)s')
goffi@necton2
parents:
diff changeset
30 ###
goffi@necton2
parents:
diff changeset
31
goffi@necton2
parents:
diff changeset
32 import sys
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
33 import locale
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
34 import os.path
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
35 import argparse
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
36 import gobject
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
37 from glob import iglob
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
38 from importlib import import_module
236
7cf093e138b6 jp: fixed bad sat.tools.jid import
Goffi <goffi@goffi.org>
parents: 228
diff changeset
39 from sat.tools.jid import JID
627
d207c2186519 core, bridge, jp, quick_frontend: SàT stop more gracefully if bridge can't be initialised:
Goffi <goffi@goffi.org>
parents: 613
diff changeset
40 from sat_frontends.bridge.DBus import DBusBridgeFrontend
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
41 from sat.core import exceptions
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
42 import sat_frontends.jp
0
goffi@necton2
parents:
diff changeset
43 try:
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
44 import progressbar
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
45 except ImportError:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
46 info (_('ProgressBar not available, please download it at http://pypi.python.org/pypi/progressbar'))
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
47 info (_('Progress bar deactivated\n--\n'))
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
48 progressbar=None
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
49
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
50 #consts
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
51 prog_name = u"jp"
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
52 description = """This software is a command line tool for XMPP.
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
53 Get the latest version at http://sat.goffi.org"""
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
54
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
55 copyleft = u"""Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 Jérôme Poisson (aka Goffi)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
56 This program comes with ABSOLUTELY NO WARRANTY;
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
57 This is free software, and you are welcome to redistribute it under certain conditions.
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
58 """
0
goffi@necton2
parents:
diff changeset
59
goffi@necton2
parents:
diff changeset
60
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
61 def unicode_decoder(arg):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
62 # Needed to have unicode strings from arguments
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
63 return arg.decode(locale.getpreferredencoding())
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
64
0
goffi@necton2
parents:
diff changeset
65
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
66 class Jp(object):
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
67 """
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
68 This class can be use to establish a connection with the
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
69 bridge. Moreover, it should manage a main loop.
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
70
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
71 To use it, you mainly have to redefine the method run to perform
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
72 specify what kind of operation you want to perform.
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
73
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
74 """
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
75 def __init__(self):
165
8a2053de6f8c Frontends: management of unlaunched SàT Backend (information message and exit)
Goffi <goffi@goffi.org>
parents: 156
diff changeset
76 try:
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
77 self.bridge = DBusBridgeFrontend()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
78 except exceptions.BridgeExceptionNoService:
165
8a2053de6f8c Frontends: management of unlaunched SàT Backend (information message and exit)
Goffi <goffi@goffi.org>
parents: 156
diff changeset
79 print(_(u"Can't connect to SàT backend, are you sure it's launched ?"))
627
d207c2186519 core, bridge, jp, quick_frontend: SàT stop more gracefully if bridge can't be initialised:
Goffi <goffi@goffi.org>
parents: 613
diff changeset
80 sys.exit(1)
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
81 except excpetions.BridgeInitError:
627
d207c2186519 core, bridge, jp, quick_frontend: SàT stop more gracefully if bridge can't be initialised:
Goffi <goffi@goffi.org>
parents: 613
diff changeset
82 print(_(u"Can't init bridge"))
165
8a2053de6f8c Frontends: management of unlaunched SàT Backend (information message and exit)
Goffi <goffi@goffi.org>
parents: 156
diff changeset
83 sys.exit(1)
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
84
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
85 self.parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter,
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
86 description=description)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
87
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
88 self._make_parents()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
89 self.add_parser_options()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
90 self.subparsers = self.parser.add_subparsers(title=_('Available commands'), dest='subparser_name')
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
91 self._auto_loop = False # when loop is used for internal reasons
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
92 self.need_loop = False # to set by commands when loop is needed
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
93 self._progress_id = None # TODO: manage several progress ids
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
94 self.quit_on_progress_end = True # set to False if you manage yourself exiting, or if you want the user to stop by himself
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
95
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
96 @property
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
97 def version(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
98 return self.bridge.getVersion()
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
99
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
100 @property
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
101 def progress_id(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
102 return self._progress_id
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
103
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
104 @progress_id.setter
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
105 def progress_id(self, value):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
106 self._progress_id = value
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
107
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
108 def _make_parents(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
109 self.parents = {}
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
110
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
111 profile_parent = self.parents['profile'] = argparse.ArgumentParser(add_help=False)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
112 profile_parent.add_argument("-p", "--profile", action="store", type=str, default='@DEFAULT@', help=_("Use PROFILE profile key (default: %(default)s)"))
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
113 profile_parent.add_argument("-c", "--connect", action="store_true", help=_("Connect the profile before doing anything else"))
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
114
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
115 progress_parent = self.parents['progress'] = argparse.ArgumentParser(add_help=False)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
116 if progressbar:
823
300b4de701a6 jp: short option for progress is now -P instead of -g, so -g can be used for groups
Goffi <goffi@goffi.org>
parents: 817
diff changeset
117 progress_parent.add_argument("-P", "--progress", action="store_true", help=_("Show progress bar"))
0
goffi@necton2
parents:
diff changeset
118
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
119 def add_parser_options(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
120 self.parser.add_argument('--version', action='version', version=("%(name)s %(version)s %(copyleft)s" % {'name': prog_name, 'version': self.version, 'copyleft': copyleft}))
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
121
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
122 def import_commands(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
123 """ Automaticaly import commands to jp
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
124 looks from modules names cmd_*.py in jp path and import them
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
125
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
126 """
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
127 path = os.path.dirname(sat_frontends.jp.__file__)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
128 modules = (os.path.splitext(module)[0] for module in map(os.path.basename, iglob(os.path.join(path, "cmd_*.py"))))
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
129 for module_name in modules:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
130 module = import_module("sat_frontends.jp."+module_name)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
131 try:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
132 self.import_command_module(module)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
133 except ImportError:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
134 continue
0
goffi@necton2
parents:
diff changeset
135
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
136 def import_command_module(self, module):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
137 """ Add commands from a module to jp
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
138 @param module: module containing commands
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
139
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
140 """
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
141 try:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
142 for classname in module.__commands__:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
143 cls = getattr(module, classname)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
144 except AttributeError:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
145 warning(_("Invalid module %s") % module)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
146 raise ImportError
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
147 cls(self)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
148
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
149
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
150 def run(self, args=None):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
151 self.args = self.parser.parse_args(args)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
152 self.args.func()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
153 if self.need_loop or self._auto_loop:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
154 self._start_loop()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
155
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
156 def _start_loop(self):
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
157 self.loop = gobject.MainLoop()
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
158 try:
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
159 self.loop.run()
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
160 except KeyboardInterrupt:
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
161 info(_("User interruption: good bye"))
0
goffi@necton2
parents:
diff changeset
162
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
163 def stop_loop(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
164 try:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
165 self.loop.quit()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
166 except AttributeError:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
167 pass
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
168
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
169 def quit(self, errcode=0):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
170 self.stop_loop()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
171 if errcode:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
172 sys.exit(errcode)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
173
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
174 def check_jids(self, jids):
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
175 """Check jids validity, transform roster name to corresponding jids
110
cb904fa7de3c jp: profile management (new option: --profile)
Goffi <goffi@goffi.org>
parents: 70
diff changeset
176
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
177 @param profile: profile name
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
178 @param jids: list of jids
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
179 @return: List of jids
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
180
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
181 """
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
182 names2jid = {}
493
b7c4bb2c0668 jp: - better expandJid: roster's jids' nodes are used after names to expand jid
Goffi <goffi@goffi.org>
parents: 480
diff changeset
183 nodes2jid = {}
393
393b35aa86d2 jp: added --connect option
Goffi <goffi@goffi.org>
parents: 391
diff changeset
184
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
185 for contact in self.bridge.getContacts(self.profile):
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
186 _jid, attr, groups = contact
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
187 if attr.has_key("name"):
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
188 names2jid[attr["name"].lower()] = _jid
493
b7c4bb2c0668 jp: - better expandJid: roster's jids' nodes are used after names to expand jid
Goffi <goffi@goffi.org>
parents: 480
diff changeset
189 nodes2jid[JID(_jid).node.lower()] = _jid
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
190
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
191 def expand_jid(jid):
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
192 _jid = jid.lower()
493
b7c4bb2c0668 jp: - better expandJid: roster's jids' nodes are used after names to expand jid
Goffi <goffi@goffi.org>
parents: 480
diff changeset
193 if _jid in names2jid:
b7c4bb2c0668 jp: - better expandJid: roster's jids' nodes are used after names to expand jid
Goffi <goffi@goffi.org>
parents: 480
diff changeset
194 expanded = names2jid[_jid]
b7c4bb2c0668 jp: - better expandJid: roster's jids' nodes are used after names to expand jid
Goffi <goffi@goffi.org>
parents: 480
diff changeset
195 elif _jid in nodes2jid:
b7c4bb2c0668 jp: - better expandJid: roster's jids' nodes are used after names to expand jid
Goffi <goffi@goffi.org>
parents: 480
diff changeset
196 expanded = nodes2jid[_jid]
b7c4bb2c0668 jp: - better expandJid: roster's jids' nodes are used after names to expand jid
Goffi <goffi@goffi.org>
parents: 480
diff changeset
197 else:
b7c4bb2c0668 jp: - better expandJid: roster's jids' nodes are used after names to expand jid
Goffi <goffi@goffi.org>
parents: 480
diff changeset
198 expanded = jid
b7c4bb2c0668 jp: - better expandJid: roster's jids' nodes are used after names to expand jid
Goffi <goffi@goffi.org>
parents: 480
diff changeset
199 return unicode(expanded)
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
200
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
201 def check(jid):
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
202 if not jid.is_valid:
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
203 error (_("%s is not a valid JID !"), jid)
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
204 self.quit(1)
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
205
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
206 dest_jids=[]
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
207 try:
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
208 for i in range(len(jids)):
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
209 dest_jids.append(expand_jid(jids[i]))
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
210 check(dest_jids[i])
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
211 except AttributeError:
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
212 pass
0
goffi@necton2
parents:
diff changeset
213
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
214 return dest_jids
0
goffi@necton2
parents:
diff changeset
215
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
216 def connect_profile(self, callback):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
217 """ Check if the profile is connected
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
218 @param callback: method to call when profile is connected
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
219 @exit: - 1 when profile is not connected and --connect is not set
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
220 - 1 when the profile doesn't exists
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
221 - 1 when there is a connection error
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
222 """
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
223 # FIXME: need better exit codes
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
224
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
225 def cant_connect():
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
226 error(_(u"Can't connect profile"))
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
227 self.quit(1)
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
228
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
229 self.profile = self.bridge.getProfileName(self.args.profile)
0
goffi@necton2
parents:
diff changeset
230
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
231 if not self.profile:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
232 error(_("The profile [%s] doesn't exist") % self.args.profile)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
233 self.quit(1)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
234
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
235 if self.args.connect: #if connection is asked, we connect the profile
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
236 self.bridge.asyncConnect(self.profile, callback, cant_connect)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
237 self._auto_loop = True
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
238 return
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
239
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
240 elif not self.bridge.isConnected(self.profile):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
241 error(_(u"Profile [%(profile)s] is not connected, please connect it before using jp, or use --connect option") % { "profile": self.profile })
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
242 self.quit(1)
0
goffi@necton2
parents:
diff changeset
243
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
244 callback()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
245
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
246 def get_full_jid(self, param_jid):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
247 """Return the full jid if possible (add last resource when find a bare jid)"""
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
248 _jid = JID(param_jid)
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
249 if not _jid.resource:
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
250 #if the resource is not given, we try to add the last known resource
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
251 last_resource = self.bridge.getLastResource(param_jid, self.profile)
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
252 if last_resource:
688
f7878ad3c846 tools: renamed tools.jid.JID attribute "short" to "bare"
souliane <souliane@mailoo.org>
parents: 657
diff changeset
253 return "%s/%s" % (_jid.bare, last_resource)
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
254 return param_jid
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
255
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
256 def watch_progress(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
257 self.pbar = None
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
258 gobject.timeout_add(10, self._progress_cb)
0
goffi@necton2
parents:
diff changeset
259
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
260 def _progress_cb(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
261 if self.progress_id:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
262 data = self.bridge.getProgress(self.progress_id, self.profile)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
263 if data:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
264 if not data['position']:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
265 data['position'] = '0'
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
266 if not self.pbar:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
267 #first answer, we must construct the bar
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
268 self.pbar = progressbar.ProgressBar(int(data['size']),
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
269 [_("Progress: "),progressbar.Percentage(),
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
270 " ",
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
271 progressbar.Bar(),
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
272 " ",
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
273 progressbar.FileTransferSpeed(),
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
274 " ",
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
275 progressbar.ETA()])
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
276 self.pbar.start()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
277
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
278 self.pbar.update(int(data['position']))
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
279
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
280 elif self.pbar:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
281 self.pbar.finish()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
282 if self.quit_on_progress_end:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
283 self.quit()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
284 return False
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
285
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
286 return True
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
287
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
288
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
289 class CommandBase(object):
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
290
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
291 def __init__(self, host, name, use_profile=True, use_progress=False, help=None, **kwargs):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
292 """ Initialise CommandBase
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
293 @param host: Jp instance
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
294 @param name: name of the new command
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
295 @param use_profile: if True, add profile selection/connection commands
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
296 @param use_progress: if True, add progress bar activation commands
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
297 @param help: help message to display
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
298 @param **kwargs: args passed to ArgumentParser
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
299
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
300 """
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
301 try: # If we have subcommands, host is a CommandBase and we need to use host.host
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
302 self.host = host.host
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
303 except AttributeError:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
304 self.host = host
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
305
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
306 parents = kwargs.setdefault('parents', set())
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
307 if use_profile:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
308 #self.host.parents['profile'] is an ArgumentParser with profile connection arguments
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
309 parents.add(self.host.parents['profile'])
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
310 if use_progress:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
311 parents.add(self.host.parents['progress'])
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
312
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
313 self.parser = host.subparsers.add_parser(name, help=help, **kwargs)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
314 if hasattr(self, "subcommands"):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
315 self.subparsers = self.parser.add_subparsers()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
316 else:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
317 self.parser.set_defaults(func=self.run)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
318 self.add_parser_options()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
319
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
320 @property
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
321 def args(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
322 return self.host.args
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
323
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
324 @property
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
325 def need_loop(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
326 return self.host.need_loop
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
327
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
328 @need_loop.setter
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
329 def need_loop(self, value):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
330 self.host.need_loop = value
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
331
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
332 @property
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
333 def profile(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
334 return self.host.profile
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
335
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
336 @property
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
337 def progress_id(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
338 return self.host.progress_id
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
339
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
340 @progress_id.setter
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
341 def progress_id(self, value):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
342 self.host.progress_id = value
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
343
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
344 def add_parser_options(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
345 try:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
346 subcommands = self.subcommands
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
347 except AttributeError:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
348 # We don't have subcommands, the class need to implements add_parser_options
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
349 raise NotImplementedError
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
350
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
351 # now we add subcommands to ourself
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
352 for cls in subcommands:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
353 cls(self)
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
354
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
355 def run(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
356 try:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
357 if self.args.profile:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
358 self.host.connect_profile(self.connected)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
359 except AttributeError:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
360 # the command doesn't need to connect profile
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
361 pass
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
362 try:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
363 if self.args.progress:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
364 self.host.watch_progress()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
365 except AttributeError:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
366 # the command doesn't use progress bar
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
367 pass
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
368
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
369 def connected(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
370 if not self.need_loop:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
371 self.host.stop_loop()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
372
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
373
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
374 class CommandAnswering(CommandBase):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
375 #FIXME: temp, will be refactored when progress_bar/confirmations will be refactored
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
376
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
377 def _ask_confirmation(self, confirm_id, confirm_type, data, profile):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
378 """ Callback used for file transfer, accept files depending on parameters"""
538
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 493
diff changeset
379 if profile != self.profile:
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 493
diff changeset
380 debug("Ask confirmation ignored: not our profile")
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 493
diff changeset
381 return
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
382 if confirm_type == self.confirm_type:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
383 if self.dest_jids and not JID(data['from']).bare in [JID(_jid).bare for _jid in self.dest_jids()]:
0
goffi@necton2
parents:
diff changeset
384 return #file is not sent by a filtered jid
goffi@necton2
parents:
diff changeset
385 else:
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
386 self.ask(data, confirm_id)
0
goffi@necton2
parents:
diff changeset
387
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
388 def ask(self):
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
389 """
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
390 The return value is used to answer to the bridge.
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
391 @return: bool or dict
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
392 """
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
393 raise NotImplementedError
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
394
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
395 def connected(self):
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
396 """Auto reply to confirmations requests"""
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
397 self.need_loop = True
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
398 super(CommandAnswering, self).connected()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
399 # we watch confirmation signals
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
400 self.host.bridge.register("ask_confirmation", self._ask_confirmation)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
401
542
3eeb6c865e4d frontends: incoming files transfer management:
Goffi <goffi@goffi.org>
parents: 538
diff changeset
402 #and we ask those we have missed
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
403 for confirm_id, confirm_type, data in self.host.bridge.getWaitingConf(self.profile):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
404 self._ask_confirmation(confirm_id, confirm_type, data, self.profile)