diff options
Diffstat (limited to 'subversion/bindings/javahl/native/ClientContext.cpp')
-rw-r--r-- | subversion/bindings/javahl/native/ClientContext.cpp | 289 |
1 files changed, 36 insertions, 253 deletions
diff --git a/subversion/bindings/javahl/native/ClientContext.cpp b/subversion/bindings/javahl/native/ClientContext.cpp index f1babc9..c9f327b 100644 --- a/subversion/bindings/javahl/native/ClientContext.cpp +++ b/subversion/bindings/javahl/native/ClientContext.cpp @@ -26,7 +26,6 @@ #include "svn_client.h" #include "private/svn_wc_private.h" -#include "svn_private_config.h" #include "ClientContext.h" #include "JNIUtil.h" @@ -37,39 +36,13 @@ #include "EnumMapper.h" #include "CommitMessage.h" +#include "svn_private_config.h" ClientContext::ClientContext(jobject jsvnclient, SVN::Pool &pool) - : m_prompter(NULL), - m_cancelOperation(false) + : OperationContext(pool) { - JNIEnv *env = JNIUtil::getEnv(); - - /* Grab a global reference to the Java object embedded in the parent Java - object. */ static jfieldID ctxFieldID = 0; - if (ctxFieldID == 0) - { - jclass clazz = env->GetObjectClass(jsvnclient); - if (JNIUtil::isJavaExceptionThrown()) - return; - - ctxFieldID = env->GetFieldID(clazz, "clientContext", - "L"JAVA_PACKAGE"/SVNClient$ClientContext;"); - if (JNIUtil::isJavaExceptionThrown() || ctxFieldID == 0) - return; - - env->DeleteLocalRef(clazz); - } - - jobject jctx = env->GetObjectField(jsvnclient, ctxFieldID); - if (JNIUtil::isJavaExceptionThrown()) - return; - - m_jctx = env->NewGlobalRef(jctx); - if (JNIUtil::isJavaExceptionThrown()) - return; - - env->DeleteLocalRef(jctx); + attachJavaObject(jsvnclient, JAVAHL_ARG("/SVNClient$ClientContext;"), "clientContext", &ctxFieldID); SVN_JNI_ERR(svn_client_create_context2(&m_context, NULL, pool.getPool()), @@ -96,18 +69,36 @@ ClientContext::ClientContext(jobject jsvnclient, SVN::Pool &pool) m_context->conflict_func2 = resolve; m_context->conflict_baton2 = m_jctx; - m_context->client_name = "javahl"; - m_pool = &pool; + m_context->client_name = getClientName(); + + if (m_jtunnelcb) + { + m_context->check_tunnel_func = checkTunnel; + m_context->open_tunnel_func = openTunnel; + m_context->tunnel_baton = m_jtunnelcb; + } } ClientContext::~ClientContext() { - delete m_prompter; - - JNIEnv *env = JNIUtil::getEnv(); - env->DeleteGlobalRef(m_jctx); } +void ClientContext::setTunnelCallback(jobject jtunnelcb) +{ + OperationContext::setTunnelCallback(jtunnelcb); + if (m_jtunnelcb) + { + m_context->check_tunnel_func = checkTunnel; + m_context->open_tunnel_func = openTunnel; + m_context->tunnel_baton = m_jtunnelcb; + } + else + { + m_context->check_tunnel_func = NULL; + m_context->open_tunnel_func = NULL; + m_context->tunnel_baton = NULL; + } +} /* Helper function to make sure that we don't keep dangling pointers in ctx. Note that this function might be called multiple times if getContext() @@ -140,7 +131,6 @@ svn_client_ctx_t * ClientContext::getContext(CommitMessage *message, SVN::Pool &in_pool) { apr_pool_t *pool = in_pool.getPool(); - svn_auth_baton_t *ab; svn_client_ctx_t *ctx = m_context; /* Make a temporary copy of ctx to restore at pool cleanup to avoid @@ -157,122 +147,17 @@ ClientContext::getContext(CommitMessage *message, SVN::Pool &in_pool) apr_pool_cleanup_register(in_pool.getPool(), bt, clear_ctx_ptrs, clear_ctx_ptrs); - if (!ctx->config) { - const char *configDir = m_configDir.c_str(); - if (m_configDir.empty()) - configDir = NULL; - SVN_JNI_ERR(svn_config_get_config(&(ctx->config), configDir, - m_pool->getPool()), - NULL); + apr_hash_t * configData = getConfigData(); + ctx->config = configData; bt->backup->config = ctx->config; } - svn_config_t *config = - reinterpret_cast<svn_config_t *>(apr_hash_get(ctx->config, - SVN_CONFIG_CATEGORY_CONFIG, - APR_HASH_KEY_STRING)); - - - /* The whole list of registered providers */ - apr_array_header_t *providers; - - /* Populate the registered providers with the platform-specific providers */ - SVN_JNI_ERR(svn_auth_get_platform_specific_client_providers(&providers, - config, - pool), - NULL); - - /* Use the prompter (if available) to prompt for password and cert - * caching. */ - svn_auth_plaintext_prompt_func_t plaintext_prompt_func = NULL; - void *plaintext_prompt_baton = NULL; - svn_auth_plaintext_passphrase_prompt_func_t plaintext_passphrase_prompt_func; - void *plaintext_passphrase_prompt_baton = NULL; - - if (m_prompter != NULL) - { - plaintext_prompt_func = Prompter::plaintext_prompt; - plaintext_prompt_baton = m_prompter; - plaintext_passphrase_prompt_func = Prompter::plaintext_passphrase_prompt; - plaintext_passphrase_prompt_baton = m_prompter; - } - - /* The main disk-caching auth providers, for both - * 'username/password' creds and 'username' creds. */ - svn_auth_provider_object_t *provider; - - svn_auth_get_simple_provider2(&provider, plaintext_prompt_func, - plaintext_prompt_baton, pool); - APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider; - - svn_auth_get_username_provider(&provider, pool); - APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider; - - /* The server-cert, client-cert, and client-cert-password providers. */ - SVN_JNI_ERR(svn_auth_get_platform_specific_provider(&provider, - "windows", - "ssl_server_trust", - pool), - NULL); - - if (provider) - APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider; - - svn_auth_get_ssl_server_trust_file_provider(&provider, pool); - APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider; - svn_auth_get_ssl_client_cert_file_provider(&provider, pool); - APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider; - svn_auth_get_ssl_client_cert_pw_file_provider2(&provider, - plaintext_passphrase_prompt_func, - plaintext_passphrase_prompt_baton, pool); - APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider; - - if (m_prompter != NULL) - { - /* Two basic prompt providers: username/password, and just username.*/ - provider = m_prompter->getProviderSimple(in_pool); - - APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider; - - provider = m_prompter->getProviderUsername(in_pool); - APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider; - - /* Three ssl prompt providers, for server-certs, client-certs, - * and client-cert-passphrases. */ - provider = m_prompter->getProviderServerSSLTrust(in_pool); - APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider; - - provider = m_prompter->getProviderClientSSL(in_pool); - APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider; - - provider = m_prompter->getProviderClientSSLPassword(in_pool); - APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider; - } - /* Build an authentication baton to give to libsvn_client. */ - svn_auth_open(&ab, providers, pool); - - /* Place any default --username or --password credentials into the - * auth_baton's run-time parameter hash. ### Same with --no-auth-cache? */ - if (!m_userName.empty()) - svn_auth_set_parameter(ab, SVN_AUTH_PARAM_DEFAULT_USERNAME, - apr_pstrdup(in_pool.getPool(), - m_userName.c_str())); - if (!m_passWord.empty()) - svn_auth_set_parameter(ab, SVN_AUTH_PARAM_DEFAULT_PASSWORD, - apr_pstrdup(in_pool.getPool(), - m_passWord.c_str())); - /* Store where to retrieve authentication data? */ - if (!m_configDir.empty()) - svn_auth_set_parameter(ab, SVN_AUTH_PARAM_CONFIG_DIR, - apr_pstrdup(in_pool.getPool(), - m_configDir.c_str())); - - ctx->auth_baton = ab; + ctx->auth_baton = getAuthBaton(in_pool); ctx->log_msg_baton3 = message; - m_cancelOperation = false; + resetCancelRequest(); SVN_JNI_ERR(svn_wc_context_create(&ctx->wc_ctx, NULL, in_pool.getPool(), in_pool.getPool()), @@ -282,60 +167,6 @@ ClientContext::getContext(CommitMessage *message, SVN::Pool &in_pool) } void -ClientContext::username(const char *pi_username) -{ - m_userName = (pi_username == NULL ? "" : pi_username); -} - -void -ClientContext::password(const char *pi_password) -{ - m_passWord = (pi_password == NULL ? "" : pi_password); -} - -void -ClientContext::setPrompt(Prompter *prompter) -{ - delete m_prompter; - m_prompter = prompter; -} - -void -ClientContext::setConfigDirectory(const char *configDir) -{ - // A change to the config directory may necessitate creation of - // the config templates. - SVN::Pool requestPool; - SVN_JNI_ERR(svn_config_ensure(configDir, requestPool.getPool()), ); - - m_configDir = (configDir == NULL ? "" : configDir); - m_context->config = NULL; -} - -const char * -ClientContext::getConfigDirectory() const -{ - return m_configDir.c_str(); -} - -void -ClientContext::cancelOperation() -{ - m_cancelOperation = true; -} - -svn_error_t * -ClientContext::checkCancel(void *cancelBaton) -{ - ClientContext *that = static_cast<ClientContext *>(cancelBaton); - if (that->m_cancelOperation) - return svn_error_create(SVN_ERR_CANCELLED, NULL, - _("Operation cancelled")); - else - return SVN_NO_ERROR; -} - -void ClientContext::notify(void *baton, const svn_wc_notify_t *notify, apr_pool_t *pool) @@ -351,7 +182,7 @@ ClientContext::notify(void *baton, return; mid = env->GetMethodID(clazz, "onNotify", - "(L"JAVA_PACKAGE"/ClientNotifyInformation;)V"); + "(" JAVAHL_ARG("/ClientNotifyInformation;") ")V"); if (JNIUtil::isJavaExceptionThrown() || mid == 0) return; @@ -369,54 +200,6 @@ ClientContext::notify(void *baton, env->DeleteLocalRef(jInfo); } -void -ClientContext::progress(apr_off_t progressVal, apr_off_t total, - void *baton, apr_pool_t *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; - - static jmethodID mid = 0; - if (mid == 0) - { - jclass clazz = env->GetObjectClass(jctx); - if (JNIUtil::isJavaExceptionThrown()) - POP_AND_RETURN_NOTHING(); - - mid = env->GetMethodID(clazz, "onProgress", - "(L"JAVA_PACKAGE"/ProgressEvent;)V"); - if (JNIUtil::isJavaExceptionThrown() || mid == 0) - POP_AND_RETURN_NOTHING(); - } - - static jmethodID midCT = 0; - 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, @@ -440,8 +223,8 @@ ClientContext::resolve(svn_wc_conflict_result_t **result, POP_AND_RETURN(SVN_NO_ERROR); mid = env->GetMethodID(clazz, "resolve", - "(L"JAVA_PACKAGE"/ConflictDescriptor;)" - "L"JAVA_PACKAGE"/ConflictResult;"); + "(" JAVAHL_ARG("/ConflictDescriptor;") ")" + JAVAHL_ARG("/ConflictResult;")); if (JNIUtil::isJavaExceptionThrown() || mid == 0) POP_AND_RETURN(SVN_NO_ERROR); } @@ -493,7 +276,7 @@ ClientContext::javaResultToC(jobject jresult, apr_pool_t *pool) jclass clazz = NULL; if (getChoice == 0 || getMergedPath == 0) { - clazz = env->FindClass(JAVA_PACKAGE "/ConflictResult"); + clazz = env->FindClass(JAVAHL_CLASS("/ConflictResult")); if (JNIUtil::isJavaExceptionThrown()) POP_AND_RETURN_NULL; } @@ -501,7 +284,7 @@ ClientContext::javaResultToC(jobject jresult, apr_pool_t *pool) if (getChoice == 0) { getChoice = env->GetMethodID(clazz, "getChoice", - "()L"JAVA_PACKAGE"/ConflictResult$Choice;"); + "()" JAVAHL_ARG("/ConflictResult$Choice;")); if (JNIUtil::isJavaExceptionThrown() || getChoice == 0) POP_AND_RETURN_NULL; } |