diff options
author | Johan Hedberg <johan.hedberg@nokia.com> | 2008-10-09 18:22:57 +0200 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@nokia.com> | 2008-10-09 18:22:57 +0200 |
commit | 52e257bcbf35bf7541d87ae60da9e17d60a72303 (patch) | |
tree | ea8f3fe2401e9515c9dcb2dc59043964b4efc97b /audio/headset.c | |
parent | 3b804865eaa0d6d7ede7e4282fe394a1152806f4 (diff) |
Implement operator selection (AT+COPS) support
Diffstat (limited to 'audio/headset.c')
-rw-r--r-- | audio/headset.c | 105 |
1 files changed, 71 insertions, 34 deletions
diff --git a/audio/headset.c b/audio/headset.c index 6599e1d7..9c575fc0 100644 --- a/audio/headset.c +++ b/audio/headset.c @@ -529,6 +529,41 @@ 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; +} + +static void 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 void hfp_slc_complete(struct audio_device *dev) { struct headset *hs = dev->headset; @@ -934,6 +969,41 @@ static int call_waiting_notify(struct audio_device *device, const char *buf) return headset_send(hs, "\r\nOK\r\n"); } +int telephony_operator_selection_rsp(void *telephony_device, cme_error_t err) +{ + return telephony_generic_rsp(telephony_device, err); +} + +int telephony_operator_selection_ind(int mode, const char *oper) +{ + if (!active_devices) + return -ENODEV; + + send_foreach_headset(active_devices, hfp_cmp, "\r\n+COPS:%d,0,%s\r\n", + mode, oper); + return 0; +} + +static int operator_selection(struct audio_device *device, const char *buf) +{ + struct headset *hs = device->headset; + + if (strlen(buf) < 8) + return -EINVAL; + + switch (buf[7]) { + case '?': + telephony_operator_selection_req(device); + break; + case '=': + return headset_send(hs, "\r\nOK\r\n"); + default: + return -EINVAL; + } + + return 0; +} + static struct event event_callbacks[] = { { "ATA", answer_call }, { "ATD", dial_number }, @@ -952,6 +1022,7 @@ static struct event event_callbacks[] = { { "AT+CLCC", list_current_calls }, { "AT+CMEE", extended_errors }, { "AT+CCWA", call_waiting_notify }, + { "AT+COPS", operator_selection }, { 0 } }; @@ -1393,40 +1464,6 @@ static DBusMessage *hs_connect(DBusConnection *conn, DBusMessage *msg, return NULL; } -static int hfp_cmp(struct headset *hs) -{ - if (hs->hfp_active) - return 0; - else - return -1; -} - -static void 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) { if (!hs->hfp_active) |