[commit] r1752 - in trunk/SDK/Java: . java/org/isis/jaut native/Jaut
GMESRC Repository Notifications
gme-commit at list.isis.vanderbilt.edu
Wed Dec 28 16:35:50 CST 2011
Author: ksmyth
Date: Wed Dec 28 16:35:50 2011
New Revision: 1752
Log:
JAUT support for in/out params, and Variant SAFEARRAY of BSTR.
Modified:
trunk/SDK/Java/gme.jar
trunk/SDK/Java/java/org/isis/jaut/Dispatch.java
trunk/SDK/Java/java/org/isis/jaut/Variant.java
trunk/SDK/Java/native/Jaut/ComException.cpp
trunk/SDK/Java/native/Jaut/Dispatch.cpp
trunk/SDK/Java/native/Jaut/Variant.cpp
Modified: trunk/SDK/Java/gme.jar
==============================================================================
Binary file (source and/or target). No diff available.
Modified: trunk/SDK/Java/java/org/isis/jaut/Dispatch.java
==============================================================================
--- trunk/SDK/Java/java/org/isis/jaut/Dispatch.java Wed Dec 28 16:35:28 2011 (r1751)
+++ trunk/SDK/Java/java/org/isis/jaut/Dispatch.java Wed Dec 28 16:35:50 2011 (r1752)
@@ -402,7 +402,10 @@
for(int i = 0; i < arguments.length; ++i)
{
if( arguments[i] != null )
- args[i] = new Variant(arguments[i]);
+ if (arguments[i] instanceof Variant)
+ args[i] = (Variant) arguments[i];
+ else
+ args[i] = new Variant(arguments[i]);
}
}
@@ -411,15 +414,6 @@
invoke(dispID, dispFlags, args, namedArgDispIDs, retval);
- if( args != null )
- {
- for(int i = 0; i < arguments.length; ++i)
- {
- if( args[i] != null )
- args[i].release();
- }
- }
-
Object obj = retval.toObject();
retval.release();
@@ -450,20 +444,16 @@
for(int i = 0; i < arguments.length; ++i)
{
if( arguments[i] != null )
- args[i] = new Variant(arguments[i]);
+ {
+ if (arguments[i] instanceof Variant)
+ args[i] = (Variant)arguments[i];
+ else
+ args[i] = new Variant(arguments[i]);
+ }
}
}
invoke(dispID, dispFlags, args, namedArgDispIDs, null);
-
- if( args != null )
- {
- for(int i = 0; i < arguments.length; ++i)
- {
- if( args[i] != null )
- args[i].release();
- }
- }
}
/**
Modified: trunk/SDK/Java/java/org/isis/jaut/Variant.java
==============================================================================
--- trunk/SDK/Java/java/org/isis/jaut/Variant.java Wed Dec 28 16:35:28 2011 (r1751)
+++ trunk/SDK/Java/java/org/isis/jaut/Variant.java Wed Dec 28 16:35:50 2011 (r1752)
@@ -773,7 +773,9 @@
* @throws OutOfMemoryError if memory could not be allocated for the string.
*/
public native void setString(String value);
-
+
+ public native String[] getStringArray();
+
/**
* Dec 30 1899 is 0 in Win32 date
* Jan 1 1970 is 0 in Java date
@@ -1097,7 +1099,7 @@
public Object toObject() throws ComException
{
if( !isCreated() )
- throw new JAutException("The unerlying VARIANT is not created");
+ throw new JAutException("The underlying VARIANT is not created");
switch( getVartype() & ~VT_BYREF )
{
@@ -1138,6 +1140,9 @@
case VT_DATE:
return getDate();
+ case VT_BSTR | VT_ARRAY:
+ return getStringArray();
+
case VT_DISPATCH:
case VT_UNKNOWN:
return getDispatch();
Modified: trunk/SDK/Java/native/Jaut/ComException.cpp
==============================================================================
--- trunk/SDK/Java/native/Jaut/ComException.cpp Wed Dec 28 16:35:28 2011 (r1751)
+++ trunk/SDK/Java/native/Jaut/ComException.cpp Wed Dec 28 16:35:50 2011 (r1752)
@@ -44,6 +44,7 @@
{
char *msg = NULL;
+ // FIXME: use FormatMessageW and env->NewString
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_FROM_SYSTEM, NULL, hr, NULL, (char*)&msg, 0, NULL);
Modified: trunk/SDK/Java/native/Jaut/Dispatch.cpp
==============================================================================
--- trunk/SDK/Java/native/Jaut/Dispatch.cpp Wed Dec 28 16:35:28 2011 (r1751)
+++ trunk/SDK/Java/native/Jaut/Dispatch.cpp Wed Dec 28 16:35:50 2011 (r1752)
@@ -462,10 +462,15 @@
if( arg != NULL )
v = (VARIANT*)env->GetIntField(arg, JAUT_Variant_Pointer);
- if( v != NULL )
+ if (v != NULL && v->vt == (VT_BSTR | VT_BYREF)) // FIXME: remove VT_BSTR and test
{
params.rgvarg[i] = *v;
- V_VT(v) = VT_EMPTY;
+ params.rgvarg[i].vt = VT_BSTR | VT_BYREF;
+ //params.rgvarg
+ } else if (v != NULL )
+ {
+ params.rgvarg[i] = *v;
+ V_VT(v) = VT_EMPTY; //KMS: why this?
}
else
{
@@ -503,7 +508,7 @@
if( params.rgdispidNamedArgs != NULL )
env->ReleaseIntArrayElements(nameids, params.rgdispidNamedArgs, JNI_ABORT);
- if( params.rgvarg != NULL )
+ if( params.rgvarg != NULL && varresult == NULL || varresult->vt == VT_EMPTY )
{
for(unsigned int i = 0; i < params.cArgs; ++i)
{
@@ -513,10 +518,10 @@
if( arg != NULL )
v = (VARIANT*)env->GetIntField(arg, JAUT_Variant_Pointer);
- if( v != NULL )
+ if (v != NULL)
{
- params.rgvarg[i] = *v;
- V_VT(v) = VT_EMPTY;
+ *v = params.rgvarg[i];
+ params.rgvarg[i].vt = VT_EMPTY;
}
else
VariantClear(¶ms.rgvarg[i]);
Modified: trunk/SDK/Java/native/Jaut/Variant.cpp
==============================================================================
--- trunk/SDK/Java/native/Jaut/Variant.cpp Wed Dec 28 16:35:28 2011 (r1751)
+++ trunk/SDK/Java/native/Jaut/Variant.cpp Wed Dec 28 16:35:50 2011 (r1752)
@@ -35,6 +35,7 @@
#include "StdAfx.h"
#include "Variant.h"
+#include <atlsafe.h>
extern "C"
{
@@ -192,8 +193,8 @@
}
V_VT(v) = vt;
-
- if( vt == VT_UNKNOWN || vt == VT_DISPATCH || vt == VT_BSTR )
+//xxx
+ if( vt == VT_UNKNOWN || vt == VT_DISPATCH || vt & VT_BSTR )
V_UNKNOWN(v) = NULL;
}
@@ -578,6 +579,41 @@
}
}
+JNIEXPORT jarray JNICALL Java_org_isis_jaut_Variant_getStringArray
+ (JNIEnv *env, jobject obj)
+{
+ VARIANT *v = (VARIANT*)env->GetIntField(obj, JAUT_Variant_Pointer);
+ if( v == NULL )
+ {
+ ThrowJAutException(env, ERR_VariantPointer);
+ return NULL;
+ }
+
+ SAFEARRAY* parray = NULL;
+ if( V_VT(v) == (VT_BSTR | VT_ARRAY))
+ parray = v->parray;
+ //else if( V_VT(v) == (VT_BSTR|VT_BYREF) )
+ // b = *V_BSTRREF(v);
+
+ ATL::CComSafeArray<BSTR> array;
+ if (parray == NULL || parray->cDims != 1 || FAILED(array.Attach(parray)))
+ {
+ ThrowJAutException(env, ERR_InvalidType);
+ return NULL;
+ }
+ jclass stringClass = env->FindClass("java/lang/String");
+ long size = array.GetUpperBound(0) - array.GetLowerBound(0) + 1;
+ jobjectArray jarray = env->NewObjectArray(size, stringClass, 0);
+ for (jsize i = 0; i + array.GetLowerBound(0) <= array.GetUpperBound(); ++i) {
+ BSTR element = array.GetAt(i + array.GetLowerBound(0));
+ env->SetObjectArrayElement(jarray, i, env->NewString((jchar*)element, SysStringLen(element)));
+ }
+ array.Detach();
+
+ return jarray;
+}
+
+
JNIEXPORT void JNICALL Java_org_isis_jaut_Variant_setDispatch
(JNIEnv *env, jobject obj, jobject val)
{
More information about the gme-commit
mailing list