diff --git a/build.xml b/build.xml index b7106e2..69e07a5 100644 --- a/build.xml +++ b/build.xml @@ -280,7 +280,7 @@ - + @@ -312,7 +312,7 @@ - + diff --git a/jni/Variant.cpp b/jni/Variant.cpp index 80af4f1..f18ca57 100644 --- a/jni/Variant.cpp +++ b/jni/Variant.cpp @@ -1069,7 +1069,7 @@ JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getVariantVariant * Added 1.13M4 * */ JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantDecRef - (JNIEnv *env, jobject _this, jint signum, jint scale, jint lo, jint mid, jint hi) + (JNIEnv *env, jobject _this, jint signum, jbyte scale, jint lo, jint mid, jint hi) { VARIANT *v = extractVariant(env, _this); if (v) { @@ -1091,7 +1091,7 @@ JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getVariantVariant * Added 1.13M4 * */ JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantDec - (JNIEnv *env, jobject _this, jint signum, jint scale, jint lo, jint mid, jint hi) + (JNIEnv *env, jobject _this, jint signum, jbyte scale, jint lo, jint mid, jint hi) { VARIANT *v = extractVariant(env, _this); DECIMAL *d; @@ -1151,18 +1151,18 @@ jobject extractDecimal } /* Unfortunately the byte ordering is completely wrong, so we remap it into buffer */ buffer = (jbyte*)malloc(12); - buffer[11] = d->Lo32 & 255; - buffer[10] = (d->Lo32 >> 8) & 255; - buffer[9] = (d->Lo32 >> 16) & 255;; - buffer[8] = (d->Lo32 >> 24) & 255;; - buffer[7] = (d->Mid32) & 255;; - buffer[6] = (d->Mid32 >> 8) & 255; - buffer[5] = (d->Mid32 >> 16) & 255; - buffer[4] = (d->Mid32 >> 24) & 255; - buffer[3] = (d->Hi32) & 255; - buffer[2] = (d->Hi32 >> 8) & 255; - buffer[1] = (d->Hi32 >> 16) & 255; - buffer[0] = (d->Hi32 >> 24) & 255; + buffer[11] = (byte)(d->Lo32 & 255); + buffer[10] = (byte)((d->Lo32 >> 8) & 255); + buffer[9] = (byte)((d->Lo32 >> 16) & 255); + buffer[8] = (byte)((d->Lo32 >> 24) & 255); + buffer[7] = (byte)((d->Mid32) & 255); + buffer[6] = (byte)((d->Mid32 >> 8) & 255); + buffer[5] = (byte)((d->Mid32 >> 16) & 255); + buffer[4] = (byte)((d->Mid32 >> 24) & 255); + buffer[3] = (byte)((d->Hi32) & 255); + buffer[2] = (byte)((d->Hi32 >> 8) & 255); + buffer[1] = (byte)((d->Hi32 >> 16) & 255); + buffer[0] = (byte)((d->Hi32 >> 24) & 255); /* Load buffer into the actual array */ env->SetByteArrayRegion(bArray, 0, 12, buffer); /* then clean up the C array */ diff --git a/jni/Variant.h b/jni/Variant.h index a70e3b3..439a070 100644 --- a/jni/Variant.h +++ b/jni/Variant.h @@ -519,7 +519,7 @@ JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getVariantVariant * Signature: (Ljava.math.BigDecimal;)V */ JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantDecRef - (JNIEnv *env, jobject _this, jint signum, jint scale, jint lo, jint mid, jint hi); + (JNIEnv *env, jobject _this, jint signum, jbyte scale, jint lo, jint mid, jint hi); /* @@ -528,7 +528,7 @@ JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantDecRef * Signature: (Ljava.math.BigDecimal;)V */ JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantDec - (JNIEnv *env, jobject _this, jint signum, jint scale, jint lo, jint mid, jint hi); + (JNIEnv *env, jobject _this, jint signum, jbyte scale, jint lo, jint mid, jint hi); /* diff --git a/src/com/jacob/com/Variant.java b/src/com/jacob/com/Variant.java index b2e8afb..0d72fc7 100644 --- a/src/com/jacob/com/Variant.java +++ b/src/com/jacob/com/Variant.java @@ -308,36 +308,38 @@ public class Variant extends JacobObject { * @param mid middle 32 bits * @param hi high 32 bits */ - private native void putVariantDecRef(int signum, int scale, int lo, int mid, int hi); + private native void putVariantDecRef(int signum, byte scale, int lo, int mid, int hi); /** - * Set the content of this variant to an int (VT_DECIMAL|VT_BYREF) + * Set the content of this variant to an decimal (VT_DECIMAL|VT_BYREF) * This may throw exceptions more often than the caller expects because * most callers don't manage the scale of their BigDecimal objects. * @param in the BigDecimal that will be converted to VT_DECIMAL * @throws IllegalArgumentException if the scale is > 28, the maximum for VT_DECIMAL */ - public void putDecimalRef(BigDecimal in){ - // verify we aren't released - getvt(); - int scale = in.scale(); - if (scale > 28) { - // should this really cast to a string and call putStringRef()? - throw new IllegalArgumentException("VT_DECIMAL only supports a scale of 28 and the passed"+ - " in value has a scale of "+scale); - } - else { - BigInteger unscaled = in.unscaledValue(); - BigInteger shifted = unscaled.shiftRight(32); - putVariantDecRef(in.signum(), scale, unscaled.intValue(), shifted.intValue(), shifted.shiftRight(32).intValue()); - } - } + public void putDecimalRef(BigDecimal in) { + // verify we aren't released + getvt(); + if (in.scale() > 28) { + // should this really cast to a string and call putStringRef()? + throw new IllegalArgumentException( + "VT_DECIMAL only supports a scale of 28 and the passed" + + " in value has a scale of " + in.scale()); + } else { + byte scale = (byte) in.scale(); + BigInteger unscaled = in.unscaledValue(); + BigInteger shifted = unscaled.shiftRight(32); + putVariantDecRef(in.signum(), scale, unscaled.intValue(), shifted + .intValue(), shifted.shiftRight(32).intValue()); + } + } /** - * set the content of this variant to a double (VT_R8|VT_BYREF) - * @param in - */ + * set the content of this variant to a double (VT_R8|VT_BYREF) + * + * @param in + */ private native void putVariantDoubleRef(double in); /** @@ -801,27 +803,31 @@ public class Variant extends JacobObject { * @return BigDecimal * @throws IllegalStateException if variant is not of the requested type */ - public BigDecimal getDecimal(){ - if (this.getvt() == VariantDecimal){ - return (BigDecimal)(getVariantDec()); - } else { - throw new IllegalStateException( - "getDecimal() only legal on Variants of type VariantDecimal, not "+this.getvt()); - } - } - - /** - * return the BigDecimal value held in this variant (fails on other types) - * @return BigDecimal - * @throws IllegalStateException if variant is not of the requested type - */ - public BigDecimal getDecimalRef(){ - if ((this.getvt() & VariantDecimal) == VariantDecimal && - (this.getvt() & VariantByref) == VariantByref) { - return (BigDecimal)(getVariantDecRef()); + public BigDecimal getDecimal() { + if (this.getvt() == VariantDecimal) { + return (BigDecimal) (getVariantDec()); } else { throw new IllegalStateException( - "getDecimalRef() only legal on byRef Variants of type VariantDecimal, not "+this.getvt()); + "getDecimal() only legal on Variants of type VariantDecimal, not " + + this.getvt()); + } + } + + /** + * return the BigDecimal value held in this variant (fails on other types) + * + * @return BigDecimal + * @throws IllegalStateException + * if variant is not of the requested type + */ + public BigDecimal getDecimalRef() { + if ((this.getvt() & VariantDecimal) == VariantDecimal + && (this.getvt() & VariantByref) == VariantByref) { + return (BigDecimal) (getVariantDecRef()); + } else { + throw new IllegalStateException( + "getDecimalRef() only legal on byRef Variants of type VariantDecimal, not " + + this.getvt()); } } @@ -833,7 +839,7 @@ public class Variant extends JacobObject { * @param mid middle 32 bits * @param hi high 32 bits */ - private native void putVariantDec(int signum, int scale, int lo, int mid, int hi); + private native void putVariantDec(int signum, byte scale, int lo, int mid, int hi); /** * Set the value of this variant and set the type. @@ -842,26 +848,28 @@ public class Variant extends JacobObject { * @param in the big decimal that will convert to the VT_DECIMAL type * @throws IllegalArgumentException if the scale is > 28, the maximum for VT_DECIMAL */ - public void putDecimal(BigDecimal in){ - // verify we aren't released yet - getvt(); - int scale = in.scale(); - if (scale > 28) { - // should this really cast to a string and call putStringRef()? - throw new IllegalArgumentException("VT_DECIMAL only supports a scale of 28 and the passed"+ - " in value has a scale of "+scale); - } - else { - BigInteger unscaled = in.unscaledValue(); - BigInteger shifted = unscaled.shiftRight(32); - putVariantDec(in.signum(), in.scale(), unscaled.intValue(), shifted.intValue(), shifted.shiftRight(32).intValue()); - } - } + public void putDecimal(BigDecimal in) { + // verify we aren't released yet + getvt(); + if (in.scale() > 28) { + // should this really cast to a string and call putStringRef()? + throw new IllegalArgumentException( + "VT_DECIMAL only supports a scale of 28 and the passed" + + " in value has a scale of " + in.scale()); + } else { + byte scale = (byte) in.scale(); + BigInteger unscaled = in.unscaledValue(); + BigInteger shifted = unscaled.shiftRight(32); + putVariantDec( in.signum(), scale, unscaled.intValue(), shifted + .intValue(), shifted.shiftRight(32).intValue()); + } + } - /** - * set the value of this variant - * @param in - */ + /** + * set the value of this variant + * + * @param in + */ private native void putVariantDate(double in); /**