SF 1650134 - preliminary VT_Variant support VariantVariant

This commit is contained in:
clay_shooter
2007-04-22 18:25:38 +00:00
parent 4adbd5087a
commit 9c23a727c2
3 changed files with 15 additions and 18 deletions

View File

@@ -1040,7 +1040,7 @@ JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantVariant
* Added 1.12 pre 6 * Added 1.12 pre 6
* *
* */ * */
JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_getVariantVariant JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getVariantVariant
(JNIEnv *env, jobject _this) (JNIEnv *env, jobject _this)
{ {
@@ -1051,24 +1051,14 @@ JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_getVariantVariant
return NULL; return NULL;
} }
//Construct a new Variant
jclass variantClass = env->FindClass("com/jacob/com/Variant");
jmethodID defaultCon = env->GetMethodID(variantClass, "<init>", "()V");
jobject newVariant = env->NewObject(variantClass, defaultCon);
VARIANT *refVar = V_VARIANTREF(v); VARIANT *refVar = V_VARIANTREF(v);
VARIANT *newV = extractVariant(env, newVariant);
// we could have made a copy of refV here but we aren't every going to free // we could have made a copy of refV here but we aren't every going to free
// it outside of the scope of the enclosing context so we will just used the // it outside of the scope of the enclosing context so we will just used the
// enclosed. This relies on the java layer to zero out its ref to this // enclosed. This relies on the java layer to zero out its ref to this
// enclosed variant before the gc can come along and free the memory out from // enclosed variant before the gc can come along and free the memory out from
// under this enclosing variant. // under this enclosing variant.
return (unsigned int)refVar;
jfieldID jf = env->GetFieldID( variantClass, VARIANT_FLD, "I");
env->SetIntField(newVariant, jf, (unsigned int)refVar);
return newVariant;
} }
return NULL; return NULL;

View File

@@ -508,9 +508,9 @@ JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantVariant
/* /*
* Class: com_jacob_com_Variant * Class: com_jacob_com_Variant
* Method: getVariantVariant * Method: getVariantVariant
* Signature: ()Lcom/jacob/com/Variant; * Signature: ()I
*/ */
JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_getVariantVariant JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getVariantVariant
(JNIEnv *, jobject); (JNIEnv *, jobject);
/* /*

View File

@@ -360,7 +360,7 @@ public class Variant extends JacobObject {
* Added 1.12 pre 6 * Added 1.12 pre 6
* *
* @throws IllegalArgumentException * @throws IllegalArgumentException
* if inVariant = null * if inVariant = null or if inVariant is a Varint
* @param objectToBeWrapped A object that is to be referenced by this variant. * @param objectToBeWrapped A object that is to be referenced by this variant.
* If objectToBeWrapped is already of type Variant, then it is used. * If objectToBeWrapped is already of type Variant, then it is used.
* If objectToBeWrapped is not Variant then <code>new Variant(objectToBeWrapped)</code> * If objectToBeWrapped is not Variant then <code>new Variant(objectToBeWrapped)</code>
@@ -370,10 +370,15 @@ public class Variant extends JacobObject {
if (objectToBeWrapped == null) { if (objectToBeWrapped == null) {
throw new IllegalArgumentException("Cannot put null in as a variant"); throw new IllegalArgumentException("Cannot put null in as a variant");
} else if (objectToBeWrapped instanceof Variant){ } else if (objectToBeWrapped instanceof Variant){
putVariantVariant((Variant)objectToBeWrapped); throw new IllegalArgumentException("Cannot putVariant() only accepts non jacob objects.");
} else { } else {
Variant inVariant = new Variant(objectToBeWrapped); Variant inVariant = new Variant(objectToBeWrapped);
putVariantVariant(inVariant); putVariantVariant(inVariant);
// This could be done in Variant.cpp
if (JacobObject.isDebugEnabled()){
JacobObject.debug("Zeroing out enclosed Variant's ref to windows memory");
}
inVariant.m_pVariant = 0;
} }
} }
@@ -400,7 +405,9 @@ public class Variant extends JacobObject {
if (JacobObject.isDebugEnabled()){ if (JacobObject.isDebugEnabled()){
JacobObject.debug("About to call getVariantVariant()"); JacobObject.debug("About to call getVariantVariant()");
} }
Variant enclosedVariant = getVariantVariant(); Variant enclosedVariant = new Variant();
int enclosedVariantMemory = getVariantVariant();
enclosedVariant.m_pVariant = enclosedVariantMemory;
Object enclosedVariantAsJava = enclosedVariant.toJavaObject(); Object enclosedVariantAsJava = enclosedVariant.toJavaObject();
// zero out the reference to the underlying windows memory so that // zero out the reference to the underlying windows memory so that
// it is still only owned in one place by one java object // it is still only owned in one place by one java object
@@ -423,7 +430,7 @@ public class Variant extends JacobObject {
* Added 1.12 pre 6 - VT_VARIANT support is at an alpha level * Added 1.12 pre 6 - VT_VARIANT support is at an alpha level
* @return Variant one of the VT_Variant types * @return Variant one of the VT_Variant types
*/ */
private native Variant getVariantVariant(); private native int getVariantVariant();
/** /**
* get the content of this variant as a short * get the content of this variant as a short