2014-10-09 23:50:44

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH 0/8] shared/hfp: Add support for HFP HF - part 2

Following patches applies on:
[PATCH v4 00/11] shared/hfp: Add support for HFP HF

This is last part of patches for HFP HF in shared code. Next ones
will be done in android part.

This set mostly affects functions which help to parse hfp response.
This has been unified so it can be used by hfp gw and hf.

Also handling of +CME ERROR has been added and couple of unit tests.

Sending it now as I want to get early comments on approach. Future work
depends on it very much so I want to avoid too much rebasing.

Lukasz Rymanowski (8):
shared/hfp: Rename hfp_gw_result to hfp_context
shared/hfp: Rename hfp_hf_result to common hfp_context
shared/hfp: Rename functions operating on context
shared/hfp: Add handling +CME ERROR to parser
shared/hfp: Minor fix in container close function
shared/hfp: Add hfp_context_get_range function
unit/hfp: Add unit tests for parsing hfp_context
unit/hfp: Add test for +CME ERROR: response

android/handsfree.c | 184 +++++++++++++++++++++++-----------------------
src/shared/hfp.c | 207 ++++++++++++++++++++++++++++++++--------------------
src/shared/hfp.h | 28 ++++---
unit/test-hfp.c | 111 +++++++++++++++++++++++++---
4 files changed, 334 insertions(+), 196 deletions(-)

--
1.8.4



2014-10-31 19:32:49

by Szymon Janc

[permalink] [raw]
Subject: Re: [PATCH 0/8] shared/hfp: Add support for HFP HF - part 2

Hi Ɓukasz,

On Friday 10 of October 2014 01:50:44 Lukasz Rymanowski wrote:
> Following patches applies on:
> [PATCH v4 00/11] shared/hfp: Add support for HFP HF
>
> This is last part of patches for HFP HF in shared code. Next ones
> will be done in android part.
>
> This set mostly affects functions which help to parse hfp response.
> This has been unified so it can be used by hfp gw and hf.
>
> Also handling of +CME ERROR has been added and couple of unit tests.
>
> Sending it now as I want to get early comments on approach. Future work
> depends on it very much so I want to avoid too much rebasing.
>
> Lukasz Rymanowski (8):
> shared/hfp: Rename hfp_gw_result to hfp_context
> shared/hfp: Rename hfp_hf_result to common hfp_context
> shared/hfp: Rename functions operating on context
> shared/hfp: Add handling +CME ERROR to parser
> shared/hfp: Minor fix in container close function
> shared/hfp: Add hfp_context_get_range function
> unit/hfp: Add unit tests for parsing hfp_context
> unit/hfp: Add test for +CME ERROR: response
>
> android/handsfree.c | 184 +++++++++++++++++++++++-----------------------
> src/shared/hfp.c | 207
> ++++++++++++++++++++++++++++++++-------------------- src/shared/hfp.h |
> 28 ++++---
> unit/test-hfp.c | 111 +++++++++++++++++++++++++---
> 4 files changed, 334 insertions(+), 196 deletions(-)

Those looks OK to me. Please send rebased version (and add clarifying comment
in 4/8). Thanks.


--
BR
Szymon Janc

2014-10-30 15:53:58

by Lukasz Rymanowski

[permalink] [raw]
Subject: Re: [PATCH 4/8] shared/hfp: Add handling +CME ERROR to parser

Hi Marcin,

On 30 October 2014 10:43, Marcin Kraglak <[email protected]> wrote:
> Hi Lukasz,
>
> On 10 October 2014 01:50, Lukasz Rymanowski <[email protected]> wrote:
>> ---
>> src/shared/hfp.c | 22 +++++++++++++++++++---
>> src/shared/hfp.h | 2 ++
>> unit/test-hfp.c | 2 ++
>> 3 files changed, 23 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/shared/hfp.c b/src/shared/hfp.c
>> index 87e4017..6f2d28a 100644
>> --- a/src/shared/hfp.c
>> +++ b/src/shared/hfp.c
>> @@ -903,7 +903,9 @@ static void hf_skip_whitespace(struct hfp_context *context)
>> context->offset++;
>> }
>>
>> -static bool is_response(const char *prefix, enum hfp_result *result)
>> +static bool is_response(const char *prefix, enum hfp_result *result,
>> + enum hfp_error *cme_err,
>> + struct hfp_context *context)
>> {
>> if (strcmp(prefix, "OK") == 0) {
>> *result = HFP_RESULT_OK;
>> @@ -940,6 +942,19 @@ static bool is_response(const char *prefix, enum hfp_result *result)
>> return true;
>> }
>>
>> + if (strcmp(prefix, "+CME ERROR") == 0) {
>> + uint32_t val;
>> +
>> + *result = HFP_RESULT_CME_ERROR;
>> +
>> + if (hfp_context_get_number(context, &val))
>> + *cme_err = val;
>
> maybe check if val <= HFP_ERROR_NETWORK_NOT_ALLOWED? otherwise we can pass
> value bigger that enum.

Will do so.

>And maybe we could call resp_cb with context
> intead of cme_err which is valid just in case of
> CME ERROR response? What you think?

Just don't want to bother user with parsing context. Err and cme_err
should be fine.

>> + else
>> + *cme_err = HFP_ERROR_AG_FAILURE;
>> +
>> + return true;
>> + }
>> +
>> return false;
>> }
>>
>> @@ -972,6 +987,7 @@ static void hf_call_prefix_handler(struct hfp_hf *hfp, const char *data)
>> const char *separators = ";:\0";
>> struct hfp_context context;
>> enum hfp_result result;
>> + enum hfp_error cme_err = 0;
>
> shouldn't we set set cme_err = HFP_RESULT_OK?

This is not meant to be HFP_RESULT_OK but 0. We usually set not used
values to 0. Maybe I put comment there.

