Rails to C binding of libgio

I'm trying to use some functions from the Gnome GIO library to get extended file attributes. I'm doing this by writing a C extension using the wonderful directions in http://www.rubycentral.com/pickaxe/ext_ruby.html. All that being said, I don't really know Gnome or GTK+ at all, but I thought my little code would be OK.

So I have the library built (rubygio.so) and the code all executes fine. Problem is the gio api calls don't return any info when I think they should. I'm guessing there is some initialization stuff I'm missing or maybe I have to have a window going or something. Any help would be appreciated.

The C code to get the attributes looks like this:

static VALUE rbgio_load_attributes(VALUE self) {   VALUE arr = rb_iv_get(self, "@attribute_array");   VALUE names = rb_iv_get(self, "@name_array");   VALUE path = rb_iv_get(self, "@path");

  GFile *ptr = g_file_new_for_path(STR2CSTR(path));   GError *gerror = NULL;   GFileInfo *finfo = g_file_query_info(ptr, "*", 0, NULL, &gerror);   if (finfo == NULL) {     return INT2NUM(0);   }   char **attributes = g_file_info_list_attributes(finfo, "*");   int i = 0;   while (attributes[i] != NULL) {     rb_ary_push(names, rb_str_new2(attributes[i]));     rb_ary_push(arr, rb_str_new2(g_file_info_get_attribute_as_string (finfo, attributes[i])));     i++;   }   return INT2NUM(1) }

Again it all runs (i've run it in gdb and examined variables). The GFile *ptr is a real address, the GFileInfo *finfo is a real thing and the char** attributes is a valid list with no entries.

Any clues would be greatly appreciated. I will put the extension out there once completed.

Mike

I see gets but no sets on those ivars you're trying to manipulate. I wouldn't assume that you're editing the values in-place instead of a copy of what the ivars contained unless you've proven that's what you've got (I think that sentence makes sense ...).

Given that you're saying the code doesn't work, try adding the following 3 lines to the end of the method:

rb_iv_set(self, "@attributes_array", arr); rb_iv_set(self, "@name_array", names); rb_iv_set(self, "@path", path);

Jason

Sorry, I did not put the whole file in the post. Those are in the init module.

static VALUE rbgio_init(VALUE self, VALUE path) {   VALUE arr, names;

  rb_iv_set(self, "@path", path);   arr = rb_ary_new();   names = rb_ary_new();   rb_iv_set(self, "@attribute_array", arr);   rb_iv_set(self, "@name_array", names);   return self; }

Thanks for looking. I'm starting to suspect I have to do something to initialize the library. I have a call to gdk_init(argc, argv) in the module initialization, but maybe there is something more? Maybe I can't use the library without creating a window? Not sure.

Mike