diff options
author | Anders Carlsson <andersca@src.gnome.org> | 2003-03-16 18:32:37 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@src.gnome.org> | 2003-03-16 18:32:37 +0000 |
commit | 891a7807e57066efb77679754a8e5a3691409d6e (patch) | |
tree | 909c8c1047216fb6631a7155fe726010177a05aa | |
parent | b9a522e8eaf6bf9cc2085ea3e25cd18de935b49a (diff) | |
download | gconf-891a7807e57066efb77679754a8e5a3691409d6e.tar.gz |
Start making the CORBA dep optional
-rw-r--r-- | configure.in | 33 | ||||
-rw-r--r-- | gconf/Makefile.am | 4 | ||||
-rw-r--r-- | gconf/gconf-internals.c | 912 | ||||
-rw-r--r-- | gconf/gconf-internals.h | 24 | ||||
-rw-r--r-- | gconf/gconf.c | 414 | ||||
-rw-r--r-- | gconf/gconfd-corba.c | 769 | ||||
-rw-r--r-- | gconf/gconfd-corba.h | 17 | ||||
-rw-r--r-- | gconf/gconfd-dbus.c | 5 |
8 files changed, 834 insertions, 1344 deletions
diff --git a/configure.in b/configure.in index 1d66804c..a26387c0 100644 --- a/configure.in +++ b/configure.in @@ -170,13 +170,41 @@ if test x$enable_gtk_doc = xauto ; then fi fi +AC_ARG_ENABLE(orbit, [ --enable-orbit enable ORBit support in the daemon],enable_orbit=$enableval,enable_orbit=auto) + +# ORBit detection +PKG_CHECK_MODULES(GCONF_ORBIT, ORBit-2.0 >= 2.4.0 linc >= 0.5.0, have_orbit=yes, have_orbit=no) + +if test x$have_orbit = xno ; then + AC_MSG_WARN([ORBit development libraries not found]) +fi + +if test x$enable_orbit = xyes; then + if test x$have_orbit = xno; then + AC_MSG_ERROR([ORBit explicitly required, and ORBit development libraries not found]) + fi + ORBIT_IDL="`$PKG_CONFIG --variable=orbit_idl ORBit-2.0`" + AC_SUBST(ORBIT_IDL) + AC_DEFINE(HAVE_ORBIT,1,ORBit support in the daemon) +fi + +if test x$enable_orbit = xno; then + have_orbit=no; +fi + +AM_CONDITIONAL(HAVE_ORBIT, test x$have_orbit = xyes) + +dnl GLib flags +AC_SUBST(GCONF_ORBIT_CFLAGS) +AC_SUBST(GCONF_ORBIT_LIBS) + dnl NOTE: We need to use a separate automake conditional for this dnl to make this work with the tarballs. AM_CONDITIONAL(ENABLE_GTK_DOC, test x$enable_gtk_doc = xyes) -PKGCONFIG_MODULES='gmodule-2.0 >= 2.2.0 gobject-2.0 >= 2.2.0 ORBit-2.0 >= 2.4.0 linc >= 0.5.0 dbus-glib-1.0 >= 0.5' +PKGCONFIG_MODULES='gmodule-2.0 >= 2.2.0 gobject-2.0 >= 2.2.0 dbus-glib-1.0 >= 0.5' PKGCONFIG_MODULES_WITH_XML="$PKGCONFIG_MODULES libxml-2.0" PKGCONFIG_MODULES_WITH_GTK=" $PKGCONFIG_MODULES gtk+-2.0 >= 2.0.0" PKGCONFIG_MODULES_WITH_XML_AND_GTK=" $PKGCONFIG_MODULES gtk+-2.0 libxml-2.0" @@ -274,9 +302,6 @@ AM_CONDITIONAL(BDB, test -n "$BDB_LIBS") AC_SUBST(BDB_LIBS) AC_SUBST(BDB_CFLAGS) -ORBIT_IDL="`$PKG_CONFIG --variable=orbit_idl ORBit-2.0`" -AC_SUBST(ORBIT_IDL) - AC_CHECK_LIB(popt, poptGetArg, POPT_LIBS=-lpopt, [AC_CHECK_HEADER(popt.h, , AC_MSG_ERROR([[ *** Couldn't find popt. Please download and install from diff --git a/gconf/Makefile.am b/gconf/Makefile.am index 9febd027..67d9b8ec 100644 --- a/gconf/Makefile.am +++ b/gconf/Makefile.am @@ -33,7 +33,11 @@ lib_LTLIBRARIES = libgconf-2.la bin_PROGRAMS = gconftool-2 libexec_PROGRAMS = gconfd-2 $(SANITY_CHECK) +if HAVE_ORBIT CORBA_SOURCECODE = GConfX-common.c GConfX-skels.c GConfX-stubs.c GConfX.h +else +CORBA_SOURCECODE = +endif noinst_PROGRAMS = simple-test ## not BUILT_SOURCES which seems to make a mess. fix with automake 1.5? diff --git a/gconf/gconf-internals.c b/gconf/gconf-internals.c index 189beb66..eabbaa34 100644 --- a/gconf/gconf-internals.c +++ b/gconf/gconf-internals.c @@ -149,487 +149,6 @@ gconf_file_test(const gchar* filename, int test) return TRUE; } -GConfValue* -gconf_value_from_corba_value(const ConfigValue* value) -{ - GConfValue* gval; - GConfValueType type = GCONF_VALUE_INVALID; - - switch (value->_d) - { - case InvalidVal: - return NULL; - break; - case IntVal: - type = GCONF_VALUE_INT; - break; - case StringVal: - type = GCONF_VALUE_STRING; - break; - case FloatVal: - type = GCONF_VALUE_FLOAT; - break; - case BoolVal: - type = GCONF_VALUE_BOOL; - break; - case SchemaVal: - type = GCONF_VALUE_SCHEMA; - break; - case ListVal: - type = GCONF_VALUE_LIST; - break; - case PairVal: - type = GCONF_VALUE_PAIR; - break; - default: - gconf_log(GCL_DEBUG, "Invalid type in %s", G_GNUC_FUNCTION); - return NULL; - } - - g_assert(GCONF_VALUE_TYPE_VALID(type)); - - gval = gconf_value_new(type); - - switch (gval->type) - { - case GCONF_VALUE_INT: - gconf_value_set_int(gval, value->_u.int_value); - break; - case GCONF_VALUE_STRING: - if (!g_utf8_validate (value->_u.string_value, -1, NULL)) - { - gconf_log (GCL_ERR, _("Invalid UTF-8 in string value in '%s'"), - value->_u.string_value); - } - else - { - gconf_value_set_string(gval, value->_u.string_value); - } - break; - case GCONF_VALUE_FLOAT: - gconf_value_set_float(gval, value->_u.float_value); - break; - case GCONF_VALUE_BOOL: - gconf_value_set_bool(gval, value->_u.bool_value); - break; - case GCONF_VALUE_SCHEMA: - gconf_value_set_schema_nocopy(gval, - gconf_schema_from_corba_schema(&(value->_u.schema_value))); - break; - case GCONF_VALUE_LIST: - { - GSList* list = NULL; - guint i = 0; - - switch (value->_u.list_value.list_type) - { - case BIntVal: - gconf_value_set_list_type(gval, GCONF_VALUE_INT); - break; - case BBoolVal: - gconf_value_set_list_type(gval, GCONF_VALUE_BOOL); - break; - case BFloatVal: - gconf_value_set_list_type(gval, GCONF_VALUE_FLOAT); - break; - case BStringVal: - gconf_value_set_list_type(gval, GCONF_VALUE_STRING); - break; - case BInvalidVal: - break; - default: - g_warning("Bizarre list type in %s", G_GNUC_FUNCTION); - break; - } - - if (gconf_value_get_list_type(gval) != GCONF_VALUE_INVALID) - { - i = 0; - while (i < value->_u.list_value.seq._length) - { - GConfValue* val; - - /* This is a bit dubious; we cast a ConfigBasicValue to ConfigValue - because they have the same initial members, but by the time - the CORBA and C specs kick in, not sure we are guaranteed - to be able to do this. - */ - val = gconf_value_from_corba_value((ConfigValue*)&value->_u.list_value.seq._buffer[i]); - - if (val == NULL) - gconf_log(GCL_ERR, _("Couldn't interpret CORBA value for list element")); - else if (val->type != gconf_value_get_list_type(gval)) - gconf_log(GCL_ERR, _("Incorrect type for list element in %s"), G_GNUC_FUNCTION); - else - list = g_slist_prepend(list, val); - - ++i; - } - - list = g_slist_reverse(list); - - gconf_value_set_list_nocopy(gval, list); - } - else - { - gconf_log(GCL_ERR, _("Received list from gconfd with a bad list type")); - } - } - break; - case GCONF_VALUE_PAIR: - { - g_return_val_if_fail(value->_u.pair_value._length == 2, gval); - - gconf_value_set_car_nocopy(gval, - gconf_value_from_corba_value((ConfigValue*)&value->_u.list_value.seq._buffer[0])); - - gconf_value_set_cdr_nocopy(gval, - gconf_value_from_corba_value((ConfigValue*)&value->_u.list_value.seq._buffer[1])); - } - break; - default: - g_assert_not_reached(); - break; - } - - return gval; -} - -void -gconf_fill_corba_value_from_gconf_value(const GConfValue *value, - ConfigValue *cv) -{ - if (value == NULL) - { - cv->_d = InvalidVal; - return; - } - - switch (value->type) - { - case GCONF_VALUE_INT: - cv->_d = IntVal; - cv->_u.int_value = gconf_value_get_int(value); - break; - case GCONF_VALUE_STRING: - cv->_d = StringVal; - cv->_u.string_value = CORBA_string_dup((char*)gconf_value_get_string(value)); - break; - case GCONF_VALUE_FLOAT: - cv->_d = FloatVal; - cv->_u.float_value = gconf_value_get_float(value); - break; - case GCONF_VALUE_BOOL: - cv->_d = BoolVal; - cv->_u.bool_value = gconf_value_get_bool(value); - break; - case GCONF_VALUE_SCHEMA: - cv->_d = SchemaVal; - gconf_fill_corba_schema_from_gconf_schema (gconf_value_get_schema(value), - &cv->_u.schema_value); - break; - case GCONF_VALUE_LIST: - { - guint n, i; - GSList* list; - - cv->_d = ListVal; - - list = gconf_value_get_list(value); - - n = g_slist_length(list); - - cv->_u.list_value.seq._buffer = - CORBA_sequence_ConfigBasicValue_allocbuf(n); - cv->_u.list_value.seq._length = n; - cv->_u.list_value.seq._maximum = n; - CORBA_sequence_set_release(&cv->_u.list_value.seq, TRUE); - - switch (gconf_value_get_list_type(value)) - { - case GCONF_VALUE_INT: - cv->_u.list_value.list_type = BIntVal; - break; - - case GCONF_VALUE_BOOL: - cv->_u.list_value.list_type = BBoolVal; - break; - - case GCONF_VALUE_STRING: - cv->_u.list_value.list_type = BStringVal; - break; - - case GCONF_VALUE_FLOAT: - cv->_u.list_value.list_type = BFloatVal; - break; - - case GCONF_VALUE_SCHEMA: - cv->_u.list_value.list_type = BSchemaVal; - break; - - default: - cv->_u.list_value.list_type = BInvalidVal; - gconf_log(GCL_DEBUG, "Invalid list type in %s", G_GNUC_FUNCTION); - break; - } - - i= 0; - while (list != NULL) - { - /* That dubious ConfigBasicValue->ConfigValue cast again */ - gconf_fill_corba_value_from_gconf_value((GConfValue*)list->data, - (ConfigValue*)&cv->_u.list_value.seq._buffer[i]); - - list = g_slist_next(list); - ++i; - } - } - break; - case GCONF_VALUE_PAIR: - { - cv->_d = PairVal; - - cv->_u.pair_value._buffer = - CORBA_sequence_ConfigBasicValue_allocbuf(2); - cv->_u.pair_value._length = 2; - cv->_u.pair_value._maximum = 2; - CORBA_sequence_set_release(&cv->_u.pair_value, TRUE); - - /* dubious cast */ - gconf_fill_corba_value_from_gconf_value (gconf_value_get_car(value), - (ConfigValue*)&cv->_u.pair_value._buffer[0]); - gconf_fill_corba_value_from_gconf_value(gconf_value_get_cdr(value), - (ConfigValue*)&cv->_u.pair_value._buffer[1]); - } - break; - - case GCONF_VALUE_INVALID: - cv->_d = InvalidVal; - break; - default: - cv->_d = InvalidVal; - gconf_log(GCL_DEBUG, "Unknown type in %s", G_GNUC_FUNCTION); - break; - } -} - -ConfigValue* -gconf_corba_value_from_gconf_value (const GConfValue* value) -{ - ConfigValue* cv; - - cv = ConfigValue__alloc(); - - gconf_fill_corba_value_from_gconf_value(value, cv); - - return cv; -} - -ConfigValue* -gconf_invalid_corba_value () -{ - ConfigValue* cv; - - cv = ConfigValue__alloc(); - - cv->_d = InvalidVal; - - return cv; -} - -gchar* -gconf_object_to_string (CORBA_Object obj, - GError **err) -{ - CORBA_Environment ev; - gchar *ior; - gchar *retval; - - CORBA_exception_init (&ev); - - ior = CORBA_ORB_object_to_string (gconf_orb_get (), obj, &ev); - - if (ior == NULL) - { - gconf_set_error (err, - GCONF_ERROR_FAILED, - _("Failed to convert object to IOR")); - - return NULL; - } - - retval = g_strdup (ior); - - CORBA_free (ior); - - return retval; -} - -static ConfigValueType -corba_type_from_gconf_type(GConfValueType type) -{ - switch (type) - { - case GCONF_VALUE_INT: - return IntVal; - case GCONF_VALUE_BOOL: - return BoolVal; - case GCONF_VALUE_FLOAT: - return FloatVal; - case GCONF_VALUE_INVALID: - return InvalidVal; - case GCONF_VALUE_STRING: - return StringVal; - case GCONF_VALUE_SCHEMA: - return SchemaVal; - case GCONF_VALUE_LIST: - return ListVal; - case GCONF_VALUE_PAIR: - return PairVal; - default: - g_assert_not_reached(); - return InvalidVal; - } -} - -static GConfValueType -gconf_type_from_corba_type(ConfigValueType type) -{ - switch (type) - { - case InvalidVal: - return GCONF_VALUE_INVALID; - case StringVal: - return GCONF_VALUE_STRING; - case IntVal: - return GCONF_VALUE_INT; - case FloatVal: - return GCONF_VALUE_FLOAT; - case SchemaVal: - return GCONF_VALUE_SCHEMA; - case BoolVal: - return GCONF_VALUE_BOOL; - case ListVal: - return GCONF_VALUE_LIST; - case PairVal: - return GCONF_VALUE_PAIR; - default: - g_assert_not_reached(); - return GCONF_VALUE_INVALID; - } -} - -void -gconf_fill_corba_schema_from_gconf_schema(const GConfSchema *sc, - ConfigSchema *cs) -{ - cs->value_type = corba_type_from_gconf_type (gconf_schema_get_type (sc)); - cs->value_list_type = corba_type_from_gconf_type (gconf_schema_get_list_type (sc)); - cs->value_car_type = corba_type_from_gconf_type (gconf_schema_get_car_type (sc)); - cs->value_cdr_type = corba_type_from_gconf_type (gconf_schema_get_cdr_type (sc)); - - cs->locale = CORBA_string_dup (gconf_schema_get_locale (sc) ? gconf_schema_get_locale (sc) : ""); - cs->short_desc = CORBA_string_dup (gconf_schema_get_short_desc (sc) ? gconf_schema_get_short_desc (sc) : ""); - cs->long_desc = CORBA_string_dup (gconf_schema_get_long_desc (sc) ? gconf_schema_get_long_desc (sc) : ""); - cs->owner = CORBA_string_dup (gconf_schema_get_owner (sc) ? gconf_schema_get_owner (sc) : ""); - - { - gchar* encoded; - GConfValue* default_val; - - default_val = gconf_schema_get_default_value (sc); - - if (default_val) - { - encoded = gconf_value_encode (default_val); - - g_assert (encoded != NULL); - - cs->encoded_default_value = CORBA_string_dup (encoded); - - g_free (encoded); - } - else - cs->encoded_default_value = CORBA_string_dup (""); - } -} - -ConfigSchema* -gconf_corba_schema_from_gconf_schema (const GConfSchema* sc) -{ - ConfigSchema* cs; - - cs = ConfigSchema__alloc (); - - gconf_fill_corba_schema_from_gconf_schema (sc, cs); - - return cs; -} - -GConfSchema* -gconf_schema_from_corba_schema(const ConfigSchema* cs) -{ - GConfSchema* sc; - GConfValueType type = GCONF_VALUE_INVALID; - GConfValueType list_type = GCONF_VALUE_INVALID; - GConfValueType car_type = GCONF_VALUE_INVALID; - GConfValueType cdr_type = GCONF_VALUE_INVALID; - - type = gconf_type_from_corba_type(cs->value_type); - list_type = gconf_type_from_corba_type(cs->value_list_type); - car_type = gconf_type_from_corba_type(cs->value_car_type); - cdr_type = gconf_type_from_corba_type(cs->value_cdr_type); - - sc = gconf_schema_new(); - - gconf_schema_set_type(sc, type); - gconf_schema_set_list_type(sc, list_type); - gconf_schema_set_car_type(sc, car_type); - gconf_schema_set_cdr_type(sc, cdr_type); - - if (*cs->locale != '\0') - { - if (!g_utf8_validate (cs->locale, -1, NULL)) - gconf_log (GCL_ERR, _("Invalid UTF-8 in locale for schema")); - else - gconf_schema_set_locale(sc, cs->locale); - } - - if (*cs->short_desc != '\0') - { - if (!g_utf8_validate (cs->short_desc, -1, NULL)) - gconf_log (GCL_ERR, _("Invalid UTF-8 in short description for schema")); - else - gconf_schema_set_short_desc(sc, cs->short_desc); - } - - if (*cs->long_desc != '\0') - { - if (!g_utf8_validate (cs->long_desc, -1, NULL)) - gconf_log (GCL_ERR, _("Invalid UTF-8 in long description for schema")); - else - gconf_schema_set_long_desc(sc, cs->long_desc); - } - - if (*cs->owner != '\0') - { - if (!g_utf8_validate (cs->owner, -1, NULL)) - gconf_log (GCL_ERR, _("Invalid UTF-8 in owner for schema")); - else - gconf_schema_set_owner(sc, cs->owner); - } - - { - GConfValue* val; - - val = gconf_value_decode(cs->encoded_default_value); - - if (val) - gconf_schema_set_default_value_nocopy(sc, val); - } - - return sc; -} const gchar* gconf_value_type_to_string(GConfValueType type) @@ -2387,197 +1906,6 @@ open_empty_locked_file (const gchar *directory, return fd; } -static ConfigServer -read_current_server_and_set_warning (const gchar *iorfile, - GString *warning) -{ - FILE *fp; - - fp = fopen (iorfile, "r"); - - if (fp == NULL) - { - if (warning) - g_string_append_printf (warning, - _("IOR file '%s' not opened successfully, no gconfd located: %s"), - iorfile, g_strerror (errno)); - - return CORBA_OBJECT_NIL; - } - else /* successfully opened IOR file */ - { - char buf[2048] = { '\0' }; - const char *str = NULL; - - fgets (buf, sizeof (buf) - 2, fp); - fclose (fp); - - /* The lockfile format is <pid>:<ior> for gconfd - * or <pid>:none for gconftool - */ - str = buf; - while (isdigit(*str)) - ++str; - - if (*str == ':') - ++str; - - if (str[0] == 'n' && - str[1] == 'o' && - str[2] == 'n' && - str[3] == 'e') - { - if (warning) - g_string_append_printf (warning, - _("gconftool or other non-gconfd process has the lock file '%s'"), - iorfile); - } - else /* file contains daemon IOR */ - { - CORBA_ORB orb; - CORBA_Environment ev; - ConfigServer server; - - CORBA_exception_init (&ev); - - orb = gconf_orb_get (); - - if (orb == NULL) - { - if (warning) - g_string_append_printf (warning, - _("couldn't contact ORB to resolve existing gconfd object reference")); - return CORBA_OBJECT_NIL; - } - - server = CORBA_ORB_string_to_object (orb, (char*) str, &ev); - CORBA_exception_free (&ev); - - if (server == CORBA_OBJECT_NIL && - warning) - g_string_append_printf (warning, - _("Failed to convert IOR '%s' to an object reference"), - str); - - return server; - } - - return CORBA_OBJECT_NIL; - } -} - -static ConfigServer -read_current_server (const gchar *iorfile, - gboolean warn_if_fail) -{ - GString *warning; - ConfigServer server; - - if (warn_if_fail) - warning = g_string_new (NULL); - else - warning = NULL; - - server = read_current_server_and_set_warning (iorfile, warning); - - if (warning->len > 0) - gconf_log (GCL_WARNING, "%s", warning->str); - - g_string_free (warning, TRUE); - - return server; -} - -GConfLock* -gconf_get_lock_or_current_holder (const gchar *lock_directory, - ConfigServer *current_server, - GError **err) -{ - ConfigServer server; - GConfLock* lock; - - g_return_val_if_fail(lock_directory != NULL, NULL); - - if (current_server) - *current_server = CORBA_OBJECT_NIL; - - if (mkdir (lock_directory, 0700) < 0 && - errno != EEXIST) - { - gconf_set_error (err, - GCONF_ERROR_LOCK_FAILED, - _("couldn't create directory `%s': %s"), - lock_directory, g_strerror (errno)); - - return NULL; - } - - server = CORBA_OBJECT_NIL; - - lock = g_new0 (GConfLock, 1); - - lock->lock_directory = g_strdup (lock_directory); - - lock->iorfile = g_strconcat (lock->lock_directory, "/ior", NULL); - - /* Check the current IOR file and ping its daemon */ - - lock->lock_fd = open_empty_locked_file (lock->lock_directory, - lock->iorfile, - err); - - if (lock->lock_fd < 0) - { - /* We didn't get the lock. Read the old server, and provide - * it to the caller. Error is already set. - */ - if (current_server) - *current_server = read_current_server (lock->iorfile, TRUE); - - gconf_lock_destroy (lock); - - return NULL; - } - else - { - /* Write IOR to lockfile */ - const gchar* ior; - int retval; - gchar* s; - - s = g_strdup_printf ("%u:", (guint) getpid ()); - - retval = write (lock->lock_fd, s, strlen (s)); - - g_free (s); - - if (retval >= 0) - { - ior = gconf_get_daemon_ior(); - - if (ior == NULL) - retval = write (lock->lock_fd, "none", 4); - else - retval = write (lock->lock_fd, ior, strlen (ior)); - } - - if (retval < 0) - { - gconf_set_error (err, - GCONF_ERROR_LOCK_FAILED, - _("Can't write to file `%s': %s"), - lock->iorfile, g_strerror (errno)); - - unlink (lock->iorfile); - gconf_lock_destroy (lock); - - return NULL; - } - } - - return lock; -} - GConfLock* gconf_get_lock (const gchar *lock_directory, GError **err) @@ -2687,73 +2015,6 @@ gconf_release_lock (GConfLock *lock, return retval; } -/* This function doesn't try to see if the lock is valid or anything - * of the sort; it just reads it. It does do the object_to_string - */ -ConfigServer -gconf_get_current_lock_holder (const gchar *lock_directory, - GString *failure_log) -{ - char *iorfile; - ConfigServer server; - - iorfile = g_strconcat (lock_directory, "/ior", NULL); - server = read_current_server_and_set_warning (iorfile, failure_log); - g_free (iorfile); - return server; -} - -static CORBA_ORB gconf_orb = CORBA_OBJECT_NIL; - -CORBA_ORB -gconf_orb_get (void) -{ - if (gconf_orb == CORBA_OBJECT_NIL) - { - CORBA_Environment ev; - int argc = 1; - char *argv[] = { "gconf", NULL }; - - _gconf_init_i18n (); - - CORBA_exception_init (&ev); - - gconf_orb = CORBA_ORB_init (&argc, argv, "orbit-local-orb", &ev); - g_assert (ev._major == CORBA_NO_EXCEPTION); - - CORBA_exception_free (&ev); - } - - return gconf_orb; -} - -int -gconf_orb_release (void) -{ - int ret = 0; - - if (gconf_orb != CORBA_OBJECT_NIL) - { - CORBA_ORB orb = gconf_orb; - CORBA_Environment ev; - - gconf_orb = CORBA_OBJECT_NIL; - - CORBA_exception_init (&ev); - - CORBA_ORB_destroy (orb, &ev); - CORBA_Object_release ((CORBA_Object)orb, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) - { - ret = 1; - } - CORBA_exception_free (&ev); - } - - return ret; -} - char* gconf_get_daemon_dir (void) { @@ -2773,29 +2034,6 @@ gconf_get_lock_dir (void) return lock_dir; } -static void -set_cloexec (gint fd) -{ - fcntl (fd, F_SETFD, FD_CLOEXEC); -} - -static void -close_fd_func (gpointer data) -{ - int *pipes = data; - - gint open_max; - gint i; - - open_max = sysconf (_SC_OPEN_MAX); - for (i = 3; i < open_max; i++) - { - /* don't close our write pipe */ - if (i != pipes[1]) - set_cloexec (i); - } -} - gboolean gconf_activate_server (DBusConnection *connection, gboolean start_if_not_found, @@ -2812,8 +2050,6 @@ gconf_activate_server (DBusConnection *connection, if (!dbus_message_get_is_error (reply)) return TRUE; - printf ("woohoo: %d\n", start_if_not_found); - if (start_if_not_found) { message = dbus_message_new (DBUS_SERVICE_DBUS, @@ -2849,154 +2085,6 @@ gconf_activate_server (DBusConnection *connection, } return FALSE; - -#ifdef GCONF_CORBA_BROKEN - ConfigServer server; - int p[2] = { -1, -1 }; - char buf[1]; - GError *tmp_err; - char *argv[3]; - char *gconfd_dir; - char *lock_dir; - GString *failure_log; - CORBA_Environment ev; - - failure_log = g_string_new (NULL); - - gconfd_dir = gconf_get_daemon_dir (); - - if (mkdir (gconfd_dir, 0700) < 0 && errno != EEXIST) - gconf_log (GCL_WARNING, _("Failed to create %s: %s"), - gconfd_dir, g_strerror (errno)); - - g_free (gconfd_dir); - - g_string_append (failure_log, " 1: "); - lock_dir = gconf_get_lock_dir (); - server = gconf_get_current_lock_holder (lock_dir, failure_log); - g_free (lock_dir); - - /* Confirm server exists */ - CORBA_exception_init (&ev); - - if (!CORBA_Object_is_nil (server, &ev)) - { - ConfigServer_ping (server, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) - { - server = CORBA_OBJECT_NIL; - - g_string_append_printf (failure_log, - _("Server ping error: %s"), - CORBA_exception_id (&ev)); - } - } - - CORBA_exception_free (&ev); - - if (server != CORBA_OBJECT_NIL) - { - g_string_free (failure_log, TRUE); - return server; - } - - if (start_if_not_found) - { - /* Spawn server */ - if (pipe (p) < 0) - { - g_set_error (error, - GCONF_ERROR, - GCONF_ERROR_NO_SERVER, - _("Failed to create pipe for communicating with spawned gconf daemon: %s\n"), - g_strerror (errno)); - goto out; - } - - argv[0] = g_strconcat (GCONF_SERVERDIR, "/" GCONFD, NULL); - argv[1] = g_strdup_printf ("%d", p[1]); - argv[2] = NULL; - - tmp_err = NULL; - if (!g_spawn_async (NULL, - argv, - NULL, - G_SPAWN_LEAVE_DESCRIPTORS_OPEN, - close_fd_func, - p, - NULL, - &tmp_err)) - { - g_free (argv[0]); - g_free (argv[1]); - g_set_error (error, - GCONF_ERROR, - GCONF_ERROR_NO_SERVER, - _("Failed to launch configuration server: %s\n"), - tmp_err->message); - g_error_free (tmp_err); - goto out; - } - - g_free (argv[0]); - g_free (argv[1]); - - /* Block until server starts up */ - read (p[0], buf, 1); - - g_string_append (failure_log, " 2: "); - lock_dir = gconf_get_lock_dir (); - server = gconf_get_current_lock_holder (lock_dir, failure_log); - g_free (lock_dir); - } - - out: - if (server == CORBA_OBJECT_NIL && - error && - *error == NULL) - g_set_error (error, - GCONF_ERROR, - GCONF_ERROR_NO_SERVER, - _("Failed to contact configuration server; some possible causes are that you need to enable TCP/IP networking for ORBit, or you have stale NFS locks due to a system crash. See http://www.gnome.org/projects/gconf/ for information. (Details - %s)"), - failure_log->len > 0 ? failure_log->str : _("none")); - - g_string_free (failure_log, TRUE); - - close (p[0]); - close (p[1]); - - return server; -#endif -} - -gboolean -gconf_CORBA_Object_equal (gconstpointer a, gconstpointer b) -{ - CORBA_Environment ev; - CORBA_Object _obj_a = (gpointer)a; - CORBA_Object _obj_b = (gpointer)b; - gboolean retval; - - CORBA_exception_init (&ev); - retval = CORBA_Object_is_equivalent(_obj_a, _obj_b, &ev); - CORBA_exception_free (&ev); - - return retval; -} - -guint -gconf_CORBA_Object_hash (gconstpointer key) -{ - CORBA_Environment ev; - CORBA_Object _obj = (gpointer)key; - CORBA_unsigned_long retval; - - CORBA_exception_init (&ev); - retval = CORBA_Object_hash(_obj, G_MAXUINT, &ev); - CORBA_exception_free (&ev); - - return retval; } void diff --git a/gconf/gconf-internals.h b/gconf/gconf-internals.h index 8fe2dc81..f72f3ecf 100644 --- a/gconf/gconf-internals.h +++ b/gconf/gconf-internals.h @@ -37,8 +37,8 @@ #include "gconf-value.h" #include "gconf-engine.h" #include "gconf-sources.h" -#include "GConfX.h" #include "gconf-dbus.h" + gchar* gconf_key_directory (const gchar* key); const gchar* gconf_key_key (const gchar* key); @@ -53,20 +53,6 @@ enum { gboolean gconf_file_test (const gchar* filename, int test); gboolean gconf_file_exists (const gchar* filename); -GConfValue* gconf_value_from_corba_value (const ConfigValue *value); -ConfigValue* gconf_corba_value_from_gconf_value (const GConfValue *value); -void gconf_fill_corba_value_from_gconf_value (const GConfValue *value, - ConfigValue *dest); -ConfigValue* gconf_invalid_corba_value (void); - -void gconf_fill_corba_schema_from_gconf_schema (const GConfSchema *sc, - ConfigSchema *dest); -ConfigSchema* gconf_corba_schema_from_gconf_schema (const GConfSchema *sc); -GConfSchema* gconf_schema_from_corba_schema (const ConfigSchema *cs); - -gchar* gconf_object_to_string (CORBA_Object obj, - GError **err); - const gchar* gconf_value_type_to_string (GConfValueType type); GConfValueType gconf_value_type_from_string (const gchar *str); @@ -173,9 +159,6 @@ gboolean gconf_in_daemon_mode (void); void gconf_set_daemon_ior (const gchar *ior); const gchar* gconf_get_daemon_ior (void); -/* Returns TRUE if there was an error, frees exception, sets err */ -gboolean gconf_handle_oaf_exception (CORBA_Environment* ev, GError** err); - void gconf_nanosleep (gulong useconds); typedef struct _GConfLock GConfLock; @@ -184,12 +167,13 @@ GConfLock* gconf_get_lock (const gchar *lock_directory, GError **err); gboolean gconf_release_lock (GConfLock *lock, GError **err); +#if 0 GConfLock* gconf_get_lock_or_current_holder (const gchar *lock_directory, ConfigServer *current_server, GError **err); ConfigServer gconf_get_current_lock_holder (const gchar *lock_directory, GString *failure_log); - +#endif GError* gconf_error_new (GConfError en, const gchar* format, ...) G_GNUC_PRINTF (2, 3); @@ -200,8 +184,6 @@ void gconf_set_error (GError** err, /* merge two errors into a single message */ GError* gconf_compose_errors (GError* err1, GError* err2); -CORBA_ORB gconf_orb_get (void); - gboolean gconf_activate_server (DBusConnection *connection, gboolean start_if_not_found, GError **error); diff --git a/gconf/gconf.c b/gconf/gconf.c index 00fc8c10..c77cc555 100644 --- a/gconf/gconf.c +++ b/gconf/gconf.c @@ -18,7 +18,6 @@ */ #include <popt.h> -#include "GConfX.h" #include "gconf.h" #include "gconf-dbus.h" #include "gconf-internals.h" @@ -117,7 +116,7 @@ static GConfEngine *default_engine = NULL; static GConfCnxn* gconf_cnxn_new (GConfEngine *conf, const gchar *namespace_section, - CORBA_unsigned_long server_id, + guint server_id, GConfNotifyFunc func, gpointer user_data); static void gconf_cnxn_destroy (GConfCnxn *cnxn); @@ -128,10 +127,6 @@ static void gconf_cnxn_notify (GConfCnxn *cnxn, static gboolean gconf_get_config_server (gboolean start_if_not_found, GError **err); -/* Forget our current server object reference, so the next call to - gconf_get_config_server will have to try to respawn the server */ -static ConfigListener gconf_get_config_listener (void); - static void gconf_engine_detach (GConfEngine *conf); static gboolean gconf_engine_connect (GConfEngine *conf, gboolean start_if_not_found, @@ -536,9 +531,6 @@ gconf_engine_unref(GConfEngine* conf) /* Remove all connections associated with this GConf */ GSList* removed; GSList* tmp; - CORBA_Environment ev; - - CORBA_exception_init(&ev); /* FIXME CnxnTable only has entries for this GConfEngine now, * it used to be global and shared among GConfEngine objects. @@ -2124,7 +2116,7 @@ gconf_engine_key_is_writable (GConfEngine *conf, static GConfCnxn* gconf_cnxn_new(GConfEngine* conf, const gchar* namespace_section, - CORBA_unsigned_long server_id, + guint server_id, GConfNotifyFunc func, gpointer user_data) { @@ -2161,12 +2153,6 @@ gconf_cnxn_notify(GConfCnxn* cnxn, cnxn->user_data); } -/* - * CORBA glue - */ - -static ConfigServer server = CORBA_OBJECT_NIL; - /* errors in here should be GCONF_ERROR_NO_SERVER */ static gboolean try_to_contact_server (gboolean start_if_not_found, @@ -2176,36 +2162,10 @@ try_to_contact_server (gboolean start_if_not_found, daemon_running = gconf_activate_server (dbus_conn, start_if_not_found, err); -#ifdef GCONF_CORBA_BROKEN - /* Try to ping server, by adding ourselves as a client */ - CORBA_exception_init (&ev); - - - if (!CORBA_Object_is_nil (server, &ev)) - { - ConfigServer_add_client (server, - gconf_get_config_listener (), - &ev); - if (ev._major != CORBA_NO_EXCEPTION) - { - g_set_error (err, - GCONF_ERROR, - GCONF_ERROR_NO_SERVER, - _("Adding client to server's list failed, CORBA error: %s"), - CORBA_exception_id (&ev)); - - CORBA_Object_release (server, &ev); - server = CORBA_OBJECT_NIL; - CORBA_exception_free(&ev); - } - } - #ifdef GCONF_ENABLE_DEBUG if (!daemon_running && start_if_not_found) g_return_val_if_fail (err == NULL || *err != NULL, daemon_running); #endif - -#endif return daemon_running; } @@ -2215,8 +2175,6 @@ try_to_contact_server (gboolean start_if_not_found, static gboolean gconf_get_config_server(gboolean start_if_not_found, GError** err) { - gboolean retval; - g_return_val_if_fail(err == NULL || *err == NULL, daemon_running); if (daemon_running) @@ -2227,36 +2185,9 @@ gconf_get_config_server(gboolean start_if_not_found, GError** err) return daemon_running; /* return what we have */ } -ConfigListener listener = CORBA_OBJECT_NIL; - void gconf_detach_config_server(void) { - CORBA_Environment ev; - - CORBA_exception_init(&ev); - - if (listener != CORBA_OBJECT_NIL) - { - CORBA_Object_release(listener, &ev); - listener = CORBA_OBJECT_NIL; - } - - if (server != CORBA_OBJECT_NIL) - { - CORBA_Object_release(server, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) - { - g_warning("Exception releasing gconfd server object: %s", - CORBA_exception_id(&ev)); - } - - server = CORBA_OBJECT_NIL; - } - - CORBA_exception_free(&ev); - if (engines_by_db != NULL) { g_hash_table_destroy (engines_by_db); @@ -2276,225 +2207,9 @@ gconf_debug_shutdown (void) { gconf_detach_config_server (); - return gconf_orb_release (); -} - -#ifdef GCONF_CORBA_BROKEN -static void notify (PortableServer_Servant servant, - ConfigDatabase db, - CORBA_unsigned_long cnxn, - const CORBA_char *key, - const ConfigValue *value, - CORBA_boolean is_default, - CORBA_boolean is_writable, - CORBA_Environment *ev); -static void ping (PortableServer_Servant _servant, - CORBA_Environment *ev); -static void update_listener (PortableServer_Servant _servant, - ConfigDatabase db, - const CORBA_char *address, - const CORBA_unsigned_long old_cnxn, - const CORBA_char *key, - const CORBA_unsigned_long new_cnxn, - CORBA_Environment *ev); -static void invalidate_cached_values(PortableServer_Servant _servant, - ConfigDatabase database, - const ConfigListener_KeyList *keys, - CORBA_Environment *ev); -static void drop_all_caches (PortableServer_Servant _servant, - CORBA_Environment *ev); - - - -static PortableServer_ServantBase__epv base_epv = { - NULL, - NULL, - NULL -}; - -static POA_ConfigListener__epv listener_epv = { - NULL, - notify, - ping, - update_listener, - invalidate_cached_values, - drop_all_caches -}; - -static POA_ConfigListener__vepv poa_listener_vepv = { &base_epv, &listener_epv }; -static POA_ConfigListener poa_listener_servant = { NULL, &poa_listener_vepv }; - -static void -notify(PortableServer_Servant servant, - ConfigDatabase db, - CORBA_unsigned_long server_id, - const CORBA_char* key, - const ConfigValue* value, - CORBA_boolean is_default, - CORBA_boolean is_writable, - CORBA_Environment *ev) -{ - GConfCnxn* cnxn; - GConfValue* gvalue; - GConfEngine* conf; - GConfEntry* entry; - - conf = lookup_engine_by_database (db); - - if (conf == NULL) - { -#ifdef GCONF_ENABLE_DEBUG - g_warning ("Client received notify for unknown database object"); -#endif - return; - } - - cnxn = ctable_lookup_by_server_id(conf->ctable, server_id); - - if (cnxn == NULL) - { -#ifdef GCONF_ENABLE_DEBUG - g_warning("Client received notify for unknown connection ID %u", - (guint)server_id); -#endif - return; - } - - gvalue = gconf_value_from_corba_value(value); - - entry = gconf_entry_new_nocopy (g_strdup (key), - gvalue); - gconf_entry_set_is_default (entry, is_default); - gconf_entry_set_is_writable (entry, is_writable); - - gconf_cnxn_notify(cnxn, entry); - - gconf_entry_free (entry); -} - -static void -ping (PortableServer_Servant _servant, CORBA_Environment * ev) -{ - /* This one is easy :-) */ - - return; -} - -static void -update_listener (PortableServer_Servant _servant, - ConfigDatabase db, - const CORBA_char *address, - const CORBA_unsigned_long old_cnxn_id, - const CORBA_char *key, - const CORBA_unsigned_long new_cnxn_id, - CORBA_Environment *ev_ignored) -{ - GConfCnxn* cnxn; - GConfEngine* conf; - CORBA_Environment ev; - - conf = lookup_engine_by_database (db); - - /* See if we have an old engine with a now-invalid object - reference, and update its reference. */ - if (conf == NULL) - { - CORBA_exception_init (&ev); - - if (strcmp (address, "def") == 0) - conf = default_engine; - else - conf = lookup_engine (address); - - if (conf) - gconf_engine_set_database (conf, - CORBA_Object_duplicate (db, &ev)); - } - - if (conf == NULL) - { -#ifdef GCONF_ENABLE_DEBUG - g_warning("Client received listener update for unknown database " - "(this is not a big deal, this warning only appears if GConf is compiled with debugging)"); -#endif - return; - } - - cnxn = ctable_lookup_by_server_id (conf->ctable, old_cnxn_id); - - if (cnxn == NULL) - { -#ifdef GCONF_ENABLE_DEBUG - g_warning("Client received listener update for unknown listener ID %u " - "(this is not a big deal, this warning only appears if GConf is compiled with debugging)", - (guint)old_cnxn_id); -#endif - return; - } - - ctable_reinstall (conf->ctable, cnxn, old_cnxn_id, new_cnxn_id); + return 1; } -static void -invalidate_cached_values (PortableServer_Servant _servant, - ConfigDatabase database, - const ConfigListener_KeyList *keys, - CORBA_Environment *ev) -{ -#if 0 - g_warning ("FIXME process %d received request to invalidate some cached GConf values from the server, but right now we don't know how to do that (not implemented).", (int) getpid()); -#endif -} - -static void -drop_all_caches (PortableServer_Servant _servant, - CORBA_Environment *ev) -{ -#if 0 - g_warning ("FIXME process %d received request to invalidate all cached GConf values from the server, but right now we don't know how to do that (not implemented).", (int) getpid()); -#endif -} - -static ConfigListener -gconf_get_config_listener(void) -{ - if (listener == CORBA_OBJECT_NIL) - { - CORBA_Environment ev; - PortableServer_POA poa; - PortableServer_POAManager poa_mgr; - - CORBA_exception_init (&ev); - POA_ConfigListener__init (&poa_listener_servant, &ev); - - g_assert (ev._major == CORBA_NO_EXCEPTION); - - poa = - (PortableServer_POA) CORBA_ORB_resolve_initial_references (gconf_orb_get (), - "RootPOA", &ev); - - g_assert (ev._major == CORBA_NO_EXCEPTION); - - poa_mgr = PortableServer_POA__get_the_POAManager (poa, &ev); - PortableServer_POAManager_activate (poa_mgr, &ev); - - g_assert (ev._major == CORBA_NO_EXCEPTION); - - listener = PortableServer_POA_servant_to_reference(poa, - &poa_listener_servant, - &ev); - - CORBA_Object_release ((CORBA_Object) poa_mgr, &ev); - CORBA_Object_release ((CORBA_Object) poa, &ev); - - g_assert (listener != CORBA_OBJECT_NIL); - g_assert (ev._major == CORBA_NO_EXCEPTION); - } - - return listener; -} -#endif - static const char *config_listener_messages[] = { GCONF_DBUS_CONFIG_LISTENER_NOTIFY @@ -2623,6 +2338,9 @@ gconf_lifecycle_handler (DBusMessageHandler *handler, if (strcmp (name, GCONF_DBUS_CONFIG_SERVER) == 0) { + /* Ping the server so we'll be added to the list */ + gconf_ping_daemon (); + restore_listeners (); daemon_running = TRUE; } @@ -3122,12 +2840,9 @@ void gconf_shutdown_daemon (GError** err) { DBusMessage *message; + gboolean retval; -#ifdef GCONF_CORBA_BROKEN - CORBA_Environment ev; - ConfigServer cs; - - cs = gconf_get_config_server (FALSE, err); /* Don't want to spawn it if it's already down */ + retval = gconf_get_config_server (FALSE, err); if (err && *err && (*err)->code == GCONF_ERROR_NO_SERVER) { @@ -3135,30 +2850,13 @@ gconf_shutdown_daemon (GError** err) g_error_free (*err); *err = NULL; } - - if (cs == CORBA_OBJECT_NIL) - { - - return; - } - CORBA_exception_init (&ev); -#endif + if (!retval) + return; message = dbus_message_new (GCONF_DBUS_CONFIG_SERVER, GCONF_DBUS_CONFIG_SERVER_SHUTDOWN); dbus_connection_send (dbus_conn, message, NULL); dbus_connection_flush (dbus_conn); - -#if GCONF_CORBA_BROKEN - if (ev._major != CORBA_NO_EXCEPTION) - { - if (err) - *err = gconf_error_new (GCONF_ERROR_FAILED, _("Failure shutting down config server: %s"), - CORBA_exception_id (&ev)); - - CORBA_exception_free(&ev); - } -#endif } gboolean @@ -3614,62 +3312,6 @@ gconf_engine_set_pair (GConfEngine* conf, const gchar* key, return error_checked_set(conf, key, pair, err); } -/* CORBA Util */ - -/* Set GConfError from an exception, free exception, etc. */ - -static GConfError -corba_errno_to_gconf_errno(ConfigErrorType corba_err) -{ - switch (corba_err) - { - case ConfigFailed: - return GCONF_ERROR_FAILED; - break; - case ConfigNoPermission: - return GCONF_ERROR_NO_PERMISSION; - break; - case ConfigBadAddress: - return GCONF_ERROR_BAD_ADDRESS; - break; - case ConfigBadKey: - return GCONF_ERROR_BAD_KEY; - break; - case ConfigParseError: - return GCONF_ERROR_PARSE_ERROR; - break; - case ConfigCorrupt: - return GCONF_ERROR_CORRUPT; - break; - case ConfigTypeMismatch: - return GCONF_ERROR_TYPE_MISMATCH; - break; - case ConfigIsDir: - return GCONF_ERROR_IS_DIR; - break; - case ConfigIsKey: - return GCONF_ERROR_IS_KEY; - break; - case ConfigOverridden: - return GCONF_ERROR_OVERRIDDEN; - break; - case ConfigLockFailed: - return GCONF_ERROR_LOCK_FAILED; - break; - case ConfigNoWritableDatabase: - return GCONF_ERROR_NO_WRITABLE_DATABASE; - break; - case ConfigInShutdown: - return GCONF_ERROR_IN_SHUTDOWN; - break; - default: - g_assert_not_reached(); - return GCONF_ERROR_SUCCESS; /* warnings */ - break; - } -} - - static GConfError dbus_error_name_to_gconf_errno (const char *name) { @@ -3777,42 +3419,6 @@ gconf_handle_dbus_exception (DBusMessage *message, DBusError *dbus_error, return TRUE; } -static gboolean -gconf_handle_corba_exception(CORBA_Environment* ev, GError** err) -{ - switch (ev->_major) - { - case CORBA_NO_EXCEPTION: - CORBA_exception_free (ev); - return FALSE; - break; - case CORBA_SYSTEM_EXCEPTION: - if (err) - *err = gconf_error_new (GCONF_ERROR_NO_SERVER, _("CORBA error: %s"), - CORBA_exception_id (ev)); - CORBA_exception_free (ev); - return TRUE; - break; - case CORBA_USER_EXCEPTION: - { - ConfigException* ce; - - ce = CORBA_exception_value (ev); - - if (err) - *err = gconf_error_new (corba_errno_to_gconf_errno (ce->err_no), - ce->message); - CORBA_exception_free (ev); - return TRUE; - } - break; - default: - g_assert_not_reached(); - return TRUE; - break; - } -} - /* * Enumeration conversions */ diff --git a/gconf/gconfd-corba.c b/gconf/gconfd-corba.c index 7904460e..1792484a 100644 --- a/gconf/gconfd-corba.c +++ b/gconf/gconfd-corba.c @@ -1526,4 +1526,773 @@ gconfd_corba_check_in_shutdown (CORBA_Environment *ev) return FALSE; } +gboolean +gconf_CORBA_Object_equal (gconstpointer a, gconstpointer b) +{ + CORBA_Environment ev; + CORBA_Object _obj_a = (gpointer)a; + CORBA_Object _obj_b = (gpointer)b; + gboolean retval; + + CORBA_exception_init (&ev); + retval = CORBA_Object_is_equivalent(_obj_a, _obj_b, &ev); + CORBA_exception_free (&ev); + + return retval; +} + +guint +gconf_CORBA_Object_hash (gconstpointer key) +{ + CORBA_Environment ev; + CORBA_Object _obj = (gpointer)key; + CORBA_unsigned_long retval; + + CORBA_exception_init (&ev); + retval = CORBA_Object_hash(_obj, G_MAXUINT, &ev); + CORBA_exception_free (&ev); + + return retval; +} + +GConfValue* +gconf_value_from_corba_value(const ConfigValue* value) +{ + GConfValue* gval; + GConfValueType type = GCONF_VALUE_INVALID; + + switch (value->_d) + { + case InvalidVal: + return NULL; + break; + case IntVal: + type = GCONF_VALUE_INT; + break; + case StringVal: + type = GCONF_VALUE_STRING; + break; + case FloatVal: + type = GCONF_VALUE_FLOAT; + break; + case BoolVal: + type = GCONF_VALUE_BOOL; + break; + case SchemaVal: + type = GCONF_VALUE_SCHEMA; + break; + case ListVal: + type = GCONF_VALUE_LIST; + break; + case PairVal: + type = GCONF_VALUE_PAIR; + break; + default: + gconf_log(GCL_DEBUG, "Invalid type in %s", G_GNUC_FUNCTION); + return NULL; + } + + g_assert(GCONF_VALUE_TYPE_VALID(type)); + + gval = gconf_value_new(type); + + switch (gval->type) + { + case GCONF_VALUE_INT: + gconf_value_set_int(gval, value->_u.int_value); + break; + case GCONF_VALUE_STRING: + if (!g_utf8_validate (value->_u.string_value, -1, NULL)) + { + gconf_log (GCL_ERR, _("Invalid UTF-8 in string value in '%s'"), + value->_u.string_value); + } + else + { + gconf_value_set_string(gval, value->_u.string_value); + } + break; + case GCONF_VALUE_FLOAT: + gconf_value_set_float(gval, value->_u.float_value); + break; + case GCONF_VALUE_BOOL: + gconf_value_set_bool(gval, value->_u.bool_value); + break; + case GCONF_VALUE_SCHEMA: + gconf_value_set_schema_nocopy(gval, + gconf_schema_from_corba_schema(&(value->_u.schema_value))); + break; + case GCONF_VALUE_LIST: + { + GSList* list = NULL; + guint i = 0; + + switch (value->_u.list_value.list_type) + { + case BIntVal: + gconf_value_set_list_type(gval, GCONF_VALUE_INT); + break; + case BBoolVal: + gconf_value_set_list_type(gval, GCONF_VALUE_BOOL); + break; + case BFloatVal: + gconf_value_set_list_type(gval, GCONF_VALUE_FLOAT); + break; + case BStringVal: + gconf_value_set_list_type(gval, GCONF_VALUE_STRING); + break; + case BInvalidVal: + break; + default: + g_warning("Bizarre list type in %s", G_GNUC_FUNCTION); + break; + } + + if (gconf_value_get_list_type(gval) != GCONF_VALUE_INVALID) + { + i = 0; + while (i < value->_u.list_value.seq._length) + { + GConfValue* val; + + /* This is a bit dubious; we cast a ConfigBasicValue to ConfigValue + because they have the same initial members, but by the time + the CORBA and C specs kick in, not sure we are guaranteed + to be able to do this. + */ + val = gconf_value_from_corba_value((ConfigValue*)&value->_u.list_value.seq._buffer[i]); + + if (val == NULL) + gconf_log(GCL_ERR, _("Couldn't interpret CORBA value for list element")); + else if (val->type != gconf_value_get_list_type(gval)) + gconf_log(GCL_ERR, _("Incorrect type for list element in %s"), G_GNUC_FUNCTION); + else + list = g_slist_prepend(list, val); + + ++i; + } + + list = g_slist_reverse(list); + + gconf_value_set_list_nocopy(gval, list); + } + else + { + gconf_log(GCL_ERR, _("Received list from gconfd with a bad list type")); + } + } + break; + case GCONF_VALUE_PAIR: + { + g_return_val_if_fail(value->_u.pair_value._length == 2, gval); + + gconf_value_set_car_nocopy(gval, + gconf_value_from_corba_value((ConfigValue*)&value->_u.list_value.seq._buffer[0])); + + gconf_value_set_cdr_nocopy(gval, + gconf_value_from_corba_value((ConfigValue*)&value->_u.list_value.seq._buffer[1])); + } + break; + default: + g_assert_not_reached(); + break; + } + + return gval; +} + +void +gconf_fill_corba_value_from_gconf_value(const GConfValue *value, + ConfigValue *cv) +{ + if (value == NULL) + { + cv->_d = InvalidVal; + return; + } + + switch (value->type) + { + case GCONF_VALUE_INT: + cv->_d = IntVal; + cv->_u.int_value = gconf_value_get_int(value); + break; + case GCONF_VALUE_STRING: + cv->_d = StringVal; + cv->_u.string_value = CORBA_string_dup((char*)gconf_value_get_string(value)); + break; + case GCONF_VALUE_FLOAT: + cv->_d = FloatVal; + cv->_u.float_value = gconf_value_get_float(value); + break; + case GCONF_VALUE_BOOL: + cv->_d = BoolVal; + cv->_u.bool_value = gconf_value_get_bool(value); + break; + case GCONF_VALUE_SCHEMA: + cv->_d = SchemaVal; + gconf_fill_corba_schema_from_gconf_schema (gconf_value_get_schema(value), + &cv->_u.schema_value); + break; + case GCONF_VALUE_LIST: + { + guint n, i; + GSList* list; + + cv->_d = ListVal; + + list = gconf_value_get_list(value); + + n = g_slist_length(list); + + cv->_u.list_value.seq._buffer = + CORBA_sequence_ConfigBasicValue_allocbuf(n); + cv->_u.list_value.seq._length = n; + cv->_u.list_value.seq._maximum = n; + CORBA_sequence_set_release(&cv->_u.list_value.seq, TRUE); + + switch (gconf_value_get_list_type(value)) + { + case GCONF_VALUE_INT: + cv->_u.list_value.list_type = BIntVal; + break; + + case GCONF_VALUE_BOOL: + cv->_u.list_value.list_type = BBoolVal; + break; + + case GCONF_VALUE_STRING: + cv->_u.list_value.list_type = BStringVal; + break; + + case GCONF_VALUE_FLOAT: + cv->_u.list_value.list_type = BFloatVal; + break; + + case GCONF_VALUE_SCHEMA: + cv->_u.list_value.list_type = BSchemaVal; + break; + + default: + cv->_u.list_value.list_type = BInvalidVal; + gconf_log(GCL_DEBUG, "Invalid list type in %s", G_GNUC_FUNCTION); + break; + } + + i= 0; + while (list != NULL) + { + /* That dubious ConfigBasicValue->ConfigValue cast again */ + gconf_fill_corba_value_from_gconf_value((GConfValue*)list->data, + (ConfigValue*)&cv->_u.list_value.seq._buffer[i]); + + list = g_slist_next(list); + ++i; + } + } + break; + case GCONF_VALUE_PAIR: + { + cv->_d = PairVal; + + cv->_u.pair_value._buffer = + CORBA_sequence_ConfigBasicValue_allocbuf(2); + cv->_u.pair_value._length = 2; + cv->_u.pair_value._maximum = 2; + CORBA_sequence_set_release(&cv->_u.pair_value, TRUE); + + /* dubious cast */ + gconf_fill_corba_value_from_gconf_value (gconf_value_get_car(value), + (ConfigValue*)&cv->_u.pair_value._buffer[0]); + gconf_fill_corba_value_from_gconf_value(gconf_value_get_cdr(value), + (ConfigValue*)&cv->_u.pair_value._buffer[1]); + } + break; + + case GCONF_VALUE_INVALID: + cv->_d = InvalidVal; + break; + default: + cv->_d = InvalidVal; + gconf_log(GCL_DEBUG, "Unknown type in %s", G_GNUC_FUNCTION); + break; + } +} + +ConfigValue* +gconf_corba_value_from_gconf_value (const GConfValue* value) +{ + ConfigValue* cv; + + cv = ConfigValue__alloc(); + + gconf_fill_corba_value_from_gconf_value(value, cv); + + return cv; +} + +ConfigValue* +gconf_invalid_corba_value () +{ + ConfigValue* cv; + + cv = ConfigValue__alloc(); + + cv->_d = InvalidVal; + + return cv; +} + +gchar* +gconf_object_to_string (CORBA_Object obj, + GError **err) +{ + CORBA_Environment ev; + gchar *ior; + gchar *retval; + + CORBA_exception_init (&ev); + + ior = CORBA_ORB_object_to_string (gconf_orb_get (), obj, &ev); + + if (ior == NULL) + { + gconf_set_error (err, + GCONF_ERROR_FAILED, + _("Failed to convert object to IOR")); + + return NULL; + } + + retval = g_strdup (ior); + + CORBA_free (ior); + + return retval; +} + +static ConfigValueType +corba_type_from_gconf_type(GConfValueType type) +{ + switch (type) + { + case GCONF_VALUE_INT: + return IntVal; + case GCONF_VALUE_BOOL: + return BoolVal; + case GCONF_VALUE_FLOAT: + return FloatVal; + case GCONF_VALUE_INVALID: + return InvalidVal; + case GCONF_VALUE_STRING: + return StringVal; + case GCONF_VALUE_SCHEMA: + return SchemaVal; + case GCONF_VALUE_LIST: + return ListVal; + case GCONF_VALUE_PAIR: + return PairVal; + default: + g_assert_not_reached(); + return InvalidVal; + } +} + +static GConfValueType +gconf_type_from_corba_type(ConfigValueType type) +{ + switch (type) + { + case InvalidVal: + return GCONF_VALUE_INVALID; + case StringVal: + return GCONF_VALUE_STRING; + case IntVal: + return GCONF_VALUE_INT; + case FloatVal: + return GCONF_VALUE_FLOAT; + case SchemaVal: + return GCONF_VALUE_SCHEMA; + case BoolVal: + return GCONF_VALUE_BOOL; + case ListVal: + return GCONF_VALUE_LIST; + case PairVal: + return GCONF_VALUE_PAIR; + default: + g_assert_not_reached(); + return GCONF_VALUE_INVALID; + } +} + +void +gconf_fill_corba_schema_from_gconf_schema(const GConfSchema *sc, + ConfigSchema *cs) +{ + cs->value_type = corba_type_from_gconf_type (gconf_schema_get_type (sc)); + cs->value_list_type = corba_type_from_gconf_type (gconf_schema_get_list_type (sc)); + cs->value_car_type = corba_type_from_gconf_type (gconf_schema_get_car_type (sc)); + cs->value_cdr_type = corba_type_from_gconf_type (gconf_schema_get_cdr_type (sc)); + + cs->locale = CORBA_string_dup (gconf_schema_get_locale (sc) ? gconf_schema_get_locale (sc) : ""); + cs->short_desc = CORBA_string_dup (gconf_schema_get_short_desc (sc) ? gconf_schema_get_short_desc (sc) : ""); + cs->long_desc = CORBA_string_dup (gconf_schema_get_long_desc (sc) ? gconf_schema_get_long_desc (sc) : ""); + cs->owner = CORBA_string_dup (gconf_schema_get_owner (sc) ? gconf_schema_get_owner (sc) : ""); + + { + gchar* encoded; + GConfValue* default_val; + + default_val = gconf_schema_get_default_value (sc); + + if (default_val) + { + encoded = gconf_value_encode (default_val); + + g_assert (encoded != NULL); + + cs->encoded_default_value = CORBA_string_dup (encoded); + + g_free (encoded); + } + else + cs->encoded_default_value = CORBA_string_dup (""); + } +} + +ConfigSchema* +gconf_corba_schema_from_gconf_schema (const GConfSchema* sc) +{ + ConfigSchema* cs; + + cs = ConfigSchema__alloc (); + + gconf_fill_corba_schema_from_gconf_schema (sc, cs); + + return cs; +} + +GConfSchema* +gconf_schema_from_corba_schema(const ConfigSchema* cs) +{ + GConfSchema* sc; + GConfValueType type = GCONF_VALUE_INVALID; + GConfValueType list_type = GCONF_VALUE_INVALID; + GConfValueType car_type = GCONF_VALUE_INVALID; + GConfValueType cdr_type = GCONF_VALUE_INVALID; + + type = gconf_type_from_corba_type(cs->value_type); + list_type = gconf_type_from_corba_type(cs->value_list_type); + car_type = gconf_type_from_corba_type(cs->value_car_type); + cdr_type = gconf_type_from_corba_type(cs->value_cdr_type); + + sc = gconf_schema_new(); + + gconf_schema_set_type(sc, type); + gconf_schema_set_list_type(sc, list_type); + gconf_schema_set_car_type(sc, car_type); + gconf_schema_set_cdr_type(sc, cdr_type); + + if (*cs->locale != '\0') + { + if (!g_utf8_validate (cs->locale, -1, NULL)) + gconf_log (GCL_ERR, _("Invalid UTF-8 in locale for schema")); + else + gconf_schema_set_locale(sc, cs->locale); + } + + if (*cs->short_desc != '\0') + { + if (!g_utf8_validate (cs->short_desc, -1, NULL)) + gconf_log (GCL_ERR, _("Invalid UTF-8 in short description for schema")); + else + gconf_schema_set_short_desc(sc, cs->short_desc); + } + + if (*cs->long_desc != '\0') + { + if (!g_utf8_validate (cs->long_desc, -1, NULL)) + gconf_log (GCL_ERR, _("Invalid UTF-8 in long description for schema")); + else + gconf_schema_set_long_desc(sc, cs->long_desc); + } + + if (*cs->owner != '\0') + { + if (!g_utf8_validate (cs->owner, -1, NULL)) + gconf_log (GCL_ERR, _("Invalid UTF-8 in owner for schema")); + else + gconf_schema_set_owner(sc, cs->owner); + } + + { + GConfValue* val; + + val = gconf_value_decode(cs->encoded_default_value); + + if (val) + gconf_schema_set_default_value_nocopy(sc, val); + } + + return sc; +} + +static ConfigServer +read_current_server_and_set_warning (const gchar *iorfile, + GString *warning) +{ + FILE *fp; + + fp = fopen (iorfile, "r"); + + if (fp == NULL) + { + if (warning) + g_string_append_printf (warning, + _("IOR file '%s' not opened successfully, no gconfd located: %s"), + iorfile, g_strerror (errno)); + + return CORBA_OBJECT_NIL; + } + else /* successfully opened IOR file */ + { + char buf[2048] = { '\0' }; + const char *str = NULL; + + fgets (buf, sizeof (buf) - 2, fp); + fclose (fp); + + /* The lockfile format is <pid>:<ior> for gconfd + * or <pid>:none for gconftool + */ + str = buf; + while (isdigit(*str)) + ++str; + + if (*str == ':') + ++str; + + if (str[0] == 'n' && + str[1] == 'o' && + str[2] == 'n' && + str[3] == 'e') + { + if (warning) + g_string_append_printf (warning, + _("gconftool or other non-gconfd process has the lock file '%s'"), + iorfile); + } + else /* file contains daemon IOR */ + { + CORBA_ORB orb; + CORBA_Environment ev; + ConfigServer server; + + CORBA_exception_init (&ev); + + orb = gconf_orb_get (); + + if (orb == NULL) + { + if (warning) + g_string_append_printf (warning, + _("couldn't contact ORB to resolve existing gconfd object reference")); + return CORBA_OBJECT_NIL; + } + + server = CORBA_ORB_string_to_object (orb, (char*) str, &ev); + CORBA_exception_free (&ev); + + if (server == CORBA_OBJECT_NIL && + warning) + g_string_append_printf (warning, + _("Failed to convert IOR '%s' to an object reference"), + str); + + return server; + } + + return CORBA_OBJECT_NIL; + } +} + +static ConfigServer +read_current_server (const gchar *iorfile, + gboolean warn_if_fail) +{ + GString *warning; + ConfigServer server; + + if (warn_if_fail) + warning = g_string_new (NULL); + else + warning = NULL; + + server = read_current_server_and_set_warning (iorfile, warning); + + if (warning->len > 0) + gconf_log (GCL_WARNING, "%s", warning->str); + + g_string_free (warning, TRUE); + + return server; +} + +GConfLock* +gconf_get_lock_or_current_holder (const gchar *lock_directory, + ConfigServer *current_server, + GError **err) +{ + ConfigServer server; + GConfLock* lock; + + g_return_val_if_fail(lock_directory != NULL, NULL); + + if (current_server) + *current_server = CORBA_OBJECT_NIL; + + if (mkdir (lock_directory, 0700) < 0 && + errno != EEXIST) + { + gconf_set_error (err, + GCONF_ERROR_LOCK_FAILED, + _("couldn't create directory `%s': %s"), + lock_directory, g_strerror (errno)); + + return NULL; + } + + server = CORBA_OBJECT_NIL; + + lock = g_new0 (GConfLock, 1); + + lock->lock_directory = g_strdup (lock_directory); + + lock->iorfile = g_strconcat (lock->lock_directory, "/ior", NULL); + + /* Check the current IOR file and ping its daemon */ + + lock->lock_fd = open_empty_locked_file (lock->lock_directory, + lock->iorfile, + err); + + if (lock->lock_fd < 0) + { + /* We didn't get the lock. Read the old server, and provide + * it to the caller. Error is already set. + */ + if (current_server) + *current_server = read_current_server (lock->iorfile, TRUE); + + gconf_lock_destroy (lock); + + return NULL; + } + else + { + /* Write IOR to lockfile */ + const gchar* ior; + int retval; + gchar* s; + + s = g_strdup_printf ("%u:", (guint) getpid ()); + + retval = write (lock->lock_fd, s, strlen (s)); + + g_free (s); + + if (retval >= 0) + { + ior = gconf_get_daemon_ior(); + + if (ior == NULL) + retval = write (lock->lock_fd, "none", 4); + else + retval = write (lock->lock_fd, ior, strlen (ior)); + } + + if (retval < 0) + { + gconf_set_error (err, + GCONF_ERROR_LOCK_FAILED, + _("Can't write to file `%s': %s"), + lock->iorfile, g_strerror (errno)); + + unlink (lock->iorfile); + gconf_lock_destroy (lock); + + return NULL; + } + } + + return lock; +} + +/* This function doesn't try to see if the lock is valid or anything + * of the sort; it just reads it. It does do the object_to_string + */ +ConfigServer +gconf_get_current_lock_holder (const gchar *lock_directory, + GString *failure_log) +{ + char *iorfile; + ConfigServer server; + + iorfile = g_strconcat (lock_directory, "/ior", NULL); + server = read_current_server_and_set_warning (iorfile, failure_log); + g_free (iorfile); + return server; +} + +static CORBA_ORB gconf_orb = CORBA_OBJECT_NIL; + +CORBA_ORB +gconf_orb_get (void) +{ + if (gconf_orb == CORBA_OBJECT_NIL) + { + CORBA_Environment ev; + int argc = 1; + char *argv[] = { "gconf", NULL }; + + _gconf_init_i18n (); + + CORBA_exception_init (&ev); + + gconf_orb = CORBA_ORB_init (&argc, argv, "orbit-local-orb", &ev); + g_assert (ev._major == CORBA_NO_EXCEPTION); + + CORBA_exception_free (&ev); + } + + return gconf_orb; +} + +int +gconf_orb_release (void) +{ + int ret = 0; + + if (gconf_orb != CORBA_OBJECT_NIL) + { + CORBA_ORB orb = gconf_orb; + CORBA_Environment ev; + + gconf_orb = CORBA_OBJECT_NIL; + + CORBA_exception_init (&ev); + + CORBA_ORB_destroy (orb, &ev); + CORBA_Object_release ((CORBA_Object)orb, &ev); + + if (ev._major != CORBA_NO_EXCEPTION) + { + ret = 1; + } + CORBA_exception_free (&ev); + } + + return ret; +} + diff --git a/gconf/gconfd-corba.h b/gconf/gconfd-corba.h index 7f14f5b9..842ded09 100644 --- a/gconf/gconfd-corba.h +++ b/gconf/gconfd-corba.h @@ -27,6 +27,23 @@ gboolean gconfd_corba_init (void); PortableServer_POA gconf_corba_get_poa (); +GConfValue* gconf_value_from_corba_value (const ConfigValue *value); +ConfigValue* gconf_corba_value_from_gconf_value (const GConfValue *value); +void gconf_fill_corba_value_from_gconf_value (const GConfValue *value, + ConfigValue *dest); +ConfigValue* gconf_invalid_corba_value (void); + +void gconf_fill_corba_schema_from_gconf_schema (const GConfSchema *sc, + ConfigSchema *dest); +ConfigSchema* gconf_corba_schema_from_gconf_schema (const GConfSchema *sc); +GConfSchema* gconf_schema_from_corba_schema (const ConfigSchema *cs); + +gchar* gconf_object_to_string (CORBA_Object obj, + GError **err); + +CORBA_ORB gconf_orb_get (void); + + void gconfd_corba_logfile_save (void); void gconfd_corba_logfile_read (void); void gconfd_corba_log_client_add (const ConfigListener client); diff --git a/gconf/gconfd-dbus.c b/gconf/gconfd-dbus.c index cdb1bc58..8fce617f 100644 --- a/gconf/gconfd-dbus.c +++ b/gconf/gconfd-dbus.c @@ -652,7 +652,6 @@ gconfd_config_database_add_listener (DBusConnection *connection, dbus_dict_get_string (dict, "name", &name); cnxn = gconf_database_dbus_add_listener (db, dbus_message_get_sender (message), name, dir); - printf ("added listener from %s, %s. Result is %d\n", dbus_message_get_sender (message), dir, cnxn); reply = dbus_message_new_reply (message); dbus_message_append_uint32 (reply, cnxn); @@ -683,7 +682,7 @@ gconfd_config_database_remove_listener (DBusConnection *connection, return; - /* FIXME: Remove the listener */ + gconf_listeners_remove (db->listeners, cnxn); reply = dbus_message_new_reply (message); dbus_connection_send (connection, reply, NULL); @@ -725,6 +724,7 @@ gconfd_config_database_set (DBusConnection *connection, dbus_message_iter_unref (iter); gconf_database_set (db, key, value, &error); + dbus_free (key); gconf_value_free (value); if (gconf_dbus_set_exception (connection, message, &error)) @@ -990,7 +990,6 @@ remove_listener_predicate (const gchar* location, if (strcmp (l->who, name) == 0) { - printf ("removing listener!\n"); return FALSE; } else |