Skip to content

Commit

Permalink
More better SafeArray (still only single dims)
Browse files Browse the repository at this point in the history
  • Loading branch information
enebo committed Dec 17, 2010
1 parent b5f0501 commit 91a6220
Showing 1 changed file with 14 additions and 4 deletions.
18 changes: 14 additions & 4 deletions jni/Variant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ jobject createDateVariant(JNIEnv *env, jdouble value) {

jobject createDispatchVariant(JNIEnv *env, IDispatch* pointer) {
if (pointer) pointer->AddRef();

return env->CallStaticObjectMethod(VARIANT_CLASS, VARIANT_CREATEDISPATCH, (jint) pointer);
}

Expand Down Expand Up @@ -198,18 +198,24 @@ jobject createSafeArray(JNIEnv *env, VARIANT *vt, SAFEARRAY *array) {
SafeArrayGetLBound(array, i+1, &indexes[i]);
SafeArrayGetUBound(array, i+1, &upperBounds[i]);
}

HRESULT hr = SafeArrayLock(array);

i = 0;
VARIANT variant;
VariantInit(&variant);
V_VT(&variant) = (V_VT(vt) & ~VT_ARRAY) | VT_BYREF;

while (i < dimensions) {
hr = SafeArrayPtrOfIndex(array, indexes, &V_BYREF(&variant));
if (!SUCCEEDED(hr)) {
printf("FDAILED\n");
} else {
// hr = SafeArrayGetElement(array, indexes, V_BYREF(&variant);

// TODO: Add multi-dim support
env->CallBooleanMethod(newArray, SAFEARRAY_ADD, createVariant(env, &variant));
}

for (i = 0; i < dimensions; ++i) {
if (++indexes[i] <= upperBounds[i]) break;
Expand Down Expand Up @@ -237,7 +243,11 @@ jobject variantToObject(JNIEnv *env, VARIANT* v) {
// printf("variantToObject: %d\n", V_VT(v)); fflush(stdout);

if (V_VT(v) & VT_ARRAY) {
return createSafeArray(env, v, (SAFEARRAY *) V_ARRAY(v));
if (V_ISBYREF(v)) {
return createSafeArray(env, v, (SAFEARRAY *) *V_ARRAYREF(v));
} else {
return createSafeArray(env, v, (SAFEARRAY *) V_ARRAY(v));
}
}

switch (V_VT(v)) {
Expand Down Expand Up @@ -274,7 +284,7 @@ jobject variantToObject(JNIEnv *env, VARIANT* v) {
case VT_DISPATCH:
return createDispatch(env, (IDispatch *) V_DISPATCH(v));
case VT_DISPATCH|VT_BYREF:
return createDispatch(env, (IDispatch *) V_DISPATCHREF(v));
return createDispatch(env, (IDispatch *) *V_DISPATCHREF(v));
case VT_EMPTY:
case VT_NULL:
return NULL;
Expand Down

0 comments on commit 91a6220

Please sign in to comment.