summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@nokia.com>2006-11-22 12:35:42 +0000
committerJohan Hedberg <johan.hedberg@nokia.com>2006-11-22 12:35:42 +0000
commit0bf43d5dc4e1575099a2632ed46769726abeb742 (patch)
treecef7ab612cf360724ae00d364e9a987faa0b0e5c
parentb3f669cd6704e370f68fd695d2ea66212b3371a9 (diff)
Implement Ring method
-rw-r--r--audio/headset.c40
1 files changed, 39 insertions, 1 deletions
diff --git a/audio/headset.c b/audio/headset.c
index 0fe95350..f19376de 100644
--- a/audio/headset.c
+++ b/audio/headset.c
@@ -88,6 +88,7 @@ static GIOChannel *server_sk = NULL;
static DBusHandlerResult hs_connect(DBusConnection *conn, DBusMessage *msg,
const char *address);
static DBusHandlerResult hs_disconnect(DBusConnection *conn, DBusMessage *msg);
+static DBusHandlerResult hs_ring(DBusConnection *conn, DBusMessage *msg);
static int set_nonblocking(int fd, int *err)
{
@@ -178,6 +179,11 @@ static DBusHandlerResult err_connect_failed(DBusConnection *conn, DBusMessage *m
return error_reply(conn, msg, "org.bluez.Error.ConnectFailed", strerror(err));
}
+static DBusHandlerResult err_failed(DBusConnection *conn, DBusMessage *msg)
+{
+ return error_reply(conn, msg, "org.bluez.Error.Failed", "Failed");
+}
+
static gboolean rfcomm_io_cb(GIOChannel *chan, GIOCondition cond, struct hs_connection *hs)
{
int sk, ret;
@@ -449,7 +455,7 @@ static int create_ag_record(sdp_buf_t *buf, uint8_t ch)
root = sdp_list_append(0, &root_uuid);
sdp_set_browse_groups(&record, root);
- sdp_uuid16_create(&svclass_uuid, HEADSET_SVCLASS_ID);
+ sdp_uuid16_create(&svclass_uuid, HEADSET_AGW_SVCLASS_ID);
svclass_id = sdp_list_append(0, &svclass_uuid);
sdp_uuid16_create(&ga_svclass_uuid, GENERIC_AUDIO_SVCLASS_ID);
svclass_id = sdp_list_append(svclass_id, &ga_svclass_uuid);
@@ -725,6 +731,9 @@ static DBusHandlerResult hs_message(DBusConnection *conn,
if (strcmp(member, "Disconnect") == 0)
return hs_disconnect(conn, msg);
+ if (strcmp(member, "Ring") == 0)
+ return hs_ring(conn, msg);
+
/* Handle Headset interface methods here */
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
@@ -1027,6 +1036,8 @@ static DBusHandlerResult hs_connect(DBusConnection *conn, DBusMessage *msg,
memset(c, 0, sizeof(struct pending_connect));
+ str2ba(address, &c->bda);
+
msg = dbus_message_new_method_call("org.bluez", "/org/bluez/hci0",
"org.bluez.Adapter",
"GetRemoteServiceHandles");
@@ -1053,6 +1064,33 @@ static DBusHandlerResult hs_connect(DBusConnection *conn, DBusMessage *msg,
return DBUS_HANDLER_RESULT_HANDLED;;
}
+static DBusHandlerResult hs_ring(DBusConnection *conn, DBusMessage *msg)
+{
+ DBusMessage *reply;
+ const char *ring_str = "RING\r";
+ int sk, ret;
+
+ if (!connected_hs)
+ return err_not_connected(conn, msg);
+
+ reply = dbus_message_new_method_return(msg);
+ if (!reply)
+ return DBUS_HANDLER_RESULT_NEED_MEMORY;
+
+ sk = g_io_channel_unix_get_fd(connected_hs->rfcomm);
+
+ ret = write(sk, ring_str, strlen(ring_str));
+ if (ret < strlen(ring_str)) {
+ dbus_message_unref(reply);
+ return err_failed(conn, msg);
+ }
+
+ dbus_connection_send(conn, reply, NULL);
+ dbus_message_unref(reply);
+
+ return DBUS_HANDLER_RESULT_HANDLED;
+}
+
int main(int argc, char *argv[])
{
struct sigaction sa;