annotate frontends/src/jp/base.py @ 2228:cf6c539672c7

tools (common/data_objects): comments items can now be chained to their parent
author Goffi <goffi@goffi.org>
date Mon, 17 Apr 2017 20:34:43 +0200
parents 1010054cf771
children 4db836386641
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1945
2c75011d7b2d jp: forgotten shebang fixes
Goffi <goffi@goffi.org>
parents: 1918
diff changeset
1 #!/usr/bin/env python2
0
goffi@necton2
parents:
diff changeset
2 # -*- coding: utf-8 -*-
goffi@necton2
parents:
diff changeset
3
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 601
diff changeset
4 # jp: a SAT command line tool
1766
d17772b0fe22 copyright update
Goffi <goffi@goffi.org>
parents: 1642
diff changeset
5 # Copyright (C) 2009-2016 Jérôme Poisson (goffi@goffi.org)
0
goffi@necton2
parents:
diff changeset
6
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 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,
2162
c9a67eb5bf72 jp (base): improved module import:
Goffi <goffi@goffi.org>
parents: 2161
diff changeset
25 format='%(message)s')
0
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
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
32 from glob import iglob
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
33 from importlib import import_module
1139
75025461141f move sat.tools.jid to sat_frontends.tools.jid
souliane <souliane@mailoo.org>
parents: 1033
diff changeset
34 from sat_frontends.tools.jid import JID
2098
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
35 from sat.tools import config
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
36 from sat.tools.common import dynamic_import
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
1840
9eabf7fadfdd frontends (jp): onActionNew displays xmlui message if no meta_type is defined and xmlui is defined
souliane <souliane@mailoo.org>
parents: 1832
diff changeset
40 import xml.etree.ElementTree as ET # FIXME: used temporarily to manage XMLUI
1872
df1ca137b0cb jp (blog/edit): editor arguments can now be specified on sat.conf, and default on are applied for known editors:
Goffi <goffi@goffi.org>
parents: 1869
diff changeset
41 import shlex
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
42 from collections import OrderedDict
1872
df1ca137b0cb jp (blog/edit): editor arguments can now be specified on sat.conf, and default on are applied for known editors:
Goffi <goffi@goffi.org>
parents: 1869
diff changeset
43
2098
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
44 ## bridge handling
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
45 # we get bridge name from conf and initialise the right class accordingly
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
46 main_config = config.parseMainConf()
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
47 bridge_name = config.getConfig(main_config, '', 'bridge', 'dbus')
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
48
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
49
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
50 # TODO: move loops handling in a separated module
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
51 if 'dbus' in bridge_name:
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
52 from gi.repository import GLib
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
53
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
54
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
55 class JPLoop(object):
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
56
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
57 def __init__(self):
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
58 self.loop = GLib.MainLoop()
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
59
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
60 def run(self):
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
61 self.loop.run()
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
62
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
63 def quit(self):
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
64 self.loop.quit()
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
65
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
66 def call_later(self, delay, callback, *args):
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
67 """call a callback repeatedly
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
68
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
69 @param delay(int): delay between calls in ms
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
70 @param callback(callable): method to call
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
71 if the callback return True, the call will continue
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
72 else the calls will stop
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
73 @param *args: args of the callbac
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
74 """
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
75 GLib.timeout_add(delay, callback, *args)
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
76
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
77 else:
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
78 print u"can't start jp: only D-Bus bridge is currently handled"
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
79 sys.exit(C.EXIT_ERROR)
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
80 # FIXME: twisted loop can be used when jp can handle fully async bridges
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
81 # from twisted.internet import reactor
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
82
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
83 # class JPLoop(object):
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
84
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
85 # def run(self):
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
86 # reactor.run()
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
87
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
88 # def quit(self):
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
89 # reactor.stop()
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
90
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
91 # def _timeout_cb(self, args, callback, delay):
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
92 # ret = callback(*args)
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
93 # if ret:
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
94 # reactor.callLater(delay, self._timeout_cb, args, callback, delay)
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
95
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
96 # def call_later(self, delay, callback, *args):
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
97 # delay = float(delay) / 1000
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
98 # reactor.callLater(delay, self._timeout_cb, args, callback, delay)
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
99
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
100 if bridge_name == "embedded":
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
101 from sat.core import sat_main
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
102 sat = sat_main.SAT()
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
103
1872
df1ca137b0cb jp (blog/edit): editor arguments can now be specified on sat.conf, and default on are applied for known editors:
Goffi <goffi@goffi.org>
parents: 1869
diff changeset
104 if sys.version_info < (2, 7, 3):
df1ca137b0cb jp (blog/edit): editor arguments can now be specified on sat.conf, and default on are applied for known editors:
Goffi <goffi@goffi.org>
parents: 1869
diff changeset
105 # XXX: shlex.split only handle unicode since python 2.7.3
df1ca137b0cb jp (blog/edit): editor arguments can now be specified on sat.conf, and default on are applied for known editors:
Goffi <goffi@goffi.org>
parents: 1869
diff changeset
106 # this is a workaround for older versions
df1ca137b0cb jp (blog/edit): editor arguments can now be specified on sat.conf, and default on are applied for known editors:
Goffi <goffi@goffi.org>
parents: 1869
diff changeset
107 old_split = shlex.split
df1ca137b0cb jp (blog/edit): editor arguments can now be specified on sat.conf, and default on are applied for known editors:
Goffi <goffi@goffi.org>
parents: 1869
diff changeset
108 new_split = (lambda s, *a, **kw: [t.decode('utf-8') for t in old_split(s.encode('utf-8'), *a, **kw)]
df1ca137b0cb jp (blog/edit): editor arguments can now be specified on sat.conf, and default on are applied for known editors:
Goffi <goffi@goffi.org>
parents: 1869
diff changeset
109 if isinstance(s, unicode) else old_split(s, *a, **kw))
df1ca137b0cb jp (blog/edit): editor arguments can now be specified on sat.conf, and default on are applied for known editors:
Goffi <goffi@goffi.org>
parents: 1869
diff changeset
110 shlex.split = new_split
1840
9eabf7fadfdd frontends (jp): onActionNew displays xmlui message if no meta_type is defined and xmlui is defined
souliane <souliane@mailoo.org>
parents: 1832
diff changeset
111
0
goffi@necton2
parents:
diff changeset
112 try:
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
113 import progressbar
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
114 except ImportError:
2188
052d560d0dce jp (base): replaced log.warning by stderr prints
Goffi <goffi@goffi.org>
parents: 2187
diff changeset
115 msg = (_(u'ProgressBar not available, please download it at http://pypi.python.org/pypi/progressbar\n') +
052d560d0dce jp (base): replaced log.warning by stderr prints
Goffi <goffi@goffi.org>
parents: 2187
diff changeset
116 _(u'Progress bar deactivated\n--\n'))
052d560d0dce jp (base): replaced log.warning by stderr prints
Goffi <goffi@goffi.org>
parents: 2187
diff changeset
117 print >>sys.stderr,msg.encode('utf-8')
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
118 progressbar=None
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
119
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
120 #consts
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
121 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
122 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
123 Get the latest version at """ + C.APP_URL
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
124
1766
d17772b0fe22 copyright update
Goffi <goffi@goffi.org>
parents: 1642
diff changeset
125 COPYLEFT = u"""Copyright (C) 2009-2016 Jérôme Poisson, Adrien Cossa
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
126 This program comes with ABSOLUTELY NO WARRANTY;
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
127 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
128 """
0
goffi@necton2
parents:
diff changeset
129
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
130 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
131
0
goffi@necton2
parents:
diff changeset
132
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
133 def unicode_decoder(arg):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
134 # Needed to have unicode strings from arguments
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
135 return arg.decode(locale.getpreferredencoding())
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
136
0
goffi@necton2
parents:
diff changeset
137
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
138 class Jp(object):
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
139 """
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
140 This class can be use to establish a connection with the
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
141 bridge. Moreover, it should manage a main loop.
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
142
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
143 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
144 specify what kind of operation you want to perform.
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
145
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
146 """
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
147 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
148 """
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
149
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
150 @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
151 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
152 @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
153 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
154 @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
155 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
156 @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
157 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
158 """
2098
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
159 # FIXME: need_loop should be removed, everything must be async in bridge so
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
160 # loop will always be needed
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
161 bridge_module = dynamic_import.bridge(bridge_name, 'sat_frontends.bridge')
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
162 if bridge_module is None:
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
163 log.error(u"Can't import {} bridge".format(bridge_name))
165
8a2053de6f8c Frontends: management of unlaunched SàT Backend (information message and exit)
Goffi <goffi@goffi.org>
parents: 156
diff changeset
164 sys.exit(1)
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
165
2098
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
166 self.bridge = bridge_module.Bridge()
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
167 self.bridge.bridgeConnect(callback=self._bridgeCb, errback=self._bridgeEb)
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
168
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
169 def _bridgeCb(self):
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
170 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
171 description=DESCRIPTION)
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
172 self._make_parents()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
173 self.add_parser_options()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
174 self.subparsers = self.parser.add_subparsers(title=_('Available commands'), dest='subparser_name')
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
175 self._auto_loop = False # when loop is used for internal reasons
1863
b2ddd7f5dcdf jp (base): refactored need_loop so it is set only when the command is run. It can now be set in __init__ methods of commands classes
Goffi <goffi@goffi.org>
parents: 1862
diff changeset
176 self._need_loop = False
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
177
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
178 # progress attributes
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
179 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
180 self.quit_on_progress_end = True
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
181
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
182 # outputs
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
183 self._outputs = {}
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
184 for type_ in C.OUTPUT_TYPES:
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
185 self._outputs[type_] = OrderedDict()
2189
a25a256688e2 jp (base): output can now specify a default when registering
Goffi <goffi@goffi.org>
parents: 2188
diff changeset
186 self.default_output = {}
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
187
2098
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
188 def _bridgeEb(self, failure):
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
189 if isinstance(failure, exceptions.BridgeExceptionNoService):
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
190 print(_(u"Can't connect to SàT backend, are you sure it's launched ?"))
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
191 elif isinstance(failure, exceptions.BridgeInitError):
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
192 print(_(u"Can't init bridge"))
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
193 else:
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
194 print(_(u"Error while initialising bridge: {}".format(failure)))
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
195 sys.exit(C.EXIT_BRIDGE_ERROR)
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
196
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
197 @property
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
198 def version(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
199 return self.bridge.getVersion()
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
200
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
201 @property
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
202 def progress_id(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
203 return self._progress_id
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
204
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
205 @progress_id.setter
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
206 def progress_id(self, value):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
207 self._progress_id = value
1642
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
208 self.replayCache('progress_ids_cache')
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
209
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
210 @property
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
211 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
212 try:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
213 self.pbar
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
214 except AttributeError:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
215 return False
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
216 else:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
217 return True
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
218
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
219 @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
220 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
221 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
222 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
223
1605
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
224 @property
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
225 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
226 try:
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
227 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
228 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
229 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
230
1642
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
231 def replayCache(self, cache_attribute):
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
232 """Replay cached signals
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
233
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
234 @param cache_attribute(str): name of the attribute containing the cache
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
235 if the attribute doesn't exist, there is no cache and the call is ignored
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
236 else the cache must be a list of tuples containing the replay callback as first item,
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
237 then the arguments to use
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
238 """
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
239 try:
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
240 cache = getattr(self, cache_attribute)
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
241 except AttributeError:
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
242 pass
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
243 else:
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
244 for cache_data in cache:
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
245 cache_data[0](*cache_data[1:])
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
246
1605
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
247 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
248 """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
249
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
250 @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
251 @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
252 @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
253 """
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
254 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
255 if error:
2161
62dfa6e02f54 jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents: 2155
diff changeset
256 print >>sys.stderr,msg.encode('utf-8')
1605
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
257 else:
2161
62dfa6e02f54 jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents: 2155
diff changeset
258 print msg.encode('utf-8')
1605
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
259
2155
cee6561ad086 jp (core): added extra_outputs:
Goffi <goffi@goffi.org>
parents: 2151
diff changeset
260 def output(self, type_, name, extra_outputs, data):
cee6561ad086 jp (core): added extra_outputs:
Goffi <goffi@goffi.org>
parents: 2151
diff changeset
261 if name in extra_outputs:
cee6561ad086 jp (core): added extra_outputs:
Goffi <goffi@goffi.org>
parents: 2151
diff changeset
262 extra_outputs[name](data)
cee6561ad086 jp (core): added extra_outputs:
Goffi <goffi@goffi.org>
parents: 2151
diff changeset
263 else:
cee6561ad086 jp (core): added extra_outputs:
Goffi <goffi@goffi.org>
parents: 2151
diff changeset
264 self._outputs[type_][name]['callback'](data)
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
265
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
266 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
267 """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
268
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
269 @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
270 """
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
271 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
272 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
273 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
274 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
275 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
276 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
277
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
278 def getOutputChoices(self, output_type):
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
279 """Return valid output filters for output_type
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
280
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
281 @param output_type: True for default,
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
282 else can be any registered type
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
283 """
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
284 return self._outputs[output_type].keys()
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
285
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
286 def _make_parents(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
287 self.parents = {}
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
288
1594
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
289 # 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
290 # 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
291 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
292 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
293 parent.add_argument("-p", "--profile", action="store", type=str, default='@DEFAULT@', help=_("Use PROFILE profile key (default: %(default)s)"))
2151
fff88c33442f jp (info/disco): added --node argument
Goffi <goffi@goffi.org>
parents: 2142
diff changeset
294 parent.add_argument("--pwd", action="store", type=unicode_decoder, default='', metavar='PASSWORD', help=_("Password used to connect profile, if necessary"))
1594
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
295
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
296 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
297
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
298 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
299 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
300
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
301 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
302 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
303 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
304
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
305 progress_parent = self.parents['progress'] = argparse.ArgumentParser(add_help=False)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
306 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
307 progress_parent.add_argument("-P", "--progress", action="store_true", help=_("Show progress bar"))
0
goffi@necton2
parents:
diff changeset
308
1600
8d41cd4da2f6 jp: added a --verbose command
Goffi <goffi@goffi.org>
parents: 1594
diff changeset
309 verbose_parent = self.parents['verbose'] = argparse.ArgumentParser(add_help=False)
1641
44a14f83e64b jp (base): fixed verbose option + there is a new line on ProgressErrorHandler only if the progress bar is actually displayed
Goffi <goffi@goffi.org>
parents: 1627
diff changeset
310 verbose_parent.add_argument('--verbose', '-v', action='count', default=0, help=_(u"Add a verbosity level (can be used multiple times)"))
1600
8d41cd4da2f6 jp: added a --verbose command
Goffi <goffi@goffi.org>
parents: 1594
diff changeset
311
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
312 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
313 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
314
2189
a25a256688e2 jp (base): output can now specify a default when registering
Goffi <goffi@goffi.org>
parents: 2188
diff changeset
315 def register_output(self, type_, name, callback, description="", default=False):
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
316 if type_ not in C.OUTPUT_TYPES:
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
317 log.error(u"Invalid output type {}".format(type_))
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
318 return
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
319 self._outputs[type_][name] = {'callback': callback,
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
320 'description': description
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
321 }
2189
a25a256688e2 jp (base): output can now specify a default when registering
Goffi <goffi@goffi.org>
parents: 2188
diff changeset
322 if default:
a25a256688e2 jp (base): output can now specify a default when registering
Goffi <goffi@goffi.org>
parents: 2188
diff changeset
323 if type_ in self.default_output:
a25a256688e2 jp (base): output can now specify a default when registering
Goffi <goffi@goffi.org>
parents: 2188
diff changeset
324 self.disp(_(u'there is already a default output for {}, ignoring new one').format(type_))
a25a256688e2 jp (base): output can now specify a default when registering
Goffi <goffi@goffi.org>
parents: 2188
diff changeset
325 else:
a25a256688e2 jp (base): output can now specify a default when registering
Goffi <goffi@goffi.org>
parents: 2188
diff changeset
326 self.default_output[type_] = name
a25a256688e2 jp (base): output can now specify a default when registering
Goffi <goffi@goffi.org>
parents: 2188
diff changeset
327
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
328
2187
4ec72927a222 jp (outputs): moved output options parsing and checking to base methods
Goffi <goffi@goffi.org>
parents: 2178
diff changeset
329 def parse_output_options(self):
4ec72927a222 jp (outputs): moved output options parsing and checking to base methods
Goffi <goffi@goffi.org>
parents: 2178
diff changeset
330 options = self.command.args.output_opts
4ec72927a222 jp (outputs): moved output options parsing and checking to base methods
Goffi <goffi@goffi.org>
parents: 2178
diff changeset
331 options_dict = {}
4ec72927a222 jp (outputs): moved output options parsing and checking to base methods
Goffi <goffi@goffi.org>
parents: 2178
diff changeset
332 for option in options:
4ec72927a222 jp (outputs): moved output options parsing and checking to base methods
Goffi <goffi@goffi.org>
parents: 2178
diff changeset
333 try:
4ec72927a222 jp (outputs): moved output options parsing and checking to base methods
Goffi <goffi@goffi.org>
parents: 2178
diff changeset
334 key, value = option.split(u'=', 1)
4ec72927a222 jp (outputs): moved output options parsing and checking to base methods
Goffi <goffi@goffi.org>
parents: 2178
diff changeset
335 except ValueError:
4ec72927a222 jp (outputs): moved output options parsing and checking to base methods
Goffi <goffi@goffi.org>
parents: 2178
diff changeset
336 key, value = option, None
4ec72927a222 jp (outputs): moved output options parsing and checking to base methods
Goffi <goffi@goffi.org>
parents: 2178
diff changeset
337 options_dict[key.strip()] = value.strip() if value is not None else None
4ec72927a222 jp (outputs): moved output options parsing and checking to base methods
Goffi <goffi@goffi.org>
parents: 2178
diff changeset
338 return options_dict
4ec72927a222 jp (outputs): moved output options parsing and checking to base methods
Goffi <goffi@goffi.org>
parents: 2178
diff changeset
339
4ec72927a222 jp (outputs): moved output options parsing and checking to base methods
Goffi <goffi@goffi.org>
parents: 2178
diff changeset
340 def check_output_options(self, accepted_set, options):
4ec72927a222 jp (outputs): moved output options parsing and checking to base methods
Goffi <goffi@goffi.org>
parents: 2178
diff changeset
341 if not accepted_set.issuperset(options):
4ec72927a222 jp (outputs): moved output options parsing and checking to base methods
Goffi <goffi@goffi.org>
parents: 2178
diff changeset
342 self.disp(u"The following output options are invalid: {invalid_options}".format(
4ec72927a222 jp (outputs): moved output options parsing and checking to base methods
Goffi <goffi@goffi.org>
parents: 2178
diff changeset
343 invalid_options = u', '.join(set(options).difference(accepted_set))),
4ec72927a222 jp (outputs): moved output options parsing and checking to base methods
Goffi <goffi@goffi.org>
parents: 2178
diff changeset
344 error=True)
4ec72927a222 jp (outputs): moved output options parsing and checking to base methods
Goffi <goffi@goffi.org>
parents: 2178
diff changeset
345 self.quit(C.EXIT_BAD_ARG)
4ec72927a222 jp (outputs): moved output options parsing and checking to base methods
Goffi <goffi@goffi.org>
parents: 2178
diff changeset
346
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
347 def import_plugins(self):
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
348 """Automaticaly import commands and outputs in jp
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
349
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
350 looks from modules names cmd_*.py in jp path and import them
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
351 """
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
352 path = os.path.dirname(sat_frontends.jp.__file__)
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
353 # XXX: outputs must be imported before commands as they are used for arguments
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
354 for type_, pattern in ((C.PLUGIN_OUTPUT, 'output_*.py'), (C.PLUGIN_CMD, 'cmd_*.py')):
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
355 modules = (os.path.splitext(module)[0] for module in map(os.path.basename, iglob(os.path.join(path, pattern))))
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
356 for module_name in modules:
2162
c9a67eb5bf72 jp (base): improved module import:
Goffi <goffi@goffi.org>
parents: 2161
diff changeset
357 module_path = "sat_frontends.jp." + module_name
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
358 try:
2162
c9a67eb5bf72 jp (base): improved module import:
Goffi <goffi@goffi.org>
parents: 2161
diff changeset
359 module = import_module(module_path)
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
360 self.import_plugin_module(module, type_)
2178
b9bfc45cea22 jp (base): added generic errback to CommandBase + show error message on plugin ImportError
Goffi <goffi@goffi.org>
parents: 2168
diff changeset
361 except ImportError as e:
2188
052d560d0dce jp (base): replaced log.warning by stderr prints
Goffi <goffi@goffi.org>
parents: 2187
diff changeset
362 self.disp(_(u"Can't import {module_path} plugin, ignoring it: {msg}".format(
2178
b9bfc45cea22 jp (base): added generic errback to CommandBase + show error message on plugin ImportError
Goffi <goffi@goffi.org>
parents: 2168
diff changeset
363 module_path = module_path,
2188
052d560d0dce jp (base): replaced log.warning by stderr prints
Goffi <goffi@goffi.org>
parents: 2187
diff changeset
364 msg = e)), error=True)
2162
c9a67eb5bf72 jp (base): improved module import:
Goffi <goffi@goffi.org>
parents: 2161
diff changeset
365 except exceptions.CancelError:
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
366 continue
2162
c9a67eb5bf72 jp (base): improved module import:
Goffi <goffi@goffi.org>
parents: 2161
diff changeset
367 except exceptions.MissingModule as e:
2188
052d560d0dce jp (base): replaced log.warning by stderr prints
Goffi <goffi@goffi.org>
parents: 2187
diff changeset
368 self.disp(_(u"Missing module for plugin {name}: {missing}".format(
2162
c9a67eb5bf72 jp (base): improved module import:
Goffi <goffi@goffi.org>
parents: 2161
diff changeset
369 name = module_path,
2188
052d560d0dce jp (base): replaced log.warning by stderr prints
Goffi <goffi@goffi.org>
parents: 2187
diff changeset
370 missing = e)), error=True)
2162
c9a67eb5bf72 jp (base): improved module import:
Goffi <goffi@goffi.org>
parents: 2161
diff changeset
371
0
goffi@necton2
parents:
diff changeset
372
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
373 def import_plugin_module(self, module, type_):
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
374 """add commands or outpus from a module to jp
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
375
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
376 @param module: module containing commands or outputs
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
377 @param type_(str): one of C_PLUGIN_*
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
378 """
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
379 try:
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
380 class_names = getattr(module, '__{}__'.format(type_))
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
381 except AttributeError:
2188
052d560d0dce jp (base): replaced log.warning by stderr prints
Goffi <goffi@goffi.org>
parents: 2187
diff changeset
382 log.disp(_(u"Invalid plugin module [{type}] {module}").format(type=type_, module=module), error=True)
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
383 raise ImportError
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
384 else:
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
385 for class_name in class_names:
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
386 cls = getattr(module, class_name)
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
387 cls(self)
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
388
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
389 def run(self, args=None):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
390 self.args = self.parser.parse_args(args)
1884
0fe69871b71f jp: moved KeyboardInterrupt catch one level higher, so it is also catched if the loop is not started
Goffi <goffi@goffi.org>
parents: 1872
diff changeset
391 try:
0fe69871b71f jp: moved KeyboardInterrupt catch one level higher, so it is also catched if the loop is not started
Goffi <goffi@goffi.org>
parents: 1872
diff changeset
392 self.args.func()
0fe69871b71f jp: moved KeyboardInterrupt catch one level higher, so it is also catched if the loop is not started
Goffi <goffi@goffi.org>
parents: 1872
diff changeset
393 if self._need_loop or self._auto_loop:
0fe69871b71f jp: moved KeyboardInterrupt catch one level higher, so it is also catched if the loop is not started
Goffi <goffi@goffi.org>
parents: 1872
diff changeset
394 self._start_loop()
0fe69871b71f jp: moved KeyboardInterrupt catch one level higher, so it is also catched if the loop is not started
Goffi <goffi@goffi.org>
parents: 1872
diff changeset
395 except KeyboardInterrupt:
0fe69871b71f jp: moved KeyboardInterrupt catch one level higher, so it is also catched if the loop is not started
Goffi <goffi@goffi.org>
parents: 1872
diff changeset
396 log.info(_("User interruption: good bye"))
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
397
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
398 def _start_loop(self):
2098
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
399 self.loop = JPLoop()
1884
0fe69871b71f jp: moved KeyboardInterrupt catch one level higher, so it is also catched if the loop is not started
Goffi <goffi@goffi.org>
parents: 1872
diff changeset
400 self.loop.run()
0
goffi@necton2
parents:
diff changeset
401
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
402 def stop_loop(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
403 try:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
404 self.loop.quit()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
405 except AttributeError:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
406 pass
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
407
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
408 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
409 """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
410
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
411 /!\: 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
412 """
1863
b2ddd7f5dcdf jp (base): refactored need_loop so it is set only when the command is run. It can now be set in __init__ methods of commands classes
Goffi <goffi@goffi.org>
parents: 1862
diff changeset
413 assert self._need_loop
1918
01d56efd488b jp: fixed traceback shown on a normal quit when a progression is finished
Goffi <goffi@goffi.org>
parents: 1884
diff changeset
414 # XXX: python-dbus will show a traceback if we exit in a signal handler
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
415 # so we use this little timeout trick to avoid it
2098
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
416 self.loop.call_later(0, self.quit, errcode)
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
417
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
418 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
419 # 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
420 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
421 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
422 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
423 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
424 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
425 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
426 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
427
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
428 self.stop_loop()
1869
9d9d61d53684 jp (base): fixed Jp.quit when exit code is 0
Goffi <goffi@goffi.org>
parents: 1863
diff changeset
429 sys.exit(errcode)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
430
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
431 def check_jids(self, jids):
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
432 """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
433
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
434 @param profile: profile name
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
435 @param jids: list of jids
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
436 @return: List of jids
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
437
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
438 """
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
439 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
440 nodes2jid = {}
393
393b35aa86d2 jp: added --connect option
Goffi <goffi@goffi.org>
parents: 391
diff changeset
441
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
442 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
443 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
444 _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
445 try:
1ae9aa94c351 jp: fixed bad try/except hidding errors + fixed bad management of jids without node
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
446 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
447 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
448 pass
1ae9aa94c351 jp: fixed bad try/except hidding errors + fixed bad management of jids without node
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
449
1ae9aa94c351 jp: fixed bad try/except hidding errors + fixed bad management of jids without node
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
450 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
451 nodes2jid[_jid.node.lower()] = jid_s
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
452
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
453 def expand_jid(jid):
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
454 _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
455 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
456 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
457 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
458 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
459 else:
b7c4bb2c0668 jp: - better expandJid: roster's jids' nodes are used after names to expand jid
Goffi <goffi@goffi.org>
parents: 480
diff changeset
460 expanded = jid
965
5b95ce21c2d3 jp: fixed jid unicode decoding
Goffi <goffi@goffi.org>
parents: 964
diff changeset
461 return expanded.decode('utf-8')
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
462
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
463 def check(jid):
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
464 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
465 log.error (_("%s is not a valid JID !"), jid)
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
466 self.quit(1)
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
467
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
468 dest_jids=[]
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
469 try:
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
470 for i in range(len(jids)):
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
471 dest_jids.append(expand_jid(jids[i]))
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
472 check(dest_jids[i])
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
473 except AttributeError:
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
474 pass
0
goffi@necton2
parents:
diff changeset
475
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
476 return dest_jids
0
goffi@necton2
parents:
diff changeset
477
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
478 def connect_profile(self, callback):
1588
823a385235ef jp: fixed bad --connect option check
Goffi <goffi@goffi.org>
parents: 1544
diff changeset
479 """ 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
480
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
481 @param callback: method to call when profile is connected
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
482 @exit: - 1 when profile is not connected and --connect is not set
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
483 - 1 when the profile doesn't exists
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
484 - 1 when there is a connection error
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
485 """
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
486 # FIXME: need better exit codes
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
487
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
488 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
489 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
490 self.quit(1)
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
491
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
492 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
493 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
494 self.quit(1)
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
495
2168
255830fdb80b core, bridge: renamed getProfileName to profileNameGet according to new conventions
Goffi <goffi@goffi.org>
parents: 2162
diff changeset
496 self.profile = self.bridge.profileNameGet(self.args.profile)
0
goffi@necton2
parents:
diff changeset
497
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
498 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
499 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
500 self.quit(1)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
501
1594
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
502 try:
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
503 start_session = self.args.start_session
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
504 except AttributeError:
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
505 pass
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
506 else:
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
507 if start_session:
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
508 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
509 self._auto_loop = True
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
510 return
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
511 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
512 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
513 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
514 self.quit(1)
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
515 else:
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
516 callback()
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
517 return
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
518
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
519
1401
265ff2bd8d67 jp: fixed crash on commands using profile without "connect" option
Goffi <goffi@goffi.org>
parents: 1396
diff changeset
520 if not hasattr(self.args, 'connect'):
1588
823a385235ef jp: fixed bad --connect option check
Goffi <goffi@goffi.org>
parents: 1544
diff changeset
521 # 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
522 return
1588
823a385235ef jp: fixed bad --connect option check
Goffi <goffi@goffi.org>
parents: 1544
diff changeset
523 elif self.args.connect is True: # if connection is asked, we connect the profile
2142
be96beb7ca14 core, bridge, frontends: renamed asyncConnect to connect, and added options parameters (not used yet)
Goffi <goffi@goffi.org>
parents: 2119
diff changeset
524 self.bridge.connect(self.profile, self.args.pwd, {}, lambda dummy: callback(), cant_connect)
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
525 self._auto_loop = True
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
526 return
1594
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
527 else:
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
528 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
529 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
530 self.quit(1)
0
goffi@necton2
parents:
diff changeset
531
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
532 callback()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
533
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
534 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
535 """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
536 _jid = JID(param_jid)
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
537 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
538 #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
539 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
540 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
541 return "%s/%s" % (_jid.bare, main_resource)
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
542 return param_jid
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
543
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
544
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
545 class CommandBase(object):
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
546
2155
cee6561ad086 jp (core): added extra_outputs:
Goffi <goffi@goffi.org>
parents: 2151
diff changeset
547 def __init__(self, host, name, use_profile=True, use_output=False, extra_outputs=None,
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
548 need_connect=None, help=None, **kwargs):
2098
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
549 """Initialise CommandBase
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
550
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
551 @param host: Jp instance
1594
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
552 @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
553 @param use_profile(bool): if True, add profile selection/connection commands
2114
dc5d214f0a3b jp (info/session): added a command to get data on current session
Goffi <goffi@goffi.org>
parents: 2098
diff changeset
554 @param use_output(bool, unicode): if not False, add --output option
2155
cee6561ad086 jp (core): added extra_outputs:
Goffi <goffi@goffi.org>
parents: 2151
diff changeset
555 @param extra_outputs(dict): list of command specific outputs:
cee6561ad086 jp (core): added extra_outputs:
Goffi <goffi@goffi.org>
parents: 2151
diff changeset
556 key is output name ("default" to use as main output)
cee6561ad086 jp (core): added extra_outputs:
Goffi <goffi@goffi.org>
parents: 2151
diff changeset
557 value is a callable which will format the output (data will be used as only argument)
cee6561ad086 jp (core): added extra_outputs:
Goffi <goffi@goffi.org>
parents: 2151
diff changeset
558 if a key already exists with normal outputs, the extra one will be used
1594
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
559 @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
560 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
561 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
562 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
563 @param help(unicode): help message to display
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
564 @param **kwargs: args passed to ArgumentParser
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
565 use_* are handled directly, they can be:
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
566 - use_progress(bool): if True, add progress bar activation option
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
567 progress* signals will be handled
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
568 - use_verbose(bool): if True, add verbosity option
1863
b2ddd7f5dcdf jp (base): refactored need_loop so it is set only when the command is run. It can now be set in __init__ methods of commands classes
Goffi <goffi@goffi.org>
parents: 1862
diff changeset
569 @attribute need_loop(bool): to set by commands when loop is needed
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
570 """
1863
b2ddd7f5dcdf jp (base): refactored need_loop so it is set only when the command is run. It can now be set in __init__ methods of commands classes
Goffi <goffi@goffi.org>
parents: 1862
diff changeset
571 self.need_loop = False # to be set by commands when loop is needed
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
572 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
573 self.host = host.host
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
574 except AttributeError:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
575 self.host = host
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
576
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
577 # --profile option
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
578 parents = kwargs.setdefault('parents', set())
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
579 if use_profile:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
580 #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
581 if need_connect is None:
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
582 need_connect = True
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
583 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
584 else:
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
585 assert need_connect is None
1860
afc7f6328394 jp (base): use need_connect attribue to detect if connection is needed instead of self.args.profile, as profile argument can be used by any command even if use_profile is False
Goffi <goffi@goffi.org>
parents: 1840
diff changeset
586 self.need_connect = need_connect
afc7f6328394 jp (base): use need_connect attribue to detect if connection is needed instead of self.args.profile, as profile argument can be used by any command even if use_profile is False
Goffi <goffi@goffi.org>
parents: 1840
diff changeset
587 # from this point, self.need_connect is None if connection is not needed at all
afc7f6328394 jp (base): use need_connect attribue to detect if connection is needed instead of self.args.profile, as profile argument can be used by any command even if use_profile is False
Goffi <goffi@goffi.org>
parents: 1840
diff changeset
588 # False if session starting is needed, and True if full connection is needed
1594
313f2bb7841b jp: profile session can now be started without connection:
Goffi <goffi@goffi.org>
parents: 1588
diff changeset
589
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
590 # --output option
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
591 if use_output:
2155
cee6561ad086 jp (core): added extra_outputs:
Goffi <goffi@goffi.org>
parents: 2151
diff changeset
592 if extra_outputs is None:
cee6561ad086 jp (core): added extra_outputs:
Goffi <goffi@goffi.org>
parents: 2151
diff changeset
593 extra_outputs = {}
cee6561ad086 jp (core): added extra_outputs:
Goffi <goffi@goffi.org>
parents: 2151
diff changeset
594 self.extra_outputs = extra_outputs
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
595 if use_output == True:
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
596 use_output = C.OUTPUT_TEXT
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
597 assert use_output in C.OUTPUT_TYPES
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
598 self._output_type = use_output
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
599 output_parent = argparse.ArgumentParser(add_help=False)
2155
cee6561ad086 jp (core): added extra_outputs:
Goffi <goffi@goffi.org>
parents: 2151
diff changeset
600 choices = set(self.host.getOutputChoices(use_output))
cee6561ad086 jp (core): added extra_outputs:
Goffi <goffi@goffi.org>
parents: 2151
diff changeset
601 choices.update(extra_outputs)
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
602 if not choices:
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
603 raise exceptions.InternalError("No choice found for {} output type".format(use_output))
2189
a25a256688e2 jp (base): output can now specify a default when registering
Goffi <goffi@goffi.org>
parents: 2188
diff changeset
604 try:
a25a256688e2 jp (base): output can now specify a default when registering
Goffi <goffi@goffi.org>
parents: 2188
diff changeset
605 default = self.host.default_output[use_output]
a25a256688e2 jp (base): output can now specify a default when registering
Goffi <goffi@goffi.org>
parents: 2188
diff changeset
606 except KeyError:
a25a256688e2 jp (base): output can now specify a default when registering
Goffi <goffi@goffi.org>
parents: 2188
diff changeset
607 if u'default' in choices:
a25a256688e2 jp (base): output can now specify a default when registering
Goffi <goffi@goffi.org>
parents: 2188
diff changeset
608 default = u'default'
a25a256688e2 jp (base): output can now specify a default when registering
Goffi <goffi@goffi.org>
parents: 2188
diff changeset
609 elif u'simple' in choices:
a25a256688e2 jp (base): output can now specify a default when registering
Goffi <goffi@goffi.org>
parents: 2188
diff changeset
610 default = u'simple'
a25a256688e2 jp (base): output can now specify a default when registering
Goffi <goffi@goffi.org>
parents: 2188
diff changeset
611 else:
a25a256688e2 jp (base): output can now specify a default when registering
Goffi <goffi@goffi.org>
parents: 2188
diff changeset
612 default = list(choices)[0]
2155
cee6561ad086 jp (core): added extra_outputs:
Goffi <goffi@goffi.org>
parents: 2151
diff changeset
613 output_parent.add_argument('--output', '-O', choices=sorted(choices), default=default, help=_(u"select output format (default: {})".format(default)))
cee6561ad086 jp (core): added extra_outputs:
Goffi <goffi@goffi.org>
parents: 2151
diff changeset
614 output_parent.add_argument('--output-option', '--oo', type=unicode_decoder, action="append", dest='output_opts', default=[], help=_(u"output specific option"))
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
615 parents.add(output_parent)
2155
cee6561ad086 jp (core): added extra_outputs:
Goffi <goffi@goffi.org>
parents: 2151
diff changeset
616 else:
cee6561ad086 jp (core): added extra_outputs:
Goffi <goffi@goffi.org>
parents: 2151
diff changeset
617 assert extra_outputs is None
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
618
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
619 # other common options
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
620 use_opts = {k:v for k,v in kwargs.iteritems() if k.startswith('use_')}
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
621 for param, do_use in use_opts.iteritems():
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
622 opt=param[4:] # if param is use_verbose, opt is verbose
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
623 if opt not in self.host.parents:
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
624 raise exceptions.InternalError(u"Unknown parent option {}".format(opt))
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
625 del kwargs[param]
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
626 if do_use:
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
627 parents.add(self.host.parents[opt])
1600
8d41cd4da2f6 jp: added a --verbose command
Goffi <goffi@goffi.org>
parents: 1594
diff changeset
628
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
629 self.parser = host.subparsers.add_parser(name, help=help, **kwargs)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
630 if hasattr(self, "subcommands"):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
631 self.subparsers = self.parser.add_subparsers()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
632 else:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
633 self.parser.set_defaults(func=self.run)
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
634 self.add_parser_options()
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
635
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
636 @property
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
637 def args(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
638 return self.host.args
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
639
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
640 @property
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
641 def profile(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
642 return self.host.profile
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
643
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
644 @property
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
645 def progress_id(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
646 return self.host.progress_id
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
647
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
648 @progress_id.setter
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
649 def progress_id(self, value):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
650 self.host.progress_id = value
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
651
1627
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
652 def progressStartedHandler(self, uid, metadata, profile):
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
653 if profile != self.profile:
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
654 return
1642
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
655 if self.progress_id is None:
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
656 # the progress started message can be received before the id
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
657 # so we keep progressStarted signals in cache to replay they
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
658 # when the progress_id is received
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
659 cache_data = (self.progressStartedHandler, uid, metadata, profile)
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
660 try:
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
661 self.host.progress_ids_cache.append(cache_data)
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
662 except AttributeError:
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
663 self.host.progress_ids_cache = [cache_data]
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
664 else:
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
665 if self.host.watch_progress and uid == self.progress_id:
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
666 self.onProgressStarted(metadata)
2098
e0066920a661 primitivus, jp: dynamic bridge + fixed D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 2086
diff changeset
667 self.loop.call_later(PROGRESS_DELAY, self.progressUpdate)
1627
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
668
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
669 def progressFinishedHandler(self, uid, metadata, profile):
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
670 if profile != self.profile:
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
671 return
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
672 if uid == self.progress_id:
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
673 try:
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
674 self.host.pbar.finish()
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
675 except AttributeError:
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
676 pass
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
677 self.onProgressFinished(metadata)
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
678 if self.host.quit_on_progress_end:
1918
01d56efd488b jp: fixed traceback shown on a normal quit when a progression is finished
Goffi <goffi@goffi.org>
parents: 1884
diff changeset
679 self.host.quitFromSignal()
1627
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
680
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
681 def progressErrorHandler(self, uid, message, profile):
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
682 if profile != self.profile:
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
683 return
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
684 if uid == self.progress_id:
1641
44a14f83e64b jp (base): fixed verbose option + there is a new line on ProgressErrorHandler only if the progress bar is actually displayed
Goffi <goffi@goffi.org>
parents: 1627
diff changeset
685 if self.args.progress:
44a14f83e64b jp (base): fixed verbose option + there is a new line on ProgressErrorHandler only if the progress bar is actually displayed
Goffi <goffi@goffi.org>
parents: 1627
diff changeset
686 self.disp('') # progress is not finished, so we skip a line
1627
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
687 if self.host.quit_on_progress_end:
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
688 self.onProgressError(message)
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
689 self.host.quitFromSignal(1)
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
690
1832
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
691 def progressUpdate(self):
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
692 """This method is continualy called to update the progress bar"""
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
693 data = self.host.bridge.progressGet(self.progress_id, self.profile)
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
694 if data:
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
695 try:
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
696 size = data['size']
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
697 except KeyError:
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
698 self.disp(_(u"file size is not known, we can't show a progress bar"), 1, error=True)
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
699 return False
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
700 if self.host.pbar is None:
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
701 #first answer, we must construct the bar
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
702 self.host.pbar = progressbar.ProgressBar(int(size),
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
703 [_(u"Progress: "),progressbar.Percentage(),
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
704 " ",
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
705 progressbar.Bar(),
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
706 " ",
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
707 progressbar.FileTransferSpeed(),
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
708 " ",
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
709 progressbar.ETA()])
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
710 self.host.pbar.start()
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
711
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
712 self.host.pbar.update(int(data['position']))
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
713
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
714 elif self.host.pbar is not None:
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
715 return False
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
716
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
717 self.onProgressUpdate(data)
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
718
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
719 return True
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
720
1627
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
721 def onProgressStarted(self, metadata):
1832
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
722 """Called when progress has just started
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
723
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
724 can be overidden by a command
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
725 @param metadata(dict): metadata as sent by bridge.progressStarted
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
726 """
1627
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
727 self.disp(_(u"Operation started"), 2)
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
728
1832
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
729 def onProgressUpdate(self, metadata):
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
730 """Method called on each progress updata
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
731
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
732 can be overidden by a command to handle progress metadata
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
733 @para metadata(dict): metadata as returned by bridge.progressGet
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
734 """
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
735 pass
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
736
1627
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
737 def onProgressFinished(self, metadata):
1832
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
738 """Called when progress has just finished
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
739
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
740 can be overidden by a command
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
741 @param metadata(dict): metadata as sent by bridge.progressFinished
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
742 """
1627
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
743 self.disp(_(u"Operation successfully finished"), 2)
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
744
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
745 def onProgressError(self, error_msg):
1832
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
746 """Called when a progress failed
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
747
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
748 @param error_msg(unicode): error message as sent by bridge.progressError
39545dc527a1 jp: an onProgressUpdate method is now called on each progress update, allowing to handle metadata
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
749 """
1627
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
750 self.disp(_(u"Error while doing operation: {}").format(error_msg), error=True)
5a641e7b858a jp (base, file): use of new progress API. Progress callbacks are managed through CommandBase.onProgress* method instead of host attributes.
Goffi <goffi@goffi.org>
parents: 1623
diff changeset
751
1605
0aded9648c5c jp (base): added a self.disp method which manage verbosity and stderr + verbosity property
Goffi <goffi@goffi.org>
parents: 1604
diff changeset
752 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
753 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
754
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
755 def output(self, data):
2193
33b82250eadd jp (base): raise InternalError if output is used when use_output is not declared
Goffi <goffi@goffi.org>
parents: 2189
diff changeset
756 try:
33b82250eadd jp (base): raise InternalError if output is used when use_output is not declared
Goffi <goffi@goffi.org>
parents: 2189
diff changeset
757 output_type = self._output_type
33b82250eadd jp (base): raise InternalError if output is used when use_output is not declared
Goffi <goffi@goffi.org>
parents: 2189
diff changeset
758 except AttributeError:
33b82250eadd jp (base): raise InternalError if output is used when use_output is not declared
Goffi <goffi@goffi.org>
parents: 2189
diff changeset
759 raise exceptions.InternalError(_(u'trying to use output when use_output has not been set'))
33b82250eadd jp (base): raise InternalError if output is used when use_output is not declared
Goffi <goffi@goffi.org>
parents: 2189
diff changeset
760 return self.host.output(output_type, self.args.output, self.extra_outputs, data)
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents: 1945
diff changeset
761
2213
1010054cf771 jp (base): added msg and exit_code argument to errback so it's more generic
Goffi <goffi@goffi.org>
parents: 2193
diff changeset
762 def errback(self, failure_, msg=None, exit_code=C.EXIT_ERROR):
2178
b9bfc45cea22 jp (base): added generic errback to CommandBase + show error message on plugin ImportError
Goffi <goffi@goffi.org>
parents: 2168
diff changeset
763 """generic callback for errbacks
b9bfc45cea22 jp (base): added generic errback to CommandBase + show error message on plugin ImportError
Goffi <goffi@goffi.org>
parents: 2168
diff changeset
764
b9bfc45cea22 jp (base): added generic errback to CommandBase + show error message on plugin ImportError
Goffi <goffi@goffi.org>
parents: 2168
diff changeset
765 display failure_ then quit with generic error
b9bfc45cea22 jp (base): added generic errback to CommandBase + show error message on plugin ImportError
Goffi <goffi@goffi.org>
parents: 2168
diff changeset
766 @param failure_: arguments returned by errback
2213
1010054cf771 jp (base): added msg and exit_code argument to errback so it's more generic
Goffi <goffi@goffi.org>
parents: 2193
diff changeset
767 @param msg(unicode, None): message template
1010054cf771 jp (base): added msg and exit_code argument to errback so it's more generic
Goffi <goffi@goffi.org>
parents: 2193
diff changeset
768 use {} if you want to display failure message
1010054cf771 jp (base): added msg and exit_code argument to errback so it's more generic
Goffi <goffi@goffi.org>
parents: 2193
diff changeset
769 @param exit_code(int): shell exit code
2178
b9bfc45cea22 jp (base): added generic errback to CommandBase + show error message on plugin ImportError
Goffi <goffi@goffi.org>
parents: 2168
diff changeset
770 """
2213
1010054cf771 jp (base): added msg and exit_code argument to errback so it's more generic
Goffi <goffi@goffi.org>
parents: 2193
diff changeset
771 if msg is None:
1010054cf771 jp (base): added msg and exit_code argument to errback so it's more generic
Goffi <goffi@goffi.org>
parents: 2193
diff changeset
772 msg = _(u"error: {}")
1010054cf771 jp (base): added msg and exit_code argument to errback so it's more generic
Goffi <goffi@goffi.org>
parents: 2193
diff changeset
773 self.disp(msg.format(failure_), error=True)
1010054cf771 jp (base): added msg and exit_code argument to errback so it's more generic
Goffi <goffi@goffi.org>
parents: 2193
diff changeset
774 self.host.quit(exit_code)
2178
b9bfc45cea22 jp (base): added generic errback to CommandBase + show error message on plugin ImportError
Goffi <goffi@goffi.org>
parents: 2168
diff changeset
775
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
776 def add_parser_options(self):
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
777 try:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
778 subcommands = self.subcommands
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
779 except AttributeError:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
780 # We don't have subcommands, the class need to implements add_parser_options
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
781 raise NotImplementedError
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
782
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
783 # now we add subcommands to ourself
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
784 for cls in subcommands:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
785 cls(self)
814
59c7bc51c323 jp: refactoring using ArgParse
Dal <kedals0@gmail.com>
parents: 811
diff changeset
786
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
787 def run(self):
1862
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
788 """this method is called when a command is actually run
1395
1ae9aa94c351 jp: fixed bad try/except hidding errors + fixed bad management of jids without node
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
789
1862
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
790 It set stuff like progression callbacks and profile connection
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
791 You should not overide this method: you should call self.start instead
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
792 """
2155
cee6561ad086 jp (core): added extra_outputs:
Goffi <goffi@goffi.org>
parents: 2151
diff changeset
793 # we keep a reference to run command, it may be useful e.g. for outputs
cee6561ad086 jp (core): added extra_outputs:
Goffi <goffi@goffi.org>
parents: 2151
diff changeset
794 self.host.command = self
1863
b2ddd7f5dcdf jp (base): refactored need_loop so it is set only when the command is run. It can now be set in __init__ methods of commands classes
Goffi <goffi@goffi.org>
parents: 1862
diff changeset
795 # host._need_loop is set here from our current value and not before
b2ddd7f5dcdf jp (base): refactored need_loop so it is set only when the command is run. It can now be set in __init__ methods of commands classes
Goffi <goffi@goffi.org>
parents: 1862
diff changeset
796 # as the need_loop decision must be taken only by then running command
b2ddd7f5dcdf jp (base): refactored need_loop so it is set only when the command is run. It can now be set in __init__ methods of commands classes
Goffi <goffi@goffi.org>
parents: 1862
diff changeset
797 self.host._need_loop = self.need_loop
b2ddd7f5dcdf jp (base): refactored need_loop so it is set only when the command is run. It can now be set in __init__ methods of commands classes
Goffi <goffi@goffi.org>
parents: 1862
diff changeset
798
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
799 try:
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
800 show_progress = self.args.progress
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
801 except AttributeError:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
802 # the command doesn't use progress bar
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
803 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
804 else:
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
805 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
806 self.host.watch_progress = True
1642
7ec7ce9cdc4c jp (base): progressStarted signals are cached until progress_id is known, this avoid missing the progression if we have the signal before the id.
Goffi <goffi@goffi.org>
parents: 1641
diff changeset
807 # we need to register the following signal even if we don't display the progress bar
2119
469702b46768 jp (core): fixed signal registration for progressions
Goffi <goffi@goffi.org>
parents: 2114
diff changeset
808 self.host.bridge.register_signal("progressStarted", self.progressStartedHandler)
469702b46768 jp (core): fixed signal registration for progressions
Goffi <goffi@goffi.org>
parents: 2114
diff changeset
809 self.host.bridge.register_signal("progressFinished", self.progressFinishedHandler)
469702b46768 jp (core): fixed signal registration for progressions
Goffi <goffi@goffi.org>
parents: 2114
diff changeset
810 self.host.bridge.register_signal("progressError", self.progressErrorHandler)
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
811
1862
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
812 if self.need_connect is not None:
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
813 self.host.connect_profile(self.connected)
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
814 else:
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
815 self.start()
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
816
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
817 def connected(self):
1862
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
818 """this method is called when profile is connected (or session is started)
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
819
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
820 this method is only called when use_profile is True
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
821 most of time you should override self.start instead of this method, but if loop
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
822 if not always needed depending on your arguments, you may override this method,
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
823 but don't forget to call the parent one (i.e. this one) after self.need_loop is set
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
824 """
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
825 if not self.need_loop:
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
826 self.host.stop_loop()
1862
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
827 self.start()
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
828
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
829 def start(self):
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
830 """This is the starting point of the command, this method should be overriden
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
831
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
832 at this point, profile are connected if needed
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
833 """
6d9c87bdc452 jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
Goffi <goffi@goffi.org>
parents: 1860
diff changeset
834 pass
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
835
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
836
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
837 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
838 """Specialised commands which answer to specific actions
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
839
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
840 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
841 """
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
842 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
843 # 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
844 # 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
845 # 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
846
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
847 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
848 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
849 return
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
850 try:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
851 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
852 except KeyError:
1840
9eabf7fadfdd frontends (jp): onActionNew displays xmlui message if no meta_type is defined and xmlui is defined
souliane <souliane@mailoo.org>
parents: 1832
diff changeset
853 try:
9eabf7fadfdd frontends (jp): onActionNew displays xmlui message if no meta_type is defined and xmlui is defined
souliane <souliane@mailoo.org>
parents: 1832
diff changeset
854 xml_ui = action_data["xmlui"]
9eabf7fadfdd frontends (jp): onActionNew displays xmlui message if no meta_type is defined and xmlui is defined
souliane <souliane@mailoo.org>
parents: 1832
diff changeset
855 except KeyError:
9eabf7fadfdd frontends (jp): onActionNew displays xmlui message if no meta_type is defined and xmlui is defined
souliane <souliane@mailoo.org>
parents: 1832
diff changeset
856 pass
9eabf7fadfdd frontends (jp): onActionNew displays xmlui message if no meta_type is defined and xmlui is defined
souliane <souliane@mailoo.org>
parents: 1832
diff changeset
857 else:
9eabf7fadfdd frontends (jp): onActionNew displays xmlui message if no meta_type is defined and xmlui is defined
souliane <souliane@mailoo.org>
parents: 1832
diff changeset
858 self.onXMLUI(xml_ui)
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
859 else:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
860 try:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
861 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
862 except KeyError:
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
863 pass
0
goffi@necton2
parents:
diff changeset
864 else:
1606
de785fcf9a7b jp (base, file): file command and progress fixes and adaptation to new API:
Goffi <goffi@goffi.org>
parents: 1605
diff changeset
865 callback(action_data, action_id, security_limit, profile)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
866
1840
9eabf7fadfdd frontends (jp): onActionNew displays xmlui message if no meta_type is defined and xmlui is defined
souliane <souliane@mailoo.org>
parents: 1832
diff changeset
867 def onXMLUI(self, xml_ui):
9eabf7fadfdd frontends (jp): onActionNew displays xmlui message if no meta_type is defined and xmlui is defined
souliane <souliane@mailoo.org>
parents: 1832
diff changeset
868 """Display a dialog received from the backend.
9eabf7fadfdd frontends (jp): onActionNew displays xmlui message if no meta_type is defined and xmlui is defined
souliane <souliane@mailoo.org>
parents: 1832
diff changeset
869
9eabf7fadfdd frontends (jp): onActionNew displays xmlui message if no meta_type is defined and xmlui is defined
souliane <souliane@mailoo.org>
parents: 1832
diff changeset
870 @param xml_ui (unicode): dialog XML representation
9eabf7fadfdd frontends (jp): onActionNew displays xmlui message if no meta_type is defined and xmlui is defined
souliane <souliane@mailoo.org>
parents: 1832
diff changeset
871 """
9eabf7fadfdd frontends (jp): onActionNew displays xmlui message if no meta_type is defined and xmlui is defined
souliane <souliane@mailoo.org>
parents: 1832
diff changeset
872 # FIXME: we temporarily use ElementTree, but a real XMLUI managing module
9eabf7fadfdd frontends (jp): onActionNew displays xmlui message if no meta_type is defined and xmlui is defined
souliane <souliane@mailoo.org>
parents: 1832
diff changeset
873 # should be available in the future
9eabf7fadfdd frontends (jp): onActionNew displays xmlui message if no meta_type is defined and xmlui is defined
souliane <souliane@mailoo.org>
parents: 1832
diff changeset
874 # TODO: XMLUI module
9eabf7fadfdd frontends (jp): onActionNew displays xmlui message if no meta_type is defined and xmlui is defined
souliane <souliane@mailoo.org>
parents: 1832
diff changeset
875 ui = ET.fromstring(xml_ui.encode('utf-8'))
9eabf7fadfdd frontends (jp): onActionNew displays xmlui message if no meta_type is defined and xmlui is defined
souliane <souliane@mailoo.org>
parents: 1832
diff changeset
876 dialog = ui.find("dialog")
9eabf7fadfdd frontends (jp): onActionNew displays xmlui message if no meta_type is defined and xmlui is defined
souliane <souliane@mailoo.org>
parents: 1832
diff changeset
877 if dialog is not None:
9eabf7fadfdd frontends (jp): onActionNew displays xmlui message if no meta_type is defined and xmlui is defined
souliane <souliane@mailoo.org>
parents: 1832
diff changeset
878 self.disp(dialog.findtext("message"), error=dialog.get("level") == "error")
9eabf7fadfdd frontends (jp): onActionNew displays xmlui message if no meta_type is defined and xmlui is defined
souliane <souliane@mailoo.org>
parents: 1832
diff changeset
879
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
880 def connected(self):
401
b2caa2615c4c jp roster name manegement + Pipe transfer
Goffi <goffi@goffi.org>
parents: 393
diff changeset
881 """Auto reply to confirmations requests"""
817
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
882 self.need_loop = True
c39117d00f35 jp: refactoring:
Goffi <goffi@goffi.org>
parents: 814
diff changeset
883 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
884 self.host.bridge.register("actionNew", self.onActionNew)
1623
ec48b35309dc jp: use the new actionsGet method
Goffi <goffi@goffi.org>
parents: 1606
diff changeset
885 actions = self.host.bridge.actionsGet(self.profile)
ec48b35309dc jp: use the new actionsGet method
Goffi <goffi@goffi.org>
parents: 1606
diff changeset
886 for action_data, action_id, security_limit in actions:
ec48b35309dc jp: use the new actionsGet method
Goffi <goffi@goffi.org>
parents: 1606
diff changeset
887 self.onActionNew(action_data, action_id, security_limit, self.profile)