From 05d776aa9fc4b019142a05df6391fd61bf603649 Mon Sep 17 00:00:00 2001 From: Stas Shtin Date: Tue, 20 Apr 2010 18:43:55 +0400 Subject: [PATCH] Minor changes required for running tests --- .gitignore | 2 ++ bin/ipypbx | 6 +++- src/ipypbx/controllers.py | 7 +++-- src/ipypbx/http.py | 74 ++++++++++++++++++++++++--------------------- src/ipypbx/main.py | 5 +-- 5 files changed, 53 insertions(+), 41 deletions(-) diff --git a/.gitignore b/.gitignore index 8d70b4c..6335d60 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ local_settings.py .#* *# _build +.coverage + diff --git a/bin/ipypbx b/bin/ipypbx index 01da890..ac286c8 100755 --- a/bin/ipypbx +++ b/bin/ipypbx @@ -1,2 +1,6 @@ -/usr/bin/python -m ipypbx.main +#!/usr/bin/env python + +if __name__ == '__main__': + import ipypbx + ipypbx.main() diff --git a/src/ipypbx/controllers.py b/src/ipypbx/controllers.py index 316e329..4f40fab 100644 --- a/src/ipypbx/controllers.py +++ b/src/ipypbx/controllers.py @@ -257,8 +257,9 @@ class ConnectionController(BaseController): 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): """ @@ -270,7 +271,7 @@ class ConnectionController(BaseController): """ 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) diff --git a/src/ipypbx/http.py b/src/ipypbx/http.py index 285c4ec..3e76ed9 100644 --- a/src/ipypbx/http.py +++ b/src/ipypbx/http.py @@ -37,18 +37,18 @@ Content-Length: %i %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 = [ - GenClass(window, self) for GenClass in ( + GenClass(database, self) for GenClass in ( SofiaConfGenerator,)] - self.httpRequestParser = HttpRequestParser(self) + self.httpRequestParser = HttpRequestParser() 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'): - print self.httpRequestParser.i, 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) - print - print http_response - print self.httpRequestParser.reset() self.socket.close() + class HttpParseError(Exception): """ Error parsing HTTP request. @@ -128,20 +132,17 @@ class HttpRequestParser(object): """ 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.i += 1 # Initial values for request data. self.method = None self.request_path = None @@ -198,23 +199,18 @@ class HttpRequestParser(object): """ self.state += 1 - def handleMessage(self, line): + def handleBody(self, line): """ 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('&')) - #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): """ @@ -223,16 +219,15 @@ class FreeswitchConfigGenerator(object): param_match = {} - def __init__(self, model, parent): - self.model = model + def __init__(self, database, parent): + self.database = database 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): """ @@ -433,3 +428,12 @@ class DirectoryGenerator(FreeswitchConfigGenerator): self.addParams(user_elt, params) return root_elt + + +class DialplanGenerator(FreeswitchConfigGenerator): + """ + Generates XML dialplans. + """ + + param_match = {'section': 'dialplan'} + diff --git a/src/ipypbx/main.py b/src/ipypbx/main.py index 9c8ebfe..f0422d6 100644 --- a/src/ipypbx/main.py +++ b/src/ipypbx/main.py @@ -58,7 +58,7 @@ def setupDb(prefix=PREFIX, dbname=DB_NAME): for query_string in sql_queries[:-1]: query.exec_(query_string) - return created + return db, created else: # Something went horribly wrong. QtGui.QMessageBox.warning( @@ -77,7 +77,7 @@ if __name__ == '__main__': QtGui.QApplication.installTranslator(translator) # Initialize main window. - created = setupDb() + db, created = setupDb() 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) + # TODO: not needed anymore? if created: main.controllers['connection'].add() sys.exit(app.exec_()) -- 1.7.9.5