| ... |
... |
@@ -15,6 +15,12 @@ |
|
15
|
15
|
# You should have received a copy of the GNU General Public License
|
|
16
|
16
|
# along with this program; If not, see <http://www.gnu.org/licenses/>.
|
|
17
|
17
|
|
|
|
18
|
+from __future__ import annotations
|
|
|
19
|
+
|
|
|
20
|
+from typing import Any
|
|
|
21
|
+from typing import Optional
|
|
|
22
|
+from typing import Callable
|
|
|
23
|
+
|
|
18
|
24
|
import weakref
|
|
19
|
25
|
import inspect
|
|
20
|
26
|
import logging
|
| ... |
... |
@@ -22,11 +28,12 @@ from enum import IntEnum |
|
22
|
28
|
from functools import wraps
|
|
23
|
29
|
|
|
24
|
30
|
from gi.repository import Soup
|
|
|
31
|
+from nbxmpp.modules.base import BaseModule
|
|
25
|
32
|
|
|
|
33
|
+from nbxmpp.simplexml import Node
|
|
26
|
34
|
from nbxmpp.errors import is_error
|
|
27
|
35
|
from nbxmpp.errors import CancelledError
|
|
28
|
36
|
from nbxmpp.errors import TimeoutStanzaError
|
|
29
|
|
-from nbxmpp.simplexml import Node
|
|
30
|
37
|
from nbxmpp.modules.util import make_func_arguments_string
|
|
31
|
38
|
|
|
32
|
39
|
|
| ... |
... |
@@ -66,7 +73,10 @@ class TaskState(IntEnum): |
|
66
|
73
|
return self == TaskState.CANCELLED
|
|
67
|
74
|
|
|
68
|
75
|
|
|
69
|
|
-def _setup_task(task, client, callback, user_data):
|
|
|
76
|
+def _setup_task(task: Task,
|
|
|
77
|
+ client: Any,
|
|
|
78
|
+ callback: Optional[Callable[..., Any]],
|
|
|
79
|
+ user_data: Any):
|
|
70
|
80
|
client.add_task(task)
|
|
71
|
81
|
task.set_finalize_func(client.remove_task)
|
|
72
|
82
|
task.set_user_data(user_data)
|
| ... |
... |
@@ -78,7 +88,12 @@ def _setup_task(task, client, callback, user_data): |
|
78
|
88
|
|
|
79
|
89
|
def iq_request_task(func):
|
|
80
|
90
|
@wraps(func)
|
|
81
|
|
- def func_wrapper(self, *args, timeout=None, callback=None, user_data=None, **kwargs):
|
|
|
91
|
+ def func_wrapper(self: BaseModule,
|
|
|
92
|
+ *args,
|
|
|
93
|
+ timeout: Optional[int] = None,
|
|
|
94
|
+ callback: Optional[Callable[..., Any]] = None,
|
|
|
95
|
+ user_data: Any = None,
|
|
|
96
|
+ **kwargs):
|
|
82
|
97
|
if self._log.isEnabledFor(logging.INFO):
|
|
83
|
98
|
self._log.info(make_func_arguments_string(func, self, args, kwargs))
|
|
84
|
99
|
task = IqRequestTask(func(self, *args, **kwargs),
|
| ... |
... |
@@ -122,24 +137,26 @@ class Task: |
|
122
|
137
|
|
|
123
|
138
|
_process_types = (NoType,)
|
|
124
|
139
|
|
|
125
|
|
- def __init__(self, gen, logger=log):
|
|
|
140
|
+ def __init__(self, gen, logger: logging.Logger = log):
|
|
126
|
141
|
self._logger = logger
|
|
127
|
142
|
self._gen = gen
|
|
128
|
|
- self._done_callbacks = []
|
|
|
143
|
+ self._done_callbacks: list[Callable[..., Any]] = []
|
|
129
|
144
|
self._sub_task = None
|
|
130
|
145
|
self._result = None
|
|
131
|
146
|
self._error = None
|
|
132
|
|
- self._user_data = None
|
|
133
|
|
- self._timeout = None
|
|
|
147
|
+ self._user_data: Optional[Any] = None
|
|
|
148
|
+ self._timeout: Optional[int] = None
|
|
134
|
149
|
self._finalize_func = None
|
|
135
|
150
|
self._finalize_context = None
|
|
136
|
151
|
self._state = TaskState.INIT
|
|
137
|
152
|
|
|
138
|
153
|
@property
|
|
139
|
|
- def state(self):
|
|
|
154
|
+ def state(self) -> TaskState:
|
|
140
|
155
|
return self._state
|
|
141
|
156
|
|
|
142
|
|
- def add_done_callback(self, callback, weak=True):
|
|
|
157
|
+ def add_done_callback(self,
|
|
|
158
|
+ callback: Callable[..., Any],
|
|
|
159
|
+ weak: bool = True):
|
|
143
|
160
|
if self._state.is_finished or self._state.is_cancelled:
|
|
144
|
161
|
raise RuntimeError('Task is finished')
|
|
145
|
162
|
|
| ... |
... |
@@ -153,7 +170,7 @@ class Task: |
|
153
|
170
|
|
|
154
|
171
|
self._done_callbacks.append(callback)
|
|
155
|
172
|
|
|
156
|
|
- def set_timeout(self, timeout):
|
|
|
173
|
+ def set_timeout(self, timeout: Optional[int]):
|
|
157
|
174
|
self._timeout = timeout
|
|
158
|
175
|
|
|
159
|
176
|
def start(self):
|
| ... |
... |
@@ -170,7 +187,7 @@ class Task: |
|
170
|
187
|
def _async_finished(self, *args, **kwargs):
|
|
171
|
188
|
raise NotImplementedError
|
|
172
|
189
|
|
|
173
|
|
- def _sub_task_completed(self, task):
|
|
|
190
|
+ def _sub_task_completed(self, task: Task):
|
|
174
|
191
|
self._sub_task = None
|
|
175
|
192
|
if not self._state.is_running:
|
|
176
|
193
|
return
|
| ... |
... |
@@ -255,13 +272,15 @@ class Task: |
|
255
|
272
|
raise self._error # pylint: disable=raising-bad-type
|
|
256
|
273
|
return self._result
|
|
257
|
274
|
|
|
258
|
|
- def set_user_data(self, user_data):
|
|
|
275
|
+ def set_user_data(self, user_data: Any):
|
|
259
|
276
|
self._user_data = user_data
|
|
260
|
277
|
|
|
261
|
|
- def get_user_data(self):
|
|
|
278
|
+ def get_user_data(self) -> Any:
|
|
262
|
279
|
return self._user_data
|
|
263
|
280
|
|
|
264
|
|
- def set_finalize_func(self, func, context=None):
|
|
|
281
|
+ def set_finalize_func(self,
|
|
|
282
|
+ func: Callable[..., Any],
|
|
|
283
|
+ context: Optional[Any] = None):
|
|
265
|
284
|
self._finalize_func = func
|
|
266
|
285
|
self._finalize_context = context
|
|
267
|
286
|
|
| ... |
... |
@@ -302,7 +321,7 @@ class IqRequestTask(Task): |
|
302
|
321
|
self._client = client
|
|
303
|
322
|
self._iq_id = None
|
|
304
|
323
|
|
|
305
|
|
- def _run_async(self, stanza):
|
|
|
324
|
+ def _run_async(self, stanza: Node):
|
|
306
|
325
|
self._iq_id = self._client.send_stanza(stanza,
|
|
307
|
326
|
callback=self._async_finished,
|
|
308
|
327
|
timeout=self._timeout)
|