From 5cb25e9e477cfa5438f697668a7cdfdb58f1b7f7 Mon Sep 17 00:00:00 2001 From: Stas Shtin Date: Wed, 14 Apr 2010 20:07:29 +0400 Subject: [PATCH] Removed unused stuff from connection constructor params. Initiate config servers on startup --- src/ipypbx/controllers.py | 171 +++++++++++++++++++++++++++++---------------- src/ipypbx/http.py | 48 +++++++++++-- 2 files changed, 153 insertions(+), 66 deletions(-) diff --git a/src/ipypbx/controllers.py b/src/ipypbx/controllers.py index 5ae2c30..61fc6f9 100644 --- a/src/ipypbx/controllers.py +++ b/src/ipypbx/controllers.py @@ -15,6 +15,11 @@ # You should have received a copy of the GNU General Public License # along with IPyPBX. If not, see . +""" +GUI controllers. +""" + +from ipypbx import http from PyQt4 import QtCore, QtGui, QtSql @@ -33,7 +38,7 @@ class BaseController(QtCore.QObject): relations = () delegate = None - def __init__(self, model=None, view_list=None, view_display=None, parent=None, views=None): + def __init__(self, parent=None, views=None): super(BaseController, self).__init__(parent=parent) self.views = views @@ -45,63 +50,52 @@ class BaseController(QtCore.QObject): else classname) self.basename = self.basename[0].lower() + self.basename[1:] - # Are we given an existing model? - if model: - self.model = model - # Otherwise initialize a new model. - else: - self.model = QtSql.QSqlRelationalTableModel(parent) - self.model.setTable('ipypbxweb_%s' % self.basename.lower()) - self.model.setEditStrategy(self.model.OnRowChange) - - # Create model header from fields list. - for i, field in enumerate(self.fields): - self.model.setHeaderData( - i, QtCore.Qt.Horizontal, - QtCore.QVariant(QtGui.QApplication.translate( - "MainWindow", field, None, - QtGui.QApplication.UnicodeUTF8))) - - # Fetch model data. - self.model.select() - - # Are we given an existing view list? - if view_list: - self.view_list = view_list + # Initialize a new model. + self.model = QtSql.QSqlRelationalTableModel(parent) + self.model.setTable('ipypbxweb_%s' % self.basename.lower()) + self.model.setEditStrategy(self.model.OnRowChange) + + # Create model header from fields list. + for i, field in enumerate(self.fields): + self.model.setHeaderData( + i, QtCore.Qt.Horizontal, + QtCore.QVariant(QtGui.QApplication.translate( + "MainWindow", field, None, + QtGui.QApplication.UnicodeUTF8))) + + # Fetch model data. + self.model.select() + # Otherwise get view list from the parent. - else: - self.view_list = getattr(views, self.basename + 'ViewList') - self.view_list.setModel(self.model) - - # Hide fields not meant for display. - for i, field in enumerate(self.fields): - if field not in self.view_list_fields: - self.view_list.hideColumn(i) - - # Stretch headers to fill all available width. - self.view_list.setSelectionMode(QtGui.QTableView.SingleSelection) - self.view_list.setSelectionBehavior(QtGui.QTableView.SelectRows) - self.view_list.resizeColumnsToContents() - self.view_list.resizeRowsToContents() - self.view_list.horizontalHeader().setStretchLastSection(True) + self.view_list = getattr(views, self.basename + 'ViewList') + self.view_list.setModel(self.model) + self.view_list.setSelectionMode(self.view_list.SingleSelection) + + # Hide fields not meant for display. + for i, field in enumerate(self.fields): + if field not in self.view_list_fields: + self.view_list.hideColumn(i) + + # Stretch headers to fill all available width. + self.view_list.setSelectionMode(QtGui.QTableView.SingleSelection) + self.view_list.setSelectionBehavior(QtGui.QTableView.SelectRows) + self.view_list.resizeColumnsToContents() + self.view_list.resizeRowsToContents() + self.view_list.horizontalHeader().setStretchLastSection(True) # Select first row. self.view_list.selectRow(0) - # Are we given an existing view display? - if view_display: - self.view_display = view_display - # Otherwise get view display from the parent. - else: - self.view_display = QtGui.QDataWidgetMapper(parent) - self.view_display.setModel(self.model) - - display_fields = self.getDisplayFields() - - for i, field in enumerate(self.fields): - if field in display_fields: - field_widget = self.getFieldWidget(field) - self.view_display.addMapping(field_widget, i) + # Get view display from the parent. + self.view_display = QtGui.QDataWidgetMapper(parent) + self.view_display.setModel(self.model) + + display_fields = self.getDisplayFields() + + for i, field in enumerate(self.fields): + if field in display_fields: + field_widget = self.getFieldWidget(field) + self.view_display.addMapping(field_widget, i) # Set relations for model & view display. if self.relations: @@ -170,7 +164,8 @@ class BaseController(QtCore.QObject): 'currentRowChanged(QModelIndex,QModelIndex)', self.view_display, 'setCurrentModelIndex(QModelIndex)'), (getattr(self.views, self.basename + 'Save'), 'clicked()', - self.save)] + self.save), + ] def add(self): """ @@ -207,6 +202,57 @@ class ConnectionController(BaseController): QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Freeswitch IP Address'), QtCore.QT_TRANSLATE_NOOP('MainWindow', 'Freeswitch Port')) view_list_fields = 'Name', 'Freeswitch IP Address', 'Freeswitch Port' + servers = [] + + def __init__(self, parent=None, views=None): + super(ConnectionController, self).__init__(parent, views) + + self.last_row = -1 + + for row in range(self.model.rowCount()): + # Get local IP address and port from the table. + local_ip_address = self.model.record(row).value( + 'local_ip_address').toString() + local_port, _ok = self.model.record(row).value('local_port').toInt() + if not _ok: + local_port = None + + server = http.FreeswitchConfigServer() + server.setSocket(local_ip_address, local_port) + server.startServer() + self.servers.append(server) + + def connectionEdit(self, index): + """ + Restart config server on connection change if necessary. + """ + current_row = index.row() + if current_row != -1: + self.last_row = current_row + # Select the new row. + connection_id, _ok = index.model().data( + index.sibling(index.row(), 0)).toInt() + #self.connection_id = connection_id + #if not self.model.rowCount(): + # self.add() + + + def connectionAdd(self): + """ + New connection added. + """ + num_rows = self.model.rowCount() + + + def addServer(self, host, port): + """ + Add a new config server. + """ + + server = http.FreeswitchConfigServer(self) + server.setSocket(host, port) + server.startServer() + self.servers.append(server) class ConnectionChangeListenerController(BaseController): @@ -217,14 +263,14 @@ class ConnectionChangeListenerController(BaseController): """ Listen to connection change signal. """ + # Find connection controller in controller registry. connection_controller = self.parent().controllers['connection'] - + signals = [ + (self.model, 'primeInsert(int,QSqlRecord&)', self.setConnectionId), (connection_controller.view_list.selectionModel(), 'currentRowChanged(QModelIndex,QModelIndex)', - self.connectionChange), - (self.model, 'primeInsert(int,QSqlRecord&)', - self.setConnectionId)] + self.connectionChange)] signals.extend(super( ConnectionChangeListenerController, self).getSignalsData()) return signals @@ -237,15 +283,20 @@ class ConnectionChangeListenerController(BaseController): locally. """ if index.row() != -1: - connection_id, ok = index.model().data( + connection_id, _ok = index.model().data( index.sibling(index.row(), 0)).toInt() self.connection_id = connection_id - self.model.setFilter('ipypbxweb_%s.connection_id = %i' % (self.basename, connection_id)) + self.model.setFilter( + 'ipypbxweb_%s.connection_id = %i' % + (self.basename, connection_id)) self.view_list.selectRow(0) if not self.model.rowCount(): self.add() def setConnectionId(self, row, record): + """ + Set connection_id from currently selected connection. + """ record.setValue('connection_id', self.connection_id) diff --git a/src/ipypbx/http.py b/src/ipypbx/http.py index 1fc4c87..afb3fb3 100644 --- a/src/ipypbx/http.py +++ b/src/ipypbx/http.py @@ -19,31 +19,67 @@ from PyQt4 import QtCore, QtNetwork class FreeswitchConfigServer(QtNetwork.QTcpServer): + """ + TCP server that receives config requests from freeswitch. + """ + def __init__(self, parent=None): + super(FreeswitchConfigServer, self).__init__(parent) + + self.host = None + self.port = None + self.is_running = False + + self.httpRequestParser = HttpRequestParser() + def setSocket(self, host, port): + """ + Set host and port for socket to listen on. + """ self.host = host self.port = port def startServer(self): - self.newConnection.connect(self.clientConnecting) - self.listen(QtNetwork.QHostAddress(self.host), self.port) + """ + Start listening on our socket. + """ + if not self.is_running: + if self.host and self.port: + self.newConnection.connect(self.clientConnecting) + self.listen(QtNetwork.QHostAddress(self.host), self.port) + self.is_running = True def stopServer(self): - self.close() + """ + Stop listening on our socket. + """ + if self.is_running: + self.close() + self.is_running = False + + def restartServer(self): + """ + Restart server. + """ + self.stopServer() + self.startServer() def clientConnecting(self, socket): + """ + Handle client connection. + """ if self.hasPendingConnections(): connectingClient = self.server.nextPendingConnection() connectingClient.readyRead.connect(self.receiveData) def receiveData(self, socket): - self. while socket.canReadLine(): line = socket.readLine().strip() - class HttpParseError(Exception): - pass + """ + Error parsing HTTP request. + """ class HttpRequestParser(object): -- 1.7.9.5