Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/bindings/javahl/native/JNIUtil.cpp view on Meta::CPAN
jobject ret = env->NewObject(clazz, mid, javatime);
if (isJavaExceptionThrown())
return NULL;
env->DeleteLocalRef(clazz);
return ret;
}
/**
* Create a Java byte array from an array of characters.
* @param data the character array
* @param length the number of characters in the array
*/
jbyteArray JNIUtil::makeJByteArray(const void *data, int length)
{
if (data == NULL)
{
// a NULL will create no Java array
return NULL;
}
JNIEnv *env = getEnv();
// Allocate the Java array.
jbyteArray ret = env->NewByteArray(length);
if (isJavaExceptionThrown() || ret == NULL)
return NULL;
// Access the bytes.
jbyte *retdata = env->GetByteArrayElements(ret, NULL);
if (isJavaExceptionThrown())
return NULL;
// Copy the bytes.
memcpy(retdata, data, length);
// Release the bytes.
env->ReleaseByteArrayElements(ret, retdata, 0);
if (isJavaExceptionThrown())
return NULL;
return ret;
}
/**
* Create a Java byte array from an svn_string_t.
* @param str the string
*/
jbyteArray JNIUtil::makeJByteArray(const svn_string_t *str)
{
return JNIUtil::makeJByteArray(str->data, static_cast<int>(str->len));
}
/**
* Build the error message from the svn error into buffer. This
* method calls itselft recursively for all the chained errors
*
* @param err the subversion error
* @param depth the depth of the call, used for formating
* @param parent_apr_err the apr of the previous level, used for formating
* @param buffer the buffer where the formated error message will
* be stored
*/
void JNIUtil::assembleErrorMessage(svn_error_t *err, int depth,
apr_status_t parent_apr_err,
std::string &buffer)
{
// buffer for a single error message
char errbuf[256];
/* Pretty-print the error */
/* Note: we can also log errors here someday. */
/* When we're recursing, don't repeat the top-level message if its
* the same as before. */
if (depth == 0 || err->apr_err != parent_apr_err)
{
/* Is this a Subversion-specific error code? */
if ((err->apr_err > APR_OS_START_USEERR)
&& (err->apr_err <= APR_OS_START_CANONERR))
buffer.append(svn_strerror(err->apr_err, errbuf, sizeof(errbuf)));
/* Otherwise, this must be an APR error code. */
else
{
/* Messages coming from apr_strerror are in the native
encoding, it's a good idea to convert them to UTF-8. */
const char* utf8_message;
apr_strerror(err->apr_err, errbuf, sizeof(errbuf));
svn_error_t* utf8_err = svn_utf_cstring_to_utf8(
&utf8_message, errbuf, err->pool);
if (utf8_err)
{
/* Use fuzzy transliteration instead. */
svn_error_clear(utf8_err);
utf8_message = svn_utf_cstring_from_utf8_fuzzy(errbuf, err->pool);
}
buffer.append(utf8_message);
}
buffer.append("\n");
}
if (err->message)
buffer.append(_("svn: ")).append(err->message).append("\n");
if (err->child)
assembleErrorMessage(err->child, depth + 1, err->apr_err, buffer);
}
/**
* Throw a Java NullPointerException. Used when input parameters
* which should not be null are that.
*
* @param message the name of the parameter that is null
*/
void JNIUtil::throwNullPointerException(const char *message)
{
if (getLogLevel() >= errorLog)
logMessage("NullPointerException thrown");
JNIEnv *env = getEnv();
jclass clazz = env->FindClass("java/lang/NullPointerException");
if (isJavaExceptionThrown())
return;
env->ThrowNew(clazz, message);
setExceptionThrown();
env->DeleteLocalRef(clazz);
}
svn_error_t *JNIUtil::preprocessPath(const char *&path, apr_pool_t *pool)
{
/* URLs and wc-paths get treated differently. */
if (svn_path_is_url(path))
{
/* No need to canonicalize a URL's case or path separators. */
( run in 0.659 second using v1.01-cache-2.11-cpan-d7f47b0818f )