Completed
Push — master ( 0bc61b...16fc24 )
by Thomas
8s
created

sipphone/pjsua_lib/SipPhoneAccountCallBack.py (3 issues)

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
The import datetime seems to be unused.
Loading history...
10
import time
0 ignored issues
show
The import time seems to be unused.
Loading history...
11
import os
0 ignored issues
show
The import os seems to be unused.
Loading history...
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
            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
        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