1 | #!/usr/bin/env python |
||
2 | # -*- coding: utf-8 -*- |
||
3 | |||
4 | import logging |
||
5 | logger = logging.getLogger(__name__) |
||
6 | logger.debug("%s loaded", __name__) |
||
7 | |||
8 | import threading |
||
9 | import datetime |
||
0 ignored issues
–
show
Unused Code
introduced
by
Loading history...
|
|||
10 | import time |
||
0 ignored issues
–
show
|
|||
11 | import os |
||
0 ignored issues
–
show
|
|||
12 | import pjsua as pj |
||
13 | from doorpi import DoorPi |
||
14 | from SipPhoneCallCallBack import SipPhoneCallCallBack as CallCallback |
||
15 | |||
16 | class SipPhoneAccountCallBack(pj.AccountCallback): |
||
17 | |||
18 | sem = None |
||
19 | |||
20 | def __init__(self, account = None): |
||
21 | logger.debug("__init__") |
||
22 | pj.AccountCallback.__init__(self, account) |
||
23 | DoorPi().event_handler.register_event('BeforeCallIncoming', __name__) |
||
24 | DoorPi().event_handler.register_event('OnCallReconnect', __name__) |
||
25 | DoorPi().event_handler.register_event('AfterCallReconnect', __name__) |
||
26 | DoorPi().event_handler.register_event('OnCallBusy', __name__) |
||
27 | DoorPi().event_handler.register_event('AfterCallBusy', __name__) |
||
28 | DoorPi().event_handler.register_event('OnCallIncoming', __name__) |
||
29 | DoorPi().event_handler.register_event('AfterCallIncoming', __name__) |
||
30 | DoorPi().event_handler.register_event('OnCallReject', __name__) |
||
31 | DoorPi().event_handler.register_event('AfterCallReject', __name__) |
||
32 | #DoorPi().event_handler.register_event('AfterAccountRegState', __name__) |
||
33 | |||
34 | def __del__(self): |
||
35 | self.destroy() |
||
36 | |||
37 | def destroy(self): |
||
38 | logger.debug("destroy") |
||
39 | DoorPi().event_handler.unregister_source(__name__, True) |
||
40 | |||
41 | def wait(self): |
||
42 | self.sem = threading.Semaphore(0) |
||
43 | self.sem.acquire() |
||
44 | |||
45 | def on_reg_state(self): |
||
46 | if self.sem: |
||
47 | if self.account.info().reg_status >= 200: |
||
48 | self.sem.release() |
||
49 | |||
50 | #DoorPi().event_handler('AfterAccountRegState', __name__) |
||
51 | #logger.debug(self.account.info.reg_status) |
||
52 | |||
53 | def answer_call(self, call): |
||
54 | DoorPi().sipphone.current_callcallback = CallCallback() |
||
55 | call.set_callback(DoorPi().sipphone.current_callcallback) |
||
56 | DoorPi().sipphone.current_call = call |
||
57 | DoorPi().sipphone.current_call.answer(code = 200) |
||
58 | |||
59 | def on_incoming_call(self, call): |
||
60 | # SIP-Status-Codes: http://de.wikipedia.org/wiki/SIP-Status-Codes |
||
61 | # 200 = OK |
||
62 | # 401 = Unauthorized |
||
63 | # 403 = Forbidden |
||
64 | # 486 = Busy Here |
||
65 | # 494 = Security Agreement Required |
||
66 | logger.debug("on_incoming_call") |
||
67 | logger.info("Incoming call from %s", str(call.info().remote_uri)) |
||
68 | DoorPi().event_handler('BeforeCallIncoming', __name__) |
||
69 | |||
70 | call.answer(180) |
||
71 | |||
72 | if DoorPi().sipphone.current_call is not None and DoorPi().sipphone.current_call.is_valid(): |
||
73 | logger.debug("Incoming call while another call is active") |
||
74 | logger.debug("- incoming.remote_uri: %s", call.info().remote_uri) |
||
75 | logger.debug("- current.remote_uri : %s", DoorPi().sipphone.current_call.info().remote_uri) |
||
76 | |||
77 | View Code Duplication | if call.info().remote_uri == DoorPi().sipphone.current_call.info().remote_uri: |
|
78 | logger.info("Current call is incoming call - quitting current and connecting to incoming. Maybe connection reset?") |
||
79 | DoorPi().event_handler('OnCallReconnect', __name__, {'remote_uri': call.info().remote_uri}) |
||
80 | DoorPi().current_call.hangup() |
||
81 | self.answer_call(call) |
||
82 | DoorPi().event_handler('AfterCallReconnect', __name__) |
||
83 | return |
||
84 | else: |
||
85 | logger.info("Incoming and current call are different - sending busy signal to incoming call") |
||
86 | DoorPi().event_handler('OnCallBusy', __name__, {'remote_uri': call.info().remote_uri}) |
||
87 | call.answer(code = 494, reason = "Security Agreement Required") |
||
88 | DoorPi().event_handler('AfterCallBusy', __name__) |
||
89 | return |
||
90 | |||
91 | View Code Duplication | if DoorPi().sipphone.is_admin_number(call.info().remote_uri): |
|
92 | logger.debug("Incoming call from trusted admin number %s -> autoanswer", call.info().remote_uri) |
||
93 | DoorPi().event_handler('OnCallIncoming', __name__, {'remote_uri': call.info().remote_uri}) |
||
94 | self.answer_call(call) |
||
95 | DoorPi().event_handler('AfterCallIncoming', __name__) |
||
96 | return |
||
97 | else: |
||
98 | logger.debug("Incoming call ist not from a trusted admin number %s -> sending busy signal", call.info().remote_uri) |
||
99 | DoorPi().event_handler('OnCallReject', __name__, {'remote_uri': call.info().remote_uri}) |
||
100 | call.answer(code = 494, reason = "Security Agreement Required") |
||
101 | DoorPi().event_handler('AfterCallReject', __name__) |
||
102 | return |