>
>> char lookup_prefix[18];
>> uint8_t pref_len = 0;
>> const char *prefix;
>> @@ -997,14 +1013,14 @@ static void hf_call_prefix_handler(struct hfp_hf *hfp, const char *data)
>> lookup_prefix[pref_len] = '\0';
>> context.offset += pref_len + 1;
>>
>> - if (is_response(lookup_prefix, &result)) {
>> + if (is_response(lookup_prefix, &result, &cme_err, &context)) {
>> struct cmd_response *cmd;
>>
>> cmd = queue_peek_head(hfp->cmd_queue);
>> if (!cmd)
>> return;
>>
>> - cmd->resp_cb(cmd->prefix, result, cmd->user_data);
>> + cmd->resp_cb(cmd->prefix, result, cme_err, cmd->user_data);
>>
>> queue_remove(hfp->cmd_queue, cmd);
>> destroy_cmd_response(cmd);
>> diff --git a/src/shared/hfp.h b/src/shared/hfp.h
>> index 27c26a2..e4a70e0 100644
>> --- a/src/shared/hfp.h
>> +++ b/src/shared/hfp.h
>> @@ -34,6 +34,7 @@ enum hfp_result {
>> HFP_RESULT_NO_ANSWER = 8,
>> HFP_RESULT_DELAYED = 9,
>> HFP_RESULT_BLACKLISTED = 10,
>> + HFP_RESULT_CME_ERROR = 11,
>> };
>>
>> enum hfp_error {
>> @@ -86,6 +87,7 @@ typedef void (*hfp_disconnect_func_t)(void *user_data);
>>
>> typedef void (*hfp_response_func_t)(const char *prefix,
>> enum hfp_result result,
>> + enum hfp_error cme_err,
>> void *user_data);
>>
>> struct hfp_gw;
>> diff --git a/unit/test-hfp.c b/unit/test-hfp.c
>> index c597fd0..bc05086 100644
>> --- a/unit/test-hfp.c
>> +++ b/unit/test-hfp.c
>> @@ -476,6 +476,7 @@ static void hf_unsolicited_resp_cb(struct hfp_context *context,
>> }
>>
>> static void hf_response_with_data(const char *prefix, enum hfp_result res,
>> + enum hfp_error cme_err,
>> void *user_data)
>> {
>> struct context *context = user_data;
>> @@ -487,6 +488,7 @@ static void hf_response_with_data(const char *prefix, enum hfp_result res,
>> }
>>
>> static void hf_brsf_response_cb(const char *prefix, enum hfp_result res,
>> + enum hfp_error cme_err,
>> void *user_data)
>> {
>> struct context *context = user_data;
>> --
>> 1.8.4
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
>> the body of a message to [email protected]
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
> BR
> Marcin

BR
Lukasz

2014-10-30 09:43:47

by Marcin Kraglak

[permalink] [raw]
Subject: Re: [PATCH 4/8] shared/hfp: Add handling +CME ERROR to parser

Hi Lukasz,

On 10 October 2014 01:50, Lukasz Rymanowski <[email protected]> wrote:
> ---
> src/shared/hfp.c | 22 +++++++++++++++++++---
> src/shared/hfp.h | 2 ++
> unit/test-hfp.c | 2 ++
> 3 files changed, 23 insertions(+), 3 deletions(-)
>
> diff --git a/src/shared/hfp.c b/src/shared/hfp.c
> index 87e4017..6f2d28a 100644
> --- a/src/shared/hfp.c
> +++ b/src/shared/hfp.c
> @@ -903,7 +903,9 @@ static void hf_skip_whitespace(struct hfp_context *context)
> context->offset++;
> }
>
> -static bool is_response(const char *prefix, enum hfp_result *result)
> +static bool is_response(const char *prefix, enum hfp_result *result,
> + enum hfp_error *cme_err,
> + struct hfp_context *context)
> {
> if (strcmp(prefix, "OK") == 0) {
> *result = HFP_RESULT_OK;
> @@ -940,6 +942,19 @@ static bool is_response(const char *prefix, enum hfp_result *result)
> return true;
> }
>
> + if (strcmp(prefix, "+CME ERROR") == 0) {
> + uint32_t val;
> +
> + *result = HFP_RESULT_CME_ERROR;
> +
> + if (hfp_context_get_number(context, &val))
> + *cme_err = val;

maybe check if val <= HFP_ERROR_NETWORK_NOT_ALLOWED? otherwise we can pass
value bigger that enum. And maybe we could call resp_cb with context
intead of cme_err which is valid just in case of
CME ERROR response? What you think?
> + else
> + *cme_err = HFP_ERROR_AG_FAILURE;
> +
> + return true;
> + }
> +
> return false;
> }
>
> @@ -972,6 +987,7 @@ static void hf_call_prefix_handler(struct hfp_hf *hfp, const char *data)
> const char *separators = ";:\0";
> struct hfp_context context;
> enum hfp_result result;
> + enum hfp_error cme_err = 0;

shouldn't we set set cme_err = HFP_RESULT_OK?

> char lookup_prefix[18];
> uint8_t pref_len = 0;
> const char *prefix;
> @@ -997,14 +1013,14 @@ static void hf_call_prefix_handler(struct hfp_hf *hfp, const char *data)
> lookup_prefix[pref_len] = '\0';
> context.offset += pref_len + 1;
>
> - if (is_response(lookup_prefix, &result)) {
> + if (is_response(lookup_prefix, &result, &cme_err, &context)) {
> struct cmd_response *cmd;
>
> cmd = queue_peek_head(hfp->cmd_queue);
> if (!cmd)
> return;
>
> - cmd->resp_cb(cmd->prefix, result, cmd->user_data);
> + cmd->resp_cb(cmd->prefix, result, cme_err, cmd->user_data);
>
> queue_remove(hfp->cmd_queue, cmd);
> destroy_cmd_response(cmd);
> diff --git a/src/shared/hfp.h b/src/shared/hfp.h
> index 27c26a2..e4a70e0 100644
> --- a/src/shared/hfp.h
> +++ b/src/shared/hfp.h
> @@ -34,6 +34,7 @@ enum hfp_result {
> HFP_RESULT_NO_ANSWER = 8,
> HFP_RESULT_DELAYED = 9,
> HFP_RESULT_BLACKLISTED = 10,
> + HFP_RESULT_CME_ERROR = 11,
> };
>
> enum hfp_error {
> @@ -86,6 +87,7 @@ typedef void (*hfp_disconnect_func_t)(void *user_data);
>
> typedef void (*hfp_response_func_t)(const char *prefix,
> enum hfp_result result,
> + enum hfp_error cme_err,
> void *user_data);
>
> struct hfp_gw;
> diff --git a/unit/test-hfp.c b/unit/test-hfp.c
> index c597fd0..bc05086 100644
> --- a/unit/test-hfp.c
> +++ b/unit/test-hfp.c
> @@ -476,6 +476,7 @@ static void hf_unsolicited_resp_cb(struct hfp_context *context,
> }
>
> static void hf_response_with_data(const char *prefix, enum hfp_result res,
> + enum hfp_error cme_err,
> void *user_data)
> {
> struct context *context = user_data;
> @@ -487,6 +488,7 @@ static void hf_response_with_data(const char *prefix, enum hfp_result res,
> }
>
> static void hf_brsf_response_cb(const char *prefix, enum hfp_result res,
> + enum hfp_error cme_err,
> void *user_data)
> {
> struct context *context = user_data;
> --
> 1.8.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html

BR
Marcin

2014-10-29 23:34:42

by Lukasz Rymanowski

[permalink] [raw]
Subject: Re: [PATCH 0/8] shared/hfp: Add support for HFP HF - part 2

Hi,

On Fri, Oct 10, 2014 at 1:50 AM, Lukasz Rymanowski
<[email protected]> wrote:
>
> Following patches applies on:
> [PATCH v4 00/11] shared/hfp: Add support for HFP HF
>
> This is last part of patches for HFP HF in shared code. Next ones
> will be done in android part.
>
> This set mostly affects functions which help to parse hfp response.
> This has been unified so it can be used by hfp gw and hf.
>
> Also handling of +CME ERROR has been added and couple of unit tests.
>
> Sending it now as I want to get early comments on approach. Future work
> depends on it very much so I want to avoid too much rebasing.
>
> Lukasz Rymanowski (8):
> shared/hfp: Rename hfp_gw_result to hfp_context
> shared/hfp: Rename hfp_hf_result to common hfp_context
> shared/hfp: Rename functions operating on context
> shared/hfp: Add handling +CME ERROR to parser
> shared/hfp: Minor fix in container close function
> shared/hfp: Add hfp_context_get_range function
> unit/hfp: Add unit tests for parsing hfp_context
> unit/hfp: Add test for +CME ERROR: response
>
> android/handsfree.c | 184 +++++++++++++++++++++++-----------------------
> src/shared/hfp.c | 207 ++++++++++++++++++++++++++++++++--------------------
> src/shared/hfp.h | 28 ++++---
> unit/test-hfp.c | 111 +++++++++++++++++++++++++---
> 4 files changed, 334 insertions(+), 196 deletions(-)
>
Ping

This set requires rebase but before I do that it would be nice to get
any comments on that (if any)

\Lukasz
>
> --
> 1.8.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html

2014-10-09 23:50:52

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH 8/8] unit/hfp: Add test for +CME ERROR: response

---
unit/test-hfp.c | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)

diff --git a/unit/test-hfp.c b/unit/test-hfp.c
index 9c71ee9..ff5532e 100644
--- a/unit/test-hfp.c
+++ b/unit/test-hfp.c
@@ -487,6 +487,19 @@ static void hf_response_with_data(const char *prefix, enum hfp_result res,
hfp_hf_disconnect(context->hfp_hf);
}

+static void hf_cme_error_response_cb(const char *prefix,
+ enum hfp_result res,
+ enum hfp_error cme_err,
+ void *user_data)
+{
+ struct context *context = user_data;
+
+ g_assert_cmpstr(prefix, ==, "AT+CHLD");
+ g_assert_cmpint(res, ==, HFP_RESULT_CME_ERROR);
+ g_assert_cmpint(cme_err, ==, 30);
+
+ hfp_hf_disconnect(context->hfp_hf);
+}
static void hf_brsf_response_cb(const char *prefix, enum hfp_result res,
enum hfp_error cme_err,
void *user_data)
@@ -721,6 +734,14 @@ int main(int argc, char *argv[])
frg_pdu('\r', '\n', 'O', 'k', '\r', '\n'),
data_end());

+ define_hf_test("/hfp/test_send_command_3", test_hf_send_command, NULL,
+ hf_cme_error_response_cb,
+ raw_pdu('A', 'T', '+', 'C', 'H', 'L', 'D', '=',
+ '1', '\0'),
+ frg_pdu('\r', '\n', '+', 'C', 'M', 'E', ' ', 'E'),
+ frg_pdu('R', 'R', 'O', 'R', ':', '3', '0', '\r', '\n'),
+ data_end());
+
define_hf_test("/hfp/test_unsolicited_1", test_hf_unsolicited,
hf_result_handler, NULL,
raw_pdu('+', 'C', 'L', 'C', 'C', '\0'),
--
1.8.4


2014-10-09 23:50:51

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH 7/8] unit/hfp: Add unit tests for parsing hfp_context

This patch adds:
/hfp/test_hf_context_parser_1
/hfp/test_hf_context_parser_2
---
unit/test-hfp.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 66 insertions(+)

diff --git a/unit/test-hfp.c b/unit/test-hfp.c
index bc05086..9c71ee9 100644
--- a/unit/test-hfp.c
+++ b/unit/test-hfp.c
@@ -531,6 +531,54 @@ static void test_hf_send_command(gconstpointer data)

execute_context(context);
}
+static void hf_chld_result_handler(struct hfp_context *hf_context,
+ void *user_data)
+{
+ struct context *context = user_data;
+ char str[3];
+
+ g_assert(hf_context);
+ g_assert(hfp_context_get_unquoted_string(hf_context, str,
+ sizeof(str)));
+ g_assert_cmpstr(str, ==, "1");
+ g_assert(hfp_context_get_unquoted_string(hf_context, str,
+ sizeof(str)));
+ g_assert_cmpstr(str, ==, "2x");
+
+ hfp_hf_disconnect(context->hfp_hf);
+}
+
+static void hf_clcc_result_handler(struct hfp_context *hf_context,
+ void *user_data)
+{
+ struct context *context = user_data;
+ char name[10];
+ uint32_t val1, val2;
+
+ g_assert(hf_context);
+ g_assert(hfp_context_open_container(hf_context));
+ g_assert(hfp_context_get_string(hf_context, name, sizeof(name)));
+ g_assert_cmpstr(name, ==, "call");
+ g_assert(hfp_context_open_container(hf_context));
+ g_assert(hfp_context_get_number(hf_context, &val1));
+ g_assert_cmpint(val1, ==, 0);
+ g_assert(hfp_context_get_number(hf_context, &val1));
+ g_assert_cmpint(val1, ==, 1);
+ g_assert(hfp_context_close_container(hf_context));
+ g_assert(hfp_context_close_container(hf_context));
+
+ g_assert(hfp_context_open_container(hf_context));
+ g_assert(hfp_context_get_string(hf_context, name, sizeof(name)));
+ g_assert_cmpstr(name, ==, "callsetup");
+ g_assert(hfp_context_open_container(hf_context));
+ g_assert(hfp_context_get_range(hf_context, &val1, &val2));
+ g_assert_cmpint(val1, ==, 0);
+ g_assert_cmpint(val2, ==, 3);
+ g_assert(hfp_context_close_container(hf_context));
+ g_assert(hfp_context_close_container(hf_context));
+
+ hfp_hf_disconnect(context->hfp_hf);
+}

static void hf_result_handler(struct hfp_context *result,
void *user_data)
@@ -718,5 +766,23 @@ int main(int argc, char *argv[])
raw_pdu('\r', '\n', 'B', 'R', '\r', '\n'),
data_end());

+ define_hf_test("/hfp/test_hf_context_parser_1", test_hf_unsolicited,
+ hf_clcc_result_handler, NULL,
+ raw_pdu('+', 'C', 'L', 'C', 'C', '\0'),
+ frg_pdu('+', 'C', 'L', 'C', 'C', ':'),
+ frg_pdu('(', '\"', 'c', 'a', 'l', 'l', '\"'),
+ frg_pdu('(', '0', ',', '1', ')', ')', ','),
+ frg_pdu('(', '\"', 'c', 'a', 'l', 'l', 's', 'e', 't'),
+ frg_pdu('u', 'p', '\"', ',', '(', '0', '-', '3', ')'),
+ frg_pdu(')', '\r', '\n'),
+ data_end());
+
+ define_hf_test("/hfp/test_hf_context_parser_2", test_hf_unsolicited,
+ hf_chld_result_handler, NULL,
+ raw_pdu('+', 'C', 'H', 'L', 'D', '\0'),
+ frg_pdu('+', 'C', 'H', 'L', 'D', ':'),
+ frg_pdu('1', ',', '2', 'x', '\r', '\n'),
+ data_end());
+
return g_test_run();
}
--
1.8.4


2014-10-09 23:50:50

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH 6/8] shared/hfp: Add hfp_context_get_range function

This patch adds hfp_contex_get_range function which is useful in parsing
response like this : +CIND: ("battchr",(1-5))
---
src/shared/hfp.c | 31 +++++++++++++++++++++++++++++++
src/shared/hfp.h | 2 ++
2 files changed, 33 insertions(+)

diff --git a/src/shared/hfp.c b/src/shared/hfp.c
index 1ccbd16..fe9f1c0 100644
--- a/src/shared/hfp.c
+++ b/src/shared/hfp.c
@@ -419,6 +419,37 @@ bool hfp_context_has_next(struct hfp_context *result)
return result->data[result->offset] != '\0';
}

+bool hfp_context_get_range(struct hfp_context *context, uint32_t *min,
+ uint32_t *max)
+{
+ uint32_t l, h;
+ uint32_t start;
+
+ start = context->offset;
+
+ if (!hfp_context_get_number(context, &l))
+ goto failed;
+
+ if (context->data[context->offset] != '-')
+ goto failed;
+
+ context->offset++;
+
+ if (!hfp_context_get_number(context, &h))
+ goto failed;
+
+ *min = l;
+ *max = h;
+
+ next_field(context);
+
+ return true;
+
+failed:
+ context->offset = start;
+ return false;
+}
+
static void process_input(struct hfp_gw *hfp)
{
char *str, *ptr;
diff --git a/src/shared/hfp.h b/src/shared/hfp.h
index e4a70e0..c2153a8 100644
--- a/src/shared/hfp.h
+++ b/src/shared/hfp.h
@@ -137,6 +137,8 @@ bool hfp_context_get_string(struct hfp_context *context, char *buf,
uint8_t len);
bool hfp_context_get_unquoted_string(struct hfp_context *context,
char *buf, uint8_t len);
+bool hfp_context_get_range(struct hfp_context *context, unsigned int *min,
+ unsigned int *max);
bool hfp_context_has_next(struct hfp_context *context);

struct hfp_hf *hfp_hf_new(int fd);
--
1.8.4


2014-10-09 23:50:49

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH 5/8] shared/hfp: Minor fix in container close function

When closing container of hfp_context, we should try to move to next
field so offset is set correctly to next data.

Needed in case of parsing for example:
.+CIND: ("call",(0,1)),("callsetup",(0-3))")
---
src/shared/hfp.c | 2 ++
1 file changed, 2 insertions(+)

diff --git a/src/shared/hfp.c b/src/shared/hfp.c
index 6f2d28a..1ccbd16 100644
--- a/src/shared/hfp.c
+++ b/src/shared/hfp.c
@@ -331,6 +331,8 @@ bool hfp_context_close_container(struct hfp_context *context)

context->offset++;

+ next_field(context);
+
return true;
}

