Removed unused stuff from connection constructor params. Initiate config servers...
authorStas Shtin <antisvin@gmail.com>
Wed, 14 Apr 2010 16:07:29 +0000 (20:07 +0400)
committerStas Shtin <antisvin@gmail.com>
Wed, 14 Apr 2010 16:07:29 +0000 (20:07 +0400)
src/ipypbx/controllers.py
src/ipypbx/http.py

index 5ae2c30..61fc6f9 100644 (file)
 # You should have received a copy of the GNU General Public License
 # along with IPyPBX.  If not, see <http://www.gnu.org/licenses/>.
 
+"""
+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)
 
         
index 1fc4c87..afb3fb3 100644 (file)
@@ -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):