def make_call(number): global voip_caller if voip_caller is None: voip_caller = VoipLib() voip_params = { u'username': u'ziyapi', # a name describing the user u'sip_server_address': u'sip.linphone.org', # the ip of the remote sip server (default port: 5060) u'sip_server_user': u'ziyapi', # the username of the sip account u'sip_server_pwd': u'******', # the password of the sip account u'sip_server_transport': u'udp', # the transport type (default: tcp) u'log_level': 1, # the log level (greater values provide more informations) u'debug': True # enable/disable debugging messages } def notify_events(voip_event_type, voip_event, params): print "Received Event Type:%s -> Event: %s Params: %s" % ( voip_event_type, voip_event, params) voip_caller.init_lib(voip_params, notify_events) voip_caller.register_account() voip_caller.make_call(number) while True: global wheel_last_state sw_state = wheel_switch.get_state() if sw_state != wheel_last_state: wheel_last_state = sw_state voip_caller.hangup_call() global state state = 'waiting' print_lcd_text(['Welcome', 'to', 'Ziya']) break
class MostVoipGUI(QtGui.QMainWindow): # pyqt signal for most voip event notifications voip_signal = pyqtSignal(object, object, object) def __init__(self): QtGui.QMainWindow.__init__(self) self.setWindowTitle('Most Voip Demo Application') self._setup_logger() self.selectedAccount = self.selectedAccountDetails = self.selectedAccountBuddies = None self.voip_signal.connect(self.notify_events) self.myVoip = VoipLib() self._build_GUI() self._setupButtonsByVoipState() def _setup_logger(self): global logger if not logger: logger = logging.getLogger("VoipDemo") #('Voip') handler = logging.StreamHandler() # rootFormatter = logging.Formatter('%(name)s - %(levelname)s: %(msg)s') # handler.setFormatter(rootFormatter) logger.addHandler(handler) logger.setLevel(logging.DEBUG) #print "NUM LOGGER HANDLERS:%s" % len(logger.handlers) def voip_notify_events(self, voip_event_type, voip_event, params): self.voip_signal.emit(voip_event_type, voip_event, params) def notify_events(self, voip_event_type, voip_event, params): msg = "%s: %s" % (voip_event_type, voip_event) logger.debug("\n\nEVENT:%s\n\n" % msg) self.statusBar().showMessage(msg) self._update_status_labels() self._setupButtonsByVoipState() if voip_event == VoipEvent.LIB_INITIALIZED: self.myVoip.register_account() elif voip_event == VoipEvent.ACCOUNT_REGISTERED: self._add_buddies() self._update_buddy_list() elif voip_event_type == VoipEventType.BUDDY_EVENT: self._update_buddy_list() def _add_buddies(self): if not self.selectedAccountBuddies: return logger.debug("Adding buddies...") for b in self.selectedAccountBuddies: # the buddy related to the current registered account is not to be included if b["extension"] != self.selectedAccountDetails["extension"]: self.myVoip.get_account().add_buddy(b["extension"]) def _update_buddy_list(self): buddies = self.myVoip.get_account().get_buddies() logger.debug("Update Buddy Model...") self.buddiesModel.clear() for b in buddies: msg = "%s (%s)" % (b.get_extension(), b.get_status_text()) logger.debug("Appending buddy:%s" % msg) item = QtGui.QStandardItem(msg) self.buddiesModel.appendRow(item) def get_init_params(self): self.selectedAccount, self.selectedAccountDetails, self.selectedAccountBuddies, ok = AccountPickerDialog.getSelectedAccount( self.txtwebServerAddress.text(), self) print "SELECTED ACCOUNT:%s -> Data: %s Details:%s" % ( ok, self.selectedAccount, str(self.selectedAccountDetails)) if (not ok): raise Exception("No Valid Account Configuration Loaded") voip_params0 = { u'username': self.selectedAccount["name"], u'sip_server_pwd': self.selectedAccountDetails["sip_server"]["pwd"], u'sip_server_address': self.selectedAccountDetails["sip_server"] ["address"], #'u'192.168.1.79', u'sip_server_user': self.selectedAccountDetails["sip_server"]["user"], u'sip_server_transport': self.selectedAccountDetails["sip_server"]["transport"], #u'turn_server_address': self.selectedAccountDetails["turn_server"]["address"], #u'turn_server_user': self.selectedAccountDetails["turn_server"]["user"], #u'turn_server_pwd': self.selectedAccountDetails["turn_server"]["pwd"], u'log_level': 1, u'debug': True } print "VOIP CONF DICT:%s" % voip_params0 return voip_params0 def init_voip_lib(self): print "Called init_voip_lib" self.voip_params = self.get_init_params() self._update_account_details_info() self.myVoip.init_lib(self.voip_params, self.voip_notify_events) def _update_account_details_info(self): if self.selectedAccount: accountInfo = "%s [SIP USERMAME: %s - SIP SERVER:%s]" % ( self.selectedAccount["name"], self.selectedAccountDetails["sip_server"]["user"], self.selectedAccountDetails["sip_server"]["address"]) self.labAccountDetails.setText(accountInfo) else: self.labAccountDetails.setText("N.A") def _update_status_labels(self): self._update_server_state() self._update_call_state() self._update_account_state() def _update_server_state(self): server_state = self.myVoip.get_server().get_state() self.labServerStateInfo.setText(server_state) def _update_call_state(self): call_state = self.myVoip.get_call().get_state() self.labCallStateInfo.setText(call_state) def _update_account_state(self): account_state = self.myVoip.get_account().get_state() self.labAccountStateInfo.setText(account_state) def on_buddy_selected(self, item): buddies = self.myVoip.get_account().get_buddies() buddy_ext = buddies[item.row()].get_extension() self.txtExtension.setText(buddy_ext) def on_make_call_button_clicked(self): extension = self.txtExtension.text() logger.debug("Making call to %s" % extension) self.myVoip.make_call(extension) def _setupButtonsByVoipState(self): #myServerState = self.myVoip.get_server().get_state() myAccountState = self.myVoip.get_account().get_state() if myAccountState == AccountState.UNREGISTERED: self.butMakeCall.setEnabled(False) self.butAnswer.setEnabled(False) self.butHold.setEnabled(False) self.butHangup.setEnabled(False) self.butInit.setEnabled(True) else: myCallState = self.myVoip.get_call().get_state() if myCallState == CallState.IDLE: self.butMakeCall.setEnabled(True) self.butAnswer.setEnabled(False) self.butHangup.setEnabled(False) self.butHold.setEnabled(False) elif myCallState == CallState.INCOMING: self.butMakeCall.setEnabled(False) self.butAnswer.setEnabled(True) self.butHangup.setEnabled(True) self.butHold.setEnabled(False) elif myCallState == CallState.DIALING: self.butMakeCall.setEnabled(False) self.butAnswer.setEnabled(False) self.butHangup.setEnabled(True) self.butHold.setEnabled(False) elif myCallState == CallState.HOLDING: self.butMakeCall.setEnabled(False) self.butAnswer.setEnabled(False) self.butHangup.setEnabled(True) self.butHold.setEnabled(True) self.butHold.setText("Unhold") elif myCallState == CallState.ACTIVE: self.butMakeCall.setEnabled(False) self.butAnswer.setEnabled(False) self.butHangup.setEnabled(True) self.butHold.setEnabled(True) self.butHold.setText("Hold") def on_hold_toggle_button_clicked(self): if (self.myVoip.get_call().get_state() == CallState.ACTIVE): self.myVoip.hold_call() elif (self.myVoip.get_call().get_state() == CallState.HOLDING): self.myVoip.unhold_call() def on_answer_button_clicked(self): self.myVoip.answer_call() def on_hangup_button_clicked(self): self.myVoip.hangup_call() # ----------------------------------------------------------------------------- # GUI BUILDING SECTION # ----------------------------------------------------------------------------- def _build_GUI(self): cWidget = QtGui.QWidget(self) vBox = QtGui.QVBoxLayout() vBox.setSpacing(5) vBox.addLayout(self._buildAccountDetailsPanel(cWidget)) vBox.addLayout(self._buildStatesPanel(cWidget)) vBox.addLayout(self._buildBuddiesPanel(cWidget)) vBox.addLayout(self._buildMakeCallPanel(cWidget)) vBox.addLayout(self._buildLoadConfigPanel(cWidget)) vBox.addLayout(self._buildButtonsPanel(cWidget)) self.setMinimumWidth(600) cWidget.setLayout(vBox) self.setCentralWidget(cWidget) self.statusBar().showMessage( 'MostVoip Event Log') # crea una veloce barra di stato def _buildAccountDetailsPanel(self, cWidget): hBox1 = QtGui.QHBoxLayout() hBox1.setSpacing(5) labAccountDetailsTitle = QtGui.QLabel('Account', cWidget) self.labAccountDetails = QtGui.QLabel('N.A', cWidget) hBox1.addWidget(labAccountDetailsTitle) hBox1.addWidget(self.labAccountDetails) return hBox1 def _buildBuddiesPanel(self, cWidget): vBox = QtGui.QVBoxLayout() vBox.setSpacing(5) self.buddiesList = QtGui.QListView() self.buddiesList.setWindowTitle('Buddies') self.buddiesList.clicked.connect(self.on_buddy_selected) #self.buddiesList.setMinimumSize(600, 400) # Create an empty model for the list's data self.buddiesModel = QtGui.QStandardItemModel(self.buddiesList) self.buddiesList.setModel(self.buddiesModel) self.buddiesList.show() vBox.addWidget(QtGui.QLabel('Buddies', cWidget)) vBox.addWidget(self.buddiesList) return vBox def _buildStatesPanel(self, cWidget): hBox1 = QtGui.QHBoxLayout() hBox1.setSpacing(5) labServerState = QtGui.QLabel('Server State', cWidget) self.labServerStateInfo = QtGui.QLabel('N.A', cWidget) hBox1.addWidget(labServerState) hBox1.addWidget(self.labServerStateInfo) hBox2 = QtGui.QHBoxLayout() hBox2.setSpacing(5) labCallState = QtGui.QLabel('Call State', cWidget) self.labCallStateInfo = QtGui.QLabel('N.A', cWidget) hBox2.addWidget(labCallState) hBox2.addWidget(self.labCallStateInfo) hBox3 = QtGui.QHBoxLayout() hBox3.setSpacing(5) labAccountState = QtGui.QLabel('Account State', cWidget) self.labAccountStateInfo = QtGui.QLabel('N.A', cWidget) hBox3.addWidget(labAccountState) hBox3.addWidget(self.labAccountStateInfo) vBox = QtGui.QVBoxLayout() vBox.setSpacing(5) vBox.addLayout(hBox1) vBox.addLayout(hBox2) vBox.addLayout(hBox3) return vBox def _buildMakeCallPanel(self, cWidget): hBox = QtGui.QHBoxLayout() hBox.setSpacing(2) self.butMakeCall = QtGui.QPushButton('Make Call', cWidget) self.connect(self.butMakeCall, QtCore.SIGNAL('clicked()'), self.on_make_call_button_clicked) labExtension = QtGui.QLabel('Extension: ', cWidget) self.txtExtension = QtGui.QLineEdit(cWidget) hBox.addWidget(labExtension) hBox.addWidget(self.txtExtension) hBox.addWidget(self.butMakeCall) return hBox def _buildLoadConfigPanel(self, cWidget): hBox = QtGui.QHBoxLayout() hBox.setSpacing(2) labWebServerAddress = QtGui.QLabel('Web Server Address: ', cWidget) self.txtwebServerAddress = QtGui.QLineEdit(cWidget) self.txtwebServerAddress.setText("http://localhost:8000") hBox.addWidget(labWebServerAddress) hBox.addWidget(self.txtwebServerAddress) return hBox def _buildButtonsPanel(self, cWidget): hBox = QtGui.QHBoxLayout() hBox.setSpacing(2) self.butInit = QtGui.QPushButton('Init', cWidget) self.butAnswer = QtGui.QPushButton('Answer', cWidget) self.butHold = QtGui.QPushButton('Hold', cWidget) #self.butHold.setCheckable(True); self.butHangup = QtGui.QPushButton('Hangup', cWidget) hBox.addWidget(self.butInit) hBox.addWidget(self.butAnswer) hBox.addWidget(self.butHold) hBox.addWidget(self.butHangup) self.connect(self.butInit, QtCore.SIGNAL('clicked()'), self.init_voip_lib) self.connect(self.butHold, QtCore.SIGNAL('clicked()'), self.on_hold_toggle_button_clicked) self.connect(self.butAnswer, QtCore.SIGNAL('clicked()'), self.on_answer_button_clicked) self.connect(self.butHangup, QtCore.SIGNAL('clicked()'), self.on_hangup_button_clicked) return hBox
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()
'log_level': 0, 'debug': True } status = {'status': "failure"} def notify_events(voip_event_type, voip_event, params): if voip_event == "VOIP_EVENT__CALL_ACTIVE": status['status'] = "success" # print "Received Event Type:%s -> Event: %s Params: %s" % (voip_event_type, voip_event, params) my_voip.init_lib(voip_params, notify_events) my_voip.register_account() my_extension = sys.argv[1] + "99" my_voip.make_call(my_extension) import time time.sleep(5) print(status['status']) if status['status'] == "success": sys.exit(0) else: sys.exit(1)
class MostVoipGUI(QtGui.QMainWindow): # pyqt signal for most voip event notifications voip_signal = pyqtSignal(object, object, object) def __init__(self): QtGui.QMainWindow.__init__(self) self.setWindowTitle('Most Voip Demo Application') self._setup_logger() self.voip_signal.connect(self.notify_events) self.myVoip = VoipLib() self._build_GUI() self._setupButtonsByVoipState() def _setup_logger(self): global logger if not logger: logger = logging.getLogger("VoipDemo") #('Voip') handler = logging.StreamHandler() # rootFormatter = logging.Formatter('%(name)s - %(levelname)s: %(msg)s') # handler.setFormatter(rootFormatter) logger.addHandler(handler) logger.setLevel(logging.DEBUG) #print "NUM LOGGER HANDLERS:%s" % len(logger.handlers) def voip_notify_events(self, voip_event_type, voip_event, params): self.voip_signal.emit(voip_event_type, voip_event, params) def notify_events(self, voip_event_type, voip_event, params): msg = "%s: %s" % (voip_event_type, voip_event) logger.debug("\n\nEVENT:%s\n\n" % msg) self.statusBar().showMessage(msg) self._update_status_labels() self._setupButtonsByVoipState() if voip_event == VoipEvent.LIB_INITIALIZED: self.myVoip.register_account() elif voip_event == VoipEvent.ACCOUNT_REGISTERED: self._add_buddies() self._update_buddy_list() elif voip_event_type == VoipEventType.BUDDY_EVENT: self._update_buddy_list() def _add_buddies(self): buddy_extensions = ["ste", "steand", "ste2"] logger.debug("Adding buddies...") for ext in buddy_extensions: if ext != self.voip_params.get("sip_server_user"): self.myVoip.get_account().add_buddy(ext) def _update_buddy_list(self): buddies = self.myVoip.get_account().get_buddies() logger.debug("Update Buddy Model...") self.buddiesModel.clear() for b in buddies: msg = "%s (%s)" % (b.get_extension(), b.get_status_text()) logger.debug("Appending buddy:%s" % msg) item = QtGui.QStandardItem(msg) self.buddiesModel.appendRow(item) def get_init_params(self): voip_params0 = { u'username': u'ste', u'sip_server_pwd': u'ste', u'sip_server_address': u'156.148.33.226:5062', # u'192.168.1.100' , 156.148.132.243 u'sip_server_user': u'ste', u'sip_server_transport': u'tcp', u'turn_server_address': u'156.148.33.226', u'turn_server_user': u'ste', u'turn_server_pwd': u'ste', u'log_level': 1, u'debug': True } return voip_params0 def init_voip_lib(self): print "Called init_voip_lib" self.voip_params = self.get_init_params() self.myVoip.init_lib(self.voip_params, self.voip_notify_events) def _update_status_labels(self): self._update_sip_username() self._update_server_state() self._update_call_state() self._update_account_state() def _update_sip_username(self): self.labSipUsernameInfo.setText( self.voip_params.get("sip_server_user", "N.A")) def _update_server_state(self): server_state = self.myVoip.get_server().get_state() self.labServerStateInfo.setText(server_state) def _update_call_state(self): call_state = self.myVoip.get_call().get_state() self.labCallStateInfo.setText(call_state) def _update_account_state(self): account_state = self.myVoip.get_account().get_state() self.labAccountStateInfo.setText(account_state) def on_buddy_selected(self, item): buddies = self.myVoip.get_account().get_buddies() buddy_ext = buddies[item.row()].get_extension() self.txtExtension.setText(buddy_ext) def on_make_call_button_clicked(self): extension = self.txtExtension.text() logger.debug("Making call to %s" % extension) self.myVoip.make_call(extension) def _setupButtonsByVoipState(self): #myServerState = self.myVoip.get_server().get_state() myAccountState = self.myVoip.get_account().get_state() if myAccountState == AccountState.UNREGISTERED: self.butMakeCall.setEnabled(False) self.butAnswer.setEnabled(False) self.butHold.setEnabled(False) self.butHangup.setEnabled(False) self.butInit.setEnabled(True) else: myCallState = self.myVoip.get_call().get_state() if myCallState == CallState.IDLE: self.butMakeCall.setEnabled(True) self.butAnswer.setEnabled(False) self.butHangup.setEnabled(False) self.butHold.setText("Hold") self.butHold.setEnabled(False) elif myCallState == CallState.INCOMING: self.butMakeCall.setEnabled(False) self.butAnswer.setEnabled(True) self.butHangup.setEnabled(True) self.butHold.setText("Hold") self.butHold.setEnabled(False) elif myCallState == CallState.DIALING: self.butMakeCall.setEnabled(False) self.butAnswer.setEnabled(False) self.butHangup.setEnabled(True) self.butHold.setText("Hold") self.butHold.setEnabled(False) elif myCallState == CallState.HOLDING: self.butMakeCall.setEnabled(False) self.butAnswer.setEnabled(False) self.butHangup.setEnabled(True) self.butHold.setEnabled(True) self.butHold.setText("Unhold") elif myCallState == CallState.ACTIVE: self.butMakeCall.setEnabled(False) self.butAnswer.setEnabled(False) self.butHangup.setEnabled(True) self.butHold.setEnabled(True) self.butHold.setText("Hold") def on_hold_toggle_button_clicked(self): if (self.myVoip.get_call().get_state() == CallState.ACTIVE): self.myVoip.hold_call() elif (self.myVoip.get_call().get_state() == CallState.HOLDING): self.myVoip.unhold_call() def on_answer_button_clicked(self): self.myVoip.answer_call() def on_hangup_button_clicked(self): self.myVoip.hangup_call() # ----------------------------------------------------------------------------- # GUI BUILDING SECTION # ----------------------------------------------------------------------------- def _build_GUI(self): cWidget = QtGui.QWidget(self) vBox = QtGui.QVBoxLayout() vBox.setSpacing(5) vBox.addLayout(self._buildStatesPanel(cWidget)) vBox.addLayout(self._buildBuddiesPanel(cWidget)) vBox.addLayout(self._buildMakeCallPanel(cWidget)) vBox.addLayout(self._buildButtonsPanel(cWidget)) self.setMinimumWidth(600) cWidget.setLayout(vBox) self.setCentralWidget(cWidget) self.statusBar().showMessage( 'MostVoip Event Log') # crea una veloce barra di stato def _buildBuddiesPanel(self, cWidget): vBox = QtGui.QVBoxLayout() vBox.setSpacing(5) self.buddiesList = QtGui.QListView() self.buddiesList.setWindowTitle('Buddies') self.buddiesList.clicked.connect(self.on_buddy_selected) #self.buddiesList.setMinimumSize(600, 400) # Create an empty model for the list's data self.buddiesModel = QtGui.QStandardItemModel(self.buddiesList) self.buddiesList.setModel(self.buddiesModel) self.buddiesList.show() vBox.addWidget(QtGui.QLabel('Buddies', cWidget)) vBox.addWidget(self.buddiesList) return vBox def _buildStatesPanel(self, cWidget): hBox0 = QtGui.QHBoxLayout() hBox0.setSpacing(5) labSipUsername = QtGui.QLabel('Sip Username', cWidget) self.labSipUsernameInfo = QtGui.QLabel('N.A', cWidget) hBox0.addWidget(labSipUsername) hBox0.addWidget(self.labSipUsernameInfo) hBox1 = QtGui.QHBoxLayout() hBox1.setSpacing(5) labServerState = QtGui.QLabel('Server State', cWidget) self.labServerStateInfo = QtGui.QLabel('N.A', cWidget) hBox1.addWidget(labServerState) hBox1.addWidget(self.labServerStateInfo) hBox2 = QtGui.QHBoxLayout() hBox2.setSpacing(5) labCallState = QtGui.QLabel('Call State', cWidget) self.labCallStateInfo = QtGui.QLabel('N.A', cWidget) hBox2.addWidget(labCallState) hBox2.addWidget(self.labCallStateInfo) hBox3 = QtGui.QHBoxLayout() hBox3.setSpacing(5) labAccountState = QtGui.QLabel('Account State', cWidget) self.labAccountStateInfo = QtGui.QLabel('N.A', cWidget) hBox3.addWidget(labAccountState) hBox3.addWidget(self.labAccountStateInfo) vBox = QtGui.QVBoxLayout() vBox.setSpacing(5) vBox.addLayout(hBox0) vBox.addLayout(hBox1) vBox.addLayout(hBox2) vBox.addLayout(hBox3) return vBox def _buildMakeCallPanel(self, cWidget): hBox = QtGui.QHBoxLayout() hBox.setSpacing(2) self.butMakeCall = QtGui.QPushButton('Make Call', cWidget) self.connect(self.butMakeCall, QtCore.SIGNAL('clicked()'), self.on_make_call_button_clicked) labExtension = QtGui.QLabel('Extension', cWidget) self.txtExtension = QtGui.QLineEdit(cWidget) hBox.addWidget(labExtension) hBox.addWidget(self.txtExtension) hBox.addWidget(self.butMakeCall) return hBox def _buildButtonsPanel(self, cWidget): hBox = QtGui.QHBoxLayout() hBox.setSpacing(2) self.butInit = QtGui.QPushButton('Init', cWidget) self.butAnswer = QtGui.QPushButton('Answer', cWidget) self.butHold = QtGui.QPushButton('Hold', cWidget) #self.butHold.setCheckable(True); self.butHangup = QtGui.QPushButton('Hangup', cWidget) hBox.addWidget(self.butInit) hBox.addWidget(self.butAnswer) hBox.addWidget(self.butHold) hBox.addWidget(self.butHangup) self.connect(self.butInit, QtCore.SIGNAL('clicked()'), self.init_voip_lib) self.connect(self.butHold, QtCore.SIGNAL('clicked()'), self.on_hold_toggle_button_clicked) self.connect(self.butAnswer, QtCore.SIGNAL('clicked()'), self.on_answer_button_clicked) self.connect(self.butHangup, QtCore.SIGNAL('clicked()'), self.on_hangup_button_clicked) return hBox
class MostVoipGUI(QtGui.QMainWindow): # pyqt signal for most voip event notifications voip_signal = pyqtSignal(object,object,object) def __init__(self): QtGui.QMainWindow.__init__(self) self.setWindowTitle('Most Voip Demo Application') self._setup_logger() self.selectedAccount = self.selectedAccountDetails = self.selectedAccountBuddies = None self.voip_signal.connect(self.notify_events) self.myVoip = VoipLib() self._build_GUI() self._setupButtonsByVoipState() def _setup_logger(self): global logger if not logger: logger = logging.getLogger("VoipDemo") #('Voip') handler = logging.StreamHandler() # rootFormatter = logging.Formatter('%(name)s - %(levelname)s: %(msg)s') # handler.setFormatter(rootFormatter) logger.addHandler(handler) logger.setLevel(logging.DEBUG) #print "NUM LOGGER HANDLERS:%s" % len(logger.handlers) def voip_notify_events(self, voip_event_type,voip_event, params): self.voip_signal.emit(voip_event_type,voip_event, params) def notify_events(self, voip_event_type,voip_event, params): msg = "%s: %s" % (voip_event_type,voip_event) logger.debug("\n\nEVENT:%s\n\n" % msg) self.statusBar().showMessage(msg) self._update_status_labels() self._setupButtonsByVoipState() if voip_event==VoipEvent.LIB_INITIALIZED: self.myVoip.register_account(); elif voip_event==VoipEvent.ACCOUNT_REGISTERED: self._add_buddies() self._update_buddy_list() elif voip_event_type==VoipEventType.BUDDY_EVENT: self._update_buddy_list() def _add_buddies(self): if not self.selectedAccountBuddies: return logger.debug("Adding buddies...") for b in self.selectedAccountBuddies: # the buddy related to the current registered account is not to be included if b["extension"]!=self.selectedAccountDetails["extension"]: self.myVoip.get_account().add_buddy(b["extension"]) def _update_buddy_list(self): buddies = self.myVoip.get_account().get_buddies() logger.debug("Update Buddy Model...") self.buddiesModel.clear(); for b in buddies: msg = "%s (%s)" % (b.get_extension(), b.get_status_text()) logger.debug("Appending buddy:%s" % msg) item = QtGui.QStandardItem(msg) self.buddiesModel.appendRow(item) def get_init_params(self): self.selectedAccount, self.selectedAccountDetails , self.selectedAccountBuddies, ok = AccountPickerDialog.getSelectedAccount(self.txtwebServerAddress.text(), self) print "SELECTED ACCOUNT:%s -> Data: %s Details:%s" % (ok, self.selectedAccount, str(self.selectedAccountDetails)) if (not ok): raise Exception("No Valid Account Configuration Loaded") voip_params0 = {u'username': self.selectedAccount["name"], u'sip_server_pwd': self.selectedAccountDetails["sip_server"]["pwd"], u'sip_server_address':self.selectedAccountDetails["sip_server"]["address"] , #'u'192.168.1.79', u'sip_server_user': self.selectedAccountDetails["sip_server"]["user"], u'sip_server_transport' :self.selectedAccountDetails["sip_server"]["transport"], #u'turn_server_address': self.selectedAccountDetails["turn_server"]["address"], #u'turn_server_user': self.selectedAccountDetails["turn_server"]["user"], #u'turn_server_pwd': self.selectedAccountDetails["turn_server"]["pwd"], u'log_level' : 1, u'debug' : True } print "VOIP CONF DICT:%s" % voip_params0 return voip_params0 def init_voip_lib(self): print "Called init_voip_lib" self.voip_params = self.get_init_params() self._update_account_details_info() self.myVoip.init_lib(self.voip_params, self.voip_notify_events) def _update_account_details_info(self): if self.selectedAccount: accountInfo = "%s [SIP USERMAME: %s - SIP SERVER:%s]" % (self.selectedAccount["name"],self.selectedAccountDetails["sip_server"]["user"],self.selectedAccountDetails["sip_server"]["address"] ) self.labAccountDetails.setText(accountInfo) else: self.labAccountDetails.setText("N.A") def _update_status_labels(self): self._update_server_state() self._update_call_state() self._update_account_state() def _update_server_state(self): server_state = self.myVoip.get_server().get_state() self.labServerStateInfo.setText(server_state) def _update_call_state(self): call_state = self.myVoip.get_call().get_state() self.labCallStateInfo.setText(call_state) def _update_account_state(self): account_state = self.myVoip.get_account().get_state() self.labAccountStateInfo.setText(account_state) def on_buddy_selected(self,item): buddies = self.myVoip.get_account().get_buddies() buddy_ext = buddies[item.row()].get_extension() self.txtExtension.setText(buddy_ext) def on_make_call_button_clicked(self): extension = self.txtExtension.text() logger.debug("Making call to %s" % extension) self.myVoip.make_call(extension) def _setupButtonsByVoipState(self): #myServerState = self.myVoip.get_server().get_state() myAccountState = self.myVoip.get_account().get_state() if myAccountState==AccountState.UNREGISTERED: self.butMakeCall.setEnabled(False) self.butAnswer.setEnabled(False) self.butHold.setEnabled(False) self.butHangup.setEnabled(False) self.butInit.setEnabled(True) else: myCallState = self.myVoip.get_call().get_state() if myCallState==CallState.IDLE: self.butMakeCall.setEnabled(True) self.butAnswer.setEnabled(False) self.butHangup.setEnabled(False) self.butHold.setEnabled(False) elif myCallState==CallState.INCOMING: self.butMakeCall.setEnabled(False) self.butAnswer.setEnabled(True) self.butHangup.setEnabled(True) self.butHold.setEnabled(False) elif myCallState==CallState.DIALING: self.butMakeCall.setEnabled(False) self.butAnswer.setEnabled(False) self.butHangup.setEnabled(True) self.butHold.setEnabled(False) elif myCallState==CallState.HOLDING: self.butMakeCall.setEnabled(False) self.butAnswer.setEnabled(False) self.butHangup.setEnabled(True) self.butHold.setEnabled(True) self.butHold.setText("Unhold") elif myCallState==CallState.ACTIVE: self.butMakeCall.setEnabled(False) self.butAnswer.setEnabled(False) self.butHangup.setEnabled(True) self.butHold.setEnabled(True) self.butHold.setText("Hold") def on_hold_toggle_button_clicked(self): if (self.myVoip.get_call().get_state()==CallState.ACTIVE): self.myVoip.hold_call() elif(self.myVoip.get_call().get_state()==CallState.HOLDING): self.myVoip.unhold_call() def on_answer_button_clicked(self): self.myVoip.answer_call() def on_hangup_button_clicked(self): self.myVoip.hangup_call() # ----------------------------------------------------------------------------- # GUI BUILDING SECTION # ----------------------------------------------------------------------------- def _build_GUI(self): cWidget = QtGui.QWidget(self) vBox = QtGui.QVBoxLayout() vBox.setSpacing(5) vBox.addLayout(self._buildAccountDetailsPanel(cWidget)) vBox.addLayout(self._buildStatesPanel(cWidget)) vBox.addLayout(self._buildBuddiesPanel(cWidget)) vBox.addLayout(self._buildMakeCallPanel(cWidget)) vBox.addLayout(self._buildLoadConfigPanel(cWidget)) vBox.addLayout(self._buildButtonsPanel(cWidget)) self.setMinimumWidth(600) cWidget.setLayout(vBox) self.setCentralWidget(cWidget) self.statusBar().showMessage('MostVoip Event Log') # crea una veloce barra di stato def _buildAccountDetailsPanel(self,cWidget): hBox1 = QtGui.QHBoxLayout() hBox1.setSpacing(5) labAccountDetailsTitle = QtGui.QLabel('Account', cWidget) self.labAccountDetails = QtGui.QLabel('N.A', cWidget) hBox1.addWidget(labAccountDetailsTitle) hBox1.addWidget(self.labAccountDetails) return hBox1 def _buildBuddiesPanel(self, cWidget): vBox = QtGui.QVBoxLayout() vBox.setSpacing(5) self.buddiesList = QtGui.QListView() self.buddiesList.setWindowTitle('Buddies') self.buddiesList.clicked.connect(self.on_buddy_selected) #self.buddiesList.setMinimumSize(600, 400) # Create an empty model for the list's data self.buddiesModel = QtGui.QStandardItemModel(self.buddiesList) self.buddiesList.setModel(self.buddiesModel) self.buddiesList.show() vBox.addWidget(QtGui.QLabel('Buddies', cWidget)) vBox.addWidget(self.buddiesList) return vBox def _buildStatesPanel(self,cWidget): hBox1 = QtGui.QHBoxLayout() hBox1.setSpacing(5) labServerState = QtGui.QLabel('Server State', cWidget) self.labServerStateInfo = QtGui.QLabel('N.A', cWidget) hBox1.addWidget(labServerState) hBox1.addWidget(self.labServerStateInfo) hBox2 = QtGui.QHBoxLayout() hBox2.setSpacing(5) labCallState = QtGui.QLabel('Call State', cWidget) self.labCallStateInfo = QtGui.QLabel('N.A', cWidget) hBox2.addWidget(labCallState) hBox2.addWidget(self.labCallStateInfo) hBox3 = QtGui.QHBoxLayout() hBox3.setSpacing(5) labAccountState = QtGui.QLabel('Account State', cWidget) self.labAccountStateInfo = QtGui.QLabel('N.A', cWidget) hBox3.addWidget(labAccountState) hBox3.addWidget(self.labAccountStateInfo) vBox = QtGui.QVBoxLayout() vBox.setSpacing(5) vBox.addLayout(hBox1) vBox.addLayout(hBox2) vBox.addLayout(hBox3) return vBox def _buildMakeCallPanel(self,cWidget): hBox = QtGui.QHBoxLayout() hBox.setSpacing(2) self.butMakeCall = QtGui.QPushButton('Make Call', cWidget) self.connect(self.butMakeCall, QtCore.SIGNAL('clicked()'), self.on_make_call_button_clicked); labExtension = QtGui.QLabel('Extension: ', cWidget) self.txtExtension = QtGui.QLineEdit(cWidget) hBox.addWidget(labExtension) hBox.addWidget(self.txtExtension) hBox.addWidget(self.butMakeCall) return hBox def _buildLoadConfigPanel(self,cWidget): hBox = QtGui.QHBoxLayout() hBox.setSpacing(2) labWebServerAddress = QtGui.QLabel('Web Server Address: ', cWidget) self.txtwebServerAddress = QtGui.QLineEdit(cWidget) self.txtwebServerAddress.setText("http://localhost:8000") hBox.addWidget(labWebServerAddress) hBox.addWidget(self.txtwebServerAddress) return hBox def _buildButtonsPanel(self,cWidget): hBox = QtGui.QHBoxLayout() hBox.setSpacing(2) self.butInit = QtGui.QPushButton('Init', cWidget) self.butAnswer = QtGui.QPushButton('Answer', cWidget) self.butHold = QtGui.QPushButton('Hold', cWidget) #self.butHold.setCheckable(True); self.butHangup = QtGui.QPushButton('Hangup', cWidget) hBox.addWidget(self.butInit) hBox.addWidget(self.butAnswer) hBox.addWidget(self.butHold) hBox.addWidget(self.butHangup) self.connect(self.butInit, QtCore.SIGNAL('clicked()'), self.init_voip_lib) self.connect(self.butHold, QtCore.SIGNAL('clicked()'), self.on_hold_toggle_button_clicked) self.connect(self.butAnswer, QtCore.SIGNAL('clicked()'), self.on_answer_button_clicked) self.connect(self.butHangup, QtCore.SIGNAL('clicked()'), self.on_hangup_button_clicked) return hBox
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)