diff options
Diffstat (limited to 'subversion/bindings/javahl/native/ProplistCallback.cpp')
-rw-r--r-- | subversion/bindings/javahl/native/ProplistCallback.cpp | 79 |
1 files changed, 73 insertions, 6 deletions
diff --git a/subversion/bindings/javahl/native/ProplistCallback.cpp b/subversion/bindings/javahl/native/ProplistCallback.cpp index a3bcee3..be46cf5 100644 --- a/subversion/bindings/javahl/native/ProplistCallback.cpp +++ b/subversion/bindings/javahl/native/ProplistCallback.cpp @@ -33,10 +33,10 @@ * Create a ProplistCallback object * @param jcallback the Java callback object. */ -ProplistCallback::ProplistCallback(jobject jcallback) -{ - m_callback = jcallback; -} +ProplistCallback::ProplistCallback(jobject jcallback, bool inherited) + : m_callback(jcallback), + m_inherited(inherited) +{} /** * Destroy a ProplistCallback object @@ -51,10 +51,18 @@ svn_error_t * ProplistCallback::callback(void *baton, const char *path, apr_hash_t *prop_hash, + apr_array_header_t *inherited_props, apr_pool_t *pool) { if (baton) - return ((ProplistCallback *)baton)->singlePath(path, prop_hash, pool); + { + ProplistCallback *cb = static_cast<ProplistCallback *>(baton); + + if (cb->inherited()) + return cb->singlePath(path, prop_hash, inherited_props, pool); + else + return cb->singlePath(path, prop_hash, pool); + } return SVN_NO_ERROR; } @@ -78,7 +86,7 @@ svn_error_t *ProplistCallback::singlePath(const char *path, // The method id will not change during the time this library is // loaded, so it can be cached. - static jmethodID mid = 0; + static volatile jmethodID mid = 0; if (mid == 0) { jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/ProplistCallback"); @@ -108,3 +116,62 @@ svn_error_t *ProplistCallback::singlePath(const char *path, return SVN_NO_ERROR; } + + + +/** + * Callback called for a single path + * @param path the path name + * @param prop_hash the hash of properties on this path + * @param inherited_props list of inherited props + * @param pool memory pool for the use of this function + */ +svn_error_t *ProplistCallback::singlePath( + const char *path, + apr_hash_t *prop_hash, + apr_array_header_t *inherited_props, + apr_pool_t *pool) +{ + JNIEnv *env = JNIUtil::getEnv(); + + // Create a local frame for our references + env->PushLocalFrame(LOCAL_FRAME_SIZE); + if (JNIUtil::isJavaExceptionThrown()) + return NULL; + + // The method id will not change during the time this library is + // loaded, so it can be cached. + static jmethodID mid = 0; + if (mid == 0) + { + jclass clazz = env->FindClass(JAVA_PACKAGE"/callback/InheritedProplistCallback"); + if (JNIUtil::isJavaExceptionThrown()) + return SVN_NO_ERROR; + + mid = env->GetMethodID(clazz, "singlePath", + "(Ljava/lang/String;Ljava/util/Map;Ljava/util/Collection;)V"); + if (JNIUtil::isJavaExceptionThrown() || mid == 0) + POP_AND_RETURN(SVN_NO_ERROR); + } + + // convert the parameters to their Java relatives + jstring jpath = JNIUtil::makeJString(path); + if (JNIUtil::isJavaExceptionThrown()) + POP_AND_RETURN(SVN_NO_ERROR); + + jobject jmap = CreateJ::PropertyMap(prop_hash); + if (JNIUtil::isJavaExceptionThrown()) + POP_AND_RETURN(SVN_NO_ERROR); + + jobject jiprops = CreateJ::InheritedProps(inherited_props); + if (JNIUtil::isJavaExceptionThrown()) + POP_AND_RETURN(SVN_NO_ERROR); + + // call the Java method + env->CallVoidMethod(m_callback, mid, jpath, jmap, jiprops); + // We return whether an exception was thrown or not. + + env->PopLocalFrame(NULL); + + return SVN_NO_ERROR; +} |