From: Denis Kenzior <denkenz@gmail.com>
To: connman@lists.linux.dev
Cc: Denis Kenzior <denkenz@gmail.com>
Subject: [PATCH 1/4] ofono: Add generic method to convert a list of strings to flags
Date: Wed, 27 Mar 2024 14:43:32 -0500 [thread overview]
Message-ID: <20240327194337.2735677-1-denkenz@gmail.com> (raw)
oFono D-Bus APIs are string based, with several string list based
properties that convey information that might require tracking. For
example:
- Interfaces -> list of interfaces supported
- Features -> list of features supported
- Capabilities -> modem capabilities
Introduce a new convenience method that can be used to convert such
string lists to a set of flags (bitmap). Make extract_interfaces()
use it. While here, tighten up error checking and do not attempt to
parse non-string list signatures.
---
plugins/ofono.c | 49 ++++++++++++++++++++++++++++++++++++++++---------
1 file changed, 40 insertions(+), 9 deletions(-)
diff --git a/plugins/ofono.c b/plugins/ofono.c
index 65a722fd85d6..1906843335cf 100644
--- a/plugins/ofono.c
+++ b/plugins/ofono.c
@@ -685,29 +685,60 @@ static bool has_interface(uint8_t interfaces,
return false;
}
-static uint8_t extract_interfaces(DBusMessageIter *array)
+struct flag_map {
+ const char *value;
+ uint32_t flag;
+};
+
+static int string_list_to_flags(DBusMessageIter *array,
+ const struct flag_map *map, size_t map_len,
+ uint32_t *out_flags)
{
DBusMessageIter entry;
- uint8_t interfaces = 0;
+ uint32_t flags = 0;
+
+ if (dbus_message_iter_get_arg_type(array) != DBUS_TYPE_ARRAY)
+ return -EINVAL;
+
+ if (dbus_message_iter_get_element_type(array) != DBUS_TYPE_STRING)
+ return -EINVAL;
dbus_message_iter_recurse(array, &entry);
while (dbus_message_iter_get_arg_type(&entry) == DBUS_TYPE_STRING) {
+ size_t i;
const char *name;
dbus_message_iter_get_basic(&entry, &name);
- if (g_str_equal(name, OFONO_SIM_INTERFACE))
- interfaces |= OFONO_API_SIM;
- else if (g_str_equal(name, OFONO_NETREG_INTERFACE))
- interfaces |= OFONO_API_NETREG;
- else if (g_str_equal(name, OFONO_CM_INTERFACE))
- interfaces |= OFONO_API_CM;
+ for (i = 0; i < map_len; i++)
+ if (!strcmp(name, map[i].value))
+ flags |= map[i].flag;
dbus_message_iter_next(&entry);
}
- return interfaces;
+ if (out_flags)
+ *out_flags = flags;
+
+ return 0;
+}
+
+static uint8_t extract_interfaces(DBusMessageIter *array)
+{
+ static const struct flag_map interfaces_map[] = {
+ { .value = OFONO_SIM_INTERFACE, .flag = OFONO_API_SIM },
+ { .value = OFONO_NETREG_INTERFACE, .flag = OFONO_API_NETREG },
+ { .value = OFONO_CM_INTERFACE, .flag = OFONO_API_CM },
+ };
+ uint32_t flags;
+
+ if (string_list_to_flags(array, interfaces_map,
+ G_N_ELEMENTS(interfaces_map),
+ &flags) < 0)
+ return 0;
+
+ return flags;
}
static char *extract_nameservers(DBusMessageIter *array)
--
2.43.0
next reply other threads:[~2024-03-27 19:43 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-27 19:43 Denis Kenzior [this message]
2024-03-27 19:43 ` [PATCH 2/4] ofono: Set modem->interfaces earlier Denis Kenzior
2024-03-27 19:43 ` [PATCH 3/4] ofono: combine create_device and ready_to_create_device Denis Kenzior
2024-03-27 19:43 ` [PATCH 4/4] ofono: delay device creation until lte settings are provisioned Denis Kenzior
2024-04-17 17:00 ` [PATCH 1/4] ofono: Add generic method to convert a list of strings to flags patchwork-bot+connman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240327194337.2735677-1-denkenz@gmail.com \
--to=denkenz@gmail.com \
--cc=connman@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).