From: "Frédéric Danis" <frederic.danis@linux.intel.com>
To: linux-bluetooth@vger.kernel.org
Subject: [RFC v4 2/6] audio: Remove tel drivers
Date: Mon, 12 Dec 2011 11:49:10 +0100 [thread overview]
Message-ID: <1323686954-11899-3-git-send-email-frederic.danis@linux.intel.com> (raw)
In-Reply-To: <1323686954-11899-1-git-send-email-frederic.danis@linux.intel.com>
---
Makefile.am | 4 +-
audio/headset.c | 935 +---------------------------
audio/headset.h | 5 -
audio/telephony-dummy.c | 433 -------------
audio/telephony-ofono.c | 1638 -----------------------------------------------
audio/telephony.h | 171 -----
audio/transport.c | 10 +
audio/unix.c | 2 +
doc/audio-api.txt | 75 +---
9 files changed, 15 insertions(+), 3258 deletions(-)
delete mode 100644 audio/telephony-dummy.c
delete mode 100644 audio/telephony-ofono.c
diff --git a/Makefile.am b/Makefile.am
index 31c1083..9a29eb1 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -335,9 +335,7 @@ endif
EXTRA_DIST += src/genbuiltin src/bluetooth.conf \
src/main.conf network/network.conf \
input/input.conf serial/serial.conf \
- audio/audio.conf audio/telephony-dummy.c \
- audio/telephony-maemo5.c audio/telephony-ofono.c \
- audio/telephony-maemo6.c sap/sap-dummy.c sap/sap-u8500.c \
+ audio/audio.conf sap/sap-dummy.c sap/sap-u8500.c \
proximity/proximity.conf
if ALSA
diff --git a/audio/headset.c b/audio/headset.c
index 74eb7a4..e338aa5 100644
--- a/audio/headset.c
+++ b/audio/headset.c
@@ -62,35 +62,7 @@
#define DC_TIMEOUT 3
-#define RING_INTERVAL 3
-
-#define BUF_SIZE 1024
-
-#define HEADSET_GAIN_SPEAKER 'S'
-#define HEADSET_GAIN_MICROPHONE 'M'
-
-static struct {
- 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 = {
- .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",
@@ -128,25 +100,6 @@ struct pending_connect {
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;
@@ -170,15 +123,10 @@ struct headset {
struct pending_connect *pending;
headset_lock_t lock;
- struct headset_slc *slc;
+ void *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(DBusConnection *conn, DBusMessage *msg,
@@ -194,44 +142,6 @@ static int rfcomm_connect(struct audio_device *device, headset_stream_cb_t cb,
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 const char *state2str(headset_state_t state)
{
switch (state) {
@@ -249,52 +159,6 @@ static const char *state2str(headset_state_t state)
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 void pending_connect_complete(struct connect_cb *cb, struct audio_device *dev)
{
struct headset *hs = dev->headset;
@@ -375,64 +239,11 @@ static unsigned int connect_cb_new(struct headset *hs,
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) {
@@ -473,14 +284,6 @@ static void sco_connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
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,
@@ -519,14 +322,6 @@ static int sco_connect(struct audio_device *dev, headset_stream_cb_t cb,
return 0;
}
-static int hfp_cmp(struct headset *hs)
-{
- if (hs->hfp_active)
- return 0;
- else
- return -1;
-}
-
void headset_slc_complete(struct audio_device *dev)
{
struct headset *hs = dev->headset;
@@ -556,200 +351,6 @@ void headset_slc_complete(struct audio_device *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 &&
- telephony_get_ag_features() & AG_FEATURE_THREE_WAY_CALLING)
- return 0;
-
- headset_slc_complete(device);
-
- return 0;
-}
-
-int telephony_key_press_rsp(void *telephony_device, cme_error_t err)
-{
- return telephony_generic_rsp(telephony_device, err);
-}
-
-int telephony_answer_call_rsp(void *telephony_device, cme_error_t err)
-{
- return telephony_generic_rsp(telephony_device, err);
-}
-
-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(device->conn, device->path,
- AUDIO_HEADSET_INTERFACE, "CallTerminated",
- DBUS_TYPE_INVALID);
-
- 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);
-}
-
-int telephony_last_dialed_number_rsp(void *telephony_device, cme_error_t err)
-{
- return telephony_generic_rsp(telephony_device, err);
-}
-
-int telephony_dial_number_rsp(void *telephony_device, cme_error_t err)
-{
- return telephony_generic_rsp(telephony_device, err);
-}
-
-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(device->conn, device->path,
- AUDIO_HEADSET_INTERFACE, name,
- DBUS_TYPE_UINT16, &gain,
- DBUS_TYPE_INVALID);
-
- emit_property_changed(device->conn, device->path,
- AUDIO_HEADSET_INTERFACE, property,
- DBUS_TYPE_UINT16, &gain);
-
- return 0;
-}
-
-int telephony_transmit_dtmf_rsp(void *telephony_device, cme_error_t err)
-{
- return telephony_generic_rsp(telephony_device, err);
-}
-
-int telephony_subscriber_number_rsp(void *telephony_device, cme_error_t err)
-{
- return telephony_generic_rsp(telephony_device, err);
-}
-
-int telephony_list_current_calls_rsp(void *telephony_device, cme_error_t err)
-{
- return telephony_generic_rsp(telephony_device, err);
-}
-
-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 void close_sco(struct audio_device *device)
{
struct headset *hs = device->headset;
@@ -815,11 +416,6 @@ void headset_connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
DBG("%s: Connected to %s", dev->path, 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;
@@ -1169,63 +765,6 @@ static DBusMessage *hs_connect(DBusConnection *conn, DBusMessage *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_play(DBusConnection *conn, DBusMessage *msg,
void *data)
{
@@ -1265,114 +804,6 @@ static DBusMessage *hs_play(DBusConnection *conn, DBusMessage *msg,
return NULL;
}
-static DBusMessage *hs_get_speaker_gain(DBusConnection *conn,
- DBusMessage *msg,
- void *data)
-{
- struct audio_device *device = data;
- struct headset *hs = device->headset;
- struct headset_slc *slc = hs->slc;
- DBusMessage *reply;
- dbus_uint16_t gain;
-
- if (hs->state < HEADSET_STATE_CONNECTED)
- return btd_error_not_available(msg);
-
- reply = dbus_message_new_method_return(msg);
- if (!reply)
- return NULL;
-
- gain = (dbus_uint16_t) slc->sp_gain;
-
- dbus_message_append_args(reply, DBUS_TYPE_UINT16, &gain,
- DBUS_TYPE_INVALID);
-
- return reply;
-}
-
-static DBusMessage *hs_get_mic_gain(DBusConnection *conn,
- DBusMessage *msg,
- void *data)
-{
- struct audio_device *device = data;
- struct headset *hs = device->headset;
- struct headset_slc *slc = hs->slc;
- DBusMessage *reply;
- dbus_uint16_t gain;
-
- if (hs->state < HEADSET_STATE_CONNECTED || slc == NULL)
- return btd_error_not_available(msg);
-
- reply = dbus_message_new_method_return(msg);
- if (!reply)
- return NULL;
-
- gain = (dbus_uint16_t) slc->mic_gain;
-
- dbus_message_append_args(reply, DBUS_TYPE_UINT16, &gain,
- DBUS_TYPE_INVALID);
-
- return reply;
-}
-
-static DBusMessage *hs_set_gain(DBusConnection *conn,
- 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_set_speaker_gain(DBusConnection *conn,
- DBusMessage *msg,
- void *data)
-{
- uint16_t gain;
-
- if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_UINT16, &gain,
- DBUS_TYPE_INVALID))
- return NULL;
-
- return hs_set_gain(conn, msg, data, gain, HEADSET_GAIN_SPEAKER);
-}
-
-static DBusMessage *hs_set_mic_gain(DBusConnection *conn,
- DBusMessage *msg,
- void *data)
-{
- uint16_t gain;
-
- if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_UINT16, &gain,
- DBUS_TYPE_INVALID))
- return NULL;
-
- return hs_set_gain(conn, msg, data, gain, HEADSET_GAIN_MICROPHONE);
-}
-
static DBusMessage *hs_get_properties(DBusConnection *conn,
DBusMessage *msg, void *data)
{
@@ -1408,100 +839,27 @@ static DBusMessage *hs_get_properties(DBusConnection *conn,
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(conn, 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(conn, msg, data, gain,
- HEADSET_GAIN_MICROPHONE);
- }
-
- return btd_error_invalid_args(msg);
-}
-
static GDBusMethodTable headset_methods[] = {
{ "Connect", "", "", hs_connect,
G_DBUS_METHOD_FLAG_ASYNC },
{ "Disconnect", "", "", hs_disconnect },
{ "IsConnected", "", "b", hs_is_connected },
- { "IndicateCall", "", "", hs_ring },
- { "CancelCall", "", "", hs_cancel_call },
{ "Play", "", "", hs_play,
G_DBUS_METHOD_FLAG_ASYNC |
G_DBUS_METHOD_FLAG_DEPRECATED },
{ "Stop", "", "", hs_stop },
{ "IsPlaying", "", "b", hs_is_playing,
G_DBUS_METHOD_FLAG_DEPRECATED },
- { "GetSpeakerGain", "", "q", hs_get_speaker_gain,
- G_DBUS_METHOD_FLAG_DEPRECATED },
- { "GetMicrophoneGain", "", "q", hs_get_mic_gain,
- G_DBUS_METHOD_FLAG_DEPRECATED },
- { "SetSpeakerGain", "q", "", hs_set_speaker_gain,
- G_DBUS_METHOD_FLAG_DEPRECATED },
- { "SetMicrophoneGain", "q", "", hs_set_mic_gain,
- G_DBUS_METHOD_FLAG_DEPRECATED },
{ "GetProperties", "", "a{sv}",hs_get_properties },
- { "SetProperty", "sv", "", hs_set_property },
{ NULL, NULL, NULL, NULL }
};
static GDBusSignalTable headset_signals[] = {
- { "Connected", "", G_DBUS_SIGNAL_FLAG_DEPRECATED },
- { "Disconnected", "", G_DBUS_SIGNAL_FLAG_DEPRECATED },
- { "AnswerRequested", "" },
- { "Stopped", "", G_DBUS_SIGNAL_FLAG_DEPRECATED },
- { "Playing", "", G_DBUS_SIGNAL_FLAG_DEPRECATED },
- { "SpeakerGainChanged", "q", G_DBUS_SIGNAL_FLAG_DEPRECATED },
- { "MicrophoneGainChanged", "q", G_DBUS_SIGNAL_FLAG_DEPRECATED },
- { "CallTerminated", "" },
{ "PropertyChanged", "sv" },
{ NULL, NULL }
};
@@ -1675,19 +1033,6 @@ uint32_t headset_config_init(GKeyFile *config)
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 telephony_get_ag_features();
}
@@ -1895,28 +1240,18 @@ int headset_connect_rfcomm(struct audio_device *dev, GIOChannel *io)
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;
@@ -1939,17 +1274,12 @@ void headset_set_state(struct audio_device *dev, headset_state_t state)
emit_property_changed(dev->conn, dev->path,
AUDIO_HEADSET_INTERFACE, "State",
DBUS_TYPE_STRING, &state_str);
- g_dbus_emit_signal(dev->conn, dev->path,
- AUDIO_HEADSET_INTERFACE,
- "Disconnected",
- DBUS_TYPE_INVALID);
if (hs->state > HEADSET_STATE_CONNECTING) {
emit_property_changed(dev->conn, dev->path,
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(dev->conn, dev->path,
@@ -1963,28 +1293,14 @@ void headset_set_state(struct audio_device *dev, headset_state_t state)
AUDIO_HEADSET_INTERFACE, "State",
DBUS_TYPE_STRING, &state_str);
if (hs->state < state) {
- if (telephony_get_ag_features() &
- AG_FEATURE_INBAND_RINGTONE)
- slc->inband_ring = TRUE;
- else
- slc->inband_ring = FALSE;
- g_dbus_emit_signal(dev->conn, dev->path,
- AUDIO_HEADSET_INTERFACE,
- "Connected",
- DBUS_TYPE_INVALID);
value = TRUE;
emit_property_changed(dev->conn, dev->path,
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(dev->conn, dev->path,
- AUDIO_HEADSET_INTERFACE,
- "Stopped",
- DBUS_TYPE_INVALID);
emit_property_changed(dev->conn, dev->path,
AUDIO_HEADSET_INTERFACE,
"Playing",
@@ -2005,17 +1321,9 @@ void headset_set_state(struct audio_device *dev, headset_state_t state)
G_IO_ERR | G_IO_NVAL,
(GIOFunc) sco_cb, dev);
- g_dbus_emit_signal(dev->conn, dev->path,
- AUDIO_HEADSET_INTERFACE, "Playing",
- DBUS_TYPE_INVALID);
emit_property_changed(dev->conn, dev->path,
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;
}
@@ -2120,60 +1428,6 @@ int headset_get_sco_fd(struct audio_device *dev)
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;
@@ -2190,193 +1444,6 @@ void headset_shutdown(struct audio_device *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.indicators = indicators;
- ag.rh = rh;
- ag.chld = chld;
-
- DBG("Telephony plugin initialized");
-
- print_ag_features(telephony_get_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;
diff --git a/audio/headset.h b/audio/headset.h
index d43952f..6bf352c 100644
--- a/audio/headset.h
+++ b/audio/headset.h
@@ -96,11 +96,6 @@ 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);
diff --git a/audio/telephony-dummy.c b/audio/telephony-dummy.c
deleted file mode 100644
index 1f89079..0000000
--- a/audio/telephony-dummy.c
+++ /dev/null
@@ -1,433 +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 "log.h"
-#include "telephony.h"
-#include "error.h"
-
-#define TELEPHONY_DUMMY_IFACE "org.bluez.TelephonyTest"
-#define TELEPHONY_DUMMY_PATH "/org/bluez/test"
-
-static DBusConnection *connection = NULL;
-
-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(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, ®istration,
- 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 GDBusMethodTable dummy_methods[] = {
- { "OutgoingCall", "s", "", outgoing_call },
- { "IncomingCall", "s", "", incoming_call },
- { "CancelCall", "", "", cancel_call },
- { "SignalStrength", "u", "", signal_strength },
- { "BatteryLevel", "u", "", battery_level },
- { "RoamingStatus", "b", "", roaming_status },
- { "RegistrationStatus", "b", "", registration_status },
- { "SetSubscriberNumber","s", "", set_subscriber_number },
- { }
-};
-
-static GDBusSignalTable dummy_signals[] = {
- { "VoiceDial", "" },
- { }
-};
-
-int telephony_init(void)
-{
- uint32_t features = AG_FEATURE_REJECT_A_CALL |
- AG_FEATURE_ENHANCED_CALL_STATUS |
- AG_FEATURE_EXTENDED_ERROR_RESULT_CODES;
-
- DBG("");
-
- connection = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
-
- if (g_dbus_register_interface(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(connection, TELEPHONY_DUMMY_PATH,
- TELEPHONY_DUMMY_IFACE);
- dbus_connection_unref(connection);
- connection = NULL;
-
- telephony_deinit();
-}
diff --git a/audio/telephony-ofono.c b/audio/telephony-ofono.c
deleted file mode 100644
index 3607d7f..0000000
--- a/audio/telephony-ofono.c
+++ /dev/null
@@ -1,1638 +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 "glib-compat.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 DBusConnection *connection = NULL;
-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, ...)
-{
- 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(connection, msg);
- return 0;
- }
-
- if (!dbus_connection_send_with_reply(connection, 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(connection, 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(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(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;
-
- connection = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
-
- 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(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(connection, 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;
-
- dbus_connection_unref(connection);
- connection = NULL;
-
- telephony_deinit();
-}
diff --git a/audio/telephony.h b/audio/telephony.h
index 7d1d337..aa23bef 100644
--- a/audio/telephony.h
+++ b/audio/telephony.h
@@ -26,13 +26,6 @@
#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
@@ -52,95 +45,6 @@
#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
*/
@@ -152,80 +56,5 @@ void telephony_device_disconnected(void *telephony_device);
gboolean telephony_get_ready_state(void);
uint32_t telephony_get_ag_features(void);
-/* 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 *adapter);
void telephony_exit(void *adapter);
diff --git a/audio/transport.c b/audio/transport.c
index 7bde32d..3c7828d 100644
--- a/audio/transport.c
+++ b/audio/transport.c
@@ -845,14 +845,18 @@ static void get_properties_a2dp(struct media_transport *transport,
static void get_properties_headset(struct media_transport *transport,
DBusMessageIter *dict)
{
+#if 0
gboolean nrec, inband;
+#endif
const char *routing;
+#if 0
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);
+#endif
routing = headset_get_sco_hci(transport->device) ? "HCI" : "PCM";
dict_append_entry(dict, "Routing", DBUS_TYPE_STRING, &routing);
@@ -944,8 +948,10 @@ static void media_transport_free(void *data)
if (transport->session)
avdtp_unref(transport->session);
+#if 0
if (transport->nrec_id)
headset_remove_nrec_cb(transport->device, transport->nrec_id);
+#endif
if (transport->conn)
dbus_connection_unref(transport->conn);
@@ -955,6 +961,7 @@ static void media_transport_free(void *data)
g_free(transport);
}
+#if 0
static void headset_nrec_changed(struct audio_device *dev, gboolean nrec,
void *user_data)
{
@@ -966,6 +973,7 @@ static void headset_nrec_changed(struct audio_device *dev, gboolean nrec,
MEDIA_TRANSPORT_INTERFACE, "NREC",
DBUS_TYPE_BOOLEAN, &nrec);
}
+#endif
struct media_transport *media_transport_create(DBusConnection *conn,
struct media_endpoint *endpoint,
@@ -1002,9 +1010,11 @@ struct media_transport *media_transport_create(DBusConnection *conn,
transport->cancel = cancel_headset;
transport->get_properties = get_properties_headset;
transport->set_property = set_property_headset;
+#if 0
transport->nrec_id = headset_add_nrec_cb(device,
headset_nrec_changed,
transport);
+#endif
} else if (strcasecmp(uuid, HFP_HS_UUID) == 0 ||
strcasecmp(uuid, HSP_HS_UUID) == 0) {
transport->resume = resume_gateway;
diff --git a/audio/unix.c b/audio/unix.c
index 5199831..24a6669 100644
--- a/audio/unix.c
+++ b/audio/unix.c
@@ -261,8 +261,10 @@ static uint8_t headset_generate_capability(struct audio_device *dev,
pcm = (void *) codec;
pcm->sampling_rate = 8000;
if (dev->headset) {
+#if 0
if (headset_get_nrec(dev))
pcm->flags |= BT_PCM_FLAG_NREC;
+#endif
if (!headset_get_sco_hci(dev))
pcm->flags |= BT_PCM_FLAG_PCM_ROUTING;
codec->configured = headset_is_active(dev);
diff --git a/doc/audio-api.txt b/doc/audio-api.txt
index 73d87cc..e9875e7 100644
--- a/doc/audio-api.txt
+++ b/doc/audio-api.txt
@@ -71,16 +71,6 @@ Methods void Connect()
Returns TRUE if there is a active connection to the
HSP/HFP connection on the remote device.
- void IndicateCall()
-
- Indicate an incoming call on the headset
- connected to the stream. Will continue to
- ring the headset about every 3 seconds.
-
- void CancelCall()
-
- Cancel the incoming call indication.
-
void Play() {deprecated}
Open the audio connection to the headset.
@@ -94,24 +84,6 @@ Methods void Connect()
Returns true if an audio connection to the headset
is active.
- uint16 GetSpeakerGain() {deprecated}
-
- Returns the current speaker gain if available,
- otherwise returns the error NotAvailable.
-
- uint16 GetMicrophoneGain() {deprecated}
-
- Returns the current microphone gain if available,
- otherwise returns the error NotAvailable.
-
- void SetSpeakerGain(uint16 gain) {deprecated}
-
- Changes the current speaker gain if possible.
-
- void SetMicrophoneGain(uint16 gain) {deprecated}
-
- Changes the current speaker gain if possible.
-
dict GetProperties()
Returns all properties for the interface. See the
@@ -119,44 +91,7 @@ Methods void Connect()
Possible Errors: org.bluez.Error.InvalidArguments
- void SetProperty(string name, variant value)
-
- Changes the value of the specified property. Only
- properties that are listed a read-write are changeable.
- On success this will emit a PropertyChanged signal.
-
- Possible Errors: org.bluez.Error.DoesNotExist
- org.bluez.Error.InvalidArguments
-
-Signals void AnswerRequested()
-
- Sent when the answer button is pressed on the headset
-
- void Connected() {deprecated}
-
- Sent when the device has been connected to.
-
- void Disconnected() {deprecated}
-
- Sent when the device has been disconnected from.
-
- void Stopped() {deprecated}
-
- Sent when the audio connection is closed
-
- void Playing() {deprecated}
-
- Sent when the audio connection is opened
-
- void SpeakerGainChanged(uint16 gain) {deprecated}
-
- The speaker gain changed.
-
- void MicrophoneGainChanged(uint16 gain) {deprecated}
-
- The microphone gain changed.
-
- PropertyChanged(string name, variant value)
+Signals PropertyChanged(string name, variant value)
This signal indicates a changed value of the given
property.
@@ -196,14 +131,6 @@ properties string State [readonly]
Indicates if an audio connection to the headset
is active.
- uint16 SpeakerGain [readwrite]
-
- The speaker gain when available.
-
- uint16 MicrophoneGain [readwrite]
-
- The speaker gain when available.
-
AudioSink hierarchy
===================
--
1.7.1
next prev parent reply other threads:[~2011-12-12 10:49 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-12-12 10:49 [RFC v4 0/6] Add org.bluez.Telephony interface Frédéric Danis
2011-12-12 10:49 ` [RFC v4 1/6] audio: Move tel drivers to DBus interface Frédéric Danis
2011-12-12 10:49 ` Frédéric Danis [this message]
2011-12-12 10:49 ` [RFC v4 3/6] audio: Remove maemo5 tel driver Frédéric Danis
2011-12-12 10:49 ` [RFC v4 4/6] audio: Remove maemo6 " Frédéric Danis
2011-12-12 10:49 ` [RFC v4 5/6] audio: Move HFP/HSP AG servers to telephony.c Frédéric Danis
2011-12-12 10:49 ` [RFC v4 6/6] audio: Send transport path to telephony agent Frédéric Danis
2011-12-12 11:03 ` [RFC v4 0/6] Add org.bluez.Telephony interface Johan Hedberg
2011-12-12 21:24 ` Dmitriy Paliy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1323686954-11899-3-git-send-email-frederic.danis@linux.intel.com \
--to=frederic.danis@linux.intel.com \
--cc=linux-bluetooth@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).