diff options
-rw-r--r-- | asterisk/AMI_Functions.ttcn | 66 |
1 files changed, 18 insertions, 48 deletions
diff --git a/asterisk/AMI_Functions.ttcn b/asterisk/AMI_Functions.ttcn index 53a79642..d5139f55 100644 --- a/asterisk/AMI_Functions.ttcn +++ b/asterisk/AMI_Functions.ttcn @@ -32,8 +32,21 @@ const charstring AMI_FIELD_RESPONSE := "Response"; type record AMI_Field { charstring key, charstring val +} with { + encode "TEXT" + variant "SEPARATOR(': ', ':\s+')" }; -type set of AMI_Field AMI_Msg; + +type set of AMI_Field AMI_Msg with { + encode "TEXT" + variant "SEPARATOR('\r\n', '(\r\n)|[\n]')" + variant "END('\r\n', '(\r\n)|[\n]')" +}; + +external function enc_AMI_Msg(in AMI_Msg msg) return charstring + with { extension "prototype(convert) encode(TEXT)" } +external function dec_AMI_Msg(in charstring stream) return AMI_Msg + with { extension "prototype(convert) decode(TEXT)" } template (value) AMI_Field ts_AMI_Field(template (value) charstring key, @@ -102,49 +115,6 @@ tr_AMI_Response_Success := superset( * Functions: */ -function f_AMI_Field_from_str(charstring str) return AMI_Field { - var AMI_Field field; - /* "each field is a key value pair delineated by a ':'. - * A single space MUST follow the ':' and precede the value. "*/ - var integer pos := f_strstr(str, ": ", 0); - if (pos < 0) { - Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, - log2str("Failed parsing AMI_Field: ", str)); - } - field.key := substr(str, 0, pos); - /* skip ": " */ - pos := pos + 2; - field.val := substr(str, pos, lengthof(str) - pos); - return field; -} - -function f_AMI_Msg_from_str(charstring str) return AMI_Msg { - var AMI_Msg msg := {}; - var Misc_Helpers.ro_charstring lines := f_str_split(str, "\n"); - - for (var integer i := 0; i < lengthof(lines); i := i + 1) { - var charstring line := lines[i]; - var AMI_Field field := f_AMI_Field_from_str(lines[i]); - msg := msg & { field }; - } - return msg; -} - -function f_AMI_Field_to_str(AMI_Field field) return charstring { - return field.key & ": " & field.val; -} - -function f_AMI_Msg_to_str(AMI_Msg msg) return charstring { - var charstring str := ""; - - for (var integer i := 0; i < lengthof(msg); i := i + 1) { - str := str & f_AMI_Field_to_str(msg[i]) & "\r\n"; - } - - str := str & "\r\n"; - return str; -} - private function f_ami_wait_for_prompt_str(TELNETasp_PT pt, charstring log_label := "(?)") return charstring { var charstring rx, buf := ""; @@ -153,7 +123,7 @@ return charstring { T.start(mp_ami_prompt_timeout); alt { - [] pt.receive(pattern "\n") { }; + [] pt.receive(pattern "\n") { buf := buf & "\n" }; [] pt.receive(charstring:?) -> value rx { buf := buf & rx; repeat }; [] pt.receive(integer:?) -> value fd { if (fd == -1) { @@ -174,7 +144,7 @@ return charstring { function f_ami_wait_for_prompt(TELNETasp_PT pt, charstring log_label := "(?)") return AMI_Msg { var charstring buf := f_ami_wait_for_prompt_str(pt, log_label); - var AMI_Msg msg := f_AMI_Msg_from_str(buf); + var AMI_Msg msg := dec_AMI_Msg(buf); return msg; } @@ -185,9 +155,9 @@ private function f_ami_transceive_ret_str(TELNETasp_PT pt, charstring tx) return } function f_ami_transceive_ret(TELNETasp_PT pt, template (value) AMI_Msg tx_msg) return AMI_Msg { - var charstring tx_txt := f_AMI_Msg_to_str(valueof(tx_msg)); + var charstring tx_txt := enc_AMI_Msg(valueof(tx_msg)); var charstring resp_txt := f_ami_transceive_ret_str(pt, tx_txt); - return f_AMI_Msg_from_str(resp_txt); + return dec_AMI_Msg(resp_txt); } function f_ami_transceive_match(TELNETasp_PT pt, |