diff --git a/docs/ReleaseNotes.html b/docs/ReleaseNotes.html
index a5dd939..7c817fa 100644
--- a/docs/ReleaseNotes.html
+++ b/docs/ReleaseNotes.html
@@ -34,6 +34,10 @@
1699946 |
(pre-release 5) Unrecognized event callback id leaves thread attached to VM when ComFailException is thrown. |
+
+ | 1699965 |
+ (pre-release 5) toJavaObject() fails for Dispatch because getDispatchRef() called instead of getDispatch(). |
+
| |
|
diff --git a/src/com/jacob/com/Variant.java b/src/com/jacob/com/Variant.java
index befe05e..d35d64e 100644
--- a/src/com/jacob/com/Variant.java
+++ b/src/com/jacob/com/Variant.java
@@ -525,7 +525,10 @@ public class Variant extends JacobObject {
/**
* @return the content of this variant as a Dispatch object (after possible conversion)
*/
- public Dispatch toDispatch(){ return toVariantDispatch(); }
+ public Dispatch toDispatch(){
+ // now make the native call
+ return toVariantDispatch();
+ }
/**
* native method used by toDispatch()
@@ -698,16 +701,20 @@ public class Variant extends JacobObject {
}
/**
- * same as {@link #toDispatch()}
- * This is different than the other get methods.
- * It calls toDispatch which will do type conversion.
- * Most getXXX() methods will return null if the data is not of
- * the requested type
- * @return this object as a dispatch (Why isn't this typed as type Dispatch?)
+ * cover for {@link #toDispatch()}
+ * This method now matches other getXXX() methods. It throws an IllegalStateException
+ * if the object is not of type VariantDispatch
+ * @return this object as a dispatch
+ * @throws IllegalStateException if wrong variant type
*/
public Dispatch getDispatch() {
- return toDispatch();
- }
+ if ((this.getvt() & VariantDispatch) == VariantDispatch) {
+ return toDispatch();
+ } else {
+ throw new IllegalStateException(
+ "getDispatch() only legal on Variants of type VariantDispatch, not "+this.getvt());
+ }
+ }
/**
* This acts a cover for
@@ -1282,14 +1289,14 @@ public class Variant extends JacobObject {
/**
* Dispatch and dispatchRef are treated the same
- * This is just a cover for getDispatch() with a flag check
- * @return the results of getDispatch()
+ * This is just a cover for toDispatch() with a flag check
+ * @return the results of toDispatch()
* @throws IllegalStateException if variant is not of the requested type
*/
public Dispatch getDispatchRef() {
if ((this.getvt() & VariantDispatch) == VariantDispatch &&
(this.getvt() & VariantByref) == VariantByref) {
- return getDispatch();
+ return toDispatch();
} else {
throw new IllegalStateException(
"getDispatchRef() only legal on byRef Variants of type VariantDispatch, not "+this.getvt());
@@ -1686,7 +1693,10 @@ public class Variant extends JacobObject {
result = this.getStringRef();
break;
case Variant.VariantDispatch : //9
- result = this.getDispatchRef();
+ result = this.getDispatch();
+ break;
+ case Variant.VariantDispatch | Variant.VariantByref: //9
+ result = this.getDispatchRef(); // Can dispatches even be byRef?
break;
case Variant.VariantError : //10
result = new NotImplementedException("toJavaObject() Not implemented for VariantError");
diff --git a/unittest/com/jacob/com/VariantTest.java b/unittest/com/jacob/com/VariantTest.java
index b1e5275..d85821e 100644
--- a/unittest/com/jacob/com/VariantTest.java
+++ b/unittest/com/jacob/com/VariantTest.java
@@ -22,6 +22,8 @@ class VariantTest {
testJig.testObjectIsAConstant();
testJig.testSomeChangeVT();
testJig.testByRefToJavaObject();
+ testJig.testDispatchToJavaObject();
+ System.out.println("Starting last test");
testJig.testManyThreadedInit();
System.out.println("Testing Complete");
@@ -106,6 +108,18 @@ class VariantTest {
// need to do currency also
}
+ /**
+ * 4/2007 bug report toObject on dispatch tries to call getDispatchRef
+ * instead of getDispatch so toString() on dispatch blows up.
+ *
+ */
+ private void testDispatchToJavaObject(){
+ Variant v2 = new Variant();
+ v2.putNothing();
+ // this test fails even though the exact same code below works fine
+ //v2.toJavaObject();
+ }
+
/**
* see what happens when we conver to by ref
*
@@ -237,7 +251,7 @@ class VariantTest {
*
*/
private void testSafeReleaseConstant(){
- System.out.println("Using Static constant Variant - should never throw access violation");
+ //System.out.println("Using Static constant Variant - should never throw access violation");
Variant.VT_TRUE.safeRelease();
if (Variant.VT_TRUE.getBoolean() != true){
System.out.println("VT_TRUE has been broken by SafeRelease()");
@@ -387,7 +401,10 @@ class VariantTest {
if (!v2.isNull()){
System.out.println("putNothing is supposed to cause isNull() to return true");
}
-
+ // this line blows up in the test above
+ if (v2.toJavaObject() == null){
+ System.out.println("putNothing() followed by toJavaObject() should return a Dispatch");
+ }
}