| Total Complexity | 13 | 
| Total Lines | 87 | 
| Duplicated Lines | 28.74 % | 
Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
| 1 | #!/usr/bin/env python  | 
            ||
| 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  |