26 ''' Parse the information for a manager event
27
28 Keyword Arguments:
29 xml_fragment The XML fragment comment
30
31 Returns:
32 A well-formed XML fragment containing the comments passed in, as well as
33 information obtained from the manager_event macro calls
34 '''
35
36 def __node_contains_parameter(node, parameter):
37 ''' Return whether or not a node contains a given parameter name '''
38 return any([n for n in node.getElementsByTagName("parameter")
39 if __node_contains_attribute(n, parameter)])
40
41 def __node_contains_attribute(node, attribute_name):
42 ''' Return whether or not a node contains a given attribute name '''
43 return any([attr for attr in node.attributes.items()
44 if attr[1] == attribute_name])
45
46 candidate_lines = []
47 type = ""
48
49
50
51 for line in sys.stdin:
53 candidate_lines.append(line)
54 if ");" in line:
55 break
56
57 candidate_string = ''.join(candidate_lines)
59 if not type:
60
61 return ''.join(xml_fragment)
62
63
64 first_paren = candidate_string.index("(", 0)
65 last_paren = candidate_string.rindex(");")
66 candidate_string = candidate_string[first_paren + 1:last_paren]
67
68
69 func_parameter_tokens = candidate_string.split(',')
70
71 if type == "manager_event" or type == "multichan":
72 class_level = func_parameter_tokens[0].strip()
73 event_type = func_parameter_tokens[1].strip()
74 else:
75 class_level = func_parameter_tokens[1].strip()
76 event_type = func_parameter_tokens[2].strip()
77
78 if type == "manager_event":
79 event_parameters = func_parameter_tokens[2].strip()
80 elif type == "ast_manager_event":
81 event_parameters = func_parameter_tokens[3].strip()
82 else:
83 event_parameters = func_parameter_tokens[4].strip()
84
85 parameter_tokens = event_parameters.replace("\"", "").split('\\r\\n')
86
87
88
89 node_text = '<managerEvent language=\"%s\" name=\"%s\" xmlns:xi=\"%s\">'
90 xml_fragment.insert(0, node_text % ('en_US',
91 event_type.strip().
replace(
"\"",
""),
92 'http://www.w3.org/2001/XInclude'))
93 xml_fragment[1] = "<managerEventInstance class=\"%s\">" % (class_level)
94 xml_fragment.insert(
len(xml_fragment),
"</managerEvent>")
95
96
97 dom = xml.dom.minidom.parseString(''.join(xml_fragment))
98
99
100 instance = dom.getElementsByTagName("managerEventInstance")[0]
101 syntax = instance.getElementsByTagName("syntax")
102 if not syntax:
103 syntax = dom.createElement("syntax")
104 instance.appendChild(syntax)
105
106 for node in instance.getElementsByTagName("parameter"):
107 syntax.appendChild(node.cloneNode(True))
108 instance.removeChild(node)
109 else:
110 syntax = syntax[0]
111
112
113
114 for parameter in parameter_tokens:
115 if not len(parameter):
116 continue
117 index = parameter.find(':')
118 if index < 0:
119 index =
len(parameter)
120 parameter = (parameter[:index].strip().
replace(
"\"",
""))
121 if ('%s' not in parameter and
122 not __node_contains_parameter(syntax, parameter)):
123 e = dom.createElement("parameter")
124 e.setAttribute('name', parameter)
125 syntax.appendChild(e)
126
127 return dom.toxml().
replace(
"<?xml version=\"1.0\" ?>",
"").
replace(
128 'xmlns:xi="http://www.w3.org/2001/XInclude"', '')
129
130
static int replace(struct ast_channel *chan, const char *cmd, char *data, struct ast_str **buf, ssize_t len)
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)