⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 commitmessage.cpp

📁 subversion-1.4.3-1.tar.gz 配置svn的源码
💻 CPP
字号:
/** * @copyright * ==================================================================== * Copyright (c) 2003-2004 CollabNet.  All rights reserved. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution.  The terms * are also available at http://subversion.tigris.org/license-1.html. * If newer versions of this license are posted there, you may use a * newer version instead, at your option. * * This software consists of voluntary contributions made by many * individuals.  For exact contribution history, see the revision * history and logs, available at http://subversion.tigris.org/. * ==================================================================== * @endcopyright * * @file CommitMessage.cpp * @brief Implementation of the class CommitMessage */#include "CommitMessage.h"#include "JNIUtil.h"#include <apr_tables.h>#include "svn_client.h"#include "../include/org_tigris_subversion_javahl_CommitItemStateFlags.h"/** * Create a commit message object * @param jcommitMessage    the java object to receive the callback */CommitMessage::CommitMessage(jobject jcommitMessage){    m_jcommitMessage = jcommitMessage;}/** * Destroy a commit message object */CommitMessage::~CommitMessage(){    // since the m_jcommitMessage is a global reference, it has to be deleted    // to allow the java garbage collector to reclaim the object.    if(m_jcommitMessage!= NULL)    {        JNIEnv *env = JNIUtil::getEnv();        env->DeleteGlobalRef(m_jcommitMessage);    }}/** * Create a C++ holding object for the java object passed into the native code * @param jcommitMessage    local reference to the java object */CommitMessage * CommitMessage::makeCCommitMessage(jobject jcommitMessage){    // if there is no object passed into this method, there is no need for a     // C++ holding object    if(jcommitMessage == NULL)    {        return NULL;    }    // Sanity check, that the passed java object implements the right interface    JNIEnv *env = JNIUtil::getEnv();    jclass clazz = env->FindClass(JAVA_PACKAGE"/CommitMessage");    if(JNIUtil::isJavaExceptionThrown())    {        return NULL;    }    if(!env->IsInstanceOf(jcommitMessage, clazz))    {        env->DeleteLocalRef(clazz);        return NULL;    }    env->DeleteLocalRef(clazz);    if(JNIUtil::isJavaExceptionThrown())    {        return NULL;    }    // Since the reference is longer needed then the duration of the     // SVNClient.commtMessage, the local reference has to be converted to a     // global reference    jobject myCommitMessage = env->NewGlobalRef(jcommitMessage);    if(JNIUtil::isJavaExceptionThrown())    {        return NULL;    }    // create & return the holding object    return new CommitMessage(myCommitMessage);}/** * Call the java callback method to retrieve the commit message * @param commit_items  the array of the items of this commit * @returns the commit message */jstring CommitMessage::getCommitMessage(apr_array_header_t *commit_items){    JNIEnv *env = JNIUtil::getEnv();    // create an java array for the commit items    jclass clazz = env->FindClass(JAVA_PACKAGE"/CommitItem");    if(JNIUtil::isExceptionThrown())    {        return NULL;    }    int count = commit_items->nelts;    jobjectArray jitems = env->NewObjectArray(count, clazz, NULL);    if(JNIUtil::isExceptionThrown())    {        return NULL;    }    // java method ids will not change during the time this library is loaded,     // so they can be cached.     // get the method id for the CommitItem constructor    static jmethodID midConstructor = 0;    if(midConstructor == 0)    {        midConstructor = env->GetMethodID(clazz, "<init>",            "(Ljava/lang/String;IILjava/lang/String;Ljava/lang/String;J)V");        if(JNIUtil::isExceptionThrown())        {            return NULL;        }    }    // get the method if for the CommitMessage callback method    static jmethodID midCallback = 0;    if(midCallback == 0)    {        jclass clazz2 = env->FindClass(JAVA_PACKAGE"/CommitMessage");        if(JNIUtil::isJavaExceptionThrown())        {            return NULL;        }        midCallback = env->GetMethodID(clazz2, "getLogMessage",            "([L"JAVA_PACKAGE"/CommitItem;)Ljava/lang/String;");        if(JNIUtil::isJavaExceptionThrown())        {            return NULL;        }        env->DeleteLocalRef(clazz2);        if(JNIUtil::isJavaExceptionThrown())        {            return NULL;        }    }    // create a java CommitItem for each of the passed in commit items    for(int i = 0; i < count; i++)    {        // get the commit item        svn_client_commit_item_t *item            = ((svn_client_commit_item_t **) commit_items->elts)[i];        // convert the commit item members to the match java members        jstring jpath = JNIUtil::makeJString(item->path);        jint jnodeKind = item->kind;        jint jstateFlags = 0;        if(item->state_flags & SVN_CLIENT_COMMIT_ITEM_ADD)            jstateFlags |=                org_tigris_subversion_javahl_CommitItemStateFlags_Add;        if(item->state_flags & SVN_CLIENT_COMMIT_ITEM_DELETE)            jstateFlags |=                org_tigris_subversion_javahl_CommitItemStateFlags_Delete;        if(item->state_flags & SVN_CLIENT_COMMIT_ITEM_TEXT_MODS)            jstateFlags |=                org_tigris_subversion_javahl_CommitItemStateFlags_TextMods;        if(item->state_flags & SVN_CLIENT_COMMIT_ITEM_PROP_MODS)            jstateFlags |=                org_tigris_subversion_javahl_CommitItemStateFlags_PropMods;        if(item->state_flags & SVN_CLIENT_COMMIT_ITEM_IS_COPY)            jstateFlags |=                org_tigris_subversion_javahl_CommitItemStateFlags_IsCopy;        jstring jurl = JNIUtil::makeJString(item->url);        jstring jcopyUrl = JNIUtil::makeJString(item->copyfrom_url);        jlong jcopyRevision = item->revision;        // create the java object        jobject jitem = env->NewObject(clazz, midConstructor, jpath,            jnodeKind, jstateFlags, jurl, jcopyUrl, jcopyRevision);        if(JNIUtil::isJavaExceptionThrown())        {            return NULL;        }        // release the tempory java objects        env->DeleteLocalRef(jpath);        if(JNIUtil::isJavaExceptionThrown())        {            return NULL;        }        env->DeleteLocalRef(jurl);        if(JNIUtil::isJavaExceptionThrown())        {            return NULL;        }        env->DeleteLocalRef(jcopyUrl);        if(JNIUtil::isJavaExceptionThrown())        {            return NULL;        }        // store the java object into the array        env->SetObjectArrayElement(jitems, i, jitem);        if(JNIUtil::isJavaExceptionThrown())        {            return NULL;        }    }    env->DeleteLocalRef(clazz);    if(JNIUtil::isJavaExceptionThrown())    {        return NULL;    }    // call the java callback method    jstring jmessage = (jstring)env->CallObjectMethod(m_jcommitMessage,                                            midCallback, jitems);    if(JNIUtil::isJavaExceptionThrown())    {        return NULL;    }    // release the java object array    env->DeleteLocalRef(jitems);    if(JNIUtil::isJavaExceptionThrown())    {        return NULL;    }    return jmessage;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -