summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2015-11-04 23:25:53 -0600
committerDenis Kenzior <denkenz@gmail.com>2015-11-04 23:25:53 -0600
commitb8fcc3ef213ac1656f8bc2d85b69131e7b4fd5d1 (patch)
tree4998008e7da6f364420433c7b3b1d19e24d2885d /drivers
parent3b1578286bdecb8232ab2d26b58a99515726883c (diff)
downloadofono-b8fcc3ef213ac1656f8bc2d85b69131e7b4fd5d1.tar.bz2
rilmodem: Implement g_ril_request_call_fwd inline
Diffstat (limited to 'drivers')
-rw-r--r--drivers/rilmodem/call-forwarding.c67
1 files changed, 56 insertions, 11 deletions
diff --git a/drivers/rilmodem/call-forwarding.c b/drivers/rilmodem/call-forwarding.c
index 286727ba..41106cfc 100644
--- a/drivers/rilmodem/call-forwarding.c
+++ b/drivers/rilmodem/call-forwarding.c
@@ -38,8 +38,6 @@
#include <ofono/call-forwarding.h>
#include "gril.h"
-#include "grilreply.h"
-#include "grilunsol.h"
#include "rilmodem.h"
@@ -56,7 +54,9 @@ static void ril_query_call_fwd_cb(struct ril_msg *message, gpointer user_data)
struct forw_data *fd = ofono_call_forwarding_get_data(cbd->user);
ofono_call_forwarding_query_cb_t cb = cbd->cb;
struct ofono_call_forwarding_condition *list;
+ struct parcel rilp;
unsigned int list_size;
+ unsigned int i;
if (message->error != RIL_E_SUCCESS) {
ofono_error("%s: rild error: %s", __func__,
@@ -64,23 +64,68 @@ static void ril_query_call_fwd_cb(struct ril_msg *message, gpointer user_data)
goto error;
}
- list = g_ril_reply_parse_query_call_fwd(fd->ril, message, &list_size);
- /*
- * From atmodem:
- *
- * Specification is really unclear about this
- * generate status=0 for all classes just in case
- */
+ g_ril_init_parcel(message, &rilp);
+
+ if (rilp.size < sizeof(int32_t))
+ goto error;
+
+ list_size = parcel_r_int32(&rilp);
if (list_size == 0) {
list = g_new0(struct ofono_call_forwarding_condition, 1);
list_size = 1;
list->status = 0;
list->cls = fd->last_cls;
- } else if (list == NULL) {
- goto error;
+ goto done;
+ }
+
+ list = g_new0(struct ofono_call_forwarding_condition, list_size);
+
+ g_ril_append_print_buf(fd->ril, "{");
+
+ for (i = 0; i < list_size; i++) {
+ char *str;
+
+ list[i].status = parcel_r_int32(&rilp);
+
+ parcel_r_int32(&rilp); /* skip reason */
+
+ list[i].cls = parcel_r_int32(&rilp);
+ list[i].phone_number.type = parcel_r_int32(&rilp);
+
+ str = parcel_r_string(&rilp);
+
+ if (str != NULL) {
+ strncpy(list[i].phone_number.number, str,
+ OFONO_MAX_PHONE_NUMBER_LENGTH);
+ g_free(str);
+
+ list[i].phone_number.number[
+ OFONO_MAX_PHONE_NUMBER_LENGTH] = '\0';
+ }
+
+ list[i].time = parcel_r_int32(&rilp);
+
+ if (rilp.malformed) {
+ ofono_error("%s: malformed parcel", __func__);
+ g_free(list);
+ goto error;
+ }
+
+ g_ril_append_print_buf(fd->ril, "%s [%d,%d,%d,%s,%d]",
+ print_buf,
+ list[i].status,
+ list[i].cls,
+ list[i].phone_number.type,
+ list[i].phone_number.number,
+ list[i].time);
+
}
+ g_ril_append_print_buf(fd->ril, "%s}", print_buf);
+ g_ril_print_response(fd->ril, message);
+
+done:
CALLBACK_WITH_SUCCESS(cb, (int) list_size, list, cbd->data);
g_free(list);
return;