handsfree: Expose RequestPhoneNumber in D-Bus API

This commit is contained in:
Mikel Astiz 2011-10-12 14:35:29 +02:00 committed by Denis Kenzior
parent 6a0a8d1c2e
commit 7b9fa9455c
1 changed files with 50 additions and 0 deletions

View File

@ -48,6 +48,7 @@ struct ofono_handsfree {
const struct ofono_handsfree_driver *driver;
void *driver_data;
struct ofono_atom *atom;
DBusMessage *pending;
};
void ofono_handsfree_set_inband_ringing(struct ofono_handsfree *hf,
@ -122,11 +123,54 @@ static DBusMessage *handsfree_set_property(DBusConnection *conn,
return __ofono_error_invalid_args(msg);
}
static void request_phone_number_cb(const struct ofono_error *error,
const struct ofono_phone_number *number,
void *data)
{
struct ofono_handsfree *hf = data;
DBusMessage *reply;
const char *phone_number;
if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
DBG("Phone number request callback returned error: %s",
telephony_error_to_str(error));
reply = __ofono_error_failed(hf->pending);
__ofono_dbus_pending_reply(&hf->pending, reply);
return;
}
phone_number = phone_number_to_string(number);
reply = dbus_message_new_method_return(hf->pending);
dbus_message_append_args(reply, DBUS_TYPE_STRING, &phone_number,
DBUS_TYPE_INVALID);
__ofono_dbus_pending_reply(&hf->pending, reply);
}
static DBusMessage *handsfree_request_phone_number(DBusConnection *conn,
DBusMessage *msg, void *data)
{
struct ofono_handsfree *hf = data;
if (hf->pending)
return __ofono_error_busy(msg);
if (!hf->driver->request_phone_number)
return __ofono_error_not_supported(msg);
hf->pending = dbus_message_ref(msg);
hf->driver->request_phone_number(hf, request_phone_number_cb, hf);
return NULL;
}
static GDBusMethodTable handsfree_methods[] = {
{ "GetProperties", "", "a{sv}", handsfree_get_properties,
G_DBUS_METHOD_FLAG_ASYNC },
{ "SetProperty", "sv", "", handsfree_set_property,
G_DBUS_METHOD_FLAG_ASYNC },
{ "RequestPhoneNumber", "", "s", handsfree_request_phone_number,
G_DBUS_METHOD_FLAG_ASYNC },
{ NULL, NULL, NULL, NULL }
};
@ -190,6 +234,12 @@ static void handsfree_unregister(struct ofono_atom *atom)
DBusConnection *conn = ofono_dbus_get_connection();
struct ofono_modem *modem = __ofono_atom_get_modem(atom);
const char *path = __ofono_atom_get_path(atom);
struct ofono_handsfree *hf = __ofono_atom_get_data(atom);
if (hf->pending) {
DBusMessage *reply = __ofono_error_failed(hf->pending);
__ofono_dbus_pending_reply(&hf->pending, reply);
}
ofono_modem_remove_interface(modem, OFONO_HANDSFREE_INTERFACE);
g_dbus_unregister_interface(conn, path,