Minor changes required for running tests
authorStas Shtin <antisvin@gmail.com>
Tue, 20 Apr 2010 14:43:55 +0000 (18:43 +0400)
committerStas Shtin <antisvin@gmail.com>
Tue, 20 Apr 2010 14:43:55 +0000 (18:43 +0400)
.gitignore
bin/ipypbx
src/ipypbx/controllers.py
src/ipypbx/http.py
src/ipypbx/main.py

index 8d70b4c..6335d60 100644 (file)
@@ -4,3 +4,5 @@ local_settings.py
 .#*
 *#
 _build
 .#*
 *#
 _build
+.coverage
+
index 01da890..ac286c8 100755 (executable)
@@ -1,2 +1,6 @@
-/usr/bin/python -m ipypbx.main
+#!/usr/bin/env python
+
+if __name__ == '__main__':
+    import ipypbx
+    ipypbx.main()
 
 
index 316e329..4f40fab 100644 (file)
@@ -257,8 +257,9 @@ class ConnectionController(BaseController):
                 index.sibling(current_row, 0)).toInt()
 
             # Apply new socket location.
                 index.sibling(current_row, 0)).toInt()
 
             # Apply new socket location.
-            self.servers[current_row].setSocketData(
-                *self.getSocketData(current_row))
+            if current_row < len(self.servers):
+                self.servers[current_row].setSocketData(
+                    *self.getSocketData(current_row))
         
     def objectAdded(self, row, record):
         """
         
     def objectAdded(self, row, record):
         """
@@ -270,7 +271,7 @@ class ConnectionController(BaseController):
         """
         Add a new config server.
         """
         """
         Add a new config server.
         """
-        server = http.FreeswitchConfigServer(self.model)
+        server = http.FreeswitchConfigServer(self.model.database(), self)
         server.setSocketData(host, port, connection_id)
         server.startServer()
         self.servers.append(server)
         server.setSocketData(host, port, connection_id)
         server.startServer()
         self.servers.append(server)
index 285c4ec..3e76ed9 100644 (file)
@@ -37,18 +37,18 @@ Content-Length: %i
 
 %s'''
   
 
 %s'''
   
-    def __init__(self, window):
-        super(FreeswitchConfigServer, self).__init__(window)
+    def __init__(self, database, parent):
+        super(FreeswitchConfigServer, self).__init__(parent)
 
         self.host = None
         self.port = None
         self.connection_id = None
         self.is_running = False
         self.generators = [
 
         self.host = None
         self.port = None
         self.connection_id = None
         self.is_running = False
         self.generators = [
-            GenClass(window, self) for GenClass in (
+            GenClass(database, self) for GenClass in (
                 SofiaConfGenerator,)]
         
                 SofiaConfGenerator,)]
         
-        self.httpRequestParser = HttpRequestParser(self)
+        self.httpRequestParser = HttpRequestParser()
         
     def setSocketData(self, host, port, connection_id):
         """
         
     def setSocketData(self, host, port, connection_id):
         """
@@ -106,18 +106,22 @@ Content-Length: %i
     def receiveData(self):
         # TODO: read in chunks.
         for line in str(self.socket.readAll()).split('\r\n'):
     def receiveData(self):
         # TODO: read in chunks.
         for line in str(self.socket.readAll()).split('\r\n'):
-            print self.httpRequestParser.i, line
             self.httpRequestParser.handle(line)
 
             self.httpRequestParser.handle(line)
 
+        for generator in self.generators:
+            if generator.canHandle(self.httpRequestParser.data):
+                self.state += 1
+                self.result = etree.tostring(generator.generateConfig(
+                    self.httpRequestParser.headers))
+                break
+
         response = self.httpRequestParser.result or self.configNotFound
         http_response = self.responseTemplate % (len(response), response)
         self.socket.write(http_response)
         response = self.httpRequestParser.result or self.configNotFound
         http_response = self.responseTemplate % (len(response), response)
         self.socket.write(http_response)
-        print
-        print http_response
-        print
         self.httpRequestParser.reset()        
         self.socket.close()
 
         self.httpRequestParser.reset()        
         self.socket.close()
 
+
 class HttpParseError(Exception):
     """
     Error parsing HTTP request.
 class HttpParseError(Exception):
     """
     Error parsing HTTP request.
@@ -128,20 +132,17 @@ class HttpRequestParser(object):
     """
     A simple state machine for parsing HTTP requests.
     """
     """
     A simple state machine for parsing HTTP requests.
     """
