class Client: def __init__(self, name, server_addr): self.SERVER_ADDR = server_addr self.name = name self.voip_params = {u'username': self.name, u'sip_server_pwd': u'12345678abcd', u'sip_server_address': self.SERVER_ADDR, u'sip_server_user': self.name, u'sip_server_transport': u'udp', u'log_level': 1, u'debug': True} self.CALL_ACTIVE = 0 self.myVoip = VoipLib() print "Initializing the Voip Lib..." self.myVoip.init_lib(self.voip_params, self.call_events) print "Registering the account on the Sip Server..." self.myVoip.register_account() self.caller = 0 self.extension = None def set_caller(self, caller): self.caller = caller def set_exten(self, extension): self.extension = extension def call_events(self, voip_event_type, voip_event, params): print "Received event type:%s Event:%s -> Params: %s" % (voip_event_type, voip_event, params) # event triggered when the account registration has been confirmed by the remote Sip Server if voip_event == VoipEvent.ACCOUNT_REGISTERED: print "Account registered" # event triggered when a new call is incoming elif voip_event == VoipEvent.CALL_INCOMING: print "INCOMING CALL From %s" % params["from"] time.sleep(2) print "Answering..." self.myVoip.answer_call() # event triggered when a call has been established elif voip_event == VoipEvent.CALL_ACTIVE: print "The call with %s has been established" % self.myVoip.get_call().get_remote_uri() self.CALL_ACTIVE = 1 # events triggered when the call ends for some reasons elif (voip_event in [VoipEvent.CALL_REMOTE_DISCONNECTION_HANGUP, VoipEvent.CALL_REMOTE_HANGUP, VoipEvent.CALL_HANGUP]): print "End of call." self.CALL_ACTIVE = 0 # event triggered when the library was destroyed elif voip_event == VoipEvent.LIB_DEINITIALIZED: print "Lib Destroyed. Exiting from the app." return # just print informations about other events triggered by the library else: print "Received unhandled event type:%s --> %s" % (voip_event_type, voip_event) def start_call(self): if self.caller == 1: print "Making a call dialing the extension: %s" % self.extension self.myVoip.make_call(self.extension) def hangup(self): self.myVoip.hangup_call() def end(self): self.myVoip.destroy_lib()
class Uzim(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) self.title_font30 = tkfont.Font(family='Helvetica', size=30, weight="bold") self.title_font25 = tkfont.Font(family='Helvetica', size=25, weight="bold") self.title_font15 = tkfont.Font(family='Helvetica', size=15, weight="bold") self.title("Uzim") # instantiate the lib self.my_voip = VoipLib() # the container is where we'll stack a bunch of frames # on top of each other, then the one we want visible # will be raised above the others container = tk.Frame(self) container.pack(side="top", fill="both", expand=True) container.grid_rowconfigure(0, weight=1) container.grid_columnconfigure(0, weight=1) self.frames = { "LoginPage": LoginPage(parent=container, controller=self), "DialPage": DialPage(parent=container, controller=self), "OnGoingCallPage": OnGoingCallPage(parent=container, controller=self) } self.frames["LoginPage"].grid(row=0, column=0, sticky="nsew") self.frames["DialPage"].grid(row=0, column=0, sticky="nsew") self.frames["OnGoingCallPage"].grid(row=0, column=0, sticky="nsew") self.show_frame("LoginPage") def show_error(self, message): if isinstance(message, dict) and "error" in message: message = message["error"] tk.messagebox.showerror("Error", message) def show_frame(self, page_name): '''Show a frame for the given page name''' print(page_name) frame = self.frames[page_name] frame.tkraise() def login_on_server(self, Username, Password, ServerIP): self.voip_params = { u'username': Username, # a name describing the user u'sip_server_address': ServerIP, # the ip of the remote sip server (default port: 5060) u'sip_server_user': Username, # the username of the sip account u'sip_server_pwd': Password, # the password of the sip account u'sip_server_transport': u'udp', # the transport type (default: tcp) u'log_level': LogLevel, # the log level (greater values provide more informations) u'debug': False # enable/disable debugging messages } print(self.voip_params) # implement a method that will capture all the events triggered by the Voip Library def notify_events(voip_event_type, voip_event, params): print("Received Event Type:%s Event:%s -> Params: %s" % (voip_event_type, voip_event, params)) if "error" in params: self.show_error(params["error"]) return self.frames["OnGoingCallPage"].update_status() # event triggered when the account registration has been confirmed by the remote Sip Server if (voip_event == VoipEvent.ACCOUNT_REGISTERED): print("Account %s registered: ready to accept call!" % self.my_voip.get_account().get_uri()) # event triggered when a new call is incoming elif (voip_event == VoipEvent.CALL_INCOMING): print("INCOMING CALL From %s" % params["from"]) self.show_frame("OnGoingCallPage") # event triggered when the call has been established elif (voip_event == VoipEvent.CALL_ACTIVE): print("The call with %s has been established" % self.my_voip.get_call().get_remote_uri()) # events triggered when the call ends for some reasons elif (voip_event in [ VoipEvent.CALL_REMOTE_DISCONNECTION_HANGUP, VoipEvent.CALL_REMOTE_HANGUP, VoipEvent.CALL_HANGUP ]): print("End of call. Destroying lib...") # self.my_voip.destroy_lib() # event triggered when the library was destroyed elif (voip_event == VoipEvent.LIB_DEINITIALIZED): print("Call End. Exiting from the app.") end_of_call = True elif (voip_event == VoipEvent.CALL_DIALING): time.sleep(1) elif (voip_event == VoipEvent.LIB_INITIALIZATION_FAILED): print("Lib init failed. Destroying lib...") self.my_voip.destroy_lib() # just print informations about other events triggered by the library else: print("Received unhandled event type:%s --> %s" % (voip_event_type, voip_event)) # Unregister account # self.my_voip.unregister_account() # Destroy lib self.my_voip.destroy_lib() # Recreate lib self.my_voip = VoipLib() # initialize the lib passing the dictionary and the callback method defined above: self.my_voip.init_lib(self.voip_params, notify_events) # register the account self.my_voip.register_account()
elif (cmd=='e'): myVoip.hangup_call() elif myVoip.get_call().get_state()==CallState.HOLDING: print "Server State:%s" % myVoip.get_server().get_state() print "Call State:%s" % myVoip.get_call().get_state() cmd = raw_input("Enter 'u' to put on unhold the call,'e' to hangup:") if (cmd=='u' and myVoip.get_call().get_state()==CallState.HOLDING): myVoip.unhold_call() elif (cmd=='e'): myVoip.hangup_call() print "Server State:%s" % myVoip.get_server().get_state() print "Call State:%s" % myVoip.get_call().get_state() elif myVoip.get_call().get_state()==CallState.IDLE: cmd = raw_input("Enter 'q' to quit the app") if cmd=='q': myVoip.destroy_lib()
class VoipTestCase(unittest.TestCase): def __init__(self, test_method, backend): # unittest.TestCase(test_method) super(VoipTestCase, self).__init__(test_method) self.voip = VoipLib(backend) self.holding_event_already_triggered = False self.curEventIndex = 0 self.extension = "1234" self.params = { u"username": u"ste", u"sip_user": u"ste", u"sip_pwd": u"ste", u"sip_server": u"192.168.1.100", u"transport": u"udp", u"log_level": 1, } def account_reg_notification_cb(self, voip_event, params): print "Notification Event:%s - Params:%s" % (voip_event, params) self.voipEvent = voip_event self.assertEqual( voip_event, self.expectedEvents[self.curEventIndex], "Wrong event: %s . Expected:%s" % (self.voipEvent, self.expectedEvents[self.curEventIndex]), ) self.curEventIndex += 1 if voip_event == VoipEvent.LIB_INITIALIZED: self.assertTrue(self.voip.register_account()) elif voip_event == VoipEvent.ACCOUNT_REGISTERED: self.assertTrue(self.voip.unregister_account()) elif voip_event == VoipEvent.ACCOUNT_UNREGISTERED: self.assertTrue(self.voip.destroy_lib()) elif voip_event == VoipEvent.LIB_DEINITIALIZED: print "Ok." def make_call_notification_cb(self, voip_event, params): print "Notification Event:%s - Params:%s" % (voip_event, params) self.voipEvent = voip_event self.assertEqual( voip_event, self.expectedEvents[self.curEventIndex], "Wrong event: %s . Expected:%s" % (self.voipEvent, self.expectedEvents[self.curEventIndex]), ) self.curEventIndex += 1 if voip_event == VoipEvent.LIB_INITIALIZED: self.assertTrue(self.voip.register_account()) elif voip_event == VoipEvent.ACCOUNT_REGISTERED: self.assertTrue(self.voip.make_call(self.extension)) elif voip_event == VoipEvent.CALL_DIALING: pass elif voip_event == VoipEvent.CALL_ACTIVE: time.sleep(2) self.assertTrue(self.voip.hold_call()) elif voip_event == VoipEvent.CALL_HOLDING: time.sleep(0.5) self.assertTrue(self.voip.unhold_call()) elif voip_event == VoipEvent.CALL_UNHOLDING: self.assertTrue(self.voip.hangup_call()) elif voip_event == VoipEvent.CALL_HANGUP: self.assertTrue(self.voip.unregister_account()) elif voip_event == VoipEvent.ACCOUNT_UNREGISTERED: self.assertTrue(self.voip.destroy_lib()) elif voip_event == VoipEvent.LIB_DEINITIALIZED: print "Ok." def setUp(self): print "Running test:%s" % self._testMethodName self.curEventIndex = 0 self.voipEvent = VoipEvent.Null def tearDown(self): print "Test:%s completed." % self._testMethodName print "-----------------------------------------------\n" def test_account_registration(self): self.expectedEvents = [ VoipEvent.LIB_INITIALIZING, VoipEvent.LIB_INITIALIZED, VoipEvent.ACCOUNT_REGISTERING, VoipEvent.ACCOUNT_REGISTERED, VoipEvent.ACCOUNT_UNREGISTERING, VoipEvent.ACCOUNT_UNREGISTERED, VoipEvent.LIB_DEINITIALIZING, VoipEvent.LIB_DEINITIALIZED, ] result = self.voip.init_lib(self.params, self.account_reg_notification_cb) self.assertTrue(result, "Error initializing the lib!") while self.curEventIndex < len(self.expectedEvents): time.sleep(0.5) def test_make_call(self): self.expectedEvents = [ VoipEvent.LIB_INITIALIZING, VoipEvent.LIB_INITIALIZED, VoipEvent.ACCOUNT_REGISTERING, VoipEvent.ACCOUNT_REGISTERED, VoipEvent.CALL_DIALING, VoipEvent.CALL_ACTIVE, VoipEvent.CALL_HOLDING, VoipEvent.CALL_UNHOLDING, VoipEvent.CALL_HANGUP, VoipEvent.ACCOUNT_UNREGISTERING, VoipEvent.ACCOUNT_UNREGISTERED, VoipEvent.LIB_DEINITIALIZING, VoipEvent.LIB_DEINITIALIZED, ] result = self.voip.init_lib(self.params, self.make_call_notification_cb) self.assertTrue(result, "Error initializing the lib!") while self.curEventIndex < len(self.expectedEvents): time.sleep(0.5)
cmd = raw_input( "Enter 'h' to put on hold the call, 'e' to hangup:") if (cmd == 'h' and myVoip.get_call().get_state() == CallState.ACTIVE): myVoip.hold_call() elif (cmd == 'e'): myVoip.hangup_call() elif myVoip.get_call().get_state() == CallState.HOLDING: print "Server State:%s" % myVoip.get_server().get_state() print "Call State:%s" % myVoip.get_call().get_state() cmd = raw_input( "Enter 'u' to put on unhold the call,'e' to hangup:") if (cmd == 'u' and myVoip.get_call().get_state() == CallState.HOLDING): myVoip.unhold_call() elif (cmd == 'e'): myVoip.hangup_call() print "Server State:%s" % myVoip.get_server().get_state() print "Call State:%s" % myVoip.get_call().get_state() elif myVoip.get_call().get_state() == CallState.IDLE: cmd = raw_input("Enter 'q' to quit the app") if cmd == 'q': myVoip.destroy_lib()