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,
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 }
};
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,