Issues (158)

sipphone/pjsua_lib/SipPhoneAccountCallBack.py (2 issues)

Enable duplicate code detection for Python code

Duplication Informational
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
10
import time
11
import os
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:
0 ignored issues
show
This code seems to be duplicated in your project.
Loading history...
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):
0 ignored issues
show
This code seems to be duplicated in your project.
Loading history...
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