* [PATCH 1/8] shared/hfp: Rename hfp_gw_result to hfp_context
2014-10-09 23:50 [PATCH 0/8] shared/hfp: Add support for HFP HF - part 2 Lukasz Rymanowski
@ 2014-10-09 23:50 ` Lukasz Rymanowski
2014-10-09 23:50 ` [PATCH 2/8] shared/hfp: Rename hfp_hf_result to common hfp_context Lukasz Rymanowski
` (8 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Lukasz Rymanowski @ 2014-10-09 23:50 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Lukasz Rymanowski
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
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH 2/8] shared/hfp: Rename hfp_hf_result to common hfp_context
2014-10-09 23:50 [PATCH 0/8] shared/hfp: Add support for HFP HF - part 2 Lukasz Rymanowski
2014-10-09 23:50 ` [PATCH 1/8] shared/hfp: Rename hfp_gw_result to hfp_context Lukasz Rymanowski
@ 2014-10-09 23:50 ` Lukasz Rymanowski
2014-10-09 23:50 ` [PATCH 3/8] shared/hfp: Rename functions operating on context Lukasz Rymanowski
` (7 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Lukasz Rymanowski @ 2014-10-09 23:50 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Lukasz Rymanowski
---
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
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH 3/8] shared/hfp: Rename functions operating on context
2014-10-09 23:50 [PATCH 0/8] shared/hfp: Add support for HFP HF - part 2 Lukasz Rymanowski
2014-10-09 23:50 ` [PATCH 1/8] shared/hfp: Rename hfp_gw_result to hfp_context Lukasz Rymanowski
2014-10-09 23:50 ` [PATCH 2/8] shared/hfp: Rename hfp_hf_result to common hfp_context Lukasz Rymanowski
@ 2014-10-09 23:50 ` Lukasz Rymanowski
2014-10-09 23:50 ` [PATCH 4/8] shared/hfp: Add handling +CME ERROR to parser Lukasz Rymanowski
` (6 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Lukasz Rymanowski @ 2014-10-09 23:50 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Lukasz Rymanowski
---
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
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH 4/8] shared/hfp: Add handling +CME ERROR to parser
2014-10-09 23:50 [PATCH 0/8] shared/hfp: Add support for HFP HF - part 2 Lukasz Rymanowski
` (2 preceding siblings ...)
2014-10-09 23:50 ` [PATCH 3/8] shared/hfp: Rename functions operating on context Lukasz Rymanowski
@ 2014-10-09 23:50 ` Lukasz Rymanowski
2014-10-30 9:43 ` Marcin Kraglak
2014-10-09 23:50 ` [PATCH 5/8] shared/hfp: Minor fix in container close function Lukasz Rymanowski
` (5 subsequent siblings)
9 siblings, 1 reply; 13+ messages in thread
From: Lukasz Rymanowski @ 2014-10-09 23:50 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Lukasz Rymanowski
---
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
^ permalink raw reply related [flat|nested] 13+ messages in thread* Re: [PATCH 4/8] shared/hfp: Add handling +CME ERROR to parser
2014-10-09 23:50 ` [PATCH 4/8] shared/hfp: Add handling +CME ERROR to parser Lukasz Rymanowski
@ 2014-10-30 9:43 ` Marcin Kraglak
2014-10-30 15:53 ` Lukasz Rymanowski
0 siblings, 1 reply; 13+ messages in thread
From: Marcin Kraglak @ 2014-10-30 9:43 UTC (permalink / raw)
To: Lukasz Rymanowski; +Cc: linux-bluetooth@vger.kernel.org development
Hi Lukasz,
On 10 October 2014 01:50, Lukasz Rymanowski <lukasz.rymanowski@tieto.com> 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 majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
BR
Marcin
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: [PATCH 4/8] shared/hfp: Add handling +CME ERROR to parser
2014-10-30 9:43 ` Marcin Kraglak
@ 2014-10-30 15:53 ` Lukasz Rymanowski
0 siblings, 0 replies; 13+ messages in thread
From: Lukasz Rymanowski @ 2014-10-30 15:53 UTC (permalink / raw)
To: Marcin Kraglak; +Cc: linux-bluetooth@vger.kernel.org development
Hi Marcin,
On 30 October 2014 10:43, Marcin Kraglak <marcin.kraglak@tieto.com> wrote:
> Hi Lukasz,
>
> On 10 October 2014 01:50, Lukasz Rymanowski <lukasz.rymanowski@tieto.com> 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 majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
> BR
> Marcin
BR
Lukasz
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 5/8] shared/hfp: Minor fix in container close function
2014-10-09 23:50 [PATCH 0/8] shared/hfp: Add support for HFP HF - part 2 Lukasz Rymanowski
` (3 preceding siblings ...)
2014-10-09 23:50 ` [PATCH 4/8] shared/hfp: Add handling +CME ERROR to parser Lukasz Rymanowski
@ 2014-10-09 23:50 ` Lukasz Rymanowski
2014-10-09 23:50 ` [PATCH 6/8] shared/hfp: Add hfp_context_get_range function Lukasz Rymanowski
` (4 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Lukasz Rymanowski @ 2014-10-09 23:50 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Lukasz Rymanowski
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
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH 6/8] shared/hfp: Add hfp_context_get_range function
2014-10-09 23:50 [PATCH 0/8] shared/hfp: Add support for HFP HF - part 2 Lukasz Rymanowski
` (4 preceding siblings ...)
2014-10-09 23:50 ` [PATCH 5/8] shared/hfp: Minor fix in container close function Lukasz Rymanowski
@ 2014-10-09 23:50 ` Lukasz Rymanowski
2014-10-09 23:50 ` [PATCH 7/8] unit/hfp: Add unit tests for parsing hfp_context Lukasz Rymanowski
` (3 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Lukasz Rymanowski @ 2014-10-09 23:50 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Lukasz Rymanowski
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
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH 7/8] unit/hfp: Add unit tests for parsing hfp_context
2014-10-09 23:50 [PATCH 0/8] shared/hfp: Add support for HFP HF - part 2 Lukasz Rymanowski
` (5 preceding siblings ...)
2014-10-09 23:50 ` [PATCH 6/8] shared/hfp: Add hfp_context_get_range function Lukasz Rymanowski
@ 2014-10-09 23:50 ` Lukasz Rymanowski
2014-10-09 23:50 ` [PATCH 8/8] unit/hfp: Add test for +CME ERROR: response Lukasz Rymanowski
` (2 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Lukasz Rymanowski @ 2014-10-09 23:50 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Lukasz Rymanowski
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
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH 8/8] unit/hfp: Add test for +CME ERROR: response
2014-10-09 23:50 [PATCH 0/8] shared/hfp: Add support for HFP HF - part 2 Lukasz Rymanowski
` (6 preceding siblings ...)
2014-10-09 23:50 ` [PATCH 7/8] unit/hfp: Add unit tests for parsing hfp_context Lukasz Rymanowski
@ 2014-10-09 23:50 ` Lukasz Rymanowski
2014-10-29 23:34 ` [PATCH 0/8] shared/hfp: Add support for HFP HF - part 2 Lukasz Rymanowski
2014-10-31 19:32 ` Szymon Janc
9 siblings, 0 replies; 13+ messages in thread
From: Lukasz Rymanowski @ 2014-10-09 23:50 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Lukasz Rymanowski
---
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
^ permalink raw reply related [flat|nested] 13+ messages in thread* Re: [PATCH 0/8] shared/hfp: Add support for HFP HF - part 2
2014-10-09 23:50 [PATCH 0/8] shared/hfp: Add support for HFP HF - part 2 Lukasz Rymanowski
` (7 preceding siblings ...)
2014-10-09 23:50 ` [PATCH 8/8] unit/hfp: Add test for +CME ERROR: response Lukasz Rymanowski
@ 2014-10-29 23:34 ` Lukasz Rymanowski
2014-10-31 19:32 ` Szymon Janc
9 siblings, 0 replies; 13+ messages in thread
From: Lukasz Rymanowski @ 2014-10-29 23:34 UTC (permalink / raw)
To: Lukasz Rymanowski; +Cc: linux-bluetooth@vger.kernel.org
Hi,
On Fri, Oct 10, 2014 at 1:50 AM, Lukasz Rymanowski
<lukasz.rymanowski@tieto.com> 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 majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: [PATCH 0/8] shared/hfp: Add support for HFP HF - part 2
2014-10-09 23:50 [PATCH 0/8] shared/hfp: Add support for HFP HF - part 2 Lukasz Rymanowski
` (8 preceding siblings ...)
2014-10-29 23:34 ` [PATCH 0/8] shared/hfp: Add support for HFP HF - part 2 Lukasz Rymanowski
@ 2014-10-31 19:32 ` Szymon Janc
9 siblings, 0 replies; 13+ messages in thread
From: Szymon Janc @ 2014-10-31 19:32 UTC (permalink / raw)
To: Lukasz Rymanowski; +Cc: linux-bluetooth
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
^ permalink raw reply [flat|nested] 13+ messages in thread