glib2 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. data/ChangeLog +3023 -0
  2. data/README +28 -0
  3. data/Rakefile +87 -0
  4. data/extconf.rb +61 -0
  5. data/sample/bookmarkfile.rb +66 -0
  6. data/sample/completion.rb +45 -0
  7. data/sample/idle.rb +41 -0
  8. data/sample/iochannel.rb +44 -0
  9. data/sample/keyfile.rb +62 -0
  10. data/sample/shell.rb +36 -0
  11. data/sample/spawn.rb +25 -0
  12. data/sample/timeout.rb +28 -0
  13. data/sample/timeout2.rb +35 -0
  14. data/sample/timer.rb +40 -0
  15. data/sample/type-register.rb +103 -0
  16. data/sample/type-register2.rb +104 -0
  17. data/sample/utils.rb +54 -0
  18. data/src/glib-enum-types.c +1032 -0
  19. data/src/glib-enum-types.h +140 -0
  20. data/src/lib/glib-mkenums.rb +199 -0
  21. data/src/lib/glib2.rb +220 -0
  22. data/src/lib/mkmf-gnome2.rb +390 -0
  23. data/src/lib/pkg-config.rb +137 -0
  24. data/src/rbgcompat.h +30 -0
  25. data/src/rbglib.c +320 -0
  26. data/src/rbglib.h +96 -0
  27. data/src/rbglib_bookmarkfile.c +595 -0
  28. data/src/rbglib_completion.c +192 -0
  29. data/src/rbglib_convert.c +195 -0
  30. data/src/rbglib_error.c +95 -0
  31. data/src/rbglib_fileutils.c +83 -0
  32. data/src/rbglib_i18n.c +44 -0
  33. data/src/rbglib_int64.c +157 -0
  34. data/src/rbglib_iochannel.c +883 -0
  35. data/src/rbglib_keyfile.c +846 -0
  36. data/src/rbglib_maincontext.c +917 -0
  37. data/src/rbglib_mainloop.c +87 -0
  38. data/src/rbglib_messages.c +150 -0
  39. data/src/rbglib_pollfd.c +111 -0
  40. data/src/rbglib_shell.c +68 -0
  41. data/src/rbglib_source.c +190 -0
  42. data/src/rbglib_spawn.c +345 -0
  43. data/src/rbglib_threads.c +51 -0
  44. data/src/rbglib_timer.c +127 -0
  45. data/src/rbglib_unicode.c +611 -0
  46. data/src/rbglib_utils.c +386 -0
  47. data/src/rbglib_win32.c +136 -0
  48. data/src/rbgobj_boxed.c +251 -0
  49. data/src/rbgobj_closure.c +337 -0
  50. data/src/rbgobj_convert.c +167 -0
  51. data/src/rbgobj_enums.c +961 -0
  52. data/src/rbgobj_fundamental.c +30 -0
  53. data/src/rbgobj_object.c +892 -0
  54. data/src/rbgobj_param.c +390 -0
  55. data/src/rbgobj_paramspecs.c +305 -0
  56. data/src/rbgobj_signal.c +963 -0
  57. data/src/rbgobj_strv.c +61 -0
  58. data/src/rbgobj_type.c +851 -0
  59. data/src/rbgobj_typeinstance.c +121 -0
  60. data/src/rbgobj_typeinterface.c +148 -0
  61. data/src/rbgobj_typemodule.c +66 -0
  62. data/src/rbgobj_typeplugin.c +49 -0
  63. data/src/rbgobj_value.c +313 -0
  64. data/src/rbgobj_valuearray.c +59 -0
  65. data/src/rbgobj_valuetypes.c +298 -0
  66. data/src/rbgobject.c +406 -0
  67. data/src/rbgobject.h +265 -0
  68. data/src/rbgprivate.h +88 -0
  69. data/src/rbgutil.c +222 -0
  70. data/src/rbgutil.h +82 -0
  71. data/src/rbgutil_callback.c +231 -0
  72. data/test/glib-test-init.rb +6 -0
  73. data/test/glib-test-utils.rb +12 -0
  74. data/test/run-test.rb +25 -0
  75. data/test/test_enum.rb +99 -0
  76. data/test/test_file_utils.rb +15 -0
  77. data/test/test_glib2.rb +120 -0
  78. data/test/test_iochannel.rb +275 -0
  79. data/test/test_key_file.rb +38 -0
  80. data/test/test_mkenums.rb +25 -0
  81. data/test/test_signal.rb +20 -0
  82. data/test/test_timeout.rb +28 -0
  83. data/test/test_unicode.rb +369 -0
  84. data/test/test_utils.rb +37 -0
  85. data/test/test_win32.rb +13 -0
  86. metadata +165 -0
