Mercurial > libervia-backend
annotate sat/tools/stream.py @ 3178:98b321234068
plugin aesgcm: use 12 bytes Initialisation Vector:
SàT was using 16 bytes IV when sending files withr AES-GCM, due to ChatSecure being only
compatible with that. Monal, an other iOS client is only compatible with 12 bytes IV, and
ChatSecure has fixed its code to also handle 12 bytes IV, so there is not reason anymore
to use 16 bytes, and SàT now uses 12 bytes.
author | Goffi <goffi@goffi.org> |
---|---|
date | Tue, 18 Feb 2020 18:17:18 +0100 |
parents | 559a625a236b |
children | f2bb57348587 |
rev | line source |
---|---|
3028 | 1 #!/usr/bin/env python3 |
3137 | 2 |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
4 # SAT: a jabber client |
3136 | 5 # Copyright (C) 2009-2020 Jérôme Poisson (goffi@goffi.org) |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # This program is free software: you can redistribute it and/or modify |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # it under the terms of the GNU Affero General Public License as published by |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # the Free Software Foundation, either version 3 of the License, or |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 # (at your option) any later version. |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # This program is distributed in the hope that it will be useful, |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 # GNU Affero General Public License for more details. |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # You should have received a copy of the GNU Affero General Public License |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
20 """ interfaces """ |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
21 |
3087
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
22 import uuid |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
23 import os |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
24 from zope import interface |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
25 from sat.core import exceptions |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
26 from sat.core.constants import Const as C |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
27 from sat.core.log import getLogger |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
28 from twisted.protocols import basic |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 from twisted.internet import interfaces |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
30 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
31 log = getLogger(__name__) |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
32 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
33 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
34 class IStreamProducer(interface.Interface): |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
35 def startStream(consumer): |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
36 """start producing the stream |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
37 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
38 @return (D): deferred fired when stream is finished |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
39 """ |
2866
8ce5748bfe97
plugin XEP-0363: updated to namespace "urn:xmpp:http:upload:0", handle headers
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
40 pass |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
41 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
42 |
3087
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
43 class SatFile: |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
44 """A file-like object to have high level files manipulation""" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
45 |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
46 # TODO: manage "with" statement |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
47 |
2866
8ce5748bfe97
plugin XEP-0363: updated to namespace "urn:xmpp:http:upload:0", handle headers
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
48 def __init__(self, host, client, path, mode="rb", uid=None, size=None, data_cb=None, |
3087
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
49 auto_end_signals=True, check_size_with_read=False): |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
50 """ |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
51 @param host: %(doc_host)s |
3087
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
52 @param path(Path, str): path to the file to get or write to |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
53 @param mode(str): same as for built-in "open" function |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
54 @param uid(unicode, None): unique id identifing this progressing element |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
55 This uid will be used with self.host.progressGet |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
56 will be automaticaly generated if None |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
57 @param size(None, int): size of the file (when known in advance) |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
58 @param data_cb(None, callable): method to call on each data read/write |
3087
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
59 can be used to do processing like calculating hash. |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
60 if data_cb return a non None value, it will be used instead of the |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
61 data read/to write |
2866
8ce5748bfe97
plugin XEP-0363: updated to namespace "urn:xmpp:http:upload:0", handle headers
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
62 @param auto_end_signals(bool): if True, progressFinished and progressError signals |
8ce5748bfe97
plugin XEP-0363: updated to namespace "urn:xmpp:http:upload:0", handle headers
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
63 are automatically sent. |
8ce5748bfe97
plugin XEP-0363: updated to namespace "urn:xmpp:http:upload:0", handle headers
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
64 if False, you'll have to call self.progressFinished and self.progressError |
8ce5748bfe97
plugin XEP-0363: updated to namespace "urn:xmpp:http:upload:0", handle headers
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
65 yourself. |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
66 progressStarted signal is always sent automatically |
3087
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
67 @param check_size_with_read(bool): if True, size well be checked using number of |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
68 bytes read or written. This is useful when data_cb modifiy len of file. |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
69 """ |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
70 self.host = host |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
71 self.profile = client.profile |
3028 | 72 self.uid = uid or str(uuid.uuid4()) |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
73 self._file = open(path, mode) |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
74 self.size = size |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
75 self.data_cb = data_cb |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
76 self.auto_end_signals = auto_end_signals |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
77 metadata = self.getProgressMetadata() |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
78 self.host.registerProgressCb( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
79 self.uid, self.getProgress, metadata, profile=client.profile |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
80 ) |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
81 self.host.bridge.progressStarted(self.uid, metadata, client.profile) |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
82 |
3087
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
83 self._transfer_count = 0 if check_size_with_read else None |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
84 |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
85 @property |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
86 def check_size_with_read(self): |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
87 return self._transfer_count is not None |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
88 |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
89 @check_size_with_read.setter |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
90 def check_size_with_read(self, value): |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
91 if value and self._transfer_count is None: |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
92 self._transfer_count = 0 |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
93 else: |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
94 self._transfer_count = None |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
95 |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
96 def checkSize(self): |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
97 """Check that current size correspond to given size |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
98 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
99 must be used when the transfer is supposed to be finished |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
100 @return (bool): True if the position is the same as given size |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
101 @raise exceptions.NotFound: size has not be specified |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
102 """ |
3087
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
103 if self.check_size_with_read: |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
104 position = self._transfer_count |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
105 else: |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
106 position = self._file.tell() |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
107 if self.size is None: |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
108 raise exceptions.NotFound |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
109 return position == self.size |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
110 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
111 def close(self, progress_metadata=None, error=None): |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
112 """Close the current file |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
113 |
3087
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
114 @param progress_metadata(None, dict): metadata to send with _onProgressFinished |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
115 message |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
116 @param error(None, unicode): set to an error message if progress was not |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
117 successful |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
118 mutually exclusive with progress_metadata |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
119 error can happen even if error is None, if current size differ from given size |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
120 """ |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
121 if self._file.closed: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
122 return # avoid double close (which is allowed) error |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
123 if error is None: |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
124 try: |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
125 size_ok = self.checkSize() |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
126 except exceptions.NotFound: |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
127 size_ok = True |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
128 if not size_ok: |
3028 | 129 error = "declared and actual size mismatch" |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
130 log.warning(error) |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
131 progress_metadata = None |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
132 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
133 self._file.close() |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
134 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
135 if self.auto_end_signals: |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
136 if error is None: |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
137 self.progressFinished(progress_metadata) |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
138 else: |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
139 assert progress_metadata is None |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
140 self.progressError(error) |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
141 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
142 self.host.removeProgressCb(self.uid, self.profile) |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
143 |
3087
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
144 @property |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
145 def closed(self): |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
146 return self._file.closed |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
147 |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
148 def progressFinished(self, metadata=None): |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
149 if metadata is None: |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
150 metadata = {} |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
151 self.host.bridge.progressFinished(self.uid, metadata, self.profile) |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
152 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
153 def progressError(self, error): |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
154 self.host.bridge.progressError(self.uid, error, self.profile) |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
155 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
156 def flush(self): |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
157 self._file.flush() |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
158 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
159 def write(self, buf): |
3087
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
160 if self.data_cb is not None: |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
161 ret = self.data_cb(buf) |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
162 if ret is not None: |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
163 buf = ret |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
164 if self._transfer_count is not None: |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
165 self._transfer_count += len(buf) |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
166 self._file.write(buf) |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
167 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
168 def read(self, size=-1): |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
169 read = self._file.read(size) |
3087
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
170 if self.data_cb is not None: |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
171 ret = self.data_cb(read) |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
172 if ret is not None: |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
173 read = ret |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
174 if self._transfer_count is not None: |
a51f7fce1e2c
tools (stream): data modification on SatFile:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
175 self._transfer_count += len(read) |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
176 return read |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
177 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
178 def seek(self, offset, whence=os.SEEK_SET): |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
179 self._file.seek(offset, whence) |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
180 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
181 def tell(self): |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
182 return self._file.tell() |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
183 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
184 def mode(self): |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
185 return self._file.mode() |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
186 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
187 def getProgressMetadata(self): |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
188 """Return progression metadata as given to progressStarted |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
189 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
190 @return (dict): metadata (check bridge for documentation) |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
191 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
192 metadata = {"type": C.META_TYPE_FILE} |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
193 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
194 mode = self._file.mode |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
195 if "+" in mode: |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
196 pass # we have no direction in read/write modes |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
197 elif mode in ("r", "rb"): |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
198 metadata["direction"] = "out" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
199 elif mode in ("w", "wb"): |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
200 metadata["direction"] = "in" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
201 elif "U" in mode: |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
202 metadata["direction"] = "out" |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
203 else: |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
204 raise exceptions.InternalError |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
205 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
206 metadata["name"] = self._file.name |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
207 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
208 return metadata |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
209 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
210 def getProgress(self, progress_id, profile): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
211 ret = {"position": self._file.tell()} |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
212 if self.size: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
213 ret["size"] = self.size |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
214 return ret |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
215 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
216 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
217 @interface.implementer(IStreamProducer) |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
218 @interface.implementer(interfaces.IConsumer) |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
219 class FileStreamObject(basic.FileSender): |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
220 def __init__(self, host, client, path, **kwargs): |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
221 """ |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
222 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
223 A SatFile will be created and put in self.file_obj |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
224 @param path(unicode): path to the file |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
225 @param **kwargs: kw arguments to pass to SatFile |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
226 """ |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
227 self.file_obj = SatFile(host, client, path, **kwargs) |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
228 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
229 def registerProducer(self, producer, streaming): |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
230 pass |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
231 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
232 def startStream(self, consumer): |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
233 return self.beginFileTransfer(self.file_obj, consumer) |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
234 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
235 def write(self, data): |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
236 self.file_obj.write(data) |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
237 |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
238 def close(self, *args, **kwargs): |
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
239 self.file_obj.close(*args, **kwargs) |