Queries for sofian.conf generator
[ipypbx] / src / ipypbx / http.py
index b1256f3..a049e42 100644 (file)
@@ -23,21 +23,38 @@ class FreeswitchConfigServer(QtNetwork.QTcpServer):
     """
     TCP server that receives config requests from freeswitch.
     """
-    def __init__(self, parent=None):
-        super(FreeswitchConfigServer, self).__init__(parent)
+    def __init__(self, window):
+        super(FreeswitchConfigServer, self).__init__(window)
 
         self.host = None
         self.port = None
+        self.connection_id = None
         self.is_running = False
+        self.generators = [
+            GenClass(window, self) for GenClass in (
+                SofiaConfGenerator,)]
         
-        self.httpRequestParser = HttpRequestParser()
+        self.httpRequestParser = HttpRequestParser(self)
         
-    def setSocketData(self, host, port):
+    def setSocketData(self, host, port, connection_id):
         """
         Set host and port for socket to listen on.
+
+        If the settings differ from previous values, server gets restarted.
         """
+        # Check if restart is needed before new settings are applied.
+        needs_restart = (
+            (host, port) != (self.host, self.port)) and connection_id
+
+        # Save new settings.
         self.host = host
         self.port = port
+        if connection_id:
+            self.connection_id = connection_id
+
+        # Restart server if necessary.
+        if needs_restart:
+            self.restartServer()
 
     def startServer(self):
         """
@@ -88,11 +105,12 @@ class HttpRequestParser(object):
     """
     A simple state machine for parsing HTTP requests.
     """
-    HTTP_NONE, HTTP_REQUEST, HTTP_HEADERS, HTTP_EMPTY, HTTP_MESSAGE = range(5)
-    HTTP_STATES = ['NONE', 'REQUEST', 'HEADERS', 'EMPTY', 'MESSAGE']
+    HTTP_NONE, HTTP_REQUEST, HTTP_HEADERS, HTTP_EMPTY, HTTP_MESSAGE, \
+        HTTP_DONE = range(6)
+    HTTP_STATES = ['NONE', 'REQUEST', 'HEADERS', 'EMPTY', 'MESSAGE', 'DONE']
     
-    def __init__(self):
-        super(HttpRequestParser, self).__init__()
+    def __init__(self, parent):
+        self.parent = parent
         self.reset()
 
     def reset(self):
@@ -115,7 +133,6 @@ class HttpRequestParser(object):
         """
         for state in self.HTTP_STATES:
             if getattr(self, 'HTTP_%s' % state) == self.state:
-                print self.state, line
                 getattr(self, 'handle%s' % state.title())(line)
                 break
         else:
@@ -162,6 +179,13 @@ class HttpRequestParser(object):
             print k, '=>', v
         print
 
+        for generator in self.parent.generators:
+            if generator.canHandle(self.data):
+                self.state += 1
+                print generator.generateConfig(self.headers)
+        else:
+            print 'No generator found'
+            
 
 
 class FreeswitchConfigGenerator(object):
@@ -172,27 +196,30 @@ class FreeswitchConfigGenerator(object):
     param_match = {}
     section_name = None
 
-    def __init__(self, model):
+    def __init__(self, model, parent):
         self.model = model
+        self.parent = parent
 
-    def check_params(self, params):
+    def canHandle(self, params):
         for key, value in self.param_match.iteritems():
+            print key, value, params.get(key, None)
             if params.get(key, None) != value:
                 return False
         else:
             return True
 
-    def base_elements(self):
+    def baseElements(self):
         root_elt = etree.Element('document')
         section_elt = etree.SubElement(
             root_elt, 'section', name=self.section_name)
         return root_elt, section_elt
-    base_elements = property(base_elements)
+    baseElements = property(baseElements)
 
-    def generate_config(self, params):
+    def generateConfig(self, params):
         return NotImplemented
 
-    def add_params(parent_elt, params):
+    @staticmethod
+    def addParams(parent_elt, params):
         for name, value in params:
             etree.SubElement(parent_elt, 'param', name=name, value=value)
             
@@ -205,26 +232,36 @@ class SofiaConfGenerator(FreeswitchConfigGenerator):
     section_name = 'configuration'
     config_name = 'sofia.conf'
 
-    def generate_config(self, params):
+    def generateConfig(self, params):
         # Get base elements.
-        root_elt, section_elt = self.base_elements
+        root_elt, section_elt = self.baseElements
 
         # Create configuration, settings and profiles elements.
         configuration_elt = etree.SubElement(
             section_elt, 'configuration', name=self.config_name,
             description='%s config' % self.config_name)
         settings_elt = etree.SubElement(configuration_elt, 'settings')
-        profiles_elt = etree.SubElement(self.settings_elt, 'profiles')
+        profiles_elt = etree.SubElement(settings_elt, 'profiles')
 
+        database = self.model.controllers['connection'].model.database()
+        
         # Create all profiles for current host.
-        for profile in self.parent.get_profiles():
+        profiles_query = database.exec_(
+            'select id from ipypbxweb_sipprofile where connection_id = %i' %
+            self.parent.connection_id)
+        while profiles_query.next():
+            profile_id, _ok = profiles_query.value(0).toInt()
             profile_elt = etree.SubElement(profiles_elt, 'profile')
 
             # Create domains for current profile.
             domains_elt = etree.SubElement(profile_elt, 'domains')
-            for domain in self.parent.get_domains_for_profile(profile):
+
+            domains_query = database.exec_(
+                'select host_name from ipypbxweb_domain where profile_id = '
+                '%i' % profile_id)
+            while domains_query.next():
                 domain_elt = etree.SubElement(
-                    domains_elt, 'domain', name=domain.host_name,
+                    domains_elt, 'domain', name=domains_quey.value(0),
                     alias='true', parse='true')
 
             # Create settings for current profile.
@@ -236,7 +273,7 @@ class SofiaConfGenerator(FreeswitchConfigGenerator):
                 ('sip-ip', profile.sip_ip),
                 ('rtp-ip', profile.rtp_ip),
                 ('sip-port', profile.sip_port),
-                ('nonce-ttl'. '60'),
+                ('nonce-ttl', '60'),
                 ('rtp-timer-name', 'soft'),
                 ('codec-prefs', 'PCMU@20i'),
                 ('debug', '1'),