From: Philippe De Swert <philippedesw...@gmail.com>

Implement functionality to allow to  dial favourites/quick contacts over
bluetooth.
---
 src/voicecall.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 54 insertions(+), 6 deletions(-)

diff --git a/src/voicecall.c b/src/voicecall.c
index eae4b904..d45b3aa2 100644
--- a/src/voicecall.c
+++ b/src/voicecall.c
@@ -1606,7 +1606,7 @@ error:
                                        __ofono_error_failed(vc->pending));
 }
 
-static int voicecall_dial_hfp(struct ofono_voicecall *vc,
+static int voicecall_dial_hfp(struct ofono_voicecall *vc, unsigned int 
position,
                                        ofono_voicecall_cb_t cb, void *data)
 {
        struct ofono_modem *modem = __ofono_atom_get_modem(vc->atom);
@@ -1617,9 +1617,6 @@ static int voicecall_dial_hfp(struct ofono_voicecall *vc,
        if (ofono_modem_get_online(modem) == FALSE)
                return -ENETDOWN;
 
-       if (vc->driver->dial_last == NULL)
-               return -ENOTSUP;
-
        if (voicecalls_have_incoming(vc))
                return -EBUSY;
 
@@ -1630,7 +1627,18 @@ static int voicecall_dial_hfp(struct ofono_voicecall *vc,
        if (voicecalls_have_active(vc) && voicecalls_have_held(vc))
                return -EBUSY;
 
-       vc->driver->dial_last(vc, cb, vc);
+       /* when position is not given we dial the last called number */
+       if(position == 0) {
+               if (vc->driver->dial_last == NULL)
+                       return -ENOTSUP;
+
+               vc->driver->dial_last(vc, cb, vc);
+       } else {
+               if(vc->driver->dial_memory == NULL )
+               return -ENOTSUP;
+
+               vc->driver->dial_memory(vc, position, cb, vc);
+       }
 
        return 0;
 }
@@ -1646,7 +1654,7 @@ static DBusMessage *manager_dial_last(DBusConnection 
*conn,
 
        vc->pending = dbus_message_ref(msg);
 
-       err = voicecall_dial_hfp(vc, manager_dial_hfp_callback, vc);
+       err = voicecall_dial_hfp(vc, 0, manager_dial_hfp_callback, vc);
 
        if (err >= 0)
                return NULL;
@@ -1668,6 +1676,44 @@ static DBusMessage *manager_dial_last(DBusConnection 
*conn,
        return __ofono_error_failed(msg);
 }
 
+static DBusMessage *manager_dial_memory(DBusConnection *conn,
+                                       DBusMessage *msg, void *data)
+{
+       struct ofono_voicecall *vc = data;
+       int memory_location;
+       int err;
+
+       if (vc->pending || vc->dial_req || vc->pending_em)
+               return __ofono_error_busy(msg);
+
+       if (dbus_message_get_args(msg, NULL, DBUS_TYPE_UINT32, &memory_location,
+                                       DBUS_TYPE_INVALID) == FALSE)
+               return __ofono_error_invalid_args(msg);
+
+       vc->pending = dbus_message_ref(msg);
+
+       err = voicecall_dial_hfp(vc, memory_location, 
manager_dial_hfp_callback, vc);
+
+       if (err >= 0)
+               return NULL;
+
+       vc->pending = NULL;
+       dbus_message_unref(msg);
+
+       switch (err) {
+       case -EINVAL:
+               return __ofono_error_invalid_format(msg);
+
+       case -ENETDOWN:
+               return __ofono_error_not_available(msg);
+
+       case -ENOTSUP:
+               return __ofono_error_not_implemented(msg);
+       }
+
+       return __ofono_error_failed(msg);
+}
+
 static DBusMessage *manager_transfer(DBusConnection *conn,
                                        DBusMessage *msg, void *data)
 {
@@ -2225,6 +2271,8 @@ static const GDBusMethodTable manager_methods[] = {
                GDBUS_ARGS({ "path", "o" }),
                manager_dial) },
        { GDBUS_ASYNC_METHOD("DialLast", NULL, NULL, manager_dial_last)},
+       { GDBUS_ASYNC_METHOD("DialMemory",
+               GDBUS_ARGS({"memory_location", "u" }), NULL, 
manager_dial_memory) },
        { GDBUS_ASYNC_METHOD("Transfer", NULL, NULL, manager_transfer) },
        { GDBUS_ASYNC_METHOD("SwapCalls",  NULL, NULL, manager_swap_calls) },
        { GDBUS_ASYNC_METHOD("ReleaseAndAnswer", NULL, NULL,
-- 
2.11.0

_______________________________________________
ofono mailing list
ofono@ofono.org
https://lists.ofono.org/mailman/listinfo/ofono

Reply via email to