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

📄 notify2.cpp

📁 subversion-1.4.3-1.tar.gz 配置svn的源码
💻 CPP
字号:
/** * @copyright * ==================================================================== * Copyright (c) 2003-2005 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 Notify2.cpp * @brief Implementation of the class Notify2 */#include "Notify2.h"#include "JNIUtil.h"#include "SVNClient.h"#include "EnumMapper.h"//////////////////////////////////////////////////////////////////////// Construction/Destruction///////////////////////////////////////////////////////////////////////** * Create a new object and store the java object * @param notify    global reference to the java object */Notify2::Notify2(jobject p_notify){    m_notify = p_notify;}/** * Destroy the object and delete the global reference to the java object */Notify2::~Notify2(){    if(m_notify != NULL)    {        JNIEnv *env = JNIUtil::getEnv();        env->DeleteGlobalRef(m_notify);    }}/** * Create a C++ peer object for the java object * @param notify    a local reference to the java object */Notify2 * Notify2::makeCNotify(jobject notify){    // if the java object is null -> no C++ peer needed    if(notify == NULL)        return NULL;    JNIEnv *env = JNIUtil::getEnv();    // sanity check, that the object implements Notify    jclass clazz = env->FindClass(JAVA_PACKAGE"/Notify2");    if(JNIUtil::isJavaExceptionThrown())    {        return NULL;    }    if(!env->IsInstanceOf(notify, clazz))    {        env->DeleteLocalRef(clazz);        return NULL;    }    env->DeleteLocalRef(clazz);    if(JNIUtil::isJavaExceptionThrown())    {        return NULL;    }    // make a global reference, because the reference is longer needed, than    // the call    jobject myNotify = env->NewGlobalRef(notify);    if(JNIUtil::isJavaExceptionThrown())    {        return NULL;    }    // create the peer    return new Notify2(myNotify);}  /**   * notification function passed as svn_wc_notify_func2_t   * @param baton notification instance is passed using this parameter   * @param notify all the information about the event   * @param pool an apr pool to allocated memory   */voidNotify2::notify (    void *baton,    const svn_wc_notify_t *notify,    apr_pool_t *pool){    // an Notify object is used as the baton    Notify2 * that = (Notify2 *) baton;    if(that) // sanity check    {        // call our method        that->onNotify(notify, pool);    }}  /**   * Handler for Subversion notifications.   *   * @param notify all the information about the event   * @param pool an apr pool to allocated memory   */voidNotify2::onNotify (    const svn_wc_notify_t *wcNotify,    apr_pool_t *pool){    JNIEnv *env = JNIUtil::getEnv();    // java method id will not change during the time this library is loaded,    // so it can be cached.    static jmethodID mid = 0;    if(mid == 0)    {        jclass clazz = env->FindClass(JAVA_PACKAGE"/Notify2");        if(JNIUtil::isJavaExceptionThrown())        {            return;        }        mid = env->GetMethodID(clazz, "onNotify",             "(Lorg/tigris/subversion/javahl/NotifyInformation;)V");        if(JNIUtil::isJavaExceptionThrown() || mid == 0)        {            return;        }        env->DeleteLocalRef(clazz);        if(JNIUtil::isJavaExceptionThrown())        {            return;        }    }    static jmethodID midCT = 0;    jclass clazz = env->FindClass(JAVA_PACKAGE"/NotifyInformation");    if(JNIUtil::isJavaExceptionThrown())    {        return;    }    if(midCT == 0)    {        midCT = env->GetMethodID(clazz, "<init>",             "(Ljava/lang/String;IILjava/lang/String;"            "Lorg/tigris/subversion/javahl/Lock;Ljava/lang/String;IIIJ)V");        if(JNIUtil::isJavaExceptionThrown() || mid == 0)        {            return;        }    }    // convert the parameter to their java relatives    jstring jPath = JNIUtil::makeJString(wcNotify->path);    if(JNIUtil::isJavaExceptionThrown())    {        return;    }    jint jAction = EnumMapper::mapNotifyAction(wcNotify->action);    jint jKind = EnumMapper::mapNodeKind(wcNotify->kind);    jstring jMimeType = JNIUtil::makeJString(wcNotify->mime_type);    if(JNIUtil::isJavaExceptionThrown())    {        return;    }    jobject jLock = SVNClient::createJavaLock(wcNotify->lock);    if(JNIUtil::isJavaExceptionThrown())    {        return;    }    jstring jErr = JNIUtil::makeSVNErrorMessage(wcNotify->err);    if(JNIUtil::isJavaExceptionThrown())    {        return;    }    jint jContentState = EnumMapper::mapNotifyState(wcNotify->content_state);    jint jPropState = EnumMapper::mapNotifyState(wcNotify->prop_state);    jint jLockState = EnumMapper::mapNotifyLockState(wcNotify->lock_state);    // call the java method    jobject jInfo = env->NewObject(clazz, midCT, jPath, jAction, jKind,         jMimeType, jLock, jErr, jContentState, jPropState, jLockState,         (jlong) wcNotify->revision);    if(JNIUtil::isJavaExceptionThrown())    {        return;    }    // release all the temporary java objects    env->DeleteLocalRef(jPath);    if(JNIUtil::isJavaExceptionThrown())    {        return;    }    env->DeleteLocalRef(jMimeType);    if(JNIUtil::isJavaExceptionThrown())    {        return;    }    env->DeleteLocalRef(jErr);    if(JNIUtil::isJavaExceptionThrown())    {        return;    }    env->DeleteLocalRef(jLock);    if(JNIUtil::isJavaExceptionThrown())    {        return;    }    env->DeleteLocalRef(clazz);    if(JNIUtil::isJavaExceptionThrown())    {        return;    }    env->CallVoidMethod(m_notify, mid, jInfo);    if(JNIUtil::isJavaExceptionThrown())    {        return;    }    env->DeleteLocalRef(jInfo);    if(JNIUtil::isJavaExceptionThrown())    {        return;    }}

⌨️ 快捷键说明

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