<p>sungtae kim has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/11162">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">res/res_ari_channels.c: Added new ARI /ari/channels/<channelId>/dump<br><br>Added new ARI for channel dump. It is replication of app_dumpchan.c.<br>It will be helpful to check the more detail channel information via<br>ARI.<br><br>ASTERISK-28339<br><br>Change-Id: Ie5b6c8b20a2bda5168ea56114f4241bc818cab10<br>---<br>M res/ari/ari_model_validators.c<br>M res/ari/ari_model_validators.h<br>M res/ari/resource_channels.c<br>M res/ari/resource_channels.h<br>M res/res_ari_channels.c<br>M rest-api/api-docs/channels.json<br>6 files changed, 1,011 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/62/11162/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/res/ari/ari_model_validators.c b/res/ari/ari_model_validators.c</span><br><span>index d5f1885..27db9c0 100644</span><br><span>--- a/res/ari/ari_model_validators.c</span><br><span>+++ b/res/ari/ari_model_validators.c</span><br><span>@@ -1261,6 +1261,556 @@</span><br><span>    return ast_ari_validate_channel;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int ast_ari_validate_channel_dump(struct ast_json *json)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        int res = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct ast_json_iter *iter;</span><br><span style="color: hsl(120, 100%, 40%);">+   int has_1st_file_descriptor = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_answer_time = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_app_data = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ int has_app_name = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ int has_blocking_in = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_bridge_id = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        int has_call_group = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       int has_channel = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  int has_dnid_number = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_dnid_plan = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        int has_elapsed_time = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     int has_frames_in = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        int has_frames_in_desc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   int has_frames_out = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       int has_frames_out_desc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  int has_hold_state = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       int has_id = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       int has_name = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     int has_native_format = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    int has_parkinglot = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       int has_pickup_group = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     int has_raw_read_format = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  int has_raw_write_format = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ int has_rdnis = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    int has_read_format = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_read_transcode = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   int has_read_transcode_path = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_rings = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    int has_time_to_hangup = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   int has_type = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     int has_write_format = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     int has_write_transcode = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  int has_write_transcode_path = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (strcmp("1st_file_descriptor", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_1st_file_descriptor = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                  prop_is_valid = ast_ari_validate_long(</span><br><span style="color: hsl(120, 100%, 40%);">+                                ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field 1st_file_descriptor failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                                res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("answer_time", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_answer_time = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                  prop_is_valid = ast_ari_validate_date(</span><br><span style="color: hsl(120, 100%, 40%);">+                                ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field answer_time failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                                res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("app_data", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_app_data = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                     prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field app_data failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                           res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("app_name", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_app_name = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                     prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field app_name failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                           res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("blocking_in", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_blocking_in = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                  prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field blocking_in failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                                res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("bridge_id", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_bridge_id = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                    prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field bridge_id failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                          res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("call_group", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_call_group = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                   prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field call_group failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                         res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("channel", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_channel = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                      prop_is_valid = ast_ari_validate_channel(</span><br><span style="color: hsl(120, 100%, 40%);">+                             ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field channel failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                            res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("dnid_number", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_dnid_number = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                  prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field dnid_number failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                                res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("dnid_plan", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_dnid_plan = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                    prop_is_valid = ast_ari_validate_long(</span><br><span style="color: hsl(120, 100%, 40%);">+                                ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field dnid_plan failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                          res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("elapsed_time", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_elapsed_time = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                 prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field elapsed_time failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                               res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("frames_in", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_frames_in = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                    prop_is_valid = ast_ari_validate_long(</span><br><span style="color: hsl(120, 100%, 40%);">+                                ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field frames_in failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                          res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("frames_in_desc", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_frames_in_desc = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                       prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field frames_in_desc failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                             res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("frames_out", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_frames_out = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                   prop_is_valid = ast_ari_validate_long(</span><br><span style="color: hsl(120, 100%, 40%);">+                                ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field frames_out failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                         res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("frames_out_desc", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_frames_out_desc = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                      prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field frames_out_desc failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                            res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("hold_state", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_hold_state = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                   prop_is_valid = ast_ari_validate_long(</span><br><span style="color: hsl(120, 100%, 40%);">+                                ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field hold_state failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                         res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("id", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_id = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                   prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field id failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                         res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("name", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_name = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                 prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field name failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                               res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("native_format", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_native_format = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                        prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field native_format failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                              res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("parkinglot", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_parkinglot = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                   prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field parkinglot failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                         res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("pickup_group", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_pickup_group = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                 prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field pickup_group failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                               res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("raw_read_format", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_raw_read_format = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                      prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field raw_read_format failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                            res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("raw_write_format", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_raw_write_format = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                     prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field raw_write_format failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                           res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("rdnis", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_rdnis = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                        prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field rdnis failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                              res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("read_format", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_read_format = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                  prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field read_format failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                                res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("read_transcode", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_read_transcode = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                       prop_is_valid = ast_ari_validate_long(</span><br><span style="color: hsl(120, 100%, 40%);">+                                ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field read_transcode failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                             res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("read_transcode_path", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_read_transcode_path = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                  prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field read_transcode_path failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                                res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("rings", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_rings = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                        prop_is_valid = ast_ari_validate_long(</span><br><span style="color: hsl(120, 100%, 40%);">+                                ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field rings failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                              res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("time_to_hangup", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_time_to_hangup = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                       prop_is_valid = ast_ari_validate_long(</span><br><span style="color: hsl(120, 100%, 40%);">+                                ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field time_to_hangup failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                             res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_type = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                 prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field type failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                               res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("write_format", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_write_format = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                 prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field write_format failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                               res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("write_transcode", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_write_transcode = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                      prop_is_valid = ast_ari_validate_long(</span><br><span style="color: hsl(120, 100%, 40%);">+                                ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field write_transcode failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                            res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("write_transcode_path", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_write_transcode_path = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                 prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI ChannelDump field write_transcode_path failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                               res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                {</span><br><span style="color: hsl(120, 100%, 40%);">+                     ast_log(LOG_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                            "ARI ChannelDump has undocumented field %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_key(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                      res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_1st_file_descriptor) {</span><br><span style="color: hsl(120, 100%, 40%);">+               ast_log(LOG_ERROR, "ARI ChannelDump missing required field 1st_file_descriptor\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_answer_time) {</span><br><span style="color: hsl(120, 100%, 40%);">+               ast_log(LOG_ERROR, "ARI ChannelDump missing required field answer_time\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_app_data) {</span><br><span style="color: hsl(120, 100%, 40%);">+          ast_log(LOG_ERROR, "ARI ChannelDump missing required field app_data\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_app_name) {</span><br><span style="color: hsl(120, 100%, 40%);">+          ast_log(LOG_ERROR, "ARI ChannelDump missing required field app_name\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_blocking_in) {</span><br><span style="color: hsl(120, 100%, 40%);">+               ast_log(LOG_ERROR, "ARI ChannelDump missing required field blocking_in\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_bridge_id) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI ChannelDump missing required field bridge_id\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_call_group) {</span><br><span style="color: hsl(120, 100%, 40%);">+                ast_log(LOG_ERROR, "ARI ChannelDump missing required field call_group\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_channel) {</span><br><span style="color: hsl(120, 100%, 40%);">+           ast_log(LOG_ERROR, "ARI ChannelDump missing required field channel\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_dnid_number) {</span><br><span style="color: hsl(120, 100%, 40%);">+               ast_log(LOG_ERROR, "ARI ChannelDump missing required field dnid_number\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_dnid_plan) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI ChannelDump missing required field dnid_plan\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_elapsed_time) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ast_log(LOG_ERROR, "ARI ChannelDump missing required field elapsed_time\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_frames_in) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI ChannelDump missing required field frames_in\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_frames_in_desc) {</span><br><span style="color: hsl(120, 100%, 40%);">+            ast_log(LOG_ERROR, "ARI ChannelDump missing required field frames_in_desc\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_frames_out) {</span><br><span style="color: hsl(120, 100%, 40%);">+                ast_log(LOG_ERROR, "ARI ChannelDump missing required field frames_out\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_frames_out_desc) {</span><br><span style="color: hsl(120, 100%, 40%);">+           ast_log(LOG_ERROR, "ARI ChannelDump missing required field frames_out_desc\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_hold_state) {</span><br><span style="color: hsl(120, 100%, 40%);">+                ast_log(LOG_ERROR, "ARI ChannelDump missing required field hold_state\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_id) {</span><br><span style="color: hsl(120, 100%, 40%);">+                ast_log(LOG_ERROR, "ARI ChannelDump missing required field id\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_name) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ast_log(LOG_ERROR, "ARI ChannelDump missing required field name\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_native_format) {</span><br><span style="color: hsl(120, 100%, 40%);">+             ast_log(LOG_ERROR, "ARI ChannelDump missing required field native_format\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_parkinglot) {</span><br><span style="color: hsl(120, 100%, 40%);">+                ast_log(LOG_ERROR, "ARI ChannelDump missing required field parkinglot\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_pickup_group) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ast_log(LOG_ERROR, "ARI ChannelDump missing required field pickup_group\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_raw_read_format) {</span><br><span style="color: hsl(120, 100%, 40%);">+           ast_log(LOG_ERROR, "ARI ChannelDump missing required field raw_read_format\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_raw_write_format) {</span><br><span style="color: hsl(120, 100%, 40%);">+          ast_log(LOG_ERROR, "ARI ChannelDump missing required field raw_write_format\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_rdnis) {</span><br><span style="color: hsl(120, 100%, 40%);">+             ast_log(LOG_ERROR, "ARI ChannelDump missing required field rdnis\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_read_format) {</span><br><span style="color: hsl(120, 100%, 40%);">+               ast_log(LOG_ERROR, "ARI ChannelDump missing required field read_format\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_read_transcode) {</span><br><span style="color: hsl(120, 100%, 40%);">+            ast_log(LOG_ERROR, "ARI ChannelDump missing required field read_transcode\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_read_transcode_path) {</span><br><span style="color: hsl(120, 100%, 40%);">+               ast_log(LOG_ERROR, "ARI ChannelDump missing required field read_transcode_path\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_rings) {</span><br><span style="color: hsl(120, 100%, 40%);">+             ast_log(LOG_ERROR, "ARI ChannelDump missing required field rings\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_time_to_hangup) {</span><br><span style="color: hsl(120, 100%, 40%);">+            ast_log(LOG_ERROR, "ARI ChannelDump missing required field time_to_hangup\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_type) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ast_log(LOG_ERROR, "ARI ChannelDump missing required field type\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_write_format) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ast_log(LOG_ERROR, "ARI ChannelDump missing required field write_format\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_write_transcode) {</span><br><span style="color: hsl(120, 100%, 40%);">+           ast_log(LOG_ERROR, "ARI ChannelDump missing required field write_transcode\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_write_transcode_path) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ast_log(LOG_ERROR, "ARI ChannelDump missing required field write_transcode_path\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return res;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ari_validator ast_ari_validate_channel_dump_fn(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     return ast_ari_validate_channel_dump;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int ast_ari_validate_dialed(struct ast_json *json)</span><br><span> {</span><br><span>        int res = 1;</span><br><span>diff --git a/res/ari/ari_model_validators.h b/res/ari/ari_model_validators.h</span><br><span>index 484f9c1..9f6bf96 100644</span><br><span>--- a/res/ari/ari_model_validators.h</span><br><span>+++ b/res/ari/ari_model_validators.h</span><br><span>@@ -442,6 +442,24 @@</span><br><span> ari_validator ast_ari_validate_channel_fn(void);</span><br><span> </span><br><span> /*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Validator for ChannelDump.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Channel's detail dump info.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param json JSON object to validate.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \returns True (non-zero) if valid.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \returns False (zero) if invalid.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int ast_ari_validate_channel_dump(struct ast_json *json);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Function pointer to ast_ari_validate_channel_dump().</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * See \ref ast_ari_model_validators.h for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+ari_validator ast_ari_validate_channel_dump_fn(void);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span>  * \brief Validator for Dialed.</span><br><span>  *</span><br><span>  * Dialed channel information.</span><br><span>@@ -1497,6 +1515,40 @@</span><br><span>  * - language: string (required)</span><br><span>  * - name: string (required)</span><br><span>  * - state: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * ChannelDump</span><br><span style="color: hsl(120, 100%, 40%);">+ * - 1st_file_descriptor: long (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - answer_time: Date (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - app_data: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - app_name: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - blocking_in: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - bridge_id: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - call_group: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - channel: Channel (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - dnid_number: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - dnid_plan: long (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - elapsed_time: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - frames_in: long (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - frames_in_desc: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - frames_out: long (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - frames_out_desc: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - hold_state: long (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - id: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - name: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - native_format: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - parkinglot: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - pickup_group: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - raw_read_format: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - raw_write_format: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - rdnis: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - read_format: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - read_transcode: long (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - read_transcode_path: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - rings: long (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - time_to_hangup: long (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - type: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - write_format: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - write_transcode: long (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - write_transcode_path: string (required)</span><br><span>  * Dialed</span><br><span>  * DialplanCEP</span><br><span>  * - context: string (required)</span><br><span>diff --git a/res/ari/resource_channels.c b/res/ari/resource_channels.c</span><br><span>index eca70ce..9f047ac 100644</span><br><span>--- a/res/ari/resource_channels.c</span><br><span>+++ b/res/ari/resource_channels.c</span><br><span>@@ -43,6 +43,7 @@</span><br><span> #include "asterisk/core_local.h"</span><br><span> #include "asterisk/dial.h"</span><br><span> #include "asterisk/max_forwards.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "asterisk/translate.h"</span><br><span> #include "resource_channels.h"</span><br><span> </span><br><span> #include <limits.h></span><br><span>@@ -1966,3 +1967,132 @@</span><br><span> </span><br><span>       ast_ari_response_no_content(response);</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct ast_json *ari_channel_dump_create(const char *chan_id)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct ast_json *j_res;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct ast_bridge *bridge;</span><br><span style="color: hsl(120, 100%, 40%);">+    char elapsed_time[100];</span><br><span style="color: hsl(120, 100%, 40%);">+       char cgrp[256];</span><br><span style="color: hsl(120, 100%, 40%);">+       char pgrp[256];</span><br><span style="color: hsl(120, 100%, 40%);">+       struct ast_str *format_buf = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);</span><br><span style="color: hsl(120, 100%, 40%);">+        struct ast_str *write_transpath = ast_str_alloca(256);</span><br><span style="color: hsl(120, 100%, 40%);">+        struct ast_str *read_transpath = ast_str_alloca(256);</span><br><span style="color: hsl(120, 100%, 40%);">+ long elapsed_seconds;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ast_channel *chan;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct ast_channel_snapshot *snapshot;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    chan = ast_channel_get_by_name(chan_id);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!chan) {</span><br><span style="color: hsl(120, 100%, 40%);">+          return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   snapshot = ast_channel_snapshot_get_latest(chan_id);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!snapshot) {</span><br><span style="color: hsl(120, 100%, 40%);">+              return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   ast_channel_lock(chan);</span><br><span style="color: hsl(120, 100%, 40%);">+       bridge = ast_channel_get_bridge(chan);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      snapshot = ast_channel_snapshot_get_latest(chan_id);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        elapsed_seconds = ast_channel_get_duration(chan);</span><br><span style="color: hsl(120, 100%, 40%);">+     snprintf(elapsed_time, sizeof(elapsed_time), "%02ld:%02ld:%02ld",</span><br><span style="color: hsl(120, 100%, 40%);">+                   elapsed_seconds / 3600,</span><br><span style="color: hsl(120, 100%, 40%);">+                       (elapsed_seconds % 3600) / 60,</span><br><span style="color: hsl(120, 100%, 40%);">+                        elapsed_seconds % 60</span><br><span style="color: hsl(120, 100%, 40%);">+                  );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  j_res = ast_json_pack("{"</span><br><span style="color: hsl(120, 100%, 40%);">+                   "s: s, s: s, s: s,"</span><br><span style="color: hsl(120, 100%, 40%);">+                 "s: o,"</span><br><span style="color: hsl(120, 100%, 40%);">+                     "s: s, s: i, s: s,"</span><br><span style="color: hsl(120, 100%, 40%);">+                 "s: s, s: i, s: o, s:i,"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                  "s: s, s: s, s: s,"</span><br><span style="color: hsl(120, 100%, 40%);">+                 "s: s, s: s,"</span><br><span style="color: hsl(120, 100%, 40%);">+                       "s: i, s: s, s: i, s: s,"</span><br><span style="color: hsl(120, 100%, 40%);">+                   "s: i,"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   "s: i, s: s,"</span><br><span style="color: hsl(120, 100%, 40%);">+                       "s: i, s: s,"</span><br><span style="color: hsl(120, 100%, 40%);">+                       "s: I, s: s, s: s,"</span><br><span style="color: hsl(120, 100%, 40%);">+                 "s: s, s: s,"</span><br><span style="color: hsl(120, 100%, 40%);">+                       "s: s, s: s, s: s"</span><br><span style="color: hsl(120, 100%, 40%);">+                  "}",</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                      "id", chan_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                      "name",       ast_channel_name(chan),</span><br><span style="color: hsl(120, 100%, 40%);">+                       "type",       ast_channel_tech(chan)->type,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                    "channel", ast_channel_snapshot_to_json(snapshot, NULL),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                  "dnid_number",        S_OR(ast_channel_dialed(chan)->number.str, ""),</span><br><span style="color: hsl(120, 100%, 40%);">+                  "dnid_plan",  ast_channel_dialed(chan)->number.plan,</span><br><span style="color: hsl(120, 100%, 40%);">+                     "rdnis",              S_COR(ast_channel_redirecting(chan)->from.number.valid, ast_channel_redirecting(chan)->from.number.str, ""),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                        "parkinglot", S_OR(ast_channel_parkinglot(chan), ""),</span><br><span style="color: hsl(120, 100%, 40%);">+                     "rings",              ast_channel_rings(chan),</span><br><span style="color: hsl(120, 100%, 40%);">+                      "answer_time",        ast_json_timeval(ast_channel_answertime(chan), NULL),</span><br><span style="color: hsl(120, 100%, 40%);">+                 "hold_state", ast_channel_hold_state(chan),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                       "native_format",      S_OR(ast_format_cap_get_names(ast_channel_nativeformats(chan), &format_buf), ""),</span><br><span style="color: hsl(120, 100%, 40%);">+                       "write_format",               S_OR(ast_format_get_name(ast_channel_writeformat(chan)), ""),</span><br><span style="color: hsl(120, 100%, 40%);">+                       "read_format",                S_OR(ast_format_get_name(ast_channel_readformat(chan)), ""),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                      "raw_write_format",   S_OR(ast_format_get_name(ast_channel_rawwriteformat(chan)), ""),</span><br><span style="color: hsl(120, 100%, 40%);">+                    "raw_read_format",    S_OR(ast_format_get_name(ast_channel_rawreadformat(chan)), ""),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   "write_transcode",            ast_channel_writetrans(chan) ? 1 : 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                 "write_transcode_path", S_OR(ast_translate_path_to_str(ast_channel_writetrans(chan), &write_transpath), ""),</span><br><span style="color: hsl(120, 100%, 40%);">+                  "read_transcode",             ast_channel_readtrans(chan) ? 1 : 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                  "read_transcode_path",        S_OR(ast_translate_path_to_str(ast_channel_readtrans(chan), &read_transpath), ""),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                    "1st_file_descriptor",        ast_channel_fd(chan, 0),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                  "frames_in",          ast_channel_fin(chan) & ~DEBUGCHAN_FLAG,</span><br><span style="color: hsl(120, 100%, 40%);">+                  "frames_in_desc",     S_COR((ast_channel_fin(chan) & DEBUGCHAN_FLAG), "DEBUGGED", ""),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                    "frames_out",         ast_channel_fout(chan) & ~DEBUGCHAN_FLAG,</span><br><span style="color: hsl(120, 100%, 40%);">+                 "frames_out_desc",    S_COR((ast_channel_fout(chan) & DEBUGCHAN_FLAG), "DEBUGGED", ""),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   "time_to_hangup",     ast_channel_whentohangup(chan)->tv_sec,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "elapsed_time",               S_OR(elapsed_time, ""),</span><br><span style="color: hsl(120, 100%, 40%);">+                     "bridge_id",          bridge? bridge->uniqueid : "",</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                 "call_group", S_OR(ast_print_group(cgrp, sizeof(cgrp), ast_channel_callgroup(chan)), ""),</span><br><span style="color: hsl(120, 100%, 40%);">+                 "pickup_group",       S_OR(ast_print_group(pgrp, sizeof(pgrp), ast_channel_pickupgroup(chan)), ""),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                     "app_name",           S_OR(ast_channel_appl(chan), ""),</span><br><span style="color: hsl(120, 100%, 40%);">+                   "app_data",           S_OR(ast_channel_data(chan), ""),</span><br><span style="color: hsl(120, 100%, 40%);">+                   "blocking_in", (ast_test_flag(ast_channel_flags(chan), AST_FLAG_BLOCKING) ? ast_channel_blockproc(chan) : "")</span><br><span style="color: hsl(120, 100%, 40%);">+                     );</span><br><span style="color: hsl(120, 100%, 40%);">+    ao2_cleanup(snapshot);</span><br><span style="color: hsl(120, 100%, 40%);">+        ao2_cleanup(bridge);</span><br><span style="color: hsl(120, 100%, 40%);">+  ast_channel_unlock(chan);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!j_res) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_WARNING, "Could not pack channel dump info. channel: %s\n", chan_id);</span><br><span style="color: hsl(120, 100%, 40%);">+           return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return j_res;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void ast_ari_channels_get_dump(struct ast_variable *headers,</span><br><span style="color: hsl(120, 100%, 40%);">+      struct ast_ari_channels_get_dump_args *args,</span><br><span style="color: hsl(120, 100%, 40%);">+  struct ast_ari_response *response)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ast_json *j_dump;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    j_dump = ari_channel_dump_create(args->channel_id);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!j_dump) {</span><br><span style="color: hsl(120, 100%, 40%);">+                ast_ari_response_error(response, 404, "Not Found", "Channel not found");</span><br><span style="color: hsl(120, 100%, 40%);">+          return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   ast_ari_response_ok(response, j_dump);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/res/ari/resource_channels.h b/res/ari/resource_channels.h</span><br><span>index fdd7a6b..d8be001 100644</span><br><span>--- a/res/ari/resource_channels.h</span><br><span>+++ b/res/ari/resource_channels.h</span><br><span>@@ -354,6 +354,19 @@</span><br><span>  * \param[out] response HTTP response</span><br><span>  */</span><br><span> void ast_ari_channels_ring_stop(struct ast_variable *headers, struct ast_ari_channels_ring_stop_args *args, struct ast_ari_response *response);</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Argument struct for ast_ari_channels_get_dump() */</span><br><span style="color: hsl(120, 100%, 40%);">+struct ast_ari_channels_get_dump_args {</span><br><span style="color: hsl(120, 100%, 40%);">+ /*! Channel's id */</span><br><span style="color: hsl(120, 100%, 40%);">+       const char *channel_id;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Returns channel's detail dump.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param headers HTTP headers</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param args Swagger parameters</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[out] response HTTP response</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+void ast_ari_channels_get_dump(struct ast_variable *headers, struct ast_ari_channels_get_dump_args *args, struct ast_ari_response *response);</span><br><span> /*! Argument struct for ast_ari_channels_send_dtmf() */</span><br><span> struct ast_ari_channels_send_dtmf_args {</span><br><span>      /*! Channel's id */</span><br><span>diff --git a/res/res_ari_channels.c b/res/res_ari_channels.c</span><br><span>index 3d96d60..e1bfc1e 100644</span><br><span>--- a/res/res_ari_channels.c</span><br><span>+++ b/res/res_ari_channels.c</span><br><span>@@ -1132,6 +1132,64 @@</span><br><span> fin: __attribute__((unused))</span><br><span>        return;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Parameter parsing callback for /channels/{channelId}/dump.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param get_params GET parameters in the HTTP request.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param path_vars Path variables extracted from the request.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param headers HTTP headers.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[out] response Response to the HTTP request.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static void ast_ari_channels_get_dump_cb(</span><br><span style="color: hsl(120, 100%, 40%);">+     struct ast_tcptls_session_instance *ser,</span><br><span style="color: hsl(120, 100%, 40%);">+      struct ast_variable *get_params, struct ast_variable *path_vars,</span><br><span style="color: hsl(120, 100%, 40%);">+      struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct ast_ari_channels_get_dump_args args = {};</span><br><span style="color: hsl(120, 100%, 40%);">+      struct ast_variable *i;</span><br><span style="color: hsl(120, 100%, 40%);">+#if defined(AST_DEVMODE)</span><br><span style="color: hsl(120, 100%, 40%);">+     int is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+ int code;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif /* AST_DEVMODE */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = path_vars; i; i = i->next) {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (strcmp(i->name, "channelId") == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 args.channel_id = (i->value);</span><br><span style="color: hsl(120, 100%, 40%);">+              } else</span><br><span style="color: hsl(120, 100%, 40%);">+                {}</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     ast_ari_channels_get_dump(headers, &args, response);</span><br><span style="color: hsl(120, 100%, 40%);">+#if defined(AST_DEVMODE)</span><br><span style="color: hsl(120, 100%, 40%);">+    code = response->response_code;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  switch (code) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case 0: /* Implementation is still a stub, or the code wasn't set */</span><br><span style="color: hsl(120, 100%, 40%);">+              is_valid = response->message == NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case 500: /* Internal Server Error */</span><br><span style="color: hsl(120, 100%, 40%);">+ case 501: /* Not Implemented */</span><br><span style="color: hsl(120, 100%, 40%);">+       case 404: /* Channel not found */</span><br><span style="color: hsl(120, 100%, 40%);">+             is_valid = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              if (200 <= code && code <= 299) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       is_valid = ast_ari_validate_channel_dump(</span><br><span style="color: hsl(120, 100%, 40%);">+                             response->message);</span><br><span style="color: hsl(120, 100%, 40%);">+                } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      ast_log(LOG_ERROR, "Invalid error response %d for /channels/{channelId}/dump\n", code);</span><br><span style="color: hsl(120, 100%, 40%);">+                     is_valid = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ast_log(LOG_ERROR, "Response validation failed for /channels/{channelId}/dump\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          ast_ari_response_error(response, 500,</span><br><span style="color: hsl(120, 100%, 40%);">+                 "Internal Server Error", "Response validation failed");</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+#endif /* AST_DEVMODE */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+fin: __attribute__((unused))</span><br><span style="color: hsl(120, 100%, 40%);">+   return;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> int ast_ari_channels_send_dtmf_parse_body(</span><br><span>     struct ast_json *body,</span><br><span>       struct ast_ari_channels_send_dtmf_args *args)</span><br><span>@@ -2806,6 +2864,15 @@</span><br><span>       .children = {  }</span><br><span> };</span><br><span> /*! \brief REST handler for /api-docs/channels.json */</span><br><span style="color: hsl(120, 100%, 40%);">+static struct stasis_rest_handlers channels_channelId_dump = {</span><br><span style="color: hsl(120, 100%, 40%);">+      .path_segment = "dump",</span><br><span style="color: hsl(120, 100%, 40%);">+     .callbacks = {</span><br><span style="color: hsl(120, 100%, 40%);">+                [AST_HTTP_GET] = ast_ari_channels_get_dump_cb,</span><br><span style="color: hsl(120, 100%, 40%);">+        },</span><br><span style="color: hsl(120, 100%, 40%);">+    .num_children = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+    .children = {  }</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+/*! \brief REST handler for /api-docs/channels.json */</span><br><span> static struct stasis_rest_handlers channels_channelId_dtmf = {</span><br><span>       .path_segment = "dtmf",</span><br><span>    .callbacks = {</span><br><span>@@ -2929,8 +2996,8 @@</span><br><span>               [AST_HTTP_POST] = ast_ari_channels_originate_with_id_cb,</span><br><span>             [AST_HTTP_DELETE] = ast_ari_channels_hangup_cb,</span><br><span>      },</span><br><span style="color: hsl(0, 100%, 40%);">-      .num_children = 15,</span><br><span style="color: hsl(0, 100%, 40%);">-     .children = { &channels_channelId_continue,&channels_channelId_move,&channels_channelId_redirect,&channels_channelId_answer,&channels_channelId_ring,&channels_channelId_dtmf,&channels_channelId_mute,&channels_channelId_hold,&channels_channelId_moh,&channels_channelId_silence,&channels_channelId_play,&channels_channelId_record,&channels_channelId_variable,&channels_channelId_snoop,&channels_channelId_dial, }</span><br><span style="color: hsl(120, 100%, 40%);">+        .num_children = 16,</span><br><span style="color: hsl(120, 100%, 40%);">+   .children = { &channels_channelId_continue,&channels_channelId_move,&channels_channelId_redirect,&channels_channelId_answer,&channels_channelId_ring,&channels_channelId_dump,&channels_channelId_dtmf,&channels_channelId_mute,&channels_channelId_hold,&channels_channelId_moh,&channels_channelId_silence,&channels_channelId_play,&channels_channelId_record,&channels_channelId_variable,&channels_channelId_snoop,&channels_channelId_dial, }</span><br><span> };</span><br><span> /*! \brief REST handler for /api-docs/channels.json */</span><br><span> static struct stasis_rest_handlers channels = {</span><br><span>diff --git a/rest-api/api-docs/channels.json b/rest-api/api-docs/channels.json</span><br><span>index 6161934..80af694 100644</span><br><span>--- a/rest-api/api-docs/channels.json</span><br><span>+++ b/rest-api/api-docs/channels.json</span><br><span>@@ -718,6 +718,34 @@</span><br><span>                       ]</span><br><span>            },</span><br><span>           {</span><br><span style="color: hsl(120, 100%, 40%);">+                     "path": "/channels/{channelId}/dump",</span><br><span style="color: hsl(120, 100%, 40%);">+                     "description": "Get channel info dump",</span><br><span style="color: hsl(120, 100%, 40%);">+                   "operations": [</span><br><span style="color: hsl(120, 100%, 40%);">+                             {</span><br><span style="color: hsl(120, 100%, 40%);">+                                     "httpMethod": "GET",</span><br><span style="color: hsl(120, 100%, 40%);">+                                      "summary": "Returns channel's detail dump.",</span><br><span style="color: hsl(120, 100%, 40%);">+                                  "nickname": "getDump",</span><br><span style="color: hsl(120, 100%, 40%);">+                                    "responseClass": "ChannelDump",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "parameters": [</span><br><span style="color: hsl(120, 100%, 40%);">+                                             {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     "name": "channelId",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      "description": "Channel's id",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                        "paramType": "path",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   "allowMultiple": false,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     "dataType": "string"</span><br><span style="color: hsl(120, 100%, 40%);">+                                              }</span><br><span style="color: hsl(120, 100%, 40%);">+                                     ],</span><br><span style="color: hsl(120, 100%, 40%);">+                                    "errorResponses": [</span><br><span style="color: hsl(120, 100%, 40%);">+                                         {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     "code": 404,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                        "reason": "Channel not found"</span><br><span style="color: hsl(120, 100%, 40%);">+                                             }</span><br><span style="color: hsl(120, 100%, 40%);">+                                     ]</span><br><span style="color: hsl(120, 100%, 40%);">+                             }</span><br><span style="color: hsl(120, 100%, 40%);">+                     ]</span><br><span style="color: hsl(120, 100%, 40%);">+             },</span><br><span style="color: hsl(120, 100%, 40%);">+            {</span><br><span>                    "path": "/channels/{channelId}/dtmf",</span><br><span>                    "description": "Send DTMF to a channel",</span><br><span>                         "operations": [</span><br><span>@@ -1763,6 +1791,175 @@</span><br><span>                          }</span><br><span>                    }</span><br><span>            },</span><br><span style="color: hsl(120, 100%, 40%);">+            "ChannelDump": {</span><br><span style="color: hsl(120, 100%, 40%);">+                    "id": "ChannelDump",</span><br><span style="color: hsl(120, 100%, 40%);">+                      "description": "Channel's detail dump info.",</span><br><span style="color: hsl(120, 100%, 40%);">+                 "properties": {</span><br><span style="color: hsl(120, 100%, 40%);">+                             "id": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                     "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "decription": "Channel's id."</span><br><span style="color: hsl(120, 100%, 40%);">+                         },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "name": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "decription": "Name of the channel (i.e. PJSIP/foo-0000a7e3)"</span><br><span style="color: hsl(120, 100%, 40%);">+                             },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "type": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "decription": "Channel's type"</span><br><span style="color: hsl(120, 100%, 40%);">+                                },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "channel": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                        "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "Channel",</span><br><span style="color: hsl(120, 100%, 40%);">+                                        "description": "Channel info."</span><br><span style="color: hsl(120, 100%, 40%);">+                            },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "dnid_number": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                    "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "description": "Dialed Number Identifier. Subscriber phone number."</span><br><span style="color: hsl(120, 100%, 40%);">+                               },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "dnid_plan": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                      "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "long",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "description": "Dialed Number Identifier. Q.931 Type-Of-Number and Numbering-Plan encoded fields."</span><br><span style="color: hsl(120, 100%, 40%);">+                                },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "rdnis": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                  "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "description": "Dialed Number Identifier for redirecting. Subscriber phone number."</span><br><span style="color: hsl(120, 100%, 40%);">+                               },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "parkinglot": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                     "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "description": "Parkinglot name."</span><br><span style="color: hsl(120, 100%, 40%);">+                         },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "rings": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                  "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "long",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "description": "Number of rings so far."</span><br><span style="color: hsl(120, 100%, 40%);">+                          },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "answer_time": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                    "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "Date",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "description": "Answered time."</span><br><span style="color: hsl(120, 100%, 40%);">+                           },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "hold_state": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                     "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "long",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "description": "Channel's hold state. 16: hold, 17: unhold."</span><br><span style="color: hsl(120, 100%, 40%);">+                          },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "native_format": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                  "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "description": "Channel's native codec format. Channel can natively handle this format."</span><br><span style="color: hsl(120, 100%, 40%);">+                              },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "write_format": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "description": "Requested write format (before translation)"</span><br><span style="color: hsl(120, 100%, 40%);">+                              },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "read_format": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                    "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "description": "Requested read format (after translation)."</span><br><span style="color: hsl(120, 100%, 40%);">+                               },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "raw_write_format": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                       "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "description": "Raw write format (after translation)."</span><br><span style="color: hsl(120, 100%, 40%);">+                            },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "raw_read_format": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                        "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "description": "Raw read format (before translation)."</span><br><span style="color: hsl(120, 100%, 40%);">+                            },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "write_transcode": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                        "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "long",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "description": "If this channel use transcode, sets to 1."</span><br><span style="color: hsl(120, 100%, 40%);">+                                },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "write_transcode_path": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "description": "Write translation path."</span><br><span style="color: hsl(120, 100%, 40%);">+                          },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "read_transcode": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "long",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "description": "If this channel use transcode, sets to 1."</span><br><span style="color: hsl(120, 100%, 40%);">+                                },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "read_transcode_path": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                    "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "description": "Read translation path."</span><br><span style="color: hsl(120, 100%, 40%);">+                           },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "1st_file_descriptor": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                    "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "long",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "description": "Channel's first file descriptor."</span><br><span style="color: hsl(120, 100%, 40%);">+                             },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "frames_in": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                      "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "long",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "description": "Frames in counters."</span><br><span style="color: hsl(120, 100%, 40%);">+                              },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "frames_in_desc": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string"</span><br><span style="color: hsl(120, 100%, 40%);">+                          },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "frames_out": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                     "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "long",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "description": "Frames out counters."</span><br><span style="color: hsl(120, 100%, 40%);">+                             },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "frames_out_desc": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                        "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string"</span><br><span style="color: hsl(120, 100%, 40%);">+                          },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "time_to_hangup": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "long",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "description": "Time to hangup in second."</span><br><span style="color: hsl(120, 100%, 40%);">+                                },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "elapsed_time": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "description": "Channel elapsed time. hh:mm:ss"</span><br><span style="color: hsl(120, 100%, 40%);">+                           },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "bridge_id": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                      "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "description": "Bridge id, if exsits."</span><br><span style="color: hsl(120, 100%, 40%);">+                            },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "call_group": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                     "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "description": "Call group for call pickups"</span><br><span style="color: hsl(120, 100%, 40%);">+                              },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "pickup_group": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "description": "Pickup group - which calls groups can be picked up?"</span><br><span style="color: hsl(120, 100%, 40%);">+                              },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "app_name": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                       "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "description": "Currentl application name."</span><br><span style="color: hsl(120, 100%, 40%);">+                               },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "app_data": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                       "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "description": "Currentl application data."</span><br><span style="color: hsl(120, 100%, 40%);">+                               },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "blocking_in": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                    "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "description": "Procedure causing blocking."</span><br><span style="color: hsl(120, 100%, 40%);">+                              }</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+             },</span><br><span>           "Channel": {</span><br><span>                       "id": "Channel",</span><br><span>                         "description": "A specific communication connection between Asterisk and an Endpoint.",</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/11162">change 11162</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/c/asterisk/+/11162"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ie5b6c8b20a2bda5168ea56114f4241bc818cab10 </div>
<div style="display:none"> Gerrit-Change-Number: 11162 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: sungtae kim <pchero21@gmail.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>