[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(&params.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