On Mon, May 14, 2012, at 05:01 PM, David Zeuthen wrote (in part):
> On Mon, May 14, 2012 at 4:54 PM, Anant Kamath <kamathan...@gmail.com> wrote:
> > I'm using udisks 1.97
> >
> > Since the EnumarateDevices DBus method is not available in udisks2, is the
> > org.freedesktop.DBus.ObjectManager.GetManagedObjects method the best way to
> > list drives using udisks2 ?
> 
> The best way is to use libudisks2 (LGPLv2), see
> http://udisks.freedesktop.org/docs/latest/
> which is accessible from C/C++ and any language supporting
> GObjectIntrospection. If that is not an option, the next best choice
> is to use GDBusObjectManagerClient, see
> http://developer.gnome.org/gio/unstable/GDBusObjectManagerClient.html
> or any other D-Bus ObjectManager implementation. If you don't have a
> D-Bus ObjectManager implementation available, you can (relatively)
> easily write one yourself <SNIP>

You can also list the known drives via D-Bus, with a little work. Use
org.freedesktop.DBus.Introspectable.Introspect() on a D-Bus object, and
scan the resulting XML text for "<node" followed by whitespace followed
by "name=" followed by a single or double quote. (This is guaranteed to
work because the XML will be well-formed and the DBus spec requires
<node> elements other than the document root to have name attributes.

I tested this idea under udisks 1.91. Using Introspect() on
org.freedesktop.UDisks2 showed child nodes named "drives" (ie.,
org.freedesktop.UDisks2.drives) and "block_devices". Introspect() on
org.freedesktop.UDisks2.block_devices showed child nodes for every block
device on my system (to be precise, everything in /sys/block/).

Even in pure ISO C, it's not that hard to get the list of nodes from the
XML:

const char * p = xml_string;
while ( ((p = strstr(p, "<node")) != NULL ) {
        p += 5;
        if ( ! isspace(*p) ) continue;          // Ignore "<node>"
        do { ++p; } while (isspace(*p));
        if ( strncmp(p, "name=", 5) ) continue; // Should not happen
        p+= 5;
        char q = *p;            // Should be quote character: ' or "
        if ( q != '"' && q != '\'' ) continue;  // Should not happen
        ++p;
        const char * name_end = strchr(p, q);
        if ( name_end == NULL ) continue;       // Should not happen
        process_node_by_name_len(p, (name_end - p));
}

Hope this helps -- Chris
_______________________________________________
devkit-devel mailing list
devkit-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/devkit-devel

Reply via email to