Linux bluetooth development
 help / color / mirror / Atom feed
* [PATCH BlueZ 00/13] Remove HFP implementation
@ 2012-11-13 13:21 Luiz Augusto von Dentz
  2012-11-13 13:21 ` [PATCH BlueZ 01/13] audio: Remove HFP and HSP headset role support Luiz Augusto von Dentz
                   ` (16 more replies)
  0 siblings, 17 replies; 20+ messages in thread
From: Luiz Augusto von Dentz @ 2012-11-13 13:21 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

These changes remove HFP implemention from audio plugin and move audio under
profiles directory.

HFP can be emulated by test-profile -u hfp, all the telephony backends are
gone as well since this is now suppose to be a external profile probably
done inside the telephony stack e.g. oFono in use in the platform.

Luiz Augusto von Dentz (13):
  audio: Remove HFP and HSP headset role support
  audio: Remove HFP option from audio.conf
  audio: Remove code using headset
  build: Remove telephony-maemo5.c
  build: Remove telephony-maemo6.c
  build: Remove telephony-ofono.c
  build: Remove telephony-dummy.c
  build: Remove telephony.h
  build: Remove headset.c and headset.h
  audio: Remove code HFP and HS gateway role
  build: Remove gateway.c and gateway.h
  audio: Move to profiles directory
  audio: Add support for passing endpoints as custom property

 Makefile.am                             |   48 +-
 audio/gateway.c                         | 1048 ------------
 audio/gateway.h                         |   75 -
 audio/headset.c                         | 2825 -------------------------------
 audio/headset.h                         |  112 --
 audio/manager.c                         | 1387 ---------------
 audio/telephony-dummy.c                 |  444 -----
 audio/telephony-maemo5.c                | 2102 -----------------------
 audio/telephony-maemo6.c                | 2196 ------------------------
 audio/telephony-ofono.c                 | 1636 ------------------
 audio/telephony.h                       |  244 ---
 {audio => profiles/audio}/a2dp-codecs.h |    0
 {audio => profiles/audio}/a2dp.c        |    0
 {audio => profiles/audio}/a2dp.h        |    0
 {audio => profiles/audio}/audio.conf    |    4 -
 {audio => profiles/audio}/avctp.c       |    0
 {audio => profiles/audio}/avctp.h       |    0
 {audio => profiles/audio}/avdtp.c       |    0
 {audio => profiles/audio}/avdtp.h       |    0
 {audio => profiles/audio}/avrcp.c       |    0
 {audio => profiles/audio}/avrcp.h       |    0
 {audio => profiles/audio}/control.c     |    0
 {audio => profiles/audio}/control.h     |    0
 {audio => profiles/audio}/device.c      |  198 +--
 {audio => profiles/audio}/device.h      |    2 -
 {audio => profiles/audio}/main.c        |   98 +-
 profiles/audio/manager.c                |  552 ++++++
 {audio => profiles/audio}/manager.h     |    7 +-
 {audio => profiles/audio}/media.c       |  245 ++-
 {audio => profiles/audio}/media.h       |    0
 {audio => profiles/audio}/player.c      |    0
 {audio => profiles/audio}/player.h      |    0
 {audio => profiles/audio}/rtp.h         |    0
 {audio => profiles/audio}/sink.c        |    0
 {audio => profiles/audio}/sink.h        |    0
 {audio => profiles/audio}/source.c      |    0
 {audio => profiles/audio}/source.h      |    0
 {audio => profiles/audio}/transport.c   |  380 -----
 {audio => profiles/audio}/transport.h   |    0
 39 files changed, 673 insertions(+), 12930 deletions(-)
 delete mode 100644 audio/gateway.c
 delete mode 100644 audio/gateway.h
 delete mode 100644 audio/headset.c
 delete mode 100644 audio/headset.h
 delete mode 100644 audio/manager.c
 delete mode 100644 audio/telephony-dummy.c
 delete mode 100644 audio/telephony-maemo5.c
 delete mode 100644 audio/telephony-maemo6.c
 delete mode 100644 audio/telephony-ofono.c
 delete mode 100644 audio/telephony.h
 rename {audio => profiles/audio}/a2dp-codecs.h (100%)
 rename {audio => profiles/audio}/a2dp.c (100%)
 rename {audio => profiles/audio}/a2dp.h (100%)
 rename {audio => profiles/audio}/audio.conf (93%)
 rename {audio => profiles/audio}/avctp.c (100%)
 rename {audio => profiles/audio}/avctp.h (100%)
 rename {audio => profiles/audio}/avdtp.c (100%)
 rename {audio => profiles/audio}/avdtp.h (100%)
 rename {audio => profiles/audio}/avrcp.c (100%)
 rename {audio => profiles/audio}/avrcp.h (100%)
 rename {audio => profiles/audio}/control.c (100%)
 rename {audio => profiles/audio}/control.h (100%)
 rename {audio => profiles/audio}/device.c (69%)
 rename {audio => profiles/audio}/device.h (96%)
 rename {audio => profiles/audio}/main.c (53%)
 create mode 100644 profiles/audio/manager.c
 rename {audio => profiles/audio}/manager.h (89%)
 rename {audio => profiles/audio}/media.c (91%)
 rename {audio => profiles/audio}/media.h (100%)
 rename {audio => profiles/audio}/player.c (100%)
 rename {audio => profiles/audio}/player.h (100%)
 rename {audio => profiles/audio}/rtp.h (100%)
 rename {audio => profiles/audio}/sink.c (100%)
 rename {audio => profiles/audio}/sink.h (100%)
 rename {audio => profiles/audio}/source.c (100%)
 rename {audio => profiles/audio}/source.h (100%)
 rename {audio => profiles/audio}/transport.c (72%)
 rename {audio => profiles/audio}/transport.h (100%)

-- 
1.7.11.7


^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH BlueZ 01/13] audio: Remove HFP and HSP headset role support
  2012-11-13 13:21 [PATCH BlueZ 00/13] Remove HFP implementation Luiz Augusto von Dentz
@ 2012-11-13 13:21 ` Luiz Augusto von Dentz
  2012-11-13 13:21 ` [PATCH BlueZ 1/3] avctp: Fix dead assignment in control_response Luiz Augusto von Dentz
                   ` (15 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Luiz Augusto von Dentz @ 2012-11-13 13:21 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

The support for these profiles are intended to be external, probably directly
integrated in the telephony stack of the platform in use e.g. oFono.
---
 audio/manager.c | 502 --------------------------------------------------------
 1 file changed, 502 deletions(-)

diff --git a/audio/manager.c b/audio/manager.c
index 4ea61bf..26dde60 100644
--- a/audio/manager.c
+++ b/audio/manager.c
@@ -91,7 +91,6 @@ static GSList *devices = NULL;
 
 static struct enabled_interfaces enabled = {
 	.hfp		= TRUE,
-	.headset	= TRUE,
 	.gateway	= FALSE,
 	.sink		= TRUE,
 	.source		= FALSE,
@@ -111,62 +110,6 @@ static struct audio_adapter *find_adapter(GSList *list,
 	return NULL;
 }
 
-static sdp_record_t *hsp_ag_record(uint8_t ch)
-{
-	sdp_list_t *svclass_id, *pfseq, *apseq, *root;
-	uuid_t root_uuid, svclass_uuid, ga_svclass_uuid;
-	uuid_t l2cap_uuid, rfcomm_uuid;
-	sdp_profile_desc_t profile;
-	sdp_record_t *record;
-	sdp_list_t *aproto, *proto[2];
-	sdp_data_t *channel;
-
-	record = sdp_record_alloc();
-	if (!record)
-		return NULL;
-
-	sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);
-	root = sdp_list_append(0, &root_uuid);
-	sdp_set_browse_groups(record, root);
-
-	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);
-	sdp_set_service_classes(record, svclass_id);
-
-	sdp_uuid16_create(&profile.uuid, HEADSET_PROFILE_ID);
-	profile.version = 0x0102;
-	pfseq = sdp_list_append(0, &profile);
-	sdp_set_profile_descs(record, pfseq);
-
-	sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);
-	proto[0] = sdp_list_append(0, &l2cap_uuid);
-	apseq = sdp_list_append(0, proto[0]);
-
-	sdp_uuid16_create(&rfcomm_uuid, RFCOMM_UUID);
-	proto[1] = sdp_list_append(0, &rfcomm_uuid);
-	channel = sdp_data_alloc(SDP_UINT8, &ch);
-	proto[1] = sdp_list_append(proto[1], channel);
-	apseq = sdp_list_append(apseq, proto[1]);
-
-	aproto = sdp_list_append(0, apseq);
-	sdp_set_access_protos(record, aproto);
-
-	sdp_set_info_attr(record, "Headset Audio Gateway", 0, 0);
-
-	sdp_data_free(channel);
-	sdp_list_free(proto[0], 0);
-	sdp_list_free(proto[1], 0);
-	sdp_list_free(apseq, 0);
-	sdp_list_free(pfseq, 0);
-	sdp_list_free(aproto, 0);
-	sdp_list_free(root, 0);
-	sdp_list_free(svclass_id, 0);
-
-	return record;
-}
-
 static sdp_record_t *hfp_hs_record(uint8_t ch)
 {
 	sdp_list_t *svclass_id, *pfseq, *apseq, *root;
@@ -223,206 +166,6 @@ static sdp_record_t *hfp_hs_record(uint8_t ch)
 	return record;
 }
 
-static sdp_record_t *hfp_ag_record(uint8_t ch, uint32_t feat)
-{
-	sdp_list_t *svclass_id, *pfseq, *apseq, *root;
-	uuid_t root_uuid, svclass_uuid, ga_svclass_uuid;
-	uuid_t l2cap_uuid, rfcomm_uuid;
-	sdp_profile_desc_t profile;
-	sdp_list_t *aproto, *proto[2];
-	sdp_record_t *record;
-	sdp_data_t *channel, *features;
-	uint8_t netid = 0x01;
-	uint16_t sdpfeat;
-	sdp_data_t *network;
-
-	record = sdp_record_alloc();
-	if (!record)
-		return NULL;
-
-	network = sdp_data_alloc(SDP_UINT8, &netid);
-	if (!network) {
-		sdp_record_free(record);
-		return NULL;
-	}
-
-	sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);
-	root = sdp_list_append(0, &root_uuid);
-	sdp_set_browse_groups(record, root);
-
-	sdp_uuid16_create(&svclass_uuid, HANDSFREE_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);
-	sdp_set_service_classes(record, svclass_id);
-
-	sdp_uuid16_create(&profile.uuid, HANDSFREE_PROFILE_ID);
-	profile.version = 0x0105;
-	pfseq = sdp_list_append(0, &profile);
-	sdp_set_profile_descs(record, pfseq);
-
-	sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);
-	proto[0] = sdp_list_append(0, &l2cap_uuid);
-	apseq = sdp_list_append(0, proto[0]);
-
-	sdp_uuid16_create(&rfcomm_uuid, RFCOMM_UUID);
-	proto[1] = sdp_list_append(0, &rfcomm_uuid);
-	channel = sdp_data_alloc(SDP_UINT8, &ch);
-	proto[1] = sdp_list_append(proto[1], channel);
-	apseq = sdp_list_append(apseq, proto[1]);
-
-	sdpfeat = (uint16_t) feat & 0xF;
-	features = sdp_data_alloc(SDP_UINT16, &sdpfeat);
-	sdp_attr_add(record, SDP_ATTR_SUPPORTED_FEATURES, features);
-
-	aproto = sdp_list_append(0, apseq);
-	sdp_set_access_protos(record, aproto);
-
-	sdp_set_info_attr(record, "Hands-Free Audio Gateway", 0, 0);
-
-	sdp_attr_add(record, SDP_ATTR_EXTERNAL_NETWORK, network);
-
-	sdp_data_free(channel);
-	sdp_list_free(proto[0], 0);
-	sdp_list_free(proto[1], 0);
-	sdp_list_free(apseq, 0);
-	sdp_list_free(pfseq, 0);
-	sdp_list_free(aproto, 0);
-	sdp_list_free(root, 0);
-	sdp_list_free(svclass_id, 0);
-
-	return record;
-}
-
-static void headset_auth_cb(DBusError *derr, void *user_data)
-{
-	struct audio_device *device = user_data;
-	GError *err = NULL;
-	GIOChannel *io;
-
-	device->hs_auth_id = 0;
-
-	if (device->hs_preauth_id) {
-		g_source_remove(device->hs_preauth_id);
-		device->hs_preauth_id = 0;
-	}
-
-	if (derr && dbus_error_is_set(derr)) {
-		error("Access denied: %s", derr->message);
-		headset_set_state(device, HEADSET_STATE_DISCONNECTED);
-		return;
-	}
-
-	io = headset_get_rfcomm(device);
-
-	if (!bt_io_accept(io, headset_connect_cb, device, NULL, &err)) {
-		error("bt_io_accept: %s", err->message);
-		g_error_free(err);
-		headset_set_state(device, HEADSET_STATE_DISCONNECTED);
-		return;
-	}
-}
-
-static gboolean hs_preauth_cb(GIOChannel *chan, GIOCondition cond,
-							gpointer user_data)
-{
-	struct audio_device *device = user_data;
-
-	DBG("Headset disconnected during authorization");
-
-	btd_cancel_authorization(device->hs_auth_id);
-	device->hs_auth_id = 0;
-
-	headset_set_state(device, HEADSET_STATE_DISCONNECTED);
-
-	device->hs_preauth_id = 0;
-
-	return FALSE;
-}
-
-static void ag_confirm(GIOChannel *chan, gpointer data)
-{
-	const char *server_uuid, *remote_uuid;
-	struct audio_device *device;
-	gboolean hfp_active;
-	bdaddr_t src, dst;
-	GError *err = NULL;
-	uint8_t ch;
-
-	bt_io_get(chan, &err,
-			BT_IO_OPT_SOURCE_BDADDR, &src,
-			BT_IO_OPT_DEST_BDADDR, &dst,
-			BT_IO_OPT_CHANNEL, &ch,
-			BT_IO_OPT_INVALID);
-	if (err) {
-		error("%s", err->message);
-		g_error_free(err);
-		goto drop;
-	}
-
-	if (ch == DEFAULT_HS_AG_CHANNEL) {
-		hfp_active = FALSE;
-		server_uuid = HSP_AG_UUID;
-		remote_uuid = HSP_HS_UUID;
-	} else {
-		hfp_active = TRUE;
-		server_uuid = HFP_AG_UUID;
-		remote_uuid = HFP_HS_UUID;
-	}
-
-	device = manager_get_device(&src, &dst, TRUE);
-	if (!device)
-		goto drop;
-
-	if (!manager_allow_headset_connection(device)) {
-		DBG("Refusing headset: too many existing connections");
-		goto drop;
-	}
-
-	if (!device->headset) {
-		btd_device_add_uuid(device->btd_dev, remote_uuid);
-		if (!device->headset)
-			goto drop;
-	}
-
-	if (headset_get_state(device) > HEADSET_STATE_DISCONNECTED) {
-		DBG("Refusing new connection since one already exists");
-		goto drop;
-	}
-
-	headset_set_hfp_active(device, hfp_active);
-	headset_set_rfcomm_initiator(device, TRUE);
-
-	if (headset_connect_rfcomm(device, chan) < 0) {
-		error("headset_connect_rfcomm failed");
-		goto drop;
-	}
-
-	headset_set_state(device, HEADSET_STATE_CONNECTING);
-
-	device->hs_auth_id = btd_request_authorization(&device->src,
-							&device->dst,
-							server_uuid,
-							headset_auth_cb,
-							device);
-	if (device->hs_auth_id == 0) {
-		DBG("Authorization denied");
-		headset_set_state(device, HEADSET_STATE_DISCONNECTED);
-		return;
-	}
-
-	device->hs_preauth_id = g_io_add_watch(chan,
-					G_IO_NVAL | G_IO_HUP | G_IO_ERR,
-					hs_preauth_cb, device);
-
-	device->auto_connect = auto_connect;
-
-	return;
-
-drop:
-	g_io_channel_shutdown(chan, TRUE, NULL);
-}
-
 static void gateway_auth_cb(DBusError *derr, void *user_data)
 {
 	struct audio_device *device = user_data;
@@ -499,108 +242,6 @@ drop:
 	g_io_channel_shutdown(chan, TRUE, NULL);
 }
 
-static int headset_server_init(struct audio_adapter *adapter)
-{
-	uint8_t chan = DEFAULT_HS_AG_CHANNEL;
-	sdp_record_t *record;
-	gboolean master = TRUE;
-	GError *err = NULL;
-	uint32_t features;
-	GIOChannel *io;
-	const bdaddr_t *src;
-
-	if (config) {
-		gboolean tmp;
-
-		tmp = g_key_file_get_boolean(config, "General", "Master",
-						&err);
-		if (err) {
-			DBG("audio.conf: %s", err->message);
-			g_clear_error(&err);
-		} else
-			master = tmp;
-	}
-
-	src = adapter_get_address(adapter->btd_adapter);
-
-	io =  bt_io_listen(NULL, ag_confirm, adapter, NULL, &err,
-				BT_IO_OPT_SOURCE_BDADDR, src,
-				BT_IO_OPT_CHANNEL, chan,
-				BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
-				BT_IO_OPT_MASTER, master,
-				BT_IO_OPT_INVALID);
-	if (!io)
-		goto failed;
-
-	adapter->hsp_ag_server = io;
-
-	record = hsp_ag_record(chan);
-	if (!record) {
-		error("Unable to allocate new service record");
-		goto failed;
-	}
-
-	if (add_record_to_server(src, record) < 0) {
-		error("Unable to register HS AG service record");
-		sdp_record_free(record);
-		goto failed;
-	}
-	adapter->hsp_ag_record_id = record->handle;
-
-	features = headset_config_init(config);
-
-	if (!enabled.hfp)
-		return 0;
-
-	chan = DEFAULT_HF_AG_CHANNEL;
-
-	io = bt_io_listen(NULL, ag_confirm, adapter, NULL, &err,
-				BT_IO_OPT_SOURCE_BDADDR, src,
-				BT_IO_OPT_CHANNEL, chan,
-				BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
-				BT_IO_OPT_MASTER, master,
-				BT_IO_OPT_INVALID);
-	if (!io)
-		goto failed;
-
-	adapter->hfp_ag_server = io;
-
-	record = hfp_ag_record(chan, features);
-	if (!record) {
-		error("Unable to allocate new service record");
-		goto failed;
-	}
-
-	if (add_record_to_server(src, record) < 0) {
-		error("Unable to register HF AG service record");
-		sdp_record_free(record);
-		goto failed;
-	}
-	adapter->hfp_ag_record_id = record->handle;
-
-	return 0;
-
-failed:
-	if (err) {
-		error("%s", err->message);
-		g_error_free(err);
-	}
-
-	if (adapter->hsp_ag_server) {
-		g_io_channel_shutdown(adapter->hsp_ag_server, TRUE, NULL);
-		g_io_channel_unref(adapter->hsp_ag_server);
-		adapter->hsp_ag_server = NULL;
-	}
-
-	if (adapter->hfp_ag_server) {
-		g_io_channel_shutdown(adapter->hfp_ag_server, TRUE, NULL);
-		g_io_channel_unref(adapter->hfp_ag_server);
-		adapter->hfp_ag_server = NULL;
-	}
-
-	return -1;
-}
-
 static int gateway_server_init(struct audio_adapter *adapter)
 {
 	uint8_t chan = DEFAULT_HFP_HS_CHANNEL;
@@ -683,26 +324,6 @@ static void audio_remove(struct btd_profile *p, struct btd_device *device)
 	audio_device_unregister(dev);
 }
 
-static int hs_probe(struct btd_profile *p, struct btd_device *device,
-								GSList *uuids)
-{
-	struct audio_device *audio_dev;
-
-	audio_dev = get_audio_dev(device);
-	if (!audio_dev) {
-		DBG("unable to get a device object");
-		return -1;
-	}
-
-	if (audio_dev->headset)
-		headset_update(audio_dev, audio_dev->headset, uuids);
-	else
-		audio_dev->headset = headset_init(audio_dev, uuids,
-								enabled.hfp);
-
-	return 0;
-}
-
 static int ag_probe(struct btd_profile *p, struct btd_device *device,
 								GSList *uuids)
 {
@@ -813,112 +434,6 @@ static struct audio_adapter *audio_adapter_get(struct btd_adapter *adapter)
 	return adp;
 }
 
-static void state_changed(struct btd_adapter *adapter, gboolean powered)
-{
-	struct audio_adapter *adp;
-	static gboolean telephony = FALSE;
-	GSList *l;
-
-	DBG("%s powered %s", adapter_get_path(adapter),
-						powered ? "on" : "off");
-
-	/* ignore powered change, adapter is powering down */
-	if (powered && adapter_powering_down(adapter))
-		return;
-
-	adp = find_adapter(adapters, adapter);
-	if (!adp)
-		return;
-
-	adp->powered = powered;
-
-	if (powered) {
-		/* telephony driver already initialized*/
-		if (telephony == TRUE)
-			return;
-		telephony_init();
-		telephony = TRUE;
-		return;
-	}
-
-	/* telephony not initialized just ignore power down */
-	if (telephony == FALSE)
-		return;
-
-	for (l = adapters; l; l = l->next) {
-		adp = l->data;
-
-		if (adp->powered == TRUE)
-			return;
-	}
-
-	telephony_exit();
-	telephony = FALSE;
-}
-
-static int headset_server_probe(struct btd_profile *p,
-						struct btd_adapter *adapter)
-{
-	struct audio_adapter *adp;
-	const gchar *path = adapter_get_path(adapter);
-	int err;
-
-	DBG("path %s", path);
-
-	adp = audio_adapter_get(adapter);
-	if (!adp)
-		return -EINVAL;
-
-	err = headset_server_init(adp);
-	if (err < 0) {
-		audio_adapter_unref(adp);
-		return err;
-	}
-
-	btd_adapter_register_powered_callback(adapter, state_changed);
-
-	return 0;
-}
-
-static void headset_server_remove(struct btd_profile *p,
-						struct btd_adapter *adapter)
-{
-	struct audio_adapter *adp;
-	const gchar *path = adapter_get_path(adapter);
-
-	DBG("path %s", path);
-
-	btd_adapter_unregister_powered_callback(adapter, state_changed);
-
-	adp = find_adapter(adapters, adapter);
-	if (!adp)
-		return;
-
-	if (adp->hsp_ag_record_id) {
-		remove_record_from_server(adp->hsp_ag_record_id);
-		adp->hsp_ag_record_id = 0;
-	}
-
-	if (adp->hsp_ag_server) {
-		g_io_channel_shutdown(adp->hsp_ag_server, TRUE, NULL);
-		g_io_channel_unref(adp->hsp_ag_server);
-		adp->hsp_ag_server = NULL;
-	}
-
-	if (adp->hfp_ag_record_id) {
-		remove_record_from_server(adp->hfp_ag_record_id);
-		adp->hfp_ag_record_id = 0;
-	}
-
-	if (adp->hfp_ag_server) {
-		g_io_channel_shutdown(adp->hfp_ag_server, TRUE, NULL);
-		g_io_channel_unref(adp->hfp_ag_server);
-		adp->hfp_ag_server = NULL;
-	}
-
-	audio_adapter_unref(adp);
-}
-
 static int gateway_server_probe(struct btd_profile *p,
 						struct btd_adapter *adapter)
 {
@@ -1068,17 +583,6 @@ static void media_server_remove(struct btd_adapter *adapter)
 	audio_adapter_unref(adp);
 }
 
-static struct btd_profile headset_profile = {
-	.name		= "audio-headset",
-
-	.remote_uuids	= BTD_UUIDS(HSP_HS_UUID, HFP_HS_UUID),
-	.device_probe	= hs_probe,
-	.device_remove	= audio_remove,
-
-	.adapter_probe	= headset_server_probe,
-	.adapter_remove = headset_server_remove,
-};
-
 static struct btd_profile gateway_profile = {
 	.name		= "audio-gateway",
 
@@ -1187,9 +691,6 @@ int audio_manager_init(GKeyFile *conf, gboolean *enable_sco)
 		max_connected_headsets = i;
 
 proceed:
-	if (enabled.headset)
-		btd_profile_register(&headset_profile);
-
 	if (enabled.gateway)
 		btd_profile_register(&gateway_profile);
 
@@ -1213,9 +714,6 @@ void audio_manager_exit(void)
 		config = NULL;
 	}
 
-	if (enabled.headset)
-		btd_profile_unregister(&headset_profile);
-
 	if (enabled.gateway)
 		btd_profile_unregister(&gateway_profile);
 
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH BlueZ 1/3] avctp: Fix dead assignment in control_response
  2012-11-13 13:21 [PATCH BlueZ 00/13] Remove HFP implementation Luiz Augusto von Dentz
  2012-11-13 13:21 ` [PATCH BlueZ 01/13] audio: Remove HFP and HSP headset role support Luiz Augusto von Dentz
@ 2012-11-13 13:21 ` Luiz Augusto von Dentz
  2012-11-13 13:33   ` Luiz Augusto von Dentz
  2012-11-13 13:21 ` [PATCH BlueZ 02/13] audio: Remove HFP option from audio.conf Luiz Augusto von Dentz
                   ` (14 subsequent siblings)
  16 siblings, 1 reply; 20+ messages in thread
From: Luiz Augusto von Dentz @ 2012-11-13 13:21 UTC (permalink / raw)
  To: linux-bluetooth

From: Szymon Janc <szymon.janc@tieto.com>

Value stored to req is never read before writing it again.
---
 audio/avctp.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/audio/avctp.c b/audio/avctp.c
index 6ba25e4..29756f6 100644
--- a/audio/avctp.c
+++ b/audio/avctp.c
@@ -577,7 +577,7 @@ static void control_response(struct avctp_channel *control,
 					size_t operand_count)
 {
 	struct avctp_pending_req *p = control->p;
-	struct avctp_control_req *req = p->data;
+	struct avctp_control_req *req;
 	GSList *l;
 
 	if (p && p->transaction == avctp->transaction) {
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH BlueZ 02/13] audio: Remove HFP option from audio.conf
  2012-11-13 13:21 [PATCH BlueZ 00/13] Remove HFP implementation Luiz Augusto von Dentz
  2012-11-13 13:21 ` [PATCH BlueZ 01/13] audio: Remove HFP and HSP headset role support Luiz Augusto von Dentz
  2012-11-13 13:21 ` [PATCH BlueZ 1/3] avctp: Fix dead assignment in control_response Luiz Augusto von Dentz
@ 2012-11-13 13:21 ` Luiz Augusto von Dentz
  2012-11-13 13:21 ` [PATCH BlueZ 2/3] avrcp: Fix dead assignments in ct_set_setting Luiz Augusto von Dentz
                   ` (13 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Luiz Augusto von Dentz @ 2012-11-13 13:21 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

It is not in use anymore
---
 audio/audio.conf | 4 ----
 audio/manager.c  | 8 --------
 audio/manager.h  | 1 -
 3 files changed, 13 deletions(-)

diff --git a/audio/audio.conf b/audio/audio.conf
index d1c57d3..6bf4482 100644
--- a/audio/audio.conf
+++ b/audio/audio.conf
@@ -25,10 +25,6 @@
 # service interacts with remote headset devices)
 [Headset]
 
-# Set to true to support HFP, false means only HSP is supported
-# Defaults to true
-HFP=true
-
 # Maximum number of connected HSP/HFP devices per adapter. Defaults to 1
 MaxConnected=1
 
diff --git a/audio/manager.c b/audio/manager.c
index 26dde60..e949509 100644
--- a/audio/manager.c
+++ b/audio/manager.c
@@ -90,7 +90,6 @@ static GSList *adapters = NULL;
 static GSList *devices = NULL;
 
 static struct enabled_interfaces enabled = {
-	.hfp		= TRUE,
 	.gateway	= FALSE,
 	.sink		= TRUE,
 	.source		= FALSE,
@@ -674,13 +673,6 @@ int audio_manager_init(GKeyFile *conf, gboolean *enable_sco)
 	} else
 		auto_connect = b;
 
-	b = g_key_file_get_boolean(config, "Headset", "HFP",
-					&err);
-	if (err)
-		g_clear_error(&err);
-	else
-		enabled.hfp = b;
-
 	err = NULL;
 	i = g_key_file_get_integer(config, "Headset", "MaxConnected",
 					&err);
diff --git a/audio/manager.h b/audio/manager.h
index 08d814f..8fb208c 100644
--- a/audio/manager.h
+++ b/audio/manager.h
@@ -23,7 +23,6 @@
  */
 
 struct enabled_interfaces {
-	gboolean hfp;
 	gboolean headset;
 	gboolean gateway;
 	gboolean sink;
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH BlueZ 2/3] avrcp: Fix dead assignments in ct_set_setting
  2012-11-13 13:21 [PATCH BlueZ 00/13] Remove HFP implementation Luiz Augusto von Dentz
                   ` (2 preceding siblings ...)
  2012-11-13 13:21 ` [PATCH BlueZ 02/13] audio: Remove HFP option from audio.conf Luiz Augusto von Dentz
@ 2012-11-13 13:21 ` Luiz Augusto von Dentz
  2012-11-13 13:21 ` [PATCH BlueZ 03/13] audio: Remove code using headset Luiz Augusto von Dentz
                   ` (12 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Luiz Augusto von Dentz @ 2012-11-13 13:21 UTC (permalink / raw)
  To: linux-bluetooth

From: Szymon Janc <szymon.janc@tieto.com>

Value stored in val is never read before writing it again. After
fixing val same applies to attr variable.
---
 audio/avrcp.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/audio/avrcp.c b/audio/avrcp.c
index e3ce2fb..2517df8 100644
--- a/audio/avrcp.c
+++ b/audio/avrcp.c
@@ -1944,8 +1944,8 @@ static bool ct_set_setting(struct media_player *mp, const char *key,
 					const char *value, void *user_data)
 {
 	struct avrcp_player *player = user_data;
-	int attr = attr_to_val(key);
-	int val = attrval_to_val(attr, value);
+	int attr;
+	int val;
 	struct avrcp *session;
 
 	session = player->sessions->data;
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH BlueZ 03/13] audio: Remove code using headset
  2012-11-13 13:21 [PATCH BlueZ 00/13] Remove HFP implementation Luiz Augusto von Dentz
                   ` (3 preceding siblings ...)
  2012-11-13 13:21 ` [PATCH BlueZ 2/3] avrcp: Fix dead assignments in ct_set_setting Luiz Augusto von Dentz
@ 2012-11-13 13:21 ` Luiz Augusto von Dentz
  2012-11-13 13:21 ` [PATCH BlueZ 3/3] network: Fix dead assignment in connect_cb Luiz Augusto von Dentz
                   ` (11 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Luiz Augusto von Dentz @ 2012-11-13 13:21 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This is to be replaced with external profile support.
---
 audio/device.c    | 191 +-----------------------------------------------
 audio/headset.c   |   3 -
 audio/main.c      |  28 +------
 audio/manager.c   |  48 +-----------
 audio/manager.h   |   3 -
 audio/media.c     |  74 +------------------
 audio/transport.c | 215 ------------------------------------------------------
 7 files changed, 9 insertions(+), 553 deletions(-)

diff --git a/audio/device.c b/audio/device.c
index aee4161..aaa666d 100644
--- a/audio/device.c
+++ b/audio/device.c
@@ -53,7 +53,6 @@
 #include "control.h"
 #include "avctp.h"
 #include "avrcp.h"
-#include "headset.h"
 #include "gateway.h"
 #include "sink.h"
 #include "source.h"
@@ -74,7 +73,6 @@ typedef enum {
 struct dev_priv {
 	audio_state_t state;
 
-	headset_state_t hs_state;
 	sink_state_t sink_state;
 	avctp_state_t avctp_state;
 
@@ -92,7 +90,6 @@ struct dev_priv {
 static unsigned int sink_callback_id = 0;
 static unsigned int avctp_callback_id = 0;
 static unsigned int avdtp_callback_id = 0;
-static unsigned int headset_callback_id = 0;
 
 static void device_free(struct audio_device *dev)
 {
@@ -208,8 +205,6 @@ static void disconnect_cb(struct btd_device *btd_dev, gboolean removal,
 
 	if (dev->sink && priv->sink_state != SINK_STATE_DISCONNECTED)
 		sink_shutdown(dev->sink);
-	else if (priv->hs_state != HEADSET_STATE_DISCONNECTED)
-		headset_shutdown(dev);
 	else
 		priv->disconnecting = FALSE;
 }
@@ -270,84 +265,6 @@ static void device_set_state(struct audio_device *dev, audio_state_t new_state)
 				DBUS_TYPE_STRING, &state_str);
 }
 
-static gboolean avdtp_connect_timeout(gpointer user_data)
-{
-	struct audio_device *dev = user_data;
-
-	dev->priv->avdtp_timer = 0;
-
-	if (dev->sink) {
-		struct avdtp *session = avdtp_get(&dev->src, &dev->dst);
-
-		if (!session)
-			return FALSE;
-
-		sink_setup_stream(dev->sink, session);
-		avdtp_unref(session);
-	}
-
-	return FALSE;
-}
-
-static gboolean device_set_avdtp_timer(struct audio_device *dev)
-{
-	struct dev_priv *priv = dev->priv;
-	guint timeout = AVDTP_CONNECT_TIMEOUT;
-
-	if (!dev->sink)
-		return FALSE;
-
-	if (priv->avdtp_timer)
-		return FALSE;
-
-	/* If the headset is the HSP/HFP RFCOMM initiator, give the headset
-	 * time to initiate AVDTP signalling (and avoid further racing) */
-	if (dev->headset && headset_get_rfcomm_initiator(dev))
-		timeout += AVDTP_CONNECT_TIMEOUT_BOOST;
-
-	priv->avdtp_timer = g_timeout_add_seconds(timeout,
-							avdtp_connect_timeout,
-							dev);
-
-	return TRUE;
-}
-
-static gboolean headset_connect_timeout(gpointer user_data)
-{
-	struct audio_device *dev = user_data;
-	struct dev_priv *priv = dev->priv;
-
-	dev->priv->headset_timer = 0;
-
-	if (dev->headset == NULL)
-		return FALSE;
-
-	if (headset_config_stream(dev, FALSE, NULL, NULL) == 0) {
-		if (priv->state != AUDIO_STATE_CONNECTED &&
-				(priv->sink_state == SINK_STATE_CONNECTED ||
-				priv->sink_state == SINK_STATE_PLAYING))
-			device_set_state(dev, AUDIO_STATE_CONNECTED);
-	}
-
-	return FALSE;
-}
-
-static gboolean device_set_headset_timer(struct audio_device *dev)
-{
-	struct dev_priv *priv = dev->priv;
-
-	if (!dev->headset)
-		return FALSE;
-
-	if (priv->headset_timer)
-		return FALSE;
-
-	priv->headset_timer = g_timeout_add_seconds(HEADSET_CONNECT_TIMEOUT,
-						headset_connect_timeout, dev);
-
-	return TRUE;
-}
-
 static void device_avdtp_cb(struct audio_device *dev, struct avdtp *session,
 				avdtp_session_state_t old_state,
 				avdtp_session_state_t new_state,
@@ -382,44 +299,17 @@ static void device_sink_cb(struct audio_device *dev,
 			device_remove_control_timer(dev);
 			avrcp_disconnect(dev);
 		}
-		if (priv->hs_state != HEADSET_STATE_DISCONNECTED &&
-				(priv->dc_req || priv->disconnecting)) {
-			headset_shutdown(dev);
-			break;
-		}
-		if (priv->hs_state == HEADSET_STATE_DISCONNECTED)
-			device_set_state(dev, AUDIO_STATE_DISCONNECTED);
-		else if (old_state == SINK_STATE_CONNECTING) {
-			switch (priv->hs_state) {
-			case HEADSET_STATE_CONNECTED:
-			case HEADSET_STATE_PLAY_IN_PROGRESS:
-			case HEADSET_STATE_PLAYING:
-				device_set_state(dev, AUDIO_STATE_CONNECTED);
-			default:
-				break;
-			}
-		}
+
+		device_set_state(dev, AUDIO_STATE_DISCONNECTED);
 		break;
 	case SINK_STATE_CONNECTING:
 		device_remove_avdtp_timer(dev);
-		if (priv->hs_state == HEADSET_STATE_DISCONNECTED)
-			device_set_state(dev, AUDIO_STATE_CONNECTING);
+		device_set_state(dev, AUDIO_STATE_CONNECTING);
 		break;
 	case SINK_STATE_CONNECTED:
 		if (old_state == SINK_STATE_PLAYING)
 			break;
-		if (dev->auto_connect) {
-			if (!dev->headset)
-				device_set_state(dev, AUDIO_STATE_CONNECTED);
-			else if (priv->hs_state == HEADSET_STATE_DISCONNECTED)
-				device_set_headset_timer(dev);
-			else if (priv->hs_state == HEADSET_STATE_CONNECTED ||
-					priv->hs_state == HEADSET_STATE_PLAY_IN_PROGRESS ||
-					priv->hs_state == HEADSET_STATE_PLAYING)
-				device_set_state(dev, AUDIO_STATE_CONNECTED);
-		} else if (priv->hs_state == HEADSET_STATE_DISCONNECTED ||
-				priv->hs_state == HEADSET_STATE_CONNECTING)
-			device_set_state(dev, AUDIO_STATE_CONNECTED);
+		device_set_state(dev, AUDIO_STATE_CONNECTED);
 		break;
 	case SINK_STATE_PLAYING:
 		break;
@@ -447,62 +337,6 @@ static void device_avctp_cb(struct audio_device *dev,
 	}
 }
 
-static void device_headset_cb(struct audio_device *dev,
-				headset_state_t old_state,
-				headset_state_t new_state,
-				void *user_data)
-{
-	struct dev_priv *priv = dev->priv;
-
-	if (!dev->headset)
-		return;
-
-	priv->hs_state = new_state;
-
-	switch (new_state) {
-	case HEADSET_STATE_DISCONNECTED:
-		device_remove_avdtp_timer(dev);
-		if (priv->sink_state != SINK_STATE_DISCONNECTED && dev->sink &&
-				(priv->dc_req || priv->disconnecting)) {
-			sink_shutdown(dev->sink);
-			break;
-		}
-		if (priv->sink_state == SINK_STATE_DISCONNECTED)
-			device_set_state(dev, AUDIO_STATE_DISCONNECTED);
-		else if (old_state == HEADSET_STATE_CONNECTING &&
-				(priv->sink_state == SINK_STATE_CONNECTED ||
-				priv->sink_state == SINK_STATE_PLAYING))
-			device_set_state(dev, AUDIO_STATE_CONNECTED);
-		break;
-	case HEADSET_STATE_CONNECTING:
-		device_remove_headset_timer(dev);
-		if (priv->sink_state == SINK_STATE_DISCONNECTED)
-			device_set_state(dev, AUDIO_STATE_CONNECTING);
-		break;
-	case HEADSET_STATE_CONNECTED:
-		if (old_state == HEADSET_STATE_CONNECTED ||
-				old_state == HEADSET_STATE_PLAY_IN_PROGRESS ||
-				old_state == HEADSET_STATE_PLAYING)
-			break;
-		if (dev->auto_connect) {
-			if (!dev->sink)
-				device_set_state(dev, AUDIO_STATE_CONNECTED);
-			else if (priv->sink_state == SINK_STATE_DISCONNECTED)
-				device_set_avdtp_timer(dev);
-			else if (priv->sink_state == SINK_STATE_CONNECTED ||
-					priv->sink_state == SINK_STATE_PLAYING)
-				device_set_state(dev, AUDIO_STATE_CONNECTED);
-		} else if (priv->sink_state == SINK_STATE_DISCONNECTED ||
-				priv->sink_state == SINK_STATE_CONNECTING)
-			device_set_state(dev, AUDIO_STATE_CONNECTED);
-		break;
-	case HEADSET_STATE_PLAY_IN_PROGRESS:
-		break;
-	case HEADSET_STATE_PLAYING:
-		break;
-	}
-}
-
 static DBusMessage *dev_connect(DBusConnection *conn, DBusMessage *msg,
 								void *data)
 {
@@ -516,9 +350,6 @@ static DBusMessage *dev_connect(DBusConnection *conn, DBusMessage *msg,
 
 	dev->auto_connect = TRUE;
 
-	if (dev->headset)
-		headset_config_stream(dev, FALSE, NULL, NULL);
-
 	if (priv->state != AUDIO_STATE_CONNECTING && dev->sink) {
 		struct avdtp *session = avdtp_get(&dev->src, &dev->dst);
 
@@ -561,8 +392,6 @@ static DBusMessage *dev_disconnect(DBusConnection *conn, DBusMessage *msg,
 
 	if (dev->sink && priv->sink_state != SINK_STATE_DISCONNECTED)
 		sink_shutdown(dev->sink);
-	else if (priv->hs_state != HEADSET_STATE_DISCONNECTED)
-		headset_shutdown(dev);
 	else {
 		dbus_message_unref(priv->dc_req);
 		priv->dc_req = NULL;
@@ -652,10 +481,6 @@ struct audio_device *audio_device_register(struct btd_device *device,
 	if (avctp_callback_id == 0)
 		avctp_callback_id = avctp_add_state_cb(device_avctp_cb, NULL);
 
-	if (headset_callback_id == 0)
-		headset_callback_id = headset_add_state_cb(device_headset_cb,
-									NULL);
-
 	return dev;
 }
 
@@ -666,17 +491,12 @@ gboolean audio_device_is_active(struct audio_device *dev,
 		if ((dev->sink || dev->source) &&
 				avdtp_is_connected(&dev->src, &dev->dst))
 			return TRUE;
-		if (dev->headset && headset_is_active(dev))
-			return TRUE;
 	} else if (!strcmp(interface, AUDIO_SINK_INTERFACE) && dev->sink &&
 				avdtp_is_connected(&dev->src, &dev->dst))
 		return TRUE;
 	else if (!strcmp(interface, AUDIO_SOURCE_INTERFACE) && dev->source &&
 				avdtp_is_connected(&dev->src, &dev->dst))
 		return TRUE;
-	else if (!strcmp(interface, AUDIO_HEADSET_INTERFACE) && dev->headset &&
-				headset_is_active(dev))
-		return TRUE;
 	else if (!strcmp(interface, AUDIO_CONTROL_INTERFACE) && dev->control &&
 				control_is_active(dev))
 		return TRUE;
@@ -694,9 +514,6 @@ void audio_device_unregister(struct audio_device *device)
 		device->hs_preauth_id = 0;
 	}
 
-	if (device->headset)
-		headset_unregister(device);
-
 	if (device->gateway)
 		gateway_unregister(device);
 
diff --git a/audio/headset.c b/audio/headset.c
index 5e42a61..fb660f5 100644
--- a/audio/headset.c
+++ b/audio/headset.c
@@ -1614,9 +1614,6 @@ static int rfcomm_connect(struct audio_device *dev, headset_stream_cb_t cb,
 	char address[18];
 	GError *err = NULL;
 
-	if (!manager_allow_headset_connection(dev))
-		return -ECONNREFUSED;
-
 	if (hs->rfcomm_ch < 0)
 		return get_records(dev, cb, user_data, cb_id);
 
diff --git a/audio/main.c b/audio/main.c
index f7bb32a..a423b79 100644
--- a/audio/main.c
+++ b/audio/main.c
@@ -42,7 +42,6 @@
 #include "plugin.h"
 #include "log.h"
 #include "device.h"
-#include "headset.h"
 #include "manager.h"
 #include "gateway.h"
 
@@ -89,36 +88,12 @@ static void sco_server_cb(GIOChannel *chan, GError *err, gpointer data)
 		goto drop;
 	}
 
-	device = manager_find_device(NULL, &src, &dst, AUDIO_HEADSET_INTERFACE,
-					FALSE);
-	if (!device)
-		device = manager_find_device(NULL, &src, &dst,
+	device = manager_find_device(NULL, &src, &dst,
 						AUDIO_GATEWAY_INTERFACE,
 						FALSE);
-
 	if (!device)
 		goto drop;
 
-	if (device->headset) {
-		if (headset_get_state(device) < HEADSET_STATE_CONNECTED) {
-			DBG("Refusing SCO from non-connected headset");
-			goto gateway;
-		}
-
-		if (!headset_get_hfp_active(device)) {
-			error("Refusing non-HFP SCO connect attempt from %s",
-									addr);
-			goto drop;
-		}
-
-		if (headset_connect_sco(device, chan) < 0)
-			goto drop;
-
-		headset_set_state(device, HEADSET_STATE_PLAYING);
-		goto connect;
-	}
-
-gateway:
 	if (device->gateway) {
 		if (!gateway_is_connected(device)) {
 			DBG("Refusing SCO from non-connected AG");
@@ -130,7 +105,6 @@ gateway:
 	} else
 		goto drop;
 
-connect:
 	sk = g_io_channel_unix_get_fd(chan);
 	fcntl(sk, F_SETFL, 0);
 
diff --git a/audio/manager.c b/audio/manager.c
index e949509..d151f16 100644
--- a/audio/manager.c
+++ b/audio/manager.c
@@ -61,7 +61,6 @@
 #include "avdtp.h"
 #include "media.h"
 #include "a2dp.h"
-#include "headset.h"
 #include "gateway.h"
 #include "sink.h"
 #include "source.h"
@@ -637,9 +636,7 @@ int audio_manager_init(GKeyFile *conf, gboolean *enable_sco)
 	list = g_key_file_get_string_list(config, "General", "Enable",
 						NULL, NULL);
 	for (i = 0; list && list[i] != NULL; i++) {
-		if (g_str_equal(list[i], "Headset"))
-			enabled.headset = TRUE;
-		else if (g_str_equal(list[i], "Gateway"))
+		if (g_str_equal(list[i], "Gateway"))
 			enabled.gateway = TRUE;
 		else if (g_str_equal(list[i], "Sink"))
 			enabled.sink = TRUE;
@@ -653,9 +650,7 @@ int audio_manager_init(GKeyFile *conf, gboolean *enable_sco)
 	list = g_key_file_get_string_list(config, "General", "Disable",
 						NULL, NULL);
 	for (i = 0; list && list[i] != NULL; i++) {
-		if (g_str_equal(list[i], "Headset"))
-			enabled.headset = FALSE;
-		else if (g_str_equal(list[i], "Gateway"))
+		if (g_str_equal(list[i], "Gateway"))
 			enabled.gateway = FALSE;
 		else if (g_str_equal(list[i], "Sink"))
 			enabled.sink = FALSE;
@@ -694,7 +689,7 @@ proceed:
 
 	btd_register_adapter_driver(&media_driver);
 
-	*enable_sco = (enabled.gateway || enabled.headset);
+	*enable_sco = enabled.gateway;
 
 	return 0;
 }
@@ -740,10 +735,6 @@ GSList *manager_find_devices(const char *path,
 		if ((dst && bacmp(dst, BDADDR_ANY)) && bacmp(&dev->dst, dst))
 			continue;
 
-		if (interface && !strcmp(AUDIO_HEADSET_INTERFACE, interface)
-				&& !dev->headset)
-			continue;
-
 		if (interface && !strcmp(AUDIO_GATEWAY_INTERFACE, interface)
 				&& !dev->gateway)
 			continue;
@@ -829,43 +820,10 @@ struct audio_device *manager_get_device(const bdaddr_t *src,
 	return dev;
 }
 
-gboolean manager_allow_headset_connection(struct audio_device *device)
-{
-	GSList *l;
-	int connected = 0;
-
-	for (l = devices; l != NULL; l = l->next) {
-		struct audio_device *dev = l->data;
-		struct headset *hs = dev->headset;
-
-		if (dev == device)
-			continue;
-
-		if (device && bacmp(&dev->src, &device->src) != 0)
-			continue;
-
-		if (!hs)
-			continue;
-
-		if (headset_get_state(dev) > HEADSET_STATE_DISCONNECTED)
-			connected++;
-
-		if (connected >= max_connected_headsets)
-			return FALSE;
-	}
-
-	return TRUE;
-}
-
 void manager_set_fast_connectable(gboolean enable)
 {
 	GSList *l;
 
-	if (enable && !manager_allow_headset_connection(NULL)) {
-		DBG("Refusing enabling fast connectable");
-		return;
-	}
-
 	for (l = adapters; l != NULL; l = l->next) {
 		struct audio_adapter *adapter = l->data;
 
diff --git a/audio/manager.h b/audio/manager.h
index 8fb208c..d3b5692 100644
--- a/audio/manager.h
+++ b/audio/manager.h
@@ -23,7 +23,6 @@
  */
 
 struct enabled_interfaces {
-	gboolean headset;
 	gboolean gateway;
 	gboolean sink;
 	gboolean source;
@@ -50,8 +49,6 @@ struct audio_device *manager_get_device(const bdaddr_t *src,
 					const bdaddr_t *dst,
 					gboolean create);
 
-gboolean manager_allow_headset_connection(struct audio_device *device);
-
 /* TRUE to enable fast connectable and FALSE to disable fast connectable for all
  * audio adapters. */
 void manager_set_fast_connectable(gboolean enable);
diff --git a/audio/media.c b/audio/media.c
index cec938a..ea0b44e 100644
--- a/audio/media.c
+++ b/audio/media.c
@@ -46,7 +46,6 @@
 #include "transport.h"
 #include "a2dp.h"
 #include "avrcp.h"
-#include "headset.h"
 #include "gateway.h"
 #include "manager.h"
 
@@ -141,9 +140,6 @@ static void media_endpoint_destroy(struct media_endpoint *endpoint)
 {
 	DBG("sender=%s path=%s", endpoint->sender, endpoint->path);
 
-	if (endpoint->hs_watch)
-		headset_remove_state_cb(endpoint->hs_watch);
-
 	if (endpoint->ag_watch)
 		gateway_remove_state_cb(endpoint->ag_watch);
 
@@ -185,17 +181,6 @@ static void media_endpoint_exit(DBusConnection *connection, void *user_data)
 	media_endpoint_remove(endpoint);
 }
 
-static void headset_setconf_cb(struct media_endpoint *endpoint, void *ret,
-						int size, void *user_data)
-{
-	struct audio_device *dev = user_data;
-
-	if (ret != NULL)
-		return;
-
-	headset_shutdown(dev);
-}
-
 static void clear_configuration(struct media_endpoint *endpoint,
 					struct media_transport *transport)
 {
@@ -449,41 +434,6 @@ done:
 	media_endpoint_remove(endpoint);
 }
 
-static void headset_state_changed(struct audio_device *dev,
-					headset_state_t old_state,
-					headset_state_t new_state,
-					void *user_data)
-{
-	struct media_endpoint *endpoint = user_data;
-	struct media_transport *transport;
-
-	DBG("");
-
-	if (bacmp(&endpoint->adapter->src, &dev->src) != 0)
-		return;
-
-	switch (new_state) {
-	case HEADSET_STATE_DISCONNECTED:
-		transport = find_device_transport(endpoint, dev);
-
-		if (transport != NULL) {
-			DBG("Clear endpoint %p", endpoint);
-			clear_configuration(endpoint, transport);
-		}
-		break;
-	case HEADSET_STATE_CONNECTING:
-		set_configuration(endpoint, dev, NULL, 0, headset_setconf_cb,
-								dev, NULL);
-		break;
-	case HEADSET_STATE_CONNECTED:
-		break;
-	case HEADSET_STATE_PLAY_IN_PROGRESS:
-		break;
-	case HEADSET_STATE_PLAYING:
-		break;
-	}
-}
-
 static const char *get_name(struct a2dp_sep *sep, void *user_data)
 {
 	struct media_endpoint *endpoint = user_data;
@@ -671,28 +621,6 @@ static gboolean endpoint_init_a2dp_sink(struct media_endpoint *endpoint,
 	return TRUE;
 }
 
-static gboolean endpoint_init_ag(struct media_endpoint *endpoint, int *err)
-{
-	GSList *list;
-	GSList *l;
-
-	endpoint->hs_watch = headset_add_state_cb(headset_state_changed,
-								endpoint);
-	list = manager_find_devices(NULL, &endpoint->adapter->src, BDADDR_ANY,
-						AUDIO_HEADSET_INTERFACE, TRUE);
-
-	for (l = list; l != NULL; l = l->next) {
-		struct audio_device *dev = l->data;
-
-		set_configuration(endpoint, dev, NULL, 0,
-						headset_setconf_cb, dev, NULL);
-	}
-
-	g_slist_free(list);
-
-	return TRUE;
-}
-
 static gboolean endpoint_init_hs(struct media_endpoint *endpoint, int *err)
 {
 	GSList *list;
@@ -750,7 +678,7 @@ static struct media_endpoint *media_endpoint_create(struct media_adapter *adapte
 							delay_reporting, err);
 	else if (strcasecmp(uuid, HFP_AG_UUID) == 0 ||
 					strcasecmp(uuid, HSP_AG_UUID) == 0)
-		succeeded = endpoint_init_ag(endpoint, err);
+		succeeded = TRUE;
 	else if (strcasecmp(uuid, HFP_HS_UUID) == 0 ||
 					strcasecmp(uuid, HSP_HS_UUID) == 0)
 		succeeded = endpoint_init_hs(endpoint, err);
diff --git a/audio/transport.c b/audio/transport.c
index 7ad7033..74562ea 100644
--- a/audio/transport.c
+++ b/audio/transport.c
@@ -44,7 +44,6 @@
 #include "media.h"
 #include "transport.h"
 #include "a2dp.h"
-#include "headset.h"
 #include "gateway.h"
 #include "sink.h"
 #include "source.h"
@@ -212,9 +211,6 @@ void media_transport_destroy(struct media_transport *transport)
 {
 	char *path;
 
-	if (transport->hs_watch)
-		headset_remove_state_cb(transport->hs_watch);
-
 	if (transport->ag_watch)
 		gateway_remove_state_cb(transport->ag_watch);
 
@@ -465,116 +461,6 @@ static void cancel_a2dp(struct media_transport *transport, guint id)
 	a2dp_cancel(transport->device, id);
 }
 
-static void headset_resume_complete(struct audio_device *dev, void *user_data)
-{
-	struct media_owner *owner = user_data;
-	struct media_request *req = owner->pending;
-	struct media_transport *transport = owner->transport;
-	int fd;
-	uint16_t imtu, omtu;
-	gboolean ret;
-
-	req->id = 0;
-
-	if (dev == NULL)
-		goto fail;
-
-	fd = headset_get_sco_fd(dev);
-	if (fd < 0)
-		goto fail;
-
-	imtu = 48;
-	omtu = 48;
-
-	media_transport_set_fd(transport, fd, imtu, omtu);
-
-	if ((owner->lock & TRANSPORT_LOCK_READ) == 0)
-		imtu = 0;
-
-	if ((owner->lock & TRANSPORT_LOCK_WRITE) == 0)
-		omtu = 0;
-
-	ret = g_dbus_send_reply(btd_get_dbus_connection(), req->msg,
-						DBUS_TYPE_UNIX_FD, &fd,
-						DBUS_TYPE_UINT16, &imtu,
-						DBUS_TYPE_UINT16, &omtu,
-						DBUS_TYPE_INVALID);
-	if (ret == FALSE)
-		goto fail;
-
-	media_owner_remove(owner);
-
-	transport_set_state(transport, TRANSPORT_STATE_ACTIVE);
-
-	return;
-
-fail:
-	media_transport_remove(transport, owner);
-}
-
-static guint resume_headset(struct media_transport *transport,
-				struct media_owner *owner)
-{
-	struct audio_device *device = transport->device;
-
-	if (state_in_use(transport->state))
-		goto done;
-
-	if (headset_lock(device, HEADSET_LOCK_READ |
-						HEADSET_LOCK_WRITE) == FALSE)
-		return 0;
-
-	if (transport->state == TRANSPORT_STATE_IDLE)
-		transport_set_state(transport, TRANSPORT_STATE_REQUESTING);
-
-done:
-	return headset_request_stream(device, headset_resume_complete,
-					owner);
-}
-
-static void headset_suspend_complete(struct audio_device *dev, void *user_data)
-{
-	struct media_owner *owner = user_data;
-	struct media_transport *transport = owner->transport;
-
-	/* Release always succeeds */
-	if (owner->pending) {
-		owner->pending->id = 0;
-		media_request_reply(owner->pending, 0);
-		media_owner_remove(owner);
-	}
-
-	headset_unlock(dev, HEADSET_LOCK_READ | HEADSET_LOCK_WRITE);
-	transport_set_state(transport, TRANSPORT_STATE_IDLE);
-	media_transport_remove(transport, owner);
-}
-
-static guint suspend_headset(struct media_transport *transport,
-						struct media_owner *owner)
-{
-	struct audio_device *device = transport->device;
-
-	if (!owner) {
-		headset_state_t state = headset_get_state(device);
-
-		headset_unlock(device, HEADSET_LOCK_READ | HEADSET_LOCK_WRITE);
-
-		if (state == HEADSET_STATE_PLAYING)
-			transport_set_state(transport, TRANSPORT_STATE_PENDING);
-		else
-			transport_set_state(transport, TRANSPORT_STATE_IDLE);
-
-		return 0;
-	}
-
-	return headset_suspend_stream(device, headset_suspend_complete, owner);
-}
-
-static void cancel_headset(struct media_transport *transport, guint id)
-{
-	headset_cancel_stream(transport->device, id);
-}
-
 static void gateway_resume_complete(struct audio_device *dev, GError *err,
 							void *user_data)
 {
@@ -920,33 +806,6 @@ static int set_property_a2dp(struct media_transport *transport,
 	return -EINVAL;
 }
 
-static int set_property_headset(struct media_transport *transport,
-						const char *property,
-						DBusMessageIter *value)
-{
-	if (g_strcmp0(property, "NREC") == 0) {
-		gboolean nrec;
-
-		if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_BOOLEAN)
-			return -EINVAL;
-		dbus_message_iter_get_basic(value, &nrec);
-
-		/* FIXME: set new nrec */
-		return 0;
-	} else if (g_strcmp0(property, "InbandRingtone") == 0) {
-		gboolean inband;
-
-		if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_BOOLEAN)
-			return -EINVAL;
-		dbus_message_iter_get_basic(value, &inband);
-
-		/* FIXME: set new inband */
-		return 0;
-	}
-
-	return -EINVAL;
-}
-
 static int set_property_gateway(struct media_transport *transport,
 						const char *property,
 						DBusMessageIter *value)
@@ -1012,22 +871,6 @@ static void get_properties_a2dp(struct media_transport *transport,
 							&a2dp->volume);
 }
 
-static void get_properties_headset(struct media_transport *transport,
-						DBusMessageIter *dict)
-{
-	gboolean nrec, inband;
-	const char *routing;
-
-	nrec = headset_get_nrec(transport->device);
-	dict_append_entry(dict, "NREC", DBUS_TYPE_BOOLEAN, &nrec);
-
-	inband = headset_get_inband(transport->device);
-	dict_append_entry(dict, "InbandRingtone", DBUS_TYPE_BOOLEAN, &inband);
-
-	routing = headset_get_sco_hci(transport->device) ? "HCI" : "PCM";
-	dict_append_entry(dict, "Routing", DBUS_TYPE_STRING, &routing);
-}
-
 static void get_properties_gateway(struct media_transport *transport,
 						DBusMessageIter *dict)
 {
@@ -1123,16 +966,6 @@ static void destroy_a2dp(void *data)
 	g_free(a2dp);
 }
 
-static void destroy_headset(void *data)
-{
-	struct headset_transport *headset = data;
-
-	if (headset->nrec_id > 0)
-		headset_remove_nrec_cb(headset->device, headset->nrec_id);
-
-	g_free(headset);
-}
-
 static void media_transport_free(void *data)
 {
 	struct media_transport *transport = data;
@@ -1154,18 +987,6 @@ static void media_transport_free(void *data)
 	g_free(transport);
 }
 
-static void headset_nrec_changed(struct audio_device *dev, gboolean nrec,
-							void *user_data)
-{
-	struct media_transport *transport = user_data;
-
-	DBG("");
-
-	emit_property_changed(transport->path,
-				MEDIA_TRANSPORT_INTERFACE, "NREC",
-				DBUS_TYPE_BOOLEAN, &nrec);
-}
-
 static void transport_update_playing(struct media_transport *transport,
 							gboolean playing)
 {
@@ -1188,22 +1009,6 @@ static void transport_update_playing(struct media_transport *transport,
 		transport_set_state(transport, TRANSPORT_STATE_PENDING);
 }
 
-static void headset_state_changed(struct audio_device *dev,
-						headset_state_t old_state,
-						headset_state_t new_state,
-						void *user_data)
-{
-	struct media_transport *transport = user_data;
-
-	if (dev != transport->device)
-		return;
-
-	if (new_state == HEADSET_STATE_PLAYING)
-		transport_update_playing(transport, TRUE);
-	else
-		transport_update_playing(transport, FALSE);
-}
-
 static void gateway_state_changed(struct audio_device *dev,
 						gateway_state_t old_state,
 						gateway_state_t new_state,
@@ -1295,26 +1100,6 @@ struct media_transport *media_transport_create(struct media_endpoint *endpoint,
 			transport->source_watch = source_add_state_cb(
 							source_state_changed,
 							transport);
-	} else if (strcasecmp(uuid, HFP_AG_UUID) == 0 ||
-			strcasecmp(uuid, HSP_AG_UUID) == 0) {
-		struct headset_transport *headset;
-
-		headset = g_new0(struct headset_transport, 1);
-		headset->device = device;
-		headset->nrec_id = headset_add_nrec_cb(device,
-							headset_nrec_changed,
-							transport);
-
-		transport->resume = resume_headset;
-		transport->suspend = suspend_headset;
-		transport->cancel = cancel_headset;
-		transport->get_properties = get_properties_headset;
-		transport->set_property = set_property_headset;
-		transport->data = headset;
-		transport->destroy = destroy_headset;
-		transport->hs_watch = headset_add_state_cb(
-							headset_state_changed,
-							transport);
 	} else if (strcasecmp(uuid, HFP_HS_UUID) == 0 ||
 			strcasecmp(uuid, HSP_HS_UUID) == 0) {
 		transport->resume = resume_gateway;
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH BlueZ 3/3] network: Fix dead assignment in connect_cb
  2012-11-13 13:21 [PATCH BlueZ 00/13] Remove HFP implementation Luiz Augusto von Dentz
                   ` (4 preceding siblings ...)
  2012-11-13 13:21 ` [PATCH BlueZ 03/13] audio: Remove code using headset Luiz Augusto von Dentz
@ 2012-11-13 13:21 ` Luiz Augusto von Dentz
  2012-11-13 13:21 ` [PATCH BlueZ 04/13] build: Remove telephony-maemo5.c Luiz Augusto von Dentz
                   ` (10 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Luiz Augusto von Dentz @ 2012-11-13 13:21 UTC (permalink / raw)
  To: linux-bluetooth

From: Szymon Janc <szymon.janc@tieto.com>

Value stored to err_msg is never read in case err was not NULL.
Simply remove err_msg and pass strerror() directly where it is used.
---
 profiles/network/connection.c | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/profiles/network/connection.c b/profiles/network/connection.c
index abcbee8..1a1fb4d 100644
--- a/profiles/network/connection.c
+++ b/profiles/network/connection.c
@@ -371,19 +371,16 @@ static int bnep_connect(struct network_conn *nc)
 static void connect_cb(GIOChannel *chan, GError *err, gpointer data)
 {
 	struct network_conn *nc = data;
-	const char *err_msg;
 	int perr;
 
 	if (err) {
 		error("%s", err->message);
-		err_msg = err->message;
 		goto failed;
 	}
 
 	perr = bnep_connect(nc);
 	if (perr < 0) {
-		err_msg = strerror(-perr);
-		error("bnep connect(): %s (%d)", err_msg, -perr);
+		error("bnep connect(): %s (%d)", strerror(-perr), -perr);
 		goto failed;
 	}
 
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH BlueZ 04/13] build: Remove telephony-maemo5.c
  2012-11-13 13:21 [PATCH BlueZ 00/13] Remove HFP implementation Luiz Augusto von Dentz
                   ` (5 preceding siblings ...)
  2012-11-13 13:21 ` [PATCH BlueZ 3/3] network: Fix dead assignment in connect_cb Luiz Augusto von Dentz
@ 2012-11-13 13:21 ` Luiz Augusto von Dentz
  2012-11-13 13:21 ` [PATCH BlueZ 05/13] build: Remove telephony-maemo6.c Luiz Augusto von Dentz
                   ` (9 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Luiz Augusto von Dentz @ 2012-11-13 13:21 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

---
 Makefile.am              |    4 +-
 audio/telephony-maemo5.c | 2102 ----------------------------------------------
 2 files changed, 2 insertions(+), 2104 deletions(-)
 delete mode 100644 audio/telephony-maemo5.c

diff --git a/Makefile.am b/Makefile.am
index c398e74..9b24589 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -126,7 +126,7 @@ builtin_nodist += audio/telephony.c
 noinst_LIBRARIES += audio/libtelephony.a
 
 audio_libtelephony_a_SOURCES = audio/telephony.h audio/telephony-dummy.c \
-				audio/telephony-maemo5.c audio/telephony-ofono.c \
+				audio/telephony-ofono.c \
 				audio/telephony-maemo6.c
 endif
 
@@ -315,7 +315,7 @@ EXTRA_DIST += src/genbuiltin src/bluetooth.conf src/org.bluez.service \
 			src/main.conf profiles/network/network.conf \
 			profiles/input/input.conf profiles/proximity/proximity.conf \
 			audio/audio.conf audio/telephony-dummy.c \
-			audio/telephony-maemo5.c audio/telephony-ofono.c \
+			audio/telephony-ofono.c \
 			audio/telephony-maemo6.c profiles/sap/sap-dummy.c \
 			profiles/sap/sap-u8500.c
 
diff --git a/audio/telephony-maemo5.c b/audio/telephony-maemo5.c
deleted file mode 100644
index deb64e4..0000000
--- a/audio/telephony-maemo5.c
+++ /dev/null
@@ -1,2102 +0,0 @@
-/*
- *
- *  BlueZ - Bluetooth protocol stack for Linux
- *
- *  Copyright (C) 2008-2010  Nokia Corporation
- *  Copyright (C) 2004-2010  Marcel Holtmann <marcel@holtmann.org>
- *
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdint.h>
-#include <string.h>
-#include <glib.h>
-#include <dbus/dbus.h>
-#include <gdbus.h>
-
-#include "dbus-common.h"
-#include "log.h"
-#include "telephony.h"
-#include "error.h"
-
-/* SSC D-Bus definitions */
-#define SSC_DBUS_NAME  "com.nokia.phone.SSC"
-#define SSC_DBUS_IFACE "com.nokia.phone.SSC"
-#define SSC_DBUS_PATH  "/com/nokia/phone/SSC"
-
-/* libcsnet D-Bus definitions */
-#define NETWORK_BUS_NAME		"com.nokia.phone.net"
-#define NETWORK_INTERFACE		"Phone.Net"
-#define NETWORK_PATH			"/com/nokia/phone/net"
-
-/* Mask bits for supported services */
-#define NETWORK_MASK_GPRS_SUPPORT	0x01
-#define NETWORK_MASK_CS_SERVICES	0x02
-#define NETWORK_MASK_EGPRS_SUPPORT	0x04
-#define NETWORK_MASK_HSDPA_AVAIL	0x08
-#define NETWORK_MASK_HSUPA_AVAIL	0x10
-
-/* network get cell info: cell type */
-#define NETWORK_UNKNOWN_CELL		0
-#define NETWORK_GSM_CELL		1
-#define NETWORK_WCDMA_CELL		2
-
-enum net_registration_status {
-	NETWORK_REG_STATUS_HOME = 0x00,
-	NETWORK_REG_STATUS_ROAM,
-	NETWORK_REG_STATUS_ROAM_BLINK,
-	NETWORK_REG_STATUS_NOSERV,
-	NETWORK_REG_STATUS_NOSERV_SEARCHING,
-	NETWORK_REG_STATUS_NOSERV_NOTSEARCHING,
-	NETWORK_REG_STATUS_NOSERV_NOSIM,
-	NETWORK_REG_STATUS_POWER_OFF = 0x08,
-	NETWORK_REG_STATUS_NSPS,
-	NETWORK_REG_STATUS_NSPS_NO_COVERAGE,
-	NETWORK_REG_STATUS_NOSERV_SIM_REJECTED_BY_NW
-};
-
-enum network_types {
-	NETWORK_GSM_HOME_PLMN = 0,
-	NETWORK_GSM_PREFERRED_PLMN,
-	NETWORK_GSM_FORBIDDEN_PLMN,
-	NETWORK_GSM_OTHER_PLMN,
-	NETWORK_GSM_NO_PLMN_AVAIL
-};
-
-enum network_alpha_tag_name_type {
-	NETWORK_HARDCODED_LATIN_OPER_NAME = 0,
-	NETWORK_HARDCODED_USC2_OPER_NAME,
-	NETWORK_NITZ_SHORT_OPER_NAME,
-	NETWORK_NITZ_FULL_OPER_NAME,
-};
-
-#define TELEPHONY_MAEMO_PATH		"/com/nokia/MaemoTelephony"
-#define TELEPHONY_MAEMO_INTERFACE	"com.nokia.MaemoTelephony"
-
-#define CALLERID_BASE		"/var/lib/bluetooth/maemo-callerid-"
-#define ALLOWED_FLAG_FILE	"/var/lib/bluetooth/maemo-callerid-allowed"
-#define RESTRICTED_FLAG_FILE	"/var/lib/bluetooth/maemo-callerid-restricted"
-#define NONE_FLAG_FILE		"/var/lib/bluetooth/maemo-callerid-none"
-
-static uint32_t callerid = 0;
-
-/* CSD CALL plugin D-Bus definitions */
-#define CSD_CALL_BUS_NAME	"com.nokia.csd.Call"
-#define CSD_CALL_INTERFACE	"com.nokia.csd.Call"
-#define CSD_CALL_INSTANCE	"com.nokia.csd.Call.Instance"
-#define CSD_CALL_CONFERENCE	"com.nokia.csd.Call.Conference"
-#define CSD_CALL_PATH		"/com/nokia/csd/call"
-#define CSD_CALL_CONFERENCE_PATH "/com/nokia/csd/call/conference"
-
-/* Call status values as exported by the CSD CALL plugin */
-#define CSD_CALL_STATUS_IDLE			0
-#define CSD_CALL_STATUS_CREATE			1
-#define CSD_CALL_STATUS_COMING			2
-#define CSD_CALL_STATUS_PROCEEDING		3
-#define CSD_CALL_STATUS_MO_ALERTING		4
-#define CSD_CALL_STATUS_MT_ALERTING		5
-#define CSD_CALL_STATUS_WAITING			6
-#define CSD_CALL_STATUS_ANSWERED		7
-#define CSD_CALL_STATUS_ACTIVE			8
-#define CSD_CALL_STATUS_MO_RELEASE		9
-#define CSD_CALL_STATUS_MT_RELEASE		10
-#define CSD_CALL_STATUS_HOLD_INITIATED		11
-#define CSD_CALL_STATUS_HOLD			12
-#define CSD_CALL_STATUS_RETRIEVE_INITIATED	13
-#define CSD_CALL_STATUS_RECONNECT_PENDING	14
-#define CSD_CALL_STATUS_TERMINATED		15
-#define CSD_CALL_STATUS_SWAP_INITIATED		16
-
-#define CALL_FLAG_NONE				0
-#define CALL_FLAG_PRESENTATION_ALLOWED		0x01
-#define CALL_FLAG_PRESENTATION_RESTRICTED	0x02
-
-/* SIM Phonebook D-Bus definitions */
-#define SIM_PHONEBOOK_BUS_NAME			"com.nokia.phone.SIM"
-#define SIM_PHONEBOOK_INTERFACE			"Phone.Sim.Phonebook"
-#define SIM_PHONEBOOK_PATH			"/com/nokia/phone/SIM/phonebook"
-
-#define PHONEBOOK_INDEX_FIRST_ENTRY		0xFFFF
-#define PHONEBOOK_INDEX_NEXT_FREE_LOCATION	0xFFFE
-
-enum sim_phonebook_type {
-	SIM_PHONEBOOK_TYPE_ADN = 0x0,
-	SIM_PHONEBOOK_TYPE_SDN,
-	SIM_PHONEBOOK_TYPE_FDN,
-	SIM_PHONEBOOK_TYPE_VMBX,
-	SIM_PHONEBOOK_TYPE_MBDN,
-	SIM_PHONEBOOK_TYPE_EN,
-	SIM_PHONEBOOK_TYPE_MSISDN
-};
-
-enum sim_phonebook_location_type {
-	SIM_PHONEBOOK_LOCATION_EXACT = 0x0,
-	SIM_PHONEBOOK_LOCATION_NEXT
-};
-
-struct csd_call {
-	char *object_path;
-	int status;
-	gboolean originating;
-	gboolean emergency;
-	gboolean on_hold;
-	gboolean conference;
-	char *number;
-	gboolean setup;
-};
-
-static struct {
-	uint8_t status;
-	uint16_t lac;
-	uint32_t cell_id;
-	uint32_t operator_code;
-	uint32_t country_code;
-	uint8_t network_type;
-	uint8_t supported_services;
-	uint16_t signals_bar;
-	char *operator_name;
-} net = {
-	.status = NETWORK_REG_STATUS_NOSERV,
-	.lac = 0,
-	.cell_id = 0,
-	.operator_code = 0,
-	.country_code = 0,
-	.network_type = NETWORK_GSM_NO_PLMN_AVAIL,
-	.supported_services = 0,
-	.signals_bar = 0,
-	.operator_name = NULL,
-};
-
-static GSList *calls = NULL;
-
-/* Reference count for determining the call indicator status */
-static GSList *active_calls = NULL;
-
-static char *msisdn = NULL;	/* Subscriber number */
-static char *vmbx = NULL;	/* Voice mailbox number */
-
-/* HAL battery namespace key values */
-static int battchg_cur = -1;	/* "battery.charge_level.current" */
-static int battchg_last = -1;	/* "battery.charge_level.last_full" */
-static int battchg_design = -1;	/* "battery.charge_level.design" */
-
-static gboolean get_calls_active = FALSE;
-
-static gboolean events_enabled = FALSE;
-
-/* Supported set of call hold operations */
-static const char *chld_str = "0,1,1x,2,2x,3,4";
-
-static char *last_dialed_number = NULL;
-
-/* Timer for tracking call creation requests */
-static guint create_request_timer = 0;
-
-static struct indicator maemo_indicators[] =
-{
-	{ "battchg",	"0-5",	5,	TRUE },
-	{ "signal",	"0-5",	0,	TRUE },
-	{ "service",	"0,1",	0,	TRUE },
-	{ "call",	"0,1",	0,	TRUE },
-	{ "callsetup",	"0-3",	0,	TRUE },
-	{ "callheld",	"0-2",	0,	FALSE },
-	{ "roam",	"0,1",	0,	TRUE },
-	{ NULL }
-};
-
-static char *call_status_str[] = {
-	"IDLE",
-	"CREATE",
-	"COMING",
-	"PROCEEDING",
-	"MO_ALERTING",
-	"MT_ALERTING",
-	"WAITING",
-	"ANSWERED",
-	"ACTIVE",
-	"MO_RELEASE",
-	"MT_RELEASE",
-	"HOLD_INITIATED",
-	"HOLD",
-	"RETRIEVE_INITIATED",
-	"RECONNECT_PENDING",
-	"TERMINATED",
-	"SWAP_INITIATED",
-	"???"
-};
-
-static struct csd_call *find_call(const char *path)
-{
-	GSList *l;
-
-	for (l = calls; l != NULL; l = l->next) {
-		struct csd_call *call = l->data;
-
-		if (g_str_equal(call->object_path, path))
-			return call;
-	}
-
-	return NULL;
-}
-
-static struct csd_call *find_non_held_call(void)
-{
-	GSList *l;
-
-	for (l = calls; l != NULL; l = l->next) {
-		struct csd_call *call = l->data;
-
-		if (call->status == CSD_CALL_STATUS_IDLE)
-			continue;
-
-		if (call->status != CSD_CALL_STATUS_HOLD)
-			return call;
-	}
-
-	return NULL;
-}
-
-static struct csd_call *find_non_idle_call(void)
-{
-	GSList *l;
-
-	for (l = calls; l != NULL; l = l->next) {
-		struct csd_call *call = l->data;
-
-		if (call->status != CSD_CALL_STATUS_IDLE)
-			return call;
-	}
-
-	return NULL;
-}
-
-static struct csd_call *find_call_with_status(int status)
-{
-	GSList *l;
-
-	for (l = calls; l != NULL; l = l->next) {
-		struct csd_call *call = l->data;
-
-		if (call->status == status)
-			return call;
-	}
-
-	return NULL;
-}
-
-static int release_conference(void)
-{
-	DBusMessage *msg;
-
-	DBG("telephony-maemo: releasing conference call");
-
-	msg = dbus_message_new_method_call(CSD_CALL_BUS_NAME,
-						CSD_CALL_CONFERENCE_PATH,
-						CSD_CALL_INSTANCE,
-						"Release");
-	if (!msg) {
-		error("Unable to allocate new D-Bus message");
-		return -ENOMEM;
-	}
-
-	g_dbus_send_message(btd_get_dbus_connection(), msg);
-
-	return 0;
-}
-
-static int release_call(struct csd_call *call)
-{
-	DBusMessage *msg;
-
-	msg = dbus_message_new_method_call(CSD_CALL_BUS_NAME,
-						call->object_path,
-						CSD_CALL_INSTANCE,
-						"Release");
-	if (!msg) {
-		error("Unable to allocate new D-Bus message");
-		return -ENOMEM;
-	}
-
-	g_dbus_send_message(btd_get_dbus_connection(), msg);
-
-	return 0;
-}
-
-static int answer_call(struct csd_call *call)
-{
-	DBusMessage *msg;
-
-	msg = dbus_message_new_method_call(CSD_CALL_BUS_NAME,
-						call->object_path,
-						CSD_CALL_INSTANCE,
-						"Answer");
-	if (!msg) {
-		error("Unable to allocate new D-Bus message");
-		return -ENOMEM;
-	}
-
-	g_dbus_send_message(btd_get_dbus_connection(), msg);
-
-	return 0;
-}
-
-static int split_call(struct csd_call *call)
-{
-	DBusMessage *msg;
-
-	msg = dbus_message_new_method_call(CSD_CALL_BUS_NAME,
-						call->object_path,
-						CSD_CALL_INSTANCE,
-						"Split");
-	if (!msg) {
-		error("Unable to allocate new D-Bus message");
-		return -ENOMEM;
-	}
-
-	g_dbus_send_message(btd_get_dbus_connection(), msg);
-
-	return 0;
-}
-
-static int unhold_call(struct csd_call *call)
-{
-	DBusMessage *msg;
-
-	msg = dbus_message_new_method_call(CSD_CALL_BUS_NAME, CSD_CALL_PATH,
-						CSD_CALL_INTERFACE,
-						"Unhold");
-	if (!msg) {
-		error("Unable to allocate new D-Bus message");
-		return -ENOMEM;
-	}
-
-	g_dbus_send_message(btd_get_dbus_connection(), msg);
-
-	return 0;
-}
-
-static int hold_call(struct csd_call *call)
-{
-	DBusMessage *msg;
-
-	msg = dbus_message_new_method_call(CSD_CALL_BUS_NAME, CSD_CALL_PATH,
-						CSD_CALL_INTERFACE,
-						"Hold");
-	if (!msg) {
-		error("Unable to allocate new D-Bus message");
-		return -ENOMEM;
-	}
-
-	g_dbus_send_message(btd_get_dbus_connection(), msg);
-
-	return 0;
-}
-
-static int swap_calls(void)
-{
-	DBusMessage *msg;
-
-	msg = dbus_message_new_method_call(CSD_CALL_BUS_NAME, CSD_CALL_PATH,
-						CSD_CALL_INTERFACE,
-						"Swap");
-	if (!msg) {
-		error("Unable to allocate new D-Bus message");
-		return -ENOMEM;
-	}
-
-	g_dbus_send_message(btd_get_dbus_connection(), msg);
-
-	return 0;
-}
-
-static int create_conference(void)
-{
-	DBusMessage *msg;
-
-	msg = dbus_message_new_method_call(CSD_CALL_BUS_NAME, CSD_CALL_PATH,
-						CSD_CALL_INTERFACE,
-						"Conference");
-	if (!msg) {
-		error("Unable to allocate new D-Bus message");
-		return -ENOMEM;
-	}
-
-	g_dbus_send_message(btd_get_dbus_connection(), msg);
-
-	return 0;
-}
-
-static int call_transfer(void)
-{
-	DBusMessage *msg;
-
-	msg = dbus_message_new_method_call(CSD_CALL_BUS_NAME, CSD_CALL_PATH,
-						CSD_CALL_INTERFACE,
-						"Transfer");
-	if (!msg) {
-		error("Unable to allocate new D-Bus message");
-		return -ENOMEM;
-	}
-
-	g_dbus_send_message(btd_get_dbus_connection(), msg);
-
-	return 0;
-}
-
-static int number_type(const char *number)
-{
-	if (number == NULL)
-		return NUMBER_TYPE_TELEPHONY;
-
-	if (number[0] == '+' || strncmp(number, "00", 2) == 0)
-		return NUMBER_TYPE_INTERNATIONAL;
-
-	return NUMBER_TYPE_TELEPHONY;
-}
-
-void telephony_device_connected(void *telephony_device)
-{
-	struct csd_call *coming;
-
-	DBG("telephony-maemo: device %p connected", telephony_device);
-
-	coming = find_call_with_status(CSD_CALL_STATUS_MT_ALERTING);
-	if (coming) {
-		if (find_call_with_status(CSD_CALL_STATUS_ACTIVE))
-			telephony_call_waiting_ind(coming->number,
-						number_type(coming->number));
-		else
-			telephony_incoming_call_ind(coming->number,
-						number_type(coming->number));
-	}
-}
-
-void telephony_device_disconnected(void *telephony_device)
-{
-	DBG("telephony-maemo: device %p disconnected", telephony_device);
-	events_enabled = FALSE;
-}
-
-void telephony_event_reporting_req(void *telephony_device, int ind)
-{
-	events_enabled = ind == 1 ? TRUE : FALSE;
-
-	telephony_event_reporting_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_response_and_hold_req(void *telephony_device, int rh)
-{
-	telephony_response_and_hold_rsp(telephony_device,
-						CME_ERROR_NOT_SUPPORTED);
-}
-
-void telephony_last_dialed_number_req(void *telephony_device)
-{
-	DBG("telephony-maemo: last dialed number request");
-
-	if (last_dialed_number)
-		telephony_dial_number_req(telephony_device,
-						last_dialed_number);
-	else
-		telephony_last_dialed_number_rsp(telephony_device,
-						CME_ERROR_NOT_ALLOWED);
-}
-
-void telephony_terminate_call_req(void *telephony_device)
-{
-	struct csd_call *call;
-	int err;
-
-	call = find_call_with_status(CSD_CALL_STATUS_ACTIVE);
-	if (!call)
-		call = find_non_idle_call();
-
-	if (!call) {
-		error("No active call");
-		telephony_terminate_call_rsp(telephony_device,
-						CME_ERROR_NOT_ALLOWED);
-		return;
-	}
-
-	if (call->conference)
-		err = release_conference();
-	else
-		err = release_call(call);
-
-	if (err < 0)
-		telephony_terminate_call_rsp(telephony_device,
-						CME_ERROR_AG_FAILURE);
-	else
-		telephony_terminate_call_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_answer_call_req(void *telephony_device)
-{
-	struct csd_call *call;
-
-	call = find_call_with_status(CSD_CALL_STATUS_COMING);
-	if (!call)
-		call = find_call_with_status(CSD_CALL_STATUS_MT_ALERTING);
-
-	if (!call)
-		call = find_call_with_status(CSD_CALL_STATUS_PROCEEDING);
-
-	if (!call)
-		call = find_call_with_status(CSD_CALL_STATUS_WAITING);
-
-	if (!call) {
-		telephony_answer_call_rsp(telephony_device,
-						CME_ERROR_NOT_ALLOWED);
-		return;
-	}
-
-	if (answer_call(call) < 0)
-		telephony_answer_call_rsp(telephony_device,
-						CME_ERROR_AG_FAILURE);
-	else
-		telephony_answer_call_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-static int send_method_call(const char *dest, const char *path,
-				const char *interface, const char *method,
-				DBusPendingCallNotifyFunction cb,
-				void *user_data, int type, ...)
-{
-	DBusConnection *conn = btd_get_dbus_connection();
-	DBusMessage *msg;
-	DBusPendingCall *call;
-	va_list args;
-
-	msg = dbus_message_new_method_call(dest, path, interface, method);
-	if (!msg) {
-		error("Unable to allocate new D-Bus %s message", method);
-		return -ENOMEM;
-	}
-
-	va_start(args, type);
-
-	if (!dbus_message_append_args_valist(msg, type, args)) {
-		dbus_message_unref(msg);
-		va_end(args);
-		return -EIO;
-	}
-
-	va_end(args);
-
-	if (!cb) {
-		g_dbus_send_message(conn, msg);
-		return 0;
-	}
-
-	if (!dbus_connection_send_with_reply(conn, msg, &call, -1)) {
-		error("Sending %s failed", method);
-		dbus_message_unref(msg);
-		return -EIO;
-	}
-
-	dbus_pending_call_set_notify(call, cb, user_data, NULL);
-	dbus_pending_call_unref(call);
-	dbus_message_unref(msg);
-
-	return 0;
-}
-
-static const char *memory_dial_lookup(int location)
-{
-	if (location == 1)
-		return vmbx;
-	else
-		return NULL;
-}
-
-void telephony_dial_number_req(void *telephony_device, const char *number)
-{
-	uint32_t flags = callerid;
-	int ret;
-
-	DBG("telephony-maemo: dial request to %s", number);
-
-	if (strncmp(number, "*31#", 4) == 0) {
-		number += 4;
-		flags = CALL_FLAG_PRESENTATION_ALLOWED;
-	} else if (strncmp(number, "#31#", 4) == 0) {
-		number += 4;
-		flags = CALL_FLAG_PRESENTATION_RESTRICTED;
-	} else if (number[0] == '>') {
-		const char *location = &number[1];
-
-		number = memory_dial_lookup(strtol(&number[1], NULL, 0));
-		if (!number) {
-			error("No number at memory location %s", location);
-			telephony_dial_number_rsp(telephony_device,
-						CME_ERROR_INVALID_INDEX);
-			return;
-		}
-	}
-
-	ret = send_method_call(CSD_CALL_BUS_NAME, CSD_CALL_PATH,
-				CSD_CALL_INTERFACE, "CreateWith",
-				NULL, NULL,
-				DBUS_TYPE_STRING, &number,
-				DBUS_TYPE_UINT32, &flags,
-				DBUS_TYPE_INVALID);
-	if (ret < 0) {
-		telephony_dial_number_rsp(telephony_device,
-						CME_ERROR_AG_FAILURE);
-		return;
-	}
-
-	telephony_dial_number_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_transmit_dtmf_req(void *telephony_device, char tone)
-{
-	int ret;
-	char buf[2] = { tone, '\0' }, *buf_ptr = buf;
-
-	DBG("telephony-maemo: transmit dtmf: %s", buf);
-
-	ret = send_method_call(CSD_CALL_BUS_NAME, CSD_CALL_PATH,
-				CSD_CALL_INTERFACE, "SendDTMF",
-				NULL, NULL,
-				DBUS_TYPE_STRING, &buf_ptr,
-				DBUS_TYPE_INVALID);
-	if (ret < 0) {
-		telephony_transmit_dtmf_rsp(telephony_device,
-						CME_ERROR_AG_FAILURE);
-		return;
-	}
-
-	telephony_transmit_dtmf_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_subscriber_number_req(void *telephony_device)
-{
-	DBG("telephony-maemo: subscriber number request");
-	if (msisdn)
-		telephony_subscriber_number_ind(msisdn,
-						number_type(msisdn),
-						SUBSCRIBER_SERVICE_VOICE);
-	telephony_subscriber_number_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-static int csd_status_to_hfp(struct csd_call *call)
-{
-	switch (call->status) {
-	case CSD_CALL_STATUS_IDLE:
-	case CSD_CALL_STATUS_MO_RELEASE:
-	case CSD_CALL_STATUS_MT_RELEASE:
-	case CSD_CALL_STATUS_TERMINATED:
-		return -1;
-	case CSD_CALL_STATUS_CREATE:
-		return CALL_STATUS_DIALING;
-	case CSD_CALL_STATUS_WAITING:
-		return CALL_STATUS_WAITING;
-	case CSD_CALL_STATUS_PROCEEDING:
-		/* PROCEEDING can happen in outgoing/incoming */
-		if (call->originating)
-			return CALL_STATUS_DIALING;
-		else
-			return CALL_STATUS_INCOMING;
-	case CSD_CALL_STATUS_COMING:
-		return CALL_STATUS_INCOMING;
-	case CSD_CALL_STATUS_MO_ALERTING:
-		return CALL_STATUS_ALERTING;
-	case CSD_CALL_STATUS_MT_ALERTING:
-		return CALL_STATUS_INCOMING;
-	case CSD_CALL_STATUS_ANSWERED:
-	case CSD_CALL_STATUS_ACTIVE:
-	case CSD_CALL_STATUS_RECONNECT_PENDING:
-	case CSD_CALL_STATUS_SWAP_INITIATED:
-	case CSD_CALL_STATUS_HOLD_INITIATED:
-		return CALL_STATUS_ACTIVE;
-	case CSD_CALL_STATUS_RETRIEVE_INITIATED:
-	case CSD_CALL_STATUS_HOLD:
-		return CALL_STATUS_HELD;
-	default:
-		return -1;
-	}
-}
-
-void telephony_list_current_calls_req(void *telephony_device)
-{
-	GSList *l;
-	int i;
-
-	DBG("telephony-maemo: list current calls request");
-
-	for (l = calls, i = 1; l != NULL; l = l->next, i++) {
-		struct csd_call *call = l->data;
-		int status, direction, multiparty;
-
-		status = csd_status_to_hfp(call);
-		if (status < 0)
-			continue;
-
-		direction = call->originating ?
-				CALL_DIR_OUTGOING : CALL_DIR_INCOMING;
-
-		multiparty = call->conference ?
-				CALL_MULTIPARTY_YES : CALL_MULTIPARTY_NO;
-
-		telephony_list_current_call_ind(i, direction, status,
-						CALL_MODE_VOICE, multiparty,
-						call->number,
-						number_type(call->number));
-	}
-
-	telephony_list_current_calls_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_operator_selection_req(void *telephony_device)
-{
-	telephony_operator_selection_ind(OPERATOR_MODE_AUTO,
-				net.operator_name ? net.operator_name : "");
-	telephony_operator_selection_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-static void foreach_call_with_status(int status,
-					int (*func)(struct csd_call *call))
-{
-	GSList *l;
-
-	for (l = calls; l != NULL; l = l->next) {
-		struct csd_call *call = l->data;
-
-		if (call->status == status)
-			func(call);
-	}
-}
-
-void telephony_call_hold_req(void *telephony_device, const char *cmd)
-{
-	const char *idx;
-	struct csd_call *call;
-	int err = 0;
-
-	DBG("telephony-maemo: got call hold request %s", cmd);
-
-	if (strlen(cmd) > 1)
-		idx = &cmd[1];
-	else
-		idx = NULL;
-
-	if (idx)
-		call = g_slist_nth_data(calls, strtol(idx, NULL, 0) - 1);
-	else
-		call = NULL;
-
-	switch (cmd[0]) {
-	case '0':
-		foreach_call_with_status(CSD_CALL_STATUS_HOLD, release_call);
-		foreach_call_with_status(CSD_CALL_STATUS_WAITING,
-								release_call);
-		break;
-	case '1':
-		if (idx) {
-			if (call)
-				err = release_call(call);
-			break;
-		}
-		foreach_call_with_status(CSD_CALL_STATUS_ACTIVE, release_call);
-		call = find_call_with_status(CSD_CALL_STATUS_WAITING);
-		if (call)
-			err = answer_call(call);
-		break;
-	case '2':
-		if (idx) {
-			if (call)
-				err = split_call(call);
-		} else {
-			struct csd_call *held, *wait;
-
-			call = find_call_with_status(CSD_CALL_STATUS_ACTIVE);
-			held = find_call_with_status(CSD_CALL_STATUS_HOLD);
-			wait = find_call_with_status(CSD_CALL_STATUS_WAITING);
-
-			if (wait)
-				err = answer_call(wait);
-			else if (call && held)
-				err = swap_calls();
-			else {
-				if (call)
-					err = hold_call(call);
-				if (held)
-					err = unhold_call(held);
-			}
-		}
-		break;
-	case '3':
-		if (find_call_with_status(CSD_CALL_STATUS_HOLD) ||
-				find_call_with_status(CSD_CALL_STATUS_WAITING))
-			err = create_conference();
-		break;
-	case '4':
-		err = call_transfer();
-		break;
-	default:
-		DBG("Unknown call hold request");
-		break;
-	}
-
-	if (err)
-		telephony_call_hold_rsp(telephony_device,
-					CME_ERROR_AG_FAILURE);
-	else
-		telephony_call_hold_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_nr_and_ec_req(void *telephony_device, gboolean enable)
-{
-	DBG("telephony-maemo: got %s NR and EC request",
-			enable ? "enable" : "disable");
-	telephony_nr_and_ec_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_key_press_req(void *telephony_device, const char *keys)
-{
-	struct csd_call *active, *waiting;
-	int err;
-
-	DBG("telephony-maemo: got key press request for %s", keys);
-
-	waiting = find_call_with_status(CSD_CALL_STATUS_COMING);
-	if (!waiting)
-		waiting = find_call_with_status(CSD_CALL_STATUS_MT_ALERTING);
-	if (!waiting)
-		waiting = find_call_with_status(CSD_CALL_STATUS_PROCEEDING);
-
-	active = find_call_with_status(CSD_CALL_STATUS_ACTIVE);
-
-	if (waiting)
-		err = answer_call(waiting);
-	else if (active)
-		err = release_call(active);
-	else
-		err = 0;
-
-	if (err < 0)
-		telephony_key_press_rsp(telephony_device,
-							CME_ERROR_AG_FAILURE);
-	else
-		telephony_key_press_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_voice_dial_req(void *telephony_device, gboolean enable)
-{
-	DBG("telephony-maemo: got %s voice dial request",
-			enable ? "enable" : "disable");
-
-	telephony_voice_dial_rsp(telephony_device, CME_ERROR_NOT_SUPPORTED);
-}
-
-static void handle_incoming_call(DBusMessage *msg)
-{
-	const char *number, *call_path;
-	struct csd_call *call;
-
-	if (!dbus_message_get_args(msg, NULL,
-					DBUS_TYPE_OBJECT_PATH, &call_path,
-					DBUS_TYPE_STRING, &number,
-					DBUS_TYPE_INVALID)) {
-		error("Unexpected parameters in Call.Coming() signal");
-		return;
-	}
-
-	call = find_call(call_path);
-	if (!call) {
-		error("Didn't find any matching call object for %s",
-				call_path);
-		return;
-	}
-
-	DBG("Incoming call to %s from number %s", call_path, number);
-
-	g_free(call->number);
-	call->number = g_strdup(number);
-
-	telephony_update_indicator(maemo_indicators, "callsetup",
-					EV_CALLSETUP_INCOMING);
-
-	if (find_call_with_status(CSD_CALL_STATUS_ACTIVE))
-		telephony_call_waiting_ind(call->number,
-						number_type(call->number));
-	else
-		telephony_incoming_call_ind(call->number,
-						number_type(call->number));
-}
-
-static void handle_outgoing_call(DBusMessage *msg)
-{
-	const char *number, *call_path;
-	struct csd_call *call;
-
-	if (!dbus_message_get_args(msg, NULL,
-					DBUS_TYPE_OBJECT_PATH, &call_path,
-					DBUS_TYPE_STRING, &number,
-					DBUS_TYPE_INVALID)) {
-		error("Unexpected parameters in Call.Created() signal");
-		return;
-	}
-
-	call = find_call(call_path);
-	if (!call) {
-		error("Didn't find any matching call object for %s",
-				call_path);
-		return;
-	}
-
-	DBG("Outgoing call from %s to number %s", call_path, number);
-
-	g_free(call->number);
-	call->number = g_strdup(number);
-
-	g_free(last_dialed_number);
-	last_dialed_number = g_strdup(number);
-
-	if (create_request_timer) {
-		g_source_remove(create_request_timer);
-		create_request_timer = 0;
-	}
-}
-
-static gboolean create_timeout(gpointer user_data)
-{
-	telephony_update_indicator(maemo_indicators, "callsetup",
-					EV_CALLSETUP_INACTIVE);
-	create_request_timer = 0;
-	return FALSE;
-}
-
-static void handle_create_requested(DBusMessage *msg)
-{
-	DBG("Call.CreateRequested()");
-
-	if (create_request_timer)
-		g_source_remove(create_request_timer);
-
-	create_request_timer = g_timeout_add_seconds(5, create_timeout, NULL);
-
-	telephony_update_indicator(maemo_indicators, "callsetup",
-					EV_CALLSETUP_OUTGOING);
-}
-
-static void handle_call_status(DBusMessage *msg, const char *call_path)
-{
-	struct csd_call *call;
-	dbus_uint32_t status, cause_type, cause;
-	int callheld = telephony_get_indicator(maemo_indicators, "callheld");
-
-	if (!dbus_message_get_args(msg, NULL,
-					DBUS_TYPE_UINT32, &status,
-					DBUS_TYPE_UINT32, &cause_type,
-					DBUS_TYPE_UINT32, &cause,
-					DBUS_TYPE_INVALID)) {
-		error("Unexpected parameters in Instance.CallStatus() signal");
-		return;
-	}
-
-	call = find_call(call_path);
-	if (!call) {
-		error("Didn't find any matching call object for %s",
-				call_path);
-		return;
-	}
-
-	if (status > 16) {
-		error("Invalid call status %u", status);
-		return;
-	}
-
-	DBG("Call %s changed from %s to %s", call_path,
-		call_status_str[call->status], call_status_str[status]);
-
-	if (call->status == (int) status) {
-		DBG("Ignoring CSD Call state change to existing state");
-		return;
-	}
-
-	call->status = (int) status;
-
-	switch (status) {
-	case CSD_CALL_STATUS_IDLE:
-		if (call->setup) {
-			telephony_update_indicator(maemo_indicators,
-							"callsetup",
-							EV_CALLSETUP_INACTIVE);
-			if (!call->originating)
-				telephony_calling_stopped_ind();
-		}
-
-		g_free(call->number);
-		call->number = NULL;
-		call->originating = FALSE;
-		call->emergency = FALSE;
-		call->on_hold = FALSE;
-		call->conference = FALSE;
-		call->setup = FALSE;
-		break;
-	case CSD_CALL_STATUS_CREATE:
-		call->originating = TRUE;
-		call->setup = TRUE;
-		break;
-	case CSD_CALL_STATUS_COMING:
-		call->originating = FALSE;
-		call->setup = TRUE;
-		break;
-	case CSD_CALL_STATUS_PROCEEDING:
-		break;
-	case CSD_CALL_STATUS_MO_ALERTING:
-		telephony_update_indicator(maemo_indicators, "callsetup",
-						EV_CALLSETUP_ALERTING);
-		break;
-	case CSD_CALL_STATUS_MT_ALERTING:
-		break;
-	case CSD_CALL_STATUS_WAITING:
-		break;
-	case CSD_CALL_STATUS_ANSWERED:
-		break;
-	case CSD_CALL_STATUS_ACTIVE:
-		if (call->on_hold) {
-			call->on_hold = FALSE;
-			if (find_call_with_status(CSD_CALL_STATUS_HOLD))
-				telephony_update_indicator(maemo_indicators,
-							"callheld",
-							EV_CALLHELD_MULTIPLE);
-			else
-				telephony_update_indicator(maemo_indicators,
-							"callheld",
-							EV_CALLHELD_NONE);
-		} else {
-			if (!g_slist_find(active_calls, call))
-				active_calls = g_slist_prepend(active_calls, call);
-			if (g_slist_length(active_calls) == 1)
-				telephony_update_indicator(maemo_indicators,
-								"call",
-								EV_CALL_ACTIVE);
-			/* Upgrade callheld status if necessary */
-			if (callheld == EV_CALLHELD_ON_HOLD)
-				telephony_update_indicator(maemo_indicators,
-							"callheld",
-							EV_CALLHELD_MULTIPLE);
-			telephony_update_indicator(maemo_indicators,
-							"callsetup",
-							EV_CALLSETUP_INACTIVE);
-			if (!call->originating)
-				telephony_calling_stopped_ind();
-			call->setup = FALSE;
-		}
-		break;
-	case CSD_CALL_STATUS_MO_RELEASE:
-	case CSD_CALL_STATUS_MT_RELEASE:
-		active_calls = g_slist_remove(active_calls, call);
-		if (g_slist_length(active_calls) == 0)
-			telephony_update_indicator(maemo_indicators, "call",
-							EV_CALL_INACTIVE);
-		break;
-	case CSD_CALL_STATUS_HOLD_INITIATED:
-		break;
-	case CSD_CALL_STATUS_HOLD:
-		call->on_hold = TRUE;
-		if (find_non_held_call())
-			telephony_update_indicator(maemo_indicators,
-							"callheld",
-							EV_CALLHELD_MULTIPLE);
-		else
-			telephony_update_indicator(maemo_indicators,
-							"callheld",
-							EV_CALLHELD_ON_HOLD);
-		break;
-	case CSD_CALL_STATUS_RETRIEVE_INITIATED:
-		break;
-	case CSD_CALL_STATUS_RECONNECT_PENDING:
-		break;
-	case CSD_CALL_STATUS_TERMINATED:
-		if (call->on_hold &&
-				!find_call_with_status(CSD_CALL_STATUS_HOLD))
-			telephony_update_indicator(maemo_indicators,
-							"callheld",
-							EV_CALLHELD_NONE);
-		else if (callheld == EV_CALLHELD_MULTIPLE &&
-				find_call_with_status(CSD_CALL_STATUS_HOLD))
-			telephony_update_indicator(maemo_indicators,
-							"callheld",
-							EV_CALLHELD_ON_HOLD);
-		break;
-	case CSD_CALL_STATUS_SWAP_INITIATED:
-		break;
-	default:
-		error("Unknown call status %u", status);
-		break;
-	}
-}
-
-static void handle_conference(DBusMessage *msg, gboolean joined)
-{
-	const char *path;
-	struct csd_call *call;
-
-	if (!dbus_message_get_args(msg, NULL,
-					DBUS_TYPE_OBJECT_PATH, &path,
-					DBUS_TYPE_INVALID)) {
-		error("Unexpected parameters in Conference.%s",
-					dbus_message_get_member(msg));
-		return;
-	}
-
-	call = find_call(path);
-	if (!call) {
-		error("Conference signal for unknown call %s", path);
-		return;
-	}
-
-	DBG("Call %s %s the conference", path, joined ? "joined" : "left");
-
-	call->conference = joined;
-}
-
-static void get_operator_name_reply(DBusPendingCall *pending_call,
-					void *user_data)
-{
-	DBusMessage *reply;
-	DBusError err;
-	const char *name;
-	dbus_int32_t net_err;
-
-	reply = dbus_pending_call_steal_reply(pending_call);
-
-	dbus_error_init(&err);
-	if (dbus_set_error_from_message(&err, reply)) {
-		error("get_operator_name failed: %s, %s",
-			err.name, err.message);
-		dbus_error_free(&err);
-		goto done;
-	}
-
-	dbus_error_init(&err);
-	if (!dbus_message_get_args(reply, &err,
-					DBUS_TYPE_STRING, &name,
-					DBUS_TYPE_INT32, &net_err,
-					DBUS_TYPE_INVALID)) {
-		error("Unexpected get_operator_name reply parameters: %s, %s",
-			err.name, err.message);
-		dbus_error_free(&err);
-		goto done;
-	}
-
-	if (net_err != 0) {
-		error("get_operator_name failed with code %d", net_err);
-		goto done;
-	}
-
-	if (strlen(name) == 0)
-		goto done;
-
-	g_free(net.operator_name);
-	net.operator_name = g_strdup(name);
-
-	DBG("telephony-maemo: operator name updated: %s", name);
-
-done:
-	dbus_message_unref(reply);
-}
-
-static void resolve_operator_name(uint32_t operator, uint32_t country)
-{
-	uint8_t name_type = NETWORK_HARDCODED_LATIN_OPER_NAME;
-
-	send_method_call(NETWORK_BUS_NAME, NETWORK_PATH,
-				NETWORK_INTERFACE, "get_operator_name",
-				get_operator_name_reply, NULL,
-				DBUS_TYPE_BYTE, &name_type,
-				DBUS_TYPE_UINT32, &operator,
-				DBUS_TYPE_UINT32, &country,
-				DBUS_TYPE_INVALID);
-}
-
-static void update_registration_status(uint8_t status, uint16_t lac,
-					uint32_t cell_id,
-					uint32_t operator_code,
-					uint32_t country_code,
-					uint8_t network_type,
-					uint8_t supported_services)
-{
-	if (net.status != status) {
-		switch (status) {
-		case NETWORK_REG_STATUS_HOME:
-			telephony_update_indicator(maemo_indicators, "roam",
-							EV_ROAM_INACTIVE);
-			if (net.status >= NETWORK_REG_STATUS_NOSERV)
-				telephony_update_indicator(maemo_indicators,
-							"service",
-							EV_SERVICE_PRESENT);
-			break;
-		case NETWORK_REG_STATUS_ROAM:
-		case NETWORK_REG_STATUS_ROAM_BLINK:
-			telephony_update_indicator(maemo_indicators, "roam",
-							EV_ROAM_ACTIVE);
-			if (net.status >= NETWORK_REG_STATUS_NOSERV)
-				telephony_update_indicator(maemo_indicators,
-							"service",
-							EV_SERVICE_PRESENT);
-			break;
-		case NETWORK_REG_STATUS_NOSERV:
-		case NETWORK_REG_STATUS_NOSERV_SEARCHING:
-		case NETWORK_REG_STATUS_NOSERV_NOTSEARCHING:
-		case NETWORK_REG_STATUS_NOSERV_NOSIM:
-		case NETWORK_REG_STATUS_POWER_OFF:
-		case NETWORK_REG_STATUS_NSPS:
-		case NETWORK_REG_STATUS_NSPS_NO_COVERAGE:
-		case NETWORK_REG_STATUS_NOSERV_SIM_REJECTED_BY_NW:
-			if (net.status < NETWORK_REG_STATUS_NOSERV)
-				telephony_update_indicator(maemo_indicators,
-							"service",
-							EV_SERVICE_NONE);
-			break;
-		}
-
-		net.status = status;
-	}
-
-	net.lac = lac;
-	net.cell_id = cell_id;
-
-	if (net.operator_code != operator_code ||
-			net.country_code != country_code) {
-		g_free(net.operator_name);
-		net.operator_name = NULL;
-		resolve_operator_name(operator_code, country_code);
-		net.operator_code = operator_code;
-		net.country_code = country_code;
-	}
-
-	net.network_type = network_type;
-	net.supported_services = supported_services;
-}
-
-static void handle_registration_status_change(DBusMessage *msg)
-{
-	uint8_t status;
-	dbus_uint16_t lac, network_type, supported_services;
-	dbus_uint32_t cell_id, operator_code, country_code;
-
-	if (!dbus_message_get_args(msg, NULL,
-					DBUS_TYPE_BYTE, &status,
-					DBUS_TYPE_UINT16, &lac,
-					DBUS_TYPE_UINT32, &cell_id,
-					DBUS_TYPE_UINT32, &operator_code,
-					DBUS_TYPE_UINT32, &country_code,
-					DBUS_TYPE_BYTE, &network_type,
-					DBUS_TYPE_BYTE, &supported_services,
-					DBUS_TYPE_INVALID)) {
-		error("Unexpected parameters in registration_status_change");
-		return;
-	}
-
-	update_registration_status(status, lac, cell_id, operator_code,
-					country_code, network_type,
-					supported_services);
-}
-
-static void update_signal_strength(uint8_t signals_bar)
-{
-	int signal;
-
-	if (signals_bar > 100) {
-		DBG("signals_bar greater than expected: %u", signals_bar);
-		signals_bar = 100;
-	}
-
-	if (net.signals_bar == signals_bar)
-		return;
-
-	/* A simple conversion from 0-100 to 0-5 (used by HFP) */
-	signal = (signals_bar + 20) / 21;
-
-	telephony_update_indicator(maemo_indicators, "signal", signal);
-
-	net.signals_bar = signals_bar;
-
-	DBG("Signal strength updated: %u/100, %d/5", signals_bar, signal);
-}
-
-static void handle_signal_strength_change(DBusMessage *msg)
-{
-	uint8_t signals_bar, rssi_in_dbm;
-
-	if (!dbus_message_get_args(msg, NULL,
-					DBUS_TYPE_BYTE, &signals_bar,
-					DBUS_TYPE_BYTE, &rssi_in_dbm,
-					DBUS_TYPE_INVALID)) {
-		error("Unexpected parameters in signal_strength_change");
-		return;
-	}
-
-	update_signal_strength(signals_bar);
-}
-
-static gboolean iter_get_basic_args(DBusMessageIter *iter,
-					int first_arg_type, ...)
-{
-	int type;
-	va_list ap;
-
-	va_start(ap, first_arg_type);
-
-	for (type = first_arg_type; type != DBUS_TYPE_INVALID;
-			type = va_arg(ap, int)) {
-		void *value = va_arg(ap, void *);
-		int real_type = dbus_message_iter_get_arg_type(iter);
-
-		if (real_type != type) {
-			error("iter_get_basic_args: expected %c but got %c",
-					(char) type, (char) real_type);
-			break;
-		}
-
-		dbus_message_iter_get_basic(iter, value);
-		dbus_message_iter_next(iter);
-	}
-
-	va_end(ap);
-
-	return type == DBUS_TYPE_INVALID ? TRUE : FALSE;
-}
-
-static void hal_battery_level_reply(DBusPendingCall *call, void *user_data)
-{
-	DBusError err;
-	DBusMessage *reply;
-	dbus_int32_t level;
-	int *value = user_data;
-
-	reply = dbus_pending_call_steal_reply(call);
-
-	dbus_error_init(&err);
-	if (dbus_set_error_from_message(&err, reply)) {
-		error("hald replied with an error: %s, %s",
-				err.name, err.message);
-		dbus_error_free(&err);
-		goto done;
-	}
-
-	dbus_error_init(&err);
-	if (dbus_message_get_args(reply, &err,
-				DBUS_TYPE_INT32, &level,
-				DBUS_TYPE_INVALID) == FALSE) {
-		error("Unable to parse GetPropertyInteger reply: %s, %s",
-							err.name, err.message);
-		dbus_error_free(&err);
-		goto done;
-	}
-
-	*value = (int) level;
-
-	if (value == &battchg_last)
-		DBG("telephony-maemo: battery.charge_level.last_full is %d",
-				*value);
-	else if (value == &battchg_design)
-		DBG("telephony-maemo: battery.charge_level.design is %d",
-				*value);
-	else
-		DBG("telephony-maemo: battery.charge_level.current is %d",
-				*value);
-
-	if ((battchg_design > 0 || battchg_last > 0) && battchg_cur >= 0) {
-		int new, max;
-
-		if (battchg_last > 0)
-			max = battchg_last;
-		else
-			max = battchg_design;
-
-		new = battchg_cur * 5 / max;
-
-		telephony_update_indicator(maemo_indicators, "battchg", new);
-	}
-done:
-	dbus_message_unref(reply);
-}
-
-static void hal_get_integer(const char *path, const char *key, void *user_data)
-{
-	send_method_call("org.freedesktop.Hal", path,
-				"org.freedesktop.Hal.Device",
-				"GetPropertyInteger",
-				hal_battery_level_reply, user_data,
-				DBUS_TYPE_STRING, &key,
-				DBUS_TYPE_INVALID);
-}
-
-static void handle_hal_property_modified(DBusMessage *msg)
-{
-	DBusMessageIter iter, array;
-	dbus_int32_t num_changes;
-	const char *path;
-
-	path = dbus_message_get_path(msg);
-
-	dbus_message_iter_init(msg, &iter);
-
-	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) {
-		error("Unexpected signature in hal PropertyModified signal");
-		return;
-	}
-
-	dbus_message_iter_get_basic(&iter, &num_changes);
-	dbus_message_iter_next(&iter);
-
-	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY) {
-		error("Unexpected signature in hal PropertyModified signal");
-		return;
-	}
-
-	dbus_message_iter_recurse(&iter, &array);
-
-	while (dbus_message_iter_get_arg_type(&array) != DBUS_TYPE_INVALID) {
-		DBusMessageIter prop;
-		const char *name;
-		dbus_bool_t added, removed;
-
-		dbus_message_iter_recurse(&array, &prop);
-
-		if (!iter_get_basic_args(&prop,
-					DBUS_TYPE_STRING, &name,
-					DBUS_TYPE_BOOLEAN, &added,
-					DBUS_TYPE_BOOLEAN, &removed,
-					DBUS_TYPE_INVALID)) {
-			error("Invalid hal PropertyModified parameters");
-			break;
-		}
-
-		if (g_str_equal(name, "battery.charge_level.last_full"))
-			hal_get_integer(path, name, &battchg_last);
-		else if (g_str_equal(name, "battery.charge_level.current"))
-			hal_get_integer(path, name, &battchg_cur);
-		else if (g_str_equal(name, "battery.charge_level.design"))
-			hal_get_integer(path, name, &battchg_design);
-
-		dbus_message_iter_next(&array);
-	}
-}
-
-static void csd_call_free(struct csd_call *call)
-{
-	if (!call)
-		return;
-
-	g_free(call->object_path);
-	g_free(call->number);
-
-	g_free(call);
-}
-
-static void parse_call_list(DBusMessageIter *iter)
-{
-	do {
-		DBusMessageIter call_iter;
-		struct csd_call *call;
-		const char *object_path, *number;
-		dbus_uint32_t status;
-		dbus_bool_t originating, terminating, emerg, on_hold, conf;
-
-		if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_STRUCT) {
-			error("Unexpected signature in GetCallInfoAll reply");
-			break;
-		}
-
-		dbus_message_iter_recurse(iter, &call_iter);
-
-		if (!iter_get_basic_args(&call_iter,
-					DBUS_TYPE_OBJECT_PATH, &object_path,
-					DBUS_TYPE_UINT32, &status,
-					DBUS_TYPE_BOOLEAN, &originating,
-					DBUS_TYPE_BOOLEAN, &terminating,
-					DBUS_TYPE_BOOLEAN, &emerg,
-					DBUS_TYPE_BOOLEAN, &on_hold,
-					DBUS_TYPE_BOOLEAN, &conf,
-					DBUS_TYPE_STRING, &number,
-					DBUS_TYPE_INVALID)) {
-			error("Parsing call D-Bus parameters failed");
-			break;
-		}
-
-		call = find_call(object_path);
-		if (!call) {
-			call = g_new0(struct csd_call, 1);
-			call->object_path = g_strdup(object_path);
-			call->status = (int) status;
-			calls = g_slist_append(calls, call);
-			DBG("telephony-maemo: new csd call instance at %s",
-								object_path);
-		}
-
-		if (call->status == CSD_CALL_STATUS_IDLE)
-			continue;
-
-		/* CSD gives incorrect call_hold property sometimes */
-		if ((call->status != CSD_CALL_STATUS_HOLD && on_hold) ||
-				(call->status == CSD_CALL_STATUS_HOLD &&
-								!on_hold)) {
-			error("Conflicting call status and on_hold property!");
-			on_hold = call->status == CSD_CALL_STATUS_HOLD;
-		}
-
-		call->originating = originating;
-		call->on_hold = on_hold;
-		call->conference = conf;
-		g_free(call->number);
-		call->number = g_strdup(number);
-
-	} while (dbus_message_iter_next(iter));
-}
-
-static void signal_strength_reply(DBusPendingCall *call, void *user_data)
-{
-	DBusError err;
-	DBusMessage *reply;
-	uint8_t signals_bar, rssi_in_dbm;
-	dbus_int32_t net_err;
-
-	reply = dbus_pending_call_steal_reply(call);
-
-	dbus_error_init(&err);
-	if (dbus_set_error_from_message(&err, reply)) {
-		error("Unable to get signal strength: %s, %s",
-			err.name, err.message);
-		dbus_error_free(&err);
-		goto done;
-	}
-
-	dbus_error_init(&err);
-	if (!dbus_message_get_args(reply, &err,
-					DBUS_TYPE_BYTE, &signals_bar,
-					DBUS_TYPE_BYTE, &rssi_in_dbm,
-					DBUS_TYPE_INT32, &net_err,
-					DBUS_TYPE_INVALID)) {
-		error("Unable to parse signal_strength reply: %s, %s",
-							err.name, err.message);
-		dbus_error_free(&err);
-		goto done;
-	}
-
-	if (net_err != 0) {
-		error("get_signal_strength failed with code %d", net_err);
-		goto done;
-	}
-
-	update_signal_strength(signals_bar);
-
-done:
-	dbus_message_unref(reply);
-}
-
-static int get_signal_strength(void)
-{
-	return send_method_call(NETWORK_BUS_NAME, NETWORK_PATH,
-				NETWORK_INTERFACE, "get_signal_strength",
-				signal_strength_reply, NULL,
-				DBUS_TYPE_INVALID);
-}
-
-static void registration_status_reply(DBusPendingCall *call, void *user_data)
-{
-	DBusError err;
-	DBusMessage *reply;
-	uint8_t status;
-	dbus_uint16_t lac, network_type, supported_services;
-	dbus_uint32_t cell_id, operator_code, country_code;
-	dbus_int32_t net_err;
-
-	reply = dbus_pending_call_steal_reply(call);
-
-	dbus_error_init(&err);
-	if (dbus_set_error_from_message(&err, reply)) {
-		error("Unable to get registration status: %s, %s",
-				err.name, err.message);
-		dbus_error_free(&err);
-		goto done;
-	}
-
-	dbus_error_init(&err);
-	if (!dbus_message_get_args(reply, &err,
-					DBUS_TYPE_BYTE, &status,
-					DBUS_TYPE_UINT16, &lac,
-					DBUS_TYPE_UINT32, &cell_id,
-					DBUS_TYPE_UINT32, &operator_code,
-					DBUS_TYPE_UINT32, &country_code,
-					DBUS_TYPE_BYTE, &network_type,
-					DBUS_TYPE_BYTE, &supported_services,
-					DBUS_TYPE_INT32, &net_err,
-					DBUS_TYPE_INVALID)) {
-		error("Unable to parse registration_status_change reply:"
-					" %s, %s", err.name, err.message);
-		dbus_error_free(&err);
-		goto done;
-	}
-
-	if (net_err != 0) {
-		error("get_registration_status failed with code %d", net_err);
-		goto done;
-	}
-
-	update_registration_status(status, lac, cell_id, operator_code,
-					country_code, network_type,
-					supported_services);
-
-	get_signal_strength();
-
-done:
-	dbus_message_unref(reply);
-}
-
-static int get_registration_status(void)
-{
-	return send_method_call(NETWORK_BUS_NAME, NETWORK_PATH,
-				NETWORK_INTERFACE, "get_registration_status",
-				registration_status_reply, NULL,
-				DBUS_TYPE_INVALID);
-}
-
-static void call_info_reply(DBusPendingCall *call, void *user_data)
-{
-	DBusError err;
-	DBusMessage *reply;
-	DBusMessageIter iter, sub;
-
-	get_calls_active = FALSE;
-
-	reply = dbus_pending_call_steal_reply(call);
-
-	dbus_error_init(&err);
-	if (dbus_set_error_from_message(&err, reply)) {
-		error("csd replied with an error: %s, %s",
-				err.name, err.message);
-		dbus_error_free(&err);
-		goto done;
-	}
-
-	dbus_message_iter_init(reply, &iter);
-
-	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY) {
-		error("Unexpected signature in GetCallInfoAll return");
-		goto done;
-	}
-
-	dbus_message_iter_recurse(&iter, &sub);
-
-	parse_call_list(&sub);
-
-	get_registration_status();
-
-done:
-	dbus_message_unref(reply);
-}
-
-static void hal_find_device_reply(DBusPendingCall *call, void *user_data)
-{
-	DBusError err;
-	DBusMessage *reply;
-	DBusMessageIter iter, sub;
-	const char *path;
-	char match_string[256];
-	int type;
-
-	reply = dbus_pending_call_steal_reply(call);
-
-	dbus_error_init(&err);
-	if (dbus_set_error_from_message(&err, reply)) {
-		error("hald replied with an error: %s, %s",
-				err.name, err.message);
-		dbus_error_free(&err);
-		goto done;
-	}
-
-	dbus_message_iter_init(reply, &iter);
-
-	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY) {
-		error("Unexpected signature in FindDeviceByCapability return");
-		goto done;
-	}
-
-	dbus_message_iter_recurse(&iter, &sub);
-
-	type = dbus_message_iter_get_arg_type(&sub);
-
-	if (type != DBUS_TYPE_OBJECT_PATH && type != DBUS_TYPE_STRING) {
-		error("No hal device with battery capability found");
-		goto done;
-	}
-
-	dbus_message_iter_get_basic(&sub, &path);
-
-	DBG("telephony-maemo: found battery device at %s", path);
-
-	snprintf(match_string, sizeof(match_string),
-			"type='signal',"
-			"path='%s',"
-			"interface='org.freedesktop.Hal.Device',"
-			"member='PropertyModified'", path);
-	dbus_bus_add_match(btd_get_dbus_connection(), match_string, NULL);
-
-	hal_get_integer(path, "battery.charge_level.last_full", &battchg_last);
-	hal_get_integer(path, "battery.charge_level.current", &battchg_cur);
-	hal_get_integer(path, "battery.charge_level.design", &battchg_design);
-
-done:
-	dbus_message_unref(reply);
-}
-
-static void phonebook_read_reply(DBusPendingCall *call, void *user_data)
-{
-	DBusError derr;
-	DBusMessage *reply;
-	const char *name, *number;
-	char **number_type = user_data;
-	dbus_int32_t current_location, err;
-
-	reply = dbus_pending_call_steal_reply(call);
-
-	dbus_error_init(&derr);
-	if (dbus_set_error_from_message(&derr, reply)) {
-		error("SIM.Phonebook replied with an error: %s, %s",
-				derr.name, derr.message);
-		dbus_error_free(&derr);
-		goto done;
-	}
-
-	dbus_error_init(&derr);
-	if (dbus_message_get_args(reply, &derr,
-				DBUS_TYPE_STRING, &name,
-				DBUS_TYPE_STRING, &number,
-				DBUS_TYPE_INT32, &current_location,
-				DBUS_TYPE_INT32, &err,
-				DBUS_TYPE_INVALID) == FALSE) {
-		error("Unable to parse SIM.Phonebook.read arguments: %s, %s",
-				derr.name, derr.message);
-		dbus_error_free(&derr);
-		goto done;
-	}
-
-	if (err != 0) {
-		error("SIM.Phonebook.read failed with error %d", err);
-		if (number_type == &vmbx)
-			vmbx = g_strdup(getenv("VMBX_NUMBER"));
-		goto done;
-	}
-
-	if (number_type == &msisdn) {
-		g_free(msisdn);
-		msisdn = g_strdup(number);
-		DBG("Got MSISDN %s (%s)", number, name);
-	} else {
-		g_free(vmbx);
-		vmbx = g_strdup(number);
-		DBG("Got voice mailbox number %s (%s)", number, name);
-	}
-
-done:
-	dbus_message_unref(reply);
-}
-
-static void csd_init(void)
-{
-	dbus_uint32_t location;
-	uint8_t pb_type, location_type;
-	int ret;
-
-	ret = send_method_call(CSD_CALL_BUS_NAME, CSD_CALL_PATH,
-				CSD_CALL_INTERFACE, "GetCallInfoAll",
-				call_info_reply, NULL, DBUS_TYPE_INVALID);
-	if (ret < 0) {
-		error("Unable to sent GetCallInfoAll method call");
-		return;
-	}
-
-	get_calls_active = TRUE;
-
-	pb_type = SIM_PHONEBOOK_TYPE_MSISDN;
-	location = PHONEBOOK_INDEX_FIRST_ENTRY;
-	location_type = SIM_PHONEBOOK_LOCATION_NEXT;
-
-	ret = send_method_call(SIM_PHONEBOOK_BUS_NAME, SIM_PHONEBOOK_PATH,
-				SIM_PHONEBOOK_INTERFACE, "read",
-				phonebook_read_reply, &msisdn,
-				DBUS_TYPE_BYTE, &pb_type,
-				DBUS_TYPE_INT32, &location,
-				DBUS_TYPE_BYTE, &location_type,
-				DBUS_TYPE_INVALID);
-	if (ret < 0) {
-		error("Unable to send " SIM_PHONEBOOK_INTERFACE ".read()");
-		return;
-	}
-
-	pb_type = SIM_PHONEBOOK_TYPE_MBDN;
-	location = PHONEBOOK_INDEX_FIRST_ENTRY;
-	location_type = SIM_PHONEBOOK_LOCATION_NEXT;
-
-	ret = send_method_call(SIM_PHONEBOOK_BUS_NAME, SIM_PHONEBOOK_PATH,
-				SIM_PHONEBOOK_INTERFACE, "read",
-				phonebook_read_reply, &vmbx,
-				DBUS_TYPE_BYTE, &pb_type,
-				DBUS_TYPE_INT32, &location,
-				DBUS_TYPE_BYTE, &location_type,
-				DBUS_TYPE_INVALID);
-	if (ret < 0) {
-		error("Unable to send " SIM_PHONEBOOK_INTERFACE ".read()");
-		return;
-	}
-}
-
-static uint32_t get_callflag(const char *callerid_setting)
-{
-	if (callerid_setting != NULL) {
-		if (g_str_equal(callerid_setting, "allowed"))
-			return CALL_FLAG_PRESENTATION_ALLOWED;
-		else if (g_str_equal(callerid_setting, "restricted"))
-			return CALL_FLAG_PRESENTATION_RESTRICTED;
-		else
-			return CALL_FLAG_NONE;
-	} else
-		return CALL_FLAG_NONE;
-}
-
-static void generate_flag_file(const char *filename)
-{
-	int fd;
-
-	if (g_file_test(ALLOWED_FLAG_FILE, G_FILE_TEST_EXISTS) ||
-			g_file_test(RESTRICTED_FLAG_FILE, G_FILE_TEST_EXISTS) ||
-			g_file_test(NONE_FLAG_FILE, G_FILE_TEST_EXISTS))
-		return;
-
-	fd = open(filename, O_WRONLY | O_CREAT, 0);
-	if (fd >= 0)
-		close(fd);
-}
-
-static void save_callerid_to_file(const char *callerid_setting)
-{
-	char callerid_file[FILENAME_MAX];
-
-	snprintf(callerid_file, sizeof(callerid_file), "%s%s",
-					CALLERID_BASE, callerid_setting);
-
-	if (g_file_test(ALLOWED_FLAG_FILE, G_FILE_TEST_EXISTS))
-		rename(ALLOWED_FLAG_FILE, callerid_file);
-	else if (g_file_test(RESTRICTED_FLAG_FILE, G_FILE_TEST_EXISTS))
-		rename(RESTRICTED_FLAG_FILE, callerid_file);
-	else if (g_file_test(NONE_FLAG_FILE, G_FILE_TEST_EXISTS))
-		rename(NONE_FLAG_FILE, callerid_file);
-	else
-		generate_flag_file(callerid_file);
-}
-
-static uint32_t callerid_from_file(void)
-{
-	if (g_file_test(ALLOWED_FLAG_FILE, G_FILE_TEST_EXISTS))
-		return CALL_FLAG_PRESENTATION_ALLOWED;
-	else if (g_file_test(RESTRICTED_FLAG_FILE, G_FILE_TEST_EXISTS))
-		return CALL_FLAG_PRESENTATION_RESTRICTED;
-	else if (g_file_test(NONE_FLAG_FILE, G_FILE_TEST_EXISTS))
-		return CALL_FLAG_NONE;
-	else
-		return CALL_FLAG_NONE;
-}
-
-static DBusMessage *set_callerid(DBusConnection *conn, DBusMessage *msg,
-					void *data)
-{
-	const char *callerid_setting;
-
-	if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING,
-						&callerid_setting,
-						DBUS_TYPE_INVALID) == FALSE)
-		return btd_error_invalid_args(msg);
-
-	if (g_str_equal(callerid_setting, "allowed") ||
-			g_str_equal(callerid_setting, "restricted") ||
-			g_str_equal(callerid_setting, "none")) {
-		save_callerid_to_file(callerid_setting);
-		callerid = get_callflag(callerid_setting);
-		DBG("telephony-maemo setting callerid flag: %s",
-							callerid_setting);
-		return dbus_message_new_method_return(msg);
-	}
-
-	error("telephony-maemo: invalid argument %s for method call"
-					" SetCallerId", callerid_setting);
-		return btd_error_invalid_args(msg);
-}
-
-static const GDBusMethodTable telephony_maemo_methods[] = {
-	{ GDBUS_ASYNC_METHOD("SetCallerId",
-				GDBUS_ARGS({ "id", "s" }), NULL,
-				set_callerid) },
-	{ }
-};
-
-static void handle_modem_state(DBusMessage *msg)
-{
-	const char *state;
-
-	if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &state,
-							DBUS_TYPE_INVALID)) {
-		error("Unexpected modem state parameters");
-		return;
-	}
-
-	DBG("SSC modem state: %s", state);
-
-	if (calls != NULL || get_calls_active)
-		return;
-
-	if (g_str_equal(state, "cmt_ready") || g_str_equal(state, "online"))
-		csd_init();
-}
-
-static void modem_state_reply(DBusPendingCall *call, void *user_data)
-{
-	DBusMessage *reply = dbus_pending_call_steal_reply(call);
-	DBusError err;
-
-	dbus_error_init(&err);
-	if (dbus_set_error_from_message(&err, reply)) {
-		error("get_modem_status: %s, %s", err.name, err.message);
-		dbus_error_free(&err);
-	} else
-		handle_modem_state(reply);
-
-	dbus_message_unref(reply);
-}
-
-static DBusHandlerResult signal_filter(DBusConnection *conn,
-						DBusMessage *msg, void *data)
-{
-	const char *path = dbus_message_get_path(msg);
-
-	if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
-		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
-	if (dbus_message_is_signal(msg, CSD_CALL_INTERFACE, "Coming"))
-		handle_incoming_call(msg);
-	else if (dbus_message_is_signal(msg, CSD_CALL_INTERFACE, "Created"))
-		handle_outgoing_call(msg);
-	else if (dbus_message_is_signal(msg, CSD_CALL_INTERFACE,
-							"CreateRequested"))
-		handle_create_requested(msg);
-	else if (dbus_message_is_signal(msg, CSD_CALL_INSTANCE, "CallStatus"))
-		handle_call_status(msg, path);
-	else if (dbus_message_is_signal(msg, CSD_CALL_CONFERENCE, "Joined"))
-		handle_conference(msg, TRUE);
-	else if (dbus_message_is_signal(msg, CSD_CALL_CONFERENCE, "Left"))
-		handle_conference(msg, FALSE);
-	else if (dbus_message_is_signal(msg, NETWORK_INTERFACE,
-					"registration_status_change"))
-		handle_registration_status_change(msg);
-	else if (dbus_message_is_signal(msg, NETWORK_INTERFACE,
-					"signal_strength_change"))
-		handle_signal_strength_change(msg);
-	else if (dbus_message_is_signal(msg, "org.freedesktop.Hal.Device",
-					"PropertyModified"))
-		handle_hal_property_modified(msg);
-	else if (dbus_message_is_signal(msg, SSC_DBUS_IFACE,
-						"modem_state_changed_ind"))
-		handle_modem_state(msg);
-
-	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-}
-
-int telephony_init(void)
-{
-	DBusConnection *conn = btd_get_dbus_connection();
-	const char *battery_cap = "battery";
-	uint32_t features = AG_FEATURE_EC_ANDOR_NR |
-				AG_FEATURE_INBAND_RINGTONE |
-				AG_FEATURE_REJECT_A_CALL |
-				AG_FEATURE_ENHANCED_CALL_STATUS |
-				AG_FEATURE_ENHANCED_CALL_CONTROL |
-				AG_FEATURE_EXTENDED_ERROR_RESULT_CODES |
-				AG_FEATURE_THREE_WAY_CALLING;
-
-	if (!dbus_connection_add_filter(conn, signal_filter,
-						NULL, NULL))
-		error("Can't add signal filter");
-
-	dbus_bus_add_match(conn,
-			"type=signal,interface=" CSD_CALL_INTERFACE, NULL);
-	dbus_bus_add_match(conn,
-			"type=signal,interface=" CSD_CALL_INSTANCE, NULL);
-	dbus_bus_add_match(conn,
-			"type=signal,interface=" CSD_CALL_CONFERENCE, NULL);
-	dbus_bus_add_match(conn,
-			"type=signal,interface=" NETWORK_INTERFACE, NULL);
-	dbus_bus_add_match(conn,
-				"type=signal,interface=" SSC_DBUS_IFACE
-				",member=modem_state_changed_ind", NULL);
-
-	if (send_method_call(SSC_DBUS_NAME, SSC_DBUS_PATH, SSC_DBUS_IFACE,
-					"get_modem_state", modem_state_reply,
-					NULL, DBUS_TYPE_INVALID) < 0)
-		error("Unable to send " SSC_DBUS_IFACE ".get_modem_state()");
-
-	generate_flag_file(NONE_FLAG_FILE);
-	callerid = callerid_from_file();
-
-	if (!g_dbus_register_interface(conn, TELEPHONY_MAEMO_PATH,
-			TELEPHONY_MAEMO_INTERFACE, telephony_maemo_methods,
-			NULL, NULL, NULL, NULL)) {
-		error("telephony-maemo interface %s init failed on path %s",
-			TELEPHONY_MAEMO_INTERFACE, TELEPHONY_MAEMO_PATH);
-	}
-
-	DBG("telephony-maemo registering %s interface on path %s",
-			TELEPHONY_MAEMO_INTERFACE, TELEPHONY_MAEMO_PATH);
-
-	telephony_ready_ind(features, maemo_indicators, BTRH_NOT_SUPPORTED,
-								chld_str);
-	if (send_method_call("org.freedesktop.Hal",
-				"/org/freedesktop/Hal/Manager",
-				"org.freedesktop.Hal.Manager",
-				"FindDeviceByCapability",
-				hal_find_device_reply, NULL,
-				DBUS_TYPE_STRING, &battery_cap,
-				DBUS_TYPE_INVALID) < 0)
-		error("Unable to send HAL method call");
-
-	return 0;
-}
-
-void telephony_exit(void)
-{
-	g_slist_foreach(calls, (GFunc) csd_call_free, NULL);
-	g_slist_free(calls);
-	calls = NULL;
-
-	dbus_connection_remove_filter(btd_get_dbus_connection(),
-							signal_filter, NULL);
-
-	telephony_deinit();
-}
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH BlueZ 05/13] build: Remove telephony-maemo6.c
  2012-11-13 13:21 [PATCH BlueZ 00/13] Remove HFP implementation Luiz Augusto von Dentz
                   ` (6 preceding siblings ...)
  2012-11-13 13:21 ` [PATCH BlueZ 04/13] build: Remove telephony-maemo5.c Luiz Augusto von Dentz
@ 2012-11-13 13:21 ` Luiz Augusto von Dentz
  2012-11-13 13:21 ` [PATCH BlueZ 06/13] build: Remove telephony-ofono.c Luiz Augusto von Dentz
                   ` (8 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Luiz Augusto von Dentz @ 2012-11-13 13:21 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

---
 Makefile.am              |    6 +-
 audio/telephony-maemo6.c | 2196 ----------------------------------------------
 2 files changed, 2 insertions(+), 2200 deletions(-)
 delete mode 100644 audio/telephony-maemo6.c

diff --git a/Makefile.am b/Makefile.am
index 9b24589..b7e861b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -126,8 +126,7 @@ builtin_nodist += audio/telephony.c
 noinst_LIBRARIES += audio/libtelephony.a
 
 audio_libtelephony_a_SOURCES = audio/telephony.h audio/telephony-dummy.c \
-				audio/telephony-ofono.c \
-				audio/telephony-maemo6.c
+				audio/telephony-ofono.c
 endif
 
 if SAPPLUGIN
@@ -316,8 +315,7 @@ EXTRA_DIST += src/genbuiltin src/bluetooth.conf src/org.bluez.service \
 			profiles/input/input.conf profiles/proximity/proximity.conf \
 			audio/audio.conf audio/telephony-dummy.c \
 			audio/telephony-ofono.c \
-			audio/telephony-maemo6.c profiles/sap/sap-dummy.c \
-			profiles/sap/sap-u8500.c
+			profiles/sap/sap-dummy.c profiles/sap/sap-u8500.c
 
 include Makefile.tools
 
diff --git a/audio/telephony-maemo6.c b/audio/telephony-maemo6.c
deleted file mode 100644
index ef997ca..0000000
--- a/audio/telephony-maemo6.c
+++ /dev/null
@@ -1,2196 +0,0 @@
-/*
- *
- *  BlueZ - Bluetooth protocol stack for Linux
- *
- *  Copyright (C) 2008-2010  Nokia Corporation
- *  Copyright (C) 2004-2010  Marcel Holtmann <marcel@holtmann.org>
- *
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdint.h>
-#include <string.h>
-#include <glib.h>
-#include <dbus/dbus.h>
-#include <gdbus.h>
-
-#include <bluetooth/sdp.h>
-
-#include "dbus-common.h"
-#include "log.h"
-#include "telephony.h"
-#include "error.h"
-
-/* SSC D-Bus definitions */
-#define SSC_DBUS_NAME  "com.nokia.phone.SSC"
-#define SSC_DBUS_IFACE "com.nokia.phone.SSC"
-#define SSC_DBUS_PATH  "/com/nokia/phone/SSC"
-
-/* libcsnet D-Bus definitions */
-#define CSD_CSNET_BUS_NAME	"com.nokia.csd.CSNet"
-#define CSD_CSNET_PATH		"/com/nokia/csd/csnet"
-#define CSD_CSNET_IFACE		"com.nokia.csd.CSNet"
-#define CSD_CSNET_REGISTRATION	"com.nokia.csd.CSNet.NetworkRegistration"
-#define CSD_CSNET_OPERATOR	"com.nokia.csd.CSNet.NetworkOperator"
-#define CSD_CSNET_SIGNAL	"com.nokia.csd.CSNet.SignalStrength"
-
-enum net_registration_status {
-	NETWORK_REG_STATUS_HOME,
-	NETWORK_REG_STATUS_ROAMING,
-	NETWORK_REG_STATUS_OFFLINE,
-	NETWORK_REG_STATUS_SEARCHING,
-	NETWORK_REG_STATUS_NO_SIM,
-	NETWORK_REG_STATUS_POWEROFF,
-	NETWORK_REG_STATUS_POWERSAFE,
-	NETWORK_REG_STATUS_NO_COVERAGE,
-	NETWORK_REG_STATUS_REJECTED,
-	NETWORK_REG_STATUS_UNKOWN
-};
-
-/* CSD CALL plugin D-Bus definitions */
-#define CSD_CALL_BUS_NAME	"com.nokia.csd.Call"
-#define CSD_CALL_INTERFACE	"com.nokia.csd.Call"
-#define CSD_CALL_INSTANCE	"com.nokia.csd.Call.Instance"
-#define CSD_CALL_CONFERENCE	"com.nokia.csd.Call.Conference"
-#define CSD_CALL_PATH		"/com/nokia/csd/call"
-#define CSD_CALL_CONFERENCE_PATH "/com/nokia/csd/call/conference"
-
-/* Call status values as exported by the CSD CALL plugin */
-#define CSD_CALL_STATUS_IDLE			0
-#define CSD_CALL_STATUS_CREATE			1
-#define CSD_CALL_STATUS_COMING			2
-#define CSD_CALL_STATUS_PROCEEDING		3
-#define CSD_CALL_STATUS_MO_ALERTING		4
-#define CSD_CALL_STATUS_MT_ALERTING		5
-#define CSD_CALL_STATUS_WAITING			6
-#define CSD_CALL_STATUS_ANSWERED		7
-#define CSD_CALL_STATUS_ACTIVE			8
-#define CSD_CALL_STATUS_MO_RELEASE		9
-#define CSD_CALL_STATUS_MT_RELEASE		10
-#define CSD_CALL_STATUS_HOLD_INITIATED		11
-#define CSD_CALL_STATUS_HOLD			12
-#define CSD_CALL_STATUS_RETRIEVE_INITIATED	13
-#define CSD_CALL_STATUS_RECONNECT_PENDING	14
-#define CSD_CALL_STATUS_TERMINATED		15
-#define CSD_CALL_STATUS_SWAP_INITIATED		16
-
-#define CALL_FLAG_NONE				0
-#define CALL_FLAG_PRESENTATION_ALLOWED		0x01
-#define CALL_FLAG_PRESENTATION_RESTRICTED	0x02
-
-/* SIM Phonebook D-Bus definitions */
-#define CSD_SIMPB_BUS_NAME			"com.nokia.csd.SIM"
-#define CSD_SIMPB_INTERFACE			"com.nokia.csd.SIM.Phonebook"
-#define CSD_SIMPB_PATH				"/com/nokia/csd/sim/phonebook"
-
-#define CSD_SIMPB_TYPE_ADN			"ADN"
-#define CSD_SIMPB_TYPE_FDN			"FDN"
-#define CSD_SIMPB_TYPE_SDN			"SDN"
-#define CSD_SIMPB_TYPE_VMBX			"VMBX"
-#define CSD_SIMPB_TYPE_MBDN			"MBDN"
-#define CSD_SIMPB_TYPE_EN			"EN"
-#define CSD_SIMPB_TYPE_MSISDN			"MSISDN"
-
-/* OHM plugin D-Bus definitions */
-#define OHM_BUS_NAME		"com.nokia.NonGraphicFeedback1"
-#define OHM_INTERFACE		"com.nokia.NonGraphicFeedback1"
-#define OHM_PATH		"/com/nokia/NonGraphicFeedback1"
-
-/* tone-genenerator D-Bus definitions */
-#define TONEGEN_BUS_NAME	"com.Nokia.Telephony.Tones"
-#define TONEGEN_INTERFACE	"com.Nokia.Telephony.Tones"
-#define TONEGEN_PATH		"/com/Nokia/Telephony/Tones"
-
-/* tone-generator DTMF definitions */
-#define DTMF_ASTERISK   10
-#define DTMF_HASHMARK   11
-#define DTMF_A          12
-#define DTMF_B          13
-#define DTMF_C          14
-#define DTMF_D          15
-
-#define FEEDBACK_TONE_DURATION			200
-
-struct csd_call {
-	char *object_path;
-	int status;
-	gboolean originating;
-	gboolean emergency;
-	gboolean on_hold;
-	gboolean conference;
-	char *number;
-	gboolean setup;
-};
-
-static struct {
-	char *operator_name;
-	uint8_t status;
-	int32_t signal_bars;
-} net = {
-	.operator_name = NULL,
-	.status = NETWORK_REG_STATUS_UNKOWN,
-	/* Init as 0 meaning inactive mode. In modem power off state
-	 * can be be -1, but we treat all values as 0s regardless
-	 * inactive or power off. */
-	.signal_bars = 0,
-};
-
-struct pending_req {
-	DBusPendingCall *call;
-	void *user_data;
-};
-
-static int get_property(const char *iface, const char *prop);
-
-static GSList *calls = NULL;
-static GSList *watches = NULL;
-static GSList *pending = NULL;
-
-/* Reference count for determining the call indicator status */
-static GSList *active_calls = NULL;
-
-/* Queue of DTMF tones to play */
-static GSList *tones = NULL;
-static guint create_tones_timer = 0;
-
-static char *msisdn = NULL;	/* Subscriber number */
-static char *vmbx = NULL;	/* Voice mailbox number */
-
-/* HAL battery namespace key values */
-static int battchg_cur = -1;	/* "battery.charge_level.current" */
-static int battchg_last = -1;	/* "battery.charge_level.last_full" */
-static int battchg_design = -1;	/* "battery.charge_level.design" */
-
-static gboolean get_calls_active = FALSE;
-
-static gboolean events_enabled = FALSE;
-
-/* Supported set of call hold operations */
-static const char *chld_str = "0,1,1x,2,2x,3,4";
-
-/* Timer for tracking call creation requests */
-static guint create_request_timer = 0;
-
-static struct indicator maemo_indicators[] =
-{
-	{ "battchg",	"0-5",	5,	TRUE },
-	/* signal strength in terms of bars */
-	{ "signal",	"0-5",	0,	TRUE },
-	{ "service",	"0,1",	0,	TRUE },
-	{ "call",	"0,1",	0,	TRUE },
-	{ "callsetup",	"0-3",	0,	TRUE },
-	{ "callheld",	"0-2",	0,	FALSE },
-	{ "roam",	"0,1",	0,	TRUE },
-	{ NULL }
-};
-
-static char *call_status_str[] = {
-	"IDLE",
-	"CREATE",
-	"COMING",
-	"PROCEEDING",
-	"MO_ALERTING",
-	"MT_ALERTING",
-	"WAITING",
-	"ANSWERED",
-	"ACTIVE",
-	"MO_RELEASE",
-	"MT_RELEASE",
-	"HOLD_INITIATED",
-	"HOLD",
-	"RETRIEVE_INITIATED",
-	"RECONNECT_PENDING",
-	"TERMINATED",
-	"SWAP_INITIATED",
-	"???"
-};
-
-static int send_method_call(const char *dest, const char *path,
-				const char *interface, const char *method,
-				DBusPendingCallNotifyFunction cb,
-				void *user_data, int type, ...)
-{
-	DBusConnection *conn = btd_get_dbus_connection();
-	DBusMessage *msg;
-	DBusPendingCall *call;
-	va_list args;
-	struct pending_req *req;
-
-	msg = dbus_message_new_method_call(dest, path, interface, method);
-	if (!msg) {
-		error("Unable to allocate new D-Bus %s message", method);
-		return -ENOMEM;
-	}
-
-	va_start(args, type);
-
-	if (!dbus_message_append_args_valist(msg, type, args)) {
-		dbus_message_unref(msg);
-		va_end(args);
-		return -EIO;
-	}
-
-	va_end(args);
-
-	if (!cb) {
-		g_dbus_send_message(conn, msg);
-		return 0;
-	}
-
-	if (!dbus_connection_send_with_reply(conn, msg, &call, -1)) {
-		error("Sending %s failed", method);
-		dbus_message_unref(msg);
-		return -EIO;
-	}
-
-	dbus_pending_call_set_notify(call, cb, user_data, NULL);
-
-	req = g_new0(struct pending_req, 1);
-	req->call = call;
-	req->user_data = user_data;
-
-	pending = g_slist_prepend(pending, req);
-	dbus_message_unref(msg);
-
-	return 0;
-}
-
-static struct csd_call *find_call(const char *path)
-{
-	GSList *l;
-
-	for (l = calls; l != NULL; l = l->next) {
-		struct csd_call *call = l->data;
-
-		if (g_str_equal(call->object_path, path))
-			return call;
-	}
-
-	return NULL;
-}
-
-static struct csd_call *find_non_held_call(void)
-{
-	GSList *l;
-
-	for (l = calls; l != NULL; l = l->next) {
-		struct csd_call *call = l->data;
-
-		if (call->status == CSD_CALL_STATUS_IDLE)
-			continue;
-
-		if (call->status != CSD_CALL_STATUS_HOLD)
-			return call;
-	}
-
-	return NULL;
-}
-
-static struct csd_call *find_non_idle_call(void)
-{
-	GSList *l;
-
-	for (l = calls; l != NULL; l = l->next) {
-		struct csd_call *call = l->data;
-
-		if (call->status != CSD_CALL_STATUS_IDLE)
-			return call;
-	}
-
-	return NULL;
-}
-
-static struct csd_call *find_call_with_status(int status)
-{
-	GSList *l;
-
-	for (l = calls; l != NULL; l = l->next) {
-		struct csd_call *call = l->data;
-
-		if (call->status == status)
-			return call;
-	}
-
-	return NULL;
-}
-
-static int release_conference(void)
-{
-	DBusMessage *msg;
-
-	DBG("telephony-maemo6: releasing conference call");
-
-	msg = dbus_message_new_method_call(CSD_CALL_BUS_NAME,
-						CSD_CALL_CONFERENCE_PATH,
-						CSD_CALL_INSTANCE,
-						"Release");
-	if (!msg) {
-		error("Unable to allocate new D-Bus message");
-		return -ENOMEM;
-	}
-
-	g_dbus_send_message(btd_get_dbus_connection(), msg);
-
-	return 0;
-}
-
-static int release_call(struct csd_call *call)
-{
-	DBusMessage *msg;
-
-	msg = dbus_message_new_method_call(CSD_CALL_BUS_NAME,
-						call->object_path,
-						CSD_CALL_INSTANCE,
-						"Release");
-	if (!msg) {
-		error("Unable to allocate new D-Bus message");
-		return -ENOMEM;
-	}
-
-	g_dbus_send_message(btd_get_dbus_connection(), msg);
-
-	return 0;
-}
-
-static int answer_call(struct csd_call *call)
-{
-	DBusMessage *msg;
-
-	msg = dbus_message_new_method_call(CSD_CALL_BUS_NAME,
-						call->object_path,
-						CSD_CALL_INSTANCE,
-						"Answer");
-	if (!msg) {
-		error("Unable to allocate new D-Bus message");
-		return -ENOMEM;
-	}
-
-	g_dbus_send_message(btd_get_dbus_connection(), msg);
-
-	return 0;
-}
-
-static struct pending_req *find_request(const DBusPendingCall *call)
-{
-	GSList *l;
-
-	for (l = pending; l; l = l->next) {
-		struct pending_req *req = l->data;
-
-		if (req->call == call)
-			return req;
-	}
-
-	return NULL;
-}
-
-static void pending_req_finalize(void *data)
-{
-	struct pending_req *req = data;
-
-	if (!dbus_pending_call_get_completed(req->call))
-		dbus_pending_call_cancel(req->call);
-
-	dbus_pending_call_unref(req->call);
-	g_free(req);
-}
-
-static void remove_pending(DBusPendingCall *call)
-{
-	struct pending_req *req = find_request(call);
-
-	pending = g_slist_remove(pending, req);
-	pending_req_finalize(req);
-}
-
-static void stop_ringtone_reply(DBusPendingCall *call, void *user_data)
-{
-	struct csd_call *coming = user_data;
-
-	remove_pending(call);
-	answer_call(coming);
-}
-
-static int stop_ringtone_and_answer(struct csd_call *call)
-{
-	int ret;
-
-	ret = send_method_call(OHM_BUS_NAME, OHM_PATH,
-				OHM_INTERFACE, "StopRingtone",
-				stop_ringtone_reply, call,
-				DBUS_TYPE_INVALID);
-	if (ret < 0)
-		return answer_call(call);
-
-	return 0;
-}
-
-static int split_call(struct csd_call *call)
-{
-	DBusMessage *msg;
-
-	msg = dbus_message_new_method_call(CSD_CALL_BUS_NAME,
-						call->object_path,
-						CSD_CALL_INSTANCE,
-						"Split");
-	if (!msg) {
-		error("Unable to allocate new D-Bus message");
-		return -ENOMEM;
-	}
-
-	g_dbus_send_message(btd_get_dbus_connection(), msg);
-
-	return 0;
-}
-
-static int unhold_call(struct csd_call *call)
-{
-	DBusMessage *msg;
-
-	msg = dbus_message_new_method_call(CSD_CALL_BUS_NAME, CSD_CALL_PATH,
-						CSD_CALL_INTERFACE,
-						"Unhold");
-	if (!msg) {
-		error("Unable to allocate new D-Bus message");
-		return -ENOMEM;
-	}
-
-	g_dbus_send_message(btd_get_dbus_connection(), msg);
-
-	return 0;
-}
-
-static int hold_call(struct csd_call *call)
-{
-	DBusMessage *msg;
-
-	msg = dbus_message_new_method_call(CSD_CALL_BUS_NAME, CSD_CALL_PATH,
-						CSD_CALL_INTERFACE,
-						"Hold");
-	if (!msg) {
-		error("Unable to allocate new D-Bus message");
-		return -ENOMEM;
-	}
-
-	g_dbus_send_message(btd_get_dbus_connection(), msg);
-
-	return 0;
-}
-
-static int swap_calls(void)
-{
-	DBusMessage *msg;
-
-	msg = dbus_message_new_method_call(CSD_CALL_BUS_NAME, CSD_CALL_PATH,
-						CSD_CALL_INTERFACE,
-						"Swap");
-	if (!msg) {
-		error("Unable to allocate new D-Bus message");
-		return -ENOMEM;
-	}
-
-	g_dbus_send_message(btd_get_dbus_connection(), msg);
-
-	return 0;
-}
-
-static int create_conference(void)
-{
-	DBusMessage *msg;
-
-	msg = dbus_message_new_method_call(CSD_CALL_BUS_NAME, CSD_CALL_PATH,
-						CSD_CALL_INTERFACE,
-						"Conference");
-	if (!msg) {
-		error("Unable to allocate new D-Bus message");
-		return -ENOMEM;
-	}
-
-	g_dbus_send_message(btd_get_dbus_connection(), msg);
-
-	return 0;
-}
-
-static int call_transfer(void)
-{
-	DBusMessage *msg;
-
-	msg = dbus_message_new_method_call(CSD_CALL_BUS_NAME, CSD_CALL_PATH,
-						CSD_CALL_INTERFACE,
-						"Transfer");
-	if (!msg) {
-		error("Unable to allocate new D-Bus message");
-		return -ENOMEM;
-	}
-
-	g_dbus_send_message(btd_get_dbus_connection(), msg);
-
-	return 0;
-}
-
-static int number_type(const char *number)
-{
-	if (number == NULL)
-		return NUMBER_TYPE_TELEPHONY;
-
-	if (number[0] == '+' || strncmp(number, "00", 2) == 0)
-		return NUMBER_TYPE_INTERNATIONAL;
-
-	return NUMBER_TYPE_TELEPHONY;
-}
-
-void telephony_device_connected(void *telephony_device)
-{
-	struct csd_call *coming;
-
-	DBG("telephony-maemo6: device %p connected", telephony_device);
-
-	coming = find_call_with_status(CSD_CALL_STATUS_MT_ALERTING);
-	if (coming) {
-		if (find_call_with_status(CSD_CALL_STATUS_ACTIVE))
-			telephony_call_waiting_ind(coming->number,
-						number_type(coming->number));
-		else
-			telephony_incoming_call_ind(coming->number,
-						number_type(coming->number));
-	}
-}
-
-static void remove_pending_by_data(gpointer data, gpointer user_data)
-{
-	struct pending_req *req = data;
-
-	if (req->user_data == user_data) {
-		pending = g_slist_remove(pending, req);
-		pending_req_finalize(req);
-	}
-}
-
-void telephony_device_disconnected(void *telephony_device)
-{
-	DBG("telephony-maemo6: device %p disconnected", telephony_device);
-	events_enabled = FALSE;
-
-	g_slist_foreach(pending, remove_pending_by_data, telephony_device);
-}
-
-void telephony_event_reporting_req(void *telephony_device, int ind)
-{
-	events_enabled = ind == 1 ? TRUE : FALSE;
-
-	telephony_event_reporting_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_response_and_hold_req(void *telephony_device, int rh)
-{
-	telephony_response_and_hold_rsp(telephony_device,
-						CME_ERROR_NOT_SUPPORTED);
-}
-
-void telephony_terminate_call_req(void *telephony_device)
-{
-	struct csd_call *call;
-	struct csd_call *alerting;
-	int err;
-
-	call = find_call_with_status(CSD_CALL_STATUS_ACTIVE);
-	if (!call)
-		call = find_non_idle_call();
-
-	if (!call) {
-		error("No active call");
-		telephony_terminate_call_rsp(telephony_device,
-						CME_ERROR_NOT_ALLOWED);
-		return;
-	}
-
-	alerting = find_call_with_status(CSD_CALL_STATUS_MO_ALERTING);
-	if (call->on_hold && alerting)
-		err = release_call(alerting);
-	else if (call->conference)
-		err = release_conference();
-	else
-		err = release_call(call);
-
-	if (err < 0)
-		telephony_terminate_call_rsp(telephony_device,
-						CME_ERROR_AG_FAILURE);
-	else
-		telephony_terminate_call_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_answer_call_req(void *telephony_device)
-{
-	struct csd_call *call;
-
-	call = find_call_with_status(CSD_CALL_STATUS_COMING);
-	if (!call)
-		call = find_call_with_status(CSD_CALL_STATUS_MT_ALERTING);
-
-	if (!call)
-		call = find_call_with_status(CSD_CALL_STATUS_PROCEEDING);
-
-	if (!call)
-		call = find_call_with_status(CSD_CALL_STATUS_WAITING);
-
-	if (!call) {
-		telephony_answer_call_rsp(telephony_device,
-						CME_ERROR_NOT_ALLOWED);
-		return;
-	}
-
-	if (stop_ringtone_and_answer(call) < 0)
-		telephony_answer_call_rsp(telephony_device,
-						CME_ERROR_AG_FAILURE);
-	else
-		telephony_answer_call_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-static void create_call_reply(DBusPendingCall *call, void *user_data)
-{
-	DBusError err;
-	DBusMessage *reply;
-	void *telephony_device = user_data;
-
-	reply = dbus_pending_call_steal_reply(call);
-
-	dbus_error_init(&err);
-	if (dbus_set_error_from_message(&err, reply)) {
-		error("csd replied with an error: %s, %s",
-				err.name, err.message);
-		if (g_strcmp0(err.name,
-				"com.nokia.csd.Call.Error.CSInactive") == 0)
-			telephony_dial_number_rsp(telephony_device,
-						CME_ERROR_NO_NETWORK_SERVICE);
-		else
-			telephony_dial_number_rsp(telephony_device,
-							CME_ERROR_AG_FAILURE);
-		dbus_error_free(&err);
-	} else
-		telephony_dial_number_rsp(telephony_device, CME_ERROR_NONE);
-
-	dbus_message_unref(reply);
-	remove_pending(call);
-}
-
-void telephony_last_dialed_number_req(void *telephony_device)
-{
-	int ret;
-
-	DBG("telephony-maemo6: last dialed number request");
-
-	ret = send_method_call(CSD_CALL_BUS_NAME, CSD_CALL_PATH,
-				CSD_CALL_INTERFACE, "CreateFromLast",
-				create_call_reply, telephony_device,
-				DBUS_TYPE_INVALID);
-	if (ret < 0)
-		telephony_dial_number_rsp(telephony_device,
-						CME_ERROR_AG_FAILURE);
-}
-
-static const char *memory_dial_lookup(int location)
-{
-	if (location == 1)
-		return vmbx;
-	else
-		return NULL;
-}
-
-void telephony_dial_number_req(void *telephony_device, const char *number)
-{
-	int ret;
-
-	DBG("telephony-maemo6: dial request to %s", number);
-
-	if (strncmp(number, "*31#", 4) == 0)
-		number += 4;
-	else if (strncmp(number, "#31#", 4) == 0)
-		number += 4;
-	else if (number[0] == '>') {
-		const char *location = &number[1];
-
-		number = memory_dial_lookup(strtol(&number[1], NULL, 0));
-		if (!number) {
-			error("No number at memory location %s", location);
-			telephony_dial_number_rsp(telephony_device,
-						CME_ERROR_INVALID_INDEX);
-			return;
-		}
-	}
-
-	ret = send_method_call(CSD_CALL_BUS_NAME, CSD_CALL_PATH,
-				CSD_CALL_INTERFACE, "Create",
-				create_call_reply, telephony_device,
-				DBUS_TYPE_STRING, &number,
-				DBUS_TYPE_INVALID);
-	if (ret < 0)
-		telephony_dial_number_rsp(telephony_device,
-						CME_ERROR_AG_FAILURE);
-}
-
-static void start_dtmf_reply(DBusPendingCall *call, void *user_data)
-{
-	DBusError err;
-	DBusMessage *reply;
-
-	reply = dbus_pending_call_steal_reply(call);
-
-	dbus_error_init(&err);
-	if (dbus_set_error_from_message(&err, reply)) {
-		error("csd replied with an error: %s, %s",
-				err.name, err.message);
-
-		dbus_error_free(&err);
-	} else
-		send_method_call(CSD_CALL_BUS_NAME, CSD_CALL_PATH,
-				CSD_CALL_INTERFACE, "StopDTMF",
-				NULL, NULL,
-				DBUS_TYPE_INVALID);
-
-	dbus_message_unref(reply);
-	remove_pending(call);
-}
-
-static void start_dtmf(void *telephony_device, char tone)
-{
-	int ret;
-
-	/*
-	 * Stop tone immediately, modem will place it in queue and play
-	 * required time.
-	 */
-	ret = send_method_call(CSD_CALL_BUS_NAME, CSD_CALL_PATH,
-				CSD_CALL_INTERFACE, "StartDTMF",
-				start_dtmf_reply, NULL,
-				DBUS_TYPE_BYTE, &tone,
-				DBUS_TYPE_INVALID);
-	if (ret < 0) {
-		telephony_transmit_dtmf_rsp(telephony_device,
-						CME_ERROR_AG_FAILURE);
-		return;
-	}
-
-	telephony_transmit_dtmf_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-static int tonegen_startevent(char tone)
-{
-	int ret;
-	dbus_uint32_t event_tone;
-	dbus_int32_t dbm0 = -15;
-	dbus_uint32_t duration = 150;
-
-	switch (tone) {
-	case '*':
-		event_tone = DTMF_ASTERISK;
-		break;
-	case '#':
-		event_tone = DTMF_HASHMARK;
-		break;
-	case 'A':
-		event_tone = DTMF_A;
-		break;
-	case 'B':
-		event_tone = DTMF_B;
-		break;
-	case 'C':
-		event_tone = DTMF_C;
-		break;
-	case 'D':
-		event_tone = DTMF_D;
-		break;
-	default:
-		ret = g_ascii_digit_value(tone);
-		if (ret < 0)
-			return -EINVAL;
-		event_tone = ret;
-	}
-
-	ret = send_method_call(TONEGEN_BUS_NAME, TONEGEN_PATH,
-				TONEGEN_INTERFACE, "StartEventTone",
-				NULL, NULL,
-				DBUS_TYPE_UINT32, &event_tone,
-				DBUS_TYPE_INT32, &dbm0,
-				DBUS_TYPE_UINT32, &duration,
-				DBUS_TYPE_INVALID);
-	return ret;
-}
-
-static gboolean stop_feedback_tone(gpointer user_data)
-{
-	if (g_slist_length(tones) > 0) {
-		gpointer ptone;
-		int ret;
-
-		send_method_call(TONEGEN_BUS_NAME, TONEGEN_PATH,
-				TONEGEN_INTERFACE, "StopTone",
-				NULL, NULL,
-				DBUS_TYPE_INVALID);
-
-		ptone = g_slist_nth_data(tones, 0);
-		tones = g_slist_remove(tones, ptone);
-
-		ret = tonegen_startevent(GPOINTER_TO_UINT(ptone));
-		if (ret < 0)
-			goto done;
-
-		return TRUE;
-	}
-done:
-	return FALSE;
-}
-
-static void tones_timer_notify(gpointer data)
-{
-	send_method_call(TONEGEN_BUS_NAME, TONEGEN_PATH,
-				TONEGEN_INTERFACE, "StopTone",
-				NULL, NULL,
-				DBUS_TYPE_INVALID);
-	g_slist_free(tones);
-	tones = NULL;
-
-	create_tones_timer = 0;
-}
-
-static void start_feedback_tone(char tone)
-{
-	if (!create_tones_timer) {
-		int ret;
-
-		ret = tonegen_startevent(tone);
-		if (ret < 0)
-			return;
-
-		create_tones_timer = g_timeout_add_full(G_PRIORITY_DEFAULT,
-						FEEDBACK_TONE_DURATION,
-						stop_feedback_tone,
-						NULL,
-						tones_timer_notify);
-	} else {
-		glong dtmf_tone = tone;
-
-		DBG("add %c to queue", tone);
-		tones = g_slist_append(tones, GUINT_TO_POINTER(dtmf_tone));
-	}
-}
-
-void telephony_transmit_dtmf_req(void *telephony_device, char tone)
-{
-	DBG("telephony-maemo6: transmit dtmf: %c", tone);
-
-	start_dtmf(telephony_device, tone);
-
-	if (!find_call_with_status(CSD_CALL_STATUS_ACTIVE))
-		error("No active call");
-	else
-		start_feedback_tone(tone);
-}
-
-void telephony_subscriber_number_req(void *telephony_device)
-{
-	DBG("telephony-maemo6: subscriber number request");
-	if (msisdn)
-		telephony_subscriber_number_ind(msisdn,
-						number_type(msisdn),
-						SUBSCRIBER_SERVICE_VOICE);
-	telephony_subscriber_number_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-static int csd_status_to_hfp(struct csd_call *call)
-{
-	switch (call->status) {
-	case CSD_CALL_STATUS_IDLE:
-	case CSD_CALL_STATUS_MO_RELEASE:
-	case CSD_CALL_STATUS_MT_RELEASE:
-	case CSD_CALL_STATUS_TERMINATED:
-		return -1;
-	case CSD_CALL_STATUS_CREATE:
-		return CALL_STATUS_DIALING;
-	case CSD_CALL_STATUS_WAITING:
-		return CALL_STATUS_WAITING;
-	case CSD_CALL_STATUS_PROCEEDING:
-		/* PROCEEDING can happen in outgoing/incoming */
-		if (call->originating)
-			return CALL_STATUS_DIALING;
-
-		/*
-		 * PROCEEDING is followed by WAITING CSD status, therefore
-		 * second incoming call status indication is set immediately
-		 * to waiting.
-		 */
-		if (g_slist_length(active_calls) > 0)
-			return CALL_STATUS_WAITING;
-
-		return CALL_STATUS_INCOMING;
-	case CSD_CALL_STATUS_COMING:
-		if (g_slist_length(active_calls) > 0)
-			return CALL_STATUS_WAITING;
-
-		return CALL_STATUS_INCOMING;
-	case CSD_CALL_STATUS_MO_ALERTING:
-		return CALL_STATUS_ALERTING;
-	case CSD_CALL_STATUS_MT_ALERTING:
-		return CALL_STATUS_INCOMING;
-	case CSD_CALL_STATUS_ANSWERED:
-	case CSD_CALL_STATUS_ACTIVE:
-	case CSD_CALL_STATUS_RECONNECT_PENDING:
-	case CSD_CALL_STATUS_SWAP_INITIATED:
-	case CSD_CALL_STATUS_HOLD_INITIATED:
-		return CALL_STATUS_ACTIVE;
-	case CSD_CALL_STATUS_RETRIEVE_INITIATED:
-	case CSD_CALL_STATUS_HOLD:
-		return CALL_STATUS_HELD;
-	default:
-		return -1;
-	}
-}
-
-void telephony_list_current_calls_req(void *telephony_device)
-{
-	GSList *l;
-	int i;
-
-	DBG("telephony-maemo6: list current calls request");
-
-	for (l = calls, i = 1; l != NULL; l = l->next, i++) {
-		struct csd_call *call = l->data;
-		int status, direction, multiparty;
-
-		status = csd_status_to_hfp(call);
-		if (status < 0)
-			continue;
-
-		direction = call->originating ?
-				CALL_DIR_OUTGOING : CALL_DIR_INCOMING;
-
-		multiparty = call->conference ?
-				CALL_MULTIPARTY_YES : CALL_MULTIPARTY_NO;
-
-		telephony_list_current_call_ind(i, direction, status,
-						CALL_MODE_VOICE, multiparty,
-						call->number,
-						number_type(call->number));
-	}
-
-	telephony_list_current_calls_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_operator_selection_req(void *telephony_device)
-{
-	telephony_operator_selection_ind(OPERATOR_MODE_AUTO,
-				net.operator_name ? net.operator_name : "");
-	telephony_operator_selection_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-static void foreach_call_with_status(int status,
-					int (*func)(struct csd_call *call))
-{
-	GSList *l;
-
-	for (l = calls; l != NULL; l = l->next) {
-		struct csd_call *call = l->data;
-
-		if (call->status == status)
-			func(call);
-	}
-}
-
-void telephony_call_hold_req(void *telephony_device, const char *cmd)
-{
-	const char *idx;
-	struct csd_call *call;
-	int err = 0;
-
-	DBG("telephony-maemo6: got call hold request %s", cmd);
-
-	if (strlen(cmd) > 1)
-		idx = &cmd[1];
-	else
-		idx = NULL;
-
-	if (idx)
-		call = g_slist_nth_data(calls, strtol(idx, NULL, 0) - 1);
-	else
-		call = NULL;
-
-	switch (cmd[0]) {
-	case '0':
-		if (find_call_with_status(CSD_CALL_STATUS_WAITING))
-			foreach_call_with_status(CSD_CALL_STATUS_WAITING,
-								release_call);
-		else
-			foreach_call_with_status(CSD_CALL_STATUS_HOLD,
-								release_call);
-		break;
-	case '1':
-		if (idx) {
-			if (call)
-				err = release_call(call);
-			break;
-		}
-		foreach_call_with_status(CSD_CALL_STATUS_ACTIVE, release_call);
-		call = find_call_with_status(CSD_CALL_STATUS_WAITING);
-		if (call)
-			err = answer_call(call);
-		break;
-	case '2':
-		if (idx) {
-			if (call)
-				err = split_call(call);
-		} else {
-			struct csd_call *held, *wait;
-
-			call = find_call_with_status(CSD_CALL_STATUS_ACTIVE);
-			held = find_call_with_status(CSD_CALL_STATUS_HOLD);
-			wait = find_call_with_status(CSD_CALL_STATUS_WAITING);
-
-			if (wait)
-				err = answer_call(wait);
-			else if (call && held)
-				err = swap_calls();
-			else {
-				if (call)
-					err = hold_call(call);
-				if (held)
-					err = unhold_call(held);
-			}
-		}
-		break;
-	case '3':
-		if (find_call_with_status(CSD_CALL_STATUS_HOLD) ||
-				find_call_with_status(CSD_CALL_STATUS_WAITING))
-			err = create_conference();
-		break;
-	case '4':
-		err = call_transfer();
-		break;
-	default:
-		DBG("Unknown call hold request");
-		break;
-	}
-
-	if (err)
-		telephony_call_hold_rsp(telephony_device,
-					CME_ERROR_AG_FAILURE);
-	else
-		telephony_call_hold_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_nr_and_ec_req(void *telephony_device, gboolean enable)
-{
-	DBG("telephony-maemo6: got %s NR and EC request",
-			enable ? "enable" : "disable");
-	telephony_nr_and_ec_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_key_press_req(void *telephony_device, const char *keys)
-{
-	struct csd_call *active, *waiting;
-	int err;
-
-	DBG("telephony-maemo6: got key press request for %s", keys);
-
-	waiting = find_call_with_status(CSD_CALL_STATUS_COMING);
-	if (!waiting)
-		waiting = find_call_with_status(CSD_CALL_STATUS_MT_ALERTING);
-	if (!waiting)
-		waiting = find_call_with_status(CSD_CALL_STATUS_PROCEEDING);
-
-	active = find_call_with_status(CSD_CALL_STATUS_ACTIVE);
-
-	if (waiting)
-		err = answer_call(waiting);
-	else if (active)
-		err = release_call(active);
-	else
-		err = 0;
-
-	if (err < 0)
-		telephony_key_press_rsp(telephony_device,
-							CME_ERROR_AG_FAILURE);
-	else
-		telephony_key_press_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_voice_dial_req(void *telephony_device, gboolean enable)
-{
-	DBG("telephony-maemo6: got %s voice dial request",
-			enable ? "enable" : "disable");
-
-	telephony_voice_dial_rsp(telephony_device, CME_ERROR_NOT_SUPPORTED);
-}
-
-static void handle_incoming_call(DBusMessage *msg)
-{
-	const char *number, *call_path;
-	struct csd_call *call;
-
-	if (!dbus_message_get_args(msg, NULL,
-					DBUS_TYPE_OBJECT_PATH, &call_path,
-					DBUS_TYPE_STRING, &number,
-					DBUS_TYPE_INVALID)) {
-		error("Unexpected parameters in Call.Coming() signal");
-		return;
-	}
-
-	call = find_call(call_path);
-	if (!call) {
-		error("Didn't find any matching call object for %s",
-				call_path);
-		return;
-	}
-
-	DBG("Incoming call to %s from number %s", call_path, number);
-
-	g_free(call->number);
-	call->number = g_strdup(number);
-
-	if (find_call_with_status(CSD_CALL_STATUS_ACTIVE) ||
-			find_call_with_status(CSD_CALL_STATUS_HOLD))
-		telephony_call_waiting_ind(call->number,
-						number_type(call->number));
-	else
-		telephony_incoming_call_ind(call->number,
-						number_type(call->number));
-
-	telephony_update_indicator(maemo_indicators, "callsetup",
-					EV_CALLSETUP_INCOMING);
-}
-
-static void handle_outgoing_call(DBusMessage *msg)
-{
-	const char *number, *call_path;
-	struct csd_call *call;
-
-	if (!dbus_message_get_args(msg, NULL,
-					DBUS_TYPE_OBJECT_PATH, &call_path,
-					DBUS_TYPE_STRING, &number,
-					DBUS_TYPE_INVALID)) {
-		error("Unexpected parameters in Call.Created() signal");
-		return;
-	}
-
-	call = find_call(call_path);
-	if (!call) {
-		error("Didn't find any matching call object for %s",
-				call_path);
-		return;
-	}
-
-	DBG("Outgoing call from %s to number %s", call_path, number);
-
-	g_free(call->number);
-	call->number = g_strdup(number);
-
-	if (create_request_timer) {
-		g_source_remove(create_request_timer);
-		create_request_timer = 0;
-	}
-}
-
-static gboolean create_timeout(gpointer user_data)
-{
-	telephony_update_indicator(maemo_indicators, "callsetup",
-					EV_CALLSETUP_INACTIVE);
-	create_request_timer = 0;
-	return FALSE;
-}
-
-static void handle_create_requested(DBusMessage *msg)
-{
-	DBG("Call.CreateRequested()");
-
-	if (create_request_timer)
-		g_source_remove(create_request_timer);
-
-	create_request_timer = g_timeout_add_seconds(5, create_timeout, NULL);
-
-	telephony_update_indicator(maemo_indicators, "callsetup",
-					EV_CALLSETUP_OUTGOING);
-}
-
-static void call_set_status(struct csd_call *call, dbus_uint32_t status)
-{
-	dbus_uint32_t prev_status;
-	int callheld = telephony_get_indicator(maemo_indicators, "callheld");
-
-	prev_status = call->status;
-	DBG("Call %s changed from %s to %s", call->object_path,
-		call_status_str[prev_status], call_status_str[status]);
-
-	if (prev_status == status) {
-		DBG("Ignoring CSD Call state change to existing state");
-		return;
-	}
-
-	call->status = (int) status;
-
-	switch (status) {
-	case CSD_CALL_STATUS_IDLE:
-		if (call->setup) {
-			telephony_update_indicator(maemo_indicators,
-							"callsetup",
-							EV_CALLSETUP_INACTIVE);
-			if (!call->originating)
-				telephony_calling_stopped_ind();
-		}
-
-		g_free(call->number);
-		call->number = NULL;
-		call->originating = FALSE;
-		call->emergency = FALSE;
-		call->on_hold = FALSE;
-		call->conference = FALSE;
-		call->setup = FALSE;
-		break;
-	case CSD_CALL_STATUS_CREATE:
-		call->originating = TRUE;
-		call->setup = TRUE;
-		break;
-	case CSD_CALL_STATUS_COMING:
-		call->originating = FALSE;
-		call->setup = TRUE;
-		break;
-	case CSD_CALL_STATUS_PROCEEDING:
-		break;
-	case CSD_CALL_STATUS_MO_ALERTING:
-		telephony_update_indicator(maemo_indicators, "callsetup",
-						EV_CALLSETUP_ALERTING);
-		break;
-	case CSD_CALL_STATUS_MT_ALERTING:
-		/* Some headsets expect incoming call notification before they
-		 * can send ATA command. When call changed status from waiting
-		 * to alerting we need to send missing notification. Otherwise
-		 * headsets like Nokia BH-108 or BackBeat 903 are unable to
-		 * answer incoming call that was previously waiting. */
-		if (prev_status == CSD_CALL_STATUS_WAITING)
-			telephony_incoming_call_ind(call->number,
-						number_type(call->number));
-		break;
-	case CSD_CALL_STATUS_WAITING:
-		break;
-	case CSD_CALL_STATUS_ANSWERED:
-		break;
-	case CSD_CALL_STATUS_ACTIVE:
-		if (call->on_hold) {
-			call->on_hold = FALSE;
-			if (find_call_with_status(CSD_CALL_STATUS_HOLD))
-				telephony_update_indicator(maemo_indicators,
-							"callheld",
-							EV_CALLHELD_MULTIPLE);
-			else
-				telephony_update_indicator(maemo_indicators,
-							"callheld",
-							EV_CALLHELD_NONE);
-		} else {
-			if (!g_slist_find(active_calls, call))
-				active_calls = g_slist_prepend(active_calls, call);
-			if (g_slist_length(active_calls) == 1)
-				telephony_update_indicator(maemo_indicators,
-								"call",
-								EV_CALL_ACTIVE);
-			/* Upgrade callheld status if necessary */
-			if (callheld == EV_CALLHELD_ON_HOLD)
-				telephony_update_indicator(maemo_indicators,
-							"callheld",
-							EV_CALLHELD_MULTIPLE);
-			telephony_update_indicator(maemo_indicators,
-							"callsetup",
-							EV_CALLSETUP_INACTIVE);
-			if (!call->originating)
-				telephony_calling_stopped_ind();
-			call->setup = FALSE;
-		}
-		break;
-	case CSD_CALL_STATUS_MO_RELEASE:
-	case CSD_CALL_STATUS_MT_RELEASE:
-		active_calls = g_slist_remove(active_calls, call);
-		if (g_slist_length(active_calls) == 0)
-			telephony_update_indicator(maemo_indicators, "call",
-							EV_CALL_INACTIVE);
-
-		if (create_tones_timer)
-			g_source_remove(create_tones_timer);
-		break;
-	case CSD_CALL_STATUS_HOLD_INITIATED:
-		break;
-	case CSD_CALL_STATUS_HOLD:
-		call->on_hold = TRUE;
-		if (find_non_held_call())
-			telephony_update_indicator(maemo_indicators,
-							"callheld",
-							EV_CALLHELD_MULTIPLE);
-		else
-			telephony_update_indicator(maemo_indicators,
-							"callheld",
-							EV_CALLHELD_ON_HOLD);
-		break;
-	case CSD_CALL_STATUS_RETRIEVE_INITIATED:
-		break;
-	case CSD_CALL_STATUS_RECONNECT_PENDING:
-		break;
-	case CSD_CALL_STATUS_TERMINATED:
-		if (call->on_hold &&
-				!find_call_with_status(CSD_CALL_STATUS_HOLD)) {
-			telephony_update_indicator(maemo_indicators,
-							"callheld",
-							EV_CALLHELD_NONE);
-			return;
-		}
-
-		if (callheld == EV_CALLHELD_MULTIPLE &&
-				find_call_with_status(CSD_CALL_STATUS_HOLD) &&
-				!find_call_with_status(CSD_CALL_STATUS_ACTIVE))
-			telephony_update_indicator(maemo_indicators,
-							"callheld",
-							EV_CALLHELD_ON_HOLD);
-		break;
-	case CSD_CALL_STATUS_SWAP_INITIATED:
-		break;
-	default:
-		error("Unknown call status %u", status);
-		break;
-	}
-}
-
-static void handle_call_status(DBusMessage *msg, const char *call_path)
-{
-	struct csd_call *call;
-	dbus_uint32_t status, cause_type, cause;
-
-	if (!dbus_message_get_args(msg, NULL,
-					DBUS_TYPE_UINT32, &status,
-					DBUS_TYPE_UINT32, &cause_type,
-					DBUS_TYPE_UINT32, &cause,
-					DBUS_TYPE_INVALID)) {
-		error("Unexpected parameters in Instance.CallStatus() signal");
-		return;
-	}
-
-	call = find_call(call_path);
-	if (!call) {
-		error("Didn't find any matching call object for %s",
-				call_path);
-		return;
-	}
-
-	if (status > 16) {
-		error("Invalid call status %u", status);
-		return;
-	}
-
-	call_set_status(call, status);
-}
-
-static void handle_conference(DBusMessage *msg, gboolean joined)
-{
-	const char *path;
-	struct csd_call *call;
-
-	if (!dbus_message_get_args(msg, NULL,
-					DBUS_TYPE_OBJECT_PATH, &path,
-					DBUS_TYPE_INVALID)) {
-		error("Unexpected parameters in Conference.%s",
-					dbus_message_get_member(msg));
-		return;
-	}
-
-	call = find_call(path);
-	if (!call) {
-		error("Conference signal for unknown call %s", path);
-		return;
-	}
-
-	DBG("Call %s %s the conference", path, joined ? "joined" : "left");
-
-	call->conference = joined;
-}
-
-static uint8_t str2status(const char *state)
-{
-	if (g_strcmp0(state, "Home") == 0)
-		return NETWORK_REG_STATUS_HOME;
-	else if (g_strcmp0(state, "Roaming") == 0)
-		return NETWORK_REG_STATUS_ROAMING;
-	else if (g_strcmp0(state, "Offline") == 0)
-		return NETWORK_REG_STATUS_OFFLINE;
-	else if (g_strcmp0(state, "Searching") == 0)
-		return NETWORK_REG_STATUS_SEARCHING;
-	else if (g_strcmp0(state, "NoSim") == 0)
-		return NETWORK_REG_STATUS_NO_SIM;
-	else if (g_strcmp0(state, "Poweroff") == 0)
-		return NETWORK_REG_STATUS_POWEROFF;
-	else if (g_strcmp0(state, "Powersafe") == 0)
-		return NETWORK_REG_STATUS_POWERSAFE;
-	else if (g_strcmp0(state, "NoCoverage") == 0)
-		return NETWORK_REG_STATUS_NO_COVERAGE;
-	else if (g_strcmp0(state, "Reject") == 0)
-		return NETWORK_REG_STATUS_REJECTED;
-	else
-		return NETWORK_REG_STATUS_UNKOWN;
-}
-
-static void update_registration_status(const char *status)
-{
-	uint8_t new_status;
-
-	new_status = str2status(status);
-
-	if (net.status == new_status)
-		return;
-
-	switch (new_status) {
-	case NETWORK_REG_STATUS_HOME:
-		telephony_update_indicator(maemo_indicators, "roam",
-							EV_ROAM_INACTIVE);
-		if (net.status > NETWORK_REG_STATUS_ROAMING)
-			telephony_update_indicator(maemo_indicators,
-							"service",
-							EV_SERVICE_PRESENT);
-		break;
-	case NETWORK_REG_STATUS_ROAMING:
-		telephony_update_indicator(maemo_indicators, "roam",
-							EV_ROAM_ACTIVE);
-		if (net.status > NETWORK_REG_STATUS_ROAMING)
-			telephony_update_indicator(maemo_indicators,
-							"service",
-							EV_SERVICE_PRESENT);
-		break;
-	case NETWORK_REG_STATUS_OFFLINE:
-	case NETWORK_REG_STATUS_SEARCHING:
-	case NETWORK_REG_STATUS_NO_SIM:
-	case NETWORK_REG_STATUS_POWEROFF:
-	case NETWORK_REG_STATUS_POWERSAFE:
-	case NETWORK_REG_STATUS_NO_COVERAGE:
-	case NETWORK_REG_STATUS_REJECTED:
-	case NETWORK_REG_STATUS_UNKOWN:
-		if (net.status < NETWORK_REG_STATUS_OFFLINE)
-			telephony_update_indicator(maemo_indicators,
-							"service",
-							EV_SERVICE_NONE);
-		break;
-	}
-
-	net.status = new_status;
-
-	DBG("telephony-maemo6: registration status changed: %s", status);
-}
-
-static void handle_registration_changed(DBusMessage *msg)
-{
-	const char *status;
-
-	if (!dbus_message_get_args(msg, NULL,
-					DBUS_TYPE_STRING, &status,
-					DBUS_TYPE_INVALID)) {
-		error("Unexpected parameters in RegistrationChanged");
-		return;
-	}
-
-	update_registration_status(status);
-}
-
-static void update_signal_strength(int32_t signal_bars)
-{
-	if (signal_bars < 0) {
-		DBG("signal strength smaller than expected: %d < 0",
-								signal_bars);
-		signal_bars = 0;
-	} else if (signal_bars > 5) {
-		DBG("signal strength greater than expected: %d > 5",
-								signal_bars);
-		signal_bars = 5;
-	}
-
-	if (net.signal_bars == signal_bars)
-		return;
-
-	telephony_update_indicator(maemo_indicators, "signal", signal_bars);
-
-	net.signal_bars = signal_bars;
-	DBG("telephony-maemo6: signal strength updated: %d/5", signal_bars);
-}
-
-static void handle_signal_bars_changed(DBusMessage *msg)
-{
-	int32_t signal_bars;
-
-	if (!dbus_message_get_args(msg, NULL,
-					DBUS_TYPE_INT32, &signal_bars,
-					DBUS_TYPE_INVALID)) {
-		error("Unexpected parameters in SignalBarsChanged");
-		return;
-	}
-
-	update_signal_strength(signal_bars);
-}
-
-static gboolean iter_get_basic_args(DBusMessageIter *iter,
-					int first_arg_type, ...)
-{
-	int type;
-	va_list ap;
-
-	va_start(ap, first_arg_type);
-
-	for (type = first_arg_type; type != DBUS_TYPE_INVALID;
-			type = va_arg(ap, int)) {
-		void *value = va_arg(ap, void *);
-		int real_type = dbus_message_iter_get_arg_type(iter);
-
-		if (real_type != type) {
-			error("iter_get_basic_args: expected %c but got %c",
-					(char) type, (char) real_type);
-			break;
-		}
-
-		dbus_message_iter_get_basic(iter, value);
-		dbus_message_iter_next(iter);
-	}
-
-	va_end(ap);
-
-	return type == DBUS_TYPE_INVALID ? TRUE : FALSE;
-}
-
-static void hal_battery_level_reply(DBusPendingCall *call, void *user_data)
-{
-	DBusError err;
-	DBusMessage *reply;
-	dbus_int32_t level;
-	int *value = user_data;
-
-	reply = dbus_pending_call_steal_reply(call);
-
-	dbus_error_init(&err);
-	if (dbus_set_error_from_message(&err, reply)) {
-		error("hald replied with an error: %s, %s",
-				err.name, err.message);
-		dbus_error_free(&err);
-		goto done;
-	}
-
-	if (!dbus_message_get_args(reply, NULL,
-				DBUS_TYPE_INT32, &level,
-				DBUS_TYPE_INVALID)) {
-		error("Unexpected args in hald reply");
-		goto done;
-	}
-
-	*value = (int) level;
-
-	if (value == &battchg_last)
-		DBG("telephony-maemo6: battery.charge_level.last_full is %d",
-				*value);
-	else if (value == &battchg_design)
-		DBG("telephony-maemo6: battery.charge_level.design is %d",
-				*value);
-	else
-		DBG("telephony-maemo6: battery.charge_level.current is %d",
-				*value);
-
-	if ((battchg_design > 0 || battchg_last > 0) && battchg_cur >= 0) {
-		int new, max;
-
-		if (battchg_last > 0)
-			max = battchg_last;
-		else
-			max = battchg_design;
-
-		new = battchg_cur * 5 / max;
-
-		telephony_update_indicator(maemo_indicators, "battchg", new);
-	}
-
-done:
-	dbus_message_unref(reply);
-	remove_pending(call);
-}
-
-static void hal_get_integer(const char *path, const char *key, void *user_data)
-{
-	send_method_call("org.freedesktop.Hal", path,
-				"org.freedesktop.Hal.Device",
-				"GetPropertyInteger",
-				hal_battery_level_reply, user_data,
-				DBUS_TYPE_STRING, &key,
-				DBUS_TYPE_INVALID);
-}
-
-static void handle_hal_property_modified(DBusMessage *msg)
-{
-	DBusMessageIter iter, array;
-	dbus_int32_t num_changes;
-	const char *path;
-
-	path = dbus_message_get_path(msg);
-
-	dbus_message_iter_init(msg, &iter);
-
-	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) {
-		error("Unexpected signature in hal PropertyModified signal");
-		return;
-	}
-
-	dbus_message_iter_get_basic(&iter, &num_changes);
-	dbus_message_iter_next(&iter);
-
-	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY) {
-		error("Unexpected signature in hal PropertyModified signal");
-		return;
-	}
-
-	dbus_message_iter_recurse(&iter, &array);
-
-	while (dbus_message_iter_get_arg_type(&array) != DBUS_TYPE_INVALID) {
-		DBusMessageIter prop;
-		const char *name;
-		dbus_bool_t added, removed;
-
-		dbus_message_iter_recurse(&array, &prop);
-
-		if (!iter_get_basic_args(&prop,
-					DBUS_TYPE_STRING, &name,
-					DBUS_TYPE_BOOLEAN, &added,
-					DBUS_TYPE_BOOLEAN, &removed,
-					DBUS_TYPE_INVALID)) {
-			error("Invalid hal PropertyModified parameters");
-			break;
-		}
-
-		if (g_str_equal(name, "battery.charge_level.last_full"))
-			hal_get_integer(path, name, &battchg_last);
-		else if (g_str_equal(name, "battery.charge_level.current"))
-			hal_get_integer(path, name, &battchg_cur);
-		else if (g_str_equal(name, "battery.charge_level.design"))
-			hal_get_integer(path, name, &battchg_design);
-
-		dbus_message_iter_next(&array);
-	}
-}
-
-static void csd_call_free(void *data)
-{
-	struct csd_call *call = data;
-
-	if (!call)
-		return;
-
-	g_free(call->object_path);
-	g_free(call->number);
-
-	g_slist_foreach(pending, remove_pending_by_data, call);
-
-	g_free(call);
-}
-
-static void parse_call_list(DBusMessageIter *iter)
-{
-	do {
-		DBusMessageIter call_iter;
-		struct csd_call *call;
-		const char *object_path, *number;
-		dbus_uint32_t status;
-		dbus_bool_t originating, terminating, emerg, on_hold, conf;
-
-		if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_STRUCT) {
-			error("Unexpected signature in GetCallInfoAll reply");
-			break;
-		}
-
-		dbus_message_iter_recurse(iter, &call_iter);
-
-		if (!iter_get_basic_args(&call_iter,
-					DBUS_TYPE_OBJECT_PATH, &object_path,
-					DBUS_TYPE_UINT32, &status,
-					DBUS_TYPE_BOOLEAN, &originating,
-					DBUS_TYPE_BOOLEAN, &terminating,
-					DBUS_TYPE_BOOLEAN, &emerg,
-					DBUS_TYPE_BOOLEAN, &on_hold,
-					DBUS_TYPE_BOOLEAN, &conf,
-					DBUS_TYPE_STRING, &number,
-					DBUS_TYPE_INVALID)) {
-			error("Parsing call D-Bus parameters failed");
-			break;
-		}
-
-		call = find_call(object_path);
-		if (!call) {
-			call = g_new0(struct csd_call, 1);
-			call->object_path = g_strdup(object_path);
-			calls = g_slist_append(calls, call);
-			DBG("telephony-maemo6: new csd call instance at %s",
-								object_path);
-		}
-
-		if (status == CSD_CALL_STATUS_IDLE)
-			continue;
-
-		/* CSD gives incorrect call_hold property sometimes */
-		if ((call->status != CSD_CALL_STATUS_HOLD && on_hold) ||
-				(call->status == CSD_CALL_STATUS_HOLD &&
-								!on_hold)) {
-			error("Conflicting call status and on_hold property!");
-			on_hold = call->status == CSD_CALL_STATUS_HOLD;
-		}
-
-		call->originating = originating;
-		call->on_hold = on_hold;
-		call->conference = conf;
-		g_free(call->number);
-		call->number = g_strdup(number);
-
-		/* Update indicators */
-		call_set_status(call, status);
-
-	} while (dbus_message_iter_next(iter));
-}
-
-static void update_operator_name(const char *name)
-{
-	if (name == NULL)
-		return;
-
-	g_free(net.operator_name);
-	net.operator_name = g_strndup(name, 16);
-	DBG("telephony-maemo6: operator name updated: %s", name);
-}
-
-static void get_property_reply(DBusPendingCall *call, void *user_data)
-{
-	char *prop = user_data;
-	DBusError err;
-	DBusMessage *reply;
-	DBusMessageIter iter, sub;
-
-	reply = dbus_pending_call_steal_reply(call);
-
-	dbus_error_init(&err);
-	if (dbus_set_error_from_message(&err, reply)) {
-		error("csd replied with an error: %s, %s",
-				err.name, err.message);
-		dbus_error_free(&err);
-		goto done;
-	}
-
-	dbus_message_iter_init(reply, &iter);
-
-	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) {
-		error("Unexpected signature in Get return");
-		goto done;
-	}
-
-	dbus_message_iter_recurse(&iter, &sub);
-
-	if (g_strcmp0(prop, "RegistrationStatus") == 0) {
-		const char *status;
-
-		dbus_message_iter_get_basic(&sub, &status);
-		update_registration_status(status);
-
-		get_property(CSD_CSNET_OPERATOR, "OperatorName");
-		get_property(CSD_CSNET_SIGNAL, "SignalBars");
-	} else if (g_strcmp0(prop, "OperatorName") == 0) {
-		const char *name;
-
-		dbus_message_iter_get_basic(&sub, &name);
-		update_operator_name(name);
-	} else if (g_strcmp0(prop, "SignalBars") == 0) {
-		int32_t signal_bars;
-
-		dbus_message_iter_get_basic(&sub, &signal_bars);
-		update_signal_strength(signal_bars);
-	}
-
-done:
-	g_free(prop);
-	dbus_message_unref(reply);
-	remove_pending(call);
-}
-
-static int get_property(const char *iface, const char *prop)
-{
-	return send_method_call(CSD_CSNET_BUS_NAME, CSD_CSNET_PATH,
-				DBUS_INTERFACE_PROPERTIES, "Get",
-				get_property_reply, g_strdup(prop),
-				DBUS_TYPE_STRING, &iface,
-				DBUS_TYPE_STRING, &prop,
-				DBUS_TYPE_INVALID);
-}
-
-static void handle_operator_name_changed(DBusMessage *msg)
-{
-	const char *name;
-
-	if (!dbus_message_get_args(msg, NULL,
-					DBUS_TYPE_STRING, &name,
-					DBUS_TYPE_INVALID)) {
-		error("Unexpected parameters in OperatorNameChanged");
-		return;
-	}
-
-	update_operator_name(name);
-}
-
-static void call_info_reply(DBusPendingCall *call, void *user_data)
-{
-	DBusError err;
-	DBusMessage *reply;
-	DBusMessageIter iter, sub;
-
-	get_calls_active = FALSE;
-
-	reply = dbus_pending_call_steal_reply(call);
-
-	dbus_error_init(&err);
-	if (dbus_set_error_from_message(&err, reply)) {
-		error("csd replied with an error: %s, %s",
-				err.name, err.message);
-		dbus_error_free(&err);
-		goto done;
-	}
-
-	dbus_message_iter_init(reply, &iter);
-
-	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY) {
-		error("Unexpected signature in GetCallInfoAll return");
-		goto done;
-	}
-
-	dbus_message_iter_recurse(&iter, &sub);
-
-	parse_call_list(&sub);
-
-	get_property(CSD_CSNET_REGISTRATION, "RegistrationStatus");
-
-done:
-	dbus_message_unref(reply);
-	remove_pending(call);
-}
-
-
-static void phonebook_read_reply(DBusPendingCall *call, void *user_data)
-{
-	DBusError derr;
-	DBusMessage *reply;
-	const char *name, *number, *secondname, *additionalnumber, *email;
-	int index;
-	char **number_type = user_data;
-
-	reply = dbus_pending_call_steal_reply(call);
-
-	dbus_error_init(&derr);
-	if (dbus_set_error_from_message(&derr, reply)) {
-		error("%s.ReadFirst replied with an error: %s, %s",
-				CSD_SIMPB_INTERFACE, derr.name, derr.message);
-		dbus_error_free(&derr);
-		if (number_type == &vmbx)
-			vmbx = g_strdup(getenv("VMBX_NUMBER"));
-		goto done;
-	}
-
-	dbus_error_init(&derr);
-	if (dbus_message_get_args(reply, NULL,
-				DBUS_TYPE_INT32, &index,
-				DBUS_TYPE_STRING, &name,
-				DBUS_TYPE_STRING, &number,
-				DBUS_TYPE_STRING, &secondname,
-				DBUS_TYPE_STRING, &additionalnumber,
-				DBUS_TYPE_STRING, &email,
-				DBUS_TYPE_INVALID) == FALSE) {
-		error("Unable to parse %s.ReadFirst arguments: %s, %s",
-				CSD_SIMPB_INTERFACE, derr.name, derr.message);
-		dbus_error_free(&derr);
-		goto done;
-	}
-
-	if (number_type == &msisdn) {
-		g_free(msisdn);
-		msisdn = g_strdup(number);
-		DBG("Got MSISDN %s (%s)", number, name);
-	} else {
-		g_free(vmbx);
-		vmbx = g_strdup(number);
-		DBG("Got voice mailbox number %s (%s)", number, name);
-	}
-
-done:
-	dbus_message_unref(reply);
-	remove_pending(call);
-}
-
-static void csd_init(void)
-{
-	const char *pb_type;
-	int ret;
-
-	ret = send_method_call(CSD_CALL_BUS_NAME, CSD_CALL_PATH,
-				CSD_CALL_INTERFACE, "GetCallInfoAll",
-				call_info_reply, NULL, DBUS_TYPE_INVALID);
-	if (ret < 0) {
-		error("Unable to sent GetCallInfoAll method call");
-		return;
-	}
-
-	get_calls_active = TRUE;
-
-	pb_type = CSD_SIMPB_TYPE_MSISDN;
-
-	ret = send_method_call(CSD_SIMPB_BUS_NAME, CSD_SIMPB_PATH,
-				CSD_SIMPB_INTERFACE, "ReadFirst",
-				phonebook_read_reply, &msisdn,
-				DBUS_TYPE_STRING, &pb_type,
-				DBUS_TYPE_INVALID);
-	if (ret < 0) {
-		error("Unable to send " CSD_SIMPB_INTERFACE ".read()");
-		return;
-	}
-
-	/* Voicemail should be in MBDN index 0 */
-	pb_type = CSD_SIMPB_TYPE_MBDN;
-
-	ret = send_method_call(CSD_SIMPB_BUS_NAME, CSD_SIMPB_PATH,
-				CSD_SIMPB_INTERFACE, "ReadFirst",
-				phonebook_read_reply, &vmbx,
-				DBUS_TYPE_STRING, &pb_type,
-				DBUS_TYPE_INVALID);
-	if (ret < 0) {
-		error("Unable to send " CSD_SIMPB_INTERFACE ".read()");
-		return;
-	}
-}
-
-static void handle_modem_state(DBusMessage *msg)
-{
-	const char *state;
-
-	if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &state,
-							DBUS_TYPE_INVALID)) {
-		error("Unexpected modem state parameters");
-		return;
-	}
-
-	DBG("SSC modem state: %s", state);
-
-	if (calls != NULL || get_calls_active)
-		return;
-
-	if (g_str_equal(state, "cmt_ready") || g_str_equal(state, "online"))
-		csd_init();
-}
-
-static void modem_state_reply(DBusPendingCall *call, void *user_data)
-{
-	DBusMessage *reply = dbus_pending_call_steal_reply(call);
-	DBusError err;
-
-	dbus_error_init(&err);
-	if (dbus_set_error_from_message(&err, reply)) {
-		error("get_modem_state: %s, %s", err.name, err.message);
-		dbus_error_free(&err);
-	} else
-		handle_modem_state(reply);
-
-	dbus_message_unref(reply);
-	remove_pending(call);
-}
-
-static gboolean signal_filter(DBusConnection *conn, DBusMessage *msg,
-								void *data)
-{
-	const char *path = dbus_message_get_path(msg);
-
-	if (dbus_message_is_signal(msg, CSD_CALL_INTERFACE, "Coming"))
-		handle_incoming_call(msg);
-	else if (dbus_message_is_signal(msg, CSD_CALL_INTERFACE, "Created"))
-		handle_outgoing_call(msg);
-	else if (dbus_message_is_signal(msg, CSD_CALL_INTERFACE,
-							"CreateRequested"))
-		handle_create_requested(msg);
-	else if (dbus_message_is_signal(msg, CSD_CALL_INSTANCE, "CallStatus"))
-		handle_call_status(msg, path);
-	else if (dbus_message_is_signal(msg, CSD_CALL_CONFERENCE, "Joined"))
-		handle_conference(msg, TRUE);
-	else if (dbus_message_is_signal(msg, CSD_CALL_CONFERENCE, "Left"))
-		handle_conference(msg, FALSE);
-	else if (dbus_message_is_signal(msg, CSD_CSNET_REGISTRATION,
-				"RegistrationChanged"))
-		handle_registration_changed(msg);
-	else if (dbus_message_is_signal(msg, CSD_CSNET_OPERATOR,
-				"OperatorNameChanged"))
-		handle_operator_name_changed(msg);
-	else if (dbus_message_is_signal(msg, CSD_CSNET_SIGNAL,
-				"SignalBarsChanged"))
-		handle_signal_bars_changed(msg);
-	else if (dbus_message_is_signal(msg, "org.freedesktop.Hal.Device",
-					"PropertyModified"))
-		handle_hal_property_modified(msg);
-	else if (dbus_message_is_signal(msg, SSC_DBUS_IFACE,
-						"modem_state_changed_ind"))
-		handle_modem_state(msg);
-
-	return TRUE;
-}
-
-static void add_watch(const char *sender, const char *path,
-				const char *interface, const char *member)
-{
-	guint watch;
-
-	watch = g_dbus_add_signal_watch(btd_get_dbus_connection(),
-					sender, path, interface,
-					member, signal_filter, NULL, NULL);
-
-	watches = g_slist_prepend(watches, GUINT_TO_POINTER(watch));
-}
-
-static void hal_find_device_reply(DBusPendingCall *call, void *user_data)
-{
-	DBusError err;
-	DBusMessage *reply;
-	DBusMessageIter iter, sub;
-	const char *path;
-	int type;
-
-	reply = dbus_pending_call_steal_reply(call);
-
-	dbus_error_init(&err);
-	if (dbus_set_error_from_message(&err, reply)) {
-		error("hald replied with an error: %s, %s",
-				err.name, err.message);
-		dbus_error_free(&err);
-		goto done;
-	}
-
-	dbus_message_iter_init(reply, &iter);
-
-	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY) {
-		error("Unexpected signature in FindDeviceByCapability return");
-		goto done;
-	}
-
-	dbus_message_iter_recurse(&iter, &sub);
-
-	type = dbus_message_iter_get_arg_type(&sub);
-
-	if (type != DBUS_TYPE_OBJECT_PATH && type != DBUS_TYPE_STRING) {
-		error("No hal device with battery capability found");
-		goto done;
-	}
-
-	dbus_message_iter_get_basic(&sub, &path);
-
-	DBG("telephony-maemo6: found battery device at %s", path);
-
-	add_watch(NULL, path, "org.freedesktop.Hal.Device",
-							"PropertyModified");
-
-	hal_get_integer(path, "battery.charge_level.last_full", &battchg_last);
-	hal_get_integer(path, "battery.charge_level.current", &battchg_cur);
-	hal_get_integer(path, "battery.charge_level.design", &battchg_design);
-
-done:
-	dbus_message_unref(reply);
-	remove_pending(call);
-}
-
-int telephony_init(void)
-{
-	const char *battery_cap = "battery";
-	uint32_t features = AG_FEATURE_EC_ANDOR_NR |
-				AG_FEATURE_INBAND_RINGTONE |
-				AG_FEATURE_REJECT_A_CALL |
-				AG_FEATURE_ENHANCED_CALL_STATUS |
-				AG_FEATURE_ENHANCED_CALL_CONTROL |
-				AG_FEATURE_EXTENDED_ERROR_RESULT_CODES |
-				AG_FEATURE_THREE_WAY_CALLING;
-	int i;
-
-	DBG("");
-
-	add_watch(NULL, NULL, CSD_CALL_INTERFACE, NULL);
-	add_watch(NULL, NULL, CSD_CALL_INSTANCE, NULL);
-	add_watch(NULL, NULL, CSD_CALL_CONFERENCE, NULL);
-	add_watch(NULL, NULL, CSD_CSNET_REGISTRATION, "RegistrationChanged");
-	add_watch(NULL, NULL, CSD_CSNET_OPERATOR, "OperatorNameChanged");
-	add_watch(NULL, NULL, CSD_CSNET_SIGNAL, "SignalBarsChanged");
-	add_watch(NULL, NULL, SSC_DBUS_IFACE, "modem_state_changed_ind");
-
-	if (send_method_call(SSC_DBUS_NAME, SSC_DBUS_PATH, SSC_DBUS_IFACE,
-					"get_modem_state", modem_state_reply,
-					NULL, DBUS_TYPE_INVALID) < 0)
-		error("Unable to send " SSC_DBUS_IFACE ".get_modem_state()");
-
-	/* Reset indicators */
-	for (i = 0; maemo_indicators[i].desc != NULL; i++) {
-		if (g_str_equal(maemo_indicators[i].desc, "battchg"))
-			maemo_indicators[i].val = 5;
-		else
-			maemo_indicators[i].val = 0;
-	}
-
-	telephony_ready_ind(features, maemo_indicators, BTRH_NOT_SUPPORTED,
-								chld_str);
-	if (send_method_call("org.freedesktop.Hal",
-				"/org/freedesktop/Hal/Manager",
-				"org.freedesktop.Hal.Manager",
-				"FindDeviceByCapability",
-				hal_find_device_reply, NULL,
-				DBUS_TYPE_STRING, &battery_cap,
-				DBUS_TYPE_INVALID) < 0)
-		error("Unable to send HAL method call");
-
-	return 0;
-}
-
-static void remove_watch(gpointer data)
-{
-	g_dbus_remove_watch(GPOINTER_TO_UINT(data));
-}
-
-void telephony_exit(void)
-{
-	DBG("");
-
-	g_free(net.operator_name);
-	net.operator_name = NULL;
-
-	net.status = NETWORK_REG_STATUS_UNKOWN;
-	net.signal_bars = 0;
-
-	g_slist_free(active_calls);
-	active_calls = NULL;
-
-	g_slist_free_full(calls, csd_call_free);
-	calls = NULL;
-
-	g_slist_free_full(pending, pending_req_finalize);
-	pending = NULL;
-
-	g_slist_free_full(watches, remove_watch);
-	watches = NULL;
-
-	telephony_deinit();
-}
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH BlueZ 06/13] build: Remove telephony-ofono.c
  2012-11-13 13:21 [PATCH BlueZ 00/13] Remove HFP implementation Luiz Augusto von Dentz
                   ` (7 preceding siblings ...)
  2012-11-13 13:21 ` [PATCH BlueZ 05/13] build: Remove telephony-maemo6.c Luiz Augusto von Dentz
@ 2012-11-13 13:21 ` Luiz Augusto von Dentz
  2012-11-13 13:21 ` [PATCH BlueZ 07/13] build: Remove telephony-dummy.c Luiz Augusto von Dentz
                   ` (7 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Luiz Augusto von Dentz @ 2012-11-13 13:21 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

---
 Makefile.am             |    4 +-
 audio/telephony-ofono.c | 1636 -----------------------------------------------
 2 files changed, 1 insertion(+), 1639 deletions(-)
 delete mode 100644 audio/telephony-ofono.c

diff --git a/Makefile.am b/Makefile.am
index b7e861b..84566c8 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -125,8 +125,7 @@ builtin_nodist += audio/telephony.c
 
 noinst_LIBRARIES += audio/libtelephony.a
 
-audio_libtelephony_a_SOURCES = audio/telephony.h audio/telephony-dummy.c \
-				audio/telephony-ofono.c
+audio_libtelephony_a_SOURCES = audio/telephony.h audio/telephony-dummy.c
 endif
 
 if SAPPLUGIN
@@ -314,7 +313,6 @@ EXTRA_DIST += src/genbuiltin src/bluetooth.conf src/org.bluez.service \
 			src/main.conf profiles/network/network.conf \
 			profiles/input/input.conf profiles/proximity/proximity.conf \
 			audio/audio.conf audio/telephony-dummy.c \
-			audio/telephony-ofono.c \
 			profiles/sap/sap-dummy.c profiles/sap/sap-u8500.c
 
 include Makefile.tools
diff --git a/audio/telephony-ofono.c b/audio/telephony-ofono.c
deleted file mode 100644
index f87b652..0000000
--- a/audio/telephony-ofono.c
+++ /dev/null
@@ -1,1636 +0,0 @@
-/*
- *
- *  BlueZ - Bluetooth protocol stack for Linux
- *
- *  Copyright (C) 2009-2010  Intel Corporation
- *  Copyright (C) 2006-2009  Nokia Corporation
- *  Copyright (C) 2004-2010  Marcel Holtmann <marcel@holtmann.org>
- *
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdint.h>
-#include <glib.h>
-#include <dbus/dbus.h>
-#include <gdbus.h>
-
-#include <bluetooth/sdp.h>
-
-#include "dbus-common.h"
-#include "log.h"
-#include "telephony.h"
-
-enum net_registration_status {
-	NETWORK_REG_STATUS_HOME = 0x00,
-	NETWORK_REG_STATUS_ROAM,
-	NETWORK_REG_STATUS_NOSERV
-};
-
-struct voice_call {
-	char *obj_path;
-	int status;
-	gboolean originating;
-	gboolean conference;
-	char *number;
-	guint watch;
-};
-
-static char *modem_obj_path = NULL;
-static char *last_dialed_number = NULL;
-static GSList *calls = NULL;
-static GSList *watches = NULL;
-static GSList *pending = NULL;
-
-#define OFONO_BUS_NAME "org.ofono"
-#define OFONO_PATH "/"
-#define OFONO_MODEM_INTERFACE "org.ofono.Modem"
-#define OFONO_MANAGER_INTERFACE "org.ofono.Manager"
-#define OFONO_NETWORKREG_INTERFACE "org.ofono.NetworkRegistration"
-#define OFONO_VCMANAGER_INTERFACE "org.ofono.VoiceCallManager"
-#define OFONO_VC_INTERFACE "org.ofono.VoiceCall"
-
-/* HAL battery namespace key values */
-static int battchg_cur = -1;    /* "battery.charge_level.current" */
-static int battchg_last = -1;   /* "battery.charge_level.last_full" */
-static int battchg_design = -1; /* "battery.charge_level.design" */
-
-static struct {
-	uint8_t status;
-	uint32_t signals_bar;
-	char *operator_name;
-} net = {
-	.status = NETWORK_REG_STATUS_NOSERV,
-	.signals_bar = 0,
-	.operator_name = NULL,
-};
-
-static const char *chld_str = "0,1,1x,2,2x,3,4";
-static char *subscriber_number = NULL;
-
-static gboolean events_enabled = FALSE;
-
-static struct indicator ofono_indicators[] =
-{
-	{ "battchg",	"0-5",	5,	TRUE },
-	{ "signal",	"0-5",	5,	TRUE },
-	{ "service",	"0,1",	1,	TRUE },
-	{ "call",	"0,1",	0,	TRUE },
-	{ "callsetup",	"0-3",	0,	TRUE },
-	{ "callheld",	"0-2",	0,	FALSE },
-	{ "roam",	"0,1",	0,	TRUE },
-	{ NULL }
-};
-
-static struct voice_call *find_vc(const char *path)
-{
-	GSList *l;
-
-	for (l = calls; l != NULL; l = l->next) {
-		struct voice_call *vc = l->data;
-
-		if (g_str_equal(vc->obj_path, path))
-			return vc;
-	}
-
-	return NULL;
-}
-
-static struct voice_call *find_vc_with_status(int status)
-{
-	GSList *l;
-
-	for (l = calls; l != NULL; l = l->next) {
-		struct voice_call *vc = l->data;
-
-		if (vc->status == status)
-			return vc;
-	}
-
-	return NULL;
-}
-
-static struct voice_call *find_vc_without_status(int status)
-{
-	GSList *l;
-
-	for (l = calls; l != NULL; l = l->next) {
-		struct voice_call *call = l->data;
-
-		if (call->status != status)
-			return call;
-	}
-
-	return NULL;
-}
-
-static int number_type(const char *number)
-{
-	if (number == NULL)
-		return NUMBER_TYPE_TELEPHONY;
-
-	if (number[0] == '+' || strncmp(number, "00", 2) == 0)
-		return NUMBER_TYPE_INTERNATIONAL;
-
-	return NUMBER_TYPE_TELEPHONY;
-}
-
-void telephony_device_connected(void *telephony_device)
-{
-	struct voice_call *coming;
-
-	DBG("telephony-ofono: device %p connected", telephony_device);
-
-	coming = find_vc_with_status(CALL_STATUS_ALERTING);
-	if (coming) {
-		if (find_vc_with_status(CALL_STATUS_ACTIVE))
-			telephony_call_waiting_ind(coming->number,
-						number_type(coming->number));
-		else
-			telephony_incoming_call_ind(coming->number,
-						number_type(coming->number));
-	}
-}
-
-void telephony_device_disconnected(void *telephony_device)
-{
-	DBG("telephony-ofono: device %p disconnected", telephony_device);
-	events_enabled = FALSE;
-}
-
-void telephony_event_reporting_req(void *telephony_device, int ind)
-{
-	events_enabled = ind == 1 ? TRUE : FALSE;
-
-	telephony_event_reporting_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_response_and_hold_req(void *telephony_device, int rh)
-{
-	telephony_response_and_hold_rsp(telephony_device,
-						CME_ERROR_NOT_SUPPORTED);
-}
-
-void telephony_last_dialed_number_req(void *telephony_device)
-{
-	DBG("telephony-ofono: last dialed number request");
-
-	if (last_dialed_number)
-		telephony_dial_number_req(telephony_device, last_dialed_number);
-	else
-		telephony_last_dialed_number_rsp(telephony_device,
-				CME_ERROR_NOT_ALLOWED);
-}
-
-static int send_method_call(const char *dest, const char *path,
-                                const char *interface, const char *method,
-                                DBusPendingCallNotifyFunction cb,
-                                void *user_data, int type, ...)
-{
-	DBusConnection *conn = btd_get_dbus_connection();
-	DBusMessage *msg;
-	DBusPendingCall *call;
-	va_list args;
-
-	msg = dbus_message_new_method_call(dest, path, interface, method);
-	if (!msg) {
-		error("Unable to allocate new D-Bus %s message", method);
-		return -ENOMEM;
-	}
-
-	va_start(args, type);
-
-	if (!dbus_message_append_args_valist(msg, type, args)) {
-		dbus_message_unref(msg);
-		va_end(args);
-		return -EIO;
-	}
-
-	va_end(args);
-
-	if (!cb) {
-		g_dbus_send_message(conn, msg);
-		return 0;
-	}
-
-	if (!dbus_connection_send_with_reply(conn, msg, &call, -1)) {
-		error("Sending %s failed", method);
-		dbus_message_unref(msg);
-		return -EIO;
-	}
-
-	dbus_pending_call_set_notify(call, cb, user_data, NULL);
-	pending = g_slist_prepend(pending, call);
-	dbus_message_unref(msg);
-
-	return 0;
-}
-
-static int answer_call(struct voice_call *vc)
-{
-	DBG("%s", vc->number);
-	return send_method_call(OFONO_BUS_NAME, vc->obj_path,
-						OFONO_VC_INTERFACE, "Answer",
-						NULL, NULL, DBUS_TYPE_INVALID);
-}
-
-static int release_call(struct voice_call *vc)
-{
-	DBG("%s", vc->number);
-	return send_method_call(OFONO_BUS_NAME, vc->obj_path,
-						OFONO_VC_INTERFACE, "Hangup",
-						NULL, NULL, DBUS_TYPE_INVALID);
-}
-
-static int release_answer_calls(void)
-{
-	DBG("");
-	return send_method_call(OFONO_BUS_NAME, modem_obj_path,
-						OFONO_VCMANAGER_INTERFACE,
-						"ReleaseAndAnswer",
-						NULL, NULL, DBUS_TYPE_INVALID);
-}
-
-static int split_call(struct voice_call *call)
-{
-	DBG("%s", call->number);
-	return send_method_call(OFONO_BUS_NAME, modem_obj_path,
-						OFONO_VCMANAGER_INTERFACE,
-						"PrivateChat",
-						NULL, NULL,
-						DBUS_TYPE_OBJECT_PATH,
-						call->obj_path,
-						DBUS_TYPE_INVALID);
-	return -1;
-}
-
-static int swap_calls(void)
-{
-	DBG("");
-	return send_method_call(OFONO_BUS_NAME, modem_obj_path,
-						OFONO_VCMANAGER_INTERFACE,
-						"SwapCalls",
-						NULL, NULL, DBUS_TYPE_INVALID);
-}
-
-static int create_conference(void)
-{
-	DBG("");
-	return send_method_call(OFONO_BUS_NAME, modem_obj_path,
-						OFONO_VCMANAGER_INTERFACE,
-						"CreateMultiparty",
-						NULL, NULL, DBUS_TYPE_INVALID);
-}
-
-static int release_conference(void)
-{
-	DBG("");
-	return send_method_call(OFONO_BUS_NAME, modem_obj_path,
-						OFONO_VCMANAGER_INTERFACE,
-						"HangupMultiparty",
-						NULL, NULL, DBUS_TYPE_INVALID);
-}
-
-static int call_transfer(void)
-{
-	DBG("");
-	return send_method_call(OFONO_BUS_NAME, modem_obj_path,
-						OFONO_VCMANAGER_INTERFACE,
-						"Transfer",
-						NULL, NULL, DBUS_TYPE_INVALID);
-}
-
-void telephony_terminate_call_req(void *telephony_device)
-{
-	struct voice_call *call;
-	struct voice_call *alerting;
-	int err;
-
-	call = find_vc_with_status(CALL_STATUS_ACTIVE);
-	if (!call)
-		call = calls->data;
-
-	if (!call) {
-		error("No active call");
-		telephony_terminate_call_rsp(telephony_device,
-						CME_ERROR_NOT_ALLOWED);
-		return;
-	}
-
-	alerting = find_vc_with_status(CALL_STATUS_ALERTING);
-	if (call->status == CALL_STATUS_HELD && alerting)
-		err = release_call(alerting);
-	else if (call->conference)
-		err = release_conference();
-	else
-		err = release_call(call);
-
-	if (err < 0)
-		telephony_terminate_call_rsp(telephony_device,
-						CME_ERROR_AG_FAILURE);
-	else
-		telephony_terminate_call_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_answer_call_req(void *telephony_device)
-{
-	struct voice_call *vc;
-	int ret;
-
-	vc = find_vc_with_status(CALL_STATUS_INCOMING);
-	if (!vc)
-		vc = find_vc_with_status(CALL_STATUS_ALERTING);
-
-	if (!vc)
-		vc = find_vc_with_status(CALL_STATUS_WAITING);
-
-	if (!vc) {
-		telephony_answer_call_rsp(telephony_device,
-					CME_ERROR_NOT_ALLOWED);
-		return;
-	}
-
-	ret = answer_call(vc);
-	if (ret < 0) {
-		telephony_answer_call_rsp(telephony_device,
-					CME_ERROR_AG_FAILURE);
-		return;
-	}
-
-	telephony_answer_call_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_dial_number_req(void *telephony_device, const char *number)
-{
-	const char *clir;
-	int ret;
-
-	DBG("telephony-ofono: dial request to %s", number);
-
-	if (!modem_obj_path) {
-		telephony_dial_number_rsp(telephony_device,
-					CME_ERROR_AG_FAILURE);
-		return;
-	}
-
-	if (!strncmp(number, "*31#", 4)) {
-		number += 4;
-		clir = "enabled";
-	} else if (!strncmp(number, "#31#", 4)) {
-		number += 4;
-		clir =  "disabled";
-	} else
-		clir = "default";
-
-	ret = send_method_call(OFONO_BUS_NAME, modem_obj_path,
-			OFONO_VCMANAGER_INTERFACE,
-                        "Dial", NULL, NULL,
-			DBUS_TYPE_STRING, &number,
-			DBUS_TYPE_STRING, &clir,
-			DBUS_TYPE_INVALID);
-
-	if (ret < 0)
-		telephony_dial_number_rsp(telephony_device,
-			CME_ERROR_AG_FAILURE);
-	else
-		telephony_dial_number_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_transmit_dtmf_req(void *telephony_device, char tone)
-{
-	char *tone_string;
-	int ret;
-
-	DBG("telephony-ofono: transmit dtmf: %c", tone);
-
-	if (!modem_obj_path) {
-		telephony_transmit_dtmf_rsp(telephony_device,
-					CME_ERROR_AG_FAILURE);
-		return;
-	}
-
-	tone_string = g_strdup_printf("%c", tone);
-	ret = send_method_call(OFONO_BUS_NAME, modem_obj_path,
-			OFONO_VCMANAGER_INTERFACE,
-			"SendTones", NULL, NULL,
-			DBUS_TYPE_STRING, &tone_string,
-			DBUS_TYPE_INVALID);
-	g_free(tone_string);
-
-	if (ret < 0)
-		telephony_transmit_dtmf_rsp(telephony_device,
-			CME_ERROR_AG_FAILURE);
-	else
-		telephony_transmit_dtmf_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_subscriber_number_req(void *telephony_device)
-{
-	DBG("telephony-ofono: subscriber number request");
-
-	if (subscriber_number)
-		telephony_subscriber_number_ind(subscriber_number,
-						NUMBER_TYPE_TELEPHONY,
-						SUBSCRIBER_SERVICE_VOICE);
-	telephony_subscriber_number_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_list_current_calls_req(void *telephony_device)
-{
-	GSList *l;
-	int i;
-
-	DBG("telephony-ofono: list current calls request");
-
-	for (l = calls, i = 1; l != NULL; l = l->next, i++) {
-		struct voice_call *vc = l->data;
-		int direction, multiparty;
-
-		direction = vc->originating ?
-				CALL_DIR_OUTGOING : CALL_DIR_INCOMING;
-
-		multiparty = vc->conference ?
-				CALL_MULTIPARTY_YES : CALL_MULTIPARTY_NO;
-
-		DBG("call %s direction %d multiparty %d", vc->number,
-							direction, multiparty);
-
-		telephony_list_current_call_ind(i, direction, vc->status,
-					CALL_MODE_VOICE, multiparty,
-					vc->number, number_type(vc->number));
-	}
-
-	telephony_list_current_calls_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_operator_selection_req(void *telephony_device)
-{
-	DBG("telephony-ofono: operator selection request");
-
-	telephony_operator_selection_ind(OPERATOR_MODE_AUTO,
-				net.operator_name ? net.operator_name : "");
-	telephony_operator_selection_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-static void foreach_vc_with_status(int status,
-					int (*func)(struct voice_call *vc))
-{
-	GSList *l;
-
-	for (l = calls; l != NULL; l = l->next) {
-		struct voice_call *call = l->data;
-
-		if (call->status == status)
-			func(call);
-	}
-}
-
-void telephony_call_hold_req(void *telephony_device, const char *cmd)
-{
-	const char *idx;
-	struct voice_call *call;
-	int err = 0;
-
-	DBG("telephony-ofono: got call hold request %s", cmd);
-
-	if (strlen(cmd) > 1)
-		idx = &cmd[1];
-	else
-		idx = NULL;
-
-	if (idx)
-		call = g_slist_nth_data(calls, strtol(idx, NULL, 0) - 1);
-	else
-		call = NULL;
-
-	switch (cmd[0]) {
-	case '0':
-		if (find_vc_with_status(CALL_STATUS_WAITING))
-			foreach_vc_with_status(CALL_STATUS_WAITING,
-								release_call);
-		else
-			foreach_vc_with_status(CALL_STATUS_HELD, release_call);
-		break;
-	case '1':
-		if (idx) {
-			if (call)
-				err = release_call(call);
-			break;
-		}
-		err = release_answer_calls();
-		break;
-	case '2':
-		if (idx) {
-			if (call)
-				err = split_call(call);
-		} else {
-			call = find_vc_with_status(CALL_STATUS_WAITING);
-
-			if (call)
-				err = answer_call(call);
-			else
-				err = swap_calls();
-		}
-		break;
-	case '3':
-		if (find_vc_with_status(CALL_STATUS_HELD) ||
-				find_vc_with_status(CALL_STATUS_WAITING))
-			err = create_conference();
-		break;
-	case '4':
-		err = call_transfer();
-		break;
-	default:
-		DBG("Unknown call hold request");
-		break;
-	}
-
-	if (err)
-		telephony_call_hold_rsp(telephony_device,
-					CME_ERROR_AG_FAILURE);
-	else
-		telephony_call_hold_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_nr_and_ec_req(void *telephony_device, gboolean enable)
-{
-	DBG("telephony-ofono: got %s NR and EC request",
-			enable ? "enable" : "disable");
-
-	telephony_nr_and_ec_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_key_press_req(void *telephony_device, const char *keys)
-{
-	struct voice_call *active, *incoming;
-	int err;
-
-	DBG("telephony-ofono: got key press request for %s", keys);
-
-	incoming = find_vc_with_status(CALL_STATUS_INCOMING);
-
-	active = find_vc_with_status(CALL_STATUS_ACTIVE);
-
-	if (incoming)
-		err = answer_call(incoming);
-	else if (active)
-		err = release_call(active);
-	else
-		err = 0;
-
-	if (err < 0)
-		telephony_key_press_rsp(telephony_device,
-							CME_ERROR_AG_FAILURE);
-	else
-		telephony_key_press_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_voice_dial_req(void *telephony_device, gboolean enable)
-{
-	DBG("telephony-ofono: got %s voice dial request",
-			enable ? "enable" : "disable");
-
-	telephony_voice_dial_rsp(telephony_device, CME_ERROR_NOT_SUPPORTED);
-}
-
-static gboolean iter_get_basic_args(DBusMessageIter *iter,
-					int first_arg_type, ...)
-{
-	int type;
-	va_list ap;
-
-	va_start(ap, first_arg_type);
-
-	for (type = first_arg_type; type != DBUS_TYPE_INVALID;
-		type = va_arg(ap, int)) {
-		void *value = va_arg(ap, void *);
-		int real_type = dbus_message_iter_get_arg_type(iter);
-
-		if (real_type != type) {
-			error("iter_get_basic_args: expected %c but got %c",
-				(char) type, (char) real_type);
-			break;
-		}
-
-		dbus_message_iter_get_basic(iter, value);
-		dbus_message_iter_next(iter);
-	}
-
-	va_end(ap);
-
-	return type == DBUS_TYPE_INVALID ? TRUE : FALSE;
-}
-
-static void call_free(void *data)
-{
-	struct voice_call *vc = data;
-
-	DBG("%s", vc->obj_path);
-
-	if (vc->status == CALL_STATUS_ACTIVE)
-		telephony_update_indicator(ofono_indicators, "call",
-							EV_CALL_INACTIVE);
-	else
-		telephony_update_indicator(ofono_indicators, "callsetup",
-							EV_CALLSETUP_INACTIVE);
-
-	if (vc->status == CALL_STATUS_INCOMING)
-		telephony_calling_stopped_ind();
-
-	g_dbus_remove_watch(vc->watch);
-	g_free(vc->obj_path);
-	g_free(vc->number);
-	g_free(vc);
-}
-
-static gboolean handle_vc_property_changed(DBusConnection *conn,
-					DBusMessage *msg, void *data)
-{
-	struct voice_call *vc = data;
-	const char *obj_path = dbus_message_get_path(msg);
-	DBusMessageIter iter, sub;
-	const char *property, *state;
-
-	DBG("path %s", obj_path);
-
-	dbus_message_iter_init(msg, &iter);
-
-	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) {
-		error("Unexpected signature in vc PropertyChanged signal");
-		return TRUE;
-	}
-
-	dbus_message_iter_get_basic(&iter, &property);
-	DBG("property %s", property);
-
-	dbus_message_iter_next(&iter);
-	dbus_message_iter_recurse(&iter, &sub);
-	if (g_str_equal(property, "State")) {
-		dbus_message_iter_get_basic(&sub, &state);
-		DBG("State %s", state);
-		if (g_str_equal(state, "disconnected")) {
-			calls = g_slist_remove(calls, vc);
-			call_free(vc);
-		} else if (g_str_equal(state, "active")) {
-			telephony_update_indicator(ofono_indicators,
-							"call", EV_CALL_ACTIVE);
-			telephony_update_indicator(ofono_indicators,
-							"callsetup",
-							EV_CALLSETUP_INACTIVE);
-			if (vc->status == CALL_STATUS_INCOMING)
-				telephony_calling_stopped_ind();
-			vc->status = CALL_STATUS_ACTIVE;
-		} else if (g_str_equal(state, "alerting")) {
-			telephony_update_indicator(ofono_indicators,
-					"callsetup", EV_CALLSETUP_ALERTING);
-			vc->status = CALL_STATUS_ALERTING;
-			vc->originating = TRUE;
-		} else if (g_str_equal(state, "incoming")) {
-			/* state change from waiting to incoming */
-			telephony_update_indicator(ofono_indicators,
-					"callsetup", EV_CALLSETUP_INCOMING);
-			telephony_incoming_call_ind(vc->number,
-						NUMBER_TYPE_TELEPHONY);
-			vc->status = CALL_STATUS_INCOMING;
-			vc->originating = FALSE;
-		} else if (g_str_equal(state, "held")) {
-			vc->status = CALL_STATUS_HELD;
-			if (find_vc_without_status(CALL_STATUS_HELD))
-				telephony_update_indicator(ofono_indicators,
-							"callheld",
-							EV_CALLHELD_MULTIPLE);
-			else
-				telephony_update_indicator(ofono_indicators,
-							"callheld",
-							EV_CALLHELD_ON_HOLD);
-		}
-	} else if (g_str_equal(property, "Multiparty")) {
-		dbus_bool_t multiparty;
-
-		dbus_message_iter_get_basic(&sub, &multiparty);
-		DBG("Multiparty %s", multiparty ? "True" : "False");
-		vc->conference = multiparty;
-	}
-
-	return TRUE;
-}
-
-static struct voice_call *call_new(const char *path, DBusMessageIter *properties)
-{
-	struct voice_call *vc;
-
-	DBG("%s", path);
-
-	vc = g_new0(struct voice_call, 1);
-	vc->obj_path = g_strdup(path);
-	vc->watch = g_dbus_add_signal_watch(btd_get_dbus_connection(),
-					NULL, path,
-					OFONO_VC_INTERFACE, "PropertyChanged",
-					handle_vc_property_changed, vc, NULL);
-
-	while (dbus_message_iter_get_arg_type(properties)
-						== DBUS_TYPE_DICT_ENTRY) {
-		DBusMessageIter entry, value;
-		const char *property, *cli, *state;
-		dbus_bool_t multiparty;
-
-		dbus_message_iter_recurse(properties, &entry);
-		dbus_message_iter_get_basic(&entry, &property);
-
-		dbus_message_iter_next(&entry);
-		dbus_message_iter_recurse(&entry, &value);
-
-		if (g_str_equal(property, "LineIdentification")) {
-			dbus_message_iter_get_basic(&value, &cli);
-			DBG("cli %s", cli);
-			vc->number = g_strdup(cli);
-		} else if (g_str_equal(property, "State")) {
-			dbus_message_iter_get_basic(&value, &state);
-			DBG("state %s", state);
-			if (g_str_equal(state, "incoming"))
-				vc->status = CALL_STATUS_INCOMING;
-			else if (g_str_equal(state, "dialing"))
-				vc->status = CALL_STATUS_DIALING;
-			else if (g_str_equal(state, "alerting"))
-				vc->status = CALL_STATUS_ALERTING;
-			else if (g_str_equal(state, "waiting"))
-				vc->status = CALL_STATUS_WAITING;
-			else if (g_str_equal(state, "held"))
-				vc->status = CALL_STATUS_HELD;
-		} else if (g_str_equal(property, "Multiparty")) {
-			dbus_message_iter_get_basic(&value, &multiparty);
-			DBG("Multipary %s", multiparty ? "True" : "False");
-			vc->conference = multiparty;
-		}
-
-		dbus_message_iter_next(properties);
-	}
-
-	switch (vc->status) {
-	case CALL_STATUS_INCOMING:
-		DBG("CALL_STATUS_INCOMING");
-		vc->originating = FALSE;
-		telephony_update_indicator(ofono_indicators, "callsetup",
-					EV_CALLSETUP_INCOMING);
-		telephony_incoming_call_ind(vc->number, NUMBER_TYPE_TELEPHONY);
-		break;
-	case CALL_STATUS_DIALING:
-		DBG("CALL_STATUS_DIALING");
-		vc->originating = TRUE;
-		g_free(last_dialed_number);
-		last_dialed_number = g_strdup(vc->number);
-		telephony_update_indicator(ofono_indicators, "callsetup",
-					EV_CALLSETUP_OUTGOING);
-		break;
-	case CALL_STATUS_ALERTING:
-		DBG("CALL_STATUS_ALERTING");
-		vc->originating = TRUE;
-		g_free(last_dialed_number);
-		last_dialed_number = g_strdup(vc->number);
-		telephony_update_indicator(ofono_indicators, "callsetup",
-					EV_CALLSETUP_ALERTING);
-		break;
-	case CALL_STATUS_WAITING:
-		DBG("CALL_STATUS_WAITING");
-		vc->originating = FALSE;
-		telephony_update_indicator(ofono_indicators, "callsetup",
-					EV_CALLSETUP_INCOMING);
-		telephony_call_waiting_ind(vc->number, NUMBER_TYPE_TELEPHONY);
-		break;
-	}
-
-	return vc;
-}
-
-static void remove_pending(DBusPendingCall *call)
-{
-	pending = g_slist_remove(pending, call);
-	dbus_pending_call_unref(call);
-}
-
-static void call_added(const char *path, DBusMessageIter *properties)
-{
-	struct voice_call *vc;
-
-	DBG("%s", path);
-
-	vc = find_vc(path);
-	if (vc)
-		return;
-
-	vc = call_new(path, properties);
-	calls = g_slist_prepend(calls, vc);
-}
-
-static void get_calls_reply(DBusPendingCall *call, void *user_data)
-{
-	DBusError err;
-	DBusMessage *reply;
-	DBusMessageIter iter, entry;
-
-	DBG("");
-	reply = dbus_pending_call_steal_reply(call);
-
-	dbus_error_init(&err);
-	if (dbus_set_error_from_message(&err, reply)) {
-		error("ofono replied with an error: %s, %s",
-				err.name, err.message);
-		dbus_error_free(&err);
-		goto done;
-	}
-
-	dbus_message_iter_init(reply, &iter);
-
-	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY) {
-		error("Unexpected signature");
-		goto done;
-	}
-
-	dbus_message_iter_recurse(&iter, &entry);
-
-	while (dbus_message_iter_get_arg_type(&entry)
-						== DBUS_TYPE_STRUCT) {
-		const char *path;
-		DBusMessageIter value, properties;
-
-		dbus_message_iter_recurse(&entry, &value);
-		dbus_message_iter_get_basic(&value, &path);
-
-		dbus_message_iter_next(&value);
-		dbus_message_iter_recurse(&value, &properties);
-
-		call_added(path, &properties);
-
-		dbus_message_iter_next(&entry);
-	}
-
-done:
-	dbus_message_unref(reply);
-	remove_pending(call);
-}
-
-static void handle_network_property(const char *property, DBusMessageIter *variant)
-{
-	const char *status, *operator;
-	unsigned int signals_bar;
-
-	if (g_str_equal(property, "Status")) {
-		dbus_message_iter_get_basic(variant, &status);
-		DBG("Status is %s", status);
-		if (g_str_equal(status, "registered")) {
-			net.status = NETWORK_REG_STATUS_HOME;
-			telephony_update_indicator(ofono_indicators,
-						"roam", EV_ROAM_INACTIVE);
-			telephony_update_indicator(ofono_indicators,
-						"service", EV_SERVICE_PRESENT);
-		} else if (g_str_equal(status, "roaming")) {
-			net.status = NETWORK_REG_STATUS_ROAM;
-			telephony_update_indicator(ofono_indicators,
-						"roam", EV_ROAM_ACTIVE);
-			telephony_update_indicator(ofono_indicators,
-						"service", EV_SERVICE_PRESENT);
-		} else {
-			net.status = NETWORK_REG_STATUS_NOSERV;
-			telephony_update_indicator(ofono_indicators,
-						"roam", EV_ROAM_INACTIVE);
-			telephony_update_indicator(ofono_indicators,
-						"service", EV_SERVICE_NONE);
-		}
-	} else if (g_str_equal(property, "Name")) {
-		dbus_message_iter_get_basic(variant, &operator);
-		DBG("Operator is %s", operator);
-		g_free(net.operator_name);
-		net.operator_name = g_strdup(operator);
-	} else if (g_str_equal(property, "SignalStrength")) {
-		dbus_message_iter_get_basic(variant, &signals_bar);
-		DBG("SignalStrength is %d", signals_bar);
-		net.signals_bar = signals_bar;
-		telephony_update_indicator(ofono_indicators, "signal",
-						(signals_bar + 20) / 21);
-	}
-}
-
-static int parse_network_properties(DBusMessageIter *properties)
-{
-	int i;
-
-	/* Reset indicators */
-	for (i = 0; ofono_indicators[i].desc != NULL; i++) {
-		if (g_str_equal(ofono_indicators[i].desc, "battchg"))
-			ofono_indicators[i].val = 5;
-		else
-			ofono_indicators[i].val = 0;
-	}
-
-	while (dbus_message_iter_get_arg_type(properties)
-						== DBUS_TYPE_DICT_ENTRY) {
-		const char *key;
-		DBusMessageIter value, entry;
-
-		dbus_message_iter_recurse(properties, &entry);
-		dbus_message_iter_get_basic(&entry, &key);
-
-		dbus_message_iter_next(&entry);
-		dbus_message_iter_recurse(&entry, &value);
-
-		handle_network_property(key, &value);
-
-		dbus_message_iter_next(properties);
-	}
-
-	return 0;
-}
-
-static void get_properties_reply(DBusPendingCall *call, void *user_data)
-{
-	DBusError err;
-	DBusMessage *reply;
-	DBusMessageIter iter, properties;
-	int ret = 0;
-
-	DBG("");
-	reply = dbus_pending_call_steal_reply(call);
-
-	dbus_error_init(&err);
-	if (dbus_set_error_from_message(&err, reply)) {
-		error("ofono replied with an error: %s, %s",
-				err.name, err.message);
-		dbus_error_free(&err);
-		goto done;
-	}
-
-	dbus_message_iter_init(reply, &iter);
-
-	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY) {
-		error("Unexpected signature");
-		goto done;
-	}
-
-	dbus_message_iter_recurse(&iter, &properties);
-
-	ret = parse_network_properties(&properties);
-	if (ret < 0) {
-		error("Unable to parse %s.GetProperty reply",
-						OFONO_NETWORKREG_INTERFACE);
-		goto done;
-	}
-
-	ret = send_method_call(OFONO_BUS_NAME, modem_obj_path,
-				OFONO_VCMANAGER_INTERFACE, "GetCalls",
-				get_calls_reply, NULL, DBUS_TYPE_INVALID);
-	if (ret < 0)
-		error("Unable to send %s.GetCalls",
-						OFONO_VCMANAGER_INTERFACE);
-
-done:
-	dbus_message_unref(reply);
-	remove_pending(call);
-}
-
-static void network_found(const char *path)
-{
-	int ret;
-
-	DBG("%s", path);
-
-	modem_obj_path = g_strdup(path);
-
-	ret = send_method_call(OFONO_BUS_NAME, path,
-				OFONO_NETWORKREG_INTERFACE, "GetProperties",
-				get_properties_reply, NULL, DBUS_TYPE_INVALID);
-	if (ret < 0)
-		error("Unable to send %s.GetProperties",
-						OFONO_NETWORKREG_INTERFACE);
-}
-
-static void modem_removed(const char *path)
-{
-	if (g_strcmp0(modem_obj_path, path) != 0)
-		return;
-
-	DBG("%s", path);
-
-	g_slist_free_full(calls, call_free);
-	calls = NULL;
-
-	g_free(net.operator_name);
-	net.operator_name = NULL;
-	net.status = NETWORK_REG_STATUS_NOSERV;
-	net.signals_bar = 0;
-
-	g_free(modem_obj_path);
-	modem_obj_path = NULL;
-}
-
-static void parse_modem_interfaces(const char *path, DBusMessageIter *ifaces)
-{
-	DBG("%s", path);
-
-	while (dbus_message_iter_get_arg_type(ifaces) == DBUS_TYPE_STRING) {
-		const char *iface;
-
-		dbus_message_iter_get_basic(ifaces, &iface);
-
-		if (g_str_equal(iface, OFONO_NETWORKREG_INTERFACE)) {
-			network_found(path);
-			return;
-		}
-
-		dbus_message_iter_next(ifaces);
-	}
-
-	modem_removed(path);
-}
-
-static void modem_added(const char *path, DBusMessageIter *properties)
-{
-	if (modem_obj_path != NULL) {
-		DBG("Ignoring, modem already exist");
-		return;
-	}
-
-	DBG("%s", path);
-
-	while (dbus_message_iter_get_arg_type(properties)
-						== DBUS_TYPE_DICT_ENTRY) {
-		const char *key;
-		DBusMessageIter interfaces, value, entry;
-
-		dbus_message_iter_recurse(properties, &entry);
-		dbus_message_iter_get_basic(&entry, &key);
-
-		dbus_message_iter_next(&entry);
-		dbus_message_iter_recurse(&entry, &value);
-
-		if (strcasecmp(key, "Interfaces") != 0)
-			goto next;
-
-		if (dbus_message_iter_get_arg_type(&value)
-							!= DBUS_TYPE_ARRAY) {
-			error("Invalid Signature");
-			return;
-		}
-
-		dbus_message_iter_recurse(&value, &interfaces);
-
-		parse_modem_interfaces(path, &interfaces);
-
-		if (modem_obj_path != NULL)
-			return;
-
-	next:
-		dbus_message_iter_next(properties);
-	}
-}
-
-static void get_modems_reply(DBusPendingCall *call, void *user_data)
-{
-	DBusError err;
-	DBusMessage *reply;
-	DBusMessageIter iter, entry;
-
-	DBG("");
-	reply = dbus_pending_call_steal_reply(call);
-
-	dbus_error_init(&err);
-	if (dbus_set_error_from_message(&err, reply)) {
-		error("ofono replied with an error: %s, %s",
-				err.name, err.message);
-		dbus_error_free(&err);
-		goto done;
-	}
-
-	/* Skip modem selection if a modem already exist */
-	if (modem_obj_path != NULL)
-		goto done;
-
-	dbus_message_iter_init(reply, &iter);
-
-	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY) {
-		error("Unexpected signature");
-		goto done;
-	}
-
-	dbus_message_iter_recurse(&iter, &entry);
-
-	while (dbus_message_iter_get_arg_type(&entry)
-						== DBUS_TYPE_STRUCT) {
-		const char *path;
-		DBusMessageIter item, properties;
-
-		dbus_message_iter_recurse(&entry, &item);
-		dbus_message_iter_get_basic(&item, &path);
-
-		dbus_message_iter_next(&item);
-		dbus_message_iter_recurse(&item, &properties);
-
-		modem_added(path, &properties);
-		if (modem_obj_path != NULL)
-			break;
-
-		dbus_message_iter_next(&entry);
-	}
-
-done:
-	dbus_message_unref(reply);
-	remove_pending(call);
-}
-
-static gboolean handle_network_property_changed(DBusConnection *conn,
-						DBusMessage *msg, void *data)
-{
-	DBusMessageIter iter, variant;
-	const char *property;
-
-	dbus_message_iter_init(msg, &iter);
-
-	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) {
-		error("Unexpected signature in networkregistration"
-					" PropertyChanged signal");
-		return TRUE;
-	}
-	dbus_message_iter_get_basic(&iter, &property);
-	DBG("in handle_registration_property_changed(),"
-					" the property is %s", property);
-
-	dbus_message_iter_next(&iter);
-	dbus_message_iter_recurse(&iter, &variant);
-
-	handle_network_property(property, &variant);
-
-	return TRUE;
-}
-
-static void handle_modem_property(const char *path, const char *property,
-						DBusMessageIter *variant)
-{
-	DBG("%s", property);
-
-	if (g_str_equal(property, "Interfaces")) {
-		DBusMessageIter interfaces;
-
-		if (dbus_message_iter_get_arg_type(variant)
-							!= DBUS_TYPE_ARRAY) {
-			error("Invalid signature");
-			return;
-		}
-
-		dbus_message_iter_recurse(variant, &interfaces);
-		parse_modem_interfaces(path, &interfaces);
-	}
-}
-
-static gboolean handle_modem_property_changed(DBusConnection *conn,
-						DBusMessage *msg, void *data)
-{
-	DBusMessageIter iter, variant;
-	const char *property, *path;
-
-	path = dbus_message_get_path(msg);
-
-	/* Ignore if modem already exist and paths doesn't match */
-	if (modem_obj_path != NULL &&
-				g_str_equal(path, modem_obj_path) == FALSE)
-		return TRUE;
-
-	dbus_message_iter_init(msg, &iter);
-
-	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) {
-		error("Unexpected signature in %s.%s PropertyChanged signal",
-					dbus_message_get_interface(msg),
-					dbus_message_get_member(msg));
-		return TRUE;
-	}
-
-	dbus_message_iter_get_basic(&iter, &property);
-
-	dbus_message_iter_next(&iter);
-	dbus_message_iter_recurse(&iter, &variant);
-
-	handle_modem_property(path, property, &variant);
-
-	return TRUE;
-}
-
-static gboolean handle_vcmanager_call_added(DBusConnection *conn,
-						DBusMessage *msg, void *data)
-{
-	DBusMessageIter iter, properties;
-	const char *path = dbus_message_get_path(msg);
-
-	/* Ignore call if modem path doesn't math */
-	if (g_strcmp0(modem_obj_path, path) != 0)
-		return TRUE;
-
-	dbus_message_iter_init(msg, &iter);
-
-	if (dbus_message_iter_get_arg_type(&iter)
-						!= DBUS_TYPE_OBJECT_PATH) {
-		error("Unexpected signature in %s.%s signal",
-					dbus_message_get_interface(msg),
-					dbus_message_get_member(msg));
-		return TRUE;
-	}
-
-	dbus_message_iter_get_basic(&iter, &path);
-	dbus_message_iter_next(&iter);
-	dbus_message_iter_recurse(&iter, &properties);
-
-	call_added(path, &properties);
-
-	return TRUE;
-}
-
-static void call_removed(const char *path)
-{
-	struct voice_call *vc;
-
-	DBG("%s", path);
-
-	vc = find_vc(path);
-	if (vc == NULL)
-		return;
-
-	calls = g_slist_remove(calls, vc);
-	call_free(vc);
-}
-
-static gboolean handle_vcmanager_call_removed(DBusConnection *conn,
-						DBusMessage *msg, void *data)
-{
-	const char *path = dbus_message_get_path(msg);
-
-	/* Ignore call if modem path doesn't math */
-	if (g_strcmp0(modem_obj_path, path) != 0)
-		return TRUE;
-
-	if (!dbus_message_get_args(msg, NULL,
-				DBUS_TYPE_OBJECT_PATH, &path,
-				DBUS_TYPE_INVALID)) {
-		error("Unexpected signature in %s.%s signal",
-					dbus_message_get_interface(msg),
-					dbus_message_get_member(msg));
-		return TRUE;
-	}
-
-	call_removed(path);
-
-	return TRUE;
-}
-
-static gboolean handle_manager_modem_added(DBusConnection *conn,
-						DBusMessage *msg, void *data)
-{
-	DBusMessageIter iter, properties;
-	const char *path;
-
-	if (modem_obj_path != NULL)
-		return TRUE;
-
-	dbus_message_iter_init(msg, &iter);
-
-	if (dbus_message_iter_get_arg_type(&iter)
-						!= DBUS_TYPE_OBJECT_PATH) {
-		error("Unexpected signature in %s.%s signal",
-					dbus_message_get_interface(msg),
-					dbus_message_get_member(msg));
-		return TRUE;
-	}
-
-	dbus_message_iter_get_basic(&iter, &path);
-	dbus_message_iter_next(&iter);
-	dbus_message_iter_recurse(&iter, &properties);
-
-	modem_added(path, &properties);
-
-	return TRUE;
-}
-
-static gboolean handle_manager_modem_removed(DBusConnection *conn,
-						DBusMessage *msg, void *data)
-{
-	const char *path;
-
-	if (!dbus_message_get_args(msg, NULL,
-				DBUS_TYPE_OBJECT_PATH, &path,
-				DBUS_TYPE_INVALID)) {
-		error("Unexpected signature in %s.%s signal",
-					dbus_message_get_interface(msg),
-					dbus_message_get_member(msg));
-		return TRUE;
-	}
-
-	modem_removed(path);
-
-	return TRUE;
-}
-
-static void hal_battery_level_reply(DBusPendingCall *call, void *user_data)
-{
-	DBusMessage *reply;
-	DBusError err;
-	dbus_int32_t level;
-	int *value = user_data;
-
-	reply = dbus_pending_call_steal_reply(call);
-
-	dbus_error_init(&err);
-	if (dbus_set_error_from_message(&err, reply)) {
-		error("hald replied with an error: %s, %s",
-				err.name, err.message);
-		dbus_error_free(&err);
-		goto done;
-	}
-
-	dbus_error_init(&err);
-	if (dbus_message_get_args(reply, &err,
-				DBUS_TYPE_INT32, &level,
-				DBUS_TYPE_INVALID) == FALSE) {
-		error("Unable to parse GetPropertyInteger reply: %s, %s",
-							err.name, err.message);
-		dbus_error_free(&err);
-		goto done;
-	}
-
-	*value = (int) level;
-
-	if (value == &battchg_last)
-		DBG("telephony-ofono: battery.charge_level.last_full"
-					" is %d", *value);
-	else if (value == &battchg_design)
-		DBG("telephony-ofono: battery.charge_level.design"
-					" is %d", *value);
-	else
-		DBG("telephony-ofono: battery.charge_level.current"
-					" is %d", *value);
-
-	if ((battchg_design > 0 || battchg_last > 0) && battchg_cur >= 0) {
-		int new, max;
-
-		if (battchg_last > 0)
-			max = battchg_last;
-		else
-			max = battchg_design;
-
-		new = battchg_cur * 5 / max;
-
-		telephony_update_indicator(ofono_indicators, "battchg", new);
-	}
-done:
-	dbus_message_unref(reply);
-	remove_pending(call);
-}
-
-static void hal_get_integer(const char *path, const char *key, void *user_data)
-{
-	send_method_call("org.freedesktop.Hal", path,
-			"org.freedesktop.Hal.Device",
-			"GetPropertyInteger",
-			hal_battery_level_reply, user_data,
-			DBUS_TYPE_STRING, &key,
-			DBUS_TYPE_INVALID);
-}
-
-static gboolean handle_hal_property_modified(DBusConnection *conn,
-						DBusMessage *msg, void *data)
-{
-	const char *path;
-	DBusMessageIter iter, array;
-	dbus_int32_t num_changes;
-
-	path = dbus_message_get_path(msg);
-
-	dbus_message_iter_init(msg, &iter);
-
-	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) {
-		error("Unexpected signature in hal PropertyModified signal");
-		return TRUE;
-	}
-
-	dbus_message_iter_get_basic(&iter, &num_changes);
-	dbus_message_iter_next(&iter);
-
-	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY) {
-		error("Unexpected signature in hal PropertyModified signal");
-		return TRUE;
-	}
-
-	dbus_message_iter_recurse(&iter, &array);
-
-	while (dbus_message_iter_get_arg_type(&array) != DBUS_TYPE_INVALID) {
-		DBusMessageIter prop;
-		const char *name;
-		dbus_bool_t added, removed;
-
-		dbus_message_iter_recurse(&array, &prop);
-
-		if (!iter_get_basic_args(&prop,
-					DBUS_TYPE_STRING, &name,
-					DBUS_TYPE_BOOLEAN, &added,
-					DBUS_TYPE_BOOLEAN, &removed,
-					DBUS_TYPE_INVALID)) {
-			error("Invalid hal PropertyModified parameters");
-			break;
-		}
-
-		if (g_str_equal(name, "battery.charge_level.last_full"))
-			hal_get_integer(path, name, &battchg_last);
-		else if (g_str_equal(name, "battery.charge_level.current"))
-			hal_get_integer(path, name, &battchg_cur);
-		else if (g_str_equal(name, "battery.charge_level.design"))
-			hal_get_integer(path, name, &battchg_design);
-
-		dbus_message_iter_next(&array);
-	}
-
-	return TRUE;
-}
-
-static void add_watch(const char *sender, const char *path,
-				const char *interface, const char *member,
-				GDBusSignalFunction function)
-{
-	guint watch;
-
-	watch = g_dbus_add_signal_watch(btd_get_dbus_connection(),
-					sender, path, interface,
-					member, function, NULL, NULL);
-
-	watches = g_slist_prepend(watches, GUINT_TO_POINTER(watch));
-}
-
-static void hal_find_device_reply(DBusPendingCall *call, void *user_data)
-{
-	DBusMessage *reply;
-	DBusError err;
-	DBusMessageIter iter, sub;
-	int type;
-	const char *path;
-
-	DBG("begin of hal_find_device_reply()");
-	reply = dbus_pending_call_steal_reply(call);
-
-	dbus_error_init(&err);
-
-	if (dbus_set_error_from_message(&err, reply)) {
-		error("hald replied with an error: %s, %s",
-				err.name, err.message);
-		dbus_error_free(&err);
-		goto done;
-	}
-
-	dbus_message_iter_init(reply, &iter);
-
-	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY) {
-		error("Unexpected signature in hal_find_device_reply()");
-		goto done;
-	}
-
-	dbus_message_iter_recurse(&iter, &sub);
-
-	type = dbus_message_iter_get_arg_type(&sub);
-
-	if (type != DBUS_TYPE_OBJECT_PATH && type != DBUS_TYPE_STRING) {
-		error("No hal device with battery capability found");
-		goto done;
-	}
-
-	dbus_message_iter_get_basic(&sub, &path);
-
-	DBG("telephony-ofono: found battery device at %s", path);
-
-	add_watch(NULL, path, "org.freedesktop.Hal.Device",
-			"PropertyModified", handle_hal_property_modified);
-
-	hal_get_integer(path, "battery.charge_level.last_full", &battchg_last);
-	hal_get_integer(path, "battery.charge_level.current", &battchg_cur);
-	hal_get_integer(path, "battery.charge_level.design", &battchg_design);
-done:
-	dbus_message_unref(reply);
-	remove_pending(call);
-}
-
-static void handle_service_connect(DBusConnection *conn, void *user_data)
-{
-	DBG("telephony-ofono: %s found", OFONO_BUS_NAME);
-
-	send_method_call(OFONO_BUS_NAME, OFONO_PATH,
-				OFONO_MANAGER_INTERFACE, "GetModems",
-				get_modems_reply, NULL, DBUS_TYPE_INVALID);
-}
-
-static void handle_service_disconnect(DBusConnection *conn, void *user_data)
-{
-	DBG("telephony-ofono: %s exitted", OFONO_BUS_NAME);
-
-	if (modem_obj_path)
-		modem_removed(modem_obj_path);
-}
-
-int telephony_init(void)
-{
-	uint32_t features = AG_FEATURE_EC_ANDOR_NR |
-				AG_FEATURE_INBAND_RINGTONE |
-				AG_FEATURE_REJECT_A_CALL |
-				AG_FEATURE_ENHANCED_CALL_STATUS |
-				AG_FEATURE_ENHANCED_CALL_CONTROL |
-				AG_FEATURE_EXTENDED_ERROR_RESULT_CODES |
-				AG_FEATURE_THREE_WAY_CALLING;
-	const char *battery_cap = "battery";
-	int ret;
-	guint watch;
-
-	add_watch(OFONO_BUS_NAME, NULL, OFONO_MODEM_INTERFACE,
-			"PropertyChanged", handle_modem_property_changed);
-	add_watch(OFONO_BUS_NAME, NULL, OFONO_NETWORKREG_INTERFACE,
-			"PropertyChanged", handle_network_property_changed);
-	add_watch(OFONO_BUS_NAME, NULL, OFONO_MANAGER_INTERFACE,
-			"ModemAdded", handle_manager_modem_added);
-	add_watch(OFONO_BUS_NAME, NULL, OFONO_MANAGER_INTERFACE,
-			"ModemRemoved", handle_manager_modem_removed);
-	add_watch(OFONO_BUS_NAME, NULL, OFONO_VCMANAGER_INTERFACE,
-			"CallAdded", handle_vcmanager_call_added);
-	add_watch(OFONO_BUS_NAME, NULL, OFONO_VCMANAGER_INTERFACE,
-			"CallRemoved", handle_vcmanager_call_removed);
-
-	watch = g_dbus_add_service_watch(btd_get_dbus_connection(),
-						OFONO_BUS_NAME,
-						handle_service_connect,
-						handle_service_disconnect,
-						NULL, NULL);
-	if (watch == 0)
-		return -ENOMEM;
-
-	watches = g_slist_prepend(watches, GUINT_TO_POINTER(watch));
-
-	ret = send_method_call("org.freedesktop.Hal",
-				"/org/freedesktop/Hal/Manager",
-				"org.freedesktop.Hal.Manager",
-				"FindDeviceByCapability",
-				hal_find_device_reply, NULL,
-				DBUS_TYPE_STRING, &battery_cap,
-				DBUS_TYPE_INVALID);
-	if (ret < 0)
-		return ret;
-
-	DBG("telephony_init() successfully");
-
-	telephony_ready_ind(features, ofono_indicators, BTRH_NOT_SUPPORTED,
-								chld_str);
-
-	return ret;
-}
-
-static void remove_watch(gpointer data)
-{
-	g_dbus_remove_watch(GPOINTER_TO_UINT(data));
-}
-
-static void pending_free(void *data)
-{
-	DBusPendingCall *call = data;
-
-	if (!dbus_pending_call_get_completed(call))
-		dbus_pending_call_cancel(call);
-
-	dbus_pending_call_unref(call);
-}
-
-void telephony_exit(void)
-{
-	DBG("");
-
-	g_free(last_dialed_number);
-	last_dialed_number = NULL;
-
-	if (modem_obj_path)
-		modem_removed(modem_obj_path);
-
-	g_slist_free_full(watches, remove_watch);
-	watches = NULL;
-
-	g_slist_free_full(pending, pending_free);
-	pending = NULL;
-
-	telephony_deinit();
-}
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH BlueZ 07/13] build: Remove telephony-dummy.c
  2012-11-13 13:21 [PATCH BlueZ 00/13] Remove HFP implementation Luiz Augusto von Dentz
                   ` (8 preceding siblings ...)
  2012-11-13 13:21 ` [PATCH BlueZ 06/13] build: Remove telephony-ofono.c Luiz Augusto von Dentz
@ 2012-11-13 13:21 ` Luiz Augusto von Dentz
  2012-11-13 13:21 ` [PATCH BlueZ 08/13] build: Remove telephony.h Luiz Augusto von Dentz
                   ` (6 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Luiz Augusto von Dentz @ 2012-11-13 13:21 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

---
 Makefile.am             |  10 +-
 audio/telephony-dummy.c | 444 ------------------------------------------------
 2 files changed, 1 insertion(+), 453 deletions(-)
 delete mode 100644 audio/telephony-dummy.c

diff --git a/Makefile.am b/Makefile.am
index 84566c8..ad2e27a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -121,11 +121,6 @@ builtin_sources += audio/main.c \
 			audio/transport.h audio/transport.c \
 			audio/player.h audio/player.c \
 			audio/telephony.h audio/a2dp-codecs.h
-builtin_nodist += audio/telephony.c
-
-noinst_LIBRARIES += audio/libtelephony.a
-
-audio_libtelephony_a_SOURCES = audio/telephony.h audio/telephony-dummy.c
 endif
 
 if SAPPLUGIN
@@ -312,7 +307,7 @@ endif
 EXTRA_DIST += src/genbuiltin src/bluetooth.conf src/org.bluez.service \
 			src/main.conf profiles/network/network.conf \
 			profiles/input/input.conf profiles/proximity/proximity.conf \
-			audio/audio.conf audio/telephony-dummy.c \
+			audio/audio.conf \
 			profiles/sap/sap-dummy.c profiles/sap/sap-u8500.c
 
 include Makefile.tools
@@ -398,9 +393,6 @@ MAINTAINERCLEANFILES = Makefile.in \
 src/builtin.h: src/genbuiltin $(builtin_sources)
 	$(AM_V_GEN)$(srcdir)/src/genbuiltin $(builtin_modules) > $@
 
-audio/telephony.c: audio/@TELEPHONY_DRIVER@
-	$(AM_V_GEN)$(LN_S) $(abs_top_builddir)/$< $@
-
 profiles/sap/sap.c: profiles/sap/@SAP_DRIVER@
 	$(AM_V_GEN)$(LN_S) $(abs_top_srcdir)/$< $@
 
diff --git a/audio/telephony-dummy.c b/audio/telephony-dummy.c
deleted file mode 100644
index d1bbfd5..0000000
--- a/audio/telephony-dummy.c
+++ /dev/null
@@ -1,444 +0,0 @@
-/*
- *
- *  BlueZ - Bluetooth protocol stack for Linux
- *
- *  Copyright (C) 2006-2010  Nokia Corporation
- *  Copyright (C) 2004-2010  Marcel Holtmann <marcel@holtmann.org>
- *
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <glib.h>
-#include <dbus/dbus.h>
-#include <gdbus.h>
-
-#include "dbus-common.h"
-#include "log.h"
-#include "telephony.h"
-#include "error.h"
-
-#define TELEPHONY_DUMMY_IFACE "org.bluez.TelephonyTest"
-#define TELEPHONY_DUMMY_PATH "/org/bluez/test"
-
-static const char *chld_str = "0,1,1x,2,2x,3,4";
-static char *subscriber_number = NULL;
-static char *active_call_number = NULL;
-static int active_call_status = 0;
-static int active_call_dir = 0;
-
-static gboolean events_enabled = FALSE;
-
-static struct indicator dummy_indicators[] =
-{
-	{ "battchg",	"0-5",	5,	TRUE },
-	{ "signal",	"0-5",	5,	TRUE },
-	{ "service",	"0,1",	1,	TRUE },
-	{ "call",	"0,1",	0,	TRUE },
-	{ "callsetup",	"0-3",	0,	TRUE },
-	{ "callheld",	"0-2",	0,	FALSE },
-	{ "roam",	"0,1",	0,	TRUE },
-	{ NULL }
-};
-
-void telephony_device_connected(void *telephony_device)
-{
-	DBG("telephony-dummy: device %p connected", telephony_device);
-}
-
-void telephony_device_disconnected(void *telephony_device)
-{
-	DBG("telephony-dummy: device %p disconnected", telephony_device);
-	events_enabled = FALSE;
-}
-
-void telephony_event_reporting_req(void *telephony_device, int ind)
-{
-	events_enabled = ind == 1 ? TRUE : FALSE;
-
-	telephony_event_reporting_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_response_and_hold_req(void *telephony_device, int rh)
-{
-	telephony_response_and_hold_rsp(telephony_device,
-						CME_ERROR_NOT_SUPPORTED);
-}
-
-void telephony_last_dialed_number_req(void *telephony_device)
-{
-	telephony_last_dialed_number_rsp(telephony_device, CME_ERROR_NONE);
-
-	/* Notify outgoing call set-up successfully initiated */
-	telephony_update_indicator(dummy_indicators, "callsetup",
-					EV_CALLSETUP_OUTGOING);
-	telephony_update_indicator(dummy_indicators, "callsetup",
-					EV_CALLSETUP_ALERTING);
-
-	active_call_status = CALL_STATUS_ALERTING;
-	active_call_dir = CALL_DIR_OUTGOING;
-}
-
-void telephony_terminate_call_req(void *telephony_device)
-{
-	g_free(active_call_number);
-	active_call_number = NULL;
-
-	telephony_terminate_call_rsp(telephony_device, CME_ERROR_NONE);
-
-	if (telephony_get_indicator(dummy_indicators, "callsetup") > 0)
-		telephony_update_indicator(dummy_indicators, "callsetup",
-						EV_CALLSETUP_INACTIVE);
-	else
-		telephony_update_indicator(dummy_indicators, "call",
-						EV_CALL_INACTIVE);
-}
-
-void telephony_answer_call_req(void *telephony_device)
-{
-	telephony_answer_call_rsp(telephony_device, CME_ERROR_NONE);
-
-	telephony_update_indicator(dummy_indicators, "call", EV_CALL_ACTIVE);
-	telephony_update_indicator(dummy_indicators, "callsetup",
-					EV_CALLSETUP_INACTIVE);
-
-	active_call_status = CALL_STATUS_ACTIVE;
-}
-
-void telephony_dial_number_req(void *telephony_device, const char *number)
-{
-	g_free(active_call_number);
-	active_call_number = g_strdup(number);
-
-	DBG("telephony-dummy: dial request to %s", active_call_number);
-
-	telephony_dial_number_rsp(telephony_device, CME_ERROR_NONE);
-
-	/* Notify outgoing call set-up successfully initiated */
-	telephony_update_indicator(dummy_indicators, "callsetup",
-					EV_CALLSETUP_OUTGOING);
-	telephony_update_indicator(dummy_indicators, "callsetup",
-					EV_CALLSETUP_ALERTING);
-
-	active_call_status = CALL_STATUS_ALERTING;
-	active_call_dir = CALL_DIR_OUTGOING;
-}
-
-void telephony_transmit_dtmf_req(void *telephony_device, char tone)
-{
-	DBG("telephony-dummy: transmit dtmf: %c", tone);
-	telephony_transmit_dtmf_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_subscriber_number_req(void *telephony_device)
-{
-	DBG("telephony-dummy: subscriber number request");
-	if (subscriber_number)
-		telephony_subscriber_number_ind(subscriber_number,
-						NUMBER_TYPE_TELEPHONY,
-						SUBSCRIBER_SERVICE_VOICE);
-	telephony_subscriber_number_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_list_current_calls_req(void *telephony_device)
-{
-	DBG("telephony-dummy: list current calls request");
-	if (active_call_number)
-		telephony_list_current_call_ind(1, active_call_dir,
-						active_call_status,
-						CALL_MODE_VOICE,
-						CALL_MULTIPARTY_NO,
-						active_call_number,
-						NUMBER_TYPE_TELEPHONY);
-	telephony_list_current_calls_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_operator_selection_req(void *telephony_device)
-{
-	telephony_operator_selection_ind(OPERATOR_MODE_AUTO, "DummyOperator");
-	telephony_operator_selection_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_call_hold_req(void *telephony_device, const char *cmd)
-{
-	DBG("telephony-dymmy: got call hold request %s", cmd);
-	telephony_call_hold_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_nr_and_ec_req(void *telephony_device, gboolean enable)
-{
-	DBG("telephony-dummy: got %s NR and EC request",
-			enable ? "enable" : "disable");
-
-	telephony_nr_and_ec_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_voice_dial_req(void *telephony_device, gboolean enable)
-{
-	DBG("telephony-dummy: got %s voice dial request",
-			enable ? "enable" : "disable");
-
-	g_dbus_emit_signal(btd_get_dbus_connection(), TELEPHONY_DUMMY_PATH,
-			TELEPHONY_DUMMY_IFACE, "VoiceDial",
-			DBUS_TYPE_INVALID);
-
-	telephony_voice_dial_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-void telephony_key_press_req(void *telephony_device, const char *keys)
-{
-	DBG("telephony-dummy: got key press request for %s", keys);
-	telephony_key_press_rsp(telephony_device, CME_ERROR_NONE);
-}
-
-/* D-Bus method handlers */
-static DBusMessage *outgoing_call(DBusConnection *conn, DBusMessage *msg,
-					void *data)
-{
-	const char *number;
-
-	if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &number,
-						DBUS_TYPE_INVALID))
-		return btd_error_invalid_args(msg);
-
-	DBG("telephony-dummy: outgoing call to %s", number);
-
-	g_free(active_call_number);
-	active_call_number = g_strdup(number);
-
-	telephony_update_indicator(dummy_indicators, "callsetup",
-					EV_CALLSETUP_OUTGOING);
-	telephony_update_indicator(dummy_indicators, "callsetup",
-					EV_CALLSETUP_ALERTING);
-
-	active_call_status = CALL_STATUS_ALERTING;
-	active_call_dir = CALL_DIR_OUTGOING;
-
-	return dbus_message_new_method_return(msg);
-}
-
-static DBusMessage *incoming_call(DBusConnection *conn, DBusMessage *msg,
-					void *data)
-{
-	const char *number;
-
-	if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &number,
-						DBUS_TYPE_INVALID))
-		return btd_error_invalid_args(msg);
-
-	DBG("telephony-dummy: incoming call to %s", number);
-
-	g_free(active_call_number);
-	active_call_number = g_strdup(number);
-
-	telephony_update_indicator(dummy_indicators, "callsetup",
-					EV_CALLSETUP_INCOMING);
-
-	active_call_status = CALL_STATUS_INCOMING;
-	active_call_dir = CALL_DIR_INCOMING;
-
-	telephony_incoming_call_ind(number, NUMBER_TYPE_TELEPHONY);
-
-	return dbus_message_new_method_return(msg);
-}
-
-static DBusMessage *cancel_call(DBusConnection *conn, DBusMessage *msg,
-					void *data)
-{
-	DBG("telephony-dummy: cancel call");
-
-	g_free(active_call_number);
-	active_call_number = NULL;
-
-	if (telephony_get_indicator(dummy_indicators, "callsetup") > 0) {
-		telephony_update_indicator(dummy_indicators, "callsetup",
-						EV_CALLSETUP_INACTIVE);
-		telephony_calling_stopped_ind();
-	}
-
-	if (telephony_get_indicator(dummy_indicators, "call") > 0)
-		telephony_update_indicator(dummy_indicators, "call",
-						EV_CALL_INACTIVE);
-
-	return dbus_message_new_method_return(msg);
-}
-
-static DBusMessage *signal_strength(DBusConnection *conn, DBusMessage *msg,
-					void *data)
-{
-	dbus_uint32_t strength;
-
-	if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_UINT32, &strength,
-						DBUS_TYPE_INVALID))
-		return btd_error_invalid_args(msg);
-
-	if (strength > 5)
-		return btd_error_invalid_args(msg);
-
-	telephony_update_indicator(dummy_indicators, "signal", strength);
-
-	DBG("telephony-dummy: signal strength set to %u", strength);
-
-	return dbus_message_new_method_return(msg);
-}
-
-static DBusMessage *battery_level(DBusConnection *conn, DBusMessage *msg,
-					void *data)
-{
-	dbus_uint32_t level;
-
-	if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_UINT32, &level,
-						DBUS_TYPE_INVALID))
-		return btd_error_invalid_args(msg);
-
-	if (level > 5)
-		return btd_error_invalid_args(msg);
-
-	telephony_update_indicator(dummy_indicators, "battchg", level);
-
-	DBG("telephony-dummy: battery level set to %u", level);
-
-	return dbus_message_new_method_return(msg);
-}
-
-static DBusMessage *roaming_status(DBusConnection *conn, DBusMessage *msg,
-					void *data)
-{
-	dbus_bool_t roaming;
-	int val;
-
-	if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_BOOLEAN, &roaming,
-						DBUS_TYPE_INVALID))
-		return btd_error_invalid_args(msg);
-
-	val = roaming ? EV_ROAM_ACTIVE : EV_ROAM_INACTIVE;
-
-	telephony_update_indicator(dummy_indicators, "roam", val);
-
-	DBG("telephony-dummy: roaming status set to %d", val);
-
-	return dbus_message_new_method_return(msg);
-}
-
-static DBusMessage *registration_status(DBusConnection *conn, DBusMessage *msg,
-					void *data)
-{
-	dbus_bool_t registration;
-	int val;
-
-	if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_BOOLEAN, &registration,
-						DBUS_TYPE_INVALID))
-		return btd_error_invalid_args(msg);
-
-	val = registration ? EV_SERVICE_PRESENT : EV_SERVICE_NONE;
-
-	telephony_update_indicator(dummy_indicators, "service", val);
-
-	DBG("telephony-dummy: registration status set to %d", val);
-
-	return dbus_message_new_method_return(msg);
-}
-
-static DBusMessage *set_subscriber_number(DBusConnection *conn,
-						DBusMessage *msg,
-						void *data)
-{
-	const char *number;
-
-	if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &number,
-						DBUS_TYPE_INVALID))
-		return btd_error_invalid_args(msg);
-
-	g_free(subscriber_number);
-	subscriber_number = g_strdup(number);
-
-	DBG("telephony-dummy: subscriber number set to %s", number);
-
-	return dbus_message_new_method_return(msg);
-}
-
-static const GDBusMethodTable dummy_methods[] = {
-	{ GDBUS_METHOD("OutgoingCall",
-			GDBUS_ARGS({ "number", "s" }), NULL,
-			outgoing_call) },
-	{ GDBUS_METHOD("IncomingCall",
-			GDBUS_ARGS({ "number", "s" }), NULL,
-			incoming_call) },
-	{ GDBUS_METHOD("CancelCall", NULL, NULL, cancel_call) },
-	{ GDBUS_METHOD("SignalStrength",
-			GDBUS_ARGS({ "strength", "u" }), NULL,
-			signal_strength) },
-	{ GDBUS_METHOD("BatteryLevel",
-			GDBUS_ARGS({ "level", "u" }), NULL,
-			battery_level) },
-	{ GDBUS_METHOD("RoamingStatus",
-			GDBUS_ARGS({ "roaming", "b" }), NULL,
-			roaming_status) },
-	{ GDBUS_METHOD("RegistrationStatus",
-			GDBUS_ARGS({ "registration", "b" }), NULL,
-			registration_status) },
-	{ GDBUS_METHOD("SetSubscriberNumber",
-			GDBUS_ARGS({ "number", "s" }), NULL,
-			set_subscriber_number) },
-	{ }
-};
-
-static const GDBusSignalTable dummy_signals[] = {
-	{ GDBUS_SIGNAL("VoiceDial", NULL) },
-	{ }
-};
-
-int telephony_init(void)
-{
-	uint32_t features = AG_FEATURE_REJECT_A_CALL |
-				AG_FEATURE_ENHANCED_CALL_STATUS |
-				AG_FEATURE_EXTENDED_ERROR_RESULT_CODES;
-
-	DBG("");
-
-	if (g_dbus_register_interface(btd_get_dbus_connection(),
-					TELEPHONY_DUMMY_PATH,
-					TELEPHONY_DUMMY_IFACE,
-					dummy_methods, dummy_signals,
-					NULL, NULL, NULL) == FALSE) {
-		error("telephony-dummy interface %s init failed on path %s",
-			TELEPHONY_DUMMY_IFACE, TELEPHONY_DUMMY_PATH);
-		return -1;
-	}
-
-	telephony_ready_ind(features, dummy_indicators, BTRH_NOT_SUPPORTED,
-								chld_str);
-
-	return 0;
-}
-
-void telephony_exit(void)
-{
-	DBG("");
-
-	g_dbus_unregister_interface(btd_get_dbus_connection(),
-					TELEPHONY_DUMMY_PATH,
-					TELEPHONY_DUMMY_IFACE);
-
-	telephony_deinit();
-}
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH BlueZ 08/13] build: Remove telephony.h
  2012-11-13 13:21 [PATCH BlueZ 00/13] Remove HFP implementation Luiz Augusto von Dentz
                   ` (9 preceding siblings ...)
  2012-11-13 13:21 ` [PATCH BlueZ 07/13] build: Remove telephony-dummy.c Luiz Augusto von Dentz
@ 2012-11-13 13:21 ` Luiz Augusto von Dentz
  2012-11-13 13:21 ` [PATCH BlueZ 09/13] build: Remove headset.c and headset.h Luiz Augusto von Dentz
                   ` (5 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Luiz Augusto von Dentz @ 2012-11-13 13:21 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

---
 Makefile.am       |   2 +-
 audio/manager.c   |   1 -
 audio/telephony.h | 244 ------------------------------------------------------
 3 files changed, 1 insertion(+), 246 deletions(-)
 delete mode 100644 audio/telephony.h

diff --git a/Makefile.am b/Makefile.am
index ad2e27a..a8660af 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -120,7 +120,7 @@ builtin_sources += audio/main.c \
 			audio/media.h audio/media.c \
 			audio/transport.h audio/transport.c \
 			audio/player.h audio/player.c \
-			audio/telephony.h audio/a2dp-codecs.h
+			audio/a2dp-codecs.h
 endif
 
 if SAPPLUGIN
diff --git a/audio/manager.c b/audio/manager.c
index d151f16..0960d28 100644
--- a/audio/manager.c
+++ b/audio/manager.c
@@ -68,7 +68,6 @@
 #include "control.h"
 #include "manager.h"
 #include "sdpd.h"
-#include "telephony.h"
 
 struct audio_adapter {
 	struct btd_adapter *btd_adapter;
diff --git a/audio/telephony.h b/audio/telephony.h
deleted file mode 100644
index 73b390c..0000000
--- a/audio/telephony.h
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- *
- *  BlueZ - Bluetooth protocol stack for Linux
- *
- *  Copyright (C) 2006-2010  Nokia Corporation
- *  Copyright (C) 2004-2010  Marcel Holtmann <marcel@holtmann.org>
- *
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- */
-
-#include <stdint.h>
-#include <errno.h>
-#include <glib.h>
-
-/* Response and hold values */
-#define BTRH_NOT_SUPPORTED	-2
-#define BTRH_NONE		-1
-#define BTRH_HOLD		0
-#define BTRH_ACCEPT		1
-#define BTRH_REJECT		2
-
-/* HFP feature bits */
-#define AG_FEATURE_THREE_WAY_CALLING		0x0001
-#define AG_FEATURE_EC_ANDOR_NR			0x0002
-#define AG_FEATURE_VOICE_RECOGNITION		0x0004
-#define AG_FEATURE_INBAND_RINGTONE		0x0008
-#define AG_FEATURE_ATTACH_NUMBER_TO_VOICETAG	0x0010
-#define AG_FEATURE_REJECT_A_CALL		0x0020
-#define AG_FEATURE_ENHANCED_CALL_STATUS		0x0040
-#define AG_FEATURE_ENHANCED_CALL_CONTROL	0x0080
-#define AG_FEATURE_EXTENDED_ERROR_RESULT_CODES	0x0100
-
-#define HF_FEATURE_EC_ANDOR_NR			0x0001
-#define HF_FEATURE_CALL_WAITING_AND_3WAY	0x0002
-#define HF_FEATURE_CLI_PRESENTATION		0x0004
-#define HF_FEATURE_VOICE_RECOGNITION		0x0008
-#define HF_FEATURE_REMOTE_VOLUME_CONTROL	0x0010
-#define HF_FEATURE_ENHANCED_CALL_STATUS		0x0020
-#define HF_FEATURE_ENHANCED_CALL_CONTROL	0x0040
-
-/* Indicator event values */
-#define EV_SERVICE_NONE			0
-#define EV_SERVICE_PRESENT		1
-
-#define EV_CALL_INACTIVE		0
-#define EV_CALL_ACTIVE			1
-
-#define EV_CALLSETUP_INACTIVE		0
-#define EV_CALLSETUP_INCOMING		1
-#define EV_CALLSETUP_OUTGOING		2
-#define EV_CALLSETUP_ALERTING		3
-
-#define EV_CALLHELD_NONE		0
-#define EV_CALLHELD_MULTIPLE		1
-#define EV_CALLHELD_ON_HOLD		2
-
-#define EV_ROAM_INACTIVE		0
-#define EV_ROAM_ACTIVE			1
-
-/* Call parameters */
-#define CALL_DIR_OUTGOING		0
-#define CALL_DIR_INCOMING		1
-
-#define CALL_STATUS_ACTIVE		0
-#define CALL_STATUS_HELD		1
-#define CALL_STATUS_DIALING		2
-#define CALL_STATUS_ALERTING		3
-#define CALL_STATUS_INCOMING		4
-#define CALL_STATUS_WAITING		5
-
-#define CALL_MODE_VOICE			0
-#define CALL_MODE_DATA			1
-#define CALL_MODE_FAX			2
-
-#define CALL_MULTIPARTY_NO		0
-#define CALL_MULTIPARTY_YES		1
-
-/* Subscriber number parameters */
-#define SUBSCRIBER_SERVICE_VOICE	4
-#define SUBSCRIBER_SERVICE_FAX		5
-
-/* Operator selection mode values */
-#define OPERATOR_MODE_AUTO		0
-#define OPERATOR_MODE_MANUAL		1
-#define OPERATOR_MODE_DEREGISTER	2
-#define OPERATOR_MODE_MANUAL_AUTO	4
-
-/* Some common number types */
-#define NUMBER_TYPE_UNKNOWN		128
-#define NUMBER_TYPE_TELEPHONY		129
-#define NUMBER_TYPE_INTERNATIONAL	145
-#define NUMBER_TYPE_NATIONAL		161
-#define NUMBER_TYPE_VOIP		255
-
-/* Extended Audio Gateway Error Result Codes */
-typedef enum {
-	CME_ERROR_NONE			= -1,
-	CME_ERROR_AG_FAILURE		= 0,
-	CME_ERROR_NO_PHONE_CONNECTION	= 1,
-	CME_ERROR_NOT_ALLOWED		= 3,
-	CME_ERROR_NOT_SUPPORTED		= 4,
-	CME_ERROR_PH_SIM_PIN_REQUIRED	= 5,
-	CME_ERROR_SIM_NOT_INSERTED	= 10,
-	CME_ERROR_SIM_PIN_REQUIRED	= 11,
-	CME_ERROR_SIM_PUK_REQUIRED	= 12,
-	CME_ERROR_SIM_FAILURE		= 13,
-	CME_ERROR_SIM_BUSY		= 14,
-	CME_ERROR_INCORRECT_PASSWORD	= 16,
-	CME_ERROR_SIM_PIN2_REQUIRED	= 17,
-	CME_ERROR_SIM_PUK2_REQUIRED	= 18,
-	CME_ERROR_MEMORY_FULL		= 20,
-	CME_ERROR_INVALID_INDEX		= 21,
-	CME_ERROR_MEMORY_FAILURE	= 23,
-	CME_ERROR_TEXT_STRING_TOO_LONG	= 24,
-	CME_ERROR_INVALID_TEXT_STRING	= 25,
-	CME_ERROR_DIAL_STRING_TOO_LONG	= 26,
-	CME_ERROR_INVALID_DIAL_STRING	= 27,
-	CME_ERROR_NO_NETWORK_SERVICE	= 30,
-	CME_ERROR_NETWORK_TIMEOUT	= 31,
-	CME_ERROR_NETWORK_NOT_ALLOWED	= 32,
-} cme_error_t;
-
-struct indicator {
-	const char *desc;
-	const char *range;
-	int val;
-	gboolean ignore_redundant;
-};
-
-/* Notify telephony-*.c of connected/disconnected devices. Implemented by
- * telephony-*.c
- */
-void telephony_device_connected(void *telephony_device);
-void telephony_device_disconnected(void *telephony_device);
-
-/* HF requests (sent by the handsfree device). These are implemented by
- * telephony-*.c
- */
-void telephony_event_reporting_req(void *telephony_device, int ind);
-void telephony_response_and_hold_req(void *telephony_device, int rh);
-void telephony_last_dialed_number_req(void *telephony_device);
-void telephony_terminate_call_req(void *telephony_device);
-void telephony_answer_call_req(void *telephony_device);
-void telephony_dial_number_req(void *telephony_device, const char *number);
-void telephony_transmit_dtmf_req(void *telephony_device, char tone);
-void telephony_subscriber_number_req(void *telephony_device);
-void telephony_list_current_calls_req(void *telephony_device);
-void telephony_operator_selection_req(void *telephony_device);
-void telephony_call_hold_req(void *telephony_device, const char *cmd);
-void telephony_nr_and_ec_req(void *telephony_device, gboolean enable);
-void telephony_voice_dial_req(void *telephony_device, gboolean enable);
-void telephony_key_press_req(void *telephony_device, const char *keys);
-
-/* AG responses to HF requests. These are implemented by headset.c */
-int telephony_event_reporting_rsp(void *telephony_device, cme_error_t err);
-int telephony_response_and_hold_rsp(void *telephony_device, cme_error_t err);
-int telephony_last_dialed_number_rsp(void *telephony_device, cme_error_t err);
-int telephony_terminate_call_rsp(void *telephony_device, cme_error_t err);
-int telephony_answer_call_rsp(void *telephony_device, cme_error_t err);
-int telephony_dial_number_rsp(void *telephony_device, cme_error_t err);
-int telephony_transmit_dtmf_rsp(void *telephony_device, cme_error_t err);
-int telephony_subscriber_number_rsp(void *telephony_device, cme_error_t err);
-int telephony_list_current_calls_rsp(void *telephony_device, cme_error_t err);
-int telephony_operator_selection_rsp(void *telephony_device, cme_error_t err);
-int telephony_call_hold_rsp(void *telephony_device, cme_error_t err);
-int telephony_nr_and_ec_rsp(void *telephony_device, cme_error_t err);
-int telephony_voice_dial_rsp(void *telephony_device, cme_error_t err);
-int telephony_key_press_rsp(void *telephony_device, cme_error_t err);
-
-/* Event indications by AG. These are implemented by headset.c */
-int telephony_event_ind(int index);
-int telephony_response_and_hold_ind(int rh);
-int telephony_incoming_call_ind(const char *number, int type);
-int telephony_calling_stopped_ind(void);
-int telephony_ready_ind(uint32_t features, const struct indicator *indicators,
-			int rh, const char *chld);
-int telephony_deinit(void);
-int telephony_list_current_call_ind(int idx, int dir, int status, int mode,
-					int mprty, const char *number,
-					int type);
-int telephony_subscriber_number_ind(const char *number, int type,
-					int service);
-int telephony_call_waiting_ind(const char *number, int type);
-int telephony_operator_selection_ind(int mode, const char *oper);
-
-/* Helper function for quick indicator updates */
-static inline int telephony_update_indicator(struct indicator *indicators,
-						const char *desc,
-						int new_val)
-{
-	int i;
-	struct indicator *ind = NULL;
-
-	for (i = 0; indicators[i].desc != NULL; i++) {
-		if (g_str_equal(indicators[i].desc, desc)) {
-			ind = &indicators[i];
-			break;
-		}
-	}
-
-	if (!ind)
-		return -ENOENT;
-
-	DBG("Telephony indicator \"%s\" %d->%d", desc, ind->val, new_val);
-
-	if (ind->ignore_redundant && ind->val == new_val) {
-		DBG("Ignoring no-change indication");
-		return 0;
-	}
-
-	ind->val = new_val;
-
-	return telephony_event_ind(i);
-}
-
-static inline int telephony_get_indicator(const struct indicator *indicators,
-						const char *desc)
-{
-	int i;
-
-	for (i = 0; indicators[i].desc != NULL; i++) {
-		if (g_str_equal(indicators[i].desc, desc))
-			return indicators[i].val;
-	}
-
-	return -ENOENT;
-}
-
-int telephony_init(void);
-void telephony_exit(void);
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH BlueZ 09/13] build: Remove headset.c and headset.h
  2012-11-13 13:21 [PATCH BlueZ 00/13] Remove HFP implementation Luiz Augusto von Dentz
                   ` (10 preceding siblings ...)
  2012-11-13 13:21 ` [PATCH BlueZ 08/13] build: Remove telephony.h Luiz Augusto von Dentz
@ 2012-11-13 13:21 ` Luiz Augusto von Dentz
  2012-11-13 13:21 ` [PATCH BlueZ 10/13] audio: Remove code HFP and HS gateway role Luiz Augusto von Dentz
                   ` (4 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Luiz Augusto von Dentz @ 2012-11-13 13:21 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

---
 Makefile.am     |    1 -
 audio/device.h  |    1 -
 audio/headset.c | 2822 -------------------------------------------------------
 audio/headset.h |  112 ---
 4 files changed, 2936 deletions(-)
 delete mode 100644 audio/headset.c
 delete mode 100644 audio/headset.h

diff --git a/Makefile.am b/Makefile.am
index a8660af..7f8ff26 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -108,7 +108,6 @@ builtin_modules += audio
 builtin_sources += audio/main.c \
 			audio/manager.h audio/manager.c \
 			audio/gateway.h audio/gateway.c \
-			audio/headset.h audio/headset.c \
 			audio/control.h audio/control.c \
 			audio/avctp.h audio/avctp.c \
 			audio/avrcp.h audio/avrcp.c \
diff --git a/audio/device.h b/audio/device.h
index 1e2cac1..89916be 100644
--- a/audio/device.h
+++ b/audio/device.h
@@ -38,7 +38,6 @@ struct audio_device {
 
 	gboolean auto_connect;
 
-	struct headset *headset;
 	struct gateway *gateway;
 	struct sink *sink;
 	struct source *source;
diff --git a/audio/headset.c b/audio/headset.c
deleted file mode 100644
index fb660f5..0000000
--- a/audio/headset.c
+++ /dev/null
@@ -1,2822 +0,0 @@
-/*
- *
- *  BlueZ - Bluetooth protocol stack for Linux
- *
- *  Copyright (C) 2006-2010  Nokia Corporation
- *  Copyright (C) 2004-2010  Marcel Holtmann <marcel@holtmann.org>
- *
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <stdbool.h>
-#include <signal.h>
-#include <string.h>
-#include <getopt.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-#include <assert.h>
-
-#include <bluetooth/bluetooth.h>
-#include <bluetooth/sdp.h>
-#include <bluetooth/sdp_lib.h>
-#include <bluetooth/uuid.h>
-
-#include <glib.h>
-#include <dbus/dbus.h>
-#include <gdbus.h>
-
-#include "log.h"
-#include "device.h"
-#include "manager.h"
-#include "error.h"
-#include "telephony.h"
-#include "headset.h"
-#include "sdp-client.h"
-#include "btio.h"
-#include "dbus-common.h"
-#include "../src/adapter.h"
-#include "../src/device.h"
-
-#define DC_TIMEOUT 3
-
-#define RING_INTERVAL 3
-
-#define BUF_SIZE 1024
-
-#define HEADSET_GAIN_SPEAKER 'S'
-#define HEADSET_GAIN_MICROPHONE 'M'
-
-static struct {
-	gboolean telephony_ready;	/* Telephony plugin initialized */
-	uint32_t features;		/* HFP AG features */
-	const struct indicator *indicators;	/* Available HFP indicators */
-	int er_mode;			/* Event reporting mode */
-	int er_ind;			/* Event reporting for indicators */
-	int rh;				/* Response and Hold state */
-	char *number;			/* Incoming phone number */
-	int number_type;		/* Incoming number type */
-	guint ring_timer;		/* For incoming call indication */
-	const char *chld;		/* Response to AT+CHLD=? */
-} ag = {
-	.telephony_ready = FALSE,
-	.features = 0,
-	.er_mode = 3,
-	.er_ind = 0,
-	.rh = BTRH_NOT_SUPPORTED,
-	.number = NULL,
-	.number_type = 0,
-	.ring_timer = 0,
-};
-
-static gboolean sco_hci = TRUE;
-static gboolean fast_connectable = FALSE;
-
-static GSList *active_devices = NULL;
-
-static char *str_state[] = {
-	"HEADSET_STATE_DISCONNECTED",
-	"HEADSET_STATE_CONNECTING",
-	"HEADSET_STATE_CONNECTED",
-	"HEADSET_STATE_PLAY_IN_PROGRESS",
-	"HEADSET_STATE_PLAYING",
-};
-
-struct headset_state_callback {
-	headset_state_cb cb;
-	void *user_data;
-	unsigned int id;
-};
-
-struct headset_nrec_callback {
-	unsigned int id;
-	headset_nrec_cb cb;
-	void *user_data;
-};
-
-struct connect_cb {
-	unsigned int id;
-	headset_stream_cb_t cb;
-	void *cb_data;
-};
-
-struct pending_connect {
-	DBusMessage *msg;
-	DBusPendingCall *call;
-	GIOChannel *io;
-	int err;
-	headset_state_t target_state;
-	GSList *callbacks;
-	uint16_t svclass;
-};
-
-struct headset_slc {
-	char buf[BUF_SIZE];
-	int data_start;
-	int data_length;
-
-	gboolean cli_active;
-	gboolean cme_enabled;
-	gboolean cwa_enabled;
-	gboolean pending_ring;
-	gboolean inband_ring;
-	gboolean nrec;
-	gboolean nrec_req;
-
-	int sp_gain;
-	int mic_gain;
-
-	unsigned int hf_features;
-};
-
-struct headset {
-	uint32_t hsp_handle;
-	uint32_t hfp_handle;
-
-	int rfcomm_ch;
-
-	GIOChannel *rfcomm;
-	GIOChannel *tmp_rfcomm;
-	GIOChannel *sco;
-	guint sco_id;
-
-	gboolean auto_dc;
-
-	guint dc_timer;
-
-	gboolean hfp_active;
-	gboolean search_hfp;
-	gboolean rfcomm_initiator;
-
-	headset_state_t state;
-	struct pending_connect *pending;
-
-	headset_lock_t lock;
-	struct headset_slc *slc;
-	GSList *nrec_cbs;
-};
-
-struct event {
-	const char *cmd;
-	int (*callback) (struct audio_device *device, const char *buf);
-};
-
-static GSList *headset_callbacks = NULL;
-
-static void error_connect_failed(DBusMessage *msg, int err)
-{
-	DBusMessage *reply = btd_error_failed(msg,
-			err < 0 ? strerror(-err) : "Connect failed");
-	g_dbus_send_message(btd_get_dbus_connection(), reply);
-}
-
-static int rfcomm_connect(struct audio_device *device, headset_stream_cb_t cb,
-				void *user_data, unsigned int *cb_id);
-static int get_records(struct audio_device *device, headset_stream_cb_t cb,
-			void *user_data, unsigned int *cb_id);
-
-static void print_ag_features(uint32_t features)
-{
-	GString *gstr;
-	char *str;
-
-	if (features == 0) {
-		DBG("HFP AG features: (none)");
-		return;
-	}
-
-	gstr = g_string_new("HFP AG features: ");
-
-	if (features & AG_FEATURE_THREE_WAY_CALLING)
-		g_string_append(gstr, "\"Three-way calling\" ");
-	if (features & AG_FEATURE_EC_ANDOR_NR)
-		g_string_append(gstr, "\"EC and/or NR function\" ");
-	if (features & AG_FEATURE_VOICE_RECOGNITION)
-		g_string_append(gstr, "\"Voice recognition function\" ");
-	if (features & AG_FEATURE_INBAND_RINGTONE)
-		g_string_append(gstr, "\"In-band ring tone capability\" ");
-	if (features & AG_FEATURE_ATTACH_NUMBER_TO_VOICETAG)
-		g_string_append(gstr, "\"Attach a number to a voice tag\" ");
-	if (features & AG_FEATURE_REJECT_A_CALL)
-		g_string_append(gstr, "\"Ability to reject a call\" ");
-	if (features & AG_FEATURE_ENHANCED_CALL_STATUS)
-		g_string_append(gstr, "\"Enhanced call status\" ");
-	if (features & AG_FEATURE_ENHANCED_CALL_CONTROL)
-		g_string_append(gstr, "\"Enhanced call control\" ");
-	if (features & AG_FEATURE_EXTENDED_ERROR_RESULT_CODES)
-		g_string_append(gstr, "\"Extended Error Result Codes\" ");
-
-	str = g_string_free(gstr, FALSE);
-
-	DBG("%s", str);
-
-	g_free(str);
-}
-
-static void print_hf_features(uint32_t features)
-{
-	GString *gstr;
-	char *str;
-
-	if (features == 0) {
-		DBG("HFP HF features: (none)");
-		return;
-	}
-
-	gstr = g_string_new("HFP HF features: ");
-
-	if (features & HF_FEATURE_EC_ANDOR_NR)
-		g_string_append(gstr, "\"EC and/or NR function\" ");
-	if (features & HF_FEATURE_CALL_WAITING_AND_3WAY)
-		g_string_append(gstr, "\"Call waiting and 3-way calling\" ");
-	if (features & HF_FEATURE_CLI_PRESENTATION)
-		g_string_append(gstr, "\"CLI presentation capability\" ");
-	if (features & HF_FEATURE_VOICE_RECOGNITION)
-		g_string_append(gstr, "\"Voice recognition activation\" ");
-	if (features & HF_FEATURE_REMOTE_VOLUME_CONTROL)
-		g_string_append(gstr, "\"Remote volume control\" ");
-	if (features & HF_FEATURE_ENHANCED_CALL_STATUS)
-		g_string_append(gstr, "\"Enhanced call status\" ");
-	if (features & HF_FEATURE_ENHANCED_CALL_CONTROL)
-		g_string_append(gstr, "\"Enhanced call control\" ");
-
-	str = g_string_free(gstr, FALSE);
-
-	DBG("%s", str);
-
-	g_free(str);
-}
-
-static const char *state2str(headset_state_t state)
-{
-	switch (state) {
-	case HEADSET_STATE_DISCONNECTED:
-		return "disconnected";
-	case HEADSET_STATE_CONNECTING:
-		return "connecting";
-	case HEADSET_STATE_CONNECTED:
-	case HEADSET_STATE_PLAY_IN_PROGRESS:
-		return "connected";
-	case HEADSET_STATE_PLAYING:
-		return "playing";
-	}
-
-	return NULL;
-}
-
-static int headset_send_valist(struct headset *hs, char *format, va_list ap)
-{
-	char rsp[BUF_SIZE];
-	ssize_t total_written, count;
-	int fd;
-
-	count = vsnprintf(rsp, sizeof(rsp), format, ap);
-
-	if (count < 0)
-		return -EINVAL;
-
-	if (!hs->rfcomm) {
-		error("headset_send: the headset is not connected");
-		return -EIO;
-	}
-
-	total_written = 0;
-	fd = g_io_channel_unix_get_fd(hs->rfcomm);
-
-	while (total_written < count) {
-		ssize_t written;
-
-		written = write(fd, rsp + total_written,
-				count - total_written);
-		if (written < 0)
-			return -errno;
-
-		total_written += written;
-	}
-
-	return 0;
-}
-
-static int __attribute__((format(printf, 2, 3)))
-			headset_send(struct headset *hs, char *format, ...)
-{
-	va_list ap;
-	int ret;
-
-	va_start(ap, format);
-	ret = headset_send_valist(hs, format, ap);
-	va_end(ap);
-
-	return ret;
-}
-
-static int supported_features(struct audio_device *device, const char *buf)
-{
-	struct headset *hs = device->headset;
-	struct headset_slc *slc = hs->slc;
-	int err;
-
-	if (strlen(buf) < 9)
-		return -EINVAL;
-
-	slc->hf_features = strtoul(&buf[8], NULL, 10);
-
-	print_hf_features(slc->hf_features);
-
-	err = headset_send(hs, "\r\n+BRSF: %u\r\n", ag.features);
-	if (err < 0)
-		return err;
-
-	return headset_send(hs, "\r\nOK\r\n");
-}
-
-static char *indicator_ranges(const struct indicator *indicators)
-{
-	int i;
-	GString *gstr;
-
-	gstr = g_string_new("\r\n+CIND: ");
-
-	for (i = 0; indicators[i].desc != NULL; i++) {
-		if (i == 0)
-			g_string_append_printf(gstr, "(\"%s\",(%s))",
-						indicators[i].desc,
-						indicators[i].range);
-		else
-			g_string_append_printf(gstr, ",(\"%s\",(%s))",
-						indicators[i].desc,
-						indicators[i].range);
-	}
-
-	g_string_append(gstr, "\r\n");
-
-	return g_string_free(gstr, FALSE);
-}
-
-static char *indicator_values(const struct indicator *indicators)
-{
-	int i;
-	GString *gstr;
-
-	gstr = g_string_new("\r\n+CIND: ");
-
-	for (i = 0; indicators[i].desc != NULL; i++) {
-		if (i == 0)
-			g_string_append_printf(gstr, "%d", indicators[i].val);
-		else
-			g_string_append_printf(gstr, ",%d", indicators[i].val);
-	}
-
-	g_string_append(gstr, "\r\n");
-
-	return g_string_free(gstr, FALSE);
-}
-
-static int report_indicators(struct audio_device *device, const char *buf)
-{
-	struct headset *hs = device->headset;
-	int err;
-	char *str;
-
-	if (strlen(buf) < 8)
-		return -EINVAL;
-
-	if (ag.indicators == NULL) {
-		error("HFP AG indicators not initialized");
-		return headset_send(hs, "\r\nERROR\r\n");
-	}
-
-	if (buf[7] == '=')
-		str = indicator_ranges(ag.indicators);
-	else
-		str = indicator_values(ag.indicators);
-
-	err = headset_send(hs, "%s", str);
-
-	g_free(str);
-
-	if (err < 0)
-		return err;
-
-	return headset_send(hs, "\r\nOK\r\n");
-}
-
-static void pending_connect_complete(struct connect_cb *cb, struct audio_device *dev)
-{
-	struct headset *hs = dev->headset;
-
-	if (hs->pending->err < 0)
-		cb->cb(NULL, cb->cb_data);
-	else
-		cb->cb(dev, cb->cb_data);
-}
-
-static void pending_connect_finalize(struct audio_device *dev)
-{
-	struct headset *hs = dev->headset;
-	struct pending_connect *p = hs->pending;
-
-	if (p == NULL)
-		return;
-
-	if (p->svclass)
-		bt_cancel_discovery(&dev->src, &dev->dst);
-
-	g_slist_foreach(p->callbacks, (GFunc) pending_connect_complete, dev);
-
-	g_slist_free_full(p->callbacks, g_free);
-
-	if (p->io) {
-		g_io_channel_shutdown(p->io, TRUE, NULL);
-		g_io_channel_unref(p->io);
-	}
-
-	if (p->msg)
-		dbus_message_unref(p->msg);
-
-	if (p->call) {
-		dbus_pending_call_cancel(p->call);
-		dbus_pending_call_unref(p->call);
-	}
-
-	g_free(p);
-
-	hs->pending = NULL;
-}
-
-static void pending_connect_init(struct headset *hs, headset_state_t target_state)
-{
-	if (hs->pending) {
-		if (hs->pending->target_state < target_state)
-			hs->pending->target_state = target_state;
-		return;
-	}
-
-	hs->pending = g_new0(struct pending_connect, 1);
-	hs->pending->target_state = target_state;
-}
-
-static unsigned int connect_cb_new(struct headset *hs,
-					headset_state_t target_state,
-					headset_stream_cb_t func,
-					void *user_data)
-{
-	struct connect_cb *cb;
-	static unsigned int free_cb_id = 1;
-
-	pending_connect_init(hs, target_state);
-
-	if (!func)
-		return 0;
-
-	cb = g_new(struct connect_cb, 1);
-
-	cb->cb = func;
-	cb->cb_data = user_data;
-	cb->id = free_cb_id++;
-
-	hs->pending->callbacks = g_slist_append(hs->pending->callbacks,
-						cb);
-
-	return cb->id;
-}
-
-static void __attribute__((format(printf, 3, 4)))
-		send_foreach_headset(GSList *devices,
-					int (*cmp) (struct headset *hs),
-					char *format, ...)
-{
-	GSList *l;
-	va_list ap;
-
-	for (l = devices; l != NULL; l = l->next) {
-		struct audio_device *device = l->data;
-		struct headset *hs = device->headset;
-		int ret;
-
-		assert(hs != NULL);
-
-		if (cmp && cmp(hs) != 0)
-			continue;
-
-		va_start(ap, format);
-		ret = headset_send_valist(hs, format, ap);
-		if (ret < 0)
-			error("Failed to send to headset: %s (%d)",
-					strerror(-ret), -ret);
-		va_end(ap);
-	}
-}
-
-static int cli_cmp(struct headset *hs)
-{
-	struct headset_slc *slc = hs->slc;
-
-	if (!hs->hfp_active)
-		return -1;
-
-	if (slc->cli_active)
-		return 0;
-	else
-		return -1;
-}
-
-static gboolean ring_timer_cb(gpointer data)
-{
-	send_foreach_headset(active_devices, NULL, "\r\nRING\r\n");
-
-	if (ag.number)
-		send_foreach_headset(active_devices, cli_cmp,
-					"\r\n+CLIP: \"%s\",%d\r\n",
-					ag.number, ag.number_type);
-
-	return TRUE;
-}
-
-static void sco_connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
-{
-	int sk;
-	struct audio_device *dev = user_data;
-	struct headset *hs = dev->headset;
-	struct headset_slc *slc = hs->slc;
-	struct pending_connect *p = hs->pending;
-
-	if (err) {
-		error("%s", err->message);
-
-		if (p != NULL) {
-			p->err = -errno;
-			if (p->msg)
-				error_connect_failed(p->msg, p->err);
-			pending_connect_finalize(dev);
-		}
-
-		if (hs->rfcomm)
-			headset_set_state(dev, HEADSET_STATE_CONNECTED);
-		else
-			headset_set_state(dev, HEADSET_STATE_DISCONNECTED);
-
-		return;
-	}
-
-	DBG("SCO socket opened for headset %s", device_get_path(dev->btd_dev));
-
-	sk = g_io_channel_unix_get_fd(chan);
-
-	DBG("SCO fd=%d", sk);
-
-	if (p) {
-		p->io = NULL;
-		if (p->msg) {
-			DBusMessage *reply;
-			reply = dbus_message_new_method_return(p->msg);
-			g_dbus_send_message(btd_get_dbus_connection(), reply);
-		}
-
-		pending_connect_finalize(dev);
-	}
-
-	fcntl(sk, F_SETFL, 0);
-
-	headset_set_state(dev, HEADSET_STATE_PLAYING);
-
-	if (slc->pending_ring) {
-		ring_timer_cb(NULL);
-		ag.ring_timer = g_timeout_add_seconds(RING_INTERVAL,
-						ring_timer_cb,
-						NULL);
-		slc->pending_ring = FALSE;
-	}
-}
-
-static int sco_connect(struct audio_device *dev, headset_stream_cb_t cb,
-			void *user_data, unsigned int *cb_id)
-{
-	struct headset *hs = dev->headset;
-	GError *err = NULL;
-	GIOChannel *io;
-
-	if (hs->state != HEADSET_STATE_CONNECTED)
-		return -EINVAL;
-
-	io = bt_io_connect(sco_connect_cb, dev, NULL, &err,
-				BT_IO_OPT_SOURCE_BDADDR, &dev->src,
-				BT_IO_OPT_DEST_BDADDR, &dev->dst,
-				BT_IO_OPT_INVALID);
-	if (!io) {
-		error("%s", err->message);
-		g_error_free(err);
-		return -EIO;
-	}
-
-	hs->sco = io;
-
-	headset_set_state(dev, HEADSET_STATE_PLAY_IN_PROGRESS);
-
-	pending_connect_init(hs, HEADSET_STATE_PLAYING);
-
-	if (cb) {
-		unsigned int id = connect_cb_new(hs, HEADSET_STATE_PLAYING,
-							cb, user_data);
-		if (cb_id)
-			*cb_id = id;
-	}
-
-	return 0;
-}
-
-static int hfp_cmp(struct headset *hs)
-{
-	if (hs->hfp_active)
-		return 0;
-	else
-		return -1;
-}
-
-static void hfp_slc_complete(struct audio_device *dev)
-{
-	struct headset *hs = dev->headset;
-	struct pending_connect *p = hs->pending;
-
-	DBG("HFP Service Level Connection established");
-
-	headset_set_state(dev, HEADSET_STATE_CONNECTED);
-
-	if (p == NULL)
-		return;
-
-	if (p->target_state == HEADSET_STATE_CONNECTED) {
-		if (p->msg) {
-			DBusMessage *reply = dbus_message_new_method_return(p->msg);
-			g_dbus_send_message(btd_get_dbus_connection(), reply);
-		}
-		pending_connect_finalize(dev);
-		return;
-	}
-
-	p->err = sco_connect(dev, NULL, NULL, NULL);
-	if (p->err < 0) {
-		if (p->msg)
-			error_connect_failed(p->msg, p->err);
-		pending_connect_finalize(dev);
-	}
-}
-
-static int telephony_generic_rsp(struct audio_device *device, cme_error_t err)
-{
-	struct headset *hs = device->headset;
-	struct headset_slc *slc = hs->slc;
-
-	if ((err != CME_ERROR_NONE) && slc->cme_enabled)
-		return headset_send(hs, "\r\n+CME ERROR: %d\r\n", err);
-
-	switch (err) {
-	case CME_ERROR_NONE:
-		return headset_send(hs, "\r\nOK\r\n");
-	case CME_ERROR_NO_NETWORK_SERVICE:
-		return headset_send(hs, "\r\nNO CARRIER\r\n");
-	default:
-		return headset_send(hs, "\r\nERROR\r\n");
-	}
-}
-
-int telephony_event_reporting_rsp(void *telephony_device, cme_error_t err)
-{
-	struct audio_device *device = telephony_device;
-	struct headset *hs = device->headset;
-	struct headset_slc *slc = hs->slc;
-	int ret;
-
-	if (err != CME_ERROR_NONE)
-		return telephony_generic_rsp(telephony_device, err);
-
-	ret = headset_send(hs, "\r\nOK\r\n");
-	if (ret < 0)
-		return ret;
-
-	if (hs->state != HEADSET_STATE_CONNECTING)
-		return 0;
-
-	if (slc->hf_features & HF_FEATURE_CALL_WAITING_AND_3WAY &&
-			ag.features & AG_FEATURE_THREE_WAY_CALLING)
-		return 0;
-
-	hfp_slc_complete(device);
-
-	return 0;
-}
-
-static int event_reporting(struct audio_device *dev, const char *buf)
-{
-	char **tokens; /* <mode>, <keyp>, <disp>, <ind>, <bfr> */
-
-	if (strlen(buf) < 13)
-		return -EINVAL;
-
-	tokens = g_strsplit(&buf[8], ",", 5);
-	if (g_strv_length(tokens) < 4) {
-		g_strfreev(tokens);
-		return -EINVAL;
-	}
-
-	ag.er_mode = atoi(tokens[0]);
-	ag.er_ind = atoi(tokens[3]);
-
-	g_strfreev(tokens);
-	tokens = NULL;
-
-	DBG("Event reporting (CMER): mode=%d, ind=%d",
-			ag.er_mode, ag.er_ind);
-
-	switch (ag.er_ind) {
-	case 0:
-	case 1:
-		telephony_event_reporting_req(dev, ag.er_ind);
-		break;
-	default:
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-static int call_hold(struct audio_device *dev, const char *buf)
-{
-	struct headset *hs = dev->headset;
-	int err;
-
-	if (strlen(buf) < 9)
-		return -EINVAL;
-
-	if (buf[8] != '?') {
-		telephony_call_hold_req(dev, &buf[8]);
-		return 0;
-	}
-
-	err = headset_send(hs, "\r\n+CHLD: (%s)\r\n", ag.chld);
-	if (err < 0)
-		return err;
-
-	err = headset_send(hs, "\r\nOK\r\n");
-	if (err < 0)
-		return err;
-
-	if (hs->state != HEADSET_STATE_CONNECTING)
-		return 0;
-
-	hfp_slc_complete(dev);
-
-	return 0;
-}
-
-int telephony_key_press_rsp(void *telephony_device, cme_error_t err)
-{
-	return telephony_generic_rsp(telephony_device, err);
-}
-
-static int key_press(struct audio_device *device, const char *buf)
-{
-	if (strlen(buf) < 9)
-		return -EINVAL;
-
-	g_dbus_emit_signal(btd_get_dbus_connection(),
-			device_get_path(device->btd_dev),
-			AUDIO_HEADSET_INTERFACE, "AnswerRequested",
-			DBUS_TYPE_INVALID);
-
-	if (ag.ring_timer) {
-		g_source_remove(ag.ring_timer);
-		ag.ring_timer = 0;
-	}
-
-	telephony_key_press_req(device, &buf[8]);
-
-	return 0;
-}
-
-int telephony_answer_call_rsp(void *telephony_device, cme_error_t err)
-{
-	return telephony_generic_rsp(telephony_device, err);
-}
-
-static int answer_call(struct audio_device *device, const char *buf)
-{
-	if (ag.ring_timer) {
-		g_source_remove(ag.ring_timer);
-		ag.ring_timer = 0;
-	}
-
-	if (ag.number) {
-		g_free(ag.number);
-		ag.number = NULL;
-	}
-
-	telephony_answer_call_req(device);
-
-	return 0;
-}
-
-int telephony_terminate_call_rsp(void *telephony_device,
-					cme_error_t err)
-{
-	struct audio_device *device = telephony_device;
-	struct headset *hs = device->headset;
-
-	if (err != CME_ERROR_NONE)
-		return telephony_generic_rsp(telephony_device, err);
-
-	g_dbus_emit_signal(btd_get_dbus_connection(),
-			device_get_path(device->btd_dev),
-			AUDIO_HEADSET_INTERFACE, "CallTerminated",
-			DBUS_TYPE_INVALID);
-
-	return headset_send(hs, "\r\nOK\r\n");
-}
-
-static int terminate_call(struct audio_device *device, const char *buf)
-{
-	if (ag.number) {
-		g_free(ag.number);
-		ag.number = NULL;
-	}
-
-	if (ag.ring_timer) {
-		g_source_remove(ag.ring_timer);
-		ag.ring_timer = 0;
-	}
-
-	telephony_terminate_call_req(device);
-
-	return 0;
-}
-
-static int cli_notification(struct audio_device *device, const char *buf)
-{
-	struct headset *hs = device->headset;
-	struct headset_slc *slc = hs->slc;
-
-	if (strlen(buf) < 9)
-		return -EINVAL;
-
-	slc->cli_active = buf[8] == '1' ? TRUE : FALSE;
-
-	return headset_send(hs, "\r\nOK\r\n");
-}
-
-int telephony_response_and_hold_rsp(void *telephony_device, cme_error_t err)
-{
-	return telephony_generic_rsp(telephony_device, err);
-}
-
-static int response_and_hold(struct audio_device *device, const char *buf)
-{
-	struct headset *hs = device->headset;
-
-	if (strlen(buf) < 8)
-		return -EINVAL;
-
-	if (ag.rh == BTRH_NOT_SUPPORTED)
-		return telephony_generic_rsp(device, CME_ERROR_NOT_SUPPORTED);
-
-	if (buf[7] == '=') {
-		telephony_response_and_hold_req(device, atoi(&buf[8]) < 0);
-		return 0;
-	}
-
-	if (ag.rh >= 0)
-		headset_send(hs, "\r\n+BTRH: %d\r\n", ag.rh);
-
-	return headset_send(hs, "\r\nOK\r\n");
-}
-
-int telephony_last_dialed_number_rsp(void *telephony_device, cme_error_t err)
-{
-	return telephony_generic_rsp(telephony_device, err);
-}
-
-static int last_dialed_number(struct audio_device *device, const char *buf)
-{
-	telephony_last_dialed_number_req(device);
-
-	return 0;
-}
-
-int telephony_dial_number_rsp(void *telephony_device, cme_error_t err)
-{
-	return telephony_generic_rsp(telephony_device, err);
-}
-
-static int dial_number(struct audio_device *device, const char *buf)
-{
-	char number[BUF_SIZE];
-	size_t buf_len;
-
-	buf_len = strlen(buf);
-
-	if (buf[buf_len - 1] != ';') {
-		DBG("Rejecting non-voice call dial request");
-		return -EINVAL;
-	}
-
-	memset(number, 0, sizeof(number));
-	strncpy(number, &buf[3], buf_len - 4);
-
-	telephony_dial_number_req(device, number);
-
-	return 0;
-}
-
-static int headset_set_gain(struct audio_device *device, uint16_t gain, char type)
-{
-	struct headset *hs = device->headset;
-	struct headset_slc *slc = hs->slc;
-	const char *name, *property;
-
-	if (gain > 15) {
-		error("Invalid gain value: %u", gain);
-		return -EINVAL;
-	}
-
-	switch (type) {
-	case HEADSET_GAIN_SPEAKER:
-		if (slc->sp_gain == gain) {
-			DBG("Ignoring no-change in speaker gain");
-			return -EALREADY;
-		}
-		name = "SpeakerGainChanged";
-		property = "SpeakerGain";
-		slc->sp_gain = gain;
-		break;
-	case HEADSET_GAIN_MICROPHONE:
-		if (slc->mic_gain == gain) {
-			DBG("Ignoring no-change in microphone gain");
-			return -EALREADY;
-		}
-		name = "MicrophoneGainChanged";
-		property = "MicrophoneGain";
-		slc->mic_gain = gain;
-		break;
-	default:
-		error("Unknown gain setting");
-		return -EINVAL;
-	}
-
-	g_dbus_emit_signal(btd_get_dbus_connection(),
-				device_get_path(device->btd_dev),
-				AUDIO_HEADSET_INTERFACE, name,
-				DBUS_TYPE_UINT16, &gain,
-				DBUS_TYPE_INVALID);
-
-	emit_property_changed(device_get_path(device->btd_dev),
-				AUDIO_HEADSET_INTERFACE, property,
-				DBUS_TYPE_UINT16, &gain);
-
-	return 0;
-}
-
-static int signal_gain_setting(struct audio_device *device, const char *buf)
-{
-	struct headset *hs = device->headset;
-	dbus_uint16_t gain;
-	int err;
-
-	if (strlen(buf) < 8) {
-		error("Too short string for Gain setting");
-		return -EINVAL;
-	}
-
-	gain = (dbus_uint16_t) strtol(&buf[7], NULL, 10);
-
-	err = headset_set_gain(device, gain, buf[5]);
-	if (err < 0 && err != -EALREADY)
-		return err;
-
-	return headset_send(hs, "\r\nOK\r\n");
-}
-
-int telephony_transmit_dtmf_rsp(void *telephony_device, cme_error_t err)
-{
-	return telephony_generic_rsp(telephony_device, err);
-}
-
-static int dtmf_tone(struct audio_device *device, const char *buf)
-{
-	char tone;
-
-	if (strlen(buf) < 8) {
-		error("Too short string for DTMF tone");
-		return -EINVAL;
-	}
-
-	tone = buf[7];
-	if (tone >= '#' && tone <= 'D')
-		telephony_transmit_dtmf_req(device, tone);
-	else
-		return -EINVAL;
-
-	return 0;
-}
-
-int telephony_subscriber_number_rsp(void *telephony_device, cme_error_t err)
-{
-	return telephony_generic_rsp(telephony_device, err);
-}
-
-static int subscriber_number(struct audio_device *device, const char *buf)
-{
-	telephony_subscriber_number_req(device);
-
-	return 0;
-}
-
-int telephony_list_current_calls_rsp(void *telephony_device, cme_error_t err)
-{
-	return telephony_generic_rsp(telephony_device, err);
-}
-
-static int list_current_calls(struct audio_device *device, const char *buf)
-{
-	telephony_list_current_calls_req(device);
-
-	return 0;
-}
-
-static int extended_errors(struct audio_device *device, const char *buf)
-{
-	struct headset *hs = device->headset;
-	struct headset_slc *slc = hs->slc;
-
-	if (strlen(buf) < 9)
-		return -EINVAL;
-
-	if (buf[8] == '1') {
-		slc->cme_enabled = TRUE;
-		DBG("CME errors enabled for headset %p", hs);
-	} else {
-		slc->cme_enabled = FALSE;
-		DBG("CME errors disabled for headset %p", hs);
-	}
-
-	return headset_send(hs, "\r\nOK\r\n");
-}
-
-static int call_waiting_notify(struct audio_device *device, const char *buf)
-{
-	struct headset *hs = device->headset;
-	struct headset_slc *slc = hs->slc;
-
-	if (strlen(buf) < 9)
-		return -EINVAL;
-
-	if (buf[8] == '1') {
-		slc->cwa_enabled = TRUE;
-		DBG("Call waiting notification enabled for headset %p", hs);
-	} else {
-		slc->cwa_enabled = FALSE;
-		DBG("Call waiting notification disabled for headset %p", hs);
-	}
-
-	return headset_send(hs, "\r\nOK\r\n");
-}
-
-int telephony_operator_selection_rsp(void *telephony_device, cme_error_t err)
-{
-	return telephony_generic_rsp(telephony_device, err);
-}
-
-int telephony_call_hold_rsp(void *telephony_device, cme_error_t err)
-{
-	return telephony_generic_rsp(telephony_device, err);
-}
-
-int telephony_nr_and_ec_rsp(void *telephony_device, cme_error_t err)
-{
-	struct audio_device *device = telephony_device;
-	struct headset *hs = device->headset;
-	struct headset_slc *slc = hs->slc;
-
-	if (err == CME_ERROR_NONE) {
-		GSList *l;
-
-		for (l = hs->nrec_cbs; l; l = l->next) {
-			struct headset_nrec_callback *nrec_cb = l->data;
-
-			nrec_cb->cb(device, slc->nrec_req, nrec_cb->user_data);
-		}
-
-		slc->nrec = hs->slc->nrec_req;
-	}
-
-	return telephony_generic_rsp(telephony_device, err);
-}
-
-int telephony_voice_dial_rsp(void *telephony_device, cme_error_t err)
-{
-	return telephony_generic_rsp(telephony_device, err);
-}
-
-int telephony_operator_selection_ind(int mode, const char *oper)
-{
-	if (!active_devices)
-		return -ENODEV;
-
-	send_foreach_headset(active_devices, hfp_cmp,
-				"\r\n+COPS: %d,0,\"%s\"\r\n",
-				mode, oper);
-	return 0;
-}
-
-static int operator_selection(struct audio_device *device, const char *buf)
-{
-	struct headset *hs = device->headset;
-
-	if (strlen(buf) < 8)
-		return -EINVAL;
-
-	switch (buf[7]) {
-	case '?':
-		telephony_operator_selection_req(device);
-		break;
-	case '=':
-		return headset_send(hs, "\r\nOK\r\n");
-	default:
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-static int nr_and_ec(struct audio_device *device, const char *buf)
-{
-	struct headset *hs = device->headset;
-	struct headset_slc *slc = hs->slc;
-
-	if (strlen(buf) < 9)
-		return -EINVAL;
-
-	if (buf[8] == '0')
-		slc->nrec_req = FALSE;
-	else
-		slc->nrec_req = TRUE;
-
-	telephony_nr_and_ec_req(device, slc->nrec_req);
-
-	return 0;
-}
-
-static int voice_dial(struct audio_device *device, const char *buf)
-{
-	gboolean enable;
-
-	if (strlen(buf) < 9)
-		return -EINVAL;
-
-	if (buf[8] == '0')
-		enable = FALSE;
-	else
-		enable = TRUE;
-
-	telephony_voice_dial_req(device, enable);
-
-	return 0;
-}
-
-static int apple_command(struct audio_device *device, const char *buf)
-{
-	DBG("Got Apple command: %s", buf);
-
-	return telephony_generic_rsp(device, CME_ERROR_NONE);
-}
-
-static struct event event_callbacks[] = {
-	{ "ATA", answer_call },
-	{ "ATD", dial_number },
-	{ "AT+VG", signal_gain_setting },
-	{ "AT+BRSF", supported_features },
-	{ "AT+CIND", report_indicators },
-	{ "AT+CMER", event_reporting },
-	{ "AT+CHLD", call_hold },
-	{ "AT+CHUP", terminate_call },
-	{ "AT+CKPD", key_press },
-	{ "AT+CLIP", cli_notification },
-	{ "AT+BTRH", response_and_hold },
-	{ "AT+BLDN", last_dialed_number },
-	{ "AT+VTS", dtmf_tone },
-	{ "AT+CNUM", subscriber_number },
-	{ "AT+CLCC", list_current_calls },
-	{ "AT+CMEE", extended_errors },
-	{ "AT+CCWA", call_waiting_notify },
-	{ "AT+COPS", operator_selection },
-	{ "AT+NREC", nr_and_ec },
-	{ "AT+BVRA", voice_dial },
-	{ "AT+XAPL", apple_command },
-	{ "AT+IPHONEACCEV", apple_command },
-	{ 0 }
-};
-
-static int handle_event(struct audio_device *device, const char *buf)
-{
-	struct event *ev;
-
-	DBG("Received %s", buf);
-
-	for (ev = event_callbacks; ev->cmd; ev++) {
-		if (!strncmp(buf, ev->cmd, strlen(ev->cmd)))
-			return ev->callback(device, buf);
-	}
-
-	return -EINVAL;
-}
-
-static void close_sco(struct audio_device *device)
-{
-	struct headset *hs = device->headset;
-
-	if (hs->sco) {
-		int sock = g_io_channel_unix_get_fd(hs->sco);
-		shutdown(sock, SHUT_RDWR);
-		g_io_channel_shutdown(hs->sco, TRUE, NULL);
-		g_io_channel_unref(hs->sco);
-		hs->sco = NULL;
-	}
-
-	if (hs->sco_id) {
-		g_source_remove(hs->sco_id);
-		hs->sco_id = 0;
-	}
-}
-
-static gboolean rfcomm_io_cb(GIOChannel *chan, GIOCondition cond,
-				struct audio_device *device)
-{
-	struct headset *hs;
-	struct headset_slc *slc;
-	unsigned char buf[BUF_SIZE];
-	ssize_t bytes_read;
-	size_t free_space;
-	int fd;
-
-	if (cond & G_IO_NVAL)
-		return FALSE;
-
-	hs = device->headset;
-	slc = hs->slc;
-
-	if (cond & (G_IO_ERR | G_IO_HUP)) {
-		DBG("ERR or HUP on RFCOMM socket");
-		goto failed;
-	}
-
-	fd = g_io_channel_unix_get_fd(chan);
-
-	bytes_read = read(fd, buf, sizeof(buf) - 1);
-	if (bytes_read < 0)
-		return TRUE;
-
-	free_space = sizeof(slc->buf) - slc->data_start -
-			slc->data_length - 1;
-
-	if (free_space < (size_t) bytes_read) {
-		/* Very likely that the HS is sending us garbage so
-		 * just ignore the data and disconnect */
-		error("Too much data to fit incoming buffer");
-		goto failed;
-	}
-
-	memcpy(&slc->buf[slc->data_start], buf, bytes_read);
-	slc->data_length += bytes_read;
-
-	/* Make sure the data is null terminated so we can use string
-	 * functions */
-	slc->buf[slc->data_start + slc->data_length] = '\0';
-
-	while (slc->data_length > 0) {
-		char *cr;
-		int err;
-		off_t cmd_len;
-
-		cr = strchr(&slc->buf[slc->data_start], '\r');
-		if (!cr)
-			break;
-
-		cmd_len = 1 + (off_t) cr - (off_t) &slc->buf[slc->data_start];
-		*cr = '\0';
-
-		if (cmd_len > 1)
-			err = handle_event(device, &slc->buf[slc->data_start]);
-		else
-			/* Silently skip empty commands */
-			err = 0;
-
-		if (err == -EINVAL) {
-			error("Badly formated or unrecognized command: %s",
-					&slc->buf[slc->data_start]);
-			err = telephony_generic_rsp(device,
-						CME_ERROR_NOT_SUPPORTED);
-			if (err < 0)
-				goto failed;
-		} else if (err < 0)
-			error("Error handling command %s: %s (%d)",
-						&slc->buf[slc->data_start],
-						strerror(-err), -err);
-
-		slc->data_start += cmd_len;
-		slc->data_length -= cmd_len;
-
-		if (!slc->data_length)
-			slc->data_start = 0;
-	}
-
-	return TRUE;
-
-failed:
-	headset_set_state(device, HEADSET_STATE_DISCONNECTED);
-
-	return FALSE;
-}
-
-static gboolean sco_cb(GIOChannel *chan, GIOCondition cond,
-			struct audio_device *device)
-{
-	if (cond & G_IO_NVAL)
-		return FALSE;
-
-	error("Audio connection got disconnected");
-
-	pending_connect_finalize(device);
-	headset_set_state(device, HEADSET_STATE_CONNECTED);
-
-	return FALSE;
-}
-
-void headset_connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
-{
-	struct audio_device *dev = user_data;
-	struct headset *hs = dev->headset;
-	struct pending_connect *p = hs->pending;
-	char hs_address[18];
-
-	if (err) {
-		error("%s", err->message);
-		goto failed;
-	}
-
-	/* For HFP telephony isn't ready just disconnect */
-	if (hs->hfp_active && !ag.telephony_ready) {
-		error("Unable to accept HFP connection since the telephony "
-				"subsystem isn't initialized");
-		goto failed;
-	}
-
-	hs->rfcomm = hs->tmp_rfcomm;
-	hs->tmp_rfcomm = NULL;
-
-	ba2str(&dev->dst, hs_address);
-
-	if (p)
-		p->io = NULL;
-	else
-		hs->auto_dc = FALSE;
-
-	g_io_add_watch(chan, G_IO_IN | G_IO_ERR | G_IO_HUP| G_IO_NVAL,
-			(GIOFunc) rfcomm_io_cb, dev);
-
-	DBG("%s: Connected to %s", device_get_path(dev->btd_dev), hs_address);
-
-	hs->slc = g_new0(struct headset_slc, 1);
-	hs->slc->sp_gain = 15;
-	hs->slc->mic_gain = 15;
-	hs->slc->nrec = TRUE;
-
-	/* In HFP mode wait for Service Level Connection */
-	if (hs->hfp_active)
-		return;
-
-	headset_set_state(dev, HEADSET_STATE_CONNECTED);
-
-	if (p && p->target_state == HEADSET_STATE_PLAYING) {
-		p->err = sco_connect(dev, NULL, NULL, NULL);
-		if (p->err < 0)
-			goto failed;
-		return;
-	}
-
-	if (p && p->msg) {
-		DBusMessage *reply = dbus_message_new_method_return(p->msg);
-		g_dbus_send_message(btd_get_dbus_connection(), reply);
-	}
-
-	pending_connect_finalize(dev);
-
-	return;
-
-failed:
-	if (p && p->msg)
-		error_connect_failed(p->msg, p->err);
-	pending_connect_finalize(dev);
-	if (hs->rfcomm)
-		headset_set_state(dev, HEADSET_STATE_CONNECTED);
-	else
-		headset_set_state(dev, HEADSET_STATE_DISCONNECTED);
-}
-
-static int headset_set_channel(struct headset *headset,
-				const sdp_record_t *record, uint16_t svc)
-{
-	int ch;
-	sdp_list_t *protos;
-
-	if (sdp_get_access_protos(record, &protos) < 0) {
-		error("Unable to get access protos from headset record");
-		return -1;
-	}
-
-	ch = sdp_get_proto_port(protos, RFCOMM_UUID);
-
-	sdp_list_foreach(protos, (sdp_list_func_t) sdp_list_free, NULL);
-	sdp_list_free(protos, NULL);
-
-	if (ch <= 0) {
-		error("Unable to get RFCOMM channel from Headset record");
-		return -1;
-	}
-
-	headset->rfcomm_ch = ch;
-
-	if (svc == HANDSFREE_SVCLASS_ID) {
-		headset->hfp_handle = record->handle;
-		headset->hsp_handle = 0;
-		DBG("Discovered Handsfree service on channel %d", ch);
-	} else {
-		headset->hsp_handle = record->handle;
-		headset->hfp_handle = 0;
-		DBG("Discovered Headset service on channel %d", ch);
-	}
-
-	return 0;
-}
-
-static void get_record_cb(sdp_list_t *recs, int err, gpointer user_data)
-{
-	struct audio_device *dev = user_data;
-	struct headset *hs = dev->headset;
-	struct pending_connect *p = hs->pending;
-	sdp_record_t *record = NULL;
-	sdp_list_t *r;
-	uuid_t uuid;
-
-	assert(hs->pending != NULL);
-
-	if (err < 0) {
-		error("Unable to get service record: %s (%d)",
-							strerror(-err), -err);
-		p->err = -err;
-		if (p->msg)
-			error_connect_failed(p->msg, p->err);
-		goto failed;
-	}
-
-	if (!recs || !recs->data) {
-		error("No records found");
-		goto failed_not_supported;
-	}
-
-	sdp_uuid16_create(&uuid, p->svclass);
-
-	for (r = recs; r != NULL; r = r->next) {
-		sdp_list_t *classes;
-		uuid_t class;
-
-		record = r->data;
-
-		if (sdp_get_service_classes(record, &classes) < 0) {
-			error("Unable to get service classes from record");
-			continue;
-		}
-
-		memcpy(&class, classes->data, sizeof(uuid));
-
-		sdp_list_free(classes, free);
-
-		if (sdp_uuid_cmp(&class, &uuid) == 0)
-			break;
-	}
-
-	if (r == NULL) {
-		error("No record found with UUID 0x%04x", p->svclass);
-		goto failed_not_supported;
-	}
-
-	if (headset_set_channel(hs, record, p->svclass) < 0) {
-		error("Unable to extract RFCOMM channel from service record");
-		goto failed_not_supported;
-	}
-
-	/* Set svclass to 0 so we can easily check that SDP is no-longer
-	 * going on (to know if bt_cancel_discovery needs to be called) */
-	p->svclass = 0;
-
-	err = rfcomm_connect(dev, NULL, NULL, NULL);
-	if (err < 0) {
-		error("Unable to connect: %s (%d)", strerror(-err), -err);
-		p->err = -err;
-		if (p->msg != NULL)
-			error_connect_failed(p->msg, p->err);
-		goto failed;
-	}
-
-	return;
-
-failed_not_supported:
-	if (p->svclass == HANDSFREE_SVCLASS_ID &&
-			get_records(dev, NULL, NULL, NULL) == 0)
-		return;
-	if (p->msg) {
-		DBusMessage *reply = btd_error_not_supported(p->msg);
-		g_dbus_send_message(btd_get_dbus_connection(), reply);
-	}
-failed:
-	p->svclass = 0;
-	pending_connect_finalize(dev);
-	headset_set_state(dev, HEADSET_STATE_DISCONNECTED);
-}
-
-static int get_records(struct audio_device *device, headset_stream_cb_t cb,
-			void *user_data, unsigned int *cb_id)
-{
-	struct headset *hs = device->headset;
-	uint16_t svclass;
-	uuid_t uuid;
-	int err;
-
-	if (hs->pending && hs->pending->svclass == HANDSFREE_SVCLASS_ID)
-		svclass = HEADSET_SVCLASS_ID;
-	else
-		svclass = hs->search_hfp ? HANDSFREE_SVCLASS_ID :
-							HEADSET_SVCLASS_ID;
-
-	sdp_uuid16_create(&uuid, svclass);
-
-	err = bt_search_service(&device->src, &device->dst, &uuid,
-						get_record_cb, device, NULL);
-	if (err < 0)
-		return err;
-
-	if (hs->pending) {
-		hs->pending->svclass = svclass;
-		return 0;
-	}
-
-	headset_set_state(device, HEADSET_STATE_CONNECTING);
-
-	pending_connect_init(hs, HEADSET_STATE_CONNECTED);
-
-	hs->pending->svclass = svclass;
-
-	if (cb) {
-		unsigned int id;
-		id = connect_cb_new(hs, HEADSET_STATE_CONNECTED,
-					cb, user_data);
-		if (cb_id)
-			*cb_id = id;
-	}
-
-	return 0;
-}
-
-static int rfcomm_connect(struct audio_device *dev, headset_stream_cb_t cb,
-				void *user_data, unsigned int *cb_id)
-{
-	struct headset *hs = dev->headset;
-	char address[18];
-	GError *err = NULL;
-
-	if (hs->rfcomm_ch < 0)
-		return get_records(dev, cb, user_data, cb_id);
-
-	ba2str(&dev->dst, address);
-
-	DBG("%s: Connecting to %s channel %d", device_get_path(dev->btd_dev),
-						address, hs->rfcomm_ch);
-
-	hs->tmp_rfcomm = bt_io_connect(headset_connect_cb, dev,
-					NULL, &err,
-					BT_IO_OPT_SOURCE_BDADDR, &dev->src,
-					BT_IO_OPT_DEST_BDADDR, &dev->dst,
-					BT_IO_OPT_CHANNEL, hs->rfcomm_ch,
-					BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
-					BT_IO_OPT_INVALID);
-
-	hs->rfcomm_ch = -1;
-
-	if (!hs->tmp_rfcomm) {
-		error("%s", err->message);
-		g_error_free(err);
-		return -EIO;
-	}
-
-	hs->hfp_active = hs->hfp_handle != 0 ? TRUE : FALSE;
-	hs->rfcomm_initiator = FALSE;
-
-	headset_set_state(dev, HEADSET_STATE_CONNECTING);
-
-	pending_connect_init(hs, HEADSET_STATE_CONNECTED);
-
-	if (cb) {
-		unsigned int id = connect_cb_new(hs, HEADSET_STATE_CONNECTED,
-							cb, user_data);
-		if (cb_id)
-			*cb_id = id;
-	}
-
-	return 0;
-}
-
-static DBusMessage *hs_stop(DBusConnection *conn, DBusMessage *msg,
-					void *data)
-{
-	struct audio_device *device = data;
-	struct headset *hs = device->headset;
-	DBusMessage *reply = NULL;
-
-	if (hs->state < HEADSET_STATE_PLAY_IN_PROGRESS)
-		return btd_error_not_connected(msg);
-
-	reply = dbus_message_new_method_return(msg);
-	if (!reply)
-		return NULL;
-
-	headset_set_state(device, HEADSET_STATE_CONNECTED);
-
-	return reply;
-}
-
-static DBusMessage *hs_disconnect(DBusConnection *conn, DBusMessage *msg,
-					void *data)
-{
-	struct audio_device *device = data;
-	struct headset *hs = device->headset;
-	char hs_address[18];
-
-	if (hs->state == HEADSET_STATE_DISCONNECTED)
-		return btd_error_not_connected(msg);
-
-	headset_shutdown(device);
-	ba2str(&device->dst, hs_address);
-	info("Disconnected from %s, %s", hs_address,
-					device_get_path(device->btd_dev));
-
-	return dbus_message_new_method_return(msg);
-
-}
-
-static DBusMessage *hs_is_connected(DBusConnection *conn,
-						DBusMessage *msg,
-						void *data)
-{
-	struct audio_device *device = data;
-	DBusMessage *reply;
-	dbus_bool_t connected;
-
-	reply = dbus_message_new_method_return(msg);
-	if (!reply)
-		return NULL;
-
-	connected = (device->headset->state >= HEADSET_STATE_CONNECTED);
-
-	dbus_message_append_args(reply, DBUS_TYPE_BOOLEAN, &connected,
-					DBUS_TYPE_INVALID);
-
-	return reply;
-}
-
-static DBusMessage *hs_connect(DBusConnection *conn, DBusMessage *msg,
-					void *data)
-{
-	struct audio_device *device = data;
-	struct headset *hs = device->headset;
-	int err;
-
-	if (hs->state == HEADSET_STATE_CONNECTING)
-		return btd_error_in_progress(msg);
-	else if (hs->state > HEADSET_STATE_CONNECTING)
-		return btd_error_already_connected(msg);
-
-	if (hs->hfp_handle && !ag.telephony_ready)
-		return btd_error_not_ready(msg);
-
-	device->auto_connect = FALSE;
-
-	err = rfcomm_connect(device, NULL, NULL, NULL);
-	if (err < 0)
-		return btd_error_failed(msg, strerror(-err));
-
-	hs->auto_dc = FALSE;
-
-	hs->pending->msg = dbus_message_ref(msg);
-
-	return NULL;
-}
-
-static DBusMessage *hs_ring(DBusConnection *conn, DBusMessage *msg,
-					void *data)
-{
-	struct audio_device *device = data;
-	struct headset *hs = device->headset;
-	DBusMessage *reply = NULL;
-	int err;
-
-	if (hs->state < HEADSET_STATE_CONNECTED)
-		return btd_error_not_connected(msg);
-
-	reply = dbus_message_new_method_return(msg);
-	if (!reply)
-		return NULL;
-
-	if (ag.ring_timer) {
-		DBG("IndicateCall received when already indicating");
-		return reply;
-	}
-
-	err = headset_send(hs, "\r\nRING\r\n");
-	if (err < 0) {
-		dbus_message_unref(reply);
-		return btd_error_failed(msg, strerror(-err));
-	}
-
-	ring_timer_cb(NULL);
-	ag.ring_timer = g_timeout_add_seconds(RING_INTERVAL, ring_timer_cb,
-						NULL);
-
-	return reply;
-}
-
-static DBusMessage *hs_cancel_call(DBusConnection *conn,
-					DBusMessage *msg,
-					void *data)
-{
-	struct audio_device *device = data;
-	struct headset *hs = device->headset;
-	DBusMessage *reply = NULL;
-
-	if (hs->state < HEADSET_STATE_CONNECTED)
-		return btd_error_not_connected(msg);
-
-	reply = dbus_message_new_method_return(msg);
-	if (!reply)
-		return NULL;
-
-	if (ag.ring_timer) {
-		g_source_remove(ag.ring_timer);
-		ag.ring_timer = 0;
-	} else
-		DBG("Got CancelCall method call but no call is active");
-
-	return reply;
-}
-
-static DBusMessage *hs_set_gain(DBusMessage *msg,
-				void *data, uint16_t gain,
-				char type)
-{
-	struct audio_device *device = data;
-	struct headset *hs = device->headset;
-	DBusMessage *reply;
-	int err;
-
-	if (hs->state < HEADSET_STATE_CONNECTED)
-		return btd_error_not_connected(msg);
-
-	err = headset_set_gain(device, gain, type);
-	if (err < 0)
-		return btd_error_invalid_args(msg);
-
-	reply = dbus_message_new_method_return(msg);
-	if (!reply)
-		return NULL;
-
-	if (hs->state == HEADSET_STATE_PLAYING) {
-		err = headset_send(hs, "\r\n+VG%c=%u\r\n", type, gain);
-		if (err < 0) {
-			dbus_message_unref(reply);
-			return btd_error_failed(msg, strerror(-err));
-		}
-	}
-
-	return reply;
-}
-
-static DBusMessage *hs_get_properties(DBusConnection *conn,
-					DBusMessage *msg, void *data)
-{
-	struct audio_device *device = data;
-	DBusMessage *reply;
-	DBusMessageIter iter;
-	DBusMessageIter dict;
-	gboolean value;
-	const char *state;
-
-	reply = dbus_message_new_method_return(msg);
-	if (!reply)
-		return NULL;
-
-	dbus_message_iter_init_append(reply, &iter);
-
-	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
-			DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
-			DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
-			DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
-
-
-	/* Playing */
-	value = (device->headset->state == HEADSET_STATE_PLAYING);
-	dict_append_entry(&dict, "Playing", DBUS_TYPE_BOOLEAN, &value);
-
-	/* State */
-	state = state2str(device->headset->state);
-	if (state)
-		dict_append_entry(&dict, "State", DBUS_TYPE_STRING, &state);
-
-	/* Connected */
-	value = (device->headset->state >= HEADSET_STATE_CONNECTED);
-	dict_append_entry(&dict, "Connected", DBUS_TYPE_BOOLEAN, &value);
-
-	if (!value)
-		goto done;
-
-	/* SpeakerGain */
-	dict_append_entry(&dict, "SpeakerGain",
-				DBUS_TYPE_UINT16,
-				&device->headset->slc->sp_gain);
-
-	/* MicrophoneGain */
-	dict_append_entry(&dict, "MicrophoneGain",
-				DBUS_TYPE_UINT16,
-				&device->headset->slc->mic_gain);
-
-done:
-	dbus_message_iter_close_container(&iter, &dict);
-
-	return reply;
-}
-
-static DBusMessage *hs_set_property(DBusConnection *conn,
-					DBusMessage *msg, void *data)
-{
-	const char *property;
-	DBusMessageIter iter;
-	DBusMessageIter sub;
-	uint16_t gain;
-
-	if (!dbus_message_iter_init(msg, &iter))
-		return btd_error_invalid_args(msg);
-
-	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
-		return btd_error_invalid_args(msg);
-
-	dbus_message_iter_get_basic(&iter, &property);
-	dbus_message_iter_next(&iter);
-
-	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
-		return btd_error_invalid_args(msg);
-	dbus_message_iter_recurse(&iter, &sub);
-
-	if (g_str_equal("SpeakerGain", property)) {
-		if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_UINT16)
-			return btd_error_invalid_args(msg);
-
-		dbus_message_iter_get_basic(&sub, &gain);
-		return hs_set_gain(msg, data, gain,
-					HEADSET_GAIN_SPEAKER);
-	} else if (g_str_equal("MicrophoneGain", property)) {
-		if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_UINT16)
-			return btd_error_invalid_args(msg);
-
-		dbus_message_iter_get_basic(&sub, &gain);
-		return hs_set_gain(msg, data, gain,
-					HEADSET_GAIN_MICROPHONE);
-	}
-
-	return btd_error_invalid_args(msg);
-}
-
-static const GDBusMethodTable headset_methods[] = {
-	{ GDBUS_ASYNC_METHOD("Connect", NULL, NULL, hs_connect) },
-	{ GDBUS_METHOD("Disconnect", NULL, NULL, hs_disconnect) },
-	{ GDBUS_METHOD("IsConnected",
-			NULL, GDBUS_ARGS({ "connected", "b" }),
-			hs_is_connected) },
-	{ GDBUS_METHOD("IndicateCall", NULL, NULL, hs_ring) },
-	{ GDBUS_METHOD("CancelCall", NULL, NULL, hs_cancel_call) },
-	{ GDBUS_METHOD("Stop", NULL, NULL, hs_stop) },
-	{ GDBUS_METHOD("GetProperties",
-			NULL, GDBUS_ARGS({ "properties", "a{sv}" }),
-			hs_get_properties) },
-	{ GDBUS_METHOD("SetProperty",
-			GDBUS_ARGS({ "name", "s" }, { "value", "v" }), NULL,
-			hs_set_property) },
-	{ }
-};
-
-static const GDBusSignalTable headset_signals[] = {
-	{ GDBUS_DEPRECATED_SIGNAL("Connected", NULL) },
-	{ GDBUS_DEPRECATED_SIGNAL("Disconnected", NULL) },
-	{ GDBUS_SIGNAL("AnswerRequested", NULL) },
-	{ GDBUS_DEPRECATED_SIGNAL("Stopped", NULL) },
-	{ GDBUS_DEPRECATED_SIGNAL("Playing", NULL) },
-	{ GDBUS_DEPRECATED_SIGNAL("SpeakerGainChanged",
-						GDBUS_ARGS({ "gain", "q" })) },
-	{ GDBUS_DEPRECATED_SIGNAL("MicrophoneGainChanged",
-						GDBUS_ARGS({ "gain", "q" })) },
-	{ GDBUS_SIGNAL("CallTerminated", NULL) },
-	{ GDBUS_SIGNAL("PropertyChanged",
-			GDBUS_ARGS({ "name", "s" }, { "value", "v" })) },
-	{ }
-};
-
-void headset_update(struct audio_device *dev, struct headset *headset,
-								GSList *uuids)
-{
-	const sdp_record_t *record;
-
-	if (g_slist_find_custom(uuids, HFP_HS_UUID, bt_uuid_strcmp) &&
-						headset->hfp_handle == 0) {
-		record = btd_device_get_record(dev->btd_dev, HFP_HS_UUID);
-		if (record)
-			headset->hfp_handle = record->handle;
-	}
-
-	if (g_slist_find_custom(uuids, HSP_HS_UUID, bt_uuid_strcmp) &&
-						headset->hsp_handle == 0) {
-		record = btd_device_get_record(dev->btd_dev, HSP_HS_UUID);
-		if (record)
-			headset->hsp_handle = record->handle;
-	}
-}
-
-static int headset_close_rfcomm(struct audio_device *dev)
-{
-	struct headset *hs = dev->headset;
-	GIOChannel *rfcomm = hs->tmp_rfcomm ? hs->tmp_rfcomm : hs->rfcomm;
-
-	if (rfcomm) {
-		g_io_channel_shutdown(rfcomm, TRUE, NULL);
-		g_io_channel_unref(rfcomm);
-		hs->tmp_rfcomm = NULL;
-		hs->rfcomm = NULL;
-	}
-
-	g_free(hs->slc);
-	hs->slc = NULL;
-
-	return 0;
-}
-
-static void headset_free(struct audio_device *dev)
-{
-	struct headset *hs = dev->headset;
-
-	if (hs->dc_timer) {
-		g_source_remove(hs->dc_timer);
-		hs->dc_timer = 0;
-	}
-
-	close_sco(dev);
-
-	headset_close_rfcomm(dev);
-
-	g_slist_free_full(hs->nrec_cbs, g_free);
-
-	g_free(hs);
-	dev->headset = NULL;
-}
-
-static void path_unregister(void *data)
-{
-	struct audio_device *dev = data;
-	struct headset *hs = dev->headset;
-
-	if (hs->state > HEADSET_STATE_DISCONNECTED) {
-		DBG("Headset unregistered while device was connected!");
-		headset_shutdown(dev);
-	}
-
-	DBG("Unregistered interface %s on path %s",
-		AUDIO_HEADSET_INTERFACE, device_get_path(dev->btd_dev));
-
-	headset_free(dev);
-}
-
-void headset_unregister(struct audio_device *dev)
-{
-	g_dbus_unregister_interface(btd_get_dbus_connection(),
-						device_get_path(dev->btd_dev),
-						AUDIO_HEADSET_INTERFACE);
-}
-
-struct headset *headset_init(struct audio_device *dev, GSList *uuids,
-							gboolean hfp_enabled)
-{
-	struct headset *hs;
-
-	hs = g_new0(struct headset, 1);
-	hs->rfcomm_ch = -1;
-	hs->search_hfp = hfp_enabled;
-
-	headset_update(dev, hs, uuids);
-
-	if (!g_dbus_register_interface(btd_get_dbus_connection(),
-					device_get_path(dev->btd_dev),
-					AUDIO_HEADSET_INTERFACE,
-					headset_methods, headset_signals, NULL,
-					dev, path_unregister)) {
-		g_free(hs);
-		return NULL;
-	}
-
-	DBG("Registered interface %s on path %s", AUDIO_HEADSET_INTERFACE,
-						device_get_path(dev->btd_dev));
-
-	return hs;
-}
-
-uint32_t headset_config_init(GKeyFile *config)
-{
-	GError *err = NULL;
-	char *str;
-
-	/* Use the default values if there is no config file */
-	if (config == NULL)
-		return ag.features;
-
-	str = g_key_file_get_string(config, "General", "SCORouting",
-					&err);
-	if (err) {
-		DBG("audio.conf: %s", err->message);
-		g_clear_error(&err);
-	} else {
-		if (strcmp(str, "PCM") == 0)
-			sco_hci = FALSE;
-		else if (strcmp(str, "HCI") == 0)
-			sco_hci = TRUE;
-		else
-			error("Invalid Headset Routing value: %s", str);
-		g_free(str);
-	}
-
-	/* Init fast connectable option */
-	str = g_key_file_get_string(config, "Headset", "FastConnectable",
-					&err);
-	if (err) {
-		DBG("audio.conf: %s", err->message);
-		g_clear_error(&err);
-	} else {
-		fast_connectable = strcmp(str, "true") == 0;
-		if (fast_connectable)
-			manager_set_fast_connectable(FALSE);
-		g_free(str);
-	}
-
-	return ag.features;
-}
-
-static gboolean hs_dc_timeout(struct audio_device *dev)
-{
-	headset_set_state(dev, HEADSET_STATE_DISCONNECTED);
-	return FALSE;
-}
-
-gboolean headset_cancel_stream(struct audio_device *dev, unsigned int id)
-{
-	struct headset *hs = dev->headset;
-	struct pending_connect *p = hs->pending;
-	GSList *l;
-	struct connect_cb *cb = NULL;
-
-	if (!p)
-		return FALSE;
-
-	for (l = p->callbacks; l != NULL; l = l->next) {
-		struct connect_cb *tmp = l->data;
-
-		if (tmp->id == id) {
-			cb = tmp;
-			break;
-		}
-	}
-
-	if (!cb)
-		return FALSE;
-
-	p->callbacks = g_slist_remove(p->callbacks, cb);
-	g_free(cb);
-
-	if (p->callbacks || p->msg)
-		return TRUE;
-
-	if (hs->auto_dc) {
-		if (hs->rfcomm)
-			hs->dc_timer = g_timeout_add_seconds(DC_TIMEOUT,
-						(GSourceFunc) hs_dc_timeout,
-						dev);
-		else
-			headset_set_state(dev, HEADSET_STATE_DISCONNECTED);
-	}
-
-	return TRUE;
-}
-
-static gboolean dummy_connect_complete(struct audio_device *dev)
-{
-	pending_connect_finalize(dev);
-	return FALSE;
-}
-
-unsigned int headset_request_stream(struct audio_device *dev,
-					headset_stream_cb_t cb,
-					void *user_data)
-{
-	struct headset *hs = dev->headset;
-	unsigned int id;
-
-	if (hs->state == HEADSET_STATE_PLAYING) {
-		id = connect_cb_new(hs, HEADSET_STATE_PLAYING, cb, user_data);
-		g_idle_add((GSourceFunc) dummy_connect_complete, dev);
-		return id;
-	}
-
-	if (hs->dc_timer) {
-		g_source_remove(hs->dc_timer);
-		hs->dc_timer = 0;
-	}
-
-	if (hs->state == HEADSET_STATE_CONNECTING ||
-			hs->state == HEADSET_STATE_PLAY_IN_PROGRESS)
-		return connect_cb_new(hs, HEADSET_STATE_PLAYING, cb, user_data);
-
-	if (hs->rfcomm == NULL) {
-		if (rfcomm_connect(dev, cb, user_data, &id) < 0)
-			return 0;
-		hs->auto_dc = TRUE;
-	} else if (sco_connect(dev, cb, user_data, &id) < 0)
-		return 0;
-
-	hs->pending->target_state = HEADSET_STATE_PLAYING;
-
-	return id;
-}
-
-unsigned int headset_config_stream(struct audio_device *dev,
-					gboolean auto_dc,
-					headset_stream_cb_t cb,
-					void *user_data)
-{
-	struct headset *hs = dev->headset;
-	unsigned int id = 0;
-
-	if (hs->dc_timer) {
-		g_source_remove(hs->dc_timer);
-		hs->dc_timer = 0;
-	}
-
-	if (hs->state == HEADSET_STATE_CONNECTING)
-		return connect_cb_new(hs, HEADSET_STATE_CONNECTED, cb,
-					user_data);
-
-	if (hs->rfcomm)
-		goto done;
-
-	if (rfcomm_connect(dev, cb, user_data, &id) < 0)
-		return 0;
-
-	hs->auto_dc = auto_dc;
-	hs->pending->target_state = HEADSET_STATE_CONNECTED;
-
-	return id;
-
-done:
-	id = connect_cb_new(hs, HEADSET_STATE_CONNECTED, cb, user_data);
-	g_idle_add((GSourceFunc) dummy_connect_complete, dev);
-	return id;
-}
-
-unsigned int headset_suspend_stream(struct audio_device *dev,
-					headset_stream_cb_t cb,
-					void *user_data)
-{
-	struct headset *hs = dev->headset;
-	unsigned int id;
-	int sock;
-
-	if (hs->state == HEADSET_STATE_DISCONNECTED ||
-				hs->state == HEADSET_STATE_CONNECTING)
-		return 0;
-
-	if (hs->dc_timer) {
-		g_source_remove(hs->dc_timer);
-		hs->dc_timer = 0;
-	}
-
-	if (hs->sco) {
-		sock = g_io_channel_unix_get_fd(hs->sco);
-
-		/* shutdown but leave the socket open and wait for hup */
-		shutdown(sock, SHUT_RDWR);
-	} else {
-		headset_set_state(dev, HEADSET_STATE_CONNECTED);
-
-		g_idle_add((GSourceFunc) dummy_connect_complete, dev);
-	}
-
-	id = connect_cb_new(hs, HEADSET_STATE_CONNECTED, cb, user_data);
-
-	return id;
-}
-
-gboolean headset_get_hfp_active(struct audio_device *dev)
-{
-	struct headset *hs = dev->headset;
-
-	return hs->hfp_active;
-}
-
-void headset_set_hfp_active(struct audio_device *dev, gboolean active)
-{
-	struct headset *hs = dev->headset;
-
-	hs->hfp_active = active;
-}
-
-gboolean headset_get_rfcomm_initiator(struct audio_device *dev)
-{
-	struct headset *hs = dev->headset;
-
-	return hs->rfcomm_initiator;
-}
-
-void headset_set_rfcomm_initiator(struct audio_device *dev,
-					gboolean initiator)
-{
-	struct headset *hs = dev->headset;
-
-	hs->rfcomm_initiator = initiator;
-}
-
-GIOChannel *headset_get_rfcomm(struct audio_device *dev)
-{
-	struct headset *hs = dev->headset;
-
-	return hs->tmp_rfcomm;
-}
-
-int headset_connect_rfcomm(struct audio_device *dev, GIOChannel *io)
-{
-	struct headset *hs = dev->headset;
-
-	if (hs->tmp_rfcomm)
-		return -EALREADY;
-
-	hs->tmp_rfcomm = g_io_channel_ref(io);
-
-	return 0;
-}
-
-int headset_connect_sco(struct audio_device *dev, GIOChannel *io)
-{
-	struct headset *hs = dev->headset;
-	struct headset_slc *slc = hs->slc;
-
-	if (hs->sco)
-		return -EISCONN;
-
-	hs->sco = g_io_channel_ref(io);
-
-	if (slc->pending_ring) {
-		ring_timer_cb(NULL);
-		ag.ring_timer = g_timeout_add_seconds(RING_INTERVAL,
-						ring_timer_cb,
-						NULL);
-		slc->pending_ring = FALSE;
-	}
-
-	return 0;
-}
-
-void headset_set_state(struct audio_device *dev, headset_state_t state)
-{
-	struct headset *hs = dev->headset;
-	struct headset_slc *slc = hs->slc;
-	gboolean value;
-	const char *state_str;
-	headset_state_t old_state = hs->state;
-	GSList *l;
-
-	if (old_state == state)
-		return;
-
-	state_str = state2str(state);
-
-	switch (state) {
-	case HEADSET_STATE_DISCONNECTED:
-		value = FALSE;
-		close_sco(dev);
-		headset_close_rfcomm(dev);
-		emit_property_changed(device_get_path(dev->btd_dev),
-					AUDIO_HEADSET_INTERFACE, "State",
-					DBUS_TYPE_STRING, &state_str);
-		g_dbus_emit_signal(btd_get_dbus_connection(),
-					device_get_path(dev->btd_dev),
-					AUDIO_HEADSET_INTERFACE,
-					"Disconnected",
-					DBUS_TYPE_INVALID);
-		if (hs->state > HEADSET_STATE_CONNECTING) {
-			emit_property_changed(device_get_path(dev->btd_dev),
-					AUDIO_HEADSET_INTERFACE, "Connected",
-					DBUS_TYPE_BOOLEAN, &value);
-			telephony_device_disconnected(dev);
-		}
-		active_devices = g_slist_remove(active_devices, dev);
-		break;
-	case HEADSET_STATE_CONNECTING:
-		emit_property_changed(device_get_path(dev->btd_dev),
-					AUDIO_HEADSET_INTERFACE, "State",
-					DBUS_TYPE_STRING, &state_str);
-		break;
-	case HEADSET_STATE_CONNECTED:
-		close_sco(dev);
-		if (hs->state != HEADSET_STATE_PLAY_IN_PROGRESS)
-			emit_property_changed(device_get_path(dev->btd_dev),
-					AUDIO_HEADSET_INTERFACE, "State",
-					DBUS_TYPE_STRING, &state_str);
-		if (hs->state < state) {
-			if (ag.features & AG_FEATURE_INBAND_RINGTONE)
-				slc->inband_ring = TRUE;
-			else
-				slc->inband_ring = FALSE;
-			g_dbus_emit_signal(btd_get_dbus_connection(),
-						device_get_path(dev->btd_dev),
-						AUDIO_HEADSET_INTERFACE,
-						"Connected",
-						DBUS_TYPE_INVALID);
-			value = TRUE;
-			emit_property_changed(device_get_path(dev->btd_dev),
-						AUDIO_HEADSET_INTERFACE,
-						"Connected",
-						DBUS_TYPE_BOOLEAN, &value);
-			active_devices = g_slist_append(active_devices, dev);
-			telephony_device_connected(dev);
-		} else if (hs->state == HEADSET_STATE_PLAYING) {
-			value = FALSE;
-			g_dbus_emit_signal(btd_get_dbus_connection(),
-						device_get_path(dev->btd_dev),
-						AUDIO_HEADSET_INTERFACE,
-						"Stopped",
-						DBUS_TYPE_INVALID);
-			emit_property_changed(device_get_path(dev->btd_dev),
-						AUDIO_HEADSET_INTERFACE,
-						"Playing",
-						DBUS_TYPE_BOOLEAN, &value);
-		}
-		break;
-	case HEADSET_STATE_PLAY_IN_PROGRESS:
-		break;
-	case HEADSET_STATE_PLAYING:
-		value = TRUE;
-		emit_property_changed(device_get_path(dev->btd_dev),
-					AUDIO_HEADSET_INTERFACE, "State",
-					DBUS_TYPE_STRING, &state_str);
-
-		/* Do not watch HUP since we need to know when the link is
-		   really disconnected */
-		hs->sco_id = g_io_add_watch(hs->sco,
-					G_IO_ERR | G_IO_NVAL,
-					(GIOFunc) sco_cb, dev);
-
-		g_dbus_emit_signal(btd_get_dbus_connection(),
-					device_get_path(dev->btd_dev),
-					AUDIO_HEADSET_INTERFACE, "Playing",
-					DBUS_TYPE_INVALID);
-		emit_property_changed(device_get_path(dev->btd_dev),
-					AUDIO_HEADSET_INTERFACE, "Playing",
-					DBUS_TYPE_BOOLEAN, &value);
-
-		if (slc->sp_gain >= 0)
-			headset_send(hs, "\r\n+VGS=%u\r\n", slc->sp_gain);
-		if (slc->mic_gain >= 0)
-			headset_send(hs, "\r\n+VGM=%u\r\n", slc->mic_gain);
-		break;
-	}
-
-	hs->state = state;
-
-	DBG("State changed %s: %s -> %s", device_get_path(dev->btd_dev),
-				str_state[old_state], str_state[state]);
-
-	for (l = headset_callbacks; l != NULL; l = l->next) {
-		struct headset_state_callback *cb = l->data;
-		cb->cb(dev, old_state, state, cb->user_data);
-	}
-}
-
-headset_state_t headset_get_state(struct audio_device *dev)
-{
-	struct headset *hs = dev->headset;
-
-	return hs->state;
-}
-
-int headset_get_channel(struct audio_device *dev)
-{
-	struct headset *hs = dev->headset;
-
-	return hs->rfcomm_ch;
-}
-
-gboolean headset_is_active(struct audio_device *dev)
-{
-	struct headset *hs = dev->headset;
-
-	if (hs->state != HEADSET_STATE_DISCONNECTED)
-		return TRUE;
-
-	return FALSE;
-}
-
-headset_lock_t headset_get_lock(struct audio_device *dev)
-{
-	struct headset *hs = dev->headset;
-
-	return hs->lock;
-}
-
-gboolean headset_lock(struct audio_device *dev, headset_lock_t lock)
-{
-	struct headset *hs = dev->headset;
-
-	if (hs->lock & lock)
-		return FALSE;
-
-	hs->lock |= lock;
-
-	return TRUE;
-}
-
-gboolean headset_unlock(struct audio_device *dev, headset_lock_t lock)
-{
-	struct headset *hs = dev->headset;
-
-	if (!(hs->lock & lock))
-		return FALSE;
-
-	hs->lock &= ~lock;
-
-	if (hs->lock)
-		return TRUE;
-
-	if (hs->state == HEADSET_STATE_PLAYING)
-		headset_set_state(dev, HEADSET_STATE_CONNECTED);
-
-	if (hs->auto_dc) {
-		if (hs->state == HEADSET_STATE_CONNECTED)
-			hs->dc_timer = g_timeout_add_seconds(DC_TIMEOUT,
-						(GSourceFunc) hs_dc_timeout,
-						dev);
-		else
-			headset_set_state(dev, HEADSET_STATE_DISCONNECTED);
-	}
-
-	return TRUE;
-}
-
-gboolean headset_suspend(struct audio_device *dev, void *data)
-{
-	return TRUE;
-}
-
-gboolean headset_play(struct audio_device *dev, void *data)
-{
-	return TRUE;
-}
-
-int headset_get_sco_fd(struct audio_device *dev)
-{
-	struct headset *hs = dev->headset;
-
-	if (!hs->sco)
-		return -1;
-
-	return g_io_channel_unix_get_fd(hs->sco);
-}
-
-gboolean headset_get_nrec(struct audio_device *dev)
-{
-	struct headset *hs = dev->headset;
-
-	if (!hs->slc)
-		return TRUE;
-
-	return hs->slc->nrec;
-}
-
-unsigned int headset_add_nrec_cb(struct audio_device *dev,
-					headset_nrec_cb cb, void *user_data)
-{
-	struct headset *hs = dev->headset;
-	struct headset_nrec_callback *nrec_cb;
-	static unsigned int id = 0;
-
-	nrec_cb = g_new(struct headset_nrec_callback, 1);
-	nrec_cb->cb = cb;
-	nrec_cb->user_data = user_data;
-	nrec_cb->id = ++id;
-
-	hs->nrec_cbs = g_slist_prepend(hs->nrec_cbs, nrec_cb);
-
-	return nrec_cb->id;
-}
-
-gboolean headset_remove_nrec_cb(struct audio_device *dev, unsigned int id)
-{
-	struct headset *hs = dev->headset;
-	GSList *l;
-
-	for (l = hs->nrec_cbs; l != NULL; l = l->next) {
-		struct headset_nrec_callback *cb = l->data;
-		if (cb && cb->id == id) {
-			hs->nrec_cbs = g_slist_remove(hs->nrec_cbs, cb);
-			g_free(cb);
-			return TRUE;
-		}
-	}
-
-	return FALSE;
-}
-
-gboolean headset_get_inband(struct audio_device *dev)
-{
-	struct headset *hs = dev->headset;
-
-	if (!hs->slc)
-		return TRUE;
-
-	return hs->slc->inband_ring;
-}
-
-gboolean headset_get_sco_hci(struct audio_device *dev)
-{
-	return sco_hci;
-}
-
-void headset_shutdown(struct audio_device *dev)
-{
-	struct pending_connect *p = dev->headset->pending;
-
-	if (p && p->msg)
-		error_connect_failed(p->msg, ECANCELED);
-
-	pending_connect_finalize(dev);
-	headset_set_state(dev, HEADSET_STATE_DISCONNECTED);
-}
-
-int telephony_event_ind(int index)
-{
-	if (!active_devices)
-		return -ENODEV;
-
-	if (!ag.er_ind) {
-		DBG("telephony_report_event called but events are disabled");
-		return -EINVAL;
-	}
-
-	send_foreach_headset(active_devices, hfp_cmp,
-				"\r\n+CIEV: %d,%d\r\n", index + 1,
-				ag.indicators[index].val);
-
-	return 0;
-}
-
-int telephony_response_and_hold_ind(int rh)
-{
-	if (!active_devices)
-		return -ENODEV;
-
-	ag.rh = rh;
-
-	/* If we aren't in any response and hold state don't send anything */
-	if (ag.rh < 0)
-		return 0;
-
-	send_foreach_headset(active_devices, hfp_cmp, "\r\n+BTRH: %d\r\n",
-				ag.rh);
-
-	return 0;
-}
-
-int telephony_incoming_call_ind(const char *number, int type)
-{
-	struct audio_device *dev;
-	struct headset *hs;
-	struct headset_slc *slc;
-
-	if (fast_connectable)
-		manager_set_fast_connectable(TRUE);
-
-	if (!active_devices)
-		return -ENODEV;
-
-	/* Get the latest connected device */
-	dev = active_devices->data;
-	hs = dev->headset;
-	slc = hs->slc;
-
-	if (ag.ring_timer) {
-		DBG("telephony_incoming_call_ind: already calling");
-		return -EBUSY;
-	}
-
-	/* With HSP 1.2 the RING messages should *not* be sent if inband
-	 * ringtone is being used */
-	if (!hs->hfp_active && slc->inband_ring)
-		return 0;
-
-	g_free(ag.number);
-	ag.number = g_strdup(number);
-	ag.number_type = type;
-
-	if (slc->inband_ring && hs->hfp_active &&
-					hs->state != HEADSET_STATE_PLAYING) {
-		slc->pending_ring = TRUE;
-		return 0;
-	}
-
-	ring_timer_cb(NULL);
-	ag.ring_timer = g_timeout_add_seconds(RING_INTERVAL, ring_timer_cb,
-						NULL);
-
-	return 0;
-}
-
-int telephony_calling_stopped_ind(void)
-{
-	struct audio_device *dev;
-
-	if (fast_connectable)
-		manager_set_fast_connectable(FALSE);
-
-	if (ag.ring_timer) {
-		g_source_remove(ag.ring_timer);
-		ag.ring_timer = 0;
-	}
-
-	if (!active_devices)
-		return 0;
-
-	/* In case SCO isn't fully up yet */
-	dev = active_devices->data;
-
-	if (!dev->headset->slc->pending_ring && !ag.ring_timer)
-		return -EINVAL;
-
-	dev->headset->slc->pending_ring = FALSE;
-
-	return 0;
-}
-
-int telephony_ready_ind(uint32_t features,
-			const struct indicator *indicators, int rh,
-			const char *chld)
-{
-	ag.telephony_ready = TRUE;
-	ag.features = features;
-	ag.indicators = indicators;
-	ag.rh = rh;
-	ag.chld = chld;
-
-	DBG("Telephony plugin initialized");
-
-	print_ag_features(ag.features);
-
-	return 0;
-}
-
-int telephony_deinit(void)
-{
-	g_free(ag.number);
-
-	memset(&ag, 0, sizeof(ag));
-
-	ag.er_mode = 3;
-	ag.rh = BTRH_NOT_SUPPORTED;
-
-	DBG("Telephony deinitialized");
-
-	return 0;
-}
-
-int telephony_list_current_call_ind(int idx, int dir, int status, int mode,
-					int mprty, const char *number,
-					int type)
-{
-	if (!active_devices)
-		return -ENODEV;
-
-	if (number && strlen(number) > 0)
-		send_foreach_headset(active_devices, hfp_cmp,
-				"\r\n+CLCC: %d,%d,%d,%d,%d,\"%s\",%d\r\n",
-				idx, dir, status, mode, mprty, number, type);
-	else
-		send_foreach_headset(active_devices, hfp_cmp,
-					"\r\n+CLCC: %d,%d,%d,%d,%d\r\n",
-					idx, dir, status, mode, mprty);
-
-	return 0;
-}
-
-int telephony_subscriber_number_ind(const char *number, int type, int service)
-{
-	if (!active_devices)
-		return -ENODEV;
-
-	send_foreach_headset(active_devices, hfp_cmp,
-				"\r\n+CNUM: ,%s,%d,,%d\r\n",
-				number, type, service);
-
-	return 0;
-}
-
-static int cwa_cmp(struct headset *hs)
-{
-	if (!hs->hfp_active)
-		return -1;
-
-	if (hs->slc->cwa_enabled)
-		return 0;
-	else
-		return -1;
-}
-
-int telephony_call_waiting_ind(const char *number, int type)
-{
-	if (!active_devices)
-		return -ENODEV;
-
-	send_foreach_headset(active_devices, cwa_cmp,
-				"\r\n+CCWA: \"%s\",%d\r\n",
-				number, type);
-
-	return 0;
-}
-
-unsigned int headset_add_state_cb(headset_state_cb cb, void *user_data)
-{
-	struct headset_state_callback *state_cb;
-	static unsigned int id = 0;
-
-	state_cb = g_new(struct headset_state_callback, 1);
-	state_cb->cb = cb;
-	state_cb->user_data = user_data;
-	state_cb->id = ++id;
-
-	headset_callbacks = g_slist_append(headset_callbacks, state_cb);
-
-	return state_cb->id;
-}
-
-gboolean headset_remove_state_cb(unsigned int id)
-{
-	GSList *l;
-
-	for (l = headset_callbacks; l != NULL; l = l->next) {
-		struct headset_state_callback *cb = l->data;
-		if (cb && cb->id == id) {
-			headset_callbacks = g_slist_remove(headset_callbacks, cb);
-			g_free(cb);
-			return TRUE;
-		}
-	}
-
-	return FALSE;
-}
diff --git a/audio/headset.h b/audio/headset.h
deleted file mode 100644
index 736e4fe..0000000
--- a/audio/headset.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- *
- *  BlueZ - Bluetooth protocol stack for Linux
- *
- *  Copyright (C) 2006-2010  Nokia Corporation
- *  Copyright (C) 2004-2010  Marcel Holtmann <marcel@holtmann.org>
- *
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- */
-
-#define AUDIO_HEADSET_INTERFACE "org.bluez.Headset"
-
-#define DEFAULT_HS_AG_CHANNEL 12
-#define DEFAULT_HF_AG_CHANNEL 13
-
-typedef enum {
-	HEADSET_STATE_DISCONNECTED,
-	HEADSET_STATE_CONNECTING,
-	HEADSET_STATE_CONNECTED,
-	HEADSET_STATE_PLAY_IN_PROGRESS,
-	HEADSET_STATE_PLAYING
-} headset_state_t;
-
-typedef enum {
-	HEADSET_LOCK_READ = 1,
-	HEADSET_LOCK_WRITE = 1 << 1,
-} headset_lock_t;
-
-typedef void (*headset_state_cb) (struct audio_device *dev,
-					headset_state_t old_state,
-					headset_state_t new_state,
-					void *user_data);
-typedef void (*headset_nrec_cb) (struct audio_device *dev,
-					gboolean nrec,
-					void *user_data);
-
-unsigned int headset_add_state_cb(headset_state_cb cb, void *user_data);
-gboolean headset_remove_state_cb(unsigned int id);
-
-typedef void (*headset_stream_cb_t) (struct audio_device *dev, void *user_data);
-
-void headset_connect_cb(GIOChannel *chan, GError *err, gpointer user_data);
-
-GIOChannel *headset_get_rfcomm(struct audio_device *dev);
-
-struct headset *headset_init(struct audio_device *dev, GSList *uuids,
-							gboolean hfp_enabled);
-
-void headset_unregister(struct audio_device *dev);
-
-uint32_t headset_config_init(GKeyFile *config);
-
-void headset_update(struct audio_device *dev, struct headset *headset,
-								GSList *uuids);
-
-unsigned int headset_config_stream(struct audio_device *dev,
-					gboolean auto_dc,
-					headset_stream_cb_t cb,
-					void *user_data);
-unsigned int headset_request_stream(struct audio_device *dev,
-					headset_stream_cb_t cb,
-					void *user_data);
-unsigned int headset_suspend_stream(struct audio_device *dev,
-					headset_stream_cb_t cb,
-					void *user_data);
-gboolean headset_cancel_stream(struct audio_device *dev, unsigned int id);
-
-gboolean headset_get_hfp_active(struct audio_device *dev);
-void headset_set_hfp_active(struct audio_device *dev, gboolean active);
-
-gboolean headset_get_rfcomm_initiator(struct audio_device *dev);
-void headset_set_rfcomm_initiator(struct audio_device *dev,
-							gboolean initiator);
-
-int headset_connect_rfcomm(struct audio_device *dev, GIOChannel *chan);
-int headset_connect_sco(struct audio_device *dev, GIOChannel *io);
-
-headset_state_t headset_get_state(struct audio_device *dev);
-void headset_set_state(struct audio_device *dev, headset_state_t state);
-
-int headset_get_channel(struct audio_device *dev);
-
-int headset_get_sco_fd(struct audio_device *dev);
-gboolean headset_get_nrec(struct audio_device *dev);
-unsigned int headset_add_nrec_cb(struct audio_device *dev,
-					headset_nrec_cb cb, void *user_data);
-gboolean headset_remove_nrec_cb(struct audio_device *dev, unsigned int id);
-gboolean headset_get_inband(struct audio_device *dev);
-gboolean headset_get_sco_hci(struct audio_device *dev);
-
-gboolean headset_is_active(struct audio_device *dev);
-
-headset_lock_t headset_get_lock(struct audio_device *dev);
-gboolean headset_lock(struct audio_device *dev, headset_lock_t lock);
-gboolean headset_unlock(struct audio_device *dev, headset_lock_t lock);
-gboolean headset_suspend(struct audio_device *dev, void *data);
-gboolean headset_play(struct audio_device *dev, void *data);
-void headset_shutdown(struct audio_device *dev);
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH BlueZ 10/13] audio: Remove code HFP and HS gateway role
  2012-11-13 13:21 [PATCH BlueZ 00/13] Remove HFP implementation Luiz Augusto von Dentz
                   ` (11 preceding siblings ...)
  2012-11-13 13:21 ` [PATCH BlueZ 09/13] build: Remove headset.c and headset.h Luiz Augusto von Dentz
@ 2012-11-13 13:21 ` Luiz Augusto von Dentz
  2012-11-13 13:21 ` [PATCH BlueZ 11/13] build: Remove gateway.c and gateway.h Luiz Augusto von Dentz
                   ` (3 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Luiz Augusto von Dentz @ 2012-11-13 13:21 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This is to be replaced with external profile support.
---
 audio/device.c    |   7 --
 audio/main.c      |  72 +-------------
 audio/manager.c   | 288 +-----------------------------------------------------
 audio/manager.h   |   3 +-
 audio/media.c     |  71 +-------------
 audio/transport.c | 165 -------------------------------
 6 files changed, 8 insertions(+), 598 deletions(-)

diff --git a/audio/device.c b/audio/device.c
index aaa666d..df57d81 100644
--- a/audio/device.c
+++ b/audio/device.c
@@ -53,7 +53,6 @@
 #include "control.h"
 #include "avctp.h"
 #include "avrcp.h"
-#include "gateway.h"
 #include "sink.h"
 #include "source.h"
 
@@ -500,9 +499,6 @@ gboolean audio_device_is_active(struct audio_device *dev,
 	else if (!strcmp(interface, AUDIO_CONTROL_INTERFACE) && dev->control &&
 				control_is_active(dev))
 		return TRUE;
-	else if (!strcmp(interface, AUDIO_GATEWAY_INTERFACE) && dev->gateway &&
-				gateway_is_active(dev))
-		return TRUE;
 
 	return FALSE;
 }
@@ -514,9 +510,6 @@ void audio_device_unregister(struct audio_device *device)
 		device->hs_preauth_id = 0;
 	}
 
-	if (device->gateway)
-		gateway_unregister(device);
-
 	if (device->sink)
 		sink_unregister(device);
 
diff --git a/audio/main.c b/audio/main.c
index a423b79..ce060fc 100644
--- a/audio/main.c
+++ b/audio/main.c
@@ -43,7 +43,6 @@
 #include "log.h"
 #include "device.h"
 #include "manager.h"
-#include "gateway.h"
 
 static GIOChannel *sco_server = NULL;
 
@@ -66,83 +65,18 @@ static GKeyFile *load_config_file(const char *file)
 	return keyfile;
 }
 
-static void sco_server_cb(GIOChannel *chan, GError *err, gpointer data)
-{
-	int sk;
-	struct audio_device *device;
-	char addr[18];
-	bdaddr_t src, dst;
-
-	if (err) {
-		error("sco_server_cb: %s", err->message);
-		return;
-	}
-
-	bt_io_get(chan, &err,
-			BT_IO_OPT_SOURCE_BDADDR, &src,
-			BT_IO_OPT_DEST_BDADDR, &dst,
-			BT_IO_OPT_DEST, addr,
-			BT_IO_OPT_INVALID);
-	if (err) {
-		error("bt_io_get: %s", err->message);
-		goto drop;
-	}
-
-	device = manager_find_device(NULL, &src, &dst,
-						AUDIO_GATEWAY_INTERFACE,
-						FALSE);
-	if (!device)
-		goto drop;
-
-	if (device->gateway) {
-		if (!gateway_is_connected(device)) {
-			DBG("Refusing SCO from non-connected AG");
-			goto drop;
-		}
-
-		if (gateway_connect_sco(device, chan) < 0)
-			goto drop;
-	} else
-		goto drop;
-
-	sk = g_io_channel_unix_get_fd(chan);
-	fcntl(sk, F_SETFL, 0);
-
-	DBG("Accepted SCO connection from %s", addr);
-
-	return;
-
-drop:
-	g_io_channel_shutdown(chan, TRUE, NULL);
-}
-
 static int audio_init(void)
 {
 	GKeyFile *config;
-	gboolean enable_sco;
 
 	config = load_config_file(CONFIGDIR "/audio.conf");
 
-	if (audio_manager_init(config, &enable_sco) < 0)
-		goto failed;
-
-	if (!enable_sco)
-		return 0;
-
-	sco_server = bt_io_listen(sco_server_cb, NULL, NULL,
-					NULL, NULL,
-					BT_IO_OPT_INVALID);
-	if (!sco_server) {
-		error("Unable to start SCO server socket");
-		goto failed;
+	if (audio_manager_init(config) < 0) {
+		audio_manager_exit();
+		return -EIO;
 	}
 
 	return 0;
-
-failed:
-	audio_manager_exit();
-
-	return -EIO;
 }
 
 static void audio_exit(void)
diff --git a/audio/manager.c b/audio/manager.c
index 0960d28..f59a2f3 100644
--- a/audio/manager.c
+++ b/audio/manager.c
@@ -61,7 +61,6 @@
 #include "avdtp.h"
 #include "media.h"
 #include "a2dp.h"
-#include "gateway.h"
 #include "sink.h"
 #include "source.h"
 #include "avrcp.h"
@@ -88,7 +87,6 @@ static GSList *adapters = NULL;
 static GSList *devices = NULL;
 
 static struct enabled_interfaces enabled = {
-	.gateway	= FALSE,
 	.sink		= TRUE,
 	.source		= FALSE,
 	.control	= TRUE,
@@ -107,197 +105,6 @@ static struct audio_adapter *find_adapter(GSList *list,
 	return NULL;
 }
 
-static sdp_record_t *hfp_hs_record(uint8_t ch)
-{
-	sdp_list_t *svclass_id, *pfseq, *apseq, *root;
-	uuid_t root_uuid, svclass_uuid, ga_svclass_uuid;
-	uuid_t l2cap_uuid, rfcomm_uuid;
-	sdp_profile_desc_t profile;
-	sdp_record_t *record;
-	sdp_list_t *aproto, *proto[2];
-	sdp_data_t *channel;
-
-	record = sdp_record_alloc();
-	if (!record)
-		return NULL;
-
-	sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);
-	root = sdp_list_append(0, &root_uuid);
-	sdp_set_browse_groups(record, root);
-
-	sdp_uuid16_create(&svclass_uuid, HANDSFREE_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);
-	sdp_set_service_classes(record, svclass_id);
-
-	sdp_uuid16_create(&profile.uuid, HANDSFREE_PROFILE_ID);
-	profile.version = 0x0105;
-	pfseq = sdp_list_append(0, &profile);
-	sdp_set_profile_descs(record, pfseq);
-
-	sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);
-	proto[0] = sdp_list_append(0, &l2cap_uuid);
-	apseq = sdp_list_append(0, proto[0]);
-
-	sdp_uuid16_create(&rfcomm_uuid, RFCOMM_UUID);
-	proto[1] = sdp_list_append(0, &rfcomm_uuid);
-	channel = sdp_data_alloc(SDP_UINT8, &ch);
-	proto[1] = sdp_list_append(proto[1], channel);
-	apseq = sdp_list_append(apseq, proto[1]);
-
-	aproto = sdp_list_append(0, apseq);
-	sdp_set_access_protos(record, aproto);
-
-	sdp_set_info_attr(record, "Hands-Free", 0, 0);
-
-	sdp_data_free(channel);
-	sdp_list_free(proto[0], 0);
-	sdp_list_free(proto[1], 0);
-	sdp_list_free(apseq, 0);
-	sdp_list_free(pfseq, 0);
-	sdp_list_free(aproto, 0);
-	sdp_list_free(root, 0);
-	sdp_list_free(svclass_id, 0);
-
-	return record;
-}
-
-static void gateway_auth_cb(DBusError *derr, void *user_data)
-{
-	struct audio_device *device = user_data;
-
-	if (derr && dbus_error_is_set(derr)) {
-		error("Access denied: %s", derr->message);
-		gateway_set_state(device, GATEWAY_STATE_DISCONNECTED);
-	} else {
-		char ag_address[18];
-
-		ba2str(&device->dst, ag_address);
-		DBG("Accepted AG connection from %s for %s",
-			ag_address, device_get_path(device->btd_dev));
-
-		gateway_start_service(device);
-	}
-}
-
-static void hf_io_cb(GIOChannel *chan, gpointer data)
-{
-	bdaddr_t src, dst;
-	GError *err = NULL;
-	uint8_t ch;
-	const char *server_uuid, *remote_uuid;
-	struct audio_device *device;
-	guint auth_id;
-
-	bt_io_get(chan, &err,
-			BT_IO_OPT_SOURCE_BDADDR, &src,
-			BT_IO_OPT_DEST_BDADDR, &dst,
-			BT_IO_OPT_CHANNEL, &ch,
-			BT_IO_OPT_INVALID);
-
-	if (err) {
-		error("%s", err->message);
-		g_error_free(err);
-		return;
-	}
-
-	server_uuid = HFP_HS_UUID;
-	remote_uuid = HFP_AG_UUID;
-
-	device = manager_get_device(&src, &dst, TRUE);
-	if (!device)
-		goto drop;
-
-	if (!device->gateway) {
-		btd_device_add_uuid(device->btd_dev, remote_uuid);
-		if (!device->gateway)
-			goto drop;
-	}
-
-	if (gateway_is_active(device)) {
-		DBG("Refusing new connection since one already exists");
-		goto drop;
-	}
-
-	if (gateway_connect_rfcomm(device, chan) < 0) {
-		error("Allocating new GIOChannel failed!");
-		goto drop;
-	}
-
-	auth_id = btd_request_authorization(&device->src, &device->dst,
-						server_uuid, gateway_auth_cb,
-						device);
-	if (auth_id == 0) {
-		DBG("Authorization denied");
-		gateway_set_state(device, GATEWAY_STATE_DISCONNECTED);
-	}
-
-	return;
-
-drop:
-	g_io_channel_shutdown(chan, TRUE, NULL);
-}
-
-static int gateway_server_init(struct audio_adapter *adapter)
-{
-	uint8_t chan = DEFAULT_HFP_HS_CHANNEL;
-	sdp_record_t *record;
-	gboolean master = TRUE;
-	GError *err = NULL;
-	GIOChannel *io;
-	const bdaddr_t *src;
-
-	if (config) {
-		gboolean tmp;
-
-		tmp = g_key_file_get_boolean(config, "General", "Master",
-						&err);
-		if (err) {
-			DBG("audio.conf: %s", err->message);
-			g_clear_error(&err);
-		} else
-			master = tmp;
-	}
-
-	src = adapter_get_address(adapter->btd_adapter);
-
-	io = bt_io_listen(NULL, hf_io_cb, adapter, NULL, &err,
-				BT_IO_OPT_SOURCE_BDADDR, src,
-				BT_IO_OPT_CHANNEL, chan,
-				BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
-				BT_IO_OPT_MASTER, master,
-				BT_IO_OPT_INVALID);
-	if (!io) {
-		error("%s", err->message);
-		g_error_free(err);
-		return -1;
-	}
-
-	adapter->hfp_hs_server = io;
-	record = hfp_hs_record(chan);
-	if (!record) {
-		error("Unable to allocate new service record");
-		goto failed;
-	}
-
-	if (add_record_to_server(src, record) < 0) {
-		error("Unable to register HFP HS service record");
-		sdp_record_free(record);
-		goto failed;
-	}
-
-	adapter->hfp_hs_record_id = record->handle;
-
-	return 0;
-
-failed:
-	g_io_channel_shutdown(adapter->hfp_hs_server, TRUE, NULL);
-	g_io_channel_unref(adapter->hfp_hs_server);
-	adapter->hfp_hs_server = NULL;
-	return -1;
-}
-
 static struct audio_device *get_audio_dev(struct btd_device *device)
 {
 	struct btd_adapter *adapter = device_get_adapter(device);
@@ -321,25 +128,6 @@ static void audio_remove(struct btd_profile *p, struct btd_device *device)
 	audio_device_unregister(dev);
 }
 
-static int ag_probe(struct btd_profile *p, struct btd_device *device,
-								GSList *uuids)
-{
-	struct audio_device *audio_dev;
-
-	audio_dev = get_audio_dev(device);
-	if (!audio_dev) {
-		DBG("unable to get a device object");
-		return -1;
-	}
-
-	if (audio_dev->gateway)
-		return -EALREADY;
-
-	audio_dev->gateway = gateway_init(audio_dev);
-
-	return 0;
-}
-
 static int a2dp_probe(struct btd_profile *p, struct btd_device *device,
 								GSList *uuids)
 {
@@ -431,49 +219,6 @@ static struct audio_adapter *audio_adapter_get(struct btd_adapter *adapter)
 	return adp;
 }
 
-static int gateway_server_probe(struct btd_profile *p,
-						struct btd_adapter *adapter)
-{
-	struct audio_adapter *adp;
-	int err;
-
-	adp = audio_adapter_get(adapter);
-	if (!adp)
-		return -EINVAL;
-
-	err = gateway_server_init(adp);
-	if (err < 0)
-		audio_adapter_unref(adp);
-
-	return err;
-}
-
-static void gateway_server_remove(struct btd_profile *p,
-						struct btd_adapter *adapter)
-{
-	struct audio_adapter *adp;
-	const gchar *path = adapter_get_path(adapter);
-
-	DBG("path %s", path);
-
-	adp = find_adapter(adapters, adapter);
-	if (!adp)
-		return;
-
-	if (adp->hfp_hs_record_id) {
-		remove_record_from_server(adp->hfp_hs_record_id);
-		adp->hfp_hs_record_id = 0;
-	}
-
-	if (adp->hfp_hs_server) {
-		g_io_channel_shutdown(adp->hfp_hs_server, TRUE, NULL);
-		g_io_channel_unref(adp->hfp_hs_server);
-		adp->hfp_hs_server = NULL;
-	}
-
-	audio_adapter_unref(adp);
-}
-
 static int a2dp_server_probe(struct btd_profile *p,
 						struct btd_adapter *adapter)
 {
@@ -580,17 +325,6 @@ static void media_server_remove(struct btd_adapter *adapter)
 	audio_adapter_unref(adp);
 }
 
-static struct btd_profile gateway_profile = {
-	.name		= "audio-gateway",
-
-	.remote_uuids	= BTD_UUIDS(HSP_AG_UUID, HFP_AG_UUID),
-	.device_probe	= ag_probe,
-	.device_remove	= audio_remove,
-
-	.adapter_probe	= gateway_server_probe,
-	.adapter_remove = gateway_server_remove,
-};
-
 static struct btd_profile a2dp_profile = {
 	.name		= "audio-a2dp",
 
@@ -620,7 +354,7 @@ static struct btd_adapter_driver media_driver = {
 	.remove	= media_server_remove,
 };
 
-int audio_manager_init(GKeyFile *conf, gboolean *enable_sco)
+int audio_manager_init(GKeyFile *conf)
 {
 	char **list;
 	int i;
@@ -635,9 +369,7 @@ int audio_manager_init(GKeyFile *conf, gboolean *enable_sco)
 	list = g_key_file_get_string_list(config, "General", "Enable",
 						NULL, NULL);
 	for (i = 0; list && list[i] != NULL; i++) {
-		if (g_str_equal(list[i], "Gateway"))
-			enabled.gateway = TRUE;
-		else if (g_str_equal(list[i], "Sink"))
+		if (g_str_equal(list[i], "Sink"))
 			enabled.sink = TRUE;
 		else if (g_str_equal(list[i], "Source"))
 			enabled.source = TRUE;
@@ -649,9 +381,7 @@ int audio_manager_init(GKeyFile *conf, gboolean *enable_sco)
 	list = g_key_file_get_string_list(config, "General", "Disable",
 						NULL, NULL);
 	for (i = 0; list && list[i] != NULL; i++) {
-		if (g_str_equal(list[i], "Gateway"))
-			enabled.gateway = FALSE;
-		else if (g_str_equal(list[i], "Sink"))
+		if (g_str_equal(list[i], "Sink"))
 			enabled.sink = FALSE;
 		else if (g_str_equal(list[i], "Source"))
 			enabled.source = FALSE;
@@ -677,9 +407,6 @@ int audio_manager_init(GKeyFile *conf, gboolean *enable_sco)
 		max_connected_headsets = i;
 
 proceed:
-	if (enabled.gateway)
-		btd_profile_register(&gateway_profile);
-
 	if (enabled.source || enabled.sink)
 		btd_profile_register(&a2dp_profile);
 
@@ -688,8 +415,6 @@ proceed:
 
 	btd_register_adapter_driver(&media_driver);
 
-	*enable_sco = enabled.gateway;
-
 	return 0;
 }
 
@@ -700,9 +425,6 @@ void audio_manager_exit(void)
 		config = NULL;
 	}
 
-	if (enabled.gateway)
-		btd_profile_unregister(&gateway_profile);
-
 	if (enabled.source || enabled.sink)
 		btd_profile_unregister(&a2dp_profile);
 
@@ -734,10 +456,6 @@ GSList *manager_find_devices(const char *path,
 		if ((dst && bacmp(dst, BDADDR_ANY)) && bacmp(&dev->dst, dst))
 			continue;
 
-		if (interface && !strcmp(AUDIO_GATEWAY_INTERFACE, interface)
-				&& !dev->gateway)
-			continue;
-
 		if (interface && !strcmp(AUDIO_SINK_INTERFACE, interface)
 				&& !dev->sink)
 			continue;
diff --git a/audio/manager.h b/audio/manager.h
index d3b5692..5691063 100644
--- a/audio/manager.h
+++ b/audio/manager.h
@@ -23,14 +23,13 @@
  */
 
 struct enabled_interfaces {
-	gboolean gateway;
 	gboolean sink;
 	gboolean source;
 	gboolean control;
 	gboolean media_player;
 };
 
-int audio_manager_init(GKeyFile *config, gboolean *enable_sco);
+int audio_manager_init(GKeyFile *config);
 void audio_manager_exit(void);
 
 struct audio_device *manager_find_device(const char *path,
diff --git a/audio/media.c b/audio/media.c
index ea0b44e..65037fe 100644
--- a/audio/media.c
+++ b/audio/media.c
@@ -46,7 +46,6 @@
 #include "transport.h"
 #include "a2dp.h"
 #include "avrcp.h"
-#include "gateway.h"
 #include "manager.h"
 
 #define MEDIA_INTERFACE "org.bluez.Media"
@@ -140,9 +139,6 @@ static void media_endpoint_destroy(struct media_endpoint *endpoint)
 {
 	DBG("sender=%s path=%s", endpoint->sender, endpoint->path);
 
-	if (endpoint->ag_watch)
-		gateway_remove_state_cb(endpoint->ag_watch);
-
 	media_endpoint_cancel_all(endpoint);
 
 	g_slist_free_full(endpoint->transports,
@@ -550,49 +546,6 @@ static void a2dp_destroy_endpoint(void *user_data)
 	release_endpoint(endpoint);
 }
 
-static void gateway_setconf_cb(struct media_endpoint *endpoint, void *ret,
-						int size, void *user_data)
-{
-	struct audio_device *dev = user_data;
-
-	if (ret != NULL)
-		return;
-
-	gateway_set_state(dev, GATEWAY_STATE_DISCONNECTED);
-}
-
-static void gateway_state_changed(struct audio_device *dev,
-					gateway_state_t old_state,
-					gateway_state_t new_state,
-					void *user_data)
-{
-	struct media_endpoint *endpoint = user_data;
-	struct media_transport *transport;
-
-	DBG("");
-
-	if (bacmp(&endpoint->adapter->src, &dev->src) != 0)
-		return;
-
-	switch (new_state) {
-	case GATEWAY_STATE_DISCONNECTED:
-		transport = find_device_transport(endpoint, dev);
-		if (transport != NULL) {
-			DBG("Clear endpoint %p", endpoint);
-			clear_configuration(endpoint, transport);
-		}
-		break;
-	case GATEWAY_STATE_CONNECTING:
-		set_configuration(endpoint, dev, NULL, 0,
-					gateway_setconf_cb, dev, NULL);
-		break;
-	case GATEWAY_STATE_CONNECTED:
-		break;
-	case GATEWAY_STATE_PLAYING:
-		break;
-	}
-}
-
 static gboolean endpoint_init_a2dp_source(struct media_endpoint *endpoint,
 						gboolean delay_reporting,
 						int *err)
@@ -621,28 +574,6 @@ static gboolean endpoint_init_a2dp_sink(struct media_endpoint *endpoint,
 	return TRUE;
 }
 
-static gboolean endpoint_init_hs(struct media_endpoint *endpoint, int *err)
-{
-	GSList *list;
-	GSList *l;
-
-	endpoint->ag_watch = gateway_add_state_cb(gateway_state_changed,
-								endpoint);
-	list = manager_find_devices(NULL, &endpoint->adapter->src, BDADDR_ANY,
-						AUDIO_GATEWAY_INTERFACE, TRUE);
-
-	for (l = list; l != NULL; l = l->next) {
-		struct audio_device *dev = l->data;
-
-		set_configuration(endpoint, dev, NULL, 0,
-						gateway_setconf_cb, dev, NULL);
-	}
-
-	g_slist_free(list);
-
-	return TRUE;
-}
-
 static struct media_endpoint *media_endpoint_create(struct media_adapter *adapter,
 						const char *sender,
 						const char *path,
@@ -681,7 +612,7 @@ static struct media_endpoint *media_endpoint_create(struct media_adapter *adapte
 		succeeded = TRUE;
 	else if (strcasecmp(uuid, HFP_HS_UUID) == 0 ||
 					strcasecmp(uuid, HSP_HS_UUID) == 0)
-		succeeded = endpoint_init_hs(endpoint, err);
+		succeeded = TRUE;
 	else {
 		succeeded = FALSE;
 
diff --git a/audio/transport.c b/audio/transport.c
index 74562ea..994c423 100644
--- a/audio/transport.c
+++ b/audio/transport.c
@@ -44,7 +44,6 @@
 #include "media.h"
 #include "transport.h"
 #include "a2dp.h"
-#include "gateway.h"
 #include "sink.h"
 #include "source.h"
 #include "avrcp.h"
@@ -109,7 +108,6 @@ struct media_transport {
 	transport_lock_t	lock;
 	transport_state_t	state;
 	guint			hs_watch;
-	guint			ag_watch;
 	guint			source_watch;
 	guint			sink_watch;
 	guint			(*resume) (struct media_transport *transport,
@@ -211,9 +209,6 @@ void media_transport_destroy(struct media_transport *transport)
 {
 	char *path;
 
-	if (transport->ag_watch)
-		gateway_remove_state_cb(transport->ag_watch);
-
 	if (transport->sink_watch)
 		sink_remove_state_cb(transport->sink_watch);
 
@@ -461,127 +456,6 @@ static void cancel_a2dp(struct media_transport *transport, guint id)
 	a2dp_cancel(transport->device, id);
 }
 
-static void gateway_resume_complete(struct audio_device *dev, GError *err,
-							void *user_data)
-{
-	struct media_owner *owner = user_data;
-	struct media_request *req = owner->pending;
-	struct media_transport *transport = owner->transport;
-	int fd;
-	uint16_t imtu, omtu;
-	gboolean ret;
-
-	req->id = 0;
-
-	if (dev == NULL)
-		goto fail;
-
-	if (err) {
-		error("Failed to resume gateway: error %s", err->message);
-		goto fail;
-	}
-
-	fd = gateway_get_sco_fd(dev);
-	if (fd < 0)
-		goto fail;
-
-	imtu = 48;
-	omtu = 48;
-
-	media_transport_set_fd(transport, fd, imtu, omtu);
-
-	if ((owner->lock & TRANSPORT_LOCK_READ) == 0)
-		imtu = 0;
-
-	if ((owner->lock & TRANSPORT_LOCK_WRITE) == 0)
-		omtu = 0;
-
-	ret = g_dbus_send_reply(btd_get_dbus_connection(), req->msg,
-						DBUS_TYPE_UNIX_FD, &fd,
-						DBUS_TYPE_UINT16, &imtu,
-						DBUS_TYPE_UINT16, &omtu,
-						DBUS_TYPE_INVALID);
-	if (ret == FALSE)
-		goto fail;
-
-	media_owner_remove(owner);
-
-	transport_set_state(transport, TRANSPORT_STATE_ACTIVE);
-
-	return;
-
-fail:
-	media_transport_remove(transport, owner);
-}
-
-static guint resume_gateway(struct media_transport *transport,
-				struct media_owner *owner)
-{
-	struct audio_device *device = transport->device;
-
-	if (state_in_use(transport->state))
-		goto done;
-
-	if (gateway_lock(device, GATEWAY_LOCK_READ |
-						GATEWAY_LOCK_WRITE) == FALSE)
-		return 0;
-
-	if (transport->state == TRANSPORT_STATE_IDLE)
-		transport_set_state(transport, TRANSPORT_STATE_REQUESTING);
-
-done:
-	return gateway_request_stream(device, gateway_resume_complete,
-					owner);
-}
-
-static gboolean gateway_suspend_complete(gpointer user_data)
-{
-	struct media_owner *owner = user_data;
-	struct media_transport *transport = owner->transport;
-	struct audio_device *device = transport->device;
-
-	/* Release always succeeds */
-	if (owner->pending) {
-		owner->pending->id = 0;
-		media_request_reply(owner->pending, 0);
-		media_owner_remove(owner);
-	}
-
-	gateway_unlock(device, GATEWAY_LOCK_READ | GATEWAY_LOCK_WRITE);
-	transport_set_state(transport, TRANSPORT_STATE_IDLE);
-	media_transport_remove(transport, owner);
-	return FALSE;
-}
-
-static guint suspend_gateway(struct media_transport *transport,
-						struct media_owner *owner)
-{
-	struct audio_device *device = transport->device;
-	static int id = 1;
-
-	if (!owner) {
-		gateway_state_t state = gateway_get_state(device);
-
-		gateway_unlock(device, GATEWAY_LOCK_READ | GATEWAY_LOCK_WRITE);
-
-		if (state == GATEWAY_STATE_PLAYING)
-			transport_set_state(transport, TRANSPORT_STATE_PENDING);
-		else
-			transport_set_state(transport, TRANSPORT_STATE_IDLE);
-
-		return 0;
-	}
-
-	gateway_suspend_stream(device);
-	g_idle_add(gateway_suspend_complete, owner);
-	return id++;
-}
-
-static void cancel_gateway(struct media_transport *transport, guint id)
-{
-	gateway_cancel_stream(transport->device, id);
-}
-
 static void media_owner_exit(DBusConnection *connection, void *user_data)
 {
 	struct media_owner *owner = user_data;
@@ -806,13 +680,6 @@ static int set_property_a2dp(struct media_transport *transport,
 	return -EINVAL;
 }
 
-static int set_property_gateway(struct media_transport *transport,
-						const char *property,
-						DBusMessageIter *value)
-{
-	return -EINVAL;
-}
-
 static DBusMessage *set_property(DBusConnection *conn, DBusMessage *msg,
 								void *data)
 {
@@ -871,12 +738,6 @@ static void get_properties_a2dp(struct media_transport *transport,
 							&a2dp->volume);
 }
 
-static void get_properties_gateway(struct media_transport *transport,
-						DBusMessageIter *dict)
-{
-	/* None */
-}
-
 void transport_get_properties(struct media_transport *transport,
 							DBusMessageIter *iter)
 {
@@ -1009,22 +870,6 @@ static void transport_update_playing(struct media_transport *transport,
 		transport_set_state(transport, TRANSPORT_STATE_PENDING);
 }
 
-static void gateway_state_changed(struct audio_device *dev,
-						gateway_state_t old_state,
-						gateway_state_t new_state,
-						void *user_data)
-{
-	struct media_transport *transport = user_data;
-
-	if (dev != transport->device)
-		return;
-
-	if (new_state == GATEWAY_STATE_PLAYING)
-		transport_update_playing(transport, TRUE);
-	else
-		transport_update_playing(transport, FALSE);
-}
-
 static void sink_state_changed(struct audio_device *dev,
 						sink_state_t old_state,
 						sink_state_t new_state,
@@ -1100,16 +945,6 @@ struct media_transport *media_transport_create(struct media_endpoint *endpoint,
 			transport->source_watch = source_add_state_cb(
 							source_state_changed,
 							transport);
-	} else if (strcasecmp(uuid, HFP_HS_UUID) == 0 ||
-			strcasecmp(uuid, HSP_HS_UUID) == 0) {
-		transport->resume = resume_gateway;
-		transport->suspend = suspend_gateway;
-		transport->cancel = cancel_gateway;
-		transport->get_properties = get_properties_gateway;
-		transport->set_property = set_property_gateway;
-		transport->ag_watch = gateway_add_state_cb(
-							gateway_state_changed,
-							transport);
 	} else
 		goto fail;
 
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH BlueZ 11/13] build: Remove gateway.c and gateway.h
  2012-11-13 13:21 [PATCH BlueZ 00/13] Remove HFP implementation Luiz Augusto von Dentz
                   ` (12 preceding siblings ...)
  2012-11-13 13:21 ` [PATCH BlueZ 10/13] audio: Remove code HFP and HS gateway role Luiz Augusto von Dentz
@ 2012-11-13 13:21 ` Luiz Augusto von Dentz
  2012-11-13 13:21 ` [PATCH BlueZ 12/13] audio: Move to profiles directory Luiz Augusto von Dentz
                   ` (2 subsequent siblings)
  16 siblings, 0 replies; 20+ messages in thread
From: Luiz Augusto von Dentz @ 2012-11-13 13:21 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

---
 Makefile.am     |    1 -
 audio/device.h  |    1 -
 audio/gateway.c | 1048 -------------------------------------------------------
 audio/gateway.h |   75 ----
 4 files changed, 1125 deletions(-)
 delete mode 100644 audio/gateway.c
 delete mode 100644 audio/gateway.h

diff --git a/Makefile.am b/Makefile.am
index 7f8ff26..84ae237 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -107,7 +107,6 @@ if AUDIOPLUGIN
 builtin_modules += audio
 builtin_sources += audio/main.c \
 			audio/manager.h audio/manager.c \
-			audio/gateway.h audio/gateway.c \
 			audio/control.h audio/control.c \
 			audio/avctp.h audio/avctp.c \
 			audio/avrcp.h audio/avrcp.c \
diff --git a/audio/device.h b/audio/device.h
index 89916be..f0d178d 100644
--- a/audio/device.h
+++ b/audio/device.h
@@ -38,7 +38,6 @@ struct audio_device {
 
 	gboolean auto_connect;
 
-	struct gateway *gateway;
 	struct sink *sink;
 	struct source *source;
 	struct control *control;
diff --git a/audio/gateway.c b/audio/gateway.c
deleted file mode 100644
index 1b1164c..0000000
--- a/audio/gateway.c
+++ /dev/null
@@ -1,1048 +0,0 @@
-/*
- *
- *  BlueZ - Bluetooth protocol stack for Linux
- *
- *  Copyright (C) 2006-2010  Nokia Corporation
- *  Copyright (C) 2004-2010  Marcel Holtmann <marcel@holtmann.org>
- *  Copyright (C) 2008-2009  Leonid Movshovich <event.riga@gmail.org>
- *  Copyright (C) 2010  ProFUSION embedded systems
- *
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#include <errno.h>
-
-#include <glib.h>
-#include <dbus/dbus.h>
-#include <gdbus.h>
-
-#include <bluetooth/bluetooth.h>
-#include <bluetooth/sdp.h>
-#include <bluetooth/sdp_lib.h>
-
-#include "../src/adapter.h"
-#include "../src/device.h"
-
-#include "sdp-client.h"
-#include "device.h"
-#include "gateway.h"
-#include "log.h"
-#include "error.h"
-#include "btio.h"
-#include "dbus-common.h"
-
-struct hf_agent {
-	char *name;	/* Bus id */
-	char *path;	/* D-Bus path */
-	guint watch;	/* Disconnect watch */
-	DBusPendingCall *call;
-};
-
-struct connect_cb {
-	unsigned int id;
-	gateway_stream_cb_t cb;
-	void *cb_data;
-};
-
-struct gateway {
-	gateway_state_t state;
-	GIOChannel *rfcomm;
-	GIOChannel *sco;
-	GIOChannel *incoming;
-	guint rfcomm_id;
-	guint sco_id;
-	GSList *callbacks;
-	struct hf_agent *agent;
-	DBusMessage *msg;
-	int version;
-	gateway_lock_t lock;
-};
-
-struct gateway_state_callback {
-	gateway_state_cb cb;
-	void *user_data;
-	unsigned int id;
-};
-
-static GSList *gateway_callbacks = NULL;
-
-int gateway_close(struct audio_device *device);
-
-GQuark gateway_error_quark(void)
-{
-	return g_quark_from_static_string("gateway-error-quark");
-}
-
-static const char *state2str(gateway_state_t state)
-{
-	switch (state) {
-	case GATEWAY_STATE_DISCONNECTED:
-		return "disconnected";
-	case GATEWAY_STATE_CONNECTING:
-		return "connecting";
-	case GATEWAY_STATE_CONNECTED:
-		return "connected";
-	case GATEWAY_STATE_PLAYING:
-		return "playing";
-	default:
-		return "";
-	}
-}
-
-static void agent_free(struct hf_agent *agent)
-{
-	if (!agent)
-		return;
-
-	if (agent->call)
-		dbus_pending_call_unref(agent->call);
-
-	g_dbus_remove_watch(agent->watch);
-
-	g_free(agent->name);
-	g_free(agent->path);
-	g_free(agent);
-}
-
-static void change_state(struct audio_device *dev, gateway_state_t new_state)
-{
-	struct gateway *gw = dev->gateway;
-	const char *val;
-	GSList *l;
-	gateway_state_t old_state;
-
-	if (gw->state == new_state)
-		return;
-
-	val = state2str(new_state);
-	old_state = gw->state;
-	gw->state = new_state;
-
-	emit_property_changed(device_get_path(dev->btd_dev),
-				AUDIO_GATEWAY_INTERFACE, "State",
-				DBUS_TYPE_STRING, &val);
-
-	for (l = gateway_callbacks; l != NULL; l = l->next) {
-		struct gateway_state_callback *cb = l->data;
-		cb->cb(dev, old_state, new_state, cb->user_data);
-	}
-}
-
-void gateway_set_state(struct audio_device *dev, gateway_state_t new_state)
-{
-	switch (new_state) {
-	case GATEWAY_STATE_DISCONNECTED:
-		gateway_close(dev);
-		break;
-	case GATEWAY_STATE_CONNECTING:
-	case GATEWAY_STATE_CONNECTED:
-	case GATEWAY_STATE_PLAYING:
-		break;
-	}
-}
-
-static void agent_cancel(struct hf_agent *agent)
-{
-	if (!agent->call)
-		return;
-
-	dbus_pending_call_cancel(agent->call);
-	dbus_pending_call_unref(agent->call);
-	agent->call = NULL;
-}
-
-static void agent_disconnect(struct audio_device *dev, struct hf_agent *agent)
-{
-	DBusMessage *msg;
-
-	msg = dbus_message_new_method_call(agent->name, agent->path,
-			"org.bluez.HandsfreeAgent", "Release");
-
-	g_dbus_send_message(btd_get_dbus_connection(), msg);
-
-	agent_cancel(agent);
-}
-
-static gboolean agent_sendfd(struct hf_agent *agent, int fd,
-		DBusPendingCallNotifyFunction notify, void *data)
-{
-	struct audio_device *dev = data;
-	struct gateway *gw = dev->gateway;
-	DBusMessage *msg;
-
-	if (agent->call)
-		return FALSE;
-
-	msg = dbus_message_new_method_call(agent->name, agent->path,
-			"org.bluez.HandsfreeAgent", "NewConnection");
-
-	dbus_message_append_args(msg, DBUS_TYPE_UNIX_FD, &fd,
-					DBUS_TYPE_UINT16, &gw->version,
-					DBUS_TYPE_INVALID);
-
-	if (dbus_connection_send_with_reply(btd_get_dbus_connection(), msg,
-						&agent->call, -1) == FALSE) {
-		dbus_message_unref(msg);
-		return FALSE;
-	}
-
-	dbus_pending_call_set_notify(agent->call, notify, dev, NULL);
-	dbus_message_unref(msg);
-
-	return TRUE;
-}
-
-static unsigned int connect_cb_new(struct gateway *gw,
-					gateway_stream_cb_t func,
-					void *user_data)
-{
-	struct connect_cb *cb;
-	static unsigned int free_cb_id = 1;
-
-	if (!func)
-		return 0;
-
-	cb = g_new(struct connect_cb, 1);
-
-	cb->cb = func;
-	cb->cb_data = user_data;
-	cb->id = free_cb_id++;
-
-	gw->callbacks = g_slist_append(gw->callbacks, cb);
-
-	return cb->id;
-}
-
-static void run_connect_cb(struct audio_device *dev, GError *err)
-{
-	struct gateway *gw = dev->gateway;
-	GSList *l;
-
-	for (l = gw->callbacks; l != NULL; l = l->next) {
-		struct connect_cb *cb = l->data;
-		cb->cb(dev, err, cb->cb_data);
-	}
-
-	g_slist_free_full(gw->callbacks, g_free);
-	gw->callbacks = NULL;
-}
-
-static gboolean sco_io_cb(GIOChannel *chan, GIOCondition cond,
-			struct audio_device *dev)
-{
-	struct gateway *gw = dev->gateway;
-
-	if (cond & G_IO_NVAL)
-		return FALSE;
-
-	DBG("sco connection is released");
-
-	g_source_remove(gw->sco_id);
-	gw->sco_id = 0;
-
-	g_io_channel_shutdown(gw->sco, TRUE, NULL);
-	g_io_channel_unref(gw->sco);
-	gw->sco = NULL;
-	change_state(dev, GATEWAY_STATE_CONNECTED);
-
-	return FALSE;
-}
-
-static void sco_connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
-{
-	struct audio_device *dev = (struct audio_device *) user_data;
-	struct gateway *gw = dev->gateway;
-
-	DBG("at the begin of sco_connect_cb() in gateway.c");
-
-	gw->sco = g_io_channel_ref(chan);
-
-	gw->sco_id = g_io_add_watch(gw->sco, G_IO_ERR | G_IO_HUP | G_IO_NVAL,
-						(GIOFunc) sco_io_cb, dev);
-
-	if (err) {
-		error("sco_connect_cb(): %s", err->message);
-		gateway_suspend_stream(dev);
-		return;
-	}
-
-	change_state(dev, GATEWAY_STATE_PLAYING);
-	run_connect_cb(dev, NULL);
-}
-
-static gboolean rfcomm_disconnect_cb(GIOChannel *chan, GIOCondition cond,
-			struct audio_device *dev)
-{
-	if (cond & G_IO_NVAL)
-		return FALSE;
-
-	gateway_close(dev);
-
-	return FALSE;
-}
-
-static void newconnection_reply(DBusPendingCall *call, void *data)
-{
-	struct audio_device *dev = data;
-	struct gateway *gw = dev->gateway;
-	struct hf_agent *agent = gw->agent;
-	DBusMessage *reply = dbus_pending_call_steal_reply(call);
-	DBusError derr;
-
-	dbus_pending_call_unref(agent->call);
-	agent->call = NULL;
-
-	dbus_error_init(&derr);
-	if (!dbus_set_error_from_message(&derr, reply)) {
-		DBG("Agent reply: file descriptor passed successfully");
-		gw->rfcomm_id = g_io_add_watch(gw->rfcomm,
-						G_IO_ERR | G_IO_HUP | G_IO_NVAL,
-						(GIOFunc) rfcomm_disconnect_cb,
-						dev);
-		change_state(dev, GATEWAY_STATE_CONNECTED);
-		goto done;
-	}
-
-	DBG("Agent reply: %s", derr.message);
-
-	dbus_error_free(&derr);
-	gateway_close(dev);
-
-done:
-	dbus_message_unref(reply);
-}
-
-static void rfcomm_connect_cb(GIOChannel *chan, GError *err,
-				gpointer user_data)
-{
-	DBusConnection *conn = btd_get_dbus_connection();
-	struct audio_device *dev = user_data;
-	struct gateway *gw = dev->gateway;
-	DBusMessage *reply;
-	int sk, ret;
-
-	if (err) {
-		error("connect(): %s", err->message);
-		goto fail;
-	}
-
-	if (!gw->agent) {
-		error("Handsfree Agent not registered");
-		goto fail;
-	}
-
-	sk = g_io_channel_unix_get_fd(chan);
-
-	if (gw->rfcomm == NULL)
-		gw->rfcomm = g_io_channel_ref(chan);
-
-	ret = agent_sendfd(gw->agent, sk, newconnection_reply, dev);
-
-	if (!gw->msg)
-		return;
-
-	if (ret)
-		reply = dbus_message_new_method_return(gw->msg);
-	else
-		reply = btd_error_failed(gw->msg, "Can't pass file descriptor");
-
-	g_dbus_send_message(conn, reply);
-
-	return;
-
-fail:
-	if (gw->msg) {
-		DBusMessage *reply;
-		reply = btd_error_failed(gw->msg, "Connect failed");
-		g_dbus_send_message(conn, reply);
-	}
-
-	gateway_close(dev);
-}
-
-static int get_remote_profile_version(sdp_record_t *rec)
-{
-	uuid_t uuid;
-	sdp_list_t *profiles;
-	sdp_profile_desc_t *desc;
-	int ver = 0;
-
-	sdp_uuid16_create(&uuid, HANDSFREE_PROFILE_ID);
-
-	sdp_get_profile_descs(rec, &profiles);
-	if (profiles == NULL)
-		goto done;
-
-	desc = profiles->data;
-
-	if (sdp_uuid16_cmp(&desc->uuid, &uuid) == 0)
-		ver = desc->version;
-
-	sdp_list_free(profiles, free);
-
-done:
-	return ver;
-}
-
-static void get_incoming_record_cb(sdp_list_t *recs, int err,
-					gpointer user_data)
-{
-	struct audio_device *dev = user_data;
-	struct gateway *gw = dev->gateway;
-	GError *gerr = NULL;
-
-	if (err < 0) {
-		error("Unable to get service record: %s (%d)", strerror(-err),
-					-err);
-		goto fail;
-	}
-
-	if (!recs || !recs->data) {
-		error("No records found");
-		goto fail;
-	}
-
-	gw->version = get_remote_profile_version(recs->data);
-	if (gw->version == 0)
-		goto fail;
-
-	rfcomm_connect_cb(gw->incoming, gerr, dev);
-	return;
-
-fail:
-	gateway_close(dev);
-}
-
-static void unregister_incoming(gpointer user_data)
-{
-	struct audio_device *dev = user_data;
-	struct gateway *gw = dev->gateway;
-
-	if (gw->incoming) {
-		g_io_channel_unref(gw->incoming);
-		gw->incoming = NULL;
-	}
-}
-
-static void rfcomm_incoming_cb(GIOChannel *chan, GError *err,
-				gpointer user_data)
-{
-	struct audio_device *dev = user_data;
-	struct gateway *gw = dev->gateway;
-	uuid_t uuid;
-
-	gw->incoming = g_io_channel_ref(chan);
-
-	sdp_uuid16_create(&uuid, HANDSFREE_AGW_SVCLASS_ID);
-	if (bt_search_service(&dev->src, &dev->dst, &uuid,
-						get_incoming_record_cb, dev,
-						unregister_incoming) == 0)
-		return;
-
-	unregister_incoming(dev);
-	gateway_close(dev);
-}
-
-static void get_record_cb(sdp_list_t *recs, int err, gpointer user_data)
-{
-	struct audio_device *dev = user_data;
-	struct gateway *gw = dev->gateway;
-	int ch;
-	sdp_list_t *protos, *classes;
-	uuid_t uuid;
-	GIOChannel *io;
-	GError *gerr = NULL;
-
-	if (err < 0) {
-		error("Unable to get service record: %s (%d)", strerror(-err),
-					-err);
-		goto fail;
-	}
-
-	if (!recs || !recs->data) {
-		error("No records found");
-		err = -EIO;
-		goto fail;
-	}
-
-	if (sdp_get_service_classes(recs->data, &classes) < 0) {
-		error("Unable to get service classes from record");
-		err = -EINVAL;
-		goto fail;
-	}
-
-	if (sdp_get_access_protos(recs->data, &protos) < 0) {
-		error("Unable to get access protocols from record");
-		err = -ENODATA;
-		goto fail;
-	}
-
-	gw->version = get_remote_profile_version(recs->data);
-	if (gw->version == 0) {
-		error("Unable to get profile version from record");
-		err = -EINVAL;
-		goto fail;
-	}
-
-	memcpy(&uuid, classes->data, sizeof(uuid));
-	sdp_list_free(classes, free);
-
-	if (!sdp_uuid128_to_uuid(&uuid) || uuid.type != SDP_UUID16 ||
-			uuid.value.uuid16 != HANDSFREE_AGW_SVCLASS_ID) {
-		sdp_list_free(protos, NULL);
-		error("Invalid service record or not HFP");
-		err = -EIO;
-		goto fail;
-	}
-
-	ch = sdp_get_proto_port(protos, RFCOMM_UUID);
-	sdp_list_foreach(protos, (sdp_list_func_t) sdp_list_free, NULL);
-	sdp_list_free(protos, NULL);
-	if (ch <= 0) {
-		error("Unable to extract RFCOMM channel from service record");
-		err = -EIO;
-		goto fail;
-	}
-
-	io = bt_io_connect(rfcomm_connect_cb, dev, NULL, &gerr,
-				BT_IO_OPT_SOURCE_BDADDR, &dev->src,
-				BT_IO_OPT_DEST_BDADDR, &dev->dst,
-				BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
-				BT_IO_OPT_CHANNEL, ch,
-				BT_IO_OPT_INVALID);
-	if (!io) {
-		error("Unable to connect: %s", gerr->message);
-		goto fail;
-	}
-
-	g_io_channel_unref(io);
-	return;
-
-fail:
-	if (gw->msg) {
-		DBusMessage *reply = btd_error_failed(gw->msg,
-					gerr ? gerr->message : strerror(-err));
-		g_dbus_send_message(btd_get_dbus_connection(), reply);
-	}
-
-	gateway_close(dev);
-
-	if (gerr)
-		g_error_free(gerr);
-}
-
-static int get_records(struct audio_device *device)
-{
-	uuid_t uuid;
-	int err;
-
-	sdp_uuid16_create(&uuid, HANDSFREE_AGW_SVCLASS_ID);
-
-	err = bt_search_service(&device->src, &device->dst, &uuid,
-						get_record_cb, device, NULL);
-	if (err < 0)
-		return err;
-
-	change_state(device, GATEWAY_STATE_CONNECTING);
-
-	return 0;
-}
-
-static DBusMessage *ag_connect(DBusConnection *conn, DBusMessage *msg,
-				void *data)
-{
-	struct audio_device *au_dev = (struct audio_device *) data;
-	struct gateway *gw = au_dev->gateway;
-	int err;
-
-	if (gw->state == GATEWAY_STATE_CONNECTING)
-		return btd_error_in_progress(msg);
-	else if (gw->state > GATEWAY_STATE_CONNECTING)
-		return btd_error_already_connected(msg);
-
-	if (!gw->agent)
-		return btd_error_agent_not_available(msg);
-
-	err = get_records(au_dev);
-	if (err < 0)
-		return btd_error_failed(msg, strerror(-err));
-
-	gw->msg = dbus_message_ref(msg);
-
-	return NULL;
-}
-
-int gateway_close(struct audio_device *device)
-{
-	GError *gerr = NULL;
-	struct gateway *gw = device->gateway;
-	int sock;
-
-	if (gw->rfcomm_id != 0) {
-		g_source_remove(gw->rfcomm_id);
-		gw->rfcomm_id = 0;
-	}
-
-	if (gw->sco_id != 0) {
-		g_source_remove(gw->sco_id);
-		gw->sco_id = 0;
-	}
-
-	if (gw->rfcomm) {
-		sock = g_io_channel_unix_get_fd(gw->rfcomm);
-		shutdown(sock, SHUT_RDWR);
-
-		g_io_channel_shutdown(gw->rfcomm, TRUE, NULL);
-		g_io_channel_unref(gw->rfcomm);
-		gw->rfcomm = NULL;
-	}
-
-	if (gw->sco) {
-		g_io_channel_shutdown(gw->sco, TRUE, NULL);
-		g_io_channel_unref(gw->sco);
-		gw->sco = NULL;
-	}
-
-	if (gw->agent)
-		agent_cancel(gw->agent);
-
-	change_state(device, GATEWAY_STATE_DISCONNECTED);
-	g_set_error(&gerr, GATEWAY_ERROR,
-			GATEWAY_ERROR_DISCONNECTED, "Disconnected");
-	run_connect_cb(device, gerr);
-	g_error_free(gerr);
-
-	return 0;
-}
-
-static DBusMessage *ag_disconnect(DBusConnection *conn, DBusMessage *msg,
-					void *data)
-{
-	struct audio_device *device = data;
-	struct gateway *gw = device->gateway;
-	DBusMessage *reply = NULL;
-	char gw_addr[18];
-
-	if (!gw->rfcomm)
-		return btd_error_not_connected(msg);
-
-	reply = dbus_message_new_method_return(msg);
-	if (!reply)
-		return NULL;
-
-	gateway_close(device);
-	ba2str(&device->dst, gw_addr);
-	DBG("Disconnected from %s, %s", gw_addr,
-					device_get_path(device->btd_dev));
-
-	return reply;
-}
-
-static void agent_exited(DBusConnection *conn, void *data)
-{
-	struct gateway *gateway = data;
-	struct hf_agent *agent = gateway->agent;
-
-	DBG("Agent %s exited", agent->name);
-
-	agent_free(agent);
-	gateway->agent = NULL;
-}
-
-static DBusMessage *ag_get_properties(DBusConnection *conn, DBusMessage *msg,
-					void *data)
-{
-	struct audio_device *device = data;
-	struct gateway *gw = device->gateway;
-	DBusMessage *reply;
-	DBusMessageIter iter;
-	DBusMessageIter dict;
-	const char *value;
-
-
-	reply = dbus_message_new_method_return(msg);
-	if (!reply)
-		return NULL;
-
-	dbus_message_iter_init_append(reply, &iter);
-
-	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
-			DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
-			DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
-			DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
-
-	value = state2str(gw->state);
-	dict_append_entry(&dict, "State",
-			DBUS_TYPE_STRING, &value);
-
-	dbus_message_iter_close_container(&iter, &dict);
-
-	return reply;
-}
-
-static DBusMessage *register_agent(DBusConnection *conn,
-					DBusMessage *msg, void *data)
-{
-	struct audio_device *device = data;
-	struct gateway *gw = device->gateway;
-	struct hf_agent *agent;
-	const char *path, *name;
-
-	if (gw->agent)
-		return btd_error_already_exists(msg);
-
-	if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
-						DBUS_TYPE_INVALID))
-		return btd_error_invalid_args(msg);
-
-	name = dbus_message_get_sender(msg);
-	agent = g_new0(struct hf_agent, 1);
-
-	agent->name = g_strdup(name);
-	agent->path = g_strdup(path);
-
-	agent->watch = g_dbus_add_disconnect_watch(conn, name,
-						agent_exited, gw, NULL);
-
-	gw->agent = agent;
-
-	return dbus_message_new_method_return(msg);
-}
-
-static DBusMessage *unregister_agent(DBusConnection *conn,
-				DBusMessage *msg, void *data)
-{
-	struct audio_device *device = data;
-	struct gateway *gw = device->gateway;
-	const char *path;
-
-	if (!gw->agent)
-		goto done;
-
-	if (strcmp(gw->agent->name, dbus_message_get_sender(msg)) != 0)
-		return btd_error_not_authorized(msg);
-
-	if (!dbus_message_get_args(msg, NULL,
-				DBUS_TYPE_OBJECT_PATH, &path,
-				DBUS_TYPE_INVALID))
-		return btd_error_invalid_args(msg);
-
-	if (strcmp(gw->agent->path, path) != 0)
-		return btd_error_does_not_exist(msg);
-
-	agent_free(gw->agent);
-	gw->agent = NULL;
-
-done:
-	return dbus_message_new_method_return(msg);
-}
-
-static const GDBusMethodTable gateway_methods[] = {
-	{ GDBUS_ASYNC_METHOD("Connect", NULL, NULL, ag_connect) },
-	{ GDBUS_ASYNC_METHOD("Disconnect", NULL, NULL, ag_disconnect) },
-	{ GDBUS_METHOD("GetProperties",
-			NULL, GDBUS_ARGS({ "properties", "a{sv}" }),
-			ag_get_properties) },
-	{ GDBUS_METHOD("RegisterAgent",
-			GDBUS_ARGS({ "agent", "o" }), NULL, register_agent) },
-	{ GDBUS_METHOD("UnregisterAgent",
-			GDBUS_ARGS({ "agent", "o" }), NULL, unregister_agent) },
-	{ }
-};
-
-static const GDBusSignalTable gateway_signals[] = {
-	{ GDBUS_SIGNAL("PropertyChanged",
-			GDBUS_ARGS({ "name", "s" }, { "value", "v" })) },
-	{ }
-};
-
-static void path_unregister(void *data)
-{
-	struct audio_device *dev = data;
-
-	DBG("Unregistered interface %s on path %s",
-		AUDIO_GATEWAY_INTERFACE, device_get_path(dev->btd_dev));
-
-	gateway_close(dev);
-
-	if (dev->gateway->agent)
-		agent_free(dev->gateway->agent);
-
-	g_free(dev->gateway);
-	dev->gateway = NULL;
-}
-
-void gateway_unregister(struct audio_device *dev)
-{
-	if (dev->gateway->agent)
-		agent_disconnect(dev, dev->gateway->agent);
-
-	g_dbus_unregister_interface(btd_get_dbus_connection(),
-						device_get_path(dev->btd_dev),
-						AUDIO_GATEWAY_INTERFACE);
-}
-
-struct gateway *gateway_init(struct audio_device *dev)
-{
-	if (!g_dbus_register_interface(btd_get_dbus_connection(),
-					device_get_path(dev->btd_dev),
-					AUDIO_GATEWAY_INTERFACE,
-					gateway_methods, gateway_signals,
-					NULL, dev, path_unregister))
-		return NULL;
-
-	return g_new0(struct gateway, 1);
-}
-
-gboolean gateway_is_connected(struct audio_device *dev)
-{
-	struct gateway *gw = dev->gateway;
-
-	if (gw->state == GATEWAY_STATE_CONNECTED)
-		return TRUE;
-
-	return FALSE;
-}
-
-gboolean gateway_is_active(struct audio_device *dev)
-{
-	struct gateway *gw = dev->gateway;
-
-	if (gw->state != GATEWAY_STATE_DISCONNECTED)
-		return TRUE;
-
-	return FALSE;
-}
-
-gateway_state_t gateway_get_state(struct audio_device *dev)
-{
-	struct gateway *gw = dev->gateway;
-
-	return gw->state;
-}
-
-int gateway_connect_rfcomm(struct audio_device *dev, GIOChannel *io)
-{
-	if (!io)
-		return -EINVAL;
-
-	dev->gateway->rfcomm = g_io_channel_ref(io);
-
-	change_state(dev, GATEWAY_STATE_CONNECTING);
-
-	return 0;
-}
-
-int gateway_connect_sco(struct audio_device *dev, GIOChannel *io)
-{
-	struct gateway *gw = dev->gateway;
-
-	if (gw->sco)
-		return -EISCONN;
-
-	gw->sco = g_io_channel_ref(io);
-
-	gw->sco_id = g_io_add_watch(gw->sco, G_IO_ERR | G_IO_HUP | G_IO_NVAL,
-						(GIOFunc) sco_io_cb, dev);
-
-	change_state(dev, GATEWAY_STATE_PLAYING);
-
-	return 0;
-}
-
-void gateway_start_service(struct audio_device *dev)
-{
-	struct gateway *gw = dev->gateway;
-	GError *err = NULL;
-
-	if (gw->rfcomm == NULL)
-		return;
-
-	if (!bt_io_accept(gw->rfcomm, rfcomm_incoming_cb, dev, NULL, &err)) {
-		error("bt_io_accept: %s", err->message);
-		g_error_free(err);
-		gateway_close(dev);
-	}
-}
-
-static gboolean request_stream_cb(gpointer data)
-{
-	run_connect_cb(data, NULL);
-	return FALSE;
-}
-
-/* These are functions to be called from unix.c for audio system
- * ifaces (alsa, gstreamer, etc.) */
-unsigned int gateway_request_stream(struct audio_device *dev,
-				gateway_stream_cb_t cb, void *user_data)
-{
-	struct gateway *gw = dev->gateway;
-	GError *err = NULL;
-	GIOChannel *io;
-
-	if (!gw->rfcomm) {
-		if (get_records(dev) < 0)
-			return 0;
-	} else if (!gw->sco) {
-		io = bt_io_connect(sco_connect_cb, dev, NULL, &err,
-				BT_IO_OPT_SOURCE_BDADDR, &dev->src,
-				BT_IO_OPT_DEST_BDADDR, &dev->dst,
-				BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
-				BT_IO_OPT_INVALID);
-		if (!io) {
-			error("%s", err->message);
-			g_error_free(err);
-			return 0;
-		}
-	} else
-		g_idle_add(request_stream_cb, dev);
-
-	return connect_cb_new(gw, cb, user_data);
-}
-
-gboolean gateway_cancel_stream(struct audio_device *dev, unsigned int id)
-{
-	struct gateway *gw = dev->gateway;
-	GSList *l;
-	struct connect_cb *cb = NULL;
-
-	for (l = gw->callbacks; l != NULL; l = l->next) {
-		struct connect_cb *tmp = l->data;
-
-		if (tmp->id == id) {
-			cb = tmp;
-			break;
-		}
-	}
-
-	if (!cb)
-		return FALSE;
-
-	gw->callbacks = g_slist_remove(gw->callbacks, cb);
-	g_free(cb);
-
-	gateway_suspend_stream(dev);
-
-	return TRUE;
-}
-
-int gateway_get_sco_fd(struct audio_device *dev)
-{
-	struct gateway *gw = dev->gateway;
-
-	if (!gw || !gw->sco)
-		return -1;
-
-	return g_io_channel_unix_get_fd(gw->sco);
-}
-
-void gateway_suspend_stream(struct audio_device *dev)
-{
-	GError *gerr = NULL;
-	struct gateway *gw = dev->gateway;
-
-	if (!gw || !gw->sco)
-		return;
-
-	g_source_remove(gw->sco_id);
-	gw->sco_id = 0;
-
-	g_io_channel_shutdown(gw->sco, TRUE, NULL);
-	g_io_channel_unref(gw->sco);
-	gw->sco = NULL;
-	g_set_error(&gerr, GATEWAY_ERROR, GATEWAY_ERROR_SUSPENDED, "Suspended");
-	run_connect_cb(dev, gerr);
-	g_error_free(gerr);
-	change_state(dev, GATEWAY_STATE_CONNECTED);
-}
-
-unsigned int gateway_add_state_cb(gateway_state_cb cb, void *user_data)
-{
-	struct gateway_state_callback *state_cb;
-	static unsigned int id = 0;
-
-	state_cb = g_new(struct gateway_state_callback, 1);
-	state_cb->cb = cb;
-	state_cb->user_data = user_data;
-	state_cb->id = ++id;
-
-	gateway_callbacks = g_slist_append(gateway_callbacks, state_cb);
-
-	return state_cb->id;
-}
-
-gboolean gateway_remove_state_cb(unsigned int id)
-{
-	GSList *l;
-
-	for (l = gateway_callbacks; l != NULL; l = l->next) {
-		struct gateway_state_callback *cb = l->data;
-		if (cb && cb->id == id) {
-			gateway_callbacks = g_slist_remove(gateway_callbacks,
-									cb);
-			g_free(cb);
-			return TRUE;
-		}
-	}
-
-	return FALSE;
-}
-
-gateway_lock_t gateway_get_lock(struct audio_device *dev)
-{
-	struct gateway *gw = dev->gateway;
-
-	return gw->lock;
-}
-
-gboolean gateway_lock(struct audio_device *dev, gateway_lock_t lock)
-{
-	struct gateway *gw = dev->gateway;
-
-	if (gw->lock & lock)
-		return FALSE;
-
-	gw->lock |= lock;
-
-	return TRUE;
-}
-
-gboolean gateway_unlock(struct audio_device *dev, gateway_lock_t lock)
-{
-	struct gateway *gw = dev->gateway;
-
-	if (!(gw->lock & lock))
-		return FALSE;
-
-	gw->lock &= ~lock;
-
-	if (gw->lock)
-		return TRUE;
-
-	if (gw->state == GATEWAY_STATE_PLAYING)
-		gateway_suspend_stream(dev);
-
-	return TRUE;
-}
diff --git a/audio/gateway.h b/audio/gateway.h
deleted file mode 100644
index d87d76a..0000000
--- a/audio/gateway.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *
- *  BlueZ - Bluetooth protocol stack for Linux
- *
- *  Copyright (C) 2006-2010  Nokia Corporation
- *  Copyright (C) 2004-2010  Marcel Holtmann <marcel@holtmann.org>
- *
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- */
-
-#define AUDIO_GATEWAY_INTERFACE "org.bluez.HandsfreeGateway"
-
-#define DEFAULT_HFP_HS_CHANNEL 7
-
-typedef enum {
-	GATEWAY_STATE_DISCONNECTED,
-	GATEWAY_STATE_CONNECTING,
-	GATEWAY_STATE_CONNECTED,
-	GATEWAY_STATE_PLAYING,
-} gateway_state_t;
-
-typedef enum {
-	GATEWAY_LOCK_READ = 1,
-	GATEWAY_LOCK_WRITE = 1 << 1,
-} gateway_lock_t;
-
-typedef enum {
-	GATEWAY_ERROR_DISCONNECTED,
-	GATEWAY_ERROR_SUSPENDED,
-} gateway_error_t;
-
-#define GATEWAY_ERROR gateway_error_quark()
-
-GQuark gateway_error_quark(void);
-
-typedef void (*gateway_state_cb) (struct audio_device *dev,
-					gateway_state_t old_state,
-					gateway_state_t new_state,
-					void *user_data);
-typedef void (*gateway_stream_cb_t) (struct audio_device *dev, GError *err,
-		void *user_data);
-
-void gateway_set_state(struct audio_device *dev, gateway_state_t new_state);
-void gateway_unregister(struct audio_device *dev);
-struct gateway *gateway_init(struct audio_device *dev);
-gboolean gateway_is_active(struct audio_device *dev);
-gboolean gateway_is_connected(struct audio_device *dev);
-gateway_state_t gateway_get_state(struct audio_device *dev);
-int gateway_connect_rfcomm(struct audio_device *dev, GIOChannel *io);
-int gateway_connect_sco(struct audio_device *dev, GIOChannel *chan);
-void gateway_start_service(struct audio_device *device);
-unsigned int gateway_request_stream(struct audio_device *dev,
-			gateway_stream_cb_t cb, void *user_data);
-gboolean gateway_cancel_stream(struct audio_device *dev, unsigned int id);
-int gateway_get_sco_fd(struct audio_device *dev);
-void gateway_suspend_stream(struct audio_device *dev);
-unsigned int gateway_add_state_cb(gateway_state_cb cb, void *user_data);
-gboolean gateway_remove_state_cb(unsigned int id);
-gateway_lock_t gateway_get_lock(struct audio_device *dev);
-gboolean gateway_lock(struct audio_device *dev, gateway_lock_t lock);
-gboolean gateway_unlock(struct audio_device *dev, gateway_lock_t lock);
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH BlueZ 12/13] audio: Move to profiles directory
  2012-11-13 13:21 [PATCH BlueZ 00/13] Remove HFP implementation Luiz Augusto von Dentz
                   ` (13 preceding siblings ...)
  2012-11-13 13:21 ` [PATCH BlueZ 11/13] build: Remove gateway.c and gateway.h Luiz Augusto von Dentz
@ 2012-11-13 13:21 ` Luiz Augusto von Dentz
  2012-11-13 13:21 ` [PATCH BlueZ 13/13] audio: Add support for passing endpoints as custom property Luiz Augusto von Dentz
  2012-11-13 14:16 ` [PATCH BlueZ 00/13] Remove HFP implementation Johan Hedberg
  16 siblings, 0 replies; 20+ messages in thread
From: Luiz Augusto von Dentz @ 2012-11-13 13:21 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

---
 Makefile.am                             | 32 ++++++++++++++++----------------
 {audio => profiles/audio}/a2dp-codecs.h |  0
 {audio => profiles/audio}/a2dp.c        |  0
 {audio => profiles/audio}/a2dp.h        |  0
 {audio => profiles/audio}/audio.conf    |  0
 {audio => profiles/audio}/avctp.c       |  0
 {audio => profiles/audio}/avctp.h       |  0
 {audio => profiles/audio}/avdtp.c       |  0
 {audio => profiles/audio}/avdtp.h       |  0
 {audio => profiles/audio}/avrcp.c       |  0
 {audio => profiles/audio}/avrcp.h       |  0
 {audio => profiles/audio}/control.c     |  0
 {audio => profiles/audio}/control.h     |  0
 {audio => profiles/audio}/device.c      |  0
 {audio => profiles/audio}/device.h      |  0
 {audio => profiles/audio}/main.c        |  0
 {audio => profiles/audio}/manager.c     |  0
 {audio => profiles/audio}/manager.h     |  0
 {audio => profiles/audio}/media.c       |  0
 {audio => profiles/audio}/media.h       |  0
 {audio => profiles/audio}/player.c      |  0
 {audio => profiles/audio}/player.h      |  0
 {audio => profiles/audio}/rtp.h         |  0
 {audio => profiles/audio}/sink.c        |  0
 {audio => profiles/audio}/sink.h        |  0
 {audio => profiles/audio}/source.c      |  0
 {audio => profiles/audio}/source.h      |  0
 {audio => profiles/audio}/transport.c   |  0
 {audio => profiles/audio}/transport.h   |  0
 29 files changed, 16 insertions(+), 16 deletions(-)
 rename {audio => profiles/audio}/a2dp-codecs.h (100%)
 rename {audio => profiles/audio}/a2dp.c (100%)
 rename {audio => profiles/audio}/a2dp.h (100%)
 rename {audio => profiles/audio}/audio.conf (100%)
 rename {audio => profiles/audio}/avctp.c (100%)
 rename {audio => profiles/audio}/avctp.h (100%)
 rename {audio => profiles/audio}/avdtp.c (100%)
 rename {audio => profiles/audio}/avdtp.h (100%)
 rename {audio => profiles/audio}/avrcp.c (100%)
 rename {audio => profiles/audio}/avrcp.h (100%)
 rename {audio => profiles/audio}/control.c (100%)
 rename {audio => profiles/audio}/control.h (100%)
 rename {audio => profiles/audio}/device.c (100%)
 rename {audio => profiles/audio}/device.h (100%)
 rename {audio => profiles/audio}/main.c (100%)
 rename {audio => profiles/audio}/manager.c (100%)
 rename {audio => profiles/audio}/manager.h (100%)
 rename {audio => profiles/audio}/media.c (100%)
 rename {audio => profiles/audio}/media.h (100%)
 rename {audio => profiles/audio}/player.c (100%)
 rename {audio => profiles/audio}/player.h (100%)
 rename {audio => profiles/audio}/rtp.h (100%)
 rename {audio => profiles/audio}/sink.c (100%)
 rename {audio => profiles/audio}/sink.h (100%)
 rename {audio => profiles/audio}/source.c (100%)
 rename {audio => profiles/audio}/source.h (100%)
 rename {audio => profiles/audio}/transport.c (100%)
 rename {audio => profiles/audio}/transport.h (100%)

diff --git a/Makefile.am b/Makefile.am
index 84ae237..10c811a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -105,20 +105,20 @@ endif
 
 if AUDIOPLUGIN
 builtin_modules += audio
-builtin_sources += audio/main.c \
-			audio/manager.h audio/manager.c \
-			audio/control.h audio/control.c \
-			audio/avctp.h audio/avctp.c \
-			audio/avrcp.h audio/avrcp.c \
-			audio/device.h audio/device.c \
-			audio/source.h audio/source.c \
-			audio/sink.h audio/sink.c \
-			audio/a2dp.h audio/a2dp.c \
-			audio/avdtp.h audio/avdtp.c \
-			audio/media.h audio/media.c \
-			audio/transport.h audio/transport.c \
-			audio/player.h audio/player.c \
-			audio/a2dp-codecs.h
+builtin_sources += profiles/audio/main.c \
+			profiles/audio/manager.h profiles/audio/manager.c \
+			profiles/audio/control.h profiles/audio/control.c \
+			profiles/audio/avctp.h profiles/audio/avctp.c \
+			profiles/audio/avrcp.h profiles/audio/avrcp.c \
+			profiles/audio/device.h profiles/audio/device.c \
+			profiles/audio/source.h profiles/audio/source.c \
+			profiles/audio/sink.h profiles/audio/sink.c \
+			profiles/audio/a2dp.h profiles/audio/a2dp.c \
+			profiles/audio/avdtp.h profiles/audio/avdtp.c \
+			profiles/audio/media.h profiles/audio/media.c \
+			profiles/audio/transport.h profiles/audio/transport.c \
+			profiles/audio/player.h profiles/audio/player.c \
+			profiles/audio/a2dp-codecs.h
 endif
 
 if SAPPLUGIN
@@ -305,7 +305,7 @@ endif
 EXTRA_DIST += src/genbuiltin src/bluetooth.conf src/org.bluez.service \
 			src/main.conf profiles/network/network.conf \
 			profiles/input/input.conf profiles/proximity/proximity.conf \
-			audio/audio.conf \
+			profiles/audio/audio.conf \
 			profiles/sap/sap-dummy.c profiles/sap/sap-u8500.c
 
 include Makefile.tools
@@ -347,7 +347,7 @@ EXTRA_DIST += doc/manager-api.txt \
 AM_CFLAGS += @DBUS_CFLAGS@ @GLIB_CFLAGS@
 
 AM_CPPFLAGS = -I$(builddir)/lib -I$(builddir)/src -I$(srcdir)/src \
-			-I$(srcdir)/audio -I$(srcdir)/gdbus \
+			-I$(srcdir)/profiles/audio -I$(srcdir)/gdbus \
 			-I$(srcdir)/attrib -I$(srcdir)/btio -I$(srcdir)/tools \
 			-I$(builddir)/tools -I$(srcdir)/monitor
 
diff --git a/audio/a2dp-codecs.h b/profiles/audio/a2dp-codecs.h
similarity index 100%
rename from audio/a2dp-codecs.h
rename to profiles/audio/a2dp-codecs.h
diff --git a/audio/a2dp.c b/profiles/audio/a2dp.c
similarity index 100%
rename from audio/a2dp.c
rename to profiles/audio/a2dp.c
diff --git a/audio/a2dp.h b/profiles/audio/a2dp.h
similarity index 100%
rename from audio/a2dp.h
rename to profiles/audio/a2dp.h
diff --git a/audio/audio.conf b/profiles/audio/audio.conf
similarity index 100%
rename from audio/audio.conf
rename to profiles/audio/audio.conf
diff --git a/audio/avctp.c b/profiles/audio/avctp.c
similarity index 100%
rename from audio/avctp.c
rename to profiles/audio/avctp.c
diff --git a/audio/avctp.h b/profiles/audio/avctp.h
similarity index 100%
rename from audio/avctp.h
rename to profiles/audio/avctp.h
diff --git a/audio/avdtp.c b/profiles/audio/avdtp.c
similarity index 100%
rename from audio/avdtp.c
rename to profiles/audio/avdtp.c
diff --git a/audio/avdtp.h b/profiles/audio/avdtp.h
similarity index 100%
rename from audio/avdtp.h
rename to profiles/audio/avdtp.h
diff --git a/audio/avrcp.c b/profiles/audio/avrcp.c
similarity index 100%
rename from audio/avrcp.c
rename to profiles/audio/avrcp.c
diff --git a/audio/avrcp.h b/profiles/audio/avrcp.h
similarity index 100%
rename from audio/avrcp.h
rename to profiles/audio/avrcp.h
diff --git a/audio/control.c b/profiles/audio/control.c
similarity index 100%
rename from audio/control.c
rename to profiles/audio/control.c
diff --git a/audio/control.h b/profiles/audio/control.h
similarity index 100%
rename from audio/control.h
rename to profiles/audio/control.h
diff --git a/audio/device.c b/profiles/audio/device.c
similarity index 100%
rename from audio/device.c
rename to profiles/audio/device.c
diff --git a/audio/device.h b/profiles/audio/device.h
similarity index 100%
rename from audio/device.h
rename to profiles/audio/device.h
diff --git a/audio/main.c b/profiles/audio/main.c
similarity index 100%
rename from audio/main.c
rename to profiles/audio/main.c
diff --git a/audio/manager.c b/profiles/audio/manager.c
similarity index 100%
rename from audio/manager.c
rename to profiles/audio/manager.c
diff --git a/audio/manager.h b/profiles/audio/manager.h
similarity index 100%
rename from audio/manager.h
rename to profiles/audio/manager.h
diff --git a/audio/media.c b/profiles/audio/media.c
similarity index 100%
rename from audio/media.c
rename to profiles/audio/media.c
diff --git a/audio/media.h b/profiles/audio/media.h
similarity index 100%
rename from audio/media.h
rename to profiles/audio/media.h
diff --git a/audio/player.c b/profiles/audio/player.c
similarity index 100%
rename from audio/player.c
rename to profiles/audio/player.c
diff --git a/audio/player.h b/profiles/audio/player.h
similarity index 100%
rename from audio/player.h
rename to profiles/audio/player.h
diff --git a/audio/rtp.h b/profiles/audio/rtp.h
similarity index 100%
rename from audio/rtp.h
rename to profiles/audio/rtp.h
diff --git a/audio/sink.c b/profiles/audio/sink.c
similarity index 100%
rename from audio/sink.c
rename to profiles/audio/sink.c
diff --git a/audio/sink.h b/profiles/audio/sink.h
similarity index 100%
rename from audio/sink.h
rename to profiles/audio/sink.h
diff --git a/audio/source.c b/profiles/audio/source.c
similarity index 100%
rename from audio/source.c
rename to profiles/audio/source.c
diff --git a/audio/source.h b/profiles/audio/source.h
similarity index 100%
rename from audio/source.h
rename to profiles/audio/source.h
diff --git a/audio/transport.c b/profiles/audio/transport.c
similarity index 100%
rename from audio/transport.c
rename to profiles/audio/transport.c
diff --git a/audio/transport.h b/profiles/audio/transport.h
similarity index 100%
rename from audio/transport.h
rename to profiles/audio/transport.h
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH BlueZ 13/13] audio: Add support for passing endpoints as custom property
  2012-11-13 13:21 [PATCH BlueZ 00/13] Remove HFP implementation Luiz Augusto von Dentz
                   ` (14 preceding siblings ...)
  2012-11-13 13:21 ` [PATCH BlueZ 12/13] audio: Move to profiles directory Luiz Augusto von Dentz
@ 2012-11-13 13:21 ` Luiz Augusto von Dentz
  2012-11-13 14:16 ` [PATCH BlueZ 00/13] Remove HFP implementation Johan Hedberg
  16 siblings, 0 replies; 20+ messages in thread
From: Luiz Augusto von Dentz @ 2012-11-13 13:21 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This adds the possibility to pass the registered endpoints to external
components implementing the same profile.
---
 profiles/audio/media.c | 140 ++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 114 insertions(+), 26 deletions(-)

diff --git a/profiles/audio/media.c b/profiles/audio/media.c
index 65037fe..6d45373 100644
--- a/profiles/audio/media.c
+++ b/profiles/audio/media.c
@@ -35,7 +35,9 @@
 #include <gdbus.h>
 
 #include "../src/adapter.h"
+#include "../src/device.h"
 #include "../src/dbus-common.h"
+#include "../src/profile.h"
 
 #include "glib-helper.h"
 #include "log.h"
@@ -574,6 +576,111 @@ static gboolean endpoint_init_a2dp_sink(struct media_endpoint *endpoint,
 	return TRUE;
 }
 
+static struct media_endpoint *media_adapter_find_endpoint(
+						struct media_adapter *adapter,
+						const char *sender,
+						const char *path,
+						const char *uuid)
+{
+	GSList *l;
+
+	for (l = adapter->endpoints; l; l = l->next) {
+		struct media_endpoint *endpoint = l->data;
+
+		if (sender && g_strcmp0(endpoint->sender, sender) != 0)
+			continue;
+
+		if (path && g_strcmp0(endpoint->path, path) != 0)
+			continue;
+
+		if (uuid && g_strcmp0(endpoint->uuid, uuid) != 0)
+			continue;
+
+		return endpoint;
+	}
+
+	return NULL;
+}
+
+static bool endpoint_properties_exists(const char *uuid,
+						struct btd_device *dev,
+						void *user_data)
+{
+	struct media_adapter *adapter = user_data;
+	struct btd_adapter *btd_adapter = device_get_adapter(dev);
+	const bdaddr_t *src = adapter_get_address(btd_adapter);
+
+	if (bacmp(&adapter->src, src) != 0)
+		return false;
+
+	if (media_adapter_find_endpoint(adapter, NULL, NULL, uuid) == NULL)
+		return false;
+
+	return true;
+}
+
+static void append_endpoint(struct media_endpoint *endpoint,
+						DBusMessageIter *dict)
+{
+	DBusMessageIter entry, var, props;
+
+	dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY,
+							NULL, &entry);
+
+	dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING,
+						&endpoint->sender);
+
+	dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT, "a{sv}",
+								&var);
+
+	dbus_message_iter_open_container(&var, DBUS_TYPE_ARRAY,
+					DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
+					DBUS_TYPE_STRING_AS_STRING
+					DBUS_TYPE_VARIANT_AS_STRING
+					DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
+					&props);
+
+	dict_append_entry(&props, "Path", DBUS_TYPE_OBJECT_PATH,
+							&endpoint->path);
+	dict_append_entry(&props, "Codec", DBUS_TYPE_BYTE, &endpoint->codec);
+	dict_append_array(&props, "Capabilities", DBUS_TYPE_BYTE,
+				&endpoint->capabilities, endpoint->size);
+
+	dbus_message_iter_close_container(&var, &props);
+	dbus_message_iter_close_container(&entry, &var);
+	dbus_message_iter_close_container(dict, &entry);
+}
+
+static bool endpoint_properties_get(const char *uuid,
+						struct btd_device *dev,
+						DBusMessageIter *iter,
+						void *user_data)
+{
+	struct media_adapter *adapter = user_data;
+	DBusMessageIter dict;
+	GSList *l;
+
+	dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
+					DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
+					DBUS_TYPE_STRING_AS_STRING
+					DBUS_TYPE_VARIANT_AS_STRING
+					DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
+					&dict);
+
+	for (l = adapter->endpoints; l; l = l->next) {
+		struct media_endpoint *endpoint = l->data;
+
+		if (g_strcmp0(endpoint->uuid, uuid) != 0)
+			continue;
+
+		append_endpoint(endpoint, &dict);
+	}
+
+	dbus_message_iter_close_container(iter, &dict);
+
+	return true;
+}
+
 static struct media_endpoint *media_endpoint_create(struct media_adapter *adapter,
 						const char *sender,
 						const char *path,
@@ -629,6 +736,13 @@ static struct media_endpoint *media_endpoint_create(struct media_adapter *adapte
 						sender, media_endpoint_exit,
 						endpoint, NULL);
 
+	if (media_adapter_find_endpoint(adapter, NULL, NULL, uuid) == NULL) {
+		btd_profile_add_custom_prop(uuid, "a{sv}", "Endpoints",
+						endpoint_properties_exists,
+						endpoint_properties_get,
+						adapter);
+	}
+
 	adapter->endpoints = g_slist_append(adapter->endpoints, endpoint);
 	info("Endpoint registered: sender=%s path=%s", sender, path);
 
@@ -637,32 +751,6 @@ static struct media_endpoint *media_endpoint_create(struct media_adapter *adapte
 	return endpoint;
 }
 
-static struct media_endpoint *media_adapter_find_endpoint(
-						struct media_adapter *adapter,
-						const char *sender,
-						const char *path,
-						const char *uuid)
-{
-	GSList *l;
-
-	for (l = adapter->endpoints; l; l = l->next) {
-		struct media_endpoint *endpoint = l->data;
-
-		if (sender && g_strcmp0(endpoint->sender, sender) != 0)
-			continue;
-
-		if (path && g_strcmp0(endpoint->path, path) != 0)
-			continue;
-
-		if (uuid && g_strcmp0(endpoint->uuid, uuid) != 0)
-			continue;
-
-		return endpoint;
-	}
-
-	return NULL;
-}
-
 static int parse_properties(DBusMessageIter *props, const char **uuid,
 				gboolean *delay_reporting, uint8_t *codec,
 				uint8_t **capabilities, int *size)
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [PATCH BlueZ 1/3] avctp: Fix dead assignment in control_response
  2012-11-13 13:21 ` [PATCH BlueZ 1/3] avctp: Fix dead assignment in control_response Luiz Augusto von Dentz
@ 2012-11-13 13:33   ` Luiz Augusto von Dentz
  0 siblings, 0 replies; 20+ messages in thread
From: Luiz Augusto von Dentz @ 2012-11-13 13:33 UTC (permalink / raw)
  To: linux-bluetooth

Hi,

On Tue, Nov 13, 2012 at 3:21 PM, Luiz Augusto von Dentz
<luiz.dentz@gmail.com> wrote:
> From: Szymon Janc <szymon.janc@tieto.com>
>
> Value stored to req is never read before writing it again.
> ---
>  audio/avctp.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/audio/avctp.c b/audio/avctp.c
> index 6ba25e4..29756f6 100644
> --- a/audio/avctp.c
> +++ b/audio/avctp.c
> @@ -577,7 +577,7 @@ static void control_response(struct avctp_channel *control,
>                                         size_t operand_count)
>  {
>         struct avctp_pending_req *p = control->p;
> -       struct avctp_control_req *req = p->data;
> +       struct avctp_control_req *req;
>         GSList *l;
>
>         if (p && p->transaction == avctp->transaction) {
> --
> 1.7.11.7

Please ignore this set, it was in my outgoing folder as I just applied
them but they are not part of HFP patchset.


-- 
Luiz Augusto von Dentz

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH BlueZ 00/13] Remove HFP implementation
  2012-11-13 13:21 [PATCH BlueZ 00/13] Remove HFP implementation Luiz Augusto von Dentz
                   ` (15 preceding siblings ...)
  2012-11-13 13:21 ` [PATCH BlueZ 13/13] audio: Add support for passing endpoints as custom property Luiz Augusto von Dentz
@ 2012-11-13 14:16 ` Johan Hedberg
  2012-11-13 15:39   ` Luiz Augusto von Dentz
  16 siblings, 1 reply; 20+ messages in thread
From: Johan Hedberg @ 2012-11-13 14:16 UTC (permalink / raw)
  To: Luiz Augusto von Dentz; +Cc: linux-bluetooth

Hi Luiz,

On Tue, Nov 13, 2012, Luiz Augusto von Dentz wrote:
> These changes remove HFP implemention from audio plugin and move audio
> under profiles directory.
> 
> HFP can be emulated by test-profile -u hfp, all the telephony backends
> are gone as well since this is now suppose to be a external profile
> probably done inside the telephony stack e.g. oFono in use in the
> platform.
> 
> Luiz Augusto von Dentz (13):
>   audio: Remove HFP and HSP headset role support
>   audio: Remove HFP option from audio.conf
>   audio: Remove code using headset
>   build: Remove telephony-maemo5.c
>   build: Remove telephony-maemo6.c
>   build: Remove telephony-ofono.c
>   build: Remove telephony-dummy.c
>   build: Remove telephony.h
>   build: Remove headset.c and headset.h
>   audio: Remove code HFP and HS gateway role
>   build: Remove gateway.c and gateway.h
>   audio: Move to profiles directory
>   audio: Add support for passing endpoints as custom property
> 
>  Makefile.am                             |   48 +-
>  audio/gateway.c                         | 1048 ------------
>  audio/gateway.h                         |   75 -
>  audio/headset.c                         | 2825 -------------------------------
>  audio/headset.h                         |  112 --
>  audio/manager.c                         | 1387 ---------------
>  audio/telephony-dummy.c                 |  444 -----
>  audio/telephony-maemo5.c                | 2102 -----------------------
>  audio/telephony-maemo6.c                | 2196 ------------------------
>  audio/telephony-ofono.c                 | 1636 ------------------
>  audio/telephony.h                       |  244 ---
>  {audio => profiles/audio}/a2dp-codecs.h |    0
>  {audio => profiles/audio}/a2dp.c        |    0
>  {audio => profiles/audio}/a2dp.h        |    0
>  {audio => profiles/audio}/audio.conf    |    4 -
>  {audio => profiles/audio}/avctp.c       |    0
>  {audio => profiles/audio}/avctp.h       |    0
>  {audio => profiles/audio}/avdtp.c       |    0
>  {audio => profiles/audio}/avdtp.h       |    0
>  {audio => profiles/audio}/avrcp.c       |    0
>  {audio => profiles/audio}/avrcp.h       |    0
>  {audio => profiles/audio}/control.c     |    0
>  {audio => profiles/audio}/control.h     |    0
>  {audio => profiles/audio}/device.c      |  198 +--
>  {audio => profiles/audio}/device.h      |    2 -
>  {audio => profiles/audio}/main.c        |   98 +-
>  profiles/audio/manager.c                |  552 ++++++
>  {audio => profiles/audio}/manager.h     |    7 +-
>  {audio => profiles/audio}/media.c       |  245 ++-
>  {audio => profiles/audio}/media.h       |    0
>  {audio => profiles/audio}/player.c      |    0
>  {audio => profiles/audio}/player.h      |    0
>  {audio => profiles/audio}/rtp.h         |    0
>  {audio => profiles/audio}/sink.c        |    0
>  {audio => profiles/audio}/sink.h        |    0
>  {audio => profiles/audio}/source.c      |    0
>  {audio => profiles/audio}/source.h      |    0
>  {audio => profiles/audio}/transport.c   |  380 -----
>  {audio => profiles/audio}/transport.h   |    0
>  39 files changed, 673 insertions(+), 12930 deletions(-)
>  delete mode 100644 audio/gateway.c
>  delete mode 100644 audio/gateway.h
>  delete mode 100644 audio/headset.c
>  delete mode 100644 audio/headset.h
>  delete mode 100644 audio/manager.c
>  delete mode 100644 audio/telephony-dummy.c
>  delete mode 100644 audio/telephony-maemo5.c
>  delete mode 100644 audio/telephony-maemo6.c
>  delete mode 100644 audio/telephony-ofono.c
>  delete mode 100644 audio/telephony.h
>  rename {audio => profiles/audio}/a2dp-codecs.h (100%)
>  rename {audio => profiles/audio}/a2dp.c (100%)
>  rename {audio => profiles/audio}/a2dp.h (100%)
>  rename {audio => profiles/audio}/audio.conf (93%)
>  rename {audio => profiles/audio}/avctp.c (100%)
>  rename {audio => profiles/audio}/avctp.h (100%)
>  rename {audio => profiles/audio}/avdtp.c (100%)
>  rename {audio => profiles/audio}/avdtp.h (100%)
>  rename {audio => profiles/audio}/avrcp.c (100%)
>  rename {audio => profiles/audio}/avrcp.h (100%)
>  rename {audio => profiles/audio}/control.c (100%)
>  rename {audio => profiles/audio}/control.h (100%)
>  rename {audio => profiles/audio}/device.c (69%)
>  rename {audio => profiles/audio}/device.h (96%)
>  rename {audio => profiles/audio}/main.c (53%)
>  create mode 100644 profiles/audio/manager.c
>  rename {audio => profiles/audio}/manager.h (89%)
>  rename {audio => profiles/audio}/media.c (91%)
>  rename {audio => profiles/audio}/media.h (100%)
>  rename {audio => profiles/audio}/player.c (100%)
>  rename {audio => profiles/audio}/player.h (100%)
>  rename {audio => profiles/audio}/rtp.h (100%)
>  rename {audio => profiles/audio}/sink.c (100%)
>  rename {audio => profiles/audio}/sink.h (100%)
>  rename {audio => profiles/audio}/source.c (100%)
>  rename {audio => profiles/audio}/source.h (100%)
>  rename {audio => profiles/audio}/transport.c (72%)
>  rename {audio => profiles/audio}/transport.h (100%)

Looks good to me. Feel free to apply.

Johan

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH BlueZ 00/13] Remove HFP implementation
  2012-11-13 14:16 ` [PATCH BlueZ 00/13] Remove HFP implementation Johan Hedberg
@ 2012-11-13 15:39   ` Luiz Augusto von Dentz
  0 siblings, 0 replies; 20+ messages in thread
From: Luiz Augusto von Dentz @ 2012-11-13 15:39 UTC (permalink / raw)
  To: Luiz Augusto von Dentz, linux-bluetooth

Hi Johan,

On Tue, Nov 13, 2012 at 4:16 PM, Johan Hedberg <johan.hedberg@gmail.com> wrote:
> Hi Luiz,
>
> On Tue, Nov 13, 2012, Luiz Augusto von Dentz wrote:
>> These changes remove HFP implemention from audio plugin and move audio
>> under profiles directory.
>>
>> HFP can be emulated by test-profile -u hfp, all the telephony backends
>> are gone as well since this is now suppose to be a external profile
>> probably done inside the telephony stack e.g. oFono in use in the
>> platform.
>>
>> Luiz Augusto von Dentz (13):
>>   audio: Remove HFP and HSP headset role support
>>   audio: Remove HFP option from audio.conf
>>   audio: Remove code using headset
>>   build: Remove telephony-maemo5.c
>>   build: Remove telephony-maemo6.c
>>   build: Remove telephony-ofono.c
>>   build: Remove telephony-dummy.c
>>   build: Remove telephony.h
>>   build: Remove headset.c and headset.h
>>   audio: Remove code HFP and HS gateway role
>>   build: Remove gateway.c and gateway.h
>>   audio: Move to profiles directory
>>   audio: Add support for passing endpoints as custom property
>>
>>  Makefile.am                             |   48 +-
>>  audio/gateway.c                         | 1048 ------------
>>  audio/gateway.h                         |   75 -
>>  audio/headset.c                         | 2825 -------------------------------
>>  audio/headset.h                         |  112 --
>>  audio/manager.c                         | 1387 ---------------
>>  audio/telephony-dummy.c                 |  444 -----
>>  audio/telephony-maemo5.c                | 2102 -----------------------
>>  audio/telephony-maemo6.c                | 2196 ------------------------
>>  audio/telephony-ofono.c                 | 1636 ------------------
>>  audio/telephony.h                       |  244 ---
>>  {audio => profiles/audio}/a2dp-codecs.h |    0
>>  {audio => profiles/audio}/a2dp.c        |    0
>>  {audio => profiles/audio}/a2dp.h        |    0
>>  {audio => profiles/audio}/audio.conf    |    4 -
>>  {audio => profiles/audio}/avctp.c       |    0
>>  {audio => profiles/audio}/avctp.h       |    0
>>  {audio => profiles/audio}/avdtp.c       |    0
>>  {audio => profiles/audio}/avdtp.h       |    0
>>  {audio => profiles/audio}/avrcp.c       |    0
>>  {audio => profiles/audio}/avrcp.h       |    0
>>  {audio => profiles/audio}/control.c     |    0
>>  {audio => profiles/audio}/control.h     |    0
>>  {audio => profiles/audio}/device.c      |  198 +--
>>  {audio => profiles/audio}/device.h      |    2 -
>>  {audio => profiles/audio}/main.c        |   98 +-
>>  profiles/audio/manager.c                |  552 ++++++
>>  {audio => profiles/audio}/manager.h     |    7 +-
>>  {audio => profiles/audio}/media.c       |  245 ++-
>>  {audio => profiles/audio}/media.h       |    0
>>  {audio => profiles/audio}/player.c      |    0
>>  {audio => profiles/audio}/player.h      |    0
>>  {audio => profiles/audio}/rtp.h         |    0
>>  {audio => profiles/audio}/sink.c        |    0
>>  {audio => profiles/audio}/sink.h        |    0
>>  {audio => profiles/audio}/source.c      |    0
>>  {audio => profiles/audio}/source.h      |    0
>>  {audio => profiles/audio}/transport.c   |  380 -----
>>  {audio => profiles/audio}/transport.h   |    0
>>  39 files changed, 673 insertions(+), 12930 deletions(-)
>>  delete mode 100644 audio/gateway.c
>>  delete mode 100644 audio/gateway.h
>>  delete mode 100644 audio/headset.c
>>  delete mode 100644 audio/headset.h
>>  delete mode 100644 audio/manager.c
>>  delete mode 100644 audio/telephony-dummy.c
>>  delete mode 100644 audio/telephony-maemo5.c
>>  delete mode 100644 audio/telephony-maemo6.c
>>  delete mode 100644 audio/telephony-ofono.c
>>  delete mode 100644 audio/telephony.h
>>  rename {audio => profiles/audio}/a2dp-codecs.h (100%)
>>  rename {audio => profiles/audio}/a2dp.c (100%)
>>  rename {audio => profiles/audio}/a2dp.h (100%)
>>  rename {audio => profiles/audio}/audio.conf (93%)
>>  rename {audio => profiles/audio}/avctp.c (100%)
>>  rename {audio => profiles/audio}/avctp.h (100%)
>>  rename {audio => profiles/audio}/avdtp.c (100%)
>>  rename {audio => profiles/audio}/avdtp.h (100%)
>>  rename {audio => profiles/audio}/avrcp.c (100%)
>>  rename {audio => profiles/audio}/avrcp.h (100%)
>>  rename {audio => profiles/audio}/control.c (100%)
>>  rename {audio => profiles/audio}/control.h (100%)
>>  rename {audio => profiles/audio}/device.c (69%)
>>  rename {audio => profiles/audio}/device.h (96%)
>>  rename {audio => profiles/audio}/main.c (53%)
>>  create mode 100644 profiles/audio/manager.c
>>  rename {audio => profiles/audio}/manager.h (89%)
>>  rename {audio => profiles/audio}/media.c (91%)
>>  rename {audio => profiles/audio}/media.h (100%)
>>  rename {audio => profiles/audio}/player.c (100%)
>>  rename {audio => profiles/audio}/player.h (100%)
>>  rename {audio => profiles/audio}/rtp.h (100%)
>>  rename {audio => profiles/audio}/sink.c (100%)
>>  rename {audio => profiles/audio}/sink.h (100%)
>>  rename {audio => profiles/audio}/source.c (100%)
>>  rename {audio => profiles/audio}/source.h (100%)
>>  rename {audio => profiles/audio}/transport.c (72%)
>>  rename {audio => profiles/audio}/transport.h (100%)
>
> Looks good to me. Feel free to apply.

Pushed upstream.

-- 
Luiz Augusto von Dentz

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2012-11-13 15:39 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-11-13 13:21 [PATCH BlueZ 00/13] Remove HFP implementation Luiz Augusto von Dentz
2012-11-13 13:21 ` [PATCH BlueZ 01/13] audio: Remove HFP and HSP headset role support Luiz Augusto von Dentz
2012-11-13 13:21 ` [PATCH BlueZ 1/3] avctp: Fix dead assignment in control_response Luiz Augusto von Dentz
2012-11-13 13:33   ` Luiz Augusto von Dentz
2012-11-13 13:21 ` [PATCH BlueZ 02/13] audio: Remove HFP option from audio.conf Luiz Augusto von Dentz
2012-11-13 13:21 ` [PATCH BlueZ 2/3] avrcp: Fix dead assignments in ct_set_setting Luiz Augusto von Dentz
2012-11-13 13:21 ` [PATCH BlueZ 03/13] audio: Remove code using headset Luiz Augusto von Dentz
2012-11-13 13:21 ` [PATCH BlueZ 3/3] network: Fix dead assignment in connect_cb Luiz Augusto von Dentz
2012-11-13 13:21 ` [PATCH BlueZ 04/13] build: Remove telephony-maemo5.c Luiz Augusto von Dentz
2012-11-13 13:21 ` [PATCH BlueZ 05/13] build: Remove telephony-maemo6.c Luiz Augusto von Dentz
2012-11-13 13:21 ` [PATCH BlueZ 06/13] build: Remove telephony-ofono.c Luiz Augusto von Dentz
2012-11-13 13:21 ` [PATCH BlueZ 07/13] build: Remove telephony-dummy.c Luiz Augusto von Dentz
2012-11-13 13:21 ` [PATCH BlueZ 08/13] build: Remove telephony.h Luiz Augusto von Dentz
2012-11-13 13:21 ` [PATCH BlueZ 09/13] build: Remove headset.c and headset.h Luiz Augusto von Dentz
2012-11-13 13:21 ` [PATCH BlueZ 10/13] audio: Remove code HFP and HS gateway role Luiz Augusto von Dentz
2012-11-13 13:21 ` [PATCH BlueZ 11/13] build: Remove gateway.c and gateway.h Luiz Augusto von Dentz
2012-11-13 13:21 ` [PATCH BlueZ 12/13] audio: Move to profiles directory Luiz Augusto von Dentz
2012-11-13 13:21 ` [PATCH BlueZ 13/13] audio: Add support for passing endpoints as custom property Luiz Augusto von Dentz
2012-11-13 14:16 ` [PATCH BlueZ 00/13] Remove HFP implementation Johan Hedberg
2012-11-13 15:39   ` Luiz Augusto von Dentz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox