Hi Claudio, On 03/12/2013 07:42 AM, Claudio Takahasi wrote: > This patch parses and reads the profile "Version" that comes in the fd > dictionary of the NewConnection method. "Version" is input for Audio Card > registration. > --- > plugins/hfp_hf_bluez5.c | 37 +++++++++++++++++++++++++++++++++++++ > 1 file changed, 37 insertions(+) > > diff --git a/plugins/hfp_hf_bluez5.c b/plugins/hfp_hf_bluez5.c > index 2020e63..a8d8277 100644 > --- a/plugins/hfp_hf_bluez5.c > +++ b/plugins/hfp_hf_bluez5.c > @@ -343,6 +343,37 @@ static ofono_bool_t device_path_compare(struct ofono_modem *modem, > return g_str_equal(path, value); > } > > +static int get_version(DBusMessageIter *iter, uint16_t *version) > +{ > + DBusMessageIter dict, entry, valiter; > + const char *key; > + uint16_t value; > + > + dbus_message_iter_recurse(iter,&dict); > + > + /* Dict entry key */ > + dbus_message_iter_recurse(&dict,&entry); > + if (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_STRING) > + return -EINVAL; > + > + dbus_message_iter_get_basic(&entry,&key); > + if (g_str_equal("Version", key) == FALSE) > + return -EINVAL; > + > + /* Dict entry value */ > + dbus_message_iter_next(&entry); > + if (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_VARIANT) > + return -EINVAL; > + > + dbus_message_iter_recurse(&entry,&valiter); > + dbus_message_iter_get_basic(&valiter,&value); > + > + if (version) > + *version = value; > + > + return 0; > +} > + > static DBusMessage *profile_new_connection(DBusConnection *conn, > DBusMessage *msg, void *user_data) > { > @@ -353,6 +384,7 @@ static DBusMessage *profile_new_connection(DBusConnection *conn, > DBusMessageIter entry; > const char *device; > char local[18], remote[18]; > + uint16_t version; > int fd, err; > > DBG("Profile handler NewConnection"); > @@ -373,6 +405,11 @@ static DBusMessage *profile_new_connection(DBusConnection *conn, > if (fd< 0) > goto invalid; > > + dbus_message_iter_next(&entry); > + I would not mind extra sanity checking here, e.g. argument type checking > + if (get_version(&entry,&version)< 0) > + goto invalid; > + I don't like this. The fd_properties is a dictionary, you cannot assume that Version will be always the first one. > modem = ofono_modem_find(device_path_compare, (void *) device); > if (modem == NULL) { > close(fd); Regards, -Denis