-    HTTP_NONE, HTTP_REQUEST, HTTP_HEADERS, HTTP_EMPTY, HTTP_MESSAGE, \
-        HTTP_DONE = range(6)
-    HTTP_STATES = ['NONE', 'REQUEST', 'HEADERS', 'EMPTY', 'MESSAGE', 'DONE']
+    HTTP_NONE, HTTP_REQUEST, HTTP_HEADERS, HTTP_EMPTY, HTTP_BODY, HTTP_DONE = \
+        range(6)
+    HTTP_STATES = ['NONE', 'REQUEST', 'HEADERS', 'EMPTY', 'BODY', 'DONE']
     
     
-    def __init__(self, parent):
-        self.parent = parent
-        self.i = 0
+    def __init__(self):
         self.reset()
 
     def reset(self):
         """
         Reset parser to initial state.
         """
         self.reset()
 
     def reset(self):
         """
         Reset parser to initial state.
         """
-        self.i += 1
         # Initial values for request data.
         self.method = None
         self.request_path = None
         # Initial values for request data.
         self.method = None
         self.request_path = None
@@ -198,23 +199,18 @@ class HttpRequestParser(object):
         """
         self.state += 1
 
         """
         self.state += 1
 
-    def handleMessage(self, line):
+    def handleBody(self, line):
         """
         Append to message body.
         """
         """
         Append to message body.
         """
+        if self.method != 'POST':
+            raise HttpParseError('Only POST request are supported')
+            
         self.data = dict(pair.split('=', 2) for pair in line.split('&'))
 
         self.data = dict(pair.split('=', 2) for pair in line.split('&'))
 
-        #for k, v in self.data.items():
-        #    print k, '=>', v
-        #print
-
-        for generator in self.parent.generators:
-            if generator.canHandle(self.data):
-                self.state += 1
-                self.result = etree.tostring(generator.generateConfig(
-                    self.headers))
-                break
-
+    def handleDone(self, line):
+        raise HttpParseError("Can't read past request end")
+    
 
 class FreeswitchConfigGenerator(object):
     """
 
 class FreeswitchConfigGenerator(object):
     """
@@ -223,16 +219,15 @@ class FreeswitchConfigGenerator(object):
     
     param_match = {}
 
     
     param_match = {}
 
-    def __init__(self, model, parent):
-        self.model = model
+    def __init__(self, database, parent):
+        self.database = database
         self.parent = parent
 
         self.parent = parent
 
-    def database(self):
-        """
-        Return database instance.
-        """
-        return self.model.controllers['connection'].model.database()
-    database = property(database)
+#    def database(self):
+#        """
+#        Return database instance.
+#        """
+#        return self.model.controllers['connection'].model.database()
 
     def canHandle(self, params):
         """
 
     def canHandle(self, params):
         """
@@ -433,3 +428,12 @@ class DirectoryGenerator(FreeswitchConfigGenerator):
                 self.addParams(user_elt, params)
 
         return root_elt
                 self.addParams(user_elt, params)
 
         return root_elt
+
+
+class DialplanGenerator(FreeswitchConfigGenerator):
+    """
+    Generates XML dialplans.
+    """
+
+    param_match = {'section': 'dialplan'}
+    
index 9c8ebfe..f0422d6 100644 (file)
@@ -58,7 +58,7 @@ def setupDb(prefix=PREFIX, dbname=DB_NAME):
             for query_string in sql_queries[:-1]:
                 query.exec_(query_string)
 
             for query_string in sql_queries[:-1]:
                 query.exec_(query_string)
 
-        return created
+        return db, created
     else:
         # Something went horribly wrong.
         QtGui.QMessageBox.warning(
     else:
         # Something went horribly wrong.
         QtGui.QMessageBox.warning(
@@ -77,7 +77,7 @@ if __name__ == '__main__':
         QtGui.QApplication.installTranslator(translator)
 
     # Initialize main window.
         QtGui.QApplication.installTranslator(translator)
 
     # Initialize main window.
-    created = setupDb()
+    db, created = setupDb()
     main = QtGui.QMainWindow()
     views = ui.Ui_MainWindow()
     views.setupUi(main)
     main = QtGui.QMainWindow()
     views = ui.Ui_MainWindow()
     views.setupUi(main)
@@ -107,6 +107,7 @@ if __name__ == '__main__':
             QtCore.SIGNAL('currentRowChanged(QModelIndex, QModelIndex)'),
             connection_index, connection_index)
 
             QtCore.SIGNAL('currentRowChanged(QModelIndex, QModelIndex)'),
             connection_index, connection_index)
 
+    # TODO: not needed anymore?
     if created:
         main.controllers['connection'].add()
     sys.exit(app.exec_())
     if created:
         main.controllers['connection'].add()
     sys.exit(app.exec_())