37
36
#include "EnumMapper.h"
38
37
#include "CommitMessage.h"
39
#include "svn_private_config.h"
41
41
ClientContext::ClientContext(jobject jsvnclient, SVN::Pool &pool)
43
m_cancelOperation(false)
42
: OperationContext(pool)
45
JNIEnv *env = JNIUtil::getEnv();
47
/* Grab a global reference to the Java object embedded in the parent Java
49
44
static jfieldID ctxFieldID = 0;
52
jclass clazz = env->GetObjectClass(jsvnclient);
53
if (JNIUtil::isJavaExceptionThrown())
56
ctxFieldID = env->GetFieldID(clazz, "clientContext",
57
"L"JAVA_PACKAGE"/SVNClient$ClientContext;");
58
if (JNIUtil::isJavaExceptionThrown() || ctxFieldID == 0)
61
env->DeleteLocalRef(clazz);
64
jobject jctx = env->GetObjectField(jsvnclient, ctxFieldID);
65
if (JNIUtil::isJavaExceptionThrown())
68
m_jctx = env->NewGlobalRef(jctx);
69
if (JNIUtil::isJavaExceptionThrown())
72
env->DeleteLocalRef(jctx);
45
attachJavaObject(jsvnclient, JAVAHL_ARG("/SVNClient$ClientContext;"), "clientContext", &ctxFieldID);
74
47
SVN_JNI_ERR(svn_client_create_context2(&m_context, NULL,
96
69
m_context->conflict_func2 = resolve;
97
70
m_context->conflict_baton2 = m_jctx;
99
m_context->client_name = "javahl";
72
m_context->client_name = getClientName();
76
m_context->check_tunnel_func = checkTunnel;
77
m_context->open_tunnel_func = openTunnel;
78
m_context->tunnel_baton = m_jtunnelcb;
103
82
ClientContext::~ClientContext()
107
JNIEnv *env = JNIUtil::getEnv();
108
env->DeleteGlobalRef(m_jctx);
86
void ClientContext::setTunnelCallback(jobject jtunnelcb)
88
OperationContext::setTunnelCallback(jtunnelcb);
91
m_context->check_tunnel_func = checkTunnel;
92
m_context->open_tunnel_func = openTunnel;
93
m_context->tunnel_baton = m_jtunnelcb;
97
m_context->check_tunnel_func = NULL;
98
m_context->open_tunnel_func = NULL;
99
m_context->tunnel_baton = NULL;
112
103
/* Helper function to make sure that we don't keep dangling pointers in ctx.
113
104
Note that this function might be called multiple times if getContext()
157
147
apr_pool_cleanup_register(in_pool.getPool(), bt, clear_ctx_ptrs,
161
150
if (!ctx->config)
163
const char *configDir = m_configDir.c_str();
164
if (m_configDir.empty())
166
SVN_JNI_ERR(svn_config_get_config(&(ctx->config), configDir,
152
apr_hash_t * configData = getConfigData();
154
ctx->config = configData;
170
155
bt->backup->config = ctx->config;
172
svn_config_t *config =
173
reinterpret_cast<svn_config_t *>(apr_hash_get(ctx->config,
174
SVN_CONFIG_CATEGORY_CONFIG,
175
APR_HASH_KEY_STRING));
178
/* The whole list of registered providers */
179
apr_array_header_t *providers;
181
/* Populate the registered providers with the platform-specific providers */
182
SVN_JNI_ERR(svn_auth_get_platform_specific_client_providers(&providers,
187
/* Use the prompter (if available) to prompt for password and cert
189
svn_auth_plaintext_prompt_func_t plaintext_prompt_func = NULL;
190
void *plaintext_prompt_baton = NULL;
191
svn_auth_plaintext_passphrase_prompt_func_t plaintext_passphrase_prompt_func;
192
void *plaintext_passphrase_prompt_baton = NULL;
194
if (m_prompter != NULL)
196
plaintext_prompt_func = Prompter::plaintext_prompt;
197
plaintext_prompt_baton = m_prompter;
198
plaintext_passphrase_prompt_func = Prompter::plaintext_passphrase_prompt;
199
plaintext_passphrase_prompt_baton = m_prompter;
202
/* The main disk-caching auth providers, for both
203
* 'username/password' creds and 'username' creds. */
204
svn_auth_provider_object_t *provider;
206
svn_auth_get_simple_provider2(&provider, plaintext_prompt_func,
207
plaintext_prompt_baton, pool);
208
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
210
svn_auth_get_username_provider(&provider, pool);
211
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
213
/* The server-cert, client-cert, and client-cert-password providers. */
214
SVN_JNI_ERR(svn_auth_get_platform_specific_provider(&provider,
221
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
223
svn_auth_get_ssl_server_trust_file_provider(&provider, pool);
224
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
225
svn_auth_get_ssl_client_cert_file_provider(&provider, pool);
226
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
227
svn_auth_get_ssl_client_cert_pw_file_provider2(&provider,
228
plaintext_passphrase_prompt_func,
229
plaintext_passphrase_prompt_baton, pool);
230
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
232
if (m_prompter != NULL)
234
/* Two basic prompt providers: username/password, and just username.*/
235
provider = m_prompter->getProviderSimple(in_pool);
237
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
239
provider = m_prompter->getProviderUsername(in_pool);
240
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
242
/* Three ssl prompt providers, for server-certs, client-certs,
243
* and client-cert-passphrases. */
244
provider = m_prompter->getProviderServerSSLTrust(in_pool);
245
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
247
provider = m_prompter->getProviderClientSSL(in_pool);
248
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
250
provider = m_prompter->getProviderClientSSLPassword(in_pool);
251
APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = provider;
254
/* Build an authentication baton to give to libsvn_client. */
255
svn_auth_open(&ab, providers, pool);
257
/* Place any default --username or --password credentials into the
258
* auth_baton's run-time parameter hash. ### Same with --no-auth-cache? */
259
if (!m_userName.empty())
260
svn_auth_set_parameter(ab, SVN_AUTH_PARAM_DEFAULT_USERNAME,
261
apr_pstrdup(in_pool.getPool(),
262
m_userName.c_str()));
263
if (!m_passWord.empty())
264
svn_auth_set_parameter(ab, SVN_AUTH_PARAM_DEFAULT_PASSWORD,
265
apr_pstrdup(in_pool.getPool(),
266
m_passWord.c_str()));
267
/* Store where to retrieve authentication data? */
268
if (!m_configDir.empty())
269
svn_auth_set_parameter(ab, SVN_AUTH_PARAM_CONFIG_DIR,
270
apr_pstrdup(in_pool.getPool(),
271
m_configDir.c_str()));
273
ctx->auth_baton = ab;
158
ctx->auth_baton = getAuthBaton(in_pool);
274
159
ctx->log_msg_baton3 = message;
275
m_cancelOperation = false;
160
resetCancelRequest();
277
162
SVN_JNI_ERR(svn_wc_context_create(&ctx->wc_ctx, NULL,
278
163
in_pool.getPool(), in_pool.getPool()),
285
ClientContext::username(const char *pi_username)
287
m_userName = (pi_username == NULL ? "" : pi_username);
291
ClientContext::password(const char *pi_password)
293
m_passWord = (pi_password == NULL ? "" : pi_password);
297
ClientContext::setPrompt(Prompter *prompter)
300
m_prompter = prompter;
304
ClientContext::setConfigDirectory(const char *configDir)
306
// A change to the config directory may necessitate creation of
307
// the config templates.
308
SVN::Pool requestPool;
309
SVN_JNI_ERR(svn_config_ensure(configDir, requestPool.getPool()), );
311
m_configDir = (configDir == NULL ? "" : configDir);
312
m_context->config = NULL;
316
ClientContext::getConfigDirectory() const
318
return m_configDir.c_str();
322
ClientContext::cancelOperation()
324
m_cancelOperation = true;
328
ClientContext::checkCancel(void *cancelBaton)
330
ClientContext *that = static_cast<ClientContext *>(cancelBaton);
331
if (that->m_cancelOperation)
332
return svn_error_create(SVN_ERR_CANCELLED, NULL,
333
_("Operation cancelled"));
339
170
ClientContext::notify(void *baton,
340
171
const svn_wc_notify_t *notify,
341
172
apr_pool_t *pool)
369
200
env->DeleteLocalRef(jInfo);
373
ClientContext::progress(apr_off_t progressVal, apr_off_t total,
374
void *baton, apr_pool_t *pool)
376
jobject jctx = (jobject) baton;
377
JNIEnv *env = JNIUtil::getEnv();
379
// Create a local frame for our references
380
env->PushLocalFrame(LOCAL_FRAME_SIZE);
381
if (JNIUtil::isJavaExceptionThrown())
384
static jmethodID mid = 0;
387
jclass clazz = env->GetObjectClass(jctx);
388
if (JNIUtil::isJavaExceptionThrown())
389
POP_AND_RETURN_NOTHING();
391
mid = env->GetMethodID(clazz, "onProgress",
392
"(L"JAVA_PACKAGE"/ProgressEvent;)V");
393
if (JNIUtil::isJavaExceptionThrown() || mid == 0)
394
POP_AND_RETURN_NOTHING();
397
static jmethodID midCT = 0;
398
jclass clazz = env->FindClass(JAVA_PACKAGE"/ProgressEvent");
399
if (JNIUtil::isJavaExceptionThrown())
400
POP_AND_RETURN_NOTHING();
404
midCT = env->GetMethodID(clazz, "<init>", "(JJ)V");
405
if (JNIUtil::isJavaExceptionThrown() || midCT == 0)
406
POP_AND_RETURN_NOTHING();
409
// Call the Java method.
410
jobject jevent = env->NewObject(clazz, midCT,
411
(jlong) progressVal, (jlong) total);
412
if (JNIUtil::isJavaExceptionThrown())
413
POP_AND_RETURN_NOTHING();
415
env->CallVoidMethod(jctx, mid, jevent);
417
POP_AND_RETURN_NOTHING();
421
204
ClientContext::resolve(svn_wc_conflict_result_t **result,
422
205
const svn_wc_conflict_description2_t *desc,