diff options
Diffstat (limited to 'epan/dissectors/asn1/ros/ros-res.cnf')
-rw-r--r-- | epan/dissectors/asn1/ros/ros-res.cnf | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/epan/dissectors/asn1/ros/ros-res.cnf b/epan/dissectors/asn1/ros/ros-res.cnf new file mode 100644 index 00000000..d8d892bd --- /dev/null +++ b/epan/dissectors/asn1/ros/ros-res.cnf @@ -0,0 +1,49 @@ +# ros-res.cnf +# ROS ReturnResult common code +# Copyright 2007 Tomas Kukosa + +#.FN_HDR ReturnResult + dissector_handle_t res_handle = NULL; + const gchar *descr = ""; + + actx->rose_ctx->d.code = -1; + res_next_tvb = NULL; +#.FN_FTR ReturnResult + actx->rose_ctx->d.pdu = 2; + + if ((actx->rose_ctx->d.code == 0) && actx->rose_ctx->res_local_dissector_table) { + res_handle = dissector_get_uint_handle(actx->rose_ctx->res_local_dissector_table, actx->rose_ctx->d.code_local); + } else if ((actx->rose_ctx->d.code == 1) && actx->rose_ctx->res_global_dissector_table) { + res_handle = dissector_get_string_handle(actx->rose_ctx->res_global_dissector_table, actx->rose_ctx->d.code_global); + } else { + res_handle = NULL; + } + + if (!res_handle || + !proto_is_protocol_enabled(find_protocol_by_id(dissector_handle_get_protocol_index(res_handle)))) { + if (actx->rose_ctx->d.code == 0) + descr = wmem_strdup_printf(actx->pinfo->pool, "RES: %d", actx->rose_ctx->d.code_local); + else if (actx->rose_ctx->d.code == 1) + descr = wmem_strdup_printf(actx->pinfo->pool, "RES: %s", actx->rose_ctx->d.code_global); + } else { + descr = wmem_strdup(actx->pinfo->pool, "RES:"); + } + + if (actx->rose_ctx->apdu_depth >= 0) + proto_item_append_text(proto_item_get_parent_nth(proto_tree_get_parent(tree), actx->rose_ctx->apdu_depth), " %s", descr); + if (actx->rose_ctx->fillin_info) + col_append_str(actx->pinfo->cinfo, COL_INFO, descr); + if (actx->rose_ctx->fillin_ptr) + (void) g_strlcat(actx->rose_ctx->fillin_ptr, descr, actx->rose_ctx->fillin_buf_size); + + if (actx->rose_ctx->d.code != -1) { + if (!res_next_tvb) { /* empty result */ + res_next_tvb = tvb_new_subset_length_caplen(tvb, (actx->encoding==ASN1_ENC_PER)?offset>>3:offset, 0, 0); + } + + call_dissector_with_data((res_handle)?res_handle:data_handle, res_next_tvb, actx->pinfo, tree, actx->rose_ctx); + if (!res_handle) { + expert_add_info_format(actx->pinfo, tree, &ei_ros_undecoded, "Undecoded %s", descr); + } + } +#.END |