Files
mars-flaim/xflaim/java/jni/jdatavector.cpp
ahodgkinson 12a621dc04 Changed license to LGPL.
git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@1010 0109f412-320b-0410-ab79-c3e0c5ffbbe6
2007-01-23 11:22:22 +00:00

735 lines
18 KiB
C++

//------------------------------------------------------------------------------
// Desc:
// Tabs: 3
//
// Copyright (c) 2003-2007 Novell, Inc. All Rights Reserved.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; version 2.1
// of the License.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, contact Novell, Inc.
//
// To contact Novell about this file by physical or electronic mail,
// you may find current contact information at www.novell.com.
//
// $Id$
//------------------------------------------------------------------------------
#include "xflaim.h"
#include "xflaim_DataVector.h"
#include "jniftk.h"
#define THIS_VECTOR() \
((IF_DataVector *)(FLMUINT)lThis)
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT void JNICALL Java_xflaim_DataVector__1release(
JNIEnv *, // pEnv,
jobject, // obj,
jlong lThis)
{
THIS_VECTOR()->Release();
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT void JNICALL Java_xflaim_DataVector__1setDocumentId(
JNIEnv *, // pEnv,
jobject, // obj,
jlong lThis,
jlong lDocumentId)
{
THIS_VECTOR()->setDocumentID( (FLMUINT64)lDocumentId);
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT void JNICALL Java_xflaim_DataVector__1setID(
JNIEnv * pEnv,
jobject, // obj,
jlong lThis,
jint iElementId,
jlong lID)
{
RCODE rc = NE_XFLM_OK;
if (RC_BAD( rc = THIS_VECTOR()->setID( (FLMUINT)iElementId, (FLMUINT64)lID)))
{
ThrowError( rc, pEnv);
}
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT void JNICALL Java_xflaim_DataVector__1setNameId(
JNIEnv * pEnv,
jobject, // obj,
jlong lThis,
jint iElementNumber,
jint iNameId,
jboolean bIsAttr,
jboolean bIsData)
{
RCODE rc = NE_XFLM_OK;
if (RC_BAD( rc = THIS_VECTOR()->setNameId( (FLMUINT)iElementNumber,
(FLMUINT)iNameId, (FLMBOOL)(bIsAttr ? TRUE : FALSE),
(FLMBOOL)(bIsData ? TRUE : FALSE))))
{
ThrowError( rc, pEnv);
}
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT void JNICALL Java_xflaim_DataVector__1setLong(
JNIEnv * pEnv,
jobject, // obj,
jlong lThis,
jint iElementNumber,
jlong lNum)
{
RCODE rc = NE_XFLM_OK;
if (RC_BAD( rc = THIS_VECTOR()->setINT64(
(FLMUINT)iElementNumber, (FLMINT64)lNum)))
{
ThrowError( rc, pEnv);
}
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT void JNICALL Java_xflaim_DataVector__1setString(
JNIEnv * pEnv,
jobject, // obj,
jlong lThis,
jint iElementNumber,
jstring sValue)
{
RCODE rc = NE_XFLM_OK;
FLMBYTE ucValue [256];
F_DynaBuf valueBuf( ucValue, sizeof( ucValue));
if (RC_BAD( rc = getUniString( pEnv, sValue, &valueBuf)))
{
ThrowError( rc, pEnv);
goto Exit;
}
if (RC_BAD( rc = THIS_VECTOR()->setUnicode(
(FLMUINT)iElementNumber, valueBuf.getUnicodePtr())))
{
ThrowError( rc, pEnv);
goto Exit;
}
Exit:
return;
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT void JNICALL Java_xflaim_DataVector__1setBinary(
JNIEnv * pEnv,
jobject, // obj,
jlong lThis,
jint iElementNumber,
jbyteArray Value)
{
RCODE rc = NE_XFLM_OK;
FLMUINT uiLength = pEnv->GetArrayLength( Value);
void * pvValue = NULL;
jboolean bIsCopy = false;
FLMBOOL bMustRelease = false;
if ( (pvValue = pEnv->GetPrimitiveArrayCritical( Value, &bIsCopy)) == NULL)
{
rc = RC_SET( NE_XFLM_MEM);
ThrowError( rc, pEnv);
goto Exit;
}
bMustRelease = true;
if (RC_BAD( rc = THIS_VECTOR()->setBinary( (FLMUINT)iElementNumber,
pvValue, uiLength)))
{
ThrowError( rc, pEnv);
goto Exit;
}
Exit:
if (bMustRelease)
{
pEnv->ReleasePrimitiveArrayCritical( Value, pvValue, JNI_ABORT);
}
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT void JNICALL Java_xflaim_DataVector__1setRightTruncated(
JNIEnv *, // pEnv,
jobject, // obj,
jlong lThis,
jint iElementNumber)
{
THIS_VECTOR()->setRightTruncated( (FLMUINT)iElementNumber);
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT void JNICALL Java_xflaim_DataVector__1setLeftTruncated(
JNIEnv *, // pEnv,
jobject, // obj,
jlong lThis,
jint iElementNumber)
{
THIS_VECTOR()->setLeftTruncated( (FLMUINT)iElementNumber);
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT void JNICALL Java_xflaim_DataVector__1clearRightTruncated(
JNIEnv *, // pEnv,
jobject, // obj,
jlong lThis,
jint iElementNumber)
{
THIS_VECTOR()->clearRightTruncated( (FLMUINT)iElementNumber);
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT void JNICALL Java_xflaim_DataVector__1clearLeftTruncated(
JNIEnv *, // pEnv,
jobject, // obj,
jlong lThis,
jint iElementNumber)
{
THIS_VECTOR()->clearLeftTruncated( (FLMUINT)iElementNumber);
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT jboolean JNICALL Java_xflaim_DataVector__1isRightTruncated(
JNIEnv *, // pEnv,
jobject, // obj,
jlong lThis,
jint iElementNumber)
{
return( (jboolean)(THIS_VECTOR()->isRightTruncated( (FLMUINT)iElementNumber)
? JNI_TRUE
: JNI_FALSE));
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT jboolean JNICALL Java_xflaim_DataVector__1isLeftTruncated(
JNIEnv *, // pEnv,
jobject, // obj,
jlong lThis,
jint iElementNumber)
{
return( (jboolean)(THIS_VECTOR()->isLeftTruncated( (FLMUINT)iElementNumber)
? JNI_TRUE
: JNI_FALSE));
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT jlong JNICALL Java_xflaim_DataVector__1getDocumentID(
JNIEnv *, // pEnv,
jobject, // obj,
jlong lThis)
{
return( (jlong)(THIS_VECTOR()->getDocumentID()));
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT jlong JNICALL Java_xflaim_DataVector__1getID(
JNIEnv *, // pEnv,
jobject, // obj,
jlong lThis,
jint iElementNumber)
{
return( (jlong)THIS_VECTOR()->getID( (FLMUINT)iElementNumber));
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT jint JNICALL Java_xflaim_DataVector__1getNameId(
JNIEnv *, // pEnv,
jobject, // obj,
jlong lThis,
jint iElementNumber)
{
return( (jint)THIS_VECTOR()->getNameId( (FLMUINT)iElementNumber));
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT jboolean JNICALL Java_xflaim_DataVector__1isAttr(
JNIEnv *, // pEnv,
jobject, // obj,
jlong lThis,
jint iElementNumber)
{
return( THIS_VECTOR()->isAttr( (FLMUINT)iElementNumber) ? true : false);
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT jboolean JNICALL Java_xflaim_DataVector__1isDataComponent(
JNIEnv *, // pEnv,
jobject, // obj,
jlong lThis,
jint iElementNumber)
{
return( THIS_VECTOR()->isDataComponent(
(FLMUINT)iElementNumber) ? true : false);
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT jboolean JNICALL Java_xflaim_DataVector__1isKeyComponent(
JNIEnv *, // pEnv,
jobject, // obj,
jlong lThis,
jint iElementNumber)
{
return( THIS_VECTOR()->isKeyComponent(
(FLMUINT)iElementNumber) ? true : false);
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT jint JNICALL Java_xflaim_DataVector__1getDataLength(
JNIEnv *, // pEnv,
jobject, // obj,
jlong lThis,
jint iElementNumber)
{
return( (jint)THIS_VECTOR()->getDataLength( (FLMUINT)iElementNumber));
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT jint JNICALL Java_xflaim_DataVector__1getDataType(
JNIEnv *, // pEnv,
jobject, // obj,
jlong lThis,
jint iElementNumber)
{
return( (jint)(THIS_VECTOR()->getDataType( (FLMUINT)iElementNumber)));
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT jlong JNICALL Java_xflaim_DataVector__1getLong(
JNIEnv * pEnv,
jobject, // obj,
jlong lThis,
jint iElementNumber)
{
RCODE rc = NE_XFLM_OK;
FLMINT64 i64INT;
if (RC_BAD( rc = THIS_VECTOR()->getINT64( (FLMUINT)iElementNumber, &i64INT)))
{
ThrowError( rc, pEnv);
goto Exit;
}
Exit:
return( (jlong)i64INT);
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT jstring JNICALL Java_xflaim_DataVector__1getString(
JNIEnv * pEnv,
jobject, // obj,
jlong lThis,
jint iElementNumber)
{
RCODE rc = NE_XFLM_OK;
FLMUNICODE uzBuffer[ 128];
FLMUNICODE * puzBuf = uzBuffer;
FLMUINT uiBufSize = sizeof( uzBuffer);
FLMUINT uiNumChars;
jstring sBuf = NULL;
if (RC_BAD( rc = THIS_VECTOR()->getUnicode( (FLMUINT)iElementNumber,
NULL, &uiNumChars)))
{
ThrowError( rc, pEnv);
goto Exit;
}
if (uiNumChars * sizeof( FLMUNICODE) >= uiBufSize)
{
uiBufSize = (uiNumChars + 1) * sizeof( FLMUNICODE);
if (RC_BAD( rc = f_alloc( uiBufSize, &puzBuf)))
{
ThrowError( rc, pEnv);
goto Exit;
}
}
if (RC_BAD( rc = THIS_VECTOR()->getUnicode( (FLMUINT)iElementNumber,
puzBuf, &uiBufSize)))
{
ThrowError( rc, pEnv);
goto Exit;
}
sBuf = pEnv->NewString( puzBuf, (jsize)(uiBufSize / sizeof( FLMUNICODE)));
Exit:
if (puzBuf != uzBuffer)
{
f_free( &puzBuf);
}
return( sBuf);
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT jbyteArray JNICALL Java_xflaim_DataVector__1getBinary(
JNIEnv * pEnv,
jobject, // obj,
jlong lThis,
jint iElementNumber)
{
RCODE rc = NE_XFLM_OK;
FLMUINT uiLength;
jbyteArray Data;
void * pvData = NULL;
jboolean bIsCopy = false;
FLMBOOL bMustRelease = false;
uiLength = THIS_VECTOR()->getDataLength( (FLMUINT)iElementNumber);
Data = pEnv->NewByteArray( (jsize)uiLength);
if ( (pvData = pEnv->GetPrimitiveArrayCritical( Data, &bIsCopy)) == NULL)
{
rc = RC_SET( NE_XFLM_MEM);
ThrowError( rc, pEnv);
goto Exit;
}
bMustRelease = true;
if (RC_BAD( rc = THIS_VECTOR()->getBinary( (FLMUINT)iElementNumber,
pvData, &uiLength)))
{
ThrowError( rc, pEnv);
goto Exit;
}
Exit:
if (bMustRelease)
{
if (RC_BAD( rc))
{
pEnv->ReleasePrimitiveArrayCritical( Data, pvData, JNI_ABORT);
pEnv->DeleteLocalRef( Data);
Data = NULL;
}
else
{
pEnv->ReleasePrimitiveArrayCritical( Data, pvData, 0);
}
}
return( Data);
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT jbyteArray JNICALL Java_xflaim_DataVector__1outputKey(
JNIEnv * pEnv,
jobject, // obj,
jlong lThis,
jlong ljDbRef,
jint iIndexNum,
jboolean bOutputIds)
{
RCODE rc = NE_XFLM_OK;
IF_Db * pDb = (IF_Db *)(FLMUINT)ljDbRef;
FLMUINT uiLength;
jbyteArray Key = NULL;
void * pvKey = NULL;
jboolean bIsCopy = false;
FLMBOOL bMustRelease = false;
FLMBYTE ucKey [XFLM_MAX_KEY_SIZE];
if (RC_BAD( rc = THIS_VECTOR()->outputKey( pDb, (FLMUINT)iIndexNum,
(bOutputIds ? TRUE : FALSE), ucKey,
sizeof( ucKey), &uiLength)))
{
ThrowError( rc, pEnv);
goto Exit;
}
Key = pEnv->NewByteArray( (jsize)uiLength);
if( (pvKey = pEnv->GetPrimitiveArrayCritical( Key, &bIsCopy)) == NULL)
{
rc = RC_SET( NE_XFLM_MEM);
ThrowError( rc, pEnv);
goto Exit;
}
bMustRelease = true;
f_memcpy( pvKey, ucKey, uiLength);
Exit:
if (bMustRelease)
{
if (RC_BAD( rc))
{
pEnv->ReleasePrimitiveArrayCritical( Key, pvKey, JNI_ABORT);
pEnv->DeleteLocalRef( Key);
Key = NULL;
}
else
{
pEnv->ReleasePrimitiveArrayCritical( Key, pvKey, 0);
}
}
return( Key);
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT jbyteArray JNICALL Java_xflaim_DataVector__1outputData(
JNIEnv * pEnv,
jobject, // obj,
jlong lThis,
jlong ljDbRef,
jint iIndexNum)
{
RCODE rc = NE_XFLM_OK;
IF_Db * pDb = (IF_Db *)(FLMUINT)ljDbRef;
FLMUINT uiLength = 0;
jbyteArray Data = NULL;
void * pvData = NULL;
jboolean bIsCopy = false;
FLMBOOL bMustRelease = false;
FLMBYTE ucBuf [512];
FLMUINT uiBufSize = sizeof( ucBuf);
FLMBYTE * pucBuf = &ucBuf [0];
// Try until we have a big enough buffer.
for (;;)
{
if (RC_OK( rc = THIS_VECTOR()->outputData( pDb, (FLMUINT)iIndexNum,
(FLMBYTE *)pucBuf, uiBufSize, &uiLength)))
{
break;
}
if (rc != NE_XFLM_CONV_DEST_OVERFLOW)
{
ThrowError( rc, pEnv);
goto Exit;
}
uiBufSize += 2048;
if (pucBuf == &ucBuf [0])
{
if (RC_BAD( rc = f_alloc( uiBufSize, &pucBuf)))
{
ThrowError( rc, pEnv);
goto Exit;
}
}
else
{
if (RC_BAD( rc = f_realloc( uiBufSize, &pucBuf)))
{
ThrowError( rc, pEnv);
goto Exit;
}
}
}
Data = pEnv->NewByteArray( (jsize)uiLength);
if ( (pvData = pEnv->GetPrimitiveArrayCritical( Data, &bIsCopy)) == NULL)
{
rc = RC_SET( NE_XFLM_MEM);
ThrowError( rc, pEnv);
goto Exit;
}
bMustRelease = true;
f_memcpy( pvData, pucBuf, uiLength);
Exit:
if (pucBuf != &ucBuf [0])
{
f_free( &pucBuf);
}
if (bMustRelease)
{
if (RC_BAD( rc))
{
pEnv->ReleasePrimitiveArrayCritical( Data, pvData, JNI_ABORT);
pEnv->DeleteLocalRef( Data);
Data = NULL;
}
else
{
pEnv->ReleasePrimitiveArrayCritical( Data, pvData, 0);
}
}
return( Data);
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT void JNICALL Java_xflaim_DataVector__1inputKey(
JNIEnv * pEnv,
jobject, // obj,
jlong lThis,
jlong ljDbRef,
jint iIndexNum,
jbyteArray Key)
{
RCODE rc = NE_XFLM_OK;
IF_Db * pDb = (IF_Db *)(FLMUINT)ljDbRef;
void * pvKey = NULL;
jboolean bIsCopy = false;
FLMBOOL bMustRelease = false;
FLMUINT uiKeyLen = (FLMUINT)pEnv->GetArrayLength( Key);
if ( (pvKey = pEnv->GetPrimitiveArrayCritical( Key, &bIsCopy)) == NULL)
{
rc = RC_SET( NE_XFLM_MEM);
ThrowError( rc, pEnv);
goto Exit;
}
bMustRelease = true;
if (RC_BAD( rc = THIS_VECTOR()->inputKey( pDb, (FLMUINT)iIndexNum,
(FLMBYTE *)pvKey, uiKeyLen)))
{
ThrowError( rc, pEnv);
goto Exit;
}
Exit:
if (bMustRelease)
{
pEnv->ReleasePrimitiveArrayCritical( Key, pvKey, JNI_ABORT);
}
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT void JNICALL Java_xflaim_DataVector__1inputData(
JNIEnv * pEnv,
jobject, // obj,
jlong lThis,
jlong ljDbRef,
jint iIndexNum,
jbyteArray Data)
{
RCODE rc = NE_XFLM_OK;
IF_Db * pDb = (IF_Db *)(FLMUINT)ljDbRef;
void * pvData = NULL;
jboolean bIsCopy = false;
FLMBOOL bMustRelease = false;
FLMUINT uiDataLen = (FLMUINT)pEnv->GetArrayLength( Data);
if( (pvData = pEnv->GetPrimitiveArrayCritical( Data, &bIsCopy)) == NULL)
{
rc = RC_SET( NE_XFLM_MEM);
ThrowError( rc, pEnv);
goto Exit;
}
bMustRelease = true;
if (RC_BAD( rc = THIS_VECTOR()->inputData( pDb, (FLMUINT)iIndexNum,
(FLMBYTE *)pvData, uiDataLen)))
{
ThrowError( rc, pEnv);
goto Exit;
}
Exit:
if (bMustRelease)
{
pEnv->ReleasePrimitiveArrayCritical( Data, pvData, JNI_ABORT);
}
}
/****************************************************************************
Desc:
****************************************************************************/
JNIEXPORT void JNICALL Java_xflaim_DataVector__1reset(
JNIEnv *, // pEnv,
jobject, // obj,
jlong lThis)
{
THIS_VECTOR()->reset();
}