Generate selected handlers

The available event handlers are listed within the events yaml and would
be selected per event.

Change-Id: Ia393009b3a10b6f47f5de9a0e6d44f804576f05a
Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
diff --git a/control/gen-fan-zone-defs.py b/control/gen-fan-zone-defs.py
index 061c314..96fb2fd 100755
--- a/control/gen-fan-zone-defs.py
+++ b/control/gen-fan-zone-defs.py
@@ -16,6 +16,31 @@
 def indent(str, depth):
     return ''.join(4*' '*depth+line for line in str.splitlines(True))
 %>\
+<%def name="genHandler(sig)" buffered="True">
+%if ('type' in sig['sparams']) and \
+    (sig['sparams']['type'] is not None):
+${sig['signal']}<${sig['sparams']['type']}>(
+%else:
+${sig['signal']}(
+%endif
+%for spk in sig['sparams']['params']:
+${sig['sparams'][spk]},
+%endfor
+%if ('type' in sig['hparams']) and \
+    (sig['hparams']['type'] is not None):
+handler::${sig['handler']}<${sig['hparams']['type']}>(
+%else:
+handler::${sig['handler']}(
+%endif
+%for i, hpk in enumerate(sig['hparams']['params']):
+    %if (i+1) != len(sig['hparams']['params']):
+    ${sig['hparams'][hpk]},
+    %else:
+    ${sig['hparams'][hpk]}
+    %endif
+%endfor
+))
+</%def>\
 <%def name="genSSE(event)" buffered="True">
 Group{
 %for member in event['group']:
@@ -58,24 +83,9 @@
         %endif
         %endfor
         ),
-        make_handler(
-            %if ('type' in s['sparams']) and \
-                (s['sparams']['type'] is not None):
-            ${s['signal']}<${s['sparams']['type']}>(
-            %else:
-            ${s['signal']}(
-            %endif
-            %for spk, spv in s['sparams'].iteritems():
-            %if spk != 'type':
-            "${spv}",
-            %endif
-            %endfor
-            handler::setProperty<${s['type']}>(
-                "${s['object']}",
-                "${s['interface']}",
-                "${s['property']}"
-            )
-        ))
+        make_handler(\
+        ${indent(genHandler(sig=s), 3)}\
+        )
     },
 %endfor
 }
@@ -208,24 +218,9 @@
                                 %endif
                                 %endfor
                                 ),
-                                make_handler(
-                                    %if ('type' in s['sparams']) and \
-                                        (s['sparams']['type'] is not None):
-                                    ${s['signal']}<${s['sparams']['type']}>(
-                                    %else:
-                                    ${s['signal']}(
-                                    %endif
-                                    %for spk, spv in s['sparams'].iteritems():
-                                    %if spk != 'type':
-                                    "${spv}",
-                                    %endif
-                                    %endfor
-                                    handler::setProperty<${s['type']}>(
-                                        "${s['object']}",
-                                        "${s['interface']}",
-                                        "${s['property']}"
-                                    )
-                                ))
+                                make_handler(\
+                                ${indent(genHandler(sig=s), 9)}\
+                                )
                             },
                         %endfor
                         }
@@ -342,14 +337,55 @@
             sparams = {}
             if ('parameters' in eSignal) and \
                (eSignal['parameters'] is not None):
+                splist = []
                 for p in eSignal['parameters']:
-                    sparams[str(p)] = member[str(p)]
+                    sp = str(p)
+                    if (sp != 'type'):
+                        splist.append(sp)
+                        if (sp != 'group'):
+                            sparams[sp] = "\"" + member[sp] + "\""
+                        else:
+                            sparams[sp] = "Group{\n"
+                            for m in group:
+                                sparams[sp] += (
+                                    "{\n" +
+                                    "\"" + str(m['object']) + "\",\n" +
+                                    "{\"" + str(m['interface']) + "\"," +
+                                    "\"" + str(m['property']) + "\"}\n" +
+                                    "},\n")
+                            sparams[sp] += "}"
+                    else:
+                        sparams[sp] = member[sp]
+                sparams['params'] = splist
             signal['sparams'] = sparams
-            # Add member attributes
-            signal['object'] = member['object']
-            signal['interface'] = member['interface']
-            signal['property'] = member['property']
-            signal['type'] = member['type']
+            # Add signal handler
+            eHandler = next(h for h in events_data['handlers']
+                            if h['name'] == eSignal['handler'])
+            signal['handler'] = eHandler['name']
+            hparams = {}
+            if ('parameters' in eHandler) and \
+               (eHandler['parameters'] is not None):
+                hplist = []
+                for p in eHandler['parameters']:
+                    hp = str(p)
+                    if (hp != 'type'):
+                        hplist.append(hp)
+                        if (hp != 'group'):
+                            hparams[hp] = "\"" + member[hp] + "\""
+                        else:
+                            hparams[hp] = "Group{\n"
+                            for m in group:
+                                hparams[hp] += (
+                                    "{\n" +
+                                    "\"" + str(m['object']) + "\",\n" +
+                                    "{\"" + str(m['interface']) + "\"," +
+                                    "\"" + str(m['property']) + "\"}\n" +
+                                    "},\n")
+                            hparams[hp] += "}"
+                    else:
+                        hparams[hp] = member[hp]
+                hparams['params'] = hplist
+            signal['hparams'] = hparams
             signals.append(signal)
     event['signals'] = signals
 
@@ -451,14 +487,55 @@
             sparams = {}
             if ('parameters' in eSignal) and \
                (eSignal['parameters'] is not None):
+                splist = []
                 for p in eSignal['parameters']:
-                    sparams[str(p)] = member[str(p)]
+                    sp = str(p)
+                    if (sp != 'type'):
+                        splist.append(sp)
+                        if (sp != 'group'):
+                            sparams[sp] = "\"" + member[sp] + "\""
+                        else:
+                            sparams[sp] = "Group{\n"
+                            for m in group:
+                                sparams[sp] += (
+                                    "{\n" +
+                                    "\"" + str(m['object']) + "\",\n" +
+                                    "{\"" + str(m['interface']) + "\"," +
+                                    "\"" + str(m['property']) + "\"}\n" +
+                                    "},\n")
+                            sparams[sp] += "}"
+                    else:
+                        sparams[sp] = member[sp]
+                sparams['params'] = splist
             signal['sparams'] = sparams
-            # Add member attributes
-            signal['object'] = member['object']
-            signal['interface'] = member['interface']
-            signal['property'] = member['property']
-            signal['type'] = member['type']
+            # Add signal handler
+            eHandler = next(h for h in events_data['handlers']
+                            if h['name'] == eSignal['handler'])
+            signal['handler'] = eHandler['name']
+            hparams = {}
+            if ('parameters' in eHandler) and \
+               (eHandler['parameters'] is not None):
+                hplist = []
+                for p in eHandler['parameters']:
+                    hp = str(p)
+                    if (hp != 'type'):
+                        hplist.append(hp)
+                        if (hp != 'group'):
+                            hparams[hp] = "\"" + member[hp] + "\""
+                        else:
+                            hparams[hp] = "Group{\n"
+                            for m in group:
+                                hparams[hp] += (
+                                    "{\n" +
+                                    "\"" + str(m['object']) + "\",\n" +
+                                    "{\"" + str(m['interface']) + "\"," +
+                                    "\"" + str(m['property']) + "\"}\n" +
+                                    "},\n")
+                            hparams[hp] += "}"
+                    else:
+                        hparams[hp] = member[hp]
+                hparams['params'] = hplist
+            signal['hparams'] = hparams
             signals.append(signal)
     precond['pcsigs'] = signals