* [PATCH 2/5] simutil: SIM applications directory decoding utils.
2011-01-17 17:38 [PATCH 1/5] Add SIM authentication atom's driver definitions Andrzej Zaborowski
@ 2011-01-17 17:38 ` Andrzej Zaborowski
2011-01-18 19:22 ` Denis Kenzior
2011-01-17 17:38 ` [PATCH 3/5] unit: Add a test for applications directory decoding utility Andrzej Zaborowski
` (3 subsequent siblings)
4 siblings, 1 reply; 8+ messages in thread
From: Andrzej Zaborowski @ 2011-01-17 17:38 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 2290 bytes --]
---
src/simutil.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/simutil.h | 2 ++
2 files changed, 59 insertions(+), 0 deletions(-)
diff --git a/src/simutil.c b/src/simutil.c
index 8abf3d5..b3e2f52 100644
--- a/src/simutil.c
+++ b/src/simutil.c
@@ -1465,3 +1465,60 @@ gboolean sim_sst_is_active(unsigned char *efsst, unsigned char len,
return (efsst[index / 4] >> (((index % 4) * 2) + 1)) & 1;
}
+
+GSList *sim_parse_app_template_entries(const unsigned char *buffer, int len)
+{
+ GSList *ret = NULL;
+ const unsigned char *dataobj;
+ int dataobj_len;
+
+ /* Find all the application entries */
+ while ((dataobj = ber_tlv_find_by_tag(buffer, 0x61, len,
+ &dataobj_len)) != NULL) {
+ struct ofono_sim_app_record app;
+ const unsigned char *aid, *label;
+ int label_len;
+
+ /* Find the aid (mandatory) */
+ aid = ber_tlv_find_by_tag(dataobj, 0x4f, dataobj_len,
+ &app.aid_len);
+ if (!aid || app.aid_len < 0x01 || app.aid_len > 0x10)
+ goto error;
+
+ memcpy(app.aid, aid, app.aid_len);
+
+ /* Find the label (optional) */
+ label = ber_tlv_find_by_tag(dataobj, 0x50, dataobj_len,
+ &label_len);
+ if (label) {
+ /*
+ * Label field uses the extra complicated
+ * encoding in 102.221 Annex A
+ */
+ app.label = sim_string_to_utf8(label, label_len);
+
+ if (app.label == NULL)
+ goto error;
+ } else
+ app.label = NULL;
+
+ ret = g_slist_prepend(ret, g_memdup(&app, sizeof(app)));
+
+ len -= (dataobj - buffer) + dataobj_len;
+ buffer = dataobj + dataobj_len;
+ }
+
+ return ret;
+
+error:
+ while (ret) {
+ GSList *t = ret;
+
+ g_free(((struct ofono_sim_app_record *) ret->data)->label);
+
+ ret = ret->next;
+ g_slist_free_1(t);
+ }
+
+ return NULL;
+}
diff --git a/src/simutil.h b/src/simutil.h
index ad84907..4418ec9 100644
--- a/src/simutil.h
+++ b/src/simutil.h
@@ -446,3 +446,5 @@ gboolean sim_sst_is_available(unsigned char *service_sst, unsigned char len,
enum sim_sst_service index);
gboolean sim_sst_is_active(unsigned char *service_sst, unsigned char len,
enum sim_sst_service index);
+
+GSList *sim_parse_app_template_entries(const unsigned char *buffer, int len);
--
1.7.1.86.g0e460.dirty
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH 2/5] simutil: SIM applications directory decoding utils.
2011-01-17 17:38 ` [PATCH 2/5] simutil: SIM applications directory decoding utils Andrzej Zaborowski
@ 2011-01-18 19:22 ` Denis Kenzior
0 siblings, 0 replies; 8+ messages in thread
From: Denis Kenzior @ 2011-01-18 19:22 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 2221 bytes --]
Hi Andrew,
On 01/17/2011 11:38 AM, Andrzej Zaborowski wrote:
> ---
> src/simutil.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> src/simutil.h | 2 ++
> 2 files changed, 59 insertions(+), 0 deletions(-)
>
> diff --git a/src/simutil.c b/src/simutil.c
> index 8abf3d5..b3e2f52 100644
> --- a/src/simutil.c
> +++ b/src/simutil.c
> @@ -1465,3 +1465,60 @@ gboolean sim_sst_is_active(unsigned char *efsst, unsigned char len,
>
> return (efsst[index / 4] >> (((index % 4) * 2) + 1)) & 1;
> }
> +
> +GSList *sim_parse_app_template_entries(const unsigned char *buffer, int len)
> +{
> + GSList *ret = NULL;
> + const unsigned char *dataobj;
> + int dataobj_len;
> +
> + /* Find all the application entries */
> + while ((dataobj = ber_tlv_find_by_tag(buffer, 0x61, len,
> + &dataobj_len)) != NULL) {
> + struct ofono_sim_app_record app;
> + const unsigned char *aid, *label;
> + int label_len;
> +
> + /* Find the aid (mandatory) */
> + aid = ber_tlv_find_by_tag(dataobj, 0x4f, dataobj_len,
> + &app.aid_len);
> + if (!aid || app.aid_len < 0x01 || app.aid_len > 0x10)
> + goto error;
> +
> + memcpy(app.aid, aid, app.aid_len);
> +
> + /* Find the label (optional) */
> + label = ber_tlv_find_by_tag(dataobj, 0x50, dataobj_len,
> + &label_len);
> + if (label) {
> + /*
> + * Label field uses the extra complicated
> + * encoding in 102.221 Annex A
> + */
> + app.label = sim_string_to_utf8(label, label_len);
> +
> + if (app.label == NULL)
> + goto error;
> + } else
> + app.label = NULL;
> +
> + ret = g_slist_prepend(ret, g_memdup(&app, sizeof(app)));
> +
> + len -= (dataobj - buffer) + dataobj_len;
> + buffer = dataobj + dataobj_len;
> + }
> +
> + return ret;
> +
> +error:
> + while (ret) {
> + GSList *t = ret;
> +
> + g_free(((struct ofono_sim_app_record *) ret->data)->label);
Is there a memory leak here? I don't believe you are freeing the
ofono_sim_app_record structure itself. This might be the opportunity to
get rid of that nasty cast as well ;)
> +
> + ret = ret->next;
> + g_slist_free_1(t);
> + }
> +
> + return NULL;
> +}
Regards,
-Denis
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 3/5] unit: Add a test for applications directory decoding utility.
2011-01-17 17:38 [PATCH 1/5] Add SIM authentication atom's driver definitions Andrzej Zaborowski
2011-01-17 17:38 ` [PATCH 2/5] simutil: SIM applications directory decoding utils Andrzej Zaborowski
@ 2011-01-17 17:38 ` Andrzej Zaborowski
2011-01-17 17:38 ` [PATCH 4/5] Add the sim-auth atom Andrzej Zaborowski
` (2 subsequent siblings)
4 siblings, 0 replies; 8+ messages in thread
From: Andrzej Zaborowski @ 2011-01-17 17:38 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 1744 bytes --]
---
unit/test-simutil.c | 32 ++++++++++++++++++++++++++++++++
1 files changed, 32 insertions(+), 0 deletions(-)
diff --git a/unit/test-simutil.c b/unit/test-simutil.c
index 7cb5c10..1f350f6 100644
--- a/unit/test-simutil.c
+++ b/unit/test-simutil.c
@@ -444,6 +444,36 @@ static void test_3g_status_data(void)
g_free(response);
}
+static char *at_cuad_response = "611B4F10A0000000871002FFFFFFFF8905080000"
+ "FFFFFFFFFFFFFFFFFFFFFFFFFF611F4F0CA000000063504B43532D"
+ "313550094D49445066696C657351043F007F80";
+
+static void test_application_entry_decode(void) {
+ unsigned char *ef_dir;
+ long len;
+ GSList *entries;
+ struct ofono_sim_app_record *app[2];
+
+ ef_dir = decode_hex(at_cuad_response, -1, &len, 0);
+ entries = sim_parse_app_template_entries(ef_dir, len);
+
+ g_assert(g_slist_length(entries) == 2);
+
+ app[0] = entries->next->data;
+ app[1] = entries->data;
+
+ g_assert(app[0]->aid_len == 0x10);
+ g_assert(!memcmp(app[0]->aid, &ef_dir[4], 0x10));
+ g_assert(app[0]->label == NULL);
+
+ g_assert(app[1]->aid_len == 0x0c);
+ g_assert(!memcmp(app[1]->aid, &ef_dir[37], 0x0c));
+ g_assert(app[1]->label != NULL);
+ g_assert(!strcmp(app[1]->label, "MIDPfiles"));
+
+ g_free(ef_dir);
+}
+
int main(int argc, char **argv)
{
g_test_init(&argc, &argv, NULL);
@@ -458,6 +488,8 @@ int main(int argc, char **argv)
g_test_add_func("/testsimutil/EONS Handling", test_eons);
g_test_add_func("/testsimutil/Elementary File DB", test_ef_db);
g_test_add_func("/testsimutil/3G Status response", test_3g_status_data);
+ g_test_add_func("/testsimutil/Application entries decoding",
+ test_application_entry_decode);
return g_test_run();
}
--
1.7.1.86.g0e460.dirty
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 4/5] Add the sim-auth atom.
2011-01-17 17:38 [PATCH 1/5] Add SIM authentication atom's driver definitions Andrzej Zaborowski
2011-01-17 17:38 ` [PATCH 2/5] simutil: SIM applications directory decoding utils Andrzej Zaborowski
2011-01-17 17:38 ` [PATCH 3/5] unit: Add a test for applications directory decoding utility Andrzej Zaborowski
@ 2011-01-17 17:38 ` Andrzej Zaborowski
2011-01-17 17:38 ` [PATCH 5/5] atmodem: sim-auth atom driver Andrzej Zaborowski
2011-01-18 19:21 ` [PATCH 1/5] Add SIM authentication atom's driver definitions Denis Kenzior
4 siblings, 0 replies; 8+ messages in thread
From: Andrzej Zaborowski @ 2011-01-17 17:38 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 4618 bytes --]
Add dummy SIM authentication atom.
---
Makefile.am | 2 +-
src/ofono.h | 2 +
src/sim-auth.c | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 137 insertions(+), 1 deletions(-)
create mode 100644 src/sim-auth.c
diff --git a/Makefile.am b/Makefile.am
index ada0a51..a0b7264 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -349,7 +349,7 @@ src_ofonod_SOURCES = $(gdbus_sources) $(builtin_sources) src/ofono.ver \
src/nettime.c src/stkagent.c src/stkagent.h \
src/simfs.c src/simfs.h src/audio-settings.c \
src/smsagent.c src/smsagent.h src/ctm.c \
- src/cdma-voicecall.c
+ src/cdma-voicecall.c src/sim-auth.c
src_ofonod_LDADD = $(builtin_libadd) @GLIB_LIBS@ @DBUS_LIBS@ @CAPNG_LIBS@ \
@BLUEZ_LIBS@ -ldl
diff --git a/src/ofono.h b/src/ofono.h
index 77567c2..9179f61 100644
--- a/src/ofono.h
+++ b/src/ofono.h
@@ -127,6 +127,7 @@ enum ofono_atom_type {
OFONO_ATOM_TYPE_NETTIME = 21,
OFONO_ATOM_TYPE_CTM = 22,
OFONO_ATOM_TYPE_CDMA_VOICECALL_MANAGER = 23,
+ OFONO_ATOM_TYPE_SIM_AUTH = 24,
};
enum ofono_atom_watch_condition {
@@ -418,3 +419,4 @@ void __ofono_nettime_info_received(struct ofono_modem *modem,
struct ofono_network_time *info);
#include <ofono/cdma-voicecall.h>
+#include <ofono/sim-auth.h>
diff --git a/src/sim-auth.c b/src/sim-auth.c
new file mode 100644
index 0000000..5d2f075
--- /dev/null
+++ b/src/sim-auth.c
@@ -0,0 +1,134 @@
+/*
+ *
+ * oFono - Open Source Telephony
+ *
+ * Copyright (C) 2008-2011 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#define _GNU_SOURCE
+
+#include <glib.h>
+#include <errno.h>
+#include <unistd.h>
+
+#include "ofono.h"
+
+#include "simutil.h"
+
+static GSList *g_drivers = NULL;
+
+struct ofono_sim_auth {
+ const struct ofono_sim_auth_driver *driver;
+ void *driver_data;
+ struct ofono_atom *atom;
+};
+
+int ofono_sim_auth_driver_register(const struct ofono_sim_auth_driver *d)
+{
+ DBG("driver: %p, name: %s", d, d->name);
+
+ if (d->probe == NULL)
+ return -EINVAL;
+
+ g_drivers = g_slist_prepend(g_drivers, (void *) d);
+
+ return 0;
+}
+
+void ofono_sim_auth_driver_unregister(const struct ofono_sim_auth_driver *d)
+{
+ DBG("driver: %p, name: %s", d, d->name);
+
+ g_drivers = g_slist_remove(g_drivers, (void *) d);
+}
+
+static void sim_auth_unregister(struct ofono_atom *atom)
+{
+}
+
+static void sim_auth_remove(struct ofono_atom *atom)
+{
+ struct ofono_sim_auth *sa = __ofono_atom_get_data(atom);
+
+ DBG("atom: %p", atom);
+
+ if (sa == NULL)
+ return;
+
+ if (sa->driver && sa->driver->remove)
+ sa->driver->remove(sa);
+
+ g_free(sa);
+}
+
+struct ofono_sim_auth *ofono_sim_auth_create(struct ofono_modem *modem,
+ unsigned int vendor,
+ const char *driver, void *data)
+{
+ struct ofono_sim_auth *sa;
+ GSList *l;
+
+ if (driver == NULL)
+ return NULL;
+
+ sa = g_try_new0(struct ofono_sim_auth, 1);
+
+ if (sa == NULL)
+ return NULL;
+
+ sa->atom = __ofono_modem_add_atom(modem, OFONO_ATOM_TYPE_SIM_AUTH,
+ sim_auth_remove, sa);
+
+ for (l = g_drivers; l; l = l->next) {
+ const struct ofono_sim_auth_driver *drv = l->data;
+
+ if (g_strcmp0(drv->name, driver))
+ continue;
+
+ if (drv->probe(sa, vendor, data) < 0)
+ continue;
+
+ sa->driver = drv;
+ break;
+ }
+
+ return sa;
+}
+
+void ofono_sim_auth_register(struct ofono_sim_auth *sa)
+{
+ __ofono_atom_register(sa->atom, sim_auth_unregister);
+}
+
+void ofono_sim_auth_remove(struct ofono_sim_auth *sa)
+{
+ __ofono_atom_free(sa->atom);
+}
+
+void ofono_sim_auth_set_data(struct ofono_sim_auth *sa, void *data)
+{
+ sa->driver_data = data;
+}
+
+void *ofono_sim_auth_get_data(struct ofono_sim_auth *sa)
+{
+ return sa->driver_data;
+}
--
1.7.1.86.g0e460.dirty
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 5/5] atmodem: sim-auth atom driver.
2011-01-17 17:38 [PATCH 1/5] Add SIM authentication atom's driver definitions Andrzej Zaborowski
` (2 preceding siblings ...)
2011-01-17 17:38 ` [PATCH 4/5] Add the sim-auth atom Andrzej Zaborowski
@ 2011-01-17 17:38 ` Andrzej Zaborowski
2011-01-18 19:30 ` Denis Kenzior
2011-01-18 19:21 ` [PATCH 1/5] Add SIM authentication atom's driver definitions Denis Kenzior
4 siblings, 1 reply; 8+ messages in thread
From: Andrzej Zaborowski @ 2011-01-17 17:38 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 5971 bytes --]
At the moment implementing only application discovery.
---
Makefile.am | 3 +-
drivers/atmodem/atmodem.c | 2 +
drivers/atmodem/atmodem.h | 3 +
drivers/atmodem/sim-auth.c | 173 ++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 180 insertions(+), 1 deletions(-)
create mode 100644 drivers/atmodem/sim-auth.c
diff --git a/Makefile.am b/Makefile.am
index a0b7264..1397170 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -170,7 +170,8 @@ builtin_sources += $(gatchat_sources) \
drivers/atmodem/atutil.h \
drivers/atmodem/atutil.c \
drivers/atmodem/gprs.c \
- drivers/atmodem/gprs-context.c
+ drivers/atmodem/gprs-context.c \
+ drivers/atmodem/sim-auth.c
builtin_modules += nwmodem
builtin_sources += drivers/atmodem/atutil.h \
diff --git a/drivers/atmodem/atmodem.c b/drivers/atmodem/atmodem.c
index c88f6b2..e140281 100644
--- a/drivers/atmodem/atmodem.c
+++ b/drivers/atmodem/atmodem.c
@@ -51,12 +51,14 @@ static int atmodem_init(void)
at_call_volume_init();
at_gprs_init();
at_gprs_context_init();
+ at_sim_auth_init();
return 0;
}
static void atmodem_exit(void)
{
+ at_sim_auth_exit();
at_stk_exit();
at_sim_exit();
at_sms_exit();
diff --git a/drivers/atmodem/atmodem.h b/drivers/atmodem/atmodem.h
index c7f0eed..1b7cf67 100644
--- a/drivers/atmodem/atmodem.h
+++ b/drivers/atmodem/atmodem.h
@@ -71,3 +71,6 @@ extern void at_gprs_exit(void);
extern void at_gprs_context_init(void);
extern void at_gprs_context_exit(void);
+
+extern void at_sim_auth_init(void);
+extern void at_sim_auth_exit(void);
diff --git a/drivers/atmodem/sim-auth.c b/drivers/atmodem/sim-auth.c
new file mode 100644
index 0000000..a7a64ed
--- /dev/null
+++ b/drivers/atmodem/sim-auth.c
@@ -0,0 +1,173 @@
+/*
+ *
+ * oFono - Open Source Telephony
+ *
+ * Copyright (C) 2008-2011 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#define _GNU_SOURCE
+#include <string.h>
+
+#include <glib.h>
+
+#include <ofono/modem.h>
+#include <ofono/sim-auth.h>
+
+#include "gatchat.h"
+#include "gatresult.h"
+#include "simutil.h"
+#include "vendor.h"
+
+#include "atmodem.h"
+
+struct sim_auth_data {
+ GAtChat *chat;
+ unsigned int vendor;
+};
+
+static const char *cuad_prefix[] = { "+CUAD:", NULL };
+
+static void at_discover_apps_cb(gboolean ok, GAtResult *result,
+ gpointer user_data)
+{
+ struct cb_data *cbd = user_data;
+ GAtResultIter iter;
+ ofono_sim_list_apps_cb_t cb = cbd->cb;
+ struct ofono_error error;
+ GSList *list = NULL, *i;
+ struct ofono_sim_app_record *buffer;
+ int j, n;
+
+ decode_at_error(&error, g_at_result_final_response(result));
+
+ if (!ok) {
+ cb(&error, NULL, 0, cbd->data);
+ return;
+ }
+
+ g_at_result_iter_init(&iter, result);
+
+ while (g_at_result_iter_next(&iter, "+CUAD:")) {
+ const guint8 *obj_str;
+ gint len;
+
+ if (!g_at_result_iter_next_hexstring(&iter, &obj_str, &len))
+ goto error;
+
+ i = sim_parse_app_template_entries(obj_str, len);
+ if (i == NULL)
+ goto error;
+
+ list = g_slist_concat(i, list);
+ }
+
+ n = g_slist_length(list);
+ buffer = g_new(struct ofono_sim_app_record, n);
+
+ for (i = list, j = n - 1; i != NULL; i = i->next, i--)
+ memcpy(&buffer[j], i->data, sizeof(*buffer));
+
+ cb(&error, buffer, n, cbd->data);
+
+ g_free(buffer);
+ goto done;
+
+error:
+ CALLBACK_WITH_FAILURE(cb, NULL, 0, cbd->data);
+
+done:
+ while (list) {
+ i = list;
+ list = list->next;
+
+ g_free(((struct ofono_sim_app_record *) i->data)->label);
+ g_free(i->data);
+ g_slist_free_1(i);
+ }
+}
+
+static void at_discover_apps(struct ofono_sim_auth *sa,
+ ofono_sim_list_apps_cb_t cb,
+ void *data)
+{
+ struct sim_auth_data *sad = ofono_sim_auth_get_data(sa);
+ struct cb_data *cbd = cb_data_new(cb, data);
+
+ if (cbd && g_at_chat_send(sad->chat, "AT+CUAD", cuad_prefix,
+ at_discover_apps_cb, cbd, g_free) > 0)
+ return;
+
+ g_free(cbd);
+
+ CALLBACK_WITH_FAILURE(cb, NULL, 0, data);
+}
+
+static gboolean at_sim_auth_register(gpointer user)
+{
+ struct ofono_sim_auth *sa = user;
+
+ ofono_sim_auth_register(sa);
+
+ return FALSE;
+}
+
+static int at_sim_auth_probe(struct ofono_sim_auth *sa, unsigned int vendor,
+ void *data)
+{
+ GAtChat *chat = data;
+ struct sim_auth_data *sad;
+
+ sad = g_new0(struct sim_auth_data, 1);
+ sad->chat = g_at_chat_clone(chat);
+ sad->vendor = vendor;
+
+ ofono_sim_auth_set_data(sa, sad);
+ g_idle_add(at_sim_auth_register, sa);
+
+ return 0;
+}
+
+static void at_sim_auth_remove(struct ofono_sim_auth *sa)
+{
+ struct sim_auth_data *sad = ofono_sim_auth_get_data(sa);
+
+ ofono_sim_auth_set_data(sa, NULL);
+
+ g_at_chat_unref(sad->chat);
+ g_free(sad);
+}
+
+static struct ofono_sim_auth_driver driver = {
+ .name = "atmodem",
+ .probe = at_sim_auth_probe,
+ .remove = at_sim_auth_remove,
+ .list_apps = at_discover_apps,
+};
+
+void at_sim_auth_init(void)
+{
+ ofono_sim_auth_driver_register(&driver);
+}
+
+void at_sim_auth_exit(void)
+{
+ ofono_sim_auth_driver_unregister(&driver);
+}
--
1.7.1.86.g0e460.dirty
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH 5/5] atmodem: sim-auth atom driver.
2011-01-17 17:38 ` [PATCH 5/5] atmodem: sim-auth atom driver Andrzej Zaborowski
@ 2011-01-18 19:30 ` Denis Kenzior
0 siblings, 0 replies; 8+ messages in thread
From: Denis Kenzior @ 2011-01-18 19:30 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 1889 bytes --]
Hi Andrew,
> +static void at_discover_apps_cb(gboolean ok, GAtResult *result,
> + gpointer user_data)
> +{
> + struct cb_data *cbd = user_data;
> + GAtResultIter iter;
> + ofono_sim_list_apps_cb_t cb = cbd->cb;
> + struct ofono_error error;
> + GSList *list = NULL, *i;
> + struct ofono_sim_app_record *buffer;
> + int j, n;
> +
> + decode_at_error(&error, g_at_result_final_response(result));
> +
> + if (!ok) {
> + cb(&error, NULL, 0, cbd->data);
> + return;
> + }
> +
> + g_at_result_iter_init(&iter, result);
> +
> + while (g_at_result_iter_next(&iter, "+CUAD:")) {
> + const guint8 *obj_str;
> + gint len;
> +
> + if (!g_at_result_iter_next_hexstring(&iter, &obj_str, &len))
> + goto error;
> +
> + i = sim_parse_app_template_entries(obj_str, len);
> + if (i == NULL)
> + goto error;
> +
> + list = g_slist_concat(i, list);
> + }
> +
Since we potentially multiple results, what do you think of using an
approach similar to how phonebook works. E.g. a simple:
typedef void (*ofono_sim_auth_cb_t)(const struct ofono_error *error,
void *data);
and ofono_sim_auth_app_record(struct ofono_sim_auth *sa, unsigned char
*record, int len);
This would work nicely even for drivers using CRSM I think...
> + n = g_slist_length(list);
> + buffer = g_new(struct ofono_sim_app_record, n);
> +
> + for (i = list, j = n - 1; i != NULL; i = i->next, i--)
> + memcpy(&buffer[j], i->data, sizeof(*buffer));
> +
> + cb(&error, buffer, n, cbd->data);
> +
> + g_free(buffer);
> + goto done;
> +
> +error:
> + CALLBACK_WITH_FAILURE(cb, NULL, 0, cbd->data);
> +
> +done:
> + while (list) {
> + i = list;
> + list = list->next;
> +
> + g_free(((struct ofono_sim_app_record *) i->data)->label);
> + g_free(i->data);
> + g_slist_free_1(i);
> + }
> +}
Regards,
-Denis
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/5] Add SIM authentication atom's driver definitions.
2011-01-17 17:38 [PATCH 1/5] Add SIM authentication atom's driver definitions Andrzej Zaborowski
` (3 preceding siblings ...)
2011-01-17 17:38 ` [PATCH 5/5] atmodem: sim-auth atom driver Andrzej Zaborowski
@ 2011-01-18 19:21 ` Denis Kenzior
4 siblings, 0 replies; 8+ messages in thread
From: Denis Kenzior @ 2011-01-18 19:21 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 584 bytes --]
Hi Andrew,
> +typedef void (*ofono_sim_list_apps_cb_t)(const struct ofono_error *error,
> + struct ofono_sim_app_record *list,
> + int count, void *data);
So I've been thinking about this one. Was there a reason why you want
to pass the parsed list out of the driver instead of just returning the
hex_decoded CUAD response and length?
If we do that then:
> +struct ofono_sim_app_record {
> + unsigned char aid[16];
> + int aid_len;
> + char *label;
> +};
Can be easily hidden inside simutil.h and not exposed to the outside world.
Regards,
-Denis
^ permalink raw reply [flat|nested] 8+ messages in thread