/**
* @copyright
* ====================================================================
* Copyright (c) 2003 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 Revision.cpp
* @brief Implementation of the class Revision
*/
#include "Revision.h"
#include "../include/org_tigris_subversion_javahl_RevisionKind.h"
#include "JNIUtil.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
const svn_opt_revision_kind Revision::START = svn_opt_revision_unspecified;
const svn_opt_revision_kind Revision::HEAD = svn_opt_revision_head;
Revision::Revision (const svn_opt_revision_kind kind)
{
m_revision.kind = kind;
m_revision.value.number = 0;
}
Revision::Revision(jobject jthis, bool headIfUnspecified, bool oneIfUnspecified)
{
if(jthis == NULL)
{
m_revision.kind = svn_opt_revision_unspecified;
m_revision.value.number = 0;
}
else
{
JNIEnv *env = JNIUtil::getEnv();
static jfieldID fid = 0;
if(fid == 0)
{
jclass clazz = env->FindClass(JAVA_PACKAGE"/Revision");
if(JNIUtil::isJavaExceptionThrown())
{
return;
}
fid = env->GetFieldID(clazz, "revKind", "I");
if(JNIUtil::isJavaExceptionThrown())
{
return;
}
env->DeleteLocalRef(clazz);
if(JNIUtil::isJavaExceptionThrown())
{
return;
}
}
jint jKind = env->GetIntField(jthis, fid);
if(JNIUtil::isJavaExceptionThrown())
{
return;
}
m_revision.value.number = 0;
switch(jKind)
{
case org_tigris_subversion_javahl_RevisionKind_unspecified:
m_revision.kind = svn_opt_revision_unspecified;
break;
case org_tigris_subversion_javahl_RevisionKind_number:
m_revision.kind = svn_opt_revision_number;
{
static jfieldID fidNum = 0;
if(fidNum == 0)
{
jclass clazz =
env->FindClass(JAVA_PACKAGE"/Revision$Number");
if(JNIUtil::isJavaExceptionThrown())
{
return;
}
fidNum = env->GetFieldID(clazz, "revNumber", "J");
if(JNIUtil::isJavaExceptionThrown())
{
return;
}
env->DeleteLocalRef(clazz);
if(JNIUtil::isJavaExceptionThrown())
{
return;
}
}
jlong jNumber = env->GetLongField(jthis, fidNum);
m_revision.value.number = jNumber;
}
break;
case org_tigris_subversion_javahl_RevisionKind_date:
m_revision.kind = svn_opt_revision_date;
{
static jfieldID fidDate = 0;
if(fidDate == 0)
{
jclass clazz =
env->FindClass(JAVA_PACKAGE"/Revision$DateSpec");
if(JNIUtil::isJavaExceptionThrown())
{
return;
}
fidDate = env->GetFieldID(clazz, "revDate",
"Ljava/util/Date;");
if(JNIUtil::isJavaExceptionThrown())
{
return;
}
env->DeleteLocalRef(clazz);
if(JNIUtil::isJavaExceptionThrown())
{
return;
}
}
jobject jDate = env->GetObjectField(jthis, fidDate);
if(JNIUtil::isJavaExceptionThrown())
{
return;
}
static jmethodID mid = 0;
if(mid == 0)
{
jclass clazz = env->FindClass("java/util/Date");
if(JNIUtil::isJavaExceptionThrown())
{
return;
}
mid = env->GetMethodID(clazz, "getTime", "()J");
if(JNIUtil::isJavaExceptionThrown())
{
return;
}
env->DeleteLocalRef(clazz);
if(JNIUtil::isJavaExceptionThrown())
{
return;
}
}
jlong jMillSec = env->CallLongMethod(jDate, mid);
if(JNIUtil::isJavaExceptionThrown())
{
return;
}
env->DeleteLocalRef(jDate);
if(JNIUtil::isJavaExceptionThrown())
{
return;
}
m_revision.value.date = jMillSec * 1000;
}
break;
case org_tigris_subversion_javahl_RevisionKind_committed:
m_revision.kind = svn_opt_revision_committed;
break;
case org_tigris_subversion_javahl_RevisionKind_previous:
m_revision.kind = svn_opt_revision_previous;
break;
case org_tigris_subversion_javahl_RevisionKind_base:
m_revision.kind = svn_opt_revision_base;
break;
case org_tigris_subversion_javahl_RevisionKind_working:
m_revision.kind = svn_opt_revision_working;
break;
case org_tigris_subversion_javahl_RevisionKind_head:
m_revision.kind = svn_opt_revision_head;
break;
}
}
if(headIfUnspecified && m_revision.kind == svn_opt_revision_unspecified)
m_revision.kind = svn_opt_revision_head;
else if(oneIfUnspecified && m_revision.kind == svn_opt_revision_unspecified)
{
m_revision.kind = svn_opt_revision_number;
m_revision.value.number = 1;
}
}
Revision::~Revision()
{
}
const svn_opt_revision_t *Revision::revision () const
{
return &m_revision;
}
syntax highlighted by Code2HTML, v. 0.9.1