Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/bindings/javahl/native/ClientContext.cpp view on Meta::CPAN
jclass clazz = env->FindClass(JAVA_PACKAGE"/ProgressEvent");
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NOTHING();
if (midCT == 0)
{
midCT = env->GetMethodID(clazz, "<init>", "(JJ)V");
if (JNIUtil::isJavaExceptionThrown() || midCT == 0)
POP_AND_RETURN_NOTHING();
}
// Call the Java method.
jobject jevent = env->NewObject(clazz, midCT,
(jlong) progressVal, (jlong) total);
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NOTHING();
env->CallVoidMethod(jctx, mid, jevent);
POP_AND_RETURN_NOTHING();
}
svn_error_t *
ClientContext::resolve(svn_wc_conflict_result_t **result,
const svn_wc_conflict_description2_t *desc,
void *baton,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
jobject jctx = (jobject) baton;
JNIEnv *env = JNIUtil::getEnv();
// Create a local frame for our references
env->PushLocalFrame(LOCAL_FRAME_SIZE);
if (JNIUtil::isJavaExceptionThrown())
return SVN_NO_ERROR;
static jmethodID mid = 0;
if (mid == 0)
{
jclass clazz = env->GetObjectClass(jctx);
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN(SVN_NO_ERROR);
mid = env->GetMethodID(clazz, "resolve",
"(L"JAVA_PACKAGE"/ConflictDescriptor;)"
"L"JAVA_PACKAGE"/ConflictResult;");
if (JNIUtil::isJavaExceptionThrown() || mid == 0)
POP_AND_RETURN(SVN_NO_ERROR);
}
// Create an instance of the conflict descriptor.
jobject jdesc = CreateJ::ConflictDescriptor(desc);
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN(SVN_NO_ERROR);
// Invoke the Java conflict resolver callback method using the descriptor.
jobject jresult = env->CallObjectMethod(jctx, mid, jdesc);
if (JNIUtil::isJavaExceptionThrown())
{
// If an exception is thrown by our conflict resolver, remove it
// from the JNI env, and convert it into a Subversion error.
SVN::Pool tmpPool(scratch_pool);
const char *msg = JNIUtil::thrownExceptionToCString(tmpPool);
svn_error_t *err = svn_error_create(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE,
NULL, msg);
env->PopLocalFrame(NULL);
return err;
}
*result = javaResultToC(jresult, result_pool);
if (*result == NULL)
{
// Unable to convert the result into a C representation.
env->PopLocalFrame(NULL);
return svn_error_create(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL, NULL);
}
env->PopLocalFrame(NULL);
return SVN_NO_ERROR;
}
svn_wc_conflict_result_t *
ClientContext::javaResultToC(jobject jresult, apr_pool_t *pool)
{
JNIEnv *env = JNIUtil::getEnv();
// Create a local frame for our references
env->PushLocalFrame(LOCAL_FRAME_SIZE);
if (JNIUtil::isJavaExceptionThrown())
return SVN_NO_ERROR;
static jmethodID getChoice = 0;
static jmethodID getMergedPath = 0;
jclass clazz = NULL;
if (getChoice == 0 || getMergedPath == 0)
{
clazz = env->FindClass(JAVA_PACKAGE "/ConflictResult");
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
}
if (getChoice == 0)
{
getChoice = env->GetMethodID(clazz, "getChoice",
"()L"JAVA_PACKAGE"/ConflictResult$Choice;");
if (JNIUtil::isJavaExceptionThrown() || getChoice == 0)
POP_AND_RETURN_NULL;
}
if (getMergedPath == 0)
{
getMergedPath = env->GetMethodID(clazz, "getMergedPath",
"()Ljava/lang/String;");
if (JNIUtil::isJavaExceptionThrown() || getMergedPath == 0)
POP_AND_RETURN_NULL;
}
jobject jchoice = env->CallObjectMethod(jresult, getChoice);
if (JNIUtil::isJavaExceptionThrown())
POP_AND_RETURN_NULL;
jstring jmergedPath = (jstring) env->CallObjectMethod(jresult, getMergedPath);
if (JNIUtil::isJavaExceptionThrown())
( run in 0.525 second using v1.01-cache-2.11-cpan-4991d5b9bd9 )