aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/qmimodem/voice_generated.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/qmimodem/voice_generated.c')
-rw-r--r--drivers/qmimodem/voice_generated.c210
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;
+}