diff options
Diffstat (limited to 'drivers/qmimodem/voice_generated.c')
-rw-r--r-- | drivers/qmimodem/voice_generated.c | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/drivers/qmimodem/voice_generated.c b/drivers/qmimodem/voice_generated.c new file mode 100644 index 00000000..3440be43 --- /dev/null +++ b/drivers/qmimodem/voice_generated.c @@ -0,0 +1,210 @@ + +#include <stdint.h> +#include <string.h> +#include <glib.h> + +#include "voice_generated.h" + +int qmi_voice_dial_call( + struct qmi_voice_dial_call_arg *arg, + struct qmi_service *service, + qmi_result_func_t func, + void *user_data, + qmi_destroy_func_t destroy) +{ + struct qmi_param *param = NULL; + + param = qmi_param_new(); + if (!param) + goto error; + + if (arg->calling_number_set) { + if (!qmi_param_append(param, + 0x1, + strlen(arg->calling_number), + arg->calling_number)) + goto error; + } + + if (arg->call_type_set) + qmi_param_append_uint8(param, 0x10, arg->call_type); + + if (qmi_service_send(service, + 0x20, + param, + func, + user_data, + destroy) > 0) + return 0; +error: + g_free(param); + return 1; +} + +enum parse_error qmi_voice_dial_call_parse( + struct qmi_result *qmi_result, + struct qmi_voice_dial_call_result *result) +{ + int err = NONE; + + /* mandatory */ + if (qmi_result_get_uint8(qmi_result, 0x10, &result->call_id)) + result->call_id_set = 1; + else + err = MISSING_MANDATORY; + + return err; +} + +int qmi_voice_end_call( + struct qmi_voice_end_call_arg *arg, + struct qmi_service *service, + qmi_result_func_t func, + void *user_data, + qmi_destroy_func_t destroy) +{ + struct qmi_param *param = NULL; + + param = qmi_param_new(); + if (!param) + goto error; + + if (arg->call_id_set) { + if (!qmi_param_append_uint8( + param, + 0x1, + arg->call_id)) + goto error; + } + + if (qmi_service_send(service, + 0x21, + param, + func, + user_data, + destroy) > 0) + return 0; +error: + g_free(param); + return 1; +} + +enum parse_error qmi_voice_end_call_parse( + struct qmi_result *qmi_result, + struct qmi_voice_end_call_result *result) +{ + int err = NONE; + + /* optional */ + if (qmi_result_get_uint8(qmi_result, 0x10, &result->call_id)) + result->call_id_set = 1; + + return err; +} + + +int qmi_voice_answer_call( + struct qmi_voice_answer_call_arg *arg, + struct qmi_service *service, + qmi_result_func_t func, + void *user_data, + qmi_destroy_func_t destroy) +{ + struct qmi_param *param = NULL; + + param = qmi_param_new(); + if (!param) + goto error; + + if (arg->call_id_set) { + if (!qmi_param_append_uint8( + param, + 0x1, + arg->call_id)) + goto error; + } + + if (qmi_service_send(service, + 0x22, + param, + func, + user_data, + destroy) > 0) + return 0; +error: + g_free(param); + return 1; +} + + +enum parse_error qmi_voice_answer_call_parse( + struct qmi_result *qmi_result, + struct qmi_voice_answer_call_result *result) +{ + int err = NONE; + + /* optional */ + if (qmi_result_get_uint8(qmi_result, 0x10, &result->call_id)) + result->call_id_set = 1; + + return err; +} + +enum parse_error qmi_voice_ind_call_status( + struct qmi_result *qmi_result, + struct qmi_voice_all_call_status_ind *result) +{ + int err = NONE; + int offset; + uint16_t len; + const struct qmi_voice_remote_party_number *remote_party_number; + const struct qmi_voice_call_information *call_information; + + /* mandatory */ + call_information = qmi_result_get(qmi_result, 0x01, &len); + if (call_information) + { + int instance_size = sizeof(struct qmi_voice_call_information_instance); + /* verify the length */ + if (len < sizeof(call_information->size)) + return INVALID_LENGTH; + + if (len != call_information->size * sizeof(struct qmi_voice_call_information_instance) + + sizeof(call_information->size)) + return INVALID_LENGTH; + result->call_information_set = 1; + result->call_information = call_information; + } else + return MISSING_MANDATORY; + + /* mandatory */ + remote_party_number = qmi_result_get(qmi_result, 0x10, &len); + if (remote_party_number) { + const struct qmi_voice_remote_party_number_instance *instance; + int instance_size = sizeof(struct qmi_voice_remote_party_number_instance); + int i; + + /* verify the length */ + if (len < sizeof(remote_party_number->size)) + return INVALID_LENGTH; + + for (i = 0, offset = sizeof(remote_party_number->size); + offset <= len && i < 16 && i < remote_party_number->size; i++) + { + if (offset == len) { + break; + } else if (offset + instance_size > len) { + return INVALID_LENGTH; + } + + instance = (void *)remote_party_number + offset; + result->remote_party_number[i] = instance; + offset += sizeof(struct qmi_voice_remote_party_number_instance) + instance->number_size; + } + result->remote_party_number_set = 1; + result->remote_party_number_size = remote_party_number->size; + } else + return MISSING_MANDATORY; + + return err; +} |