annotate frontends/src/jp/base.py @ 1606:de785fcf9a7b

jp (base, file): file command and progress fixes and adaptation to new API: - progress use new API, and signals to monitor progression and avoid use of progressGet before progress is actually started - progress behaviour on event is managed by callbacks which are Jp attributes - progress with unknown or 0 size don't show the progress bar - better handling of errors - CommandAnswering is update to manage actions instead of the deprecated askConfirmation - managed actions use callback easy to associate with an action type. - file command is updated to manage these changes and the recent changes in backend behaviour - verbosity is used to display more or less message when sending/receiving a file - destination path can be specified in file receive - file receive doesn't stop yet, still need some work in the backend
author Goffi <goffi@goffi.org>
date Sun, 15 Nov 2015 23:42:21 +0100
parents 0aded9648c5c
children ec48b35309dc
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
1396
069ad98b360d 2015 copyright dates update
Goffi <goffi@goffi.org>
parents: 1395
diff changeset
5 # Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015 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 ### logging ###
1605
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
23 import logging as log
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
24 log.basicConfig(level=log.DEBUG,
0
goffi@necton2
parents:
diff changeset
25 format='%(message)s')
goffi@necton2
parents:
diff changeset
26 ###
goffi@necton2
parents:
diff changeset
27
goffi@necton2
parents:
diff changeset
28 import sys
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
29 import locale
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
30 import os.path
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
31 import argparse
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
32 from gi.repository import GLib
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
33 from glob import iglob
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
34 from importlib import import_module
1139
75025461141f move sat.tools.jid to sat_frontends.tools.jid
souliane <souliane@mailoo.org>
parents: 1033
diff changeset
35 from sat_frontends.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
36 from sat_frontends.bridge.DBus import DBusBridgeFrontend
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
37 from sat.core import exceptions
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
38 import sat_frontends.jp
970
2e052998c7eb jp: using C.APP_URL for application url
Goffi <goffi@goffi.org>
parents: 965
diff changeset
39 from sat_frontends.jp.constants import Const as C
0
goffi@necton2
parents:
diff changeset
40 try:
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
41 import progressbar
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
42 except ImportError:
1605
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
43 log.info (_('ProgressBar not available, please download it at http://pypi.python.org/pypi/progressbar'))
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
44 log.info (_('Progress bar deactivated\n--\n'))
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
45 progressbar=None
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
46
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
47 #consts
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
48 PROG_NAME = u"jp"
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
49 DESCRIPTION = """This software is a command line tool for XMPP.
970
2e052998c7eb jp: using C.APP_URL for application url
Goffi <goffi@goffi.org>
parents: 965
diff changeset
50 Get the latest version at """ + C.APP_URL
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
51
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
52 COPYLEFT = u"""Copyright (C) 2009-2015 Jérôme Poisson, Adrien Cossa
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
53 This program comes with ABSOLUTELY NO WARRANTY;
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
54 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
55 """
0
goffi@necton2
parents:
diff changeset
56
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
57 PROGRESS_DELAY = 10 # the progression will be checked every PROGRESS_DELAY ms
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
58
0
goffi@necton2
parents:
diff changeset
59
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
60 def unicode_decoder(arg):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
61 # Needed to have unicode strings from arguments
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
62 return arg.decode(locale.getpreferredencoding())
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
63
0
goffi@necton2
parents:
diff changeset
64
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
65 class Jp(object):
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
66 """
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
67 This class can be use to establish a connection with the
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
68 bridge. Moreover, it should manage a main loop.
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
69
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
70 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
71 specify what kind of operation you want to perform.
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
72
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
73 """
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
74 def __init__(self):
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
75 """
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
76
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
77 @attribute need_loop(bool): to set by commands when loop is needed
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
78 @attribute quit_on_progress_end (bool): set to False if you manage yourself exiting,
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
79 or if you want the user to stop by himself
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
80 @attribute progress_success(callable): method to call when progress just started
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
81 by default display a message
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
82 @attribute progress_success(callable): method to call when progress is successfully finished
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
83 by default display a message
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
84 @attribute progress_failure(callable): method to call when progress failed
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
85 by default display a message
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
86 """
165
8a2053de6f8c Frontends: management of unlaunched SàT Backend (information message and exit)
Goffi <goffi@goffi.org>
parents: 156
diff changeset
87 try:
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
88 self.bridge = DBusBridgeFrontend()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
89 except exceptions.BridgeExceptionNoService:
165
8a2053de6f8c Frontends: management of unlaunched SàT Backend (information message and exit)
Goffi <goffi@goffi.org>
parents: 156
diff changeset
90 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
91 sys.exit(1)
864
241f6baa6687 frontends: fix typos, do not use logging in the xmlui tools:
souliane <souliane@mailoo.org>
parents: 823
diff changeset
92 except exceptions.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
93 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
94 sys.exit(1)
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
95
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
96 self.parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter,
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
97 description=DESCRIPTION)
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
98
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
99 self._make_parents()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
100 self.add_parser_options()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
101 self.subparsers = self.parser.add_subparsers(title=_('Available commands'), dest='subparser_name')
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
102 self._auto_loop = False # when loop is used for internal reasons
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
103 self.need_loop = False # to set by commands when loop is needed
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
104
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
105 # progress attributes
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
106 self._progress_id = None # TODO: manage several progress ids
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
107 self.quit_on_progress_end = True
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
108 self.progress_started = lambda dummy: self.disp(_(u"Operation started"), 2)
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
109 self.progress_success = lambda dummy: self.disp(_(u"Operation successfully finished"), 2)
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
110 self.progress_failure = lambda dummy: self.disp(_(u"Error while doing operation"), error=True)
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
111
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
112 @property
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
113 def version(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
114 return self.bridge.getVersion()
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
115
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
116 @property
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
117 def progress_id(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
118 return self._progress_id
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
119
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
120 @progress_id.setter
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
121 def progress_id(self, value):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
122 self._progress_id = value
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
123
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
124 @property
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
125 def watch_progress(self):
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
126 try:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
127 self.pbar
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
128 except AttributeError:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
129 return False
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
130 else:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
131 return True
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
132
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
133 @watch_progress.setter
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
134 def watch_progress(self, watch_progress):
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
135 if watch_progress:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
136 self.pbar = None
1604
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
137
1605
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
138 @property
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
139 def verbosity(self):
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
140 try:
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
141 return self.args.verbose
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
142 except AttributeError:
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
143 return 0
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
144
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
145 def disp(self, msg, verbosity=0, error=False):
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
146 """Print a message to user
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
147
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
148 @param msg(unicode): message to print
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
149 @param verbosity(int): minimal verbosity to display the message
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
150 @param error(bool): if True, print to stderr instead of stdout
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
151 """
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
152 if self.verbosity >= verbosity:
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
153 if error:
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
154 print >>sys.stderr,msg
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
155 else:
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
156 print msg
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
157
1604
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
158 def addOnQuitCallback(self, callback, *args, **kwargs):
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
159 """Add a callback which will be called on quit command
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
160
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
161 @param callback(callback): method to call
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
162 """
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
163 try:
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
164 callbacks_list = self._onQuitCallbacks
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
165 except AttributeError:
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
166 callbacks_list = self._onQuitCallbacks = []
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
167 finally:
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
168 callbacks_list.append((callback, args, kwargs))
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
169
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
170 def _make_parents(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
171 self.parents = {}
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
172
1594
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
173 # we have a special case here as the start-session option is present only if connection is not needed,
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
174 # so we create two similar parents, one with the option, the other one without it
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
175 for parent_name in ('profile', 'profile_session'):
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
176 parent = self.parents[parent_name] = argparse.ArgumentParser(add_help=False)
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
177 parent.add_argument("-p", "--profile", action="store", type=str, default='@DEFAULT@', help=_("Use PROFILE profile key (default: %(default)s)"))
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
178 parent.add_argument("--pwd", action="store", type=unicode, default='', metavar='PASSWORD', help=_("Password used to connect profile, if necessary"))
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
179
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
180 profile_parent, profile_session_parent = self.parents['profile'], self.parents['profile_session']
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
181
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
182 connect_short, connect_long, connect_action, connect_help = "-c", "--connect", "store_true", _(u"Connect the profile before doing anything else")
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
183 profile_parent.add_argument(connect_short, connect_long, action=connect_action, help=connect_help)
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
184
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
185 profile_session_connect_group = profile_session_parent.add_mutually_exclusive_group()
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
186 profile_session_connect_group.add_argument(connect_short, connect_long, action=connect_action, help=connect_help)
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
187 profile_session_connect_group.add_argument("--start-session", action="store_true", help=_("Start a profile session without connecting"))
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
188
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
189 progress_parent = self.parents['progress'] = argparse.ArgumentParser(add_help=False)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
190 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
191 progress_parent.add_argument("-P", "--progress", action="store_true", help=_("Show progress bar"))
0
goffi@necton2
parents:
diff changeset
192
1600
8d41cd4da2f6 jp: added a --verbose command
Goffi <goffi@goffi.org>
parents: 1594
diff changeset
193 verbose_parent = self.parents['verbose'] = argparse.ArgumentParser(add_help=False)
8d41cd4da2f6 jp: added a --verbose command
Goffi <goffi@goffi.org>
parents: 1594
diff changeset
194 verbose_parent.add_argument('--verbose', '-v', action='count', help=_(u"Add a verbosity level (can be used multiple times)"))
8d41cd4da2f6 jp: added a --verbose command
Goffi <goffi@goffi.org>
parents: 1594
diff changeset
195
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
196 def add_parser_options(self):
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
197 self.parser.add_argument('--version', action='version', version=("%(name)s %(version)s %(copyleft)s" % {'name': PROG_NAME, 'version': self.version, 'copyleft': COPYLEFT}))
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
198
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
199 def import_commands(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
200 """ Automaticaly import commands to jp
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
201 looks from modules names cmd_*.py in jp path and import them
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
202
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
203 """
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
204 path = os.path.dirname(sat_frontends.jp.__file__)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
205 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
206 for module_name in modules:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
207 module = import_module("sat_frontends.jp."+module_name)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
208 try:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
209 self.import_command_module(module)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
210 except ImportError:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
211 continue
0
goffi@necton2
parents:
diff changeset
212
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
213 def import_command_module(self, module):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
214 """ Add commands from a module to jp
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
215 @param module: module containing commands
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
216
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
217 """
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
218 try:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
219 for classname in module.__commands__:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
220 cls = getattr(module, classname)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
221 except AttributeError:
1605
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
222 log.warning(_("Invalid module %s") % module)
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
223 raise ImportError
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
224 cls(self)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
225
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
226 def run(self, args=None):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
227 self.args = self.parser.parse_args(args)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
228 self.args.func()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
229 if self.need_loop or self._auto_loop:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
230 self._start_loop()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
231
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
232 def _start_loop(self):
898
9720d3d0a764 jp: updated main loop to gobject 3
Matteo Cypriani <mcy@lm7.fr>
parents: 864
diff changeset
233 self.loop = GLib.MainLoop()
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
234 try:
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
235 self.loop.run()
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
236 except KeyboardInterrupt:
1605
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
237 log.info(_("User interruption: good bye"))
0
goffi@necton2
parents:
diff changeset
238
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
239 def stop_loop(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
240 try:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
241 self.loop.quit()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
242 except AttributeError:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
243 pass
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
244
1604
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
245 def quitFromSignal(self, errcode=0):
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
246 """Same as self.quit, but from a signal handler
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
247
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
248 /!\: return must be used after calling this method !
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
249 """
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
250 assert self.need_loop
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
251 # XXX: python-dbus will show a traceback if we exit in a signal handler with an error code
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
252 # so we use this little timeout trick to avoid it
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
253 GLib.timeout_add(0, self.quit, errcode)
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
254
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
255 def quit(self, errcode=0):
1604
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
256 # first the onQuitCallbacks
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
257 try:
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
258 callbacks_list = self._onQuitCallbacks
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
259 except AttributeError:
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
260 pass
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
261 else:
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
262 for callback, args, kwargs in callbacks_list:
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
263 callback(*args, **kwargs)
9ac78437000d jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
Goffi <goffi@goffi.org>
parents: 1600
diff changeset
264
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
265 self.stop_loop()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
266 if errcode:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
267 sys.exit(errcode)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
268
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
269 def check_jids(self, jids):
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
270 """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
271
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
272 @param profile: profile name
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
273 @param jids: list of jids
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
274 @return: List of jids
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
275
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
276 """
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
277 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
278 nodes2jid = {}
393
393b35aa86d2 jp: added --connect option
Goffi <goffi@goffi.org>
parents: 391
diff changeset
279
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
280 for contact in self.bridge.getContacts(self.profile):
1395
1ae9aa94c351 jp: fixed bad try/except hidding errors + fixed bad management of jids without node
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
281 jid_s, attr, groups = contact
1ae9aa94c351 jp: fixed bad try/except hidding errors + fixed bad management of jids without node
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
282 _jid = JID(jid_s)
1ae9aa94c351 jp: fixed bad try/except hidding errors + fixed bad management of jids without node
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
283 try:
1ae9aa94c351 jp: fixed bad try/except hidding errors + fixed bad management of jids without node
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
284 names2jid[attr["name"].lower()] = jid_s
1ae9aa94c351 jp: fixed bad try/except hidding errors + fixed bad management of jids without node
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
285 except KeyError:
1ae9aa94c351 jp: fixed bad try/except hidding errors + fixed bad management of jids without node
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
286 pass
1ae9aa94c351 jp: fixed bad try/except hidding errors + fixed bad management of jids without node
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
287
1ae9aa94c351 jp: fixed bad try/except hidding errors + fixed bad management of jids without node
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
288 if _jid.node:
1ae9aa94c351 jp: fixed bad try/except hidding errors + fixed bad management of jids without node
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
289 nodes2jid[_jid.node.lower()] = jid_s
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
290
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
291 def expand_jid(jid):
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
292 _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
293 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
294 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
295 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
296 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
297 else:
b7c4bb2c0668 jp: - better expandJid: roster's jids' nodes are used after names to expand jid
Goffi <goffi@goffi.org>
parents: 480
diff changeset
298 expanded = jid
965
5b95ce21c2d3 jp: fixed jid unicode decoding
Goffi <goffi@goffi.org>
parents: 964
diff changeset
299 return expanded.decode('utf-8')
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
300
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
301 def check(jid):
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
302 if not jid.is_valid:
1605
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
303 log.error (_("%s is not a valid JID !"), jid)
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
304 self.quit(1)
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
305
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
306 dest_jids=[]
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
307 try:
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
308 for i in range(len(jids)):
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
309 dest_jids.append(expand_jid(jids[i]))
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
310 check(dest_jids[i])
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
311 except AttributeError:
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
312 pass
0
goffi@necton2
parents:
diff changeset
313
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
314 return dest_jids
0
goffi@necton2
parents:
diff changeset
315
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
316 def connect_profile(self, callback):
1588
823a385235ef jp: fixed bad --connect option check
Goffi <goffi@goffi.org>
parents: 1544
diff changeset
317 """ Check if the profile is connected and do it if requested
1401
265ff2bd8d67 jp: fixed crash on commands using profile without "connect" option
Goffi <goffi@goffi.org>
parents: 1396
diff changeset
318
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
319 @param callback: method to call when profile is connected
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
320 @exit: - 1 when profile is not connected and --connect is not set
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
321 - 1 when the profile doesn't exists
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
322 - 1 when there is a connection error
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
323 """
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
324 # FIXME: need better exit codes
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
325
971
8ca5c990ed92 jp: "disco" subcommand, moved into a new "info" subcommand + added "version" subcommand which get software version
Goffi <goffi@goffi.org>
parents: 970
diff changeset
326 def cant_connect(failure):
1605
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
327 log.error(_(u"Can't connect profile: {reason}").format(reason=failure))
1594
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
328 self.quit(1)
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
329
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
330 def cant_start_session(failure):
1605
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
331 log.error(_(u"Can't start {profile}'s session: {reason}").format(profile=self.profile, reason=failure))
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
332 self.quit(1)
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
333
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
334 self.profile = self.bridge.getProfileName(self.args.profile)
0
goffi@necton2
parents:
diff changeset
335
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
336 if not self.profile:
1605
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
337 log.error(_("The profile [{profile}] doesn't exist").format(profile=self.args.profile))
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
338 self.quit(1)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
339
1594
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
340 try:
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
341 start_session = self.args.start_session
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
342 except AttributeError:
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
343 pass
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
344 else:
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
345 if start_session:
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
346 self.bridge.profileStartSession(self.args.pwd, self.profile, lambda dummy: callback(), cant_start_session)
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
347 self._auto_loop = True
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
348 return
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
349 elif not self.bridge.profileIsSessionStarted(self.profile):
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
350 if not self.args.connect:
1605
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
351 log.error(_(u"Session for [{profile}] is not started, please start it before using jp, or use either --start-session or --connect option").format(profile=self.profile))
1594
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
352 self.quit(1)
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
353 else:
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
354 callback()
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
355 return
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
356
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
357
1401
265ff2bd8d67 jp: fixed crash on commands using profile without "connect" option
Goffi <goffi@goffi.org>
parents: 1396
diff changeset
358 if not hasattr(self.args, 'connect'):
1588
823a385235ef jp: fixed bad --connect option check
Goffi <goffi@goffi.org>
parents: 1544
diff changeset
359 # a profile can be present without connect option (e.g. on profile creation/deletion)
1401
265ff2bd8d67 jp: fixed crash on commands using profile without "connect" option
Goffi <goffi@goffi.org>
parents: 1396
diff changeset
360 return
1588
823a385235ef jp: fixed bad --connect option check
Goffi <goffi@goffi.org>
parents: 1544
diff changeset
361 elif self.args.connect is True: # if connection is asked, we connect the profile
1544
3d5193b4c582 jp: separate password and connection of profile in --connect and --pwd arguments
Goffi <goffi@goffi.org>
parents: 1401
diff changeset
362 self.bridge.asyncConnect(self.profile, self.args.pwd, lambda dummy: callback(), cant_connect)
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
363 self._auto_loop = True
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
364 return
1594
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
365 else:
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
366 if not self.bridge.isConnected(self.profile):
1605
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
367 log.error(_(u"Profile [{profile}] is not connected, please connect it before using jp, or use --connect option").format(profile=self.profile))
1594
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
368 self.quit(1)
0
goffi@necton2
parents:
diff changeset
369
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
370 callback()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
371
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
372 def get_full_jid(self, param_jid):
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
373 """Return the full jid if possible (add main resource when find a bare jid)"""
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
374 _jid = JID(param_jid)
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
375 if not _jid.resource:
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
376 #if the resource is not given, we try to add the main resource
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
377 main_resource = self.bridge.getMainResource(param_jid, self.profile)
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
378 if main_resource:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
379 return "%s/%s" % (_jid.bare, main_resource)
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
380 return param_jid
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
381
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
382 def _onProgressStarted(self, uid, profile):
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
383 if profile != self.profile:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
384 return
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
385 self.progress_started(None)
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
386 if self.watch_progress and self.progress_id and uid == self.progress_id:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
387 GLib.timeout_add(PROGRESS_DELAY, self._progress_cb)
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
388
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
389 def _onProgressFinished(self, uid, profile):
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
390 if profile != self.profile:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
391 return
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
392 if uid == self.progress_id:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
393 try:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
394 self.pbar.finish()
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
395 except AttributeError:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
396 pass
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
397 self.progress_success(None)
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
398 if self.quit_on_progress_end:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
399 self.quit()
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
400
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
401 def _onProgressError(self, uid, profile):
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
402 if profile != self.profile:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
403 return
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
404 if uid == self.progress_id:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
405 self.disp('') # progress is not finished, so we skip a line
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
406 if self.quit_on_progress_end:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
407 self.progress_failure(None)
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
408 self.quitFromSignal(1)
0
goffi@necton2
parents:
diff changeset
409
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
410 def _progress_cb(self):
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
411 """This method is continualy called to update the progress bar"""
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
412 data = self.bridge.progressGet(self.progress_id, self.profile)
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
413 if data:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
414 try:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
415 size = data['size']
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
416 except KeyError:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
417 self.disp(_(u"file size is not known, we can't show a progress bar"), 1, error=True)
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
418 return False
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
419 if self.pbar is None:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
420 #first answer, we must construct the bar
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
421 self.pbar = progressbar.ProgressBar(int(size),
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
422 [_(u"Progress: "),progressbar.Percentage(),
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
423 " ",
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
424 progressbar.Bar(),
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
425 " ",
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
426 progressbar.FileTransferSpeed(),
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
427 " ",
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
428 progressbar.ETA()])
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
429 self.pbar.start()
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
430
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
431 self.pbar.update(int(data['position']))
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
432
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
433 elif self.pbar is not None:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
434 return False
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
435
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
436 return True
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
437
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
438
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
439 class CommandBase(object):
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
440
1600
8d41cd4da2f6 jp: added a --verbose command
Goffi <goffi@goffi.org>
parents: 1594
diff changeset
441 def __init__(self, host, name, use_profile=True, use_progress=False, use_verbose=False, need_connect=None, help=None, **kwargs):
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
442 """ Initialise CommandBase
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
443 @param host: Jp instance
1594
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
444 @param name(unicode): name of the new command
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
445 @param use_profile(bool): if True, add profile selection/connection commands
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
446 @param use_progress(bool): if True, add progress bar activation commands
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
447 progress* signals will be handled
1600
8d41cd4da2f6 jp: added a --verbose command
Goffi <goffi@goffi.org>
parents: 1594
diff changeset
448 @param use_verbose(bool): if True, add verbosity command
1594
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
449 @param need_connect(bool, None): True if profile connection is needed
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
450 False else (profile session must still be started)
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
451 None to set auto value (i.e. True if use_profile is set)
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
452 Can't be set if use_profile is False
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
453 @param help(unicode): help message to display
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
454 @param **kwargs: args passed to ArgumentParser
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
455
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
456 """
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
457 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
458 self.host = host.host
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
459 except AttributeError:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
460 self.host = host
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
461
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
462 parents = kwargs.setdefault('parents', set())
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
463 if use_profile:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
464 #self.host.parents['profile'] is an ArgumentParser with profile connection arguments
1594
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
465 if need_connect is None:
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
466 need_connect = True
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
467 parents.add(self.host.parents['profile' if need_connect else 'profile_session'])
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
468 else:
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
469 assert need_connect is None
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
470
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
471 if use_progress:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
472 parents.add(self.host.parents['progress'])
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
473
1600
8d41cd4da2f6 jp: added a --verbose command
Goffi <goffi@goffi.org>
parents: 1594
diff changeset
474 if use_verbose:
8d41cd4da2f6 jp: added a --verbose command
Goffi <goffi@goffi.org>
parents: 1594
diff changeset
475 parents.add(self.host.parents['verbose'])
8d41cd4da2f6 jp: added a --verbose command
Goffi <goffi@goffi.org>
parents: 1594
diff changeset
476
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
477 self.parser = host.subparsers.add_parser(name, help=help, **kwargs)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
478 if hasattr(self, "subcommands"):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
479 self.subparsers = self.parser.add_subparsers()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
480 else:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
481 self.parser.set_defaults(func=self.run)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
482 self.add_parser_options()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
483
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
484 @property
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
485 def args(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
486 return self.host.args
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
487
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
488 @property
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
489 def need_loop(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
490 return self.host.need_loop
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
491
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
492 @need_loop.setter
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
493 def need_loop(self, value):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
494 self.host.need_loop = value
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
495
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
496 @property
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
497 def profile(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
498 return self.host.profile
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
499
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
500 @property
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
501 def progress_id(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
502 return self.host.progress_id
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
503
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
504 @progress_id.setter
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
505 def progress_id(self, value):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
506 self.host.progress_id = value
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
507
1605
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
508 def disp(self, msg, verbosity=0, error=False):
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
509 return self.host.disp(msg, verbosity, error)
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
510
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
511 def add_parser_options(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
512 try:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
513 subcommands = self.subcommands
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
514 except AttributeError:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
515 # We don't have subcommands, the class need to implements add_parser_options
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
516 raise NotImplementedError
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
517
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
518 # now we add subcommands to ourself
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
519 for cls in subcommands:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
520 cls(self)
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
521
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
522 def run(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
523 try:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
524 if self.args.profile:
1395
1ae9aa94c351 jp: fixed bad try/except hidding errors + fixed bad management of jids without node
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
525 connect_profile = self.host.connect_profile
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
526 except AttributeError:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
527 # the command doesn't need to connect profile
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
528 pass
1395
1ae9aa94c351 jp: fixed bad try/except hidding errors + fixed bad management of jids without node
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
529 else:
1ae9aa94c351 jp: fixed bad try/except hidding errors + fixed bad management of jids without node
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
530 connect_profile(self.connected)
1ae9aa94c351 jp: fixed bad try/except hidding errors + fixed bad management of jids without node
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
531
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
532 try:
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
533 show_progress = self.args.progress
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
534 except AttributeError:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
535 # the command doesn't use progress bar
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
536 pass
1395
1ae9aa94c351 jp: fixed bad try/except hidding errors + fixed bad management of jids without node
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
537 else:
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
538 if show_progress:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
539 self.host.watch_progress = True
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
540 # we need to register the following signal even if we don't display the progress bas
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
541 self.host.bridge.register("progressStarted", self.host._onProgressStarted)
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
542 self.host.bridge.register("progressFinished", self.host._onProgressFinished)
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
543 self.host.bridge.register("progressError", self.host._onProgressError)
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
544
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
545 def connected(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
546 if not self.need_loop:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
547 self.host.stop_loop()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
548
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
549
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
550 class CommandAnswering(CommandBase):
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
551 """Specialised commands which answer to specific actions
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
552
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
553 to manage action_types answer,
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
554 """
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
555 action_callbacks = {} # XXX: set managed action types in an dict here:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
556 # key is the action_type, value is the callable
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
557 # which will manage the answer. profile filtering is
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
558 # already managed when callback is called
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
559
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
560 def onActionNew(self, action_data, action_id, security_limit, profile):
538
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 493
diff changeset
561 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
562 return
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
563 try:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
564 action_type = action_data['meta_type']
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
565 except KeyError:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
566 pass
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
567 else:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
568 try:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
569 callback = self.action_callbacks[action_type]
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
570 except KeyError:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
571 pass
0
goffi@necton2
parents:
diff changeset
572 else:
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
573 callback(action_data, action_id, security_limit, profile)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
574
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
575 def connected(self):
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
576 """Auto reply to confirmations requests"""
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
577 self.need_loop = True
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
578 super(CommandAnswering, self).connected()
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
579 self.host.bridge.register("actionNew", self.onActionNew)