diff options
Diffstat (limited to 'glib/dbus-gidl.c')
-rw-r--r-- | glib/dbus-gidl.c | 331 |
1 files changed, 331 insertions, 0 deletions
diff --git a/glib/dbus-gidl.c b/glib/dbus-gidl.c new file mode 100644 index 00000000..b6e0fb8c --- /dev/null +++ b/glib/dbus-gidl.c @@ -0,0 +1,331 @@ +/* -*- mode: C; c-file-style: "gnu" -*- */ +/* dbus-gidl.c data structure describing an interface, to be generated from IDL + * or something + * + * Copyright (C) 2003 Red Hat, Inc. + * + * Licensed under the Academic Free License version 1.2 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "dbus-gidl.h" + +struct InterfaceInfo +{ + int refcount; + char *name; + GSList *methods; + GSList *signals; +}; + +struct MethodInfo +{ + int refcount; + GSList *args; + char *name; + MethodStyle style; +}; + +struct SignalInfo +{ + int refcount; + GSList *args; + char *name; +}; + +struct ArgInfo +{ + int refcount; + char *name; + int type; + ArgDirection direction; +}; + +static void +free_method_list (GSList **methods_p) +{ + GSList *tmp; + tmp = *methods_p; + while (tmp != NULL) + { + method_info_unref (tmp->data); + tmp = tmp->next; + } + g_slist_free (*methods_p); + *methods_p = NULL; +} + +static void +free_signal_list (GSList **signals_p) +{ + GSList *tmp; + tmp = *signals_p; + while (tmp != NULL) + { + signal_info_unref (tmp->data); + tmp = tmp->next; + } + g_slist_free (*signals_p); + *signals_p = NULL; +} + +InterfaceInfo* +interface_info_new (const char *name) +{ + InterfaceInfo *info; + + info = g_new0 (InterfaceInfo, 1); + info->refcount = 1; + info->name = g_strdup (name); + + return info; +} + +void +interface_info_ref (InterfaceInfo *info) +{ + info->refcount += 1; +} + +void +interface_info_unref (InterfaceInfo *info) +{ + info->refcount -= 1; + if (info->refcount == 0) + { + free_method_list (&info->methods); + free_signal_list (&info->signals); + g_free (info->name); + g_free (info); + } +} + +GSList* +interface_info_get_methods (InterfaceInfo *info) +{ + return info->methods; +} + +GSList* +interface_info_get_signals (InterfaceInfo *info) +{ + return info->signals; +} + +void +interface_info_add_method (InterfaceInfo *info, + MethodInfo *method) +{ + method_info_ref (method); + info->methods = g_slist_append (info->methods, method); +} + +void +interface_info_add_signal (InterfaceInfo *info, + SignalInfo *signal) +{ + signal_info_ref (signal); + info->signals = g_slist_append (info->signals, signal); +} + +static void +free_arg_list (GSList **args_p) +{ + GSList *tmp; + tmp = *args_p; + while (tmp != NULL) + { + arg_info_unref (tmp->data); + tmp = tmp->next; + } + g_slist_free (*args_p); + *args_p = NULL; +} + +MethodInfo* +method_info_new (const char *name, + MethodStyle style) +{ + MethodInfo *info; + + info = g_new0 (MethodInfo, 1); + info->refcount = 1; + info->name = g_strdup (name); + info->style = style; + + return info; +} + +void +method_info_ref (MethodInfo *info) +{ + info->refcount += 1; +} + +void +method_info_unref (MethodInfo *info) +{ + info->refcount -= 1; + if (info->refcount == 0) + { + free_arg_list (&info->args); + g_free (info->name); + g_free (info); + } +} + +const char* +method_info_get_name (MethodInfo *info) +{ + return info->name; +} + +GSList* +method_info_get_args (MethodInfo *info) +{ + return info->args; +} + +MethodStyle +method_info_get_style (MethodInfo *info) +{ + return info->style; +} + +void +method_info_add_arg (MethodInfo *info, + ArgInfo *arg) +{ + arg_info_ref (arg); + info->args = g_slist_append (info->args, arg); +} + +SignalInfo* +signal_info_new (const char *name) +{ + SignalInfo *info; + + info = g_new0 (SignalInfo, 1); + info->refcount = 1; + info->name = g_strdup (name); + + return info; +} + +void +signal_info_ref (SignalInfo *info) +{ + info->refcount += 1; +} + +void +signal_info_unref (SignalInfo *info) +{ + info->refcount -= 1; + if (info->refcount == 0) + { + free_arg_list (&info->args); + g_free (info->name); + g_free (info); + } +} + +const char* +signal_info_get_name (SignalInfo *info) +{ + return info->name; +} + +GSList* +signal_info_get_args (SignalInfo *info) +{ + return info->args; +} + +void +signal_info_add_arg (SignalInfo *info, + ArgInfo *arg) +{ + arg_info_ref (arg); + info->args = g_slist_append (info->args, arg); +} + +ArgInfo* +arg_info_new (const char *name, + ArgDirection direction, + int type) +{ + ArgInfo *info; + + info = g_new0 (ArgInfo, 1); + info->refcount = 1; + info->name = g_strdup (name); + info->direction = direction; + info->type = type; + + return info; +} + +void +arg_info_ref (ArgInfo *info) +{ + info->refcount += 1; +} + +void +arg_info_unref (ArgInfo *info) +{ + info->refcount -= 1; + if (info->refcount == 0) + { + g_free (info->name); + g_free (info); + } +} +const char* +arg_info_get_name (ArgInfo *info) +{ + return info->name; +} + +int +arg_info_get_type (ArgInfo *info) +{ + return info->type; +} + +ArgDirection +arg_info_get_direction (ArgInfo *info) +{ + return info->direction; +} + +#ifdef DBUS_BUILD_TESTS + +/** + * @ingroup DBusGIDL + * Unit test for GLib IDL internals + * @returns #TRUE on success. + */ +dbus_bool_t +_dbus_gidl_test (void) +{ + + return TRUE; +} + +#endif /* DBUS_BUILD_TESTS */ |