--
1.8.4


2014-10-09 23:50:47

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH 3/8] shared/hfp: Rename functions operating on context

---
android/handsfree.c | 91 ++++++++++++++++++++++++++---------------------------
src/shared/hfp.c | 16 +++++-----
src/shared/hfp.h | 14 ++++-----
unit/test-hfp.c | 8 ++---
4 files changed, 64 insertions(+), 65 deletions(-)

diff --git a/android/handsfree.c b/android/handsfree.c
index 2bff183..6abc99b 100644
--- a/android/handsfree.c
+++ b/android/handsfree.c
@@ -301,10 +301,10 @@ static void at_cmd_vgm(struct hfp_context *context,

switch (type) {
case HFP_GW_CMD_TYPE_SET:
- if (!hfp_gw_result_get_number(context, &val) || val > 15)
+ if (!hfp_context_get_number(context, &val) || val > 15)
break;

- if (hfp_gw_result_has_next(context))
+ if (hfp_context_has_next(context))
break;

ev.type = HAL_HANDSFREE_VOLUME_TYPE_MIC;
@@ -335,10 +335,10 @@ static void at_cmd_vgs(struct hfp_context *context,

switch (type) {
case HFP_GW_CMD_TYPE_SET:
- if (!hfp_gw_result_get_number(context, &val) || val > 15)
+ if (!hfp_context_get_number(context, &val) || val > 15)
break;

- if (hfp_gw_result_has_next(context))
+ if (hfp_context_has_next(context))
break;

ev.type = HAL_HANDSFREE_VOLUME_TYPE_SPEAKER;
@@ -366,13 +366,13 @@ static void at_cmd_cops(struct hfp_context *context,

switch (type) {
case HFP_GW_CMD_TYPE_SET:
- if (!hfp_gw_result_get_number(context, &val) || val != 3)
+ if (!hfp_context_get_number(context, &val) || val != 3)
break;

- if (!hfp_gw_result_get_number(context, &val) || val != 0)
+ if (!hfp_context_get_number(context, &val) || val != 0)
break;

- if (hfp_gw_result_has_next(context))
+ if (hfp_context_has_next(context))
break;

hfp_gw_send_result(device.gw, HFP_RESULT_OK);
@@ -407,8 +407,7 @@ static void at_cmd_bia(struct hfp_context *context,
do {
def = (i < IND_COUNT) ? device.inds[i].active : 0;

- if (!hfp_gw_result_get_number_default(context, &val,
- def))
+ if (!hfp_context_get_number_default(context, &val, def))
goto failed;

if (val > 1)
@@ -418,7 +417,7 @@ static void at_cmd_bia(struct hfp_context *context,
tmp[i] = val || device.inds[i].always_active;
i++;
}
- } while (hfp_gw_result_has_next(context));
+ } while (hfp_context_has_next(context));

for (i = 0; i < IND_COUNT; i++)
device.inds[i].active = tmp[i];
@@ -442,7 +441,7 @@ static void at_cmd_a(struct hfp_context *context,

switch (type) {
case HFP_GW_CMD_TYPE_COMMAND:
- if (hfp_gw_result_has_next(context))
+ if (hfp_context_has_next(context))
break;

ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
@@ -471,7 +470,7 @@ static void at_cmd_d(struct hfp_context *context,

switch (type) {
case HFP_GW_CMD_TYPE_SET:
- if (!hfp_gw_result_get_unquoted_string(context,
+ if (!hfp_context_get_unquoted_string(context,
(char *) ev->number, 255))
break;

@@ -512,10 +511,10 @@ static void at_cmd_ccwa(struct hfp_context *context,

switch (type) {
case HFP_GW_CMD_TYPE_SET:
- if (!hfp_gw_result_get_number(context, &val) || val > 1)
+ if (!hfp_context_get_number(context, &val) || val > 1)
break;

- if (hfp_gw_result_has_next(context))
+ if (hfp_context_has_next(context))
break;

device.ccwa_enabled = val;
@@ -538,7 +537,7 @@ static void at_cmd_chup(struct hfp_context *context,

switch (type) {
case HFP_GW_CMD_TYPE_COMMAND:
- if (hfp_gw_result_has_next(context))
+ if (hfp_context_has_next(context))
break;

ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
@@ -563,7 +562,7 @@ static void at_cmd_clcc(struct hfp_context *context,

switch (type) {
case HFP_GW_CMD_TYPE_COMMAND:
- if (hfp_gw_result_has_next(context))
+ if (hfp_context_has_next(context))
break;

ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
@@ -587,10 +586,10 @@ static void at_cmd_cmee(struct hfp_context *context,

switch (type) {
case HFP_GW_CMD_TYPE_SET:
- if (!hfp_gw_result_get_number(context, &val) || val > 1)
+ if (!hfp_context_get_number(context, &val) || val > 1)
break;

- if (hfp_gw_result_has_next(context))
+ if (hfp_context_has_next(context))
break;

device.cmee_enabled = val;
@@ -615,10 +614,10 @@ static void at_cmd_clip(struct hfp_context *context,

switch (type) {
case HFP_GW_CMD_TYPE_SET:
- if (!hfp_gw_result_get_number(context, &val) || val > 1)
+ if (!hfp_context_get_number(context, &val) || val > 1)
break;

- if (hfp_gw_result_has_next(context))
+ if (hfp_context_has_next(context))
break;

device.clip_enabled = val;
@@ -644,7 +643,7 @@ static void at_cmd_vts(struct hfp_context *context,

switch (type) {
case HFP_GW_CMD_TYPE_SET:
- if (!hfp_gw_result_get_unquoted_string(context, str, 2))
+ if (!hfp_context_get_unquoted_string(context, str, 2))
break;

if (!((str[0] >= '0' && str[0] <= '9') ||
@@ -652,7 +651,7 @@ static void at_cmd_vts(struct hfp_context *context,
str[0] == '*' || str[0] == '#'))
break;

- if (hfp_gw_result_has_next(context))
+ if (hfp_context_has_next(context))
break;

ev.tone = str[0];
@@ -679,7 +678,7 @@ static void at_cmd_cnum(struct hfp_context *context,

switch (type) {
case HFP_GW_CMD_TYPE_COMMAND:
- if (hfp_gw_result_has_next(context))
+ if (hfp_context_has_next(context))
break;

ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
@@ -713,7 +712,7 @@ static void at_cmd_bldn(struct hfp_context *context,

switch (type) {
case HFP_GW_CMD_TYPE_COMMAND:
- if (hfp_gw_result_has_next(context))
+ if (hfp_context_has_next(context))
break;

ev.number_len = 0;
@@ -740,10 +739,10 @@ static void at_cmd_bvra(struct hfp_context *context,

switch (type) {
case HFP_GW_CMD_TYPE_SET:
- if (!hfp_gw_result_get_number(context, &val) || val > 1)
+ if (!hfp_context_get_number(context, &val) || val > 1)
break;

- if (hfp_gw_result_has_next(context))
+ if (hfp_context_has_next(context))
break;

if (val)
@@ -778,10 +777,10 @@ static void at_cmd_nrec(struct hfp_context *context,
* callback, but spec allows HF to only disable AG's NREC
* feature for SLC duration. Follow spec here.
*/
- if (!hfp_gw_result_get_number(context, &val) || val != 0)
+ if (!hfp_context_get_number(context, &val) || val != 0)
break;

- if (hfp_gw_result_has_next(context))
+ if (hfp_context_has_next(context))
break;

ev.nrec = HAL_HANDSFREE_NREC_STOP;
@@ -940,7 +939,7 @@ static void at_cmd_bcc(struct hfp_context *result, enum hfp_gw_cmd_type type,
if (!(device.features & HFP_HF_FEAT_CODEC))
break;

- if (hfp_gw_result_has_next(result))
+ if (hfp_context_has_next(result))
break;

hfp_gw_send_result(device.gw, HFP_RESULT_OK);
@@ -976,10 +975,10 @@ static void at_cmd_bcs(struct hfp_context *result, enum hfp_gw_cmd_type type,

switch (type) {
case HFP_GW_CMD_TYPE_SET:
- if (!hfp_gw_result_get_number(result, &val))
+ if (!hfp_context_get_number(result, &val))
break;

- if (hfp_gw_result_has_next(result))
+ if (hfp_context_has_next(result))
break;

/* Remote replied with other codec. Reply with error */
@@ -1014,10 +1013,10 @@ static void at_cmd_ckpd(struct hfp_context *result, enum hfp_gw_cmd_type type,

switch (type) {
case HFP_GW_CMD_TYPE_SET:
- if (!hfp_gw_result_get_number(result, &val) || val != 200)
+ if (!hfp_context_get_number(result, &val) || val != 200)
break;

- if (hfp_gw_result_has_next(result))
+ if (hfp_context_has_next(result))
break;

ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
@@ -1074,22 +1073,22 @@ static void at_cmd_cmer(struct hfp_context *result, enum hfp_gw_cmd_type type,
switch (type) {
case HFP_GW_CMD_TYPE_SET:
/* mode must be =3 */
- if (!hfp_gw_result_get_number(result, &val) || val != 3)
+ if (!hfp_context_get_number(result, &val) || val != 3)
break;

/* keyp is don't care */
- if (!hfp_gw_result_get_number(result, &val))
+ if (!hfp_context_get_number(result, &val))
break;

/* disp is don't care */
- if (!hfp_gw_result_get_number(result, &val))
+ if (!hfp_context_get_number(result, &val))
break;

/* ind must be 0 or 1 */
- if (!hfp_gw_result_get_number(result, &val) || val > 1)
+ if (!hfp_context_get_number(result, &val) || val > 1)
break;

- if (hfp_gw_result_has_next(result))
+ if (hfp_context_has_next(result))
break;

device.indicators_enabled = val;
@@ -1175,10 +1174,10 @@ static void at_cmd_brsf(struct hfp_context *result, enum hfp_gw_cmd_type type,

switch (type) {
case HFP_GW_CMD_TYPE_SET:
- if (!hfp_gw_result_get_number(result, &feat))
+ if (!hfp_context_get_number(result, &feat))
break;

- if (hfp_gw_result_has_next(result))
+ if (hfp_context_has_next(result))
break;

/* TODO verify features */
@@ -1206,11 +1205,11 @@ static void at_cmd_chld(struct hfp_context *result, enum hfp_gw_cmd_type type,

switch (type) {
case HFP_GW_CMD_TYPE_SET:
- if (!hfp_gw_result_get_number(result, &val) || val > 3)
+ if (!hfp_context_get_number(result, &val) || val > 3)
break;

/* No ECC support */
- if (hfp_gw_result_has_next(result))
+ if (hfp_context_has_next(result))
break;

/* value match HAL type */
@@ -1265,23 +1264,23 @@ static void at_cmd_bac(struct hfp_context *result, enum hfp_gw_cmd_type type,
* At least CVSD mandatory codec must exist
* HFP V1.6 4.34.1
*/
- if (!hfp_gw_result_get_number(result, &val) ||
+ if (!hfp_context_get_number(result, &val) ||
val != CODEC_ID_CVSD)
goto failed;

device.codecs[CVSD_OFFSET].remote_supported = true;

- if (hfp_gw_result_get_number(result, &val)) {
+ if (hfp_context_get_number(result, &val)) {
if (val != CODEC_ID_MSBC)
goto failed;

device.codecs[MSBC_OFFSET].remote_supported = true;
}

- while (hfp_gw_result_has_next(result)) {
+ while (hfp_context_has_next(result)) {
struct hfp_codec *codec;

- if (!hfp_gw_result_get_number(result, &val))
+ if (!hfp_context_get_number(result, &val))
goto failed;

codec = find_codec_by_type(val);
diff --git a/src/shared/hfp.c b/src/shared/hfp.c
index 8170a16..87e4017 100644
--- a/src/shared/hfp.c
+++ b/src/shared/hfp.c
@@ -265,7 +265,7 @@ static void next_field(struct hfp_context *context)
context->offset++;
}

-bool hfp_gw_result_get_number_default(struct hfp_context *context,
+bool hfp_context_get_number_default(struct hfp_context *context,
unsigned int *val,
unsigned int default_val)
{
@@ -279,10 +279,10 @@ bool hfp_gw_result_get_number_default(struct hfp_context *context,
return true;
}

- return hfp_gw_result_get_number(context, val);
+ return hfp_context_get_number(context, val);
}

-bool hfp_gw_result_get_number(struct hfp_context *context,
+bool hfp_context_get_number(struct hfp_context *context,
unsigned int *val)
{
unsigned int i;
@@ -308,7 +308,7 @@ bool hfp_gw_result_get_number(struct hfp_context *context,
return true;
}

-bool hfp_gw_result_open_container(struct hfp_context *context)
+bool hfp_context_open_container(struct hfp_context *context)
{
skip_whitespace(context);

@@ -321,7 +321,7 @@ bool hfp_gw_result_open_container(struct hfp_context *context)
return true;
}

-bool hfp_gw_result_close_container(struct hfp_context *context)
+bool hfp_context_close_container(struct hfp_context *context)
{
skip_whitespace(context);

@@ -334,7 +334,7 @@ bool hfp_gw_result_close_container(struct hfp_context *context)
return true;
}

-bool hfp_gw_result_get_string(struct hfp_context *context, char *buf,
+bool hfp_context_get_string(struct hfp_context *context, char *buf,
uint8_t len)
{
int i = 0;
@@ -375,7 +375,7 @@ bool hfp_gw_result_get_string(struct hfp_context *context, char *buf,
return true;
}

-bool hfp_gw_result_get_unquoted_string(struct hfp_context *context,
+bool hfp_context_get_unquoted_string(struct hfp_context *context,
char *buf, uint8_t len)
{
const char *data = context->data;
@@ -412,7 +412,7 @@ bool hfp_gw_result_get_unquoted_string(struct hfp_context *context,
return true;
}

-bool hfp_gw_result_has_next(struct hfp_context *result)
+bool hfp_context_has_next(struct hfp_context *result)
{
return result->data[result->offset] != '\0';
}
diff --git a/src/shared/hfp.h b/src/shared/hfp.h
index 02df713..27c26a2 100644
--- a/src/shared/hfp.h
+++ b/src/shared/hfp.h
@@ -124,18 +124,18 @@ bool hfp_gw_register(struct hfp_gw *hfp, hfp_result_func_t callback,
hfp_destroy_func_t destroy);
bool hfp_gw_unregister(struct hfp_gw *hfp, const char *prefix);

-bool hfp_gw_result_get_number(struct hfp_context *context,
+bool hfp_context_get_number(struct hfp_context *context,
unsigned int *val);
-bool hfp_gw_result_get_number_default(struct hfp_context *context,
+bool hfp_context_get_number_default(struct hfp_context *context,
unsigned int *val,
unsigned int default_val);
-bool hfp_gw_result_open_container(struct hfp_context *context);
-bool hfp_gw_result_close_container(struct hfp_context *context);
-bool hfp_gw_result_get_string(struct hfp_context *context, char *buf,
+bool hfp_context_open_container(struct hfp_context *context);
+bool hfp_context_close_container(struct hfp_context *context);
+bool hfp_context_get_string(struct hfp_context *context, char *buf,
uint8_t len);
-bool hfp_gw_result_get_unquoted_string(struct hfp_context *context,
+bool hfp_context_get_unquoted_string(struct hfp_context *context,
char *buf, uint8_t len);
-bool hfp_gw_result_has_next(struct hfp_context *context);
+bool hfp_context_has_next(struct hfp_context *context);

struct hfp_hf *hfp_hf_new(int fd);
struct hfp_hf *hfp_hf_ref(struct hfp_hf *hfp);
diff --git a/unit/test-hfp.c b/unit/test-hfp.c
index 7dd3b33..c597fd0 100644
--- a/unit/test-hfp.c
+++ b/unit/test-hfp.c
@@ -371,7 +371,7 @@ static void check_ustring_1(struct hfp_context *result,

g_assert(type == pdu->type);

- g_assert(hfp_gw_result_get_unquoted_string(result, str, sizeof(str)));
+ g_assert(hfp_context_get_unquoted_string(result, str, sizeof(str)));

while (context->data->pdu_list[1].data[i] != '\r') {
g_assert(j < sizeof(str));
@@ -399,7 +399,7 @@ static void check_ustring_2(struct hfp_context *result,

g_assert(type == pdu->type);

- g_assert(!hfp_gw_result_get_unquoted_string(result, str, 3));
+ g_assert(!hfp_context_get_unquoted_string(result, str, 3));

g_assert(str[3] == 'X');

@@ -418,7 +418,7 @@ static void check_string_1(struct hfp_context *result,

g_assert(type == pdu->type);

- g_assert(hfp_gw_result_get_string(result, str, sizeof(str)));
+ g_assert(hfp_context_get_string(result, str, sizeof(str)));

while (context->data->pdu_list[1].data[i] != '\"') {
g_assert(j < sizeof(str));
@@ -447,7 +447,7 @@ static void check_string_2(struct hfp_context *result,

g_assert(type == pdu->type);

- g_assert(!hfp_gw_result_get_string(result, str, 3));
+ g_assert(!hfp_context_get_string(result, str, 3));

g_assert(str[3] == 'X');

--
1.8.4


2014-10-09 23:50:48

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH 4/8] shared/hfp: Add handling +CME ERROR to parser

---
src/shared/hfp.c | 22 +++++++++++++++++++---
src/shared/hfp.h | 2 ++
unit/test-hfp.c | 2 ++
3 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/src/shared/hfp.c b/src/shared/hfp.c
index 87e4017..6f2d28a 100644
--- a/src/shared/hfp.c
+++ b/src/shared/hfp.c
@@ -903,7 +903,9 @@ static void hf_skip_whitespace(struct hfp_context *context)
context->offset++;
}

-static bool is_response(const char *prefix, enum hfp_result *result)
+static bool is_response(const char *prefix, enum hfp_result *result,
+ enum hfp_error *cme_err,
+ struct hfp_context *context)
{
if (strcmp(prefix, "OK") == 0) {
*result = HFP_RESULT_OK;
@@ -940,6 +942,19 @@ static bool is_response(const char *prefix, enum hfp_result *result)
return true;
}

+ if (strcmp(prefix, "+CME ERROR") == 0) {
+ uint32_t val;
+
+ *result = HFP_RESULT_CME_ERROR;
+
+ if (hfp_context_get_number(context, &val))
+ *cme_err = val;
+ else
+ *cme_err = HFP_ERROR_AG_FAILURE;
+
+ return true;
+ }
+
return false;
}

@@ -972,6 +987,7 @@ static void hf_call_prefix_handler(struct hfp_hf *hfp, const char *data)
const char *separators = ";:\0";
struct hfp_context context;
enum hfp_result result;
+ enum hfp_error cme_err = 0;
char lookup_prefix[18];
uint8_t pref_len = 0;
const char *prefix;
@@ -997,14 +1013,14 @@ static void hf_call_prefix_handler(struct hfp_hf *hfp, const char *data)
lookup_prefix[pref_len] = '\0';
context.offset += pref_len + 1;

- if (is_response(lookup_prefix, &result)) {
+ if (is_response(lookup_prefix, &result, &cme_err, &context)) {
struct cmd_response *cmd;

cmd = queue_peek_head(hfp->cmd_queue);
if (!cmd)
return;

- cmd->resp_cb(cmd->prefix, result, cmd->user_data);
+ cmd->resp_cb(cmd->prefix, result, cme_err, cmd->user_data);

queue_remove(hfp->cmd_queue, cmd);
destroy_cmd_response(cmd);
diff --git a/src/shared/hfp.h b/src/shared/hfp.h
index 27c26a2..e4a70e0 100644
--- a/src/shared/hfp.h
+++ b/src/shared/hfp.h
@@ -34,6 +34,7 @@ enum hfp_result {
HFP_RESULT_NO_ANSWER = 8,
HFP_RESULT_DELAYED = 9,
HFP_RESULT_BLACKLISTED = 10,
+ HFP_RESULT_CME_ERROR = 11,
};

enum hfp_error {
@@ -86,6 +87,7 @@ typedef void (*hfp_disconnect_func_t)(void *user_data);

typedef void (*hfp_response_func_t)(const char *prefix,
enum hfp_result result,
+ enum hfp_error cme_err,
void *user_data);

struct hfp_gw;
diff --git a/unit/test-hfp.c b/unit/test-hfp.c
index c597fd0..bc05086 100644
--- a/unit/test-hfp.c
+++ b/unit/test-hfp.c
@@ -476,6 +476,7 @@ static void hf_unsolicited_resp_cb(struct hfp_context *context,
}

static void hf_response_with_data(const char *prefix, enum hfp_result res,
+ enum hfp_error cme_err,
void *user_data)
{
struct context *context = user_data;
@@ -487,6 +488,7 @@ static void hf_response_with_data(const char *prefix, enum hfp_result res,
}

static void hf_brsf_response_cb(const char *prefix, enum hfp_result res,
+ enum hfp_error cme_err,
void *user_data)
{
struct context *context = user_data;
--
1.8.4


2014-10-09 23:50:46

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH 2/8] shared/hfp: Rename hfp_hf_result to common hfp_context

---
src/shared/hfp.c | 29 ++++++++++++-----------------
src/shared/hfp.h | 3 +--
unit/test-hfp.c | 4 ++--
3 files changed, 15 insertions(+), 21 deletions(-)

diff --git a/src/shared/hfp.c b/src/shared/hfp.c
index 1b15da6..8170a16 100644
--- a/src/shared/hfp.c
+++ b/src/shared/hfp.c
@@ -99,15 +99,10 @@ struct hfp_context {
unsigned int offset;
};

-struct hfp_hf_result {
- const char *data;
- unsigned int offset;
-};
-
struct cmd_response {
char *prefix;
hfp_response_func_t resp_cb;
- struct hfp_hf_result *response;
+ struct hfp_context *response;
char *resp_data;
void *user_data;
};
@@ -902,10 +897,10 @@ static void hf_write_watch_destroy(void *user_data)
hfp->writer_active = false;
}

-static void hf_skip_whitespace(struct hfp_hf_result *result)
+static void hf_skip_whitespace(struct hfp_context *context)
{
- while (result->data[result->offset] == ' ')
- result->offset++;
+ while (context->data[context->offset] == ' ')
+ context->offset++;
}

static bool is_response(const char *prefix, enum hfp_result *result)
@@ -975,22 +970,22 @@ static void hf_call_prefix_handler(struct hfp_hf *hfp, const char *data)
{
struct event_handler *handler;
const char *separators = ";:\0";
- struct hfp_hf_result result_data;
+ struct hfp_context context;
enum hfp_result result;
char lookup_prefix[18];
uint8_t pref_len = 0;
const char *prefix;
int i;

- result_data.offset = 0;
- result_data.data = data;
+ context.offset = 0;
+ context.data = data;

- hf_skip_whitespace(&result_data);
+ hf_skip_whitespace(&context);

- if (strlen(data + result_data.offset) < 2)
+ if (strlen(data + context.offset) < 2)
return;

- prefix = data + result_data.offset;
+ prefix = data + context.offset;

pref_len = strcspn(prefix, separators);
if (pref_len > 17 || pref_len < 2)
@@ -1000,7 +995,7 @@ static void hf_call_prefix_handler(struct hfp_hf *hfp, const char *data)
lookup_prefix[i] = toupper(prefix[i]);

lookup_prefix[pref_len] = '\0';
- result_data.offset += pref_len + 1;
+ context.offset += pref_len + 1;

if (is_response(lookup_prefix, &result)) {
struct cmd_response *cmd;
@@ -1023,7 +1018,7 @@ static void hf_call_prefix_handler(struct hfp_hf *hfp, const char *data)
if (!handler)
return;

- handler->callback(&result_data, handler->user_data);
+ handler->callback(&context, handler->user_data);
}

static char *find_cr_lf(char *str, size_t len)
diff --git a/src/shared/hfp.h b/src/shared/hfp.h
index e57306a..02df713 100644
--- a/src/shared/hfp.h
+++ b/src/shared/hfp.h
@@ -70,12 +70,11 @@ enum hfp_gw_cmd_type {
};

struct hfp_context;
-struct hfp_hf_result;

typedef void (*hfp_result_func_t)(struct hfp_context *context,
enum hfp_gw_cmd_type type, void *user_data);

-typedef void (*hfp_hf_result_func_t)(struct hfp_hf_result *result,
+typedef void (*hfp_hf_result_func_t)(struct hfp_context *context,
void *user_data);

typedef void (*hfp_destroy_func_t)(void *user_data);
diff --git a/unit/test-hfp.c b/unit/test-hfp.c
index da8a5c9..7dd3b33 100644
--- a/unit/test-hfp.c
+++ b/unit/test-hfp.c
@@ -470,7 +470,7 @@ static void test_hf_init(gconstpointer data)

static bool unsolicited_resp = false;

-static void hf_unsolicited_resp_cb(struct hfp_hf_result *result,
+static void hf_unsolicited_resp_cb(struct hfp_context *context,
void *user_data) {
unsolicited_resp = true;
}
@@ -530,7 +530,7 @@ static void test_hf_send_command(gconstpointer data)
execute_context(context);
}

-static void hf_result_handler(struct hfp_hf_result *result,
+static void hf_result_handler(struct hfp_context *result,
void *user_data)
{
struct context *context = user_data;
--
1.8.4


2014-10-09 23:50:45

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH 1/8] shared/hfp: Rename hfp_gw_result to hfp_context

hfp_context seems to be better name for data we get in the result of HFP
GW. Especially that we want to use same for HFP HF response data.
---
android/handsfree.c | 149 ++++++++++++++++++++++++++--------------------------
src/shared/hfp.c | 123 ++++++++++++++++++++++---------------------
src/shared/hfp.h | 21 ++++----
unit/test-hfp.c | 10 ++--
4 files changed, 153 insertions(+), 150 deletions(-)

diff --git a/android/handsfree.c b/android/handsfree.c
index a815d3b..2bff183 100644
--- a/android/handsfree.c
+++ b/android/handsfree.c
@@ -291,8 +291,8 @@ static void at_cmd_unknown(const char *command, void *user_data)
HAL_EV_HANDSFREE_UNKNOWN_AT, sizeof(*ev) + ev->len, ev);
}

-static void at_cmd_vgm(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
- void *user_data)
+static void at_cmd_vgm(struct hfp_context *context,
+ enum hfp_gw_cmd_type type, void *user_data)
{
struct hal_ev_handsfree_volume ev;
unsigned int val;
@@ -301,10 +301,10 @@ static void at_cmd_vgm(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,

switch (type) {
case HFP_GW_CMD_TYPE_SET:
- if (!hfp_gw_result_get_number(result, &val) || val > 15)
+ if (!hfp_gw_result_get_number(context, &val) || val > 15)
break;

- if (hfp_gw_result_has_next(result))
+ if (hfp_gw_result_has_next(context))
break;

ev.type = HAL_HANDSFREE_VOLUME_TYPE_MIC;
@@ -325,8 +325,8 @@ static void at_cmd_vgm(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
hfp_gw_send_result(device.gw, HFP_RESULT_ERROR);
}

-static void at_cmd_vgs(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
- void *user_data)
+static void at_cmd_vgs(struct hfp_context *context,
+ enum hfp_gw_cmd_type type, void *user_data)
{
struct hal_ev_handsfree_volume ev;
unsigned int val;
@@ -335,10 +335,10 @@ static void at_cmd_vgs(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,

switch (type) {
case HFP_GW_CMD_TYPE_SET:
- if (!hfp_gw_result_get_number(result, &val) || val > 15)
+ if (!hfp_gw_result_get_number(context, &val) || val > 15)
break;

- if (hfp_gw_result_has_next(result))
+ if (hfp_gw_result_has_next(context))
break;

ev.type = HAL_HANDSFREE_VOLUME_TYPE_SPEAKER;
@@ -359,20 +359,20 @@ static void at_cmd_vgs(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
hfp_gw_send_result(device.gw, HFP_RESULT_ERROR);
}

-static void at_cmd_cops(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
- void *user_data)
+static void at_cmd_cops(struct hfp_context *context,
+ enum hfp_gw_cmd_type type, void *user_data)
{
unsigned int val;

switch (type) {
case HFP_GW_CMD_TYPE_SET:
- if (!hfp_gw_result_get_number(result, &val) || val != 3)
+ if (!hfp_gw_result_get_number(context, &val) || val != 3)
break;

- if (!hfp_gw_result_get_number(result, &val) || val != 0)
+ if (!hfp_gw_result_get_number(context, &val) || val != 0)
break;

- if (hfp_gw_result_has_next(result))
+ if (hfp_gw_result_has_next(context))
break;

hfp_gw_send_result(device.gw, HFP_RESULT_OK);
@@ -389,8 +389,8 @@ static void at_cmd_cops(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
hfp_gw_send_result(device.gw, HFP_RESULT_ERROR);
}

-static void at_cmd_bia(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
- void *user_data)
+static void at_cmd_bia(struct hfp_context *context,
+ enum hfp_gw_cmd_type type, void *user_data)
{
unsigned int val, i, def;
bool tmp[IND_COUNT];
@@ -407,7 +407,8 @@ static void at_cmd_bia(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
do {
def = (i < IND_COUNT) ? device.inds[i].active : 0;

- if (!hfp_gw_result_get_number_default(result, &val, def))
+ if (!hfp_gw_result_get_number_default(context, &val,
+ def))
goto failed;

if (val > 1)
@@ -417,7 +418,7 @@ static void at_cmd_bia(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
tmp[i] = val || device.inds[i].always_active;
i++;
}
- } while (hfp_gw_result_has_next(result));
+ } while (hfp_gw_result_has_next(context));

for (i = 0; i < IND_COUNT; i++)
device.inds[i].active = tmp[i];
@@ -434,14 +435,14 @@ failed:
hfp_gw_send_result(device.gw, HFP_RESULT_ERROR);
}

-static void at_cmd_a(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
- void *user_data)
+static void at_cmd_a(struct hfp_context *context,
+ enum hfp_gw_cmd_type type, void *user_data)
{
DBG("");

switch (type) {
case HFP_GW_CMD_TYPE_COMMAND:
- if (hfp_gw_result_has_next(result))
+ if (hfp_gw_result_has_next(context))
break;

ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
@@ -459,8 +460,8 @@ static void at_cmd_a(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
hfp_gw_send_result(device.gw, HFP_RESULT_ERROR);
}

-static void at_cmd_d(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
- void *user_data)
+static void at_cmd_d(struct hfp_context *context,
+ enum hfp_gw_cmd_type type, void *user_data)
{
char buf[IPC_MTU];
struct hal_ev_handsfree_dial *ev = (void *) buf;
@@ -470,7 +471,7 @@ static void at_cmd_d(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,

switch (type) {
case HFP_GW_CMD_TYPE_SET:
- if (!hfp_gw_result_get_unquoted_string(result,
+ if (!hfp_gw_result_get_unquoted_string(context,
(char *) ev->number, 255))
break;

@@ -502,8 +503,8 @@ static void at_cmd_d(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
hfp_gw_send_result(device.gw, HFP_RESULT_ERROR);
}

-static void at_cmd_ccwa(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
- void *user_data)
+static void at_cmd_ccwa(struct hfp_context *context,
+ enum hfp_gw_cmd_type type, void *user_data)
{
unsigned int val;

@@ -511,10 +512,10 @@ static void at_cmd_ccwa(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,

switch (type) {
case HFP_GW_CMD_TYPE_SET:
- if (!hfp_gw_result_get_number(result, &val) || val > 1)
+ if (!hfp_gw_result_get_number(context, &val) || val > 1)
break;

- if (hfp_gw_result_has_next(result))
+ if (hfp_gw_result_has_next(context))
break;

device.ccwa_enabled = val;
@@ -530,14 +531,14 @@ static void at_cmd_ccwa(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
hfp_gw_send_result(device.gw, HFP_RESULT_ERROR);
}

-static void at_cmd_chup(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
- void *user_data)
+static void at_cmd_chup(struct hfp_context *context,
+ enum hfp_gw_cmd_type type, void *user_data)
{
DBG("");

switch (type) {
case HFP_GW_CMD_TYPE_COMMAND:
- if (hfp_gw_result_has_next(result))
+ if (hfp_gw_result_has_next(context))
break;

ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
@@ -555,14 +556,14 @@ static void at_cmd_chup(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
hfp_gw_send_result(device.gw, HFP_RESULT_ERROR);
}

-static void at_cmd_clcc(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
- void *user_data)
+static void at_cmd_clcc(struct hfp_context *context,
+ enum hfp_gw_cmd_type type, void *user_data)
{
DBG("");

switch (type) {
case HFP_GW_CMD_TYPE_COMMAND:
- if (hfp_gw_result_has_next(result))
+ if (hfp_gw_result_has_next(context))
break;

ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
@@ -577,8 +578,8 @@ static void at_cmd_clcc(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
hfp_gw_send_result(device.gw, HFP_RESULT_ERROR);
}

-static void at_cmd_cmee(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
- void *user_data)
+static void at_cmd_cmee(struct hfp_context *context,
+ enum hfp_gw_cmd_type type, void *user_data)
{
unsigned int val;

@@ -586,10 +587,10 @@ static void at_cmd_cmee(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,

switch (type) {
case HFP_GW_CMD_TYPE_SET:
- if (!hfp_gw_result_get_number(result, &val) || val > 1)
+ if (!hfp_gw_result_get_number(context, &val) || val > 1)
break;

- if (hfp_gw_result_has_next(result))
+ if (hfp_gw_result_has_next(context))
break;

device.cmee_enabled = val;
@@ -605,8 +606,8 @@ static void at_cmd_cmee(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
hfp_gw_send_result(device.gw, HFP_RESULT_ERROR);
}

-static void at_cmd_clip(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
- void *user_data)
+static void at_cmd_clip(struct hfp_context *context,
+ enum hfp_gw_cmd_type type, void *user_data)
{
unsigned int val;

@@ -614,10 +615,10 @@ static void at_cmd_clip(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,

switch (type) {
case HFP_GW_CMD_TYPE_SET:
- if (!hfp_gw_result_get_number(result, &val) || val > 1)
+ if (!hfp_gw_result_get_number(context, &val) || val > 1)
break;

- if (hfp_gw_result_has_next(result))
+ if (hfp_gw_result_has_next(context))
break;

device.clip_enabled = val;
@@ -633,8 +634,8 @@ static void at_cmd_clip(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
hfp_gw_send_result(device.gw, HFP_RESULT_ERROR);
}

-static void at_cmd_vts(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
- void *user_data)
+static void at_cmd_vts(struct hfp_context *context,
+ enum hfp_gw_cmd_type type, void *user_data)
{
struct hal_ev_handsfree_dtmf ev;
char str[2];
@@ -643,7 +644,7 @@ static void at_cmd_vts(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,

switch (type) {
case HFP_GW_CMD_TYPE_SET:
- if (!hfp_gw_result_get_unquoted_string(result, str, 2))
+ if (!hfp_gw_result_get_unquoted_string(context, str, 2))
break;

if (!((str[0] >= '0' && str[0] <= '9') ||
@@ -651,7 +652,7 @@ static void at_cmd_vts(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
str[0] == '*' || str[0] == '#'))
break;

- if (hfp_gw_result_has_next(result))
+ if (hfp_gw_result_has_next(context))
break;

ev.tone = str[0];
@@ -671,14 +672,14 @@ static void at_cmd_vts(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
hfp_gw_send_result(device.gw, HFP_RESULT_ERROR);
}

-static void at_cmd_cnum(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
- void *user_data)
+static void at_cmd_cnum(struct hfp_context *context,
+ enum hfp_gw_cmd_type type, void *user_data)
{
DBG("");

switch (type) {
case HFP_GW_CMD_TYPE_COMMAND:
- if (hfp_gw_result_has_next(result))
+ if (hfp_gw_result_has_next(context))
break;

ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
@@ -693,8 +694,8 @@ static void at_cmd_cnum(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
hfp_gw_send_result(device.gw, HFP_RESULT_ERROR);
}

-static void at_cmd_binp(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
- void *user_data)
+static void at_cmd_binp(struct hfp_context *context,
+ enum hfp_gw_cmd_type type, void *user_data)
{
DBG("");

@@ -703,8 +704,8 @@ static void at_cmd_binp(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
hfp_gw_send_result(device.gw, HFP_RESULT_ERROR);
}

-static void at_cmd_bldn(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
- void *user_data)
+static void at_cmd_bldn(struct hfp_context *context,
+ enum hfp_gw_cmd_type type, void *user_data)
{
struct hal_ev_handsfree_dial ev;

@@ -712,7 +713,7 @@ static void at_cmd_bldn(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,

switch (type) {
case HFP_GW_CMD_TYPE_COMMAND:
- if (hfp_gw_result_has_next(result))
+ if (hfp_gw_result_has_next(context))
break;

ev.number_len = 0;
@@ -729,8 +730,8 @@ static void at_cmd_bldn(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
hfp_gw_send_result(device.gw, HFP_RESULT_ERROR);
}

-static void at_cmd_bvra(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
- void *user_data)
+static void at_cmd_bvra(struct hfp_context *context,
+ enum hfp_gw_cmd_type type, void *user_data)
{
struct hal_ev_handsfree_vr_state ev;
unsigned int val;
@@ -739,10 +740,10 @@ static void at_cmd_bvra(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,

switch (type) {
case HFP_GW_CMD_TYPE_SET:
- if (!hfp_gw_result_get_number(result, &val) || val > 1)
+ if (!hfp_gw_result_get_number(context, &val) || val > 1)
break;

- if (hfp_gw_result_has_next(result))
+ if (hfp_gw_result_has_next(context))
break;

if (val)
@@ -762,8 +763,8 @@ static void at_cmd_bvra(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
hfp_gw_send_result(device.gw, HFP_RESULT_ERROR);
}

-static void at_cmd_nrec(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
- void *user_data)
+static void at_cmd_nrec(struct hfp_context *context,
+ enum hfp_gw_cmd_type type, void *user_data)
{
struct hal_ev_handsfree_nrec ev;
unsigned int val;
@@ -777,10 +778,10 @@ static void at_cmd_nrec(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
* callback, but spec allows HF to only disable AG's NREC
* feature for SLC duration. Follow spec here.
*/
- if (!hfp_gw_result_get_number(result, &val) || val != 0)
+ if (!hfp_gw_result_get_number(context, &val) || val != 0)
break;

- if (hfp_gw_result_has_next(result))
+ if (hfp_gw_result_has_next(context))
break;

ev.nrec = HAL_HANDSFREE_NREC_STOP;
@@ -788,7 +789,7 @@ static void at_cmd_nrec(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
HAL_EV_HANDSFREE_NREC, sizeof(ev), &ev);

- /* Framework is not replying with result for AT+NREC */
+ /* Framework is not replying with context for AT+NREC */
hfp_gw_send_result(device.gw, HFP_RESULT_OK);
return;
case HFP_GW_CMD_TYPE_READ:
@@ -800,8 +801,8 @@ static void at_cmd_nrec(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
hfp_gw_send_result(device.gw, HFP_RESULT_ERROR);
}

-static void at_cmd_bsir(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
- void *user_data)
+static void at_cmd_bsir(struct hfp_context *context,
+ enum hfp_gw_cmd_type type, void *user_data)
{
DBG("");

@@ -810,8 +811,8 @@ static void at_cmd_bsir(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
hfp_gw_send_result(device.gw, HFP_RESULT_ERROR);
}

-static void at_cmd_btrh(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
- void *user_data)
+static void at_cmd_btrh(struct hfp_context *context,
+ enum hfp_gw_cmd_type type, void *user_data)
{
DBG("");

@@ -929,7 +930,7 @@ static bool connect_sco(void)
return true;
}

-static void at_cmd_bcc(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
+static void at_cmd_bcc(struct hfp_context *result, enum hfp_gw_cmd_type type,
void *user_data)
{
DBG("");
@@ -966,7 +967,7 @@ static void at_cmd_bcc(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
hfp_gw_send_result(device.gw, HFP_RESULT_ERROR);
}

-static void at_cmd_bcs(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
+static void at_cmd_bcs(struct hfp_context *result, enum hfp_gw_cmd_type type,
void *user_data)
{
unsigned int val;
@@ -1004,7 +1005,7 @@ static void at_cmd_bcs(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
hfp_gw_send_result(device.gw, HFP_RESULT_ERROR);
}

-static void at_cmd_ckpd(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
+static void at_cmd_ckpd(struct hfp_context *result, enum hfp_gw_cmd_type type,
void *user_data)
{
unsigned int val;
@@ -1065,7 +1066,7 @@ static void register_post_slc_at(void)
hfp_gw_register(device.gw, at_cmd_bcs, "+BCS", NULL, NULL);
}

-static void at_cmd_cmer(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
+static void at_cmd_cmer(struct hfp_context *result, enum hfp_gw_cmd_type type,
void *user_data)
{
unsigned int val;
@@ -1110,7 +1111,7 @@ static void at_cmd_cmer(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
hfp_gw_send_result(device.gw, HFP_RESULT_ERROR);
}

-static void at_cmd_cind(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
+static void at_cmd_cind(struct hfp_context *result, enum hfp_gw_cmd_type type,
void *user_data)
{
char *buf, *ptr;
@@ -1167,7 +1168,7 @@ static void at_cmd_cind(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
hfp_gw_send_result(device.gw, HFP_RESULT_ERROR);
}

-static void at_cmd_brsf(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
+static void at_cmd_brsf(struct hfp_context *result, enum hfp_gw_cmd_type type,
void *user_data)
{
unsigned int feat;
@@ -1195,7 +1196,7 @@ static void at_cmd_brsf(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
hfp_gw_send_result(device.gw, HFP_RESULT_ERROR);
}

-static void at_cmd_chld(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
+static void at_cmd_chld(struct hfp_context *result, enum hfp_gw_cmd_type type,
void *user_data)
{
struct hal_ev_handsfree_chld ev;
@@ -1244,7 +1245,7 @@ static struct hfp_codec *find_codec_by_type(uint8_t type)
return NULL;
}

-static void at_cmd_bac(struct hfp_gw_result *result, enum hfp_gw_cmd_type type,
+static void at_cmd_bac(struct hfp_context *result, enum hfp_gw_cmd_type type,
void *user_data)
{
unsigned int val;
diff --git a/src/shared/hfp.c b/src/shared/hfp.c
index 8bebe97..1b15da6 100644
--- a/src/shared/hfp.c
+++ b/src/shared/hfp.c
@@ -94,7 +94,7 @@ struct cmd_handler {
hfp_result_func_t callback;
};

-struct hfp_gw_result {
+struct hfp_context {
const char *data;
unsigned int offset;
};
@@ -182,7 +182,7 @@ static void wakeup_writer(struct hfp_gw *hfp)
hfp->writer_active = true;
}

-static void skip_whitespace(struct hfp_gw_result *result)
+static void skip_whitespace(struct hfp_context *result)
{
while (result->data[result->offset] == ' ')
result->offset++;
@@ -192,27 +192,27 @@ static bool call_prefix_handler(struct hfp_gw *hfp, const char *data)
{
struct cmd_handler *handler;
const char *separators = ";?=\0";
- struct hfp_gw_result result;
+ struct hfp_context context;
enum hfp_gw_cmd_type type;
char lookup_prefix[18];
uint8_t pref_len = 0;
const char *prefix;
int i;

- result.offset = 0;
- result.data = data;
+ context.offset = 0;
+ context.data = data;

- skip_whitespace(&result);
+ skip_whitespace(&context);

- if (strlen(data + result.offset) < 3)
+ if (strlen(data + context.offset) < 3)
return false;

- if (strncmp(data + result.offset, "AT", 2))
- if (strncmp(data + result.offset, "at", 2))
+ if (strncmp(data + context.offset, "AT", 2))
+ if (strncmp(data + context.offset, "at", 2))
return false;

- result.offset += 2;
- prefix = data + result.offset;
+ context.offset += 2;
+ prefix = data + context.offset;

if (isalpha(prefix[0])) {
lookup_prefix[pref_len++] = toupper(prefix[0]);
@@ -226,17 +226,17 @@ static bool call_prefix_handler(struct hfp_gw *hfp, const char *data)
}

lookup_prefix[pref_len] = '\0';
- result.offset += pref_len;
+ context.offset += pref_len;

if (lookup_prefix[0] == 'D') {
type = HFP_GW_CMD_TYPE_SET;
goto done;
}

- if (data[result.offset] == '=') {
- result.offset++;
- if (data[result.offset] == '?') {
- result.offset++;
+ if (data[context.offset] == '=') {
+ context.offset++;
+ if (data[context.offset] == '?') {
+ context.offset++;
type = HFP_GW_CMD_TYPE_TEST;
} else {
type = HFP_GW_CMD_TYPE_SET;
@@ -244,8 +244,8 @@ static bool call_prefix_handler(struct hfp_gw *hfp, const char *data)
goto done;
}

- if (data[result.offset] == '?') {
- result.offset++;
+ if (data[context.offset] == '?') {
+ context.offset++;
type = HFP_GW_CMD_TYPE_READ;
goto done;
}
@@ -259,98 +259,99 @@ done:
if (!handler)
return false;

- handler->callback(&result, type, handler->user_data);
+ handler->callback(&context, type, handler->user_data);

return true;
}

-static void next_field(struct hfp_gw_result *result)
+static void next_field(struct hfp_context *context)
{
- if (result->data[result->offset] == ',')
- result->offset++;
+ if (context->data[context->offset] == ',')
+ context->offset++;
}

-bool hfp_gw_result_get_number_default(struct hfp_gw_result *result,
+bool hfp_gw_result_get_number_default(struct hfp_context *context,
unsigned int *val,
unsigned int default_val)
{
- skip_whitespace(result);
+ skip_whitespace(context);

- if (result->data[result->offset] == ',') {
+ if (context->data[context->offset] == ',') {
if (val)
*val = default_val;

- result->offset++;
+ context->offset++;
return true;
}

- return hfp_gw_result_get_number(result, val);
+ return hfp_gw_result_get_number(context, val);
}

-bool hfp_gw_result_get_number(struct hfp_gw_result *result, unsigned int *val)
+bool hfp_gw_result_get_number(struct hfp_context *context,
+ unsigned int *val)
{
unsigned int i;
int tmp = 0;

- skip_whitespace(result);
+ skip_whitespace(context);

- i = result->offset;
+ i = context->offset;

- while (result->data[i] >= '0' && result->data[i] <= '9')
- tmp = tmp * 10 + result->data[i++] - '0';
+ while (context->data[i] >= '0' && context->data[i] <= '9')
+ tmp = tmp * 10 + context->data[i++] - '0';

- if (i == result->offset)
+ if (i == context->offset)
return false;

if (val)
*val = tmp;
- result->offset = i;
+ context->offset = i;

- skip_whitespace(result);
- next_field(result);
+ skip_whitespace(context);
+ next_field(context);

return true;
}

-bool hfp_gw_result_open_container(struct hfp_gw_result *result)
+bool hfp_gw_result_open_container(struct hfp_context *context)
{
- skip_whitespace(result);
+ skip_whitespace(context);

/* The list shall be preceded by a left parenthesis "(") */
- if (result->data[result->offset] != '(')
+ if (context->data[context->offset] != '(')
return false;

- result->offset++;
+ context->offset++;

return true;
}

-bool hfp_gw_result_close_container(struct hfp_gw_result *result)
+bool hfp_gw_result_close_container(struct hfp_context *context)
{
- skip_whitespace(result);
+ skip_whitespace(context);

/* The list shall be followed by a right parenthesis (")" V250 5.7.3.1*/
- if (result->data[result->offset] != ')')
+ if (context->data[context->offset] != ')')
return false;

- result->offset++;
+ context->offset++;

return true;
}

-bool hfp_gw_result_get_string(struct hfp_gw_result *result, char *buf,
+bool hfp_gw_result_get_string(struct hfp_context *context, char *buf,
uint8_t len)
{
int i = 0;
- const char *data = result->data;
+ const char *data = context->data;
unsigned int offset;

- skip_whitespace(result);
+ skip_whitespace(context);

- if (data[result->offset] != '"')
+ if (data[context->offset] != '"')
return false;

- offset = result->offset;
+ offset = context->offset;
offset++;

while (data[offset] != '\0' && data[offset] != '"') {
@@ -371,29 +372,29 @@ bool hfp_gw_result_get_string(struct hfp_gw_result *result, char *buf,
else
return false;

- result->offset = offset;
+ context->offset = offset;

- skip_whitespace(result);
- next_field(result);
+ skip_whitespace(context);
+ next_field(context);

return true;
}

-bool hfp_gw_result_get_unquoted_string(struct hfp_gw_result *result, char *buf,
- uint8_t len)
+bool hfp_gw_result_get_unquoted_string(struct hfp_context *context,
+ char *buf, uint8_t len)
{
- const char *data = result->data;
+ const char *data = context->data;
unsigned int offset;
int i = 0;
char c;

- skip_whitespace(result);
+ skip_whitespace(context);

- c = data[result->offset];
+ c = data[context->offset];
if (c == '"' || c == ')' || c == '(')
return false;

- offset = result->offset;
+ offset = context->offset;

while (data[offset] != '\0' && data[offset] != ',' &&
data[offset] != ')') {
@@ -409,14 +410,14 @@ bool hfp_gw_result_get_unquoted_string(struct hfp_gw_result *result, char *buf,

buf[i] = '\0';

- result->offset = offset;
+ context->offset = offset;

- next_field(result);
+ next_field(context);

return true;
}

-bool hfp_gw_result_has_next(struct hfp_gw_result *result)
+bool hfp_gw_result_has_next(struct hfp_context *result)
{
return result->data[result->offset] != '\0';
}
diff --git a/src/shared/hfp.h b/src/shared/hfp.h
index 5ee3017..e57306a 100644
--- a/src/shared/hfp.h
+++ b/src/shared/hfp.h
@@ -69,10 +69,10 @@ enum hfp_gw_cmd_type {
HFP_GW_CMD_TYPE_COMMAND
};

-struct hfp_gw_result;
+struct hfp_context;
struct hfp_hf_result;

-typedef void (*hfp_result_func_t)(struct hfp_gw_result *result,
+typedef void (*hfp_result_func_t)(struct hfp_context *context,
enum hfp_gw_cmd_type type, void *user_data);

typedef void (*hfp_hf_result_func_t)(struct hfp_hf_result *result,
@@ -125,17 +125,18 @@ bool hfp_gw_register(struct hfp_gw *hfp, hfp_result_func_t callback,
hfp_destroy_func_t destroy);
bool hfp_gw_unregister(struct hfp_gw *hfp, const char *prefix);

-bool hfp_gw_result_get_number(struct hfp_gw_result *result, unsigned int *val);
-bool hfp_gw_result_get_number_default(struct hfp_gw_result *result,
+bool hfp_gw_result_get_number(struct hfp_context *context,
+ unsigned int *val);
+bool hfp_gw_result_get_number_default(struct hfp_context *context,
unsigned int *val,
unsigned int default_val);
-bool hfp_gw_result_open_container(struct hfp_gw_result *result);
-bool hfp_gw_result_close_container(struct hfp_gw_result *result);
-bool hfp_gw_result_get_string(struct hfp_gw_result *result, char *buf,
+bool hfp_gw_result_open_container(struct hfp_context *context);
+bool hfp_gw_result_close_container(struct hfp_context *context);
+bool hfp_gw_result_get_string(struct hfp_context *context, char *buf,
uint8_t len);
-bool hfp_gw_result_get_unquoted_string(struct hfp_gw_result *result, char *buf,
- uint8_t len);
-bool hfp_gw_result_has_next(struct hfp_gw_result *result);
+bool hfp_gw_result_get_unquoted_string(struct hfp_context *context,
+ char *buf, uint8_t len);
+bool hfp_gw_result_has_next(struct hfp_context *context);

struct hfp_hf *hfp_hf_new(int fd);
struct hfp_hf *hfp_hf_ref(struct hfp_hf *hfp);
diff --git a/unit/test-hfp.c b/unit/test-hfp.c
index 2515f26..da8a5c9 100644
--- a/unit/test-hfp.c
+++ b/unit/test-hfp.c
@@ -207,7 +207,7 @@ static void cmd_handler(const char *command, void *user_data)
hfp_gw_send_result(context->hfp, HFP_RESULT_ERROR);
}

-static void prefix_handler(struct hfp_gw_result *result,
+static void prefix_handler(struct hfp_context *result,
enum hfp_gw_cmd_type type, void *user_data)
{
struct context *context = user_data;
@@ -359,7 +359,7 @@ static void test_fragmented(gconstpointer data)
execute_context(context);
}

-static void check_ustring_1(struct hfp_gw_result *result,
+static void check_ustring_1(struct hfp_context *result,
enum hfp_gw_cmd_type type, void *user_data)
{
struct context *context = user_data;
@@ -386,7 +386,7 @@ static void check_ustring_1(struct hfp_gw_result *result,
hfp_gw_send_result(context->hfp, HFP_RESULT_ERROR);
}

-static void check_ustring_2(struct hfp_gw_result *result,
+static void check_ustring_2(struct hfp_context *result,
enum hfp_gw_cmd_type type, void *user_data)
{
struct context *context = user_data;
@@ -406,7 +406,7 @@ static void check_ustring_2(struct hfp_gw_result *result,
hfp_gw_send_result(context->hfp, HFP_RESULT_ERROR);
}

-static void check_string_1(struct hfp_gw_result *result,
+static void check_string_1(struct hfp_context *result,
enum hfp_gw_cmd_type type, void *user_data)
{
struct context *context = user_data;
@@ -434,7 +434,7 @@ static void check_string_1(struct hfp_gw_result *result,
hfp_gw_send_result(context->hfp, HFP_RESULT_ERROR);
}

-static void check_string_2(struct hfp_gw_result *result,
+static void check_string_2(struct hfp_context *result,
enum hfp_gw_cmd_type type, void *user_data)
{
struct context *context = user_data;
--
1.8.4