summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@nokia.com>2008-10-17 16:59:40 +0300
committerJohan Hedberg <johan.hedberg@nokia.com>2008-10-17 16:59:40 +0300
commit7c9e18eb90954f7534dedb9cfaa55dd1180edc0a (patch)
treeefa1e570c21a5290e2e1521d9a33de19ec1909c1
parentdba1d9703c58940f0ed9ba7615380c9feb7dbcdb (diff)
Implement better support for AT+CHLD=<n>
-rw-r--r--audio/headset.c20
-rw-r--r--audio/telephony-dummy.c10
-rw-r--r--audio/telephony.h4
3 files changed, 30 insertions, 4 deletions
diff --git a/audio/headset.c b/audio/headset.c
index cccc0846..77498d73 100644
--- a/audio/headset.c
+++ b/audio/headset.c
@@ -81,6 +81,7 @@ static struct {
char *number; /* Incoming phone number */
int number_type; /* Incoming number type */
guint ring_timer; /* For incoming call indication */
+ const char *chld; /* Response to AT+CHLD=? */
} ag = {
.telephony_ready = FALSE,
.features = 0,
@@ -671,7 +672,15 @@ static int call_hold(struct audio_device *dev, const char *buf)
struct headset *hs = dev->headset;
int err;
- err = headset_send(hs, "\r\n+CHLD:(0,1,1x,2,2x,3,4)\r\n");
+ if (strlen(buf) < 9)
+ return -EINVAL;
+
+ if (buf[8] != '?') {
+ telephony_call_hold_req(dev, &buf[8]);
+ return 0;
+ }
+
+ err = headset_send(hs, "\r\n+CHLD:(%s)\r\n", ag.chld);
if (err < 0)
return err;
@@ -975,6 +984,11 @@ 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_operator_selection_ind(int mode, const char *oper)
{
if (!active_devices)
@@ -2432,12 +2446,14 @@ int telephony_calling_stopped_ind(void)
}
int telephony_ready_ind(uint32_t features,
- const struct indicator *indicators, int rh)
+ const struct indicator *indicators, int rh,
+ const char *chld)
{
ag.telephony_ready = TRUE;
ag.features = features;
ag.indicators = indicators;
ag.rh = rh;
+ ag.chld = g_strdup(chld);
debug("Telephony plugin initialized");
diff --git a/audio/telephony-dummy.c b/audio/telephony-dummy.c
index 8b3f105d..66873b65 100644
--- a/audio/telephony-dummy.c
+++ b/audio/telephony-dummy.c
@@ -36,6 +36,7 @@
#include "logging.h"
#include "telephony.h"
+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;
@@ -183,6 +184,12 @@ void telephony_operator_selection_req(void *telephony_device)
telephony_operator_selection_rsp(telephony_device, CME_ERROR_NONE);
}
+void telephony_call_hold_req(void *telephony_device, const char *cmd)
+{
+ debug("telephony-dymmy: got call hold request %s", cmd);
+ telephony_call_hold_rsp(telephony_device, CME_ERROR_NONE);
+}
+
/* D-Bus method handlers */
static DBusMessage *outgoing_call(DBusConnection *conn, DBusMessage *msg,
void *data)
@@ -376,7 +383,8 @@ int telephony_init(void)
dummy_methods, NULL,
NULL, NULL, NULL);
- telephony_ready_ind(features, dummy_indicators, response_and_hold);
+ telephony_ready_ind(features, dummy_indicators, response_and_hold,
+ chld_str);
return 0;
}
diff --git a/audio/telephony.h b/audio/telephony.h
index 4e04e71c..5e972e74 100644
--- a/audio/telephony.h
+++ b/audio/telephony.h
@@ -145,6 +145,7 @@ void telephony_transmit_dtmf_req(void *telephony_device, char tone);
void telephony_subscriber_number_req(void *telephony_device);
void telephony_list_current_calls_req(void *telephony_device);
void telephony_operator_selection_req(void *telephony_device);
+void telephony_call_hold_req(void *telephony_device, const char *cmd);
/* AG responses to HF requests. These are implemented by headset.c */
int telephony_event_reporting_rsp(void *telephony_device, cme_error_t err);
@@ -157,6 +158,7 @@ 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);
/* Event indications by AG. These are implemented by headset.c */
int telephony_event_ind(int index);
@@ -164,7 +166,7 @@ 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);
+ int rh, const char *chld);
int telephony_list_current_call_ind(int idx, int dir, int status, int mode,
int mprty, const char *number,
int type);