Committed, thank you! Mario
2006-09-24 Mario Torre <[EMAIL PROTECTED]> * scripts/check_jni_methods.sh: added two new methods in the ignore list: Java_gnu_java_util_prefs_gconf_GConfNativePeer_gconf_1escape_1key and Java_gnu_java_util_prefs_gconf_GConfNativePeer_gconf_1unescape_1key * native/jni/gconf-peer/GConfNativePeer.c: (Java_gnu_java_util_prefs_gconf_GConfNativePeer_gconf_1client_1all_1keys): refacored method name, renamed from Java_gnu_java_util_prefs_gconf_GConfNativePeer_gconf_1client_1gconf_1client_1all_1keys. Added code to unescape escaped GConf key names. (Java_gnu_java_util_prefs_gconf_GConfNativePeer_gconf_1client_1all_1nodes): refacored method name, renamed from Java_gnu_java_util_prefs_gconf_GConfNativePeer_gconf_1client_1gconf_1client_1all_1nodes. Added code to unescape escaped GConf key names. (Java_gnu_java_util_prefs_gconf_GConfNativePeer_gconf_1escape_1key): new function. (Java_gnu_java_util_prefs_gconf_GConfNativePeer_gconf_1unescape_1key): new function. * gnu/java/util/prefs/gconf/GConfNativePeer.java: removed version javadoc tag. (escapeString): new method. (unescapeString): likewise. (gconf_escape_key): new native method. (gconf_unescape_key): likewise. (gconf_client_suggest_sync): update native method signature, now explicity throws BackingStoreException. (gconf_client_all_nodes): update native method signature, now explicity throws BackingStoreException. Refactored method name, renamed from gconf_client_gconf_client_all_nodes. (gconf_client_all_keys): update native method signature, now explicity throws BackingStoreException. Refactored method name, renamed from gconf_client_gconf_client_all_keys. (getKeys): refactored to use the new method name gconf_client_all_keys. (getChildrenNodes): refactored to use the new method name gconf_client_all_nodes. * gnu/java/util/prefs/GConfBasedPreferences.java: removed version javadoc tag. (GConfBasedPreferences): Added code to escape node names from invalid characters so that GConf now accept invalid node names. (GConfBasedPreferences): Moved code to register the current node to the list of nodes watched by GConf outside the constructor. (childSpi): Added code to register the current node to the list of nodes watched by GConf. (getGConfKey): Added code to escape key names from invalid characters so that GConf now accept invalid key names. -- Lima Software, SO.PR.IND. s.r.l. http://www.limasoftware.net/ pgp key: http://subkeys.pgp.net/ Proud GNU Classpath developer: http://www.classpath.org/ Read About us at: http://planet.classpath.org Please, support open standards: http://opendocumentfellowship.org/petition/ http://www.nosoftwarepatents.com/
### Eclipse Workspace Patch 1.0 #P classpath Index: gnu/java/util/prefs/gconf/GConfNativePeer.java =================================================================== RCS file: /sources/classpath/classpath/gnu/java/util/prefs/gconf/GConfNativePeer.java,v retrieving revision 1.2 diff -u -r1.2 GConfNativePeer.java --- gnu/java/util/prefs/gconf/GConfNativePeer.java 8 Jul 2006 22:28:16 -0000 1.2 +++ gnu/java/util/prefs/gconf/GConfNativePeer.java 27 Sep 2006 11:33:54 -0000 @@ -45,7 +45,6 @@ * Native peer for GConf based preference backend. * * @author Mario Torre <[EMAIL PROTECTED]> - * @version 1.0.1 */ public final class GConfNativePeer { @@ -150,7 +149,7 @@ */ public List getKeys(String node) throws BackingStoreException { - return gconf_client_gconf_client_all_keys(node); + return gconf_client_all_keys(node); } /** @@ -162,10 +161,26 @@ */ public List getChildrenNodes(String node) throws BackingStoreException { - return gconf_client_gconf_client_all_nodes(node); + return gconf_client_all_nodes(node); } /** + * Escape the given string so the it is a valid GConf name. + */ + public static String escapeString(String plain) + { + return gconf_escape_key(plain); + } + + /** + * Unescape a string escaped with [EMAIL PROTECTED] #escapeString}. + */ + public static String unescapeString(String escaped) + { + return gconf_unescape_key(escaped); + } + + /** * Suggest to the backend GConf daemon to synch with the database. */ public void suggestSync() throws BackingStoreException @@ -270,8 +285,9 @@ * Suggest to the GConf native peer a sync with the database. * */ - native static final protected void gconf_client_suggest_sync(); - + native static final protected void gconf_client_suggest_sync() + throws BackingStoreException; + /** * Returns a list of all nodes under the given node. * @@ -279,8 +295,9 @@ * @return A list of nodes under the given source node. */ native - static final protected List gconf_client_gconf_client_all_nodes(String node); - + static final protected List gconf_client_all_nodes(String node) + throws BackingStoreException; + /** * Returns a list of all keys stored in the given node. * @@ -288,8 +305,28 @@ * @return A list of all keys stored in the given node. */ native - static final protected List gconf_client_gconf_client_all_keys(String node); + static final protected List gconf_client_all_keys(String node) + throws BackingStoreException; + /** + * Escape the input String so that it's a valid element for GConf. + * + * @param plain the String to escape. + * @return An escaped String for use with GConf. + */ + native + static final protected String gconf_escape_key(String plain); + + /** + * Converts a string escaped with gconf_escape_key back into its + * original form. + * + * @param escaped key as returned by gconf_escape_key + * @return An unescaped key. + */ + native + static final protected String gconf_unescape_key(String escaped); + static { System.loadLibrary("gconfpeer"); Index: native/jni/gconf-peer/GConfNativePeer.c =================================================================== RCS file: /sources/classpath/classpath/native/jni/gconf-peer/GConfNativePeer.c,v retrieving revision 1.7 diff -u -r1.7 GConfNativePeer.c --- native/jni/gconf-peer/GConfNativePeer.c 4 Aug 2006 10:14:15 -0000 1.7 +++ native/jni/gconf-peer/GConfNativePeer.c 27 Sep 2006 11:33:56 -0000 @@ -157,16 +157,19 @@ /* * Class: gnu_java_util_prefs_gconf_GConfNativePeer - * Method: gconf_client_gconf_client_all_keys + * Method: gconf_client_all_keys * Signature: (Ljava/lang/String;)Ljava/util/List; */ JNIEXPORT jobject JNICALL -Java_gnu_java_util_prefs_gconf_GConfNativePeer_gconf_1client_1gconf_1client_1all_1keys +Java_gnu_java_util_prefs_gconf_GConfNativePeer_gconf_1client_1all_1keys (JNIEnv *env, jclass clazz __attribute__ ((unused)), jstring node) { /* TODO: check all the calls to gdk_threads_enter/leave */ const char *dir = NULL; + const char *_val = NULL; + const char *_val_unescaped = NULL; + GError *err = NULL; GSList *entries = NULL; GSList *tmp; @@ -208,12 +211,18 @@ tmp = entries; while (tmp != NULL) { - const char *_val = gconf_entry_get_key (tmp->data); + _val = gconf_entry_get_key (tmp->data); _val = strrchr (_val, '/'); ++_val; + + _val_unescaped = gconf_unescape_key (_val, strlen (_val)); + (*env)->CallBooleanMethod (env, jlist, jlist_add_id, - (*env)->NewStringUTF (env, _val)); + (*env)->NewStringUTF (env, _val_unescaped)); + tmp = g_slist_next (tmp); + + g_free ((gpointer) _val_unescaped); } /* clean up things */ @@ -226,14 +235,17 @@ /* * Class: gnu_java_util_prefs_gconf_GConfNativePeer - * Method: gconf_client_gconf_client_all_nodes + * Method: gconf_client_all_nodes * Signature: (Ljava/lang/String;)Ljava/util/List; */ JNIEXPORT jobject JNICALL -Java_gnu_java_util_prefs_gconf_GConfNativePeer_gconf_1client_1gconf_1client_1all_1nodes +Java_gnu_java_util_prefs_gconf_GConfNativePeer_gconf_1client_1all_1nodes (JNIEnv *env, jclass clazz __attribute__ ((unused)), jstring node) { const char *dir = NULL; + const char *_val = NULL; + const char *_val_unescaped = NULL; + GError *err = NULL; GSList *entries = NULL; GSList *tmp; @@ -274,12 +286,19 @@ tmp = entries; while (tmp != NULL) { - const char *_val = tmp->data; + _val = tmp->data; + _val = strrchr (_val, '/'); ++_val; + + _val_unescaped = gconf_unescape_key (_val, strlen (_val)); + (*env)->CallBooleanMethod (env, jlist, jlist_add_id, - (*env)->NewStringUTF (env, _val)); + (*env)->NewStringUTF (env, _val_unescaped)); + tmp = g_slist_next (tmp); + + g_free ((gpointer) _val_unescaped); } /* clean up things */ @@ -421,7 +440,7 @@ gdk_threads_leave (); if (err != NULL) { - g_error_free (err); + g_error_free (err); err = NULL; result = JNI_FALSE; } @@ -534,6 +553,74 @@ reference_count--; } +/* + * Class: gnu_java_util_prefs_gconf_GConfNativePeer + * Method: Java_gnu_java_util_prefs_gconf_GConfNativePeer_gconf_1escape_1key + * Signature: (Ljava/lang/String;)Z + */ +JNIEXPORT jstring +JNICALL Java_gnu_java_util_prefs_gconf_GConfNativePeer_gconf_1escape_1key + (JNIEnv *env, jclass clazz __attribute__ ((unused)), jstring plain) +{ + const char *escaped = NULL; + const char *_plain = NULL; + jstring result = NULL; + + _plain = JCL_jstring_to_cstring (env, plain); + if (_plain == NULL) + { + return NULL; + } + + gdk_threads_enter (); + escaped = gconf_escape_key (_plain, strlen (_plain)); + gdk_threads_leave (); + + JCL_free_cstring (env, plain, _plain); + /* check for NULL, if so prevent string creation */ + if (escaped != NULL) + { + result = (*env)->NewStringUTF (env, escaped); + g_free ((gpointer) escaped); + } + + return result; +} + +/* + * Class: gnu_java_util_prefs_gconf_GConfNativePeer + * Method: Java_gnu_java_util_prefs_gconf_GConfNativePeer_gconf_1unescape_1key + * Signature: (Ljava/lang/String;)Z + */ +JNIEXPORT jstring +JNICALL Java_gnu_java_util_prefs_gconf_GConfNativePeer_gconf_1unescape_1key + (JNIEnv *env, jclass clazz __attribute__ ((unused)), jstring escaped) +{ + const char *plain = NULL; + const char *_escaped = NULL; + jstring result = NULL; + + _escaped = JCL_jstring_to_cstring (env, escaped); + if (_escaped == NULL) + { + return NULL; + } + + gdk_threads_enter (); + plain = gconf_unescape_key (_escaped, strlen (_escaped)); + gdk_threads_leave (); + + JCL_free_cstring (env, escaped, _escaped); + /* check for NULL, if so prevent string creation */ + if (plain != NULL) + { + result = (*env)->NewStringUTF (env, plain); + g_free ((gpointer) plain); + } + + return result; +} + /* ***** END: NATIVE FUNCTIONS ***** */ /* ***** PRIVATE FUNCTIONS IMPLEMENTATION ***** */ Index: gnu/java/util/prefs/GConfBasedPreferences.java =================================================================== RCS file: /sources/classpath/classpath/gnu/java/util/prefs/GConfBasedPreferences.java,v retrieving revision 1.2 diff -u -r1.2 GConfBasedPreferences.java --- gnu/java/util/prefs/GConfBasedPreferences.java 8 Jul 2006 22:28:17 -0000 1.2 +++ gnu/java/util/prefs/GConfBasedPreferences.java 27 Sep 2006 11:33:54 -0000 @@ -72,7 +72,6 @@ * <br /> * * @author Mario Torre <[EMAIL PROTECTED]> - * @version 1.0.1 */ public class GConfBasedPreferences extends AbstractPreferences @@ -136,12 +135,20 @@ absolutePath = absolutePath.substring(0, absolutePath.length() - 1); } + // strip invalid characters + // please, note that all names are unescaped into the native peer + int index = absolutePath.lastIndexOf('/'); + if (index > -1) + { + absolutePath = absolutePath.substring(0, index + 1); + absolutePath = absolutePath + GConfNativePeer.escapeString(name); + } + this.node = this.getRealRoot(isUser) + absolutePath; boolean nodeExist = backend.nodeExist(this.node); this.newNode = !nodeExist; - backend.startWatchingNode(this.node); } /** @@ -156,7 +163,15 @@ // we don't check anything here, if the node is a new node this will be // detected in the constructor, so we simply return a new reference to // the requested node. - return new GConfBasedPreferences(this, name, this.isUser); + + GConfBasedPreferences preferenceNode + = new GConfBasedPreferences(this, name, this.isUser); + + // register the node for to GConf so that it can listen + // events outside the scope of the application + backend.startWatchingNode(this.node); + + return preferenceNode; } /** @@ -365,6 +380,10 @@ { String nodeName = ""; + // strip key + // please, note that all names are unescaped into the native peer + key = GConfNativePeer.escapeString(key); + if (this.node.endsWith("/")) { nodeName = this.node + key; @@ -373,7 +392,7 @@ { nodeName = this.node + "/" + key; } - + return nodeName; } Index: scripts/check_jni_methods.sh =================================================================== RCS file: /sources/classpath/classpath/scripts/check_jni_methods.sh,v retrieving revision 1.13 diff -u -r1.13 check_jni_methods.sh --- scripts/check_jni_methods.sh 18 Aug 2006 19:56:30 -0000 1.13 +++ scripts/check_jni_methods.sh 27 Sep 2006 11:33:56 -0000 @@ -38,6 +38,8 @@ -Java_gnu_java_util_prefs_gconf_GConfNativePeer_finalize_1class -Java_gnu_java_util_prefs_gconf_GConfNativePeer_init_1id_1cache -Java_gnu_java_util_prefs_gconf_GConfNativePeer_init_1class +-Java_gnu_java_util_prefs_gconf_GConfNativePeer_gconf_1escape_1key +-Java_gnu_java_util_prefs_gconf_GConfNativePeer_gconf_1unescape_1key EOF # Compare again silently.