@@ -0,0 +1,121 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /**********************************************************************
3
+
4
+ rbgobj_typeinstance.c -
5
+
6
+ $Author: sakai $
7
+ $Date: 2007/07/04 13:13:19 $
8
+ created at: Sat May 27 14:18:55 JST 2006
9
+
10
+ Copyright (C) 2002-2006 Ruby-GNOME2 Project Team
11
+ Copyright (C) 2002,2003 Masahiro Sakai
12
+
13
+ **********************************************************************/
14
+
15
+ #include "rbgprivate.h"
16
+
17
+ VALUE cInstantiatable;
18
+
19
+ typedef void (*ClassInfoCallbackFunc) (gpointer instance,
20
+ const RGObjClassInfo *class_info,
21
+ gpointer user_data);
22
+
23
+ static VALUE
24
+ instantiatable_s_allocate(klass)
25
+ VALUE klass;
26
+ {
27
+ rb_raise(rb_eTypeError, "abstract class");
28
+ }
29
+
30
+ static VALUE
31
+ instantiatable_get_gtype(self)
32
+ VALUE self;
33
+ {
34
+ return rbgobj_gtype_new(G_TYPE_FROM_INSTANCE(rbgobj_instance_from_ruby_object(self)));
35
+ }
36
+
37
+ static VALUE
38
+ instantiatable_clone(self)
39
+ VALUE self;
40
+ {
41
+ rb_raise(rb_eTypeError, "can't clone %s", rb_class2name(CLASS_OF(self)));
42
+ }
43
+
44
+ /**********************************************************************/
45
+
46
+ static void
47
+ each_cinfo(gpointer instance, ClassInfoCallbackFunc func, gpointer user_data)
48
+ {
49
+ const GType gtype = G_TYPE_FROM_INSTANCE(instance);
50
+ GType* interfaces;
51
+ guint n_interfaces = 0;
52
+
53
+ interfaces = g_type_interfaces(gtype, &n_interfaces);
54
+ {
55
+ guint i;
56
+ for (i = 0; i < n_interfaces; i++) {
57
+ const RGObjClassInfo *info;
58
+
59
+ info = GTYPE2CINFO_NO_CREATE(interfaces[i]);
60
+ if (info)
61
+ func(instance, info, user_data);
62
+ }
63
+ }
64
+ g_free(interfaces);
65
+
66
+ {
67
+ GType type;
68
+ for (type = gtype; type != G_TYPE_INVALID; type = g_type_parent(type)) {
69
+ const RGObjClassInfo *info;
70
+
71
+ info = GTYPE2CINFO_NO_CREATE(type);
72
+ if (info)
73
+ func(instance, info, user_data);
74
+ }
75
+ }
76
+ }
77
+
78
+ static void
79
+ call_cinfo_free(gpointer instance, const RGObjClassInfo *cinfo, gpointer user_data)
80
+ {
81
+ if (cinfo->free) cinfo->free(instance);
82
+ }
83
+
84
+ static void
85
+ call_cinfo_mark(gpointer instance, const RGObjClassInfo *cinfo, gpointer user_data)
86
+ {
87
+ if (cinfo->mark) cinfo->mark(instance);
88
+ }
89
+
90
+ void
91
+ rbgobj_instance_call_cinfo_mark(gpointer instance)
92
+ {
93
+ each_cinfo(instance, call_cinfo_mark, NULL);
94
+ }
95
+
96
+ void
97
+ rbgobj_instance_call_cinfo_free(gpointer instance)
98
+ {
99
+ each_cinfo(instance, call_cinfo_free, NULL);
100
+ }
101
+
102
+ void
103
+ rbgobj_gc_mark_instance(gpointer instance)
104
+ {
105
+ VALUE obj = rbgobj_ruby_object_from_instance2(instance, FALSE);
106
+ rb_gc_mark(obj);
107
+ }
108
+
109
+ /**********************************************************************/
110
+
111
+ void
112
+ Init_gobject_typeinstance()
113
+ {
114
+ /* should be renamed to GLib::Instance? */
115
+ cInstantiatable = rb_define_class_under(mGLib, "Instantiatable", rb_cObject);
116
+ rb_extend_object(cInstantiatable, mMetaInterface);
117
+
118
+ rb_define_alloc_func(cInstantiatable, (VALUE(*)_((VALUE)))instantiatable_s_allocate);
119
+ rb_define_method(cInstantiatable, "gtype", instantiatable_get_gtype, 0);
120
+ rb_define_method(cInstantiatable, "clone", instantiatable_clone, 0);
121
+ }
@@ -0,0 +1,148 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /**********************************************************************
3
+
4
+ rbgobj_typeinterface.c -
5
+
6
+ $Author: ggc $
7
+ $Date: 2007/07/13 16:07:28 $
8
+ created at: Sat May 27 16:04:13 JST 2006
9
+
10
+ Copyright (C) 2002-2006 Ruby-GNOME2 Project Team
11
+ Copyright (C) 2002,2003 Masahiro Sakai
12
+
13
+ **********************************************************************/
14
+
15
+ #include "rbgprivate.h"
16
+
17
+ VALUE rbgobj_mInterface;
18
+ VALUE mMetaInterface;
19
+
20
+ static VALUE
21
+ interface_s_append_features(self, klass)
22
+ VALUE self, klass;
23
+ {
24
+ if (!rb_obj_is_kind_of(klass, cInstantiatable))
25
+ rb_raise(rb_eTypeError, "Not a subclass of GLib::Instantiatable");
26
+ return rb_call_super(1, &klass);
27
+ }
28
+
29
+ #if GLIB_CHECK_VERSION(2,4,0)
30
+
31
+ static VALUE
32
+ interface_s_install_property(self, pspec_obj)
33
+ VALUE self, pspec_obj;
34
+ {
35
+ const RGObjClassInfo* cinfo = rbgobj_lookup_class(self);
36
+ gpointer ginterface;
37
+ GParamSpec* pspec;
38
+
39
+ if (cinfo->klass != self)
40
+ rb_raise(rb_eTypeError, "%s isn't registered class", rb_class2name(self));
41
+
42
+ pspec = G_PARAM_SPEC(RVAL2GOBJ(pspec_obj));
43
+ ginterface = g_type_default_interface_ref(cinfo->gtype);
44
+ g_object_interface_install_property(ginterface, pspec);
45
+ g_type_default_interface_unref(ginterface);
46
+
47
+ /* FIXME: define accessor methods */
48
+ return Qnil;
49
+ }
50
+
51
+ static VALUE
52
+ interface_s_property(self, property_name)
53
+ VALUE self, property_name;
54
+ {
55
+ gpointer ginterface;
56
+ const char* name;
57
+ GParamSpec* prop;
58
+ VALUE result;
59
+ GType gtype = CLASS2GTYPE(self);
60
+
61
+ if (SYMBOL_P(property_name))
62
+ name = rb_id2name(SYM2ID(property_name));
63
+ else
64
+ name = StringValuePtr(property_name);
65
+
66
+ if (!G_TYPE_IS_INTERFACE(gtype))
67
+ rb_raise(rb_eTypeError, "%s isn't interface module", rb_class2name(self));
68
+ /* XXX: g_type_default_interface_ref(G_TYPE_INTERFACE) causes SEGV. */
69
+ if (gtype == G_TYPE_INTERFACE) {
70
+ rb_raise(rb_const_get(mGLib, rb_intern("NoPropertyError")),
71
+ "No such property: %s", name);
72
+ }
73
+
74
+ ginterface = g_type_default_interface_ref(gtype);
75
+ prop = g_object_interface_find_property(ginterface, name);
76
+ if (!prop){
77
+ g_type_default_interface_unref(ginterface);
78
+ rb_raise(rb_const_get(mGLib, rb_intern("NoPropertyError")),
79
+ "No such property: %s", name);
80
+ }
81
+ result = GOBJ2RVAL(prop);
82
+ g_type_default_interface_unref(ginterface);
83
+
84
+ return result;
85
+ }
86
+
87
+ static VALUE
88
+ interface_s_properties(int argc, VALUE* argv, VALUE self)
89
+ {
90
+ guint n_properties;
91
+ GParamSpec** props;
92
+ VALUE inherited_too;
93
+ VALUE ary = rb_ary_new();
94
+ int i;
95
+ gpointer ginterface;
96
+ GType gtype = CLASS2GTYPE(self);
97
+
98
+ if (rb_scan_args(argc, argv, "01", &inherited_too) == 0)
99
+ inherited_too = Qtrue;
100
+
101
+ if (!G_TYPE_IS_INTERFACE(gtype))
102
+ rb_raise(rb_eTypeError, "%s isn't interface module", rb_class2name(self));
103
+ /* XXX: g_type_default_interface_ref(G_TYPE_INTERFACE) causes SEGV. */
104
+ if (gtype == G_TYPE_INTERFACE) return ary;
105
+
106
+ ginterface = g_type_default_interface_ref(gtype);
107
+ props = g_object_interface_list_properties(ginterface, &n_properties);
108
+ for (i = 0; i < n_properties; i++){
109
+ if (RVAL2CBOOL(inherited_too) || GTYPE2CLASS(props[i]->owner_type) == self)
110
+ rb_ary_push(ary, rb_str_new2(props[i]->name));
111
+ }
112
+ g_free(props);
113
+ g_type_default_interface_unref(ginterface);
114
+
115
+ return ary;
116
+ }
117
+
118
+ #endif
119
+
120
+ void
121
+ rbgobj_init_interface(VALUE interf)
122
+ {
123
+ static VALUE rb_mGLibInterface = Qnil;
124
+
125
+ rb_extend_object(interf, mMetaInterface);
126
+ if (CLASS2GTYPE(interf) == G_TYPE_INTERFACE) {
127
+ rb_mGLibInterface = interf;
128
+ } else {
129
+ rb_extend_object(interf, rb_mGLibInterface);
130
+ rb_include_module(interf, rb_mGLibInterface);
131
+ rbgobj_define_property_accessors(interf);
132
+ }
133
+ }
134
+
135
+ void
136
+ Init_gobject_typeinterface()
137
+ {
138
+ mMetaInterface = rb_define_module_under(mGLib, "MetaInterface");
139
+ rb_define_method(mMetaInterface, "gtype", generic_s_gtype, 0);
140
+ rb_define_method(mMetaInterface, "append_features", interface_s_append_features, 1);
141
+ #if GLIB_CHECK_VERSION(2,4,0)
142
+ rb_define_method(mMetaInterface, "install_property", interface_s_install_property, 1);
143
+ rb_define_method(mMetaInterface, "property", interface_s_property, 1);
144
+ rb_define_method(mMetaInterface, "properties", interface_s_properties, -1);
145
+ #endif
146
+
147
+ rbgobj_mInterface = G_DEF_INTERFACE(G_TYPE_INTERFACE, "Interface", mGLib);
148
+ }
@@ -0,0 +1,66 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /**********************************************************************
3
+
4
+ rbgobj_typemodule.c -
5
+
6
+ $Author: ggc $
7
+ $Date: 2007/07/13 14:27:07 $
8
+ created at: Sat Jul 27 16:56:01 JST 2002
9
+
10
+ Copyright (C) 2002,2003 Masahiro Sakai
11
+
12
+ **********************************************************************/
13
+
14
+ #include "rbgprivate.h"
15
+
16
+ static VALUE
17
+ use(self)
18
+ VALUE self;
19
+ {
20
+ return CBOOL2RVAL(g_type_module_use(G_TYPE_MODULE(RVAL2GOBJ(self))));
21
+ }
22
+
23
+ static VALUE
24
+ unuse(self)
25
+ VALUE self;
26
+ {
27
+ g_type_module_unuse(G_TYPE_MODULE(RVAL2GOBJ(self)));
28
+ return self;
29
+ }
30
+
31
+ static VALUE
32
+ get_name(self)
33
+ VALUE self;
34
+ {
35
+ return rb_str_new2(G_TYPE_MODULE(RVAL2GOBJ(self))->name);
36
+ }
37
+
38
+ static VALUE
39
+ set_name(self, name)
40
+ VALUE self, name;
41
+ {
42
+ g_type_module_set_name(G_TYPE_MODULE(RVAL2GOBJ(self)), StringValuePtr(name));
43
+ return name;
44
+ }
45
+
46
+ #if 0
47
+ GType g_type_module_register_type (GTypeModule *module,
48
+ GType parent_type,
49
+ const gchar *type_name,
50
+ const GTypeInfo *type_info,
51
+ GTypeFlags flags);
52
+ void g_type_module_add_interface (GTypeModule *module,
53
+ GType instance_type,
54
+ GType interface_type,
55
+ const GInterfaceInfo *interface_info);
56
+ #endif
57
+
58
+ void
59
+ Init_gobject_gtypemodule()
60
+ {
61
+ VALUE cTypeModule = G_DEF_CLASS(G_TYPE_TYPE_MODULE, "TypeModule", mGLib);
62
+ rb_define_method(cTypeModule, "use", use, 0);
63
+ rb_define_method(cTypeModule, "unuse", unuse, 0);
64
+ rb_define_method(cTypeModule, "name", get_name, 0);
65
+ rb_define_method(cTypeModule, "name=", set_name, 1);
66
+ }
@@ -0,0 +1,49 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /**********************************************************************
3
+
4
+ rbgobj_typeplugin.c -
5
+
6
+ $Author: mutoh $
7
+ $Date: 2003/02/01 16:03:09 $
8
+ created at: Mon Aug 5 00:42:09 JST 2002
9
+
10
+ Copyright (C) 2002,2003 Masahiro Sakai
11
+
12
+ **********************************************************************/
13
+
14
+ #include "rbgprivate.h"
15
+
16
+ static VALUE
17
+ use(self)
18
+ VALUE self;
19
+ {
20
+ g_type_plugin_use(G_TYPE_PLUGIN(RVAL2GOBJ(self)));
21
+ return self;
22
+ }
23
+
24
+ static VALUE
25
+ unuse(self)
26
+ VALUE self;
27
+ {
28
+ g_type_plugin_unuse(G_TYPE_PLUGIN(RVAL2GOBJ(self)));
29
+ return self;
30
+ }
31
+
32
+ #if 0
33
+ void g_type_plugin_complete_type_info (GTypePlugin *plugin,
34
+ GType g_type,
35
+ GTypeInfo *info,
36
+ GTypeValueTable *value_table);
37
+ void g_type_plugin_complete_interface_info (GTypePlugin *plugin,
38
+ GType interface_type,
39
+ GType instance_type,
40
+ GInterfaceInfo *info);
41
+ #endif
42
+
43
+ void
44
+ Init_gobject_gtypeplugin()
45
+ {
46
+ VALUE iTypePlugin = G_DEF_INTERFACE(G_TYPE_TYPE_PLUGIN, "TypePlugin", mGLib);
47
+ rb_define_method(iTypePlugin, "use", use, 0);
48
+ rb_define_method(iTypePlugin, "unuse", unuse, 0);
49
+ }
@@ -0,0 +1,313 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /**********************************************************************
3
+
4
+ rbgobj_value.c -
5
+
6
+ $Author: ggc $
7
+ $Date: 2007/07/13 16:07:28 $
8
+
9
+ Copyright (C) 2002,2003 Masahiro Sakai
10
+
11
+ **********************************************************************/
12
+
13
+ #include "rbgprivate.h"
14
+
15
+ /**********************************************************************/
16
+
17
+ static ID id_to_s;
18
+ static GQuark qRValueToGValueFunc;
19
+ static GQuark qGValueToRValueFunc;
20
+
21
+ void
22
+ rbgobj_register_r2g_func(GType gtype, RValueToGValueFunc func)
23
+ {
24
+ g_type_set_qdata(gtype, qRValueToGValueFunc, func);
25
+ }
26
+
27
+ void
28
+ rbgobj_register_g2r_func(GType gtype, GValueToRValueFunc func)
29
+ {
30
+ g_type_set_qdata(gtype, qGValueToRValueFunc, func);
31
+ }
32
+
33
+ /**********************************************************************/
34
+
35
+ VALUE
36
+ rbgobj_gvalue_to_rvalue(const GValue* value)
37
+ {
38
+ GType type, fundamental_type;
39
+ VALUE rvalue;
40
+
41
+ if (!value)
42
+ return Qnil;
43
+
44
+ type = G_VALUE_TYPE(value);
45
+ if (rbgobj_convert_gvalue2rvalue(type, value, &rvalue))
46
+ return rvalue;
47
+
48
+ fundamental_type = G_TYPE_FUNDAMENTAL(type);
49
+ switch (fundamental_type) {
50
+ case G_TYPE_NONE:
51
+ return Qnil;
52
+ case G_TYPE_CHAR:
53
+ return CHR2FIX(g_value_get_char(value));
54
+ case G_TYPE_UCHAR:
55
+ return INT2FIX(g_value_get_uchar(value));
56
+ case G_TYPE_BOOLEAN:
57
+ return CBOOL2RVAL(g_value_get_boolean(value));
58
+ case G_TYPE_INT:
59
+ return INT2NUM(g_value_get_int(value));
60
+ case G_TYPE_UINT:
61
+ return UINT2NUM(g_value_get_uint(value));
62
+ case G_TYPE_LONG:
63
+ return LONG2NUM(g_value_get_long(value));
64
+ case G_TYPE_ULONG:
65
+ return ULONG2NUM(g_value_get_ulong(value));
66
+ case G_TYPE_INT64:
67
+ return rbglib_int64_to_num(g_value_get_int64(value));
68
+ case G_TYPE_UINT64:
69
+ return rbglib_uint64_to_num(g_value_get_uint64(value));
70
+ case G_TYPE_FLOAT:
71
+ return rb_float_new(g_value_get_float(value));
72
+ case G_TYPE_DOUBLE:
73
+ return rb_float_new(g_value_get_double(value));
74
+ case G_TYPE_STRING:
75
+ {
76
+ const char* str = g_value_get_string(value);
77
+ return str ? rb_str_new2(str) : Qnil;
78
+ }
79
+ case G_TYPE_ENUM:
80
+ return rbgobj_make_enum(g_value_get_enum(value), type);
81
+ case G_TYPE_FLAGS:
82
+ return rbgobj_make_flags(g_value_get_flags(value), type);
83
+ case G_TYPE_OBJECT:
84
+ case G_TYPE_INTERFACE:
85
+ {
86
+ GObject* gobj = g_value_get_object(value);
87
+ return gobj ? GOBJ2RVAL(gobj) : Qnil;
88
+ }
89
+ case G_TYPE_PARAM:
90
+ {
91
+ GParamSpec* pspec = g_value_get_param(value);
92
+ return pspec ? rbgobj_ruby_object_from_instance(pspec) : Qnil;
93
+ }
94
+ case G_TYPE_POINTER:
95
+ {
96
+ gpointer ptr = g_value_get_pointer(value);
97
+ if (!ptr)
98
+ return Qnil;
99
+ else
100
+ return rbgobj_ptr_new(type, ptr);
101
+ }
102
+
103
+ case G_TYPE_BOXED:
104
+ {
105
+ GType gtype;
106
+ for (gtype = type;
107
+ gtype != G_TYPE_INVALID;
108
+ gtype = g_type_parent(gtype))
109
+ {
110
+ GValueToRValueFunc func =
111
+ g_type_get_qdata(gtype, qGValueToRValueFunc);
112
+ if (!func)
113
+ continue;
114
+ return func(value);
115
+ }
116
+ }
117
+ default:
118
+ if (!rbgobj_convert_gvalue2rvalue(fundamental_type, value, &rvalue)) {
119
+ GValueToRValueFunc func;
120
+ func = g_type_get_qdata(type, qGValueToRValueFunc);
121
+ if (!func) {
122
+ g_warning("rbgobj_gvalue_to_rvalue: unsupported type: %s\n",
123
+ g_type_name(type));
124
+ } else {
125
+ rvalue = func(value);
126
+ }
127
+ }
128
+ return rvalue;
129
+ }
130
+ }
131
+
132
+ void
133
+ rbgobj_initialize_gvalue(GValue *result, VALUE value)
134
+ {
135
+ GType type;
136
+
137
+ type = rbgobj_convert_rvalue2gtype(value);
138
+ if (type == 0) {
139
+ switch (TYPE(value)) {
140
+ case T_NONE:
141
+ case T_NIL:
142
+ type = G_TYPE_NONE;
143
+ break;
144
+ case T_FLOAT:
145
+ type = G_TYPE_DOUBLE;
146
+ break;
147
+ case T_STRING:
148
+ case T_SYMBOL:
149
+ type = G_TYPE_STRING;
150
+ break;
151
+ case T_FIXNUM:
152
+ type = G_TYPE_INT;
153
+ break;
154
+ case T_BIGNUM:
155
+ type = G_TYPE_INT64;
156
+ break;
157
+ case T_TRUE:
158
+ case T_FALSE:
159
+ type = G_TYPE_BOOLEAN;
160
+ break;
161
+ default:
162
+ if (RVAL2CBOOL(rb_obj_is_kind_of(value, rbgobj_cEnum))) {
163
+ type = G_TYPE_ENUM;
164
+ }
165
+ else if (RVAL2CBOOL(rb_obj_is_kind_of(value, rbgobj_cFlags))) {
166
+ type = G_TYPE_FLAGS;
167
+ }
168
+ else if (RVAL2CBOOL(rb_obj_is_kind_of(value, rbgobj_cBoxed))) {
169
+ type = G_TYPE_BOXED;
170
+ }
171
+ else if (RVAL2CBOOL(rb_obj_is_kind_of(value, rbgobj_cParam))) {
172
+ type = G_TYPE_PARAM;
173
+ }
174
+ else if (RVAL2CBOOL(rb_obj_is_kind_of(value, rbgobj_cObject))) {
175
+ type = G_TYPE_OBJECT;
176
+ }
177
+ else if (RVAL2CBOOL(rb_obj_is_kind_of(value, rbgobj_mInterface))) {
178
+ /* should use rbgobj_mMetaInterface? */
179
+ type = G_TYPE_INTERFACE;
180
+ }
181
+ else {
182
+ VALUE inspected_value;
183
+ inspected_value = rb_funcall(value, rb_intern("inspect"), 0);
184
+ rb_raise(rb_eArgError,
185
+ "unsupported value type: %s",
186
+ RSTRING_PTR(inspected_value));
187
+ }
188
+ break;
189
+ }
190
+ }
191
+
192
+ g_value_init(result, type);
193
+ rbgobj_rvalue_to_gvalue(value, result);
194
+ }
195
+
196
+ void
197
+ rbgobj_rvalue_to_gvalue(VALUE val, GValue* result)
198
+ {
199
+ GType type, fundamental_type;
200
+
201
+ type = G_VALUE_TYPE(result);
202
+ if (rbgobj_convert_rvalue2gvalue(type, val, result))
203
+ return;
204
+
205
+ fundamental_type = G_TYPE_FUNDAMENTAL(type);
206
+ switch (fundamental_type) {
207
+ case G_TYPE_NONE:
208
+ return;
209
+ case G_TYPE_CHAR:
210
+ g_value_set_char(result, NUM2INT(val));
211
+ return;
212
+ case G_TYPE_UCHAR:
213
+ g_value_set_uchar(result, NUM2UINT(val));
214
+ return;
215
+ case G_TYPE_BOOLEAN:
216
+ g_value_set_boolean(result, RVAL2CBOOL(val));
217
+ return;
218
+ case G_TYPE_INT:
219
+ g_value_set_int(result, NUM2INT(val));
220
+ return;
221
+ case G_TYPE_UINT:
222
+ g_value_set_uint(result, NUM2UINT(val));
223
+ return;
224
+ case G_TYPE_LONG:
225
+ g_value_set_long(result, NUM2LONG(val));
226
+ return;
227
+ case G_TYPE_ULONG:
228
+ g_value_set_ulong(result, NUM2ULONG(val));
229
+ return;
230
+ case G_TYPE_INT64:
231
+ g_value_set_int64(result, rbglib_num_to_int64(val));
232
+ return;
233
+ case G_TYPE_UINT64:
234
+ g_value_set_uint64(result, rbglib_num_to_uint64(val));
235
+ return;
236
+ case G_TYPE_ENUM:
237
+ g_value_set_enum(result, rbgobj_get_enum(val, G_VALUE_TYPE(result)));
238
+ return;
239
+ case G_TYPE_FLAGS:
240
+ g_value_set_flags(result, rbgobj_get_flags(val, G_VALUE_TYPE(result)));
241
+ return;
242
+ case G_TYPE_FLOAT:
243
+ g_value_set_float(result, NUM2DBL(val));
244
+ return;
245
+ case G_TYPE_DOUBLE:
246
+ g_value_set_double(result, NUM2DBL(val));
247
+ return;
248
+ case G_TYPE_STRING:
249
+ {
250
+ if (SYMBOL_P(val))
251
+ val = rb_funcall(val, id_to_s, 0);
252
+ g_value_set_string(result, NIL_P(val) ? NULL : StringValuePtr(val));
253
+ return;
254
+ }
255
+ case G_TYPE_OBJECT:
256
+ case G_TYPE_INTERFACE:
257
+ g_value_set_object(result, NIL_P(val) ? NULL : RVAL2GOBJ(val));
258
+ return;
259
+ case G_TYPE_PARAM:
260
+ g_value_set_param(result, NIL_P(val) ? NULL : RVAL2GOBJ(val));
261
+ return;
262
+ case G_TYPE_POINTER:
263
+ g_value_set_pointer(result, NIL_P(val) ? NULL : rbgobj_ptr2cptr(val));
264
+ return;
265
+ case G_TYPE_BOXED:
266
+ {
267
+ GType gtype;
268
+ for (gtype = type;
269
+ gtype != G_TYPE_INVALID;
270
+ gtype = g_type_parent(gtype))
271
+ {
272
+ RValueToGValueFunc func =
273
+ g_type_get_qdata(gtype, qRValueToGValueFunc);
274
+ if (!func)
275
+ continue;
276
+ func(val, result);
277
+ return;
278
+ }
279
+ }
280
+
281
+ default:
282
+ if (!rbgobj_convert_rvalue2gvalue(fundamental_type, val, result)) {
283
+ RValueToGValueFunc func =
284
+ g_type_get_qdata(type, qRValueToGValueFunc);
285
+ if (!func){
286
+ g_warning("rbgobj_rvalue_to_gvalue: unsupported type: %s\n",
287
+ g_type_name(type));
288
+ } else {
289
+ func(val, result);
290
+ }
291
+ }
292
+ }
293
+ }
294
+
295
+ /**********************************************************************/
296
+
297
+ void
298
+ rbgobj_gc_mark_gvalue(GValue* value)
299
+ {
300
+ GType gtype = G_VALUE_TYPE(value);
301
+ /* FIXME */
302
+ if (G_TYPE_FUNDAMENTAL(gtype) == G_TYPE_OBJECT)
303
+ rbgobj_gc_mark_instance(g_value_get_object(value));
304
+ }
305
+
306
+ /**********************************************************************/
307
+
308
+ void Init_gobject_gvalue()
309
+ {
310
+ id_to_s = rb_intern("to_s");
311
+ qRValueToGValueFunc = g_quark_from_static_string("__ruby_r2g_func__");
312
+ qGValueToRValueFunc = g_quark_from_static_string("__ruby_g2r_func__");
313
+ }