1 /*
2  * Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
3  *
4  * This file originated from: http://opensource.conformal.com/
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #ifndef __GLIB_GO_H__
20 #define __GLIB_GO_H__
21 
22 #include <stdint.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 
26 #include <gio/gio.h>
27 #define G_SETTINGS_ENABLE_BACKEND
28 #include <gio/gsettingsbackend.h>
29 #include <glib-object.h>
30 #include <glib.h>
31 #include <glib/gi18n.h>
32 #include <locale.h>
33 
34 /* GObject Type Casting */
toGObject(void * p)35 static GObject *toGObject(void *p) { return (G_OBJECT(p)); }
36 
toGAction(void * p)37 static GAction *toGAction(void *p) { return (G_ACTION(p)); }
38 
toGActionGroup(void * p)39 static GActionGroup *toGActionGroup(void *p) { return (G_ACTION_GROUP(p)); }
40 
toGActionMap(void * p)41 static GActionMap *toGActionMap(void *p) { return (G_ACTION_MAP(p)); }
42 
toGAsyncResult(void * p)43 static GAsyncResult *toGAsyncResult(void *p) { return (G_ASYNC_RESULT(p)); }
44 
toGSimpleAction(void * p)45 static GSimpleAction *toGSimpleAction(void *p) { return (G_SIMPLE_ACTION(p)); }
46 
toGSimpleActionGroup(void * p)47 static GSimpleActionGroup *toGSimpleActionGroup(void *p) {
48   return (G_SIMPLE_ACTION_GROUP(p));
49 }
50 
toGPropertyAction(void * p)51 static GPropertyAction *toGPropertyAction(void *p) {
52   return (G_PROPERTY_ACTION(p));
53 }
54 
toGMenuModel(void * p)55 static GMenuModel *toGMenuModel(void *p) { return (G_MENU_MODEL(p)); }
56 
toGMenu(void * p)57 static GMenu *toGMenu(void *p) { return (G_MENU(p)); }
58 
toGMenuItem(void * p)59 static GMenuItem *toGMenuItem(void *p) { return (G_MENU_ITEM(p)); }
60 
toGNotification(void * p)61 static GNotification *toGNotification(void *p) { return (G_NOTIFICATION(p)); }
62 
toGPermission(void * p)63 static GPermission *toGPermission(void *p) { return (G_PERMISSION(p)); }
64 
toCancellable(void * p)65 static GCancellable *toCancellable(void *p) { return (G_CANCELLABLE(p)); }
66 
toGIcon(void * p)67 static GIcon *toGIcon(void *p) { return (G_ICON(p)); }
toGFileIcon(void * p)68 static GFileIcon *toGFileIcon(void *p) { return (G_FILE_ICON(p)); }
69 
toGFile(void * p)70 static GFile *toGFile(void *p) { return (G_FILE(p)); }
71 
toGApplication(void * p)72 static GApplication *toGApplication(void *p) { return (G_APPLICATION(p)); }
73 
toGSettings(void * p)74 static GSettings *toGSettings(void *p) { return (G_SETTINGS(p)); }
75 
toGSettingsBackend(void * p)76 static GSettingsBackend *toGSettingsBackend(void *p) {
77   return (G_SETTINGS_BACKEND(p));
78 }
79 
toGBinding(void * p)80 static GBinding *toGBinding(void *p) { return (G_BINDING(p)); }
81 
_g_type_from_instance(gpointer instance)82 static GType _g_type_from_instance(gpointer instance) {
83   return (G_TYPE_FROM_INSTANCE(instance));
84 }
85 
86 /* Wrapper to avoid variable arg list */
_g_object_set_one(gpointer object,const gchar * property_name,void * val)87 static void _g_object_set_one(gpointer object, const gchar *property_name,
88                               void *val) {
89   g_object_set(object, property_name, *(gpointer **)val, NULL);
90 }
91 
alloc_gvalue_list(int n)92 static GValue *alloc_gvalue_list(int n) {
93   GValue *valv;
94 
95   valv = g_new0(GValue, n);
96   return (valv);
97 }
98 
val_list_insert(GValue * valv,int i,GValue * val)99 static void val_list_insert(GValue *valv, int i, GValue *val) {
100   valv[i] = *val;
101 }
102 
103 /*
104  * GValue
105  */
106 
_g_value_alloc()107 static GValue *_g_value_alloc() { return (g_new0(GValue, 1)); }
108 
_g_value_init(GType g_type)109 static GValue *_g_value_init(GType g_type) {
110   GValue *value;
111 
112   value = g_new0(GValue, 1);
113   return (g_value_init(value, g_type));
114 }
115 
_g_type_is_value(GType g_type)116 static gboolean _g_type_is_value(GType g_type) {
117   return (G_TYPE_IS_VALUE(g_type));
118 }
119 
_g_is_value(GValue * val)120 static gboolean _g_is_value(GValue *val) { return (G_IS_VALUE(val)); }
121 
_g_value_type(GValue * val)122 static GType _g_value_type(GValue *val) { return (G_VALUE_TYPE(val)); }
123 
_g_value_type_name(GValue * val)124 static const gchar *_g_value_type_name(GValue *val) {
125   return (G_VALUE_TYPE_NAME(val));
126 }
127 
_g_value_fundamental(GType type)128 static GType _g_value_fundamental(GType type) {
129   return (G_TYPE_FUNDAMENTAL(type));
130 }
131 
_g_object_get_class(GObject * object)132 static GObjectClass *_g_object_get_class(GObject *object) {
133   return (G_OBJECT_GET_CLASS(object));
134 }
135 
136 /*
137  * Closure support
138  */
139 
140 extern void removeSourceFunc(gpointer data);
141 extern gboolean sourceFunc(gpointer data);
142 
143 extern void goMarshal(GClosure *, GValue *, guint, GValue *, gpointer,
144                       GValue *);
145 extern void removeClosure(gpointer, GClosure *);
146 
_g_closure_new()147 static inline GClosure *_g_closure_new() {
148   GClosure *closure;
149 
150   closure = g_closure_new_simple(sizeof(GClosure), NULL);
151   g_closure_set_marshal(closure, (GClosureMarshal)(goMarshal));
152   g_closure_add_finalize_notifier(closure, NULL,
153                                   (GClosureNotify)(removeClosure));
154   return closure;
155 }
156 
_g_signal_new(const gchar * name)157 static inline guint _g_signal_new(const gchar *name) {
158   return g_signal_new(name, G_TYPE_OBJECT, G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
159                       0, NULL, NULL, g_cclosure_marshal_VOID__POINTER,
160                       G_TYPE_NONE, 0);
161 }
162 
init_i18n(const char * domain,const char * dir)163 static void init_i18n(const char *domain, const char *dir) {
164   setlocale(LC_ALL, "");
165   bindtextdomain(domain, dir);
166   bind_textdomain_codeset(domain, "UTF-8");
167   textdomain(domain);
168 }
169 
localize(const char * string)170 static const char *localize(const char *string) { return _(string); }
171 
make_strings(int count)172 static inline char **make_strings(int count) {
173   return (char **)malloc(sizeof(char *) * count);
174 }
175 
destroy_strings(char ** strings)176 static inline void destroy_strings(char **strings) { free(strings); }
177 
get_string(char ** strings,int n)178 static inline char *get_string(char **strings, int n) { return strings[n]; }
179 
set_string(char ** strings,int n,char * str)180 static inline void set_string(char **strings, int n, char *str) {
181   strings[n] = str;
182 }
183 
next_gcharptr(gchar ** s)184 static inline gchar **next_gcharptr(gchar **s) { return (s + 1); }
185 
186 extern gint goCompareDataFuncs(gconstpointer a, gconstpointer b,
187                                gpointer user_data);
188 
189 #endif
190