diff --git a/jni/ComThread.cpp b/jni/ComThread.cpp index ce631ae..e012ae9 100644 --- a/jni/ComThread.cpp +++ b/jni/ComThread.cpp @@ -1,57 +1,57 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Redistributions in any form must be accompanied by information on - * how to obtain complete source code for the JACOB software. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include "stdafx.h" -#include -#include "ComThread.h" -// Win32 support for Ole Automation -#include -#include -#include -#include -#include -#include "util.h" - -extern "C" -{ - -JNIEXPORT void JNICALL Java_com_jacob_com_ComThread_doCoInitialize - (JNIEnv *env, jclass cls, jint mode) -{ - int threadModel = mode; - CoInitializeEx(NULL, threadModel); -} - -JNIEXPORT void JNICALL Java_com_jacob_com_ComThread_doCoUninitialize - (JNIEnv *env, jclass cls) -{ - CoUninitialize(); -} - -} +/* + * Copyright (c) 1999-2004 Sourceforge JACOB Project. + * All rights reserved. Originator: Dan Adler (http://danadler.com). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Redistributions in any form must be accompanied by information on + * how to obtain complete source code for the JACOB software. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "stdafx.h" +#include +#include "ComThread.h" +// Win32 support for Ole Automation +#include +#include +#include +#include +#include +#include "util.h" + +extern "C" +{ + +JNIEXPORT void JNICALL Java_com_jacob_com_ComThread_doCoInitialize + (JNIEnv *env, jclass cls, jint mode) +{ + int threadModel = mode; + CoInitializeEx(NULL, threadModel); +} + +JNIEXPORT void JNICALL Java_com_jacob_com_ComThread_doCoUninitialize + (JNIEnv *env, jclass cls) +{ + CoUninitialize(); +} + +} diff --git a/jni/ComThread.h b/jni/ComThread.h index 780064a..a1b9a60 100644 --- a/jni/ComThread.h +++ b/jni/ComThread.h @@ -1,30 +1,30 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jacob_com_ComThread */ - -#ifndef _Included_com_jacob_com_ComThread -#define _Included_com_jacob_com_ComThread -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jacob_com_ComThread - * Method: doCoInitialize - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_ComThread_doCoInitialize - (JNIEnv *, jclass, jint); - -/* - * Class: com_jacob_com_ComThread - * Method: doCoUninitialize - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_ComThread_doCoUninitialize - (JNIEnv *, jclass); - - -#ifdef __cplusplus -} -#endif -#endif +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_jacob_com_ComThread */ + +#ifndef _Included_com_jacob_com_ComThread +#define _Included_com_jacob_com_ComThread +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_jacob_com_ComThread + * Method: doCoInitialize + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_ComThread_doCoInitialize + (JNIEnv *, jclass, jint); + +/* + * Class: com_jacob_com_ComThread + * Method: doCoUninitialize + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_ComThread_doCoUninitialize + (JNIEnv *, jclass); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/jni/Dispatch.cpp b/jni/Dispatch.cpp index 3355371..39c87d9 100644 --- a/jni/Dispatch.cpp +++ b/jni/Dispatch.cpp @@ -1,440 +1,440 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Redistributions in any form must be accompanied by information on - * how to obtain complete source code for the JACOB software. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include "stdafx.h" -#include -#include "Dispatch.h" -// Win32 support for Ole Automation -#include -#include -#include -#include -#include -#include "util.h" - -extern "C" -{ - -#define DISP_FLD "m_pDispatch" - -// extract a IDispatch from a jobject -IDispatch *extractDispatch(JNIEnv *env, jobject arg) -{ - jclass argClass = env->GetObjectClass(arg); - jfieldID ajf = env->GetFieldID( argClass, DISP_FLD, "I"); - jint anum = env->GetIntField(arg, ajf); - IDispatch *v = (IDispatch *)anum; - return v; -} - -JNIEXPORT jobject JNICALL Java_com_jacob_com_Dispatch_QueryInterface - (JNIEnv *env, jobject _this, jstring _iid) -{ - // get the current IDispatch - IDispatch *pIDispatch = extractDispatch(env, _this); - if (!pIDispatch) return NULL; - const char *siid = env->GetStringUTFChars(_iid, NULL); - USES_CONVERSION; - LPOLESTR bsIID = A2W(siid); - env->ReleaseStringUTFChars(_iid, siid); - IID iid; - HRESULT hr = IIDFromString(bsIID, &iid); - if (FAILED(hr)) { - ThrowComFail(env, "Can't get IID from String", hr); - return NULL; - } - - // try to call QI on the passed IID - IDispatch *disp; - hr = pIDispatch->QueryInterface(iid, (void **)&disp); - if (FAILED(hr)) { - ThrowComFail(env, "QI on IID from String Failed", hr); - return NULL; - } - - jclass autoClass = env->FindClass("com/jacob/com/Dispatch"); - jmethodID autoCons = - env->GetMethodID(autoClass, "", "(I)V"); - // construct a Dispatch object to return - // I am copying the pointer to java - // jacob-msg 1817 - SF 1053871 : QueryInterface already called AddRef!! - //if (disp) disp->AddRef(); - jobject newAuto = env->NewObject(autoClass, autoCons, disp); - return newAuto; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_createInstance - (JNIEnv *env, jobject _this, jstring _progid) -{ - jclass clazz = env->GetObjectClass(_this); - jfieldID jf = env->GetFieldID( clazz, DISP_FLD, "I"); - - const char *progid = env->GetStringUTFChars(_progid, NULL); - CLSID clsid; - HRESULT hr; - IUnknown *punk = NULL; - IDispatch *pIDispatch; - USES_CONVERSION; - LPOLESTR bsProgId = A2W(progid); - if (strchr(progid,':')) - { - env->ReleaseStringUTFChars(_progid, progid); - // it's a moniker - hr = CoGetObject(bsProgId, NULL, IID_IUnknown, (LPVOID *)&punk); - if (FAILED(hr)) { - ThrowComFail(env, "Can't find moniker", hr); - return; - } - IClassFactory *pIClass; - // if it was a clsid moniker, I may have a class factory - hr = punk->QueryInterface(IID_IClassFactory, (void **)&pIClass); - if (!SUCCEEDED(hr)) goto doDisp; - punk->Release(); - // try to create an instance - hr = pIClass->CreateInstance(NULL, IID_IUnknown, (void **)&punk); - if (FAILED(hr)) { - ThrowComFail(env, "Can't create moniker class instance", hr); - return; - } - pIClass->Release(); - goto doDisp; - } - env->ReleaseStringUTFChars(_progid, progid); - // Now, try to find an IDispatch interface for progid - hr = CLSIDFromProgID(bsProgId, &clsid); - if (FAILED(hr)) { - ThrowComFail(env, "Can't get object clsid from progid", hr); - return; - } - // standard creation - hr = CoCreateInstance(clsid,NULL,CLSCTX_LOCAL_SERVER|CLSCTX_INPROC_SERVER,IID_IUnknown, (void **)&punk); - if (!SUCCEEDED(hr)) { - ThrowComFail(env, "Can't co-create object", hr); - return; - } -doDisp: - - // now get an IDispatch pointer from the IUnknown - hr = punk->QueryInterface(IID_IDispatch, (void **)&pIDispatch); - if (!SUCCEEDED(hr)) { - ThrowComFail(env, "Can't QI object for IDispatch", hr); - return; - } - // CoCreateInstance called AddRef - punk->Release(); - env->SetIntField(_this, jf, (unsigned int)pIDispatch); -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_release - (JNIEnv *env, jobject _this) -{ - jclass clazz = env->GetObjectClass(_this); - jfieldID jf = env->GetFieldID( clazz, DISP_FLD, "I"); - jint num = env->GetIntField(_this, jf); - - IDispatch *disp = (IDispatch *)num; - if (disp) { - disp->Release(); - env->SetIntField(_this, jf, (unsigned int)0); - } -} - -static HRESULT -name2ID(IDispatch *pIDispatch, const char *prop, DISPID *dispid, long lcid) -{ - HRESULT hresult; - USES_CONVERSION; - LPOLESTR propOle = A2W(prop); - hresult = pIDispatch->GetIDsOfNames(IID_NULL,(LPOLESTR*)&propOle,1,lcid,dispid); - return hresult; -} - -JNIEXPORT jintArray JNICALL Java_com_jacob_com_Dispatch_getIDsOfNames - (JNIEnv *env, jclass clazz, jobject disp, jint lcid, jobjectArray names) -{ - IDispatch *pIDispatch = extractDispatch(env, disp); - if (!pIDispatch) return NULL; - - int l = env->GetArrayLength(names); - int i; - LPOLESTR *lps = (LPOLESTR *)CoTaskMemAlloc(l * sizeof(LPOLESTR)); - DISPID *dispid = (DISPID *)CoTaskMemAlloc(l * sizeof(DISPID)); - for(i=0;iGetObjectArrayElement(names, i); - const char *nm = env->GetStringUTFChars(s, NULL); - LPOLESTR nmos = A2W(nm); - env->ReleaseStringUTFChars(s, nm); - lps[i] = nmos; - env->DeleteLocalRef(s); - } - HRESULT hr = pIDispatch->GetIDsOfNames(IID_NULL,lps,l,lcid,dispid); - if (FAILED(hr)) { - CoTaskMemFree(lps); - CoTaskMemFree(dispid); - char buf[1024]; - strcpy(buf, "Can't map names to dispid:"); - for(i=0;iGetObjectArrayElement(names, i); - const char *nm = env->GetStringUTFChars(s, NULL); - strcat(buf, nm); - env->ReleaseStringUTFChars(s, nm); - env->DeleteLocalRef(s); - } - ThrowComFail(env, buf, hr); - return NULL; - } - jintArray iarr = env->NewIntArray(l); - env->SetIntArrayRegion(iarr, i, l, dispid); - CoTaskMemFree(lps); - CoTaskMemFree(dispid); - return iarr; -} - -static char* BasicToCharString(const BSTR inBasicString) -{ - char* charString = NULL; - const size_t charStrSize = ::SysStringLen(inBasicString) + 1; - if (charStrSize > 1) - { - charString = new char[charStrSize]; - size_t len = ::wcstombs(charString, inBasicString, charStrSize); - } - else - charString = ::strdup(""); - - return charString; -} - -static char* CreateErrorMsgFromResult(HRESULT inResult) -{ - char* msg = NULL; - ::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM, NULL, inResult,MAKELANGID(LANG_NEUTRAL, - SUBLANG_DEFAULT), (LPTSTR) &msg, 0, NULL); - if (msg == NULL) - msg = ::strdup("An unknown COM error has occured."); - - return msg; -} - -static char* CreateErrorMsgFromInfo(HRESULT inResult, EXCEPINFO* ioInfo, - const char* methName) -{ - char* msg = NULL; - - // If this is a dispatch exception (triggered by an Invoke message), - // then we have to take some additional steps to process the error - // message. - if (inResult == DISP_E_EXCEPTION) - { - // Check to see if the server deferred filling in the exception - // information. If so, make the call to populate the structure. - if (ioInfo->pfnDeferredFillIn != NULL) - (*(ioInfo->pfnDeferredFillIn))(ioInfo); - - // Build the error message from exception information content. - char* source = ::BasicToCharString(ioInfo->bstrSource); - char* desc = ::BasicToCharString(ioInfo->bstrDescription); - const size_t MSG_LEN = ::strlen(methName) + ::strlen(source) + ::strlen(desc) + 128; - msg = new char[MSG_LEN]; - ::strncpy(msg, "Invoke of: ", MSG_LEN); - ::strncat(msg, methName, MSG_LEN); - ::strncat(msg, "\nSource: ", MSG_LEN); - ::strncat(msg, source, MSG_LEN); - ::strncat(msg, "\nDescription: ", MSG_LEN); - ::strncat(msg, desc, MSG_LEN); - ::strncat(msg, "\n", MSG_LEN); - delete source; - delete desc; - } - else - { - char* msg2 = CreateErrorMsgFromResult(inResult); - const size_t MSG_LEN = ::strlen(methName) + ::strlen(msg2) + 128; - msg = new char[MSG_LEN]; - ::strncpy(msg, "A COM exception has been encountered:\n" - "At Invoke of: ", MSG_LEN); - ::strncat(msg, methName, MSG_LEN); - ::strncat(msg, "\nDescription: ", MSG_LEN); - ::strncat(msg, msg2, MSG_LEN); - // jacob-msg 1075 - SF 1053872 : Documentation says "use LocalFree"!! - //delete msg2; - LocalFree(msg2); - } - return msg; -} - - -#define SETDISPPARAMS(dp, numArgs, pvArgs, numNamed, pNamed) \ - {\ - (dp).cArgs = numArgs; \ - (dp).rgvarg = pvArgs; \ - (dp).cNamedArgs = numNamed; \ - (dp).rgdispidNamedArgs = pNamed; \ - } - -#define SETNOPARAMS(dp) SETDISPPARAMS(dp, 0, NULL, 0, NULL) - -JNIEXPORT jobject JNICALL Java_com_jacob_com_Dispatch_invokev - (JNIEnv *env, jclass clazz, - jobject disp, jstring name, jint dispid, - jint lcid, jint wFlags, jobjectArray vArg, jintArray uArgErr) -{ - DISPPARAMS dispparams; - EXCEPINFO excepInfo; - - IDispatch *pIDispatch = extractDispatch(env, disp); - if (!pIDispatch) return NULL; - - int dispID = dispid; - if (name != NULL) - { - const char *nm = env->GetStringUTFChars(name, NULL); - HRESULT hr; - if (FAILED(hr = name2ID(pIDispatch, nm, (long *)&dispID, lcid))) { - char buf[1024]; - sprintf(buf, "Can't map name to dispid: %s", nm); - ThrowComFail(env, buf, -1); - return NULL; - } - env->ReleaseStringUTFChars(name, nm); - } - - int num_args = env->GetArrayLength(vArg); - int i, j; - VARIANT *varr = NULL; - if (num_args) - { - varr = (VARIANT *)CoTaskMemAlloc(num_args*sizeof(VARIANT)); - /* reverse args for dispatch */ - for(i=num_args-1,j=0;0<=i;i--,j++) - { - VariantInit(&varr[j]); - jobject arg = env->GetObjectArrayElement(vArg, i); - VARIANT *v = extractVariant(env, arg); - // no escape from copy? - VariantCopy(&varr[j], v); - env->DeleteLocalRef(arg); - } - } - // prepare a new return value - jclass variantClass = env->FindClass("com/jacob/com/Variant"); - jmethodID variantCons = - env->GetMethodID(variantClass, "", "()V"); - // construct a variant to return - jobject newVariant = env->NewObject(variantClass, variantCons); - // get the VARIANT from the newVariant - VARIANT *v = extractVariant(env, newVariant); - DISPID dispidPropertyPut = DISPID_PROPERTYPUT; - - // determine how to dispatch - switch (wFlags) - { - case DISPATCH_PROPERTYGET: // GET - case DISPATCH_METHOD: // METHOD - case DISPATCH_METHOD|DISPATCH_PROPERTYGET: - { - SETDISPPARAMS(dispparams, num_args, varr, 0, NULL); - break; - } - case DISPATCH_PROPERTYPUT: - case DISPATCH_PROPERTYPUTREF: // jacob-msg 1075 - SF 1053872 - { - SETDISPPARAMS(dispparams, num_args, varr, 1, &dispidPropertyPut); - break; - } - } - - HRESULT hr = 0; - jint count = env->GetArrayLength(uArgErr); - if ( count != 0 ) - { - jint *uAE = env->GetIntArrayElements(uArgErr, NULL); - hr = pIDispatch->Invoke(dispID,IID_NULL, - lcid,wFlags,&dispparams,v,&excepInfo,(unsigned int *)uAE); - env->ReleaseIntArrayElements(uArgErr, uAE, 0); - } - else - { - hr = pIDispatch->Invoke(dispID,IID_NULL, - lcid,wFlags,&dispparams,v,&excepInfo, NULL); - } - if (num_args) - { - // to account for inouts, I need to copy the inputs back to - // the java array after the method returns - // this occurs, for example, in the ADO wrappers - for(i=num_args-1,j=0;0<=i;i--,j++) - { - jobject arg = env->GetObjectArrayElement(vArg, i); - VARIANT *v = extractVariant(env, arg); - // reverse copy - VariantCopy(v, &varr[j]); - // clear out the temporary variant - VariantClear(&varr[j]); - env->DeleteLocalRef(arg); - } - } - - if (varr) CoTaskMemFree(varr); - - // check for error and display a somewhat verbose error message - if (!SUCCEEDED(hr)) { - const char *nm = env->GetStringUTFChars(name, NULL); - char *buf = CreateErrorMsgFromInfo(hr, &excepInfo, nm); - env->ReleaseStringUTFChars(name, nm); - - // jacob-msg 3696 - SF 1053866 - if(hr == DISP_E_EXCEPTION) - { - if(excepInfo.scode != 0) - { - hr = excepInfo.scode; - } - else - { - hr = _com_error::WCodeToHRESULT(excepInfo.wCode); - } - } - - ThrowComFail(env, buf, hr); - if (buf) delete buf; - return NULL; - } - - return newVariant; -} - -} - - +/* + * Copyright (c) 1999-2004 Sourceforge JACOB Project. + * All rights reserved. Originator: Dan Adler (http://danadler.com). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Redistributions in any form must be accompanied by information on + * how to obtain complete source code for the JACOB software. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "stdafx.h" +#include +#include "Dispatch.h" +// Win32 support for Ole Automation +#include +#include +#include +#include +#include +#include "util.h" + +extern "C" +{ + +#define DISP_FLD "m_pDispatch" + +// extract a IDispatch from a jobject +IDispatch *extractDispatch(JNIEnv *env, jobject arg) +{ + jclass argClass = env->GetObjectClass(arg); + jfieldID ajf = env->GetFieldID( argClass, DISP_FLD, "I"); + jint anum = env->GetIntField(arg, ajf); + IDispatch *v = (IDispatch *)anum; + return v; +} + +JNIEXPORT jobject JNICALL Java_com_jacob_com_Dispatch_QueryInterface + (JNIEnv *env, jobject _this, jstring _iid) +{ + // get the current IDispatch + IDispatch *pIDispatch = extractDispatch(env, _this); + if (!pIDispatch) return NULL; + const char *siid = env->GetStringUTFChars(_iid, NULL); + USES_CONVERSION; + LPOLESTR bsIID = A2W(siid); + env->ReleaseStringUTFChars(_iid, siid); + IID iid; + HRESULT hr = IIDFromString(bsIID, &iid); + if (FAILED(hr)) { + ThrowComFail(env, "Can't get IID from String", hr); + return NULL; + } + + // try to call QI on the passed IID + IDispatch *disp; + hr = pIDispatch->QueryInterface(iid, (void **)&disp); + if (FAILED(hr)) { + ThrowComFail(env, "QI on IID from String Failed", hr); + return NULL; + } + + jclass autoClass = env->FindClass("com/jacob/com/Dispatch"); + jmethodID autoCons = + env->GetMethodID(autoClass, "", "(I)V"); + // construct a Dispatch object to return + // I am copying the pointer to java + // jacob-msg 1817 - SF 1053871 : QueryInterface already called AddRef!! + //if (disp) disp->AddRef(); + jobject newAuto = env->NewObject(autoClass, autoCons, disp); + return newAuto; +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_createInstance + (JNIEnv *env, jobject _this, jstring _progid) +{ + jclass clazz = env->GetObjectClass(_this); + jfieldID jf = env->GetFieldID( clazz, DISP_FLD, "I"); + + const char *progid = env->GetStringUTFChars(_progid, NULL); + CLSID clsid; + HRESULT hr; + IUnknown *punk = NULL; + IDispatch *pIDispatch; + USES_CONVERSION; + LPOLESTR bsProgId = A2W(progid); + if (strchr(progid,':')) + { + env->ReleaseStringUTFChars(_progid, progid); + // it's a moniker + hr = CoGetObject(bsProgId, NULL, IID_IUnknown, (LPVOID *)&punk); + if (FAILED(hr)) { + ThrowComFail(env, "Can't find moniker", hr); + return; + } + IClassFactory *pIClass; + // if it was a clsid moniker, I may have a class factory + hr = punk->QueryInterface(IID_IClassFactory, (void **)&pIClass); + if (!SUCCEEDED(hr)) goto doDisp; + punk->Release(); + // try to create an instance + hr = pIClass->CreateInstance(NULL, IID_IUnknown, (void **)&punk); + if (FAILED(hr)) { + ThrowComFail(env, "Can't create moniker class instance", hr); + return; + } + pIClass->Release(); + goto doDisp; + } + env->ReleaseStringUTFChars(_progid, progid); + // Now, try to find an IDispatch interface for progid + hr = CLSIDFromProgID(bsProgId, &clsid); + if (FAILED(hr)) { + ThrowComFail(env, "Can't get object clsid from progid", hr); + return; + } + // standard creation + hr = CoCreateInstance(clsid,NULL,CLSCTX_LOCAL_SERVER|CLSCTX_INPROC_SERVER,IID_IUnknown, (void **)&punk); + if (!SUCCEEDED(hr)) { + ThrowComFail(env, "Can't co-create object", hr); + return; + } +doDisp: + + // now get an IDispatch pointer from the IUnknown + hr = punk->QueryInterface(IID_IDispatch, (void **)&pIDispatch); + if (!SUCCEEDED(hr)) { + ThrowComFail(env, "Can't QI object for IDispatch", hr); + return; + } + // CoCreateInstance called AddRef + punk->Release(); + env->SetIntField(_this, jf, (unsigned int)pIDispatch); +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_release + (JNIEnv *env, jobject _this) +{ + jclass clazz = env->GetObjectClass(_this); + jfieldID jf = env->GetFieldID( clazz, DISP_FLD, "I"); + jint num = env->GetIntField(_this, jf); + + IDispatch *disp = (IDispatch *)num; + if (disp) { + disp->Release(); + env->SetIntField(_this, jf, (unsigned int)0); + } +} + +static HRESULT +name2ID(IDispatch *pIDispatch, const char *prop, DISPID *dispid, long lcid) +{ + HRESULT hresult; + USES_CONVERSION; + LPOLESTR propOle = A2W(prop); + hresult = pIDispatch->GetIDsOfNames(IID_NULL,(LPOLESTR*)&propOle,1,lcid,dispid); + return hresult; +} + +JNIEXPORT jintArray JNICALL Java_com_jacob_com_Dispatch_getIDsOfNames + (JNIEnv *env, jclass clazz, jobject disp, jint lcid, jobjectArray names) +{ + IDispatch *pIDispatch = extractDispatch(env, disp); + if (!pIDispatch) return NULL; + + int l = env->GetArrayLength(names); + int i; + LPOLESTR *lps = (LPOLESTR *)CoTaskMemAlloc(l * sizeof(LPOLESTR)); + DISPID *dispid = (DISPID *)CoTaskMemAlloc(l * sizeof(DISPID)); + for(i=0;iGetObjectArrayElement(names, i); + const char *nm = env->GetStringUTFChars(s, NULL); + LPOLESTR nmos = A2W(nm); + env->ReleaseStringUTFChars(s, nm); + lps[i] = nmos; + env->DeleteLocalRef(s); + } + HRESULT hr = pIDispatch->GetIDsOfNames(IID_NULL,lps,l,lcid,dispid); + if (FAILED(hr)) { + CoTaskMemFree(lps); + CoTaskMemFree(dispid); + char buf[1024]; + strcpy(buf, "Can't map names to dispid:"); + for(i=0;iGetObjectArrayElement(names, i); + const char *nm = env->GetStringUTFChars(s, NULL); + strcat(buf, nm); + env->ReleaseStringUTFChars(s, nm); + env->DeleteLocalRef(s); + } + ThrowComFail(env, buf, hr); + return NULL; + } + jintArray iarr = env->NewIntArray(l); + env->SetIntArrayRegion(iarr, i, l, dispid); + CoTaskMemFree(lps); + CoTaskMemFree(dispid); + return iarr; +} + +static char* BasicToCharString(const BSTR inBasicString) +{ + char* charString = NULL; + const size_t charStrSize = ::SysStringLen(inBasicString) + 1; + if (charStrSize > 1) + { + charString = new char[charStrSize]; + size_t len = ::wcstombs(charString, inBasicString, charStrSize); + } + else + charString = ::strdup(""); + + return charString; +} + +static char* CreateErrorMsgFromResult(HRESULT inResult) +{ + char* msg = NULL; + ::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM, NULL, inResult,MAKELANGID(LANG_NEUTRAL, + SUBLANG_DEFAULT), (LPTSTR) &msg, 0, NULL); + if (msg == NULL) + msg = ::strdup("An unknown COM error has occured."); + + return msg; +} + +static char* CreateErrorMsgFromInfo(HRESULT inResult, EXCEPINFO* ioInfo, + const char* methName) +{ + char* msg = NULL; + + // If this is a dispatch exception (triggered by an Invoke message), + // then we have to take some additional steps to process the error + // message. + if (inResult == DISP_E_EXCEPTION) + { + // Check to see if the server deferred filling in the exception + // information. If so, make the call to populate the structure. + if (ioInfo->pfnDeferredFillIn != NULL) + (*(ioInfo->pfnDeferredFillIn))(ioInfo); + + // Build the error message from exception information content. + char* source = ::BasicToCharString(ioInfo->bstrSource); + char* desc = ::BasicToCharString(ioInfo->bstrDescription); + const size_t MSG_LEN = ::strlen(methName) + ::strlen(source) + ::strlen(desc) + 128; + msg = new char[MSG_LEN]; + ::strncpy(msg, "Invoke of: ", MSG_LEN); + ::strncat(msg, methName, MSG_LEN); + ::strncat(msg, "\nSource: ", MSG_LEN); + ::strncat(msg, source, MSG_LEN); + ::strncat(msg, "\nDescription: ", MSG_LEN); + ::strncat(msg, desc, MSG_LEN); + ::strncat(msg, "\n", MSG_LEN); + delete source; + delete desc; + } + else + { + char* msg2 = CreateErrorMsgFromResult(inResult); + const size_t MSG_LEN = ::strlen(methName) + ::strlen(msg2) + 128; + msg = new char[MSG_LEN]; + ::strncpy(msg, "A COM exception has been encountered:\n" + "At Invoke of: ", MSG_LEN); + ::strncat(msg, methName, MSG_LEN); + ::strncat(msg, "\nDescription: ", MSG_LEN); + ::strncat(msg, msg2, MSG_LEN); + // jacob-msg 1075 - SF 1053872 : Documentation says "use LocalFree"!! + //delete msg2; + LocalFree(msg2); + } + return msg; +} + + +#define SETDISPPARAMS(dp, numArgs, pvArgs, numNamed, pNamed) \ + {\ + (dp).cArgs = numArgs; \ + (dp).rgvarg = pvArgs; \ + (dp).cNamedArgs = numNamed; \ + (dp).rgdispidNamedArgs = pNamed; \ + } + +#define SETNOPARAMS(dp) SETDISPPARAMS(dp, 0, NULL, 0, NULL) + +JNIEXPORT jobject JNICALL Java_com_jacob_com_Dispatch_invokev + (JNIEnv *env, jclass clazz, + jobject disp, jstring name, jint dispid, + jint lcid, jint wFlags, jobjectArray vArg, jintArray uArgErr) +{ + DISPPARAMS dispparams; + EXCEPINFO excepInfo; + + IDispatch *pIDispatch = extractDispatch(env, disp); + if (!pIDispatch) return NULL; + + int dispID = dispid; + if (name != NULL) + { + const char *nm = env->GetStringUTFChars(name, NULL); + HRESULT hr; + if (FAILED(hr = name2ID(pIDispatch, nm, (long *)&dispID, lcid))) { + char buf[1024]; + sprintf(buf, "Can't map name to dispid: %s", nm); + ThrowComFail(env, buf, -1); + return NULL; + } + env->ReleaseStringUTFChars(name, nm); + } + + int num_args = env->GetArrayLength(vArg); + int i, j; + VARIANT *varr = NULL; + if (num_args) + { + varr = (VARIANT *)CoTaskMemAlloc(num_args*sizeof(VARIANT)); + /* reverse args for dispatch */ + for(i=num_args-1,j=0;0<=i;i--,j++) + { + VariantInit(&varr[j]); + jobject arg = env->GetObjectArrayElement(vArg, i); + VARIANT *v = extractVariant(env, arg); + // no escape from copy? + VariantCopy(&varr[j], v); + env->DeleteLocalRef(arg); + } + } + // prepare a new return value + jclass variantClass = env->FindClass("com/jacob/com/Variant"); + jmethodID variantCons = + env->GetMethodID(variantClass, "", "()V"); + // construct a variant to return + jobject newVariant = env->NewObject(variantClass, variantCons); + // get the VARIANT from the newVariant + VARIANT *v = extractVariant(env, newVariant); + DISPID dispidPropertyPut = DISPID_PROPERTYPUT; + + // determine how to dispatch + switch (wFlags) + { + case DISPATCH_PROPERTYGET: // GET + case DISPATCH_METHOD: // METHOD + case DISPATCH_METHOD|DISPATCH_PROPERTYGET: + { + SETDISPPARAMS(dispparams, num_args, varr, 0, NULL); + break; + } + case DISPATCH_PROPERTYPUT: + case DISPATCH_PROPERTYPUTREF: // jacob-msg 1075 - SF 1053872 + { + SETDISPPARAMS(dispparams, num_args, varr, 1, &dispidPropertyPut); + break; + } + } + + HRESULT hr = 0; + jint count = env->GetArrayLength(uArgErr); + if ( count != 0 ) + { + jint *uAE = env->GetIntArrayElements(uArgErr, NULL); + hr = pIDispatch->Invoke(dispID,IID_NULL, + lcid,wFlags,&dispparams,v,&excepInfo,(unsigned int *)uAE); + env->ReleaseIntArrayElements(uArgErr, uAE, 0); + } + else + { + hr = pIDispatch->Invoke(dispID,IID_NULL, + lcid,wFlags,&dispparams,v,&excepInfo, NULL); + } + if (num_args) + { + // to account for inouts, I need to copy the inputs back to + // the java array after the method returns + // this occurs, for example, in the ADO wrappers + for(i=num_args-1,j=0;0<=i;i--,j++) + { + jobject arg = env->GetObjectArrayElement(vArg, i); + VARIANT *v = extractVariant(env, arg); + // reverse copy + VariantCopy(v, &varr[j]); + // clear out the temporary variant + VariantClear(&varr[j]); + env->DeleteLocalRef(arg); + } + } + + if (varr) CoTaskMemFree(varr); + + // check for error and display a somewhat verbose error message + if (!SUCCEEDED(hr)) { + const char *nm = env->GetStringUTFChars(name, NULL); + char *buf = CreateErrorMsgFromInfo(hr, &excepInfo, nm); + env->ReleaseStringUTFChars(name, nm); + + // jacob-msg 3696 - SF 1053866 + if(hr == DISP_E_EXCEPTION) + { + if(excepInfo.scode != 0) + { + hr = excepInfo.scode; + } + else + { + hr = _com_error::WCodeToHRESULT(excepInfo.wCode); + } + } + + ThrowComFail(env, buf, hr); + if (buf) delete buf; + return NULL; + } + + return newVariant; +} + +} + + diff --git a/jni/Dispatch.h b/jni/Dispatch.h index a6f7da6..0216e47 100644 --- a/jni/Dispatch.h +++ b/jni/Dispatch.h @@ -1,53 +1,53 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class Dispatch */ - -#ifndef _Included_Dispatch -#define _Included_Dispatch -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jacob_com_Dispatch - * Method: QueryInterface - * Signature: (Ljava/lang/String;)Lcom/jacob/com/Dispatch; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Dispatch_QueryInterface - (JNIEnv *, jobject, jstring); - -/* - * Class: Dispatch - * Method: createInstance - * Signature: (Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_createInstance - (JNIEnv *, jobject, jstring); - -/* - * Class: Dispatch - * Method: release - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_release - (JNIEnv *, jobject); - -/* - * Class: Dispatch - * Method: getIDsOfNames - * Signature: (Ljava/lang/Object;I[Ljava/lang/String;)[I - */ -JNIEXPORT jintArray JNICALL Java_com_jacob_com_Dispatch_getIDsOfNames - (JNIEnv *, jclass, jobject, jint, jobjectArray); - -/* - * Class: Dispatch - * Method: invokev - * Signature: (Ljava/lang/Object;Ljava/lang/String;III[LVariant;[I)LVariant; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Dispatch_invokev - (JNIEnv *, jclass, jobject, jstring, jint, jint, jint, jobjectArray, jintArray); - -#ifdef __cplusplus -} -#endif -#endif +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class Dispatch */ + +#ifndef _Included_Dispatch +#define _Included_Dispatch +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_jacob_com_Dispatch + * Method: QueryInterface + * Signature: (Ljava/lang/String;)Lcom/jacob/com/Dispatch; + */ +JNIEXPORT jobject JNICALL Java_com_jacob_com_Dispatch_QueryInterface + (JNIEnv *, jobject, jstring); + +/* + * Class: Dispatch + * Method: createInstance + * Signature: (Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_createInstance + (JNIEnv *, jobject, jstring); + +/* + * Class: Dispatch + * Method: release + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_release + (JNIEnv *, jobject); + +/* + * Class: Dispatch + * Method: getIDsOfNames + * Signature: (Ljava/lang/Object;I[Ljava/lang/String;)[I + */ +JNIEXPORT jintArray JNICALL Java_com_jacob_com_Dispatch_getIDsOfNames + (JNIEnv *, jclass, jobject, jint, jobjectArray); + +/* + * Class: Dispatch + * Method: invokev + * Signature: (Ljava/lang/Object;Ljava/lang/String;III[LVariant;[I)LVariant; + */ +JNIEXPORT jobject JNICALL Java_com_jacob_com_Dispatch_invokev + (JNIEnv *, jclass, jobject, jstring, jint, jint, jint, jobjectArray, jintArray); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/jni/DispatchEvents.cpp b/jni/DispatchEvents.cpp index 493930b..b4bda4d 100644 --- a/jni/DispatchEvents.cpp +++ b/jni/DispatchEvents.cpp @@ -1,311 +1,311 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Redistributions in any form must be accompanied by information on - * how to obtain complete source code for the JACOB software. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include "DispatchEvents.h" -#include "EventProxy.h" -// Win32 support for Ole Automation -#include -#include -#include -#include -#include -#include - -#include "util.h" - -extern "C" -{ - -#define PROXY_FLD "m_pConnPtProxy" - -// defined below -BOOL GetEventIID(IUnknown*, IID*, CComBSTR **, DISPID **, int *,LPOLESTR); -BOOL getClassInfoFromProgId(LPOLESTR bsProgId,LPTYPEINFO *pClassInfo); - -// extract a EventProxy* from a jobject -EventProxy *extractProxy(JNIEnv *env, jobject arg) -{ - jclass argClass = env->GetObjectClass(arg); - jfieldID ajf = env->GetFieldID( argClass, PROXY_FLD, "I"); - jint anum = env->GetIntField(arg, ajf); - EventProxy *v = (EventProxy *)anum; - return v; -} - -void putProxy(JNIEnv *env, jobject arg, EventProxy *ep) -{ - jclass argClass = env->GetObjectClass(arg); - jfieldID ajf = env->GetFieldID( argClass, PROXY_FLD, "I"); - jint anum = env->GetIntField(arg, ajf); - env->SetIntField(arg, ajf, (jint)ep); -} - -/* - * Class: DispatchEvents - * Method: init2 - * Signature: (LDispatch;Ljava/lang/Object;Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_init2 - (JNIEnv *env, jobject _this, jobject src, jobject sink, jstring _progid) -{ - USES_CONVERSION; - // find progid if any - LPOLESTR bsProgId = NULL; - if (_progid!=NULL) { - const char *progid = env->GetStringUTFChars(_progid, NULL); - bsProgId = A2W(progid); - } - - // get the IDispatch for the source object - IDispatch *pDisp = extractDispatch(env, src); - CComQIPtr pUnk(pDisp); - // see if it implements connection points - CComQIPtr pCPC(pUnk); - if (!pCPC) - { - // no events, throw something - ThrowComFail(env, "Can't find IConnectionPointContainer", -1); - return; - } - // hook up to the default source iid - CComPtr pCP; - IID eventIID; - CComBSTR *mNames; - DISPID *mIDs; - int n_EventMethods; - if (!GetEventIID(pUnk, &eventIID, &mNames, &mIDs, &n_EventMethods,bsProgId)) { - ThrowComFail(env, "Can't find event iid", -1); - return; - } - HRESULT hr = pCPC->FindConnectionPoint(eventIID, &pCP); - DWORD dwEventCookie; - if (SUCCEEDED(hr)) - { - EventProxy *ep = new EventProxy(env, sink, pCP, eventIID, mNames, mIDs, n_EventMethods); - // need to store ep on _this, in case it gets collected - putProxy(env, _this, ep); - } else { - ThrowComFail(env, "Can't FindConnectionPoint", hr); - } -} - -/* - * Class: DispatchEvents - * Method: init - * Signature: (LDispatch;Ljava/lang/Object;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_init - (JNIEnv *env, jobject _this, jobject src, jobject sink) -{ - Java_com_jacob_com_DispatchEvents_init2(env,_this,src,sink,NULL); -} - -/* - * Class: DispatchEvents - * Method: release - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_release - (JNIEnv *env, jobject _this) -{ - EventProxy *ep = extractProxy(env, _this); - if (ep) { - ep->Release(); - putProxy(env, _this, NULL); - } -} - -/* - * I need a reverse map from the event interface's dispids to - * function names so that we can reflect them to java - */ -void -LoadNameCache(LPTYPEINFO pTypeInfo, LPTYPEATTR pta, - CComBSTR **mNames, DISPID **mIDs, int *nmeth) -{ - CComBSTR *names = NULL; - DISPID *ids = NULL; - int m_nCount; - - m_nCount = pta->cFuncs; - *nmeth = m_nCount; - names = m_nCount == 0 ? NULL : new CComBSTR[m_nCount]; - ids = m_nCount == 0 ? NULL : new DISPID[m_nCount]; - for (int i=0; iGetFuncDesc(i, &pfd))) - { - CComBSTR bstrName; - if (SUCCEEDED(pTypeInfo->GetDocumentation(pfd->memid, &bstrName, NULL, NULL, NULL))) - { - names[i].Attach(bstrName.Detach()); - ids[i] = pfd->memid; - /* - USES_CONVERSION; - printf("map:%d -> %s\n", ids[i], W2A((OLECHAR *)names[i])); - */ - } - pTypeInfo->ReleaseFuncDesc(pfd); - } - } - *mNames = names; - *mIDs = ids; -} - -#define IMPLTYPE_MASK \ - (IMPLTYPEFLAG_FDEFAULT | IMPLTYPEFLAG_FSOURCE | IMPLTYPEFLAG_FRESTRICTED) - -#define IMPLTYPE_DEFAULTSOURCE \ - (IMPLTYPEFLAG_FDEFAULT | IMPLTYPEFLAG_FSOURCE) - - -BOOL GetEventIID(IUnknown *m_pObject, IID* piid, - CComBSTR **mNames, DISPID **mIDs, int *nmeth,LPOLESTR bsProgId) -{ - *piid = GUID_NULL; - ATLASSERT(m_pObject != NULL); - // I Always use IProvideClassInfo rather than IProvideClassInfo2 - // since I also need to create a mapping from dispid to name - LPPROVIDECLASSINFO pPCI = NULL; - LPTYPEINFO pClassInfo = NULL; - if (SUCCEEDED(m_pObject->QueryInterface(IID_IProvideClassInfo, (LPVOID*)&pPCI))) - { - //printf("got IProvideClassInfo\n"); - ATLASSERT(pPCI != NULL); - HRESULT hr = pPCI->GetClassInfo(&pClassInfo); - pPCI->Release(); - if (!SUCCEEDED(hr)) return false; - } - else if (getClassInfoFromProgId(bsProgId,&pClassInfo)) { - } - else { - printf("couldn't get IProvideClassInfo\n"); - return false; - } - - - //printf("got ClassInfo\n"); - ATLASSERT(pClassInfo != NULL); - LPTYPEATTR pClassAttr; - if (SUCCEEDED(pClassInfo->GetTypeAttr(&pClassAttr))) - { - //printf("got TypeAttr\n"); - ATLASSERT(pClassAttr != NULL); - ATLASSERT(pClassAttr->typekind == TKIND_COCLASS); - - // Search for typeinfo of the default events interface. - int nFlags; - HREFTYPE hRefType; - - for (unsigned int i = 0; i < pClassAttr->cImplTypes; i++) - { - if (SUCCEEDED(pClassInfo->GetImplTypeFlags(i, &nFlags)) && - ((nFlags & IMPLTYPE_MASK) == IMPLTYPE_DEFAULTSOURCE)) - { - // Found it. Now look at its attributes to get IID. - LPTYPEINFO pEventInfo = NULL; - if (SUCCEEDED(pClassInfo->GetRefTypeOfImplType(i, - &hRefType)) && - SUCCEEDED(pClassInfo->GetRefTypeInfo(hRefType, - &pEventInfo))) - { - ATLASSERT(pEventInfo != NULL); - LPTYPEATTR pEventAttr; - if (SUCCEEDED(pEventInfo->GetTypeAttr(&pEventAttr))) - { - ATLASSERT(pEventAttr != NULL); - - // create a mapping from dispid to string - LoadNameCache(pEventInfo, pEventAttr, - mNames, mIDs, nmeth); - - *piid = pEventAttr->guid; - pEventInfo->ReleaseTypeAttr(pEventAttr); - } - pEventInfo->Release(); - } - break; - } - } - pClassInfo->ReleaseTypeAttr(pClassAttr); - } - pClassInfo->Release(); - - return (!IsEqualIID(*piid, GUID_NULL)); -} - -BOOL getClassInfoFromProgId(LPOLESTR bsProgId,LPTYPEINFO *pClassInfo) -{ - USES_CONVERSION; - CLSID clsid; - GUID libid; - if (FAILED(CLSIDFromProgID(bsProgId, &clsid))) return false; - if (FAILED(StringFromCLSID(clsid,&bsProgId))) return false; - HKEY keySoftware, keyClasses, keyCLSID, keyXXXX, keyTypeLib; - DWORD dwType, dwCountData=50; - BYTE abData[50]; - LONG lVal; - lVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE"),0,KEY_READ,&keySoftware); - if (lVal==ERROR_SUCCESS) { - lVal = RegOpenKeyEx(keySoftware,_T("Classes"),0,KEY_READ,&keyClasses); - if (lVal==ERROR_SUCCESS) { - lVal = RegOpenKeyEx(keyClasses,_T("CLSID"),0,KEY_READ,&keyCLSID); - if (lVal==ERROR_SUCCESS) { - _TCHAR *tsProgId = W2T(bsProgId); - lVal = RegOpenKeyEx(keyCLSID,tsProgId,0,KEY_READ,&keyXXXX); - if (lVal==ERROR_SUCCESS) { - lVal = RegOpenKeyEx(keyXXXX,_T("TypeLib"),0,KEY_READ,&keyTypeLib); - if (lVal==ERROR_SUCCESS) { - lVal = RegQueryValueEx(keyTypeLib,NULL,NULL,&dwType,abData,&dwCountData); - RegCloseKey(keyTypeLib); - } - RegCloseKey(keyXXXX); - } - RegCloseKey(keyCLSID); - } - RegCloseKey(keyClasses); - } - RegCloseKey(keySoftware); - } - if (lVal!=ERROR_SUCCESS) return false; - BSTR bsLibId = A2BSTR((char*)abData); - if (FAILED(CLSIDFromString(bsLibId,&libid))) return false; - //Try loading from registry information. - ITypeLib* pITypeLib; - if (FAILED(LoadRegTypeLib(libid,1,0, LANG_NEUTRAL, &pITypeLib))) return false; - //Find ITypeInfo for coclass. - pITypeLib->GetTypeInfoOfGuid(clsid, pClassInfo); - pITypeLib->Release(); - return true; -} - -} - - +/* + * Copyright (c) 1999-2004 Sourceforge JACOB Project. + * All rights reserved. Originator: Dan Adler (http://danadler.com). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Redistributions in any form must be accompanied by information on + * how to obtain complete source code for the JACOB software. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "DispatchEvents.h" +#include "EventProxy.h" +// Win32 support for Ole Automation +#include +#include +#include +#include +#include +#include + +#include "util.h" + +extern "C" +{ + +#define PROXY_FLD "m_pConnPtProxy" + +// defined below +BOOL GetEventIID(IUnknown*, IID*, CComBSTR **, DISPID **, int *,LPOLESTR); +BOOL getClassInfoFromProgId(LPOLESTR bsProgId,LPTYPEINFO *pClassInfo); + +// extract a EventProxy* from a jobject +EventProxy *extractProxy(JNIEnv *env, jobject arg) +{ + jclass argClass = env->GetObjectClass(arg); + jfieldID ajf = env->GetFieldID( argClass, PROXY_FLD, "I"); + jint anum = env->GetIntField(arg, ajf); + EventProxy *v = (EventProxy *)anum; + return v; +} + +void putProxy(JNIEnv *env, jobject arg, EventProxy *ep) +{ + jclass argClass = env->GetObjectClass(arg); + jfieldID ajf = env->GetFieldID( argClass, PROXY_FLD, "I"); + jint anum = env->GetIntField(arg, ajf); + env->SetIntField(arg, ajf, (jint)ep); +} + +/* + * Class: DispatchEvents + * Method: init2 + * Signature: (LDispatch;Ljava/lang/Object;Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_init2 + (JNIEnv *env, jobject _this, jobject src, jobject sink, jstring _progid) +{ + USES_CONVERSION; + // find progid if any + LPOLESTR bsProgId = NULL; + if (_progid!=NULL) { + const char *progid = env->GetStringUTFChars(_progid, NULL); + bsProgId = A2W(progid); + } + + // get the IDispatch for the source object + IDispatch *pDisp = extractDispatch(env, src); + CComQIPtr pUnk(pDisp); + // see if it implements connection points + CComQIPtr pCPC(pUnk); + if (!pCPC) + { + // no events, throw something + ThrowComFail(env, "Can't find IConnectionPointContainer", -1); + return; + } + // hook up to the default source iid + CComPtr pCP; + IID eventIID; + CComBSTR *mNames; + DISPID *mIDs; + int n_EventMethods; + if (!GetEventIID(pUnk, &eventIID, &mNames, &mIDs, &n_EventMethods,bsProgId)) { + ThrowComFail(env, "Can't find event iid", -1); + return; + } + HRESULT hr = pCPC->FindConnectionPoint(eventIID, &pCP); + DWORD dwEventCookie; + if (SUCCEEDED(hr)) + { + EventProxy *ep = new EventProxy(env, sink, pCP, eventIID, mNames, mIDs, n_EventMethods); + // need to store ep on _this, in case it gets collected + putProxy(env, _this, ep); + } else { + ThrowComFail(env, "Can't FindConnectionPoint", hr); + } +} + +/* + * Class: DispatchEvents + * Method: init + * Signature: (LDispatch;Ljava/lang/Object;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_init + (JNIEnv *env, jobject _this, jobject src, jobject sink) +{ + Java_com_jacob_com_DispatchEvents_init2(env,_this,src,sink,NULL); +} + +/* + * Class: DispatchEvents + * Method: release + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_release + (JNIEnv *env, jobject _this) +{ + EventProxy *ep = extractProxy(env, _this); + if (ep) { + ep->Release(); + putProxy(env, _this, NULL); + } +} + +/* + * I need a reverse map from the event interface's dispids to + * function names so that we can reflect them to java + */ +void +LoadNameCache(LPTYPEINFO pTypeInfo, LPTYPEATTR pta, + CComBSTR **mNames, DISPID **mIDs, int *nmeth) +{ + CComBSTR *names = NULL; + DISPID *ids = NULL; + int m_nCount; + + m_nCount = pta->cFuncs; + *nmeth = m_nCount; + names = m_nCount == 0 ? NULL : new CComBSTR[m_nCount]; + ids = m_nCount == 0 ? NULL : new DISPID[m_nCount]; + for (int i=0; iGetFuncDesc(i, &pfd))) + { + CComBSTR bstrName; + if (SUCCEEDED(pTypeInfo->GetDocumentation(pfd->memid, &bstrName, NULL, NULL, NULL))) + { + names[i].Attach(bstrName.Detach()); + ids[i] = pfd->memid; + /* + USES_CONVERSION; + printf("map:%d -> %s\n", ids[i], W2A((OLECHAR *)names[i])); + */ + } + pTypeInfo->ReleaseFuncDesc(pfd); + } + } + *mNames = names; + *mIDs = ids; +} + +#define IMPLTYPE_MASK \ + (IMPLTYPEFLAG_FDEFAULT | IMPLTYPEFLAG_FSOURCE | IMPLTYPEFLAG_FRESTRICTED) + +#define IMPLTYPE_DEFAULTSOURCE \ + (IMPLTYPEFLAG_FDEFAULT | IMPLTYPEFLAG_FSOURCE) + + +BOOL GetEventIID(IUnknown *m_pObject, IID* piid, + CComBSTR **mNames, DISPID **mIDs, int *nmeth,LPOLESTR bsProgId) +{ + *piid = GUID_NULL; + ATLASSERT(m_pObject != NULL); + // I Always use IProvideClassInfo rather than IProvideClassInfo2 + // since I also need to create a mapping from dispid to name + LPPROVIDECLASSINFO pPCI = NULL; + LPTYPEINFO pClassInfo = NULL; + if (SUCCEEDED(m_pObject->QueryInterface(IID_IProvideClassInfo, (LPVOID*)&pPCI))) + { + //printf("got IProvideClassInfo\n"); + ATLASSERT(pPCI != NULL); + HRESULT hr = pPCI->GetClassInfo(&pClassInfo); + pPCI->Release(); + if (!SUCCEEDED(hr)) return false; + } + else if (getClassInfoFromProgId(bsProgId,&pClassInfo)) { + } + else { + printf("couldn't get IProvideClassInfo\n"); + return false; + } + + + //printf("got ClassInfo\n"); + ATLASSERT(pClassInfo != NULL); + LPTYPEATTR pClassAttr; + if (SUCCEEDED(pClassInfo->GetTypeAttr(&pClassAttr))) + { + //printf("got TypeAttr\n"); + ATLASSERT(pClassAttr != NULL); + ATLASSERT(pClassAttr->typekind == TKIND_COCLASS); + + // Search for typeinfo of the default events interface. + int nFlags; + HREFTYPE hRefType; + + for (unsigned int i = 0; i < pClassAttr->cImplTypes; i++) + { + if (SUCCEEDED(pClassInfo->GetImplTypeFlags(i, &nFlags)) && + ((nFlags & IMPLTYPE_MASK) == IMPLTYPE_DEFAULTSOURCE)) + { + // Found it. Now look at its attributes to get IID. + LPTYPEINFO pEventInfo = NULL; + if (SUCCEEDED(pClassInfo->GetRefTypeOfImplType(i, + &hRefType)) && + SUCCEEDED(pClassInfo->GetRefTypeInfo(hRefType, + &pEventInfo))) + { + ATLASSERT(pEventInfo != NULL); + LPTYPEATTR pEventAttr; + if (SUCCEEDED(pEventInfo->GetTypeAttr(&pEventAttr))) + { + ATLASSERT(pEventAttr != NULL); + + // create a mapping from dispid to string + LoadNameCache(pEventInfo, pEventAttr, + mNames, mIDs, nmeth); + + *piid = pEventAttr->guid; + pEventInfo->ReleaseTypeAttr(pEventAttr); + } + pEventInfo->Release(); + } + break; + } + } + pClassInfo->ReleaseTypeAttr(pClassAttr); + } + pClassInfo->Release(); + + return (!IsEqualIID(*piid, GUID_NULL)); +} + +BOOL getClassInfoFromProgId(LPOLESTR bsProgId,LPTYPEINFO *pClassInfo) +{ + USES_CONVERSION; + CLSID clsid; + GUID libid; + if (FAILED(CLSIDFromProgID(bsProgId, &clsid))) return false; + if (FAILED(StringFromCLSID(clsid,&bsProgId))) return false; + HKEY keySoftware, keyClasses, keyCLSID, keyXXXX, keyTypeLib; + DWORD dwType, dwCountData=50; + BYTE abData[50]; + LONG lVal; + lVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE"),0,KEY_READ,&keySoftware); + if (lVal==ERROR_SUCCESS) { + lVal = RegOpenKeyEx(keySoftware,_T("Classes"),0,KEY_READ,&keyClasses); + if (lVal==ERROR_SUCCESS) { + lVal = RegOpenKeyEx(keyClasses,_T("CLSID"),0,KEY_READ,&keyCLSID); + if (lVal==ERROR_SUCCESS) { + _TCHAR *tsProgId = W2T(bsProgId); + lVal = RegOpenKeyEx(keyCLSID,tsProgId,0,KEY_READ,&keyXXXX); + if (lVal==ERROR_SUCCESS) { + lVal = RegOpenKeyEx(keyXXXX,_T("TypeLib"),0,KEY_READ,&keyTypeLib); + if (lVal==ERROR_SUCCESS) { + lVal = RegQueryValueEx(keyTypeLib,NULL,NULL,&dwType,abData,&dwCountData); + RegCloseKey(keyTypeLib); + } + RegCloseKey(keyXXXX); + } + RegCloseKey(keyCLSID); + } + RegCloseKey(keyClasses); + } + RegCloseKey(keySoftware); + } + if (lVal!=ERROR_SUCCESS) return false; + BSTR bsLibId = A2BSTR((char*)abData); + if (FAILED(CLSIDFromString(bsLibId,&libid))) return false; + //Try loading from registry information. + ITypeLib* pITypeLib; + if (FAILED(LoadRegTypeLib(libid,1,0, LANG_NEUTRAL, &pITypeLib))) return false; + //Find ITypeInfo for coclass. + pITypeLib->GetTypeInfoOfGuid(clsid, pClassInfo); + pITypeLib->Release(); + return true; +} + +} + + diff --git a/jni/DispatchEvents.h b/jni/DispatchEvents.h index e8ca421..0439426 100644 --- a/jni/DispatchEvents.h +++ b/jni/DispatchEvents.h @@ -1,39 +1,39 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class DispatchEvents */ - -#ifndef _Included_DispatchEvents -#define _Included_DispatchEvents -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: DispatchEvents - * Method: init - * Signature: (LDispatch;Ljava/lang/Object;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_init - (JNIEnv *, jobject, jobject, jobject); - -/* - * Class: DispatchEvents - * Method: init2 - * Signature: (LDispatch;Ljava/lang/Object;Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_init2 - (JNIEnv *, jobject, jobject, jobject, jstring); - -/* - * Class: DispatchEvents - * Method: release - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_release - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif - - +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class DispatchEvents */ + +#ifndef _Included_DispatchEvents +#define _Included_DispatchEvents +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: DispatchEvents + * Method: init + * Signature: (LDispatch;Ljava/lang/Object;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_init + (JNIEnv *, jobject, jobject, jobject); + +/* + * Class: DispatchEvents + * Method: init2 + * Signature: (LDispatch;Ljava/lang/Object;Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_init2 + (JNIEnv *, jobject, jobject, jobject, jstring); + +/* + * Class: DispatchEvents + * Method: release + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_release + (JNIEnv *, jobject); + +#ifdef __cplusplus +} +#endif +#endif + + diff --git a/jni/DispatchProxy.cpp b/jni/DispatchProxy.cpp index 7cb78ca..44589e9 100644 --- a/jni/DispatchProxy.cpp +++ b/jni/DispatchProxy.cpp @@ -1,116 +1,116 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Redistributions in any form must be accompanied by information on - * how to obtain complete source code for the JACOB software. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include "stdafx.h" -#include -#include "ComThread.h" -// Win32 support for Ole Automation -#include -#include -#include -#include -#include -#include "util.h" - -extern "C" -{ - -// extract a IStream from a jobject -IStream *extractStream(JNIEnv *env, jobject arg) -{ - jclass argClass = env->GetObjectClass(arg); - jfieldID ajf = env->GetFieldID( argClass, "m_pStream", "I"); - jint anum = env->GetIntField(arg, ajf); - IStream *v = (IStream *)anum; - return v; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_DispatchProxy_MarshalIntoStream - (JNIEnv *env, jobject _this, jobject disp) -{ - IDispatch *pIDispatch = extractDispatch(env, disp); - if (!pIDispatch) return; - IStream *ps; // this is the stream we will marshall into - HRESULT hr = CoMarshalInterThreadInterfaceInStream( - IID_IDispatch, pIDispatch, &ps); - if (!SUCCEEDED(hr)) - { - ThrowComFail(env, "Could not Marshal Dispatch into IStream", hr); - return; - } - // store the stream pointer on the object - jclass argClass = env->GetObjectClass(_this); - jfieldID ajf = env->GetFieldID( argClass, "m_pStream", "I"); - env->SetIntField(_this, ajf, (jint)ps); -} - -JNIEXPORT jobject JNICALL Java_com_jacob_com_DispatchProxy_MarshalFromStream - (JNIEnv *env, jobject _this) -{ - IStream *ps = extractStream(env, _this); - if (!ps) - { - ThrowComFail(env, "Could not get IStream from DispatchProxy", -1); - return NULL; - } - IDispatch *pD; - HRESULT hr = CoGetInterfaceAndReleaseStream(ps, IID_IDispatch, (void **)&pD); - // zero out the stream pointer on the object - // since the stream can only be read once - jclass argClass = env->GetObjectClass(_this); - jfieldID ajf = env->GetFieldID( argClass, "m_pStream", "I"); - env->SetIntField(_this, ajf, (unsigned int)0); - - if (!SUCCEEDED(hr)) - { - ThrowComFail(env, "Could not Marshal Dispatch from IStream", hr); - return NULL; - } - jclass autoClass = env->FindClass("com/jacob/com/Dispatch"); - jmethodID autoCons = env->GetMethodID(autoClass, "", "(I)V"); - // construct a Dispatch object to return - // I am copying the pointer to java - if (pD) pD->AddRef(); - jobject newAuto = env->NewObject(autoClass, autoCons, pD); - return newAuto; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_DispatchProxy_release - (JNIEnv *env, jobject _this) -{ - IStream *ps = extractStream(env, _this); - if (ps) { - ps->Release(); - jclass argClass = env->GetObjectClass(_this); - jfieldID ajf = env->GetFieldID( argClass, "m_pStream", "I"); - env->SetIntField(_this, ajf, (unsigned int)0); - } -} - -} +/* + * Copyright (c) 1999-2004 Sourceforge JACOB Project. + * All rights reserved. Originator: Dan Adler (http://danadler.com). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Redistributions in any form must be accompanied by information on + * how to obtain complete source code for the JACOB software. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "stdafx.h" +#include +#include "ComThread.h" +// Win32 support for Ole Automation +#include +#include +#include +#include +#include +#include "util.h" + +extern "C" +{ + +// extract a IStream from a jobject +IStream *extractStream(JNIEnv *env, jobject arg) +{ + jclass argClass = env->GetObjectClass(arg); + jfieldID ajf = env->GetFieldID( argClass, "m_pStream", "I"); + jint anum = env->GetIntField(arg, ajf); + IStream *v = (IStream *)anum; + return v; +} + +JNIEXPORT void JNICALL Java_com_jacob_com_DispatchProxy_MarshalIntoStream + (JNIEnv *env, jobject _this, jobject disp) +{ + IDispatch *pIDispatch = extractDispatch(env, disp); + if (!pIDispatch) return; + IStream *ps; // this is the stream we will marshall into + HRESULT hr = CoMarshalInterThreadInterfaceInStream( + IID_IDispatch, pIDispatch, &ps); + if (!SUCCEEDED(hr)) + { + ThrowComFail(env, "Could not Marshal Dispatch into IStream", hr); + return; + } + // store the stream pointer on the object + jclass argClass = env->GetObjectClass(_this); + jfieldID ajf = env->GetFieldID( argClass, "m_pStream", "I"); + env->SetIntField(_this, ajf, (jint)ps); +} + +JNIEXPORT jobject JNICALL Java_com_jacob_com_DispatchProxy_MarshalFromStream + (JNIEnv *env, jobject _this) +{ + IStream *ps = extractStream(env, _this); + if (!ps) + { + ThrowComFail(env, "Could not get IStream from DispatchProxy", -1); + return NULL; + } + IDispatch *pD; + HRESULT hr = CoGetInterfaceAndReleaseStream(ps, IID_IDispatch, (void **)&pD); + // zero out the stream pointer on the object + // since the stream can only be read once + jclass argClass = env->GetObjectClass(_this); + jfieldID ajf = env->GetFieldID( argClass, "m_pStream", "I"); + env->SetIntField(_this, ajf, (unsigned int)0); + + if (!SUCCEEDED(hr)) + { + ThrowComFail(env, "Could not Marshal Dispatch from IStream", hr); + return NULL; + } + jclass autoClass = env->FindClass("com/jacob/com/Dispatch"); + jmethodID autoCons = env->GetMethodID(autoClass, "", "(I)V"); + // construct a Dispatch object to return + // I am copying the pointer to java + if (pD) pD->AddRef(); + jobject newAuto = env->NewObject(autoClass, autoCons, pD); + return newAuto; +} + +JNIEXPORT void JNICALL Java_com_jacob_com_DispatchProxy_release + (JNIEnv *env, jobject _this) +{ + IStream *ps = extractStream(env, _this); + if (ps) { + ps->Release(); + jclass argClass = env->GetObjectClass(_this); + jfieldID ajf = env->GetFieldID( argClass, "m_pStream", "I"); + env->SetIntField(_this, ajf, (unsigned int)0); + } +} + +} diff --git a/jni/DispatchProxy.h b/jni/DispatchProxy.h index 211b81a..7491791 100644 --- a/jni/DispatchProxy.h +++ b/jni/DispatchProxy.h @@ -1,37 +1,37 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jacob_com_DispatchProxy */ - -#ifndef _Included_com_jacob_com_DispatchProxy -#define _Included_com_jacob_com_DispatchProxy -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jacob_com_DispatchProxy - * Method: MarshalIntoStream - * Signature: (Lcom/jacob/com/Dispatch;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_DispatchProxy_MarshalIntoStream - (JNIEnv *, jobject, jobject); - -/* - * Class: com_jacob_com_DispatchProxy - * Method: MarshalFromStream - * Signature: ()Lcom/jacob/com/Dispatch; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_DispatchProxy_MarshalFromStream - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_DispatchProxy - * Method: release - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_DispatchProxy_release - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_jacob_com_DispatchProxy */ + +#ifndef _Included_com_jacob_com_DispatchProxy +#define _Included_com_jacob_com_DispatchProxy +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_jacob_com_DispatchProxy + * Method: MarshalIntoStream + * Signature: (Lcom/jacob/com/Dispatch;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_DispatchProxy_MarshalIntoStream + (JNIEnv *, jobject, jobject); + +/* + * Class: com_jacob_com_DispatchProxy + * Method: MarshalFromStream + * Signature: ()Lcom/jacob/com/Dispatch; + */ +JNIEXPORT jobject JNICALL Java_com_jacob_com_DispatchProxy_MarshalFromStream + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_DispatchProxy + * Method: release + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_DispatchProxy_release + (JNIEnv *, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/jni/EnumVariant.cpp b/jni/EnumVariant.cpp index 4785214..efe06f4 100644 --- a/jni/EnumVariant.cpp +++ b/jni/EnumVariant.cpp @@ -1,137 +1,137 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Redistributions in any form must be accompanied by information on - * how to obtain complete source code for the JACOB software. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include "stdafx.h" -#include -#include "Dispatch.h" -// Win32 support for Ole Automation -#include -#include -#include -#include -#include -#include "util.h" - -/** - * An implementation of IEnumVariant based on code submitted by - * Thomas Hallgren (mailto:Thomas.Hallgren@eoncompany.com) - */ -extern "C" -{ - -// extract a IDispatch from a jobject -IEnumVARIANT* extractEnumVariant(JNIEnv* env, jobject arg) -{ - jfieldID FID_pIEnumVARIANT = 0; - jclass clazz = env->GetObjectClass(arg); - FID_pIEnumVARIANT = env->GetFieldID(clazz, "m_pIEnumVARIANT", "I"); - return (IEnumVARIANT*)env->GetIntField(arg, FID_pIEnumVARIANT); -} - -JNIEXPORT jint JNICALL -Java_com_jacob_com_EnumVariant_Next(JNIEnv* env, jobject _this, jobjectArray vars) -{ - IEnumVARIANT* self = extractEnumVariant(env, _this); - printf("self=%x\n", self); - if(self == NULL) - return 0; - - ULONG count = (ULONG)env->GetArrayLength(vars); - if(count == 0) - return 0; - - VARIANT* sink = (VARIANT*)CoTaskMemAlloc(count * sizeof(VARIANT)); - ULONG fetchCount = 0; - - HRESULT hr = self->Next(count, sink, &fetchCount); - if(FAILED(hr)) - { - CoTaskMemFree(sink); - ThrowComFail(env, "IEnumVARIANT::Next", hr); - return 0; - } - - // prepare a new return value array - // - jclass clazz = env->FindClass("com/jacob/com/Variant"); - jmethodID ctor = env->GetMethodID(clazz, "", "()V"); - - for(ULONG idx = 0; idx < fetchCount; ++idx) - { - // construct a variant to return - // - jobject newVariant = env->NewObject(clazz, ctor); - VARIANT* v = extractVariant(env, newVariant); - VariantCopy(v, sink + idx); - env->SetObjectArrayElement(vars, idx, newVariant); - env->DeleteLocalRef(newVariant); - } - CoTaskMemFree(sink); - return (jint)fetchCount; -} - -JNIEXPORT void JNICALL -Java_com_jacob_com_EnumVariant_release(JNIEnv* env, jobject _this) -{ - IEnumVARIANT* self = extractEnumVariant(env, _this); - if(self != NULL) - { - self->Release(); - jfieldID FID_pIEnumVARIANT = 0; - jclass clazz = env->GetObjectClass(_this); - FID_pIEnumVARIANT = env->GetFieldID(clazz, "m_pIEnumVARIANT", "I"); - env->SetIntField(_this, FID_pIEnumVARIANT, (unsigned int)0); - } -} - -JNIEXPORT void JNICALL -Java_com_jacob_com_EnumVariant_Reset(JNIEnv* env, jobject _this) -{ - IEnumVARIANT* self = extractEnumVariant(env, _this); - if(self == NULL) - return; - - HRESULT hr = self->Reset(); - if(FAILED(hr)) - ThrowComFail(env, "IEnumVARIANT::Reset", hr); -} - -JNIEXPORT void JNICALL -Java_com_jacob_com_EnumVariant_Skip(JNIEnv* env, jobject _this, jint count) -{ - IEnumVARIANT* self = extractEnumVariant(env, _this); - if(self == NULL) - return; - - HRESULT hr = self->Skip((ULONG)count); - if(FAILED(hr)) - ThrowComFail(env, "IEnumVARIANT::Skip", hr); -} - -} +/* + * Copyright (c) 1999-2004 Sourceforge JACOB Project. + * All rights reserved. Originator: Dan Adler (http://danadler.com). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Redistributions in any form must be accompanied by information on + * how to obtain complete source code for the JACOB software. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "stdafx.h" +#include +#include "Dispatch.h" +// Win32 support for Ole Automation +#include +#include +#include +#include +#include +#include "util.h" + +/** + * An implementation of IEnumVariant based on code submitted by + * Thomas Hallgren (mailto:Thomas.Hallgren@eoncompany.com) + */ +extern "C" +{ + +// extract a IDispatch from a jobject +IEnumVARIANT* extractEnumVariant(JNIEnv* env, jobject arg) +{ + jfieldID FID_pIEnumVARIANT = 0; + jclass clazz = env->GetObjectClass(arg); + FID_pIEnumVARIANT = env->GetFieldID(clazz, "m_pIEnumVARIANT", "I"); + return (IEnumVARIANT*)env->GetIntField(arg, FID_pIEnumVARIANT); +} + +JNIEXPORT jint JNICALL +Java_com_jacob_com_EnumVariant_Next(JNIEnv* env, jobject _this, jobjectArray vars) +{ + IEnumVARIANT* self = extractEnumVariant(env, _this); + printf("self=%x\n", self); + if(self == NULL) + return 0; + + ULONG count = (ULONG)env->GetArrayLength(vars); + if(count == 0) + return 0; + + VARIANT* sink = (VARIANT*)CoTaskMemAlloc(count * sizeof(VARIANT)); + ULONG fetchCount = 0; + + HRESULT hr = self->Next(count, sink, &fetchCount); + if(FAILED(hr)) + { + CoTaskMemFree(sink); + ThrowComFail(env, "IEnumVARIANT::Next", hr); + return 0; + } + + // prepare a new return value array + // + jclass clazz = env->FindClass("com/jacob/com/Variant"); + jmethodID ctor = env->GetMethodID(clazz, "", "()V"); + + for(ULONG idx = 0; idx < fetchCount; ++idx) + { + // construct a variant to return + // + jobject newVariant = env->NewObject(clazz, ctor); + VARIANT* v = extractVariant(env, newVariant); + VariantCopy(v, sink + idx); + env->SetObjectArrayElement(vars, idx, newVariant); + env->DeleteLocalRef(newVariant); + } + CoTaskMemFree(sink); + return (jint)fetchCount; +} + +JNIEXPORT void JNICALL +Java_com_jacob_com_EnumVariant_release(JNIEnv* env, jobject _this) +{ + IEnumVARIANT* self = extractEnumVariant(env, _this); + if(self != NULL) + { + self->Release(); + jfieldID FID_pIEnumVARIANT = 0; + jclass clazz = env->GetObjectClass(_this); + FID_pIEnumVARIANT = env->GetFieldID(clazz, "m_pIEnumVARIANT", "I"); + env->SetIntField(_this, FID_pIEnumVARIANT, (unsigned int)0); + } +} + +JNIEXPORT void JNICALL +Java_com_jacob_com_EnumVariant_Reset(JNIEnv* env, jobject _this) +{ + IEnumVARIANT* self = extractEnumVariant(env, _this); + if(self == NULL) + return; + + HRESULT hr = self->Reset(); + if(FAILED(hr)) + ThrowComFail(env, "IEnumVARIANT::Reset", hr); +} + +JNIEXPORT void JNICALL +Java_com_jacob_com_EnumVariant_Skip(JNIEnv* env, jobject _this, jint count) +{ + IEnumVARIANT* self = extractEnumVariant(env, _this); + if(self == NULL) + return; + + HRESULT hr = self->Skip((ULONG)count); + if(FAILED(hr)) + ThrowComFail(env, "IEnumVARIANT::Skip", hr); +} + +} diff --git a/jni/EnumVariant.h b/jni/EnumVariant.h index 902c453..4f6584c 100644 --- a/jni/EnumVariant.h +++ b/jni/EnumVariant.h @@ -1,46 +1,46 @@ -/* Header for class EnumVariant - */ -#ifndef _Included_EnumVariant -#define _Included_EnumVariant - -#include - -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jacob_com_EnumVariant - * Method: Next - * Signature: ([Lcom/jacob/com/Variant;)I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_EnumVariant_Next - (JNIEnv *, jobject, jobjectArray); - -/* - * Class: com_jacob_com_EnumVariant - * Method: Release - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_EnumVariant_release - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_EnumVariant - * Method: Reset - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_EnumVariant_Reset - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_EnumVariant - * Method: Skip - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_EnumVariant_Skip - (JNIEnv *, jobject, jint); - -#ifdef __cplusplus -} -#endif -#endif +/* Header for class EnumVariant + */ +#ifndef _Included_EnumVariant +#define _Included_EnumVariant + +#include + +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_jacob_com_EnumVariant + * Method: Next + * Signature: ([Lcom/jacob/com/Variant;)I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_EnumVariant_Next + (JNIEnv *, jobject, jobjectArray); + +/* + * Class: com_jacob_com_EnumVariant + * Method: Release + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_EnumVariant_release + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_EnumVariant + * Method: Reset + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_EnumVariant_Reset + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_EnumVariant + * Method: Skip + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_EnumVariant_Skip + (JNIEnv *, jobject, jint); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/jni/EventProxy.cpp b/jni/EventProxy.cpp index b011d3b..7bcbb92 100644 --- a/jni/EventProxy.cpp +++ b/jni/EventProxy.cpp @@ -1,163 +1,163 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Redistributions in any form must be accompanied by information on - * how to obtain complete source code for the JACOB software. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include "EventProxy.h" - -// hook myself up as a listener for delegate -EventProxy::EventProxy(JNIEnv *env, jobject aSinkObj, - CComPtr pConn, - IID eid, CComBSTR mName[], DISPID mID[], int mNum) : - m_cRef(0), pCP(pConn), - eventIID(eid), MethNum(mNum), MethName(mName), - MethID(mID), JMethID(NULL), javaSinkClass(NULL) -{ - javaSinkObj = env->NewGlobalRef(aSinkObj); - // we need this to attach to the event invocation thread - env->GetJavaVM(&jvm); - AddRef(); - HRESULT hr = pCP->Advise(this, &dwEventCookie); - if (SUCCEEDED(hr)) { - // create a mapping from the DISPID's to jmethodID's by using - // the method names I extracted from the classinfo - JMethID = new jmethodID[MethNum]; - javaSinkClass = env->GetObjectClass(javaSinkObj); - const char *method; - for(int i=0;iGetMethodID(javaSinkClass, method, "([Lcom/jacob/com/Variant;)V"); - // need to clear exceptions because GetMethodID above may fail - // if the user didn't implement all the methods - env->ExceptionClear(); - } - } else { - ThrowComFail(env, "Advise failed", hr); - } -} - -// unhook myself up as a listener and get rid of delegate -EventProxy::~EventProxy() -{ - pCP->Unadvise(dwEventCookie); - JNIEnv *env; - // attach to the current running thread - jvm->AttachCurrentThread((void **)&env, jvm); - - env->DeleteGlobalRef(javaSinkObj); - if (MethNum) { - delete [] MethName; - delete [] MethID; - if (JMethID) delete [] JMethID; - } - // detach from thread - jvm->DetachCurrentThread(); -} - -// I only support the eventIID interface which was passed in -// by the DispatchEvent wrapper who looked it up as the -// source object's default source interface -STDMETHODIMP EventProxy::QueryInterface(REFIID rid, void **ppv) -{ - if (rid == IID_IUnknown || rid == eventIID || rid == IID_IDispatch) - { - *ppv = this; - AddRef(); - return S_OK; - } - return E_NOINTERFACE; -} - -// This should never get called - the event source fires events -// by dispid's, not by name -STDMETHODIMP EventProxy::GetIDsOfNames(REFIID riid, - OLECHAR **rgszNames, UINT cNames, LCID lcid, DISPID *rgDispID) -{ - return E_UNEXPECTED; -} - -// The actual callback from the connection point arrives here -STDMETHODIMP EventProxy::Invoke(DISPID dispID, REFIID riid, - LCID lcid, unsigned short wFlags, DISPPARAMS *pDispParams, - VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) -{ - HRESULT hr; - jmethodID meth = 0; - JNIEnv *env = NULL; - - - // map dispID to jmethodID - for(int i=0;iAttachCurrentThread((void**)&env, jvm); - - // how many params - int num = pDispParams->cArgs; - // get variant class - jclass vClass = env->FindClass("com/jacob/com/Variant"); - // and the constructor - jmethodID vCons = env->GetMethodID(vClass, "", "()V"); - // make an array of them - jobjectArray varr = env->NewObjectArray(num, vClass, 0); - int i,j; - for(i=num-1,j=0;i>=0;i--,j++) - { - // construct a java variant holder - jobject arg = env->NewObject(vClass, vCons); - // get the empty variant from it - VARIANT *va = extractVariant(env, arg); - // copy the value - VariantCopy(va, &pDispParams->rgvarg[i]); - // put it in the array - env->SetObjectArrayElement(varr, j, arg); - env->DeleteLocalRef(arg); - } - // call the method - env->CallVoidMethod(javaSinkObj, meth, varr); - - // detach from thread - jvm->DetachCurrentThread(); - return S_OK; - } - return E_NOINTERFACE; -} +/* + * Copyright (c) 1999-2004 Sourceforge JACOB Project. + * All rights reserved. Originator: Dan Adler (http://danadler.com). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Redistributions in any form must be accompanied by information on + * how to obtain complete source code for the JACOB software. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "EventProxy.h" + +// hook myself up as a listener for delegate +EventProxy::EventProxy(JNIEnv *env, jobject aSinkObj, + CComPtr pConn, + IID eid, CComBSTR mName[], DISPID mID[], int mNum) : + m_cRef(0), pCP(pConn), + eventIID(eid), MethNum(mNum), MethName(mName), + MethID(mID), JMethID(NULL), javaSinkClass(NULL) +{ + javaSinkObj = env->NewGlobalRef(aSinkObj); + // we need this to attach to the event invocation thread + env->GetJavaVM(&jvm); + AddRef(); + HRESULT hr = pCP->Advise(this, &dwEventCookie); + if (SUCCEEDED(hr)) { + // create a mapping from the DISPID's to jmethodID's by using + // the method names I extracted from the classinfo + JMethID = new jmethodID[MethNum]; + javaSinkClass = env->GetObjectClass(javaSinkObj); + const char *method; + for(int i=0;iGetMethodID(javaSinkClass, method, "([Lcom/jacob/com/Variant;)V"); + // need to clear exceptions because GetMethodID above may fail + // if the user didn't implement all the methods + env->ExceptionClear(); + } + } else { + ThrowComFail(env, "Advise failed", hr); + } +} + +// unhook myself up as a listener and get rid of delegate +EventProxy::~EventProxy() +{ + pCP->Unadvise(dwEventCookie); + JNIEnv *env; + // attach to the current running thread + jvm->AttachCurrentThread((void **)&env, jvm); + + env->DeleteGlobalRef(javaSinkObj); + if (MethNum) { + delete [] MethName; + delete [] MethID; + if (JMethID) delete [] JMethID; + } + // detach from thread + jvm->DetachCurrentThread(); +} + +// I only support the eventIID interface which was passed in +// by the DispatchEvent wrapper who looked it up as the +// source object's default source interface +STDMETHODIMP EventProxy::QueryInterface(REFIID rid, void **ppv) +{ + if (rid == IID_IUnknown || rid == eventIID || rid == IID_IDispatch) + { + *ppv = this; + AddRef(); + return S_OK; + } + return E_NOINTERFACE; +} + +// This should never get called - the event source fires events +// by dispid's, not by name +STDMETHODIMP EventProxy::GetIDsOfNames(REFIID riid, + OLECHAR **rgszNames, UINT cNames, LCID lcid, DISPID *rgDispID) +{ + return E_UNEXPECTED; +} + +// The actual callback from the connection point arrives here +STDMETHODIMP EventProxy::Invoke(DISPID dispID, REFIID riid, + LCID lcid, unsigned short wFlags, DISPPARAMS *pDispParams, + VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + HRESULT hr; + jmethodID meth = 0; + JNIEnv *env = NULL; + + + // map dispID to jmethodID + for(int i=0;iAttachCurrentThread((void**)&env, jvm); + + // how many params + int num = pDispParams->cArgs; + // get variant class + jclass vClass = env->FindClass("com/jacob/com/Variant"); + // and the constructor + jmethodID vCons = env->GetMethodID(vClass, "", "()V"); + // make an array of them + jobjectArray varr = env->NewObjectArray(num, vClass, 0); + int i,j; + for(i=num-1,j=0;i>=0;i--,j++) + { + // construct a java variant holder + jobject arg = env->NewObject(vClass, vCons); + // get the empty variant from it + VARIANT *va = extractVariant(env, arg); + // copy the value + VariantCopy(va, &pDispParams->rgvarg[i]); + // put it in the array + env->SetObjectArrayElement(varr, j, arg); + env->DeleteLocalRef(arg); + } + // call the method + env->CallVoidMethod(javaSinkObj, meth, varr); + + // detach from thread + jvm->DetachCurrentThread(); + return S_OK; + } + return E_NOINTERFACE; +} diff --git a/jni/EventProxy.h b/jni/EventProxy.h index 12b44b3..ee419e6 100644 --- a/jni/EventProxy.h +++ b/jni/EventProxy.h @@ -1,107 +1,107 @@ -/* - * Copyright (c) 1999 Dan Adler, 315 E72 St. NY, NY, 10021, USA. - * mailto:danadler@rcn.com. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Redistributions in any form must be accompanied by information on - * how to obtain complete source code for the JACOB software. - * - * Redistribution of the JACOB software is not permitted as part of any - * commercial product that is targeted primarily at Java developers. - * Such products include, but are not limited to: Java virtual machines, - * integrated development environments, code libraries, and application - * server products. Licensing terms for such distribution may be - * obtained from the copyright holder. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE - * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -#include -#include -#include -#include -#include -#include "stdafx.h" -#include "util.h" - -/* - * An instance of this class stands between a connection point - * and a java object. When it gets invoked from the cp, it reflects - * the call into the java object dynamically. The eventIID is passed - * in as are the valid dispids and the corresponding names. A map - * is created between the dispids and the java object's method in - * the constructor. For now, all the java event methods have to have - * the same signature: (Variant[]) - */ -class EventProxy : public IDispatch -{ -private: - LONG m_cRef; - CComPtr pCP; // the connection point - DWORD dwEventCookie; // connection point cookie - jobject javaSinkObj; // the java object to delegate calls - jclass javaSinkClass; // the java class of the object - IID eventIID; // the interface iid passed in - int MethNum; - CComBSTR *MethName; // Array of method names - DISPID *MethID; // Array of method ids - jmethodID *JMethID; // Array of java method ids - JavaVM *jvm; // The java vm we are running -public: - // constuct with a global JNI ref to a sink object - // to which we will delegate event callbacks - EventProxy(JNIEnv *jenv, jobject aSinkObj, - CComPtr pConn, - IID eventIID, CComBSTR *mName, DISPID *mID, int mNum); - ~EventProxy(); - - // IUnknown methods - STDMETHODIMP_(ULONG) AddRef(void) - { - return InterlockedIncrement(&m_cRef); - } - - STDMETHODIMP_(ULONG) Release(void) - { - LONG res = InterlockedDecrement(&m_cRef); - if (res == 0) delete this; - return res; - } - - STDMETHODIMP QueryInterface(REFIID rid, void **ppv); - - // IDispatch methods - STDMETHODIMP GetTypeInfoCount(UINT *num) - { - *num = 0; - return S_OK; - } - - STDMETHODIMP GetTypeInfo(UINT, LCID, ITypeInfo **pptInfo) - { - *pptInfo=NULL; - return E_NOTIMPL; - } - - // These are the actual supported methods - STDMETHODIMP GetIDsOfNames(REFIID, OLECHAR **, UINT, LCID , DISPID *); - STDMETHODIMP Invoke(DISPID, REFIID, LCID, WORD , DISPPARAMS *, VARIANT *, EXCEPINFO *, UINT *); -}; +/* + * Copyright (c) 1999 Dan Adler, 315 E72 St. NY, NY, 10021, USA. + * mailto:danadler@rcn.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Redistributions in any form must be accompanied by information on + * how to obtain complete source code for the JACOB software. + * + * Redistribution of the JACOB software is not permitted as part of any + * commercial product that is targeted primarily at Java developers. + * Such products include, but are not limited to: Java virtual machines, + * integrated development environments, code libraries, and application + * server products. Licensing terms for such distribution may be + * obtained from the copyright holder. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#include +#include +#include +#include "stdafx.h" +#include "util.h" + +/* + * An instance of this class stands between a connection point + * and a java object. When it gets invoked from the cp, it reflects + * the call into the java object dynamically. The eventIID is passed + * in as are the valid dispids and the corresponding names. A map + * is created between the dispids and the java object's method in + * the constructor. For now, all the java event methods have to have + * the same signature: (Variant[]) + */ +class EventProxy : public IDispatch +{ +private: + LONG m_cRef; + CComPtr pCP; // the connection point + DWORD dwEventCookie; // connection point cookie + jobject javaSinkObj; // the java object to delegate calls + jclass javaSinkClass; // the java class of the object + IID eventIID; // the interface iid passed in + int MethNum; + CComBSTR *MethName; // Array of method names + DISPID *MethID; // Array of method ids + jmethodID *JMethID; // Array of java method ids + JavaVM *jvm; // The java vm we are running +public: + // constuct with a global JNI ref to a sink object + // to which we will delegate event callbacks + EventProxy(JNIEnv *jenv, jobject aSinkObj, + CComPtr pConn, + IID eventIID, CComBSTR *mName, DISPID *mID, int mNum); + ~EventProxy(); + + // IUnknown methods + STDMETHODIMP_(ULONG) AddRef(void) + { + return InterlockedIncrement(&m_cRef); + } + + STDMETHODIMP_(ULONG) Release(void) + { + LONG res = InterlockedDecrement(&m_cRef); + if (res == 0) delete this; + return res; + } + + STDMETHODIMP QueryInterface(REFIID rid, void **ppv); + + // IDispatch methods + STDMETHODIMP GetTypeInfoCount(UINT *num) + { + *num = 0; + return S_OK; + } + + STDMETHODIMP GetTypeInfo(UINT, LCID, ITypeInfo **pptInfo) + { + *pptInfo=NULL; + return E_NOTIMPL; + } + + // These are the actual supported methods + STDMETHODIMP GetIDsOfNames(REFIID, OLECHAR **, UINT, LCID , DISPID *); + STDMETHODIMP Invoke(DISPID, REFIID, LCID, WORD , DISPPARAMS *, VARIANT *, EXCEPINFO *, UINT *); +}; diff --git a/jni/STA.cpp b/jni/STA.cpp index 37bdab3..3dd7fea 100644 --- a/jni/STA.cpp +++ b/jni/STA.cpp @@ -1,73 +1,73 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Redistributions in any form must be accompanied by information on - * how to obtain complete source code for the JACOB software. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include "stdafx.h" -#include -#include "ComThread.h" -// Win32 support for Ole Automation -#include -#include -#include -#include -#include -#include "util.h" - -extern "C" -{ - -JNIEXPORT void JNICALL Java_com_jacob_com_STA_doMessagePump - (JNIEnv *env, jobject obj) -{ - // store the current thread id so we can kill it - jclass argClass = env->GetObjectClass(obj); - jfieldID ajf = env->GetFieldID( argClass, "threadID", "I"); - jint threadID = (jint)GetCurrentThreadId(); - env->SetIntField(obj, ajf, threadID); - - MSG msg; - - ZeroMemory(&msg, sizeof(msg)); - msg.wParam = S_OK; - - while (GetMessage(&msg, NULL, 0, 0)) - { - DispatchMessage(&msg); - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_STA_quitMessagePump - (JNIEnv *env, jobject obj) -{ - jclass argClass = env->GetObjectClass(obj); - jfieldID ajf = env->GetFieldID( argClass, "threadID", "I"); - jint threadID = env->GetIntField(obj, ajf); - PostThreadMessage((DWORD)threadID, WM_QUIT, 0, 0); -} - -} +/* + * Copyright (c) 1999-2004 Sourceforge JACOB Project. + * All rights reserved. Originator: Dan Adler (http://danadler.com). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Redistributions in any form must be accompanied by information on + * how to obtain complete source code for the JACOB software. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "stdafx.h" +#include +#include "ComThread.h" +// Win32 support for Ole Automation +#include +#include +#include +#include +#include +#include "util.h" + +extern "C" +{ + +JNIEXPORT void JNICALL Java_com_jacob_com_STA_doMessagePump + (JNIEnv *env, jobject obj) +{ + // store the current thread id so we can kill it + jclass argClass = env->GetObjectClass(obj); + jfieldID ajf = env->GetFieldID( argClass, "threadID", "I"); + jint threadID = (jint)GetCurrentThreadId(); + env->SetIntField(obj, ajf, threadID); + + MSG msg; + + ZeroMemory(&msg, sizeof(msg)); + msg.wParam = S_OK; + + while (GetMessage(&msg, NULL, 0, 0)) + { + DispatchMessage(&msg); + } +} + +JNIEXPORT void JNICALL Java_com_jacob_com_STA_quitMessagePump + (JNIEnv *env, jobject obj) +{ + jclass argClass = env->GetObjectClass(obj); + jfieldID ajf = env->GetFieldID( argClass, "threadID", "I"); + jint threadID = env->GetIntField(obj, ajf); + PostThreadMessage((DWORD)threadID, WM_QUIT, 0, 0); +} + +} diff --git a/jni/STA.h b/jni/STA.h index 463cd13..b2e18c9 100644 --- a/jni/STA.h +++ b/jni/STA.h @@ -1,29 +1,29 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class STA */ - -#ifndef _Included_com_jacob_com_STA -#define _Included_com_jacob_com_STA -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jacob_com_STA - * Method: doMessagePump - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_STA_doMessagePump - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_STA - * Method: quitMessagePump - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_STA_quitMessagePump - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class STA */ + +#ifndef _Included_com_jacob_com_STA +#define _Included_com_jacob_com_STA +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_jacob_com_STA + * Method: doMessagePump + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_STA_doMessagePump + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_STA + * Method: quitMessagePump + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_STA_quitMessagePump + (JNIEnv *, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/jni/SafeArray.cpp b/jni/SafeArray.cpp index d6839a7..cea8516 100644 --- a/jni/SafeArray.cpp +++ b/jni/SafeArray.cpp @@ -1,2438 +1,2438 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Redistributions in any form must be accompanied by information on - * how to obtain complete source code for the JACOB software. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include "SafeArray.h" -// Win32 support for Ole Automation -#include -#include -#include -#include -#include -#include -#include "util.h" - -extern "C" -{ - -#define V_FLD "m_pV" - -static SAFEARRAY *makeArray(int vt, int nDims, long *lb, long *cel) -{ - if (nDims == 1) { - // no need to alloc - SAFEARRAYBOUND sab; - sab.lLbound = lb[0]; - sab.cElements = cel[0]; - SAFEARRAY *sa = SafeArrayCreate(vt,1,&sab); - return sa; - } else { - SAFEARRAYBOUND* rgsaBounds = new SAFEARRAYBOUND[nDims]; - for(int i=0;iGetObjectClass(arg); - jfieldID vf = env->GetFieldID( argClass, V_FLD, "I"); - jint vnum = env->GetIntField(arg, vf); - if (vnum != NULL) - { - // if vnum is not NULL, then there is a Variant wrapper present - VARIANT *v = (VARIANT *)vnum; - return v; - } - return NULL; -} - -// extract a SAFEARRAY from a SafeArray object -SAFEARRAY *extractSA(JNIEnv *env, jobject arg) -{ - VARIANT *v = extractWrapper(env, arg); - if (v != NULL) - { - SAFEARRAY *sa = V_ARRAY(v); - return sa; - } - return NULL; -} - -// deep copy a SAFEARRAY -SAFEARRAY *copySA(SAFEARRAY *psa) -{ - // easiest way to make a deep copy is to use VariantCopy - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - VARIANT v1, v2; - - VariantClear(&v1); - VariantClear(&v2); - V_VT(&v1) = VT_ARRAY | vt; - V_ARRAY(&v1) = psa; - VariantCopy(&v2, &v1); - SAFEARRAY *sa = V_ARRAY(&v2); - VariantInit(&v2); // make sure it's not owned by this variant - return sa; -} - -// create a VARIANT wrapper for the safearray -void setSA(JNIEnv *env, jobject arg, SAFEARRAY *sa, int copy) -{ - // construct a variant to hold the result - // the variant then owns the array - jclass argClass = env->GetObjectClass(arg); - jfieldID ajf = env->GetFieldID( argClass, V_FLD, "I"); - jint vnum = env->GetIntField(arg, ajf); - VARIANT *v = (VARIANT *)vnum; - if (v == NULL) - { - v = new VARIANT(); - VariantInit(v); - } - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - V_VT(v) = VT_ARRAY | vt; - V_ARRAY(v) = copy ? copySA(sa) : sa; - env->SetIntField(arg, ajf, (unsigned int)v); -} - -/* - * Class: SafeArray - * Method: init - * Signature: (I[I[I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_init - (JNIEnv *env, jobject _this, jint vt, jintArray lb, jintArray cel) -{ - jint *lbounds = env->GetIntArrayElements(lb, NULL); - jint *celems = env->GetIntArrayElements(cel, NULL); - int nDims = env->GetArrayLength(lb); - // array lengths must match - if (nDims != env->GetArrayLength(cel)) return; - // build the sa according to params - if ( nDims > 0 ) - { - SAFEARRAY *sa = makeArray(vt, nDims, lbounds, celems); - env->ReleaseIntArrayElements(lb, lbounds, 0); - env->ReleaseIntArrayElements(cel, celems, 0); - jclass clazz = env->GetObjectClass(_this); - setSA(env, _this, sa, 0); - } -} - -/* - * Class: SafeArray - * Method: clone - * Signature: ()Ljava/lang/Object; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_SafeArray_clone - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (psa) - { - // prepare a new return value - jclass saClass = env->GetObjectClass(_this); - jmethodID saCons = env->GetMethodID(saClass, "", "()V"); - // construct an SA to return - jobject newSA = env->NewObject(saClass, saCons); - // wrap in a Variant - setSA(env, newSA, psa, 1); - return newSA; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: destroy - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_destroy - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractWrapper(env, _this); - if (v) { - // this is the case where a Variant wrapper exists, in that - // case free the variant, but if there is just a raw SA, then - // the owning variant will free it - jclass saClass = env->GetObjectClass(_this); - jfieldID jf = env->GetFieldID(saClass, V_FLD, "I"); - VariantClear(v); - delete v; - env->SetIntField(_this, jf, (unsigned int)0); - } -} - -/* - * Class: SafeArray - * Method: getvt - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getvt - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (psa) { - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - return (jint)vt; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: reinit - * Signature: (LSafeArray;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_reinit - (JNIEnv *env, jobject _this, jobject sa) -{ - // what to do here? -} - -/* - * Class: SafeArray - * Method: reinterpretType - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_reinterpretType - (JNIEnv *env, jobject _this, jint vt) -{ -} - -/* - * Class: SafeArray - * Method: getLBound - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getLBound__ - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (psa) { - jint lb; - SafeArrayGetLBound(psa, 1, &lb); - return lb; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: getLBound - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getLBound__I - (JNIEnv *env, jobject _this, jint dim) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (psa) { - jint lb; - SafeArrayGetLBound(psa, dim, &lb); - return lb; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: getUBound - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getUBound__ - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (psa) { - jint lb; - SafeArrayGetUBound(psa, 1, &lb); - return lb; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: getUBound - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getUBound__I - (JNIEnv *env, jobject _this, jint dim) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (psa) { - jint lb; - SafeArrayGetUBound(psa, dim, &lb); - return lb; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: getNumDim - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getNumDim - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (psa) { - return SafeArrayGetDim(psa); - } - return NULL; -} - -/* - * Class: SafeArray - * Method: getFeatures - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getFeatures - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (psa) { - SafeArrayLock(psa); - jint features = psa->fFeatures; - SafeArrayUnlock(psa); - return features; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: getElemSize - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getElemSize - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (psa) { - jint siz = SafeArrayGetElemsize(psa); - return siz; - } - return NULL; -} - -static int numElements(SAFEARRAY *psa) -{ - int nDims = SafeArrayGetDim(psa); - int elems = 0; - for(int i=1;i<=nDims;i++) { - long lb, ub; - SafeArrayGetLBound(psa, i, &lb); - SafeArrayGetUBound(psa, i, &ub); - elems += ub - lb + 1; - } - return elems; -} - -/* - * Class: SafeArray - * Method: fromCharArray - * Signature: ([C)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromCharArray - (JNIEnv *env, jobject _this, jcharArray a) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(a); - if (len > numElements(psa)) - { - // max size of memcpy - len = numElements(psa); - } - // get the double array - don't make a copy - jchar *iarr = env->GetCharArrayElements(a, 0); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_UI2; - for(int i=0;iReleaseCharArrayElements(a, iarr, 0); -} - -/* - * Class: SafeArray - * Method: fromIntArray - * Signature: ([I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromIntArray - (JNIEnv *env, jobject _this, jintArray a) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(a); - if (len > numElements(psa)) - { - // max size of memcpy - len = numElements(psa); - } - // get the int array - don't make a copy - jint *iarr = env->GetIntArrayElements(a, 0); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_I4; - for(int i=0;iReleaseIntArrayElements(a, iarr, 0); -} - -/* - * Class: SafeArray - * Method: fromShortArray - * Signature: ([S)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromShortArray - (JNIEnv *env, jobject _this, jshortArray a) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(a); - if (len > numElements(psa)) - { - // max size of memcpy - len = numElements(psa); - } - // get the short array - don't make a copy - jshort *iarr = env->GetShortArrayElements(a, 0); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_I2; - for(int i=0;iReleaseShortArrayElements(a, iarr, 0); -} - -/* - * Class: SafeArray - * Method: fromDoubleArray - * Signature: ([D)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromDoubleArray - (JNIEnv *env, jobject _this, jdoubleArray a) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(a); - if (len > numElements(psa)) - { - // max size of memcpy - len = numElements(psa); - } - // get the double array - don't make a copy - jdouble *iarr = env->GetDoubleArrayElements(a, 0); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_R8; - for(int i=0;iReleaseDoubleArrayElements(a, iarr, 0); -} - -/* - * Class: SafeArray - * Method: fromStringArray - * Signature: ([Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromStringArray - (JNIEnv *env, jobject _this, jobjectArray a) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(a); - if (len > numElements(psa)) - { - // max size of memcpy - len = numElements(psa); - } - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_BSTR; - for(int i=0;iGetObjectArrayElement(a, i); - const char *str = env->GetStringUTFChars(s, NULL); - CComBSTR bs(str); - V_VT(&v) = VT_BSTR; - V_BSTR(&v) = bs.Copy(); - long x = i; - SafeArrayPutElement(psa,&x,&v); - env->ReleaseStringUTFChars(s, str); - VariantClear(&v); - } - } else if (vt == VT_BSTR) { - for(int i=0;iGetObjectArrayElement(a, i); - const char *str = env->GetStringUTFChars(s, NULL); - CComBSTR bs(str); - BSTR bstr = bs.Detach(); - long x = i; - SafeArrayPutElement(psa,&x,bstr); - env->ReleaseStringUTFChars(s, str); - } - } else { - ThrowComFail(env, "safearray cannot be assigned from string\n", 0); - } -} - -/* - * Class: SafeArray - * Method: fromByteArray - * Signature: ([B)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromByteArray - (JNIEnv *env, jobject _this, jbyteArray a) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(a); - if (len > numElements(psa)) - { - // max size of memcpy - len = numElements(psa); - } - // get the byte array - don't make a copy - jbyte *iarr = env->GetByteArrayElements(a, 0); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_UI1; - for(int i=0;iReleaseByteArrayElements(a, iarr, 0); -} - -/* - * Class: SafeArray - * Method: fromFloatArray - * Signature: ([F)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromFloatArray - (JNIEnv *env, jobject _this, jfloatArray a) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(a); - if (len > numElements(psa)) - { - // max size of memcpy - len = numElements(psa); - } - // get the float array - don't make a copy - jfloat *iarr = env->GetFloatArrayElements(a, 0); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_R4; - for(int i=0;iReleaseFloatArrayElements(a, iarr, 0); -} - -/* - * Class: SafeArray - * Method: fromBooleanArray - * Signature: ([Z)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromBooleanArray - (JNIEnv *env, jobject _this, jbooleanArray a) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(a); - if (len > numElements(psa)) - { - // max size of memcpy - len = numElements(psa); - } - // get the boolean array - don't make a copy - jboolean *iarr = env->GetBooleanArrayElements(a, 0); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_BOOL; - for(int i=0;iReleaseBooleanArrayElements(a, iarr, 0); -} - -/* - * Class: SafeArray - * Method: fromVariantArray - * Signature: ([LVariant;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromVariantArray - (JNIEnv *env, jobject _this, jobjectArray a) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(a); - if (len > numElements(psa)) - { - // max size of memcpy - len = numElements(psa); - } - if (vt == VT_VARIANT) { - for(int i=0;iGetObjectArrayElement(a, i); - VARIANT *v = extractVariant(env, var); - long x = i; - if (v) SafeArrayPutElement(psa,&x,v); - } - } else { - ThrowComFail(env, "safearray cannot be assigned from variant", -1); - } -} - -/* - * Class: SafeArray - * Method: toCharArray - * Signature: ()[C - */ -JNIEXPORT jcharArray JNICALL Java_com_jacob_com_SafeArray_toCharArray - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - int num = ub - lb + 1; - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_UI2 || vt == VT_I2) { - jcharArray iarr = env->NewCharArray(num); - void *pData; - SafeArrayAccessData(sa, &pData); - env->SetCharArrayRegion(iarr, 0, num, (jchar *)pData); - SafeArrayUnaccessData(sa); - return iarr; - } else if (vt == VT_VARIANT) { - jcharArray iarr = env->NewCharArray(num); - VARIANT v; - VariantInit(&v); - for(int i=lb;i<=ub;i++) { - long ix = i; - SafeArrayGetElement(sa, &ix, (void*) &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_UI2))) { - return NULL; - } - jchar val = V_UI2(&v); - env->SetCharArrayRegion(iarr, i, 1, &val); - } - return iarr; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: toIntArray - * Signature: ()[I - */ -JNIEXPORT jintArray JNICALL Java_com_jacob_com_SafeArray_toIntArray - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - int num = ub - lb + 1; - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_I4) { - jintArray iarr = env->NewIntArray(num); - void *pData; - SafeArrayAccessData(sa, &pData); - env->SetIntArrayRegion(iarr, 0, num, (jint *)pData); - SafeArrayUnaccessData(sa); - return iarr; - } else if (vt == VT_VARIANT) { - jintArray iarr = env->NewIntArray(num); - VARIANT v; - VariantInit(&v); - for(int i=lb;i<=ub;i++) { - long ix = i; - SafeArrayGetElement(sa, &ix, (void*) &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_I4))) { - return NULL; - } - jint val = V_I4(&v); - env->SetIntArrayRegion(iarr, i, 1, &val); - } - return iarr; - } - return NULL; -} - - -/* - * Class: SafeArray - * Method: toShortArray - * Signature: ()[S - */ -JNIEXPORT jshortArray JNICALL Java_com_jacob_com_SafeArray_toShortArray - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - int num = ub - lb + 1; - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_I2) { - jshortArray iarr = env->NewShortArray(num); - void *pData; - SafeArrayAccessData(sa, &pData); - env->SetShortArrayRegion(iarr, 0, num, (jshort *)pData); - SafeArrayUnaccessData(sa); - return iarr; - } else if (vt == VT_VARIANT) { - jshortArray iarr = env->NewShortArray(num); - VARIANT v; - VariantInit(&v); - for(int i=lb;i<=ub;i++) { - long ix = i; - SafeArrayGetElement(sa, &ix, (void*) &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_I2))) { - return NULL; - } - jshort val = V_I2(&v); - env->SetShortArrayRegion(iarr, i, 1, &val); - } - return iarr; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: toDoubleArray - * Signature: ()[D - */ -JNIEXPORT jdoubleArray JNICALL Java_com_jacob_com_SafeArray_toDoubleArray - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - int num = ub - lb + 1; - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_R8) { - jdoubleArray iarr = env->NewDoubleArray(num); - void *pData; - SafeArrayAccessData(sa, &pData); - env->SetDoubleArrayRegion(iarr, 0, num, (jdouble *)pData); - SafeArrayUnaccessData(sa); - return iarr; - } else if (vt == VT_VARIANT) { - jdoubleArray iarr = env->NewDoubleArray(num); - VARIANT v; - VariantInit(&v); - for(int i=lb;i<=ub;i++) { - long ix = i; - SafeArrayGetElement(sa, &ix, (void*) &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_R8))) { - return NULL; - } - jdouble val = V_R8(&v); - env->SetDoubleArrayRegion(iarr, i, 1, &val); - } - return iarr; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: toStringArray - * Signature: ()[Ljava/lang/String; - */ -JNIEXPORT jobjectArray JNICALL Java_com_jacob_com_SafeArray_toStringArray - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - int num = ub - lb + 1; - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_VARIANT) - { - jclass sClass = env->FindClass("java/lang/String"); - jobjectArray iarr = env->NewObjectArray(num, sClass, NULL); - VARIANT v; - VariantInit(&v); - for(int i=lb;i<=ub;i++) { - long ix = i; - SafeArrayGetElement(sa, &ix, (void*) &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_BSTR))) { - return NULL; - } - BSTR bs = V_BSTR(&v); - jstring js = env->NewString(bs, SysStringLen(bs)); - env->SetObjectArrayElement(iarr, i, js); - } - return iarr; - } else if (vt == VT_BSTR) { - jclass sClass = env->FindClass("java/lang/String"); - jobjectArray iarr = env->NewObjectArray(num, sClass, NULL); - for(int i=lb;i<=ub;i++) { - BSTR bs = NULL; - long ix = i; - SafeArrayGetElement(sa, &ix, (void*) &bs); - jstring js = env->NewString(bs, SysStringLen(bs)); - env->SetObjectArrayElement(iarr, i, js); - } - return iarr; - } - ThrowComFail(env, "safearray cannot be converted to string[]", 0); - return NULL; -} - -/* - * Class: SafeArray - * Method: toByteArray - * Signature: ()[B - */ -JNIEXPORT jbyteArray JNICALL Java_com_jacob_com_SafeArray_toByteArray - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - int num = ub - lb + 1; - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_I1 || vt == VT_UI1) { - jbyteArray iarr = env->NewByteArray(num); - jbyte *pData; - SafeArrayAccessData(sa, (void **)&pData); - env->SetByteArrayRegion(iarr, 0, num, pData); - SafeArrayUnaccessData(sa); - return iarr; - } else if (vt == VT_VARIANT) { - jbyteArray iarr = env->NewByteArray(num); - VARIANT v; - VariantInit(&v); - for(int i=lb,j=0;i<=ub;i++,j++) { - long ix = i; - SafeArrayGetElement(sa, &ix, (void*) &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_UI1))) { - return NULL; - } - jbyte val = V_UI1(&v); - env->SetByteArrayRegion(iarr, j, 1, &val); - } - return iarr; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: toFloatArray - * Signature: ()[F - */ -JNIEXPORT jfloatArray JNICALL Java_com_jacob_com_SafeArray_toFloatArray - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - int num = ub - lb + 1; - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_R4) { - jfloatArray iarr = env->NewFloatArray(num); - void *pData; - SafeArrayAccessData(sa, &pData); - env->SetFloatArrayRegion(iarr, 0, num, (jfloat *)pData); - SafeArrayUnaccessData(sa); - return iarr; - } else if (vt == VT_VARIANT) { - jfloatArray iarr = env->NewFloatArray(num); - VARIANT v; - VariantInit(&v); - for(int i=lb;i<=ub;i++) { - long ix = i; - SafeArrayGetElement(sa, &ix, (void*) &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_R4))) { - return NULL; - } - jfloat val = V_R4(&v); - env->SetFloatArrayRegion(iarr, i, 1, &val); - } - return iarr; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: toBooleanArray - * Signature: ()[Z - */ -JNIEXPORT jbooleanArray JNICALL Java_com_jacob_com_SafeArray_toBooleanArray - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - int num = ub - lb + 1; - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_BOOL) { - // need to loop because jboolean=1 byte and VARIANT_BOOL=2 bytes - jbooleanArray iarr = env->NewBooleanArray(num); - VARIANT_BOOL v; - for(int i=lb,j=0;i<=ub;i++,j++) { - long ix = i; - SafeArrayGetElement(sa, &ix, (void*) &v); - jboolean val = v == VARIANT_TRUE ? JNI_TRUE : JNI_FALSE; - env->SetBooleanArrayRegion(iarr, j, 1, &val); - } - return iarr; - } else if (vt == VT_VARIANT) { - jbooleanArray iarr = env->NewBooleanArray(num); - VARIANT v; - VariantInit(&v); - for(int i=lb;i<=ub;i++) { - long ix = i; - SafeArrayGetElement(sa, &ix, (void*) &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_BOOL))) { - return NULL; - } - jboolean val = V_BOOL(&v) == VARIANT_TRUE ? JNI_TRUE : JNI_FALSE; - env->SetBooleanArrayRegion(iarr, i, 1, &val); - } - return iarr; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: toVariantArray - * Signature: ()[LVariant; - */ -JNIEXPORT jobjectArray JNICALL Java_com_jacob_com_SafeArray_toVariantArray - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - int num = ub - lb + 1; - jclass vClass = env->FindClass("com/jacob/com/Variant"); - // create an array of Variant's - jobjectArray varr = env->NewObjectArray(num, vClass, 0); - // fill them in - jmethodID variantCons = - env->GetMethodID(vClass, "", "()V"); - for(int i=lb;i<=ub;i++) { - long ix = i; - // construct a variant to return - jobject newVariant = env->NewObject(vClass, variantCons); - // get the VARIANT from the newVariant - VARIANT *v = extractVariant(env, newVariant); - SafeArrayGetElement(sa, &ix, (void*) v); - // put in object array - env->SetObjectArrayElement(varr, i, newVariant); - } - return varr; -} - -// this is an ugly way to avoid copy/pasting the same code - -#define GET1DCODE(varType, varAccess, jtyp) \ - SAFEARRAY *sa = extractSA(env, _this); \ - if (!sa) { \ - ThrowComFail(env, "safearray object corrupted", -1); \ - return NULL; \ - } \ - if (SafeArrayGetDim(sa) != 1) { \ - ThrowComFail(env, "safearray is not 1D", -1); \ - return NULL; \ - } \ - VARTYPE vt; \ - SafeArrayGetVartype(sa, &vt); \ - if (vt == VT_VARIANT) { \ - VARIANT v; \ - VariantInit(&v); \ - SafeArrayGetElement(sa, &idx, (void*) &v); \ - if (FAILED(VariantChangeType(&v, &v, 0, varType))) { \ - ThrowComFail(env, "VariantChangeType failed", -1); \ - return NULL; \ - } \ - return (jtyp)varAccess(&v); \ - } else if (vt == varType) { \ - jtyp jc; \ - SafeArrayGetElement(sa, &idx, (void*) &jc); \ - return jc; \ - } else { \ - return NULL; \ - } - -#define GET2DCODE(varType, varAccess, jtyp) \ - SAFEARRAY *sa = extractSA(env, _this); \ - if (!sa) { \ - ThrowComFail(env, "safearray object corrupted", -1); \ - return NULL; \ - } \ - if (SafeArrayGetDim(sa) != 2) { \ - ThrowComFail(env, "safearray is not 2D", -1); \ - return NULL; \ - } \ - long idx[2] = {i, j}; \ - VARTYPE vt; \ - SafeArrayGetVartype(sa, &vt); \ - if (vt == VT_VARIANT) { \ - VARIANT v; \ - VariantInit(&v); \ - SafeArrayGetElement(sa, idx, (void*) &v); \ - if (FAILED(VariantChangeType(&v, &v, 0, varType))) { \ - ThrowComFail(env, "VariantChangeType failed", -1); \ - return NULL; \ - } \ - return (jtyp)varAccess(&v); \ - } else if (vt == varType) { \ - jtyp jc; \ - SafeArrayGetElement(sa, idx, (void*) &jc); \ - return jc; \ - } else { \ - return NULL; \ - } - - -#define SET1DCODE(varType, varAccess) \ - SAFEARRAY *sa = extractSA(env, _this); \ - if (!sa) { \ - ThrowComFail(env, "safearray object corrupted", -1); \ - return; \ - } \ - if (SafeArrayGetDim(sa) != 1) { \ - ThrowComFail(env, "safearray is not 1D", -1); \ - return; \ - } \ - VARTYPE vt; \ - SafeArrayGetVartype(sa, &vt); \ - if (vt == VT_VARIANT) { \ - VARIANT v; \ - VariantInit(&v); \ - V_VT(&v) = varType; \ - varAccess(&v) = c; \ - SafeArrayPutElement(sa,&idx,&v); \ - } else if (vt == varType) { \ - SafeArrayPutElement(sa,&idx,&c); \ - } else { \ - ThrowComFail(env, "safearray type mismatch", -1); \ - } \ - -#define SET2DCODE(varType, varAccess) \ - SAFEARRAY *sa = extractSA(env, _this); \ - if (!sa) { \ - ThrowComFail(env, "safearray object corrupted", -1); \ - return; \ - } \ - if (SafeArrayGetDim(sa) != 2) { \ - ThrowComFail(env, "safearray is not 2D", -1); \ - return; \ - } \ - VARTYPE vt; \ - SafeArrayGetVartype(sa, &vt); \ - long idx[2] = {i,j}; \ - if (vt == VT_VARIANT) { \ - VARIANT v; \ - VariantInit(&v); \ - V_VT(&v) = varType; \ - varAccess(&v) = c; \ - SafeArrayPutElement(sa,idx,&v); \ - } else if (vt == varType) { \ - SafeArrayPutElement(sa,idx,&c); \ - } else { \ - ThrowComFail(env, "safearray type mismatch", -1); \ - } - -#define GETARRAYCODE(varType, varType2, varAccess, jtyp, jsetArr) \ - SAFEARRAY *sa = extractSA(env, _this); \ - if (!sa) { \ - ThrowComFail(env, "safearray object corrupted", -1); \ - return; \ - } \ - VARTYPE vt; \ - SafeArrayGetVartype(sa, &vt); \ - if (vt == varType || vt == varType2) { \ - jtyp *pData; \ - SafeArrayAccessData(sa, (void **)&pData); \ - env->jsetArr(ja, ja_start, nelem, &pData[idx]); \ - SafeArrayUnaccessData(sa); \ - return; \ - } else if (vt == VT_VARIANT) { \ - VARIANT v; \ - VariantInit(&v); \ - for(int i=idx, j=ja_start;ijsetArr(ja, j, 1, &val); \ - } \ - } - -#define SETARRAYCODE(varType, varType2, varAccess, jtyp, jgetArr, jrelArr) \ - SAFEARRAY *psa = extractSA(env, _this); \ - if (!psa) { \ - ThrowComFail(env, "safearray object corrupted", -1); \ - return; \ - } \ - VARTYPE vt; \ - SafeArrayGetVartype(psa, &vt); \ - jtyp *iarr = env->jgetArr(ja, 0); \ - if (vt == VT_VARIANT) { \ - VARIANT v; \ - VariantInit(&v); \ - V_VT(&v) = varType; \ - for(int i=ja_start,j=idx;ijrelArr(ja, iarr, 0); - -/* - * Class: SafeArray - * Method: getChar - * Signature: (I)C - */ -JNIEXPORT jchar JNICALL Java_com_jacob_com_SafeArray_getChar__I - (JNIEnv *env, jobject _this, jint idx) -{ - GET1DCODE(VT_UI2, V_UI2, jchar) -} - -/* - * Class: SafeArray - * Method: getChar - * Signature: (II)C - */ -JNIEXPORT jchar JNICALL Java_com_jacob_com_SafeArray_getChar__II - (JNIEnv *env, jobject _this, jint i, jint j) -{ - GET2DCODE(VT_UI2, V_UI2, jchar) -} - - -/* - * Class: SafeArray - * Method: setChar - * Signature: (IC)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setChar__IC - (JNIEnv *env, jobject _this, jint idx, jchar c) -{ - SET1DCODE(VT_UI2, V_UI2); -} - -/* - * Class: SafeArray - * Method: setChar - * Signature: (IIC)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setChar__IIC - (JNIEnv *env, jobject _this, jint i, jint j, jchar c) -{ - SET2DCODE(VT_UI2, V_UI2); -} - -/* - * Class: SafeArray - * Method: getChars - * Signature: (II[CI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getChars - (JNIEnv *env, jobject _this, jint idx, jint nelem, jcharArray ja, jint ja_start) -{ - GETARRAYCODE(VT_UI2, VT_I2, V_UI2, jchar, SetCharArrayRegion); -} - -/* - * Class: SafeArray - * Method: setChars - * Signature: (II[CI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setChars - (JNIEnv *env, jobject _this, jint idx, jint nelem, jcharArray ja, jint ja_start) -{ - SETARRAYCODE(VT_UI2, VT_I2, V_UI2, jchar, - GetCharArrayElements, ReleaseCharArrayElements); -} - -/* - * Class: SafeArray - * Method: getInt - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getInt__I - (JNIEnv *env, jobject _this, jint idx) -{ - GET1DCODE(VT_I4, V_I4, jint) -} - -/* - * Class: SafeArray - * Method: getInt - * Signature: (II)I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getInt__II - (JNIEnv *env, jobject _this, jint i, jint j) -{ - GET2DCODE(VT_I4, V_I4, jint) -} - -/* - * Class: SafeArray - * Method: setInt - * Signature: (II)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setInt__II - (JNIEnv *env, jobject _this, jint idx, jint c) -{ - SET1DCODE(VT_I4, V_I4); -} - -/* - * Class: SafeArray - * Method: setInt - * Signature: (III)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setInt__III - (JNIEnv *env, jobject _this, jint i, jint j, jint c) -{ - SET2DCODE(VT_I4, V_I4); -} - -/* - * Class: SafeArray - * Method: getInts - * Signature: (II[II)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getInts - (JNIEnv *env, jobject _this, jint idx, jint nelem, jintArray ja, jint ja_start) -{ - GETARRAYCODE(VT_I4, VT_I4, V_I4, jint, SetIntArrayRegion); -} - -/* - * Class: SafeArray - * Method: setInts - * Signature: (II[II)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setInts - (JNIEnv *env, jobject _this, jint idx, jint nelem, jintArray ja, jint ja_start) -{ - SETARRAYCODE(VT_I4, VT_I4, V_I4, jint, - GetIntArrayElements, ReleaseIntArrayElements); -} - -/* - * Class: SafeArray - * Method: getShort - * Signature: (I)S - */ -JNIEXPORT jshort JNICALL Java_com_jacob_com_SafeArray_getShort__I - (JNIEnv *env, jobject _this, jint idx) -{ - GET1DCODE(VT_I2, V_I2, jshort) -} - -/* - * Class: SafeArray - * Method: getShort - * Signature: (II)S - */ -JNIEXPORT jshort JNICALL Java_com_jacob_com_SafeArray_getShort__II - (JNIEnv *env, jobject _this, jint i, jint j) -{ - GET2DCODE(VT_I2, V_I2, jshort) -} - -/* - * Class: SafeArray - * Method: setShort - * Signature: (IS)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setShort__IS - (JNIEnv *env, jobject _this, jint idx, jshort c) -{ - SET1DCODE(VT_I2, V_I2); -} - -/* - * Class: SafeArray - * Method: setShort - * Signature: (IIS)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setShort__IIS - (JNIEnv *env, jobject _this, jint i, jint j, jshort c) -{ - SET2DCODE(VT_I2, V_I2); -} - -/* - * Class: SafeArray - * Method: getShorts - * Signature: (II[SI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getShorts - (JNIEnv *env, jobject _this, jint idx, jint nelem, jshortArray ja, jint ja_start) -{ - GETARRAYCODE(VT_I2, VT_I2, V_I2, jshort, SetShortArrayRegion); -} - -/* - * Class: SafeArray - * Method: setShorts - * Signature: (II[SI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setShorts - (JNIEnv *env, jobject _this, jint idx, jint nelem, jshortArray ja, jint ja_start) -{ - SETARRAYCODE(VT_I2, VT_I2, V_I2, jshort, - GetShortArrayElements, ReleaseShortArrayElements); -} - -/* - * Class: SafeArray - * Method: getDouble - * Signature: (I)D - */ -JNIEXPORT jdouble JNICALL Java_com_jacob_com_SafeArray_getDouble__I - (JNIEnv *env, jobject _this, jint idx) -{ - GET1DCODE(VT_R8, V_R8, jdouble) -} - -/* - * Class: SafeArray - * Method: getDouble - * Signature: (II)D - */ -JNIEXPORT jdouble JNICALL Java_com_jacob_com_SafeArray_getDouble__II - (JNIEnv *env, jobject _this, jint i, jint j) -{ - GET2DCODE(VT_R8, V_R8, jdouble) -} - -/* - * Class: SafeArray - * Method: setDouble - * Signature: (ID)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setDouble__ID - (JNIEnv *env, jobject _this, jint idx, jdouble c) -{ - SET1DCODE(VT_R8, V_R8); -} - -/* - * Class: SafeArray - * Method: setDouble - * Signature: (IID)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setDouble__IID - (JNIEnv *env, jobject _this, jint i, jint j, jdouble c) -{ - SET2DCODE(VT_R8, V_R8); -} - -/* - * Class: SafeArray - * Method: getDoubles - * Signature: (II[DI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getDoubles - (JNIEnv *env, jobject _this, jint idx, jint nelem, jdoubleArray ja, jint ja_start) -{ - GETARRAYCODE(VT_R8, VT_R8, V_R8, jdouble, SetDoubleArrayRegion); -} - -/* - * Class: SafeArray - * Method: setDoubles - * Signature: (II[DI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setDoubles - (JNIEnv *env, jobject _this, jint idx, jint nelem, jdoubleArray ja, jint ja_start) -{ - SETARRAYCODE(VT_R8, VT_R8, V_R8, jdouble, - GetDoubleArrayElements, ReleaseDoubleArrayElements); -} - -/* - * Class: SafeArray - * Method: getString - * Signature: (I)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_com_jacob_com_SafeArray_getString__I - (JNIEnv *env, jobject _this, jint idx) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); \ - return NULL; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - SafeArrayGetElement(psa, &idx, &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_BSTR))) { - return NULL; - } - BSTR bs = V_BSTR(&v); - jstring js = env->NewString(bs, SysStringLen(bs)); - return js; - } else if (vt == VT_BSTR) { - BSTR bs = NULL; - SafeArrayGetElement(psa, &idx, &bs); - jstring js = env->NewString(bs, SysStringLen(bs)); - return js; - } - ThrowComFail(env, "safearray cannot get string", 0); - return NULL; -} - -/* - * Class: SafeArray - * Method: getString - * Signature: (II)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_com_jacob_com_SafeArray_getString__II - (JNIEnv *env, jobject _this, jint i, jint j) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); \ - return NULL; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - long idx[2] = {i, j}; - SafeArrayGetElement(psa, idx, &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_BSTR))) { - return NULL; - } - BSTR bs = V_BSTR(&v); - jstring js = env->NewString(bs, SysStringLen(bs)); - return js; - } else if (vt == VT_BSTR) { - long idx[2] = {i, j}; - BSTR bs = NULL; - SafeArrayGetElement(psa, idx, &bs); - jstring js = env->NewString(bs, SysStringLen(bs)); - return js; - } - ThrowComFail(env, "safearray cannot get string", 0); - return NULL; -} - -/* - * Class: SafeArray - * Method: setString - * Signature: (ILjava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setString__ILjava_lang_String_2 - (JNIEnv *env, jobject _this, jint idx, jstring s) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); \ - return; - } - if (SafeArrayGetDim(sa) != 1) { - ThrowComFail(env, "safearray not 1D", -1); \ - return; - } - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - const char *str = env->GetStringUTFChars(s, NULL); - CComBSTR bs(str); - V_VT(&v) = VT_BSTR; - V_BSTR(&v) = bs.Copy(); - SafeArrayPutElement(sa,&idx,&v); \ - env->ReleaseStringUTFChars(s, str); - VariantClear(&v); - } else if (vt == VT_BSTR) { - const char *str = env->GetStringUTFChars(s, NULL); - CComBSTR bs(str); - SafeArrayPutElement(sa,&idx,bs.Detach()); - env->ReleaseStringUTFChars(s, str); - } else { - ThrowComFail(env, "safearray cannot set string", 0); - } -} - -/* - * Class: SafeArray - * Method: setString - * Signature: (IILjava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setString__IILjava_lang_String_2 - (JNIEnv *env, jobject _this, jint i, jint j, jstring s) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - if (SafeArrayGetDim(sa) != 1) { - ThrowComFail(env, "safearray is not 1D", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - const char *str = env->GetStringUTFChars(s, NULL); - CComBSTR bs(str); - V_VT(&v) = VT_BSTR; - V_BSTR(&v) = bs.Copy(); - long idx[2] = {i,j}; - SafeArrayPutElement(sa,idx,&v); - env->ReleaseStringUTFChars(s, str); - VariantClear(&v); - } else if (vt == VT_BSTR) { - long idx[2] = {i,j}; - const char *str = env->GetStringUTFChars(s, NULL); - CComBSTR bs(str); - SafeArrayPutElement(sa,idx,bs.Detach()); - env->ReleaseStringUTFChars(s, str); - } else { - ThrowComFail(env, "safearray cannot set string", 0); - } -} - -/* - * Class: SafeArray - * Method: getStrings - * Signature: (II[Ljava/lang/String;I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getStrings - (JNIEnv *env, jobject _this, jint idx, jint nelem, jobjectArray ja, jint ja_start) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - int num = ub - lb + 1; - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_VARIANT) - { - VARIANT v; - for(int i=idx, j=ja_start;iNewString(bs, SysStringLen(bs)); - env->SetObjectArrayElement(ja, j, js); - VariantClear(&v); - } - } - else if (vt == VT_BSTR) - { - BSTR bs = NULL; - for(int i=idx, j=ja_start;iNewString(bs, SysStringLen(bs)); - env->SetObjectArrayElement(ja, j, js); - } - } else { - ThrowComFail(env, "safearray cannot get strings", 0); - } -} - -/* - * Class: SafeArray - * Method: setStrings - * Signature: (II[Ljava/lang/String;I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setStrings - (JNIEnv *env, jobject _this, jint idx, jint nelem, jobjectArray ja, jint ja_start) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(ja); - if (len > numElements(psa)) - { - len = numElements(psa); - } - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - for(int i=ja_start,j=idx;iGetObjectArrayElement(ja, i); - const char *str = env->GetStringUTFChars(s, NULL); - CComBSTR bs(str); - V_VT(&v) = VT_BSTR; - V_BSTR(&v) = bs.Copy(); - long x = j; - SafeArrayPutElement(psa,&x,&v); - VariantClear(&v); - env->ReleaseStringUTFChars(s, str); - } - } else if (vt == VT_BSTR) { - for(int i=ja_start,j=idx;iGetObjectArrayElement(ja, i); - const char *str = env->GetStringUTFChars(s, NULL); - CComBSTR bs(str); - long x = j; - SafeArrayPutElement(psa,&x,bs.Detach()); - env->ReleaseStringUTFChars(s, str); - } - } else { - ThrowComFail(env, "safearray cannot set strings", 0); - } -} - -/* - * Class: SafeArray - * Method: getByte - * Signature: (I)B - */ -JNIEXPORT jbyte JNICALL Java_com_jacob_com_SafeArray_getByte__I - (JNIEnv *env, jobject _this, jint idx) -{ - GET1DCODE(VT_UI1, V_UI1, jbyte) -} - -/* - * Class: SafeArray - * Method: getByte - * Signature: (II)B - */ -JNIEXPORT jbyte JNICALL Java_com_jacob_com_SafeArray_getByte__II - (JNIEnv *env, jobject _this, jint i, jint j) -{ - GET2DCODE(VT_UI1, V_UI1, jbyte) -} - -/* - * Class: SafeArray - * Method: setByte - * Signature: (IB)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setByte__IB - (JNIEnv *env, jobject _this, jint idx, jbyte c) -{ - SET1DCODE(VT_UI1, V_UI1); -} - -/* - * Class: SafeArray - * Method: setByte - * Signature: (IIB)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setByte__IIB - (JNIEnv *env, jobject _this, jint i, jint j, jbyte c) -{ - SET2DCODE(VT_UI1, V_UI1); -} - -/* - * Class: SafeArray - * Method: getBytes - * Signature: (II[BI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getBytes - (JNIEnv *env, jobject _this, jint idx, jint nelem, jbyteArray ja, jint ja_start) -{ - GETARRAYCODE(VT_UI1, VT_I1, V_UI1, jbyte, SetByteArrayRegion); -} - -/* - * Class: SafeArray - * Method: setBytes - * Signature: (II[BI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBytes - (JNIEnv *env, jobject _this, jint idx, jint nelem, jbyteArray ja, jint ja_start) -{ - SETARRAYCODE(VT_UI1, VT_I1, V_UI1, jbyte, - GetByteArrayElements, ReleaseByteArrayElements); -} - -/* - * Class: SafeArray - * Method: getFloat - * Signature: (I)F - */ -JNIEXPORT jfloat JNICALL Java_com_jacob_com_SafeArray_getFloat__I - (JNIEnv *env, jobject _this, jint idx) -{ - GET1DCODE(VT_R4, V_R4, jfloat) -} - -/* - * Class: SafeArray - * Method: getFloat - * Signature: (II)F - */ -JNIEXPORT jfloat JNICALL Java_com_jacob_com_SafeArray_getFloat__II - (JNIEnv *env, jobject _this, jint i, jint j) -{ - GET2DCODE(VT_R4, V_R4, jfloat) -} - -/* - * Class: SafeArray - * Method: setFloat - * Signature: (IF)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setFloat__IF - (JNIEnv *env, jobject _this, jint idx, jfloat c) -{ - SET1DCODE(VT_R4, V_R4); -} - -/* - * Class: SafeArray - * Method: setFloat - * Signature: (IIF)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setFloat__IIF - (JNIEnv *env, jobject _this, jint i, jint j, jfloat c) -{ - SET2DCODE(VT_R4, V_R4); -} - -/* - * Class: SafeArray - * Method: getFloats - * Signature: (II[FI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getFloats - (JNIEnv *env, jobject _this, jint idx, jint nelem, jfloatArray ja, jint ja_start) -{ - GETARRAYCODE(VT_R4, VT_R4, V_R4, jfloat, SetFloatArrayRegion); -} - -/* - * Class: SafeArray - * Method: setFloats - * Signature: (II[FI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setFloats - (JNIEnv *env, jobject _this, jint idx, jint nelem, jfloatArray ja, jint ja_start) -{ - SETARRAYCODE(VT_R4, VT_R4, V_R4, jfloat, - GetFloatArrayElements, ReleaseFloatArrayElements); -} - -/* - * Class: SafeArray - * Method: getBoolean - * Signature: (I)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jacob_com_SafeArray_getBoolean__I - (JNIEnv *env, jobject _this, jint idx) -{ - // code is inline because of size mismatch - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - if (SafeArrayGetDim(sa) != 1) { - ThrowComFail(env, "safearray not 1D", -1); \ - return NULL; - } - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - SafeArrayGetElement(sa, &idx, (void*) &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_BOOL))) { - ThrowComFail(env, "safearray change type failed", -1); \ - return NULL; - } - jboolean jb = V_BOOL(&v) == VARIANT_TRUE ? JNI_TRUE: JNI_FALSE; - return jb; - } else if (vt == VT_BOOL) { - VARIANT_BOOL vb; - SafeArrayGetElement(sa, &idx, (void*) &vb); - jboolean jb = vb == VARIANT_TRUE ? JNI_TRUE: JNI_FALSE; - return jb; - } else { - return NULL; - } -} - -/* - * Class: SafeArray - * Method: getBoolean - * Signature: (II)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jacob_com_SafeArray_getBoolean__II - (JNIEnv *env, jobject _this, jint i, jint j) -{ - // code is inline because of size mismatch - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - if (SafeArrayGetDim(sa) != 1) { - ThrowComFail(env, "safearray is not 1D", -1); - return NULL; - } - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - long idx[2] = {i,j}; - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - SafeArrayGetElement(sa, idx, (void*) &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_BOOL))) { - ThrowComFail(env, "safearray change type failed", -1); - return NULL; - } - jboolean jb = V_BOOL(&v) == VARIANT_TRUE ? JNI_TRUE: JNI_FALSE; - return jb; - } else if (vt == VT_BOOL) { - VARIANT_BOOL vb; - SafeArrayGetElement(sa, idx, (void*) &vb); - jboolean jb = vb == VARIANT_TRUE ? JNI_TRUE: JNI_FALSE; - return jb; - } else { - return NULL; - } -} - -/* - * Class: SafeArray - * Method: setBoolean - * Signature: (IZ)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBoolean__IZ - (JNIEnv *env, jobject _this, jint idx, jboolean c) -{ - // code is inline because of size mismatch - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - if (SafeArrayGetDim(sa) != 1) { - ThrowComFail(env, "safearray is not 1D", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_BOOL; - V_BOOL(&v) = c == JNI_TRUE ? VARIANT_TRUE : VARIANT_FALSE; - SafeArrayPutElement(sa,&idx,&v); - } else if (vt == VT_BOOL) { - VARIANT_BOOL vb = c == JNI_TRUE ? VARIANT_TRUE : VARIANT_FALSE; - SafeArrayPutElement(sa,&idx,&vb); - } else { - ThrowComFail(env, "safearray type mismatch", -1); - } -} - -/* - * Class: SafeArray - * Method: setBoolean - * Signature: (IIZ)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBoolean__IIZ - (JNIEnv *env, jobject _this, jint i, jint j, jboolean c) -{ - // code is inline because of size mismatch - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - if (SafeArrayGetDim(sa) != 1) { - ThrowComFail(env, "safearray is not 1D", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - long idx[2] = {i,j}; - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_BOOL; - V_BOOL(&v) = c == JNI_TRUE ? VARIANT_TRUE : VARIANT_FALSE; - SafeArrayPutElement(sa,idx,&v); - } else if (vt == VT_BOOL) { - VARIANT_BOOL vb = c == JNI_TRUE ? VARIANT_TRUE : VARIANT_FALSE; - SafeArrayPutElement(sa,idx,&vb); - } else { - ThrowComFail(env, "safearray type mismatch", -1); - } -} - -/* - * Class: SafeArray - * Method: getBooleans - * Signature: (II[ZI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getBooleans - (JNIEnv *env, jobject _this, jint idx, jint nelem, jbooleanArray ja, jint ja_start) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - int num = ub - lb + 1; - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_BOOL) { - VARIANT_BOOL v; - for(int i=idx, j=ja_start;iSetBooleanArrayRegion(ja, j, 1, &val); - } - } else if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - for(int i=idx, j=ja_start;iSetBooleanArrayRegion(ja, j, 1, &val); - } - } -} - -/* - * Class: SafeArray - * Method: setBooleans - * Signature: (II[ZI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBooleans - (JNIEnv *env, jobject _this, jint idx, jint nelem, jbooleanArray ja, jint ja_start) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(ja); - if (len > numElements(psa)) - { - len = numElements(psa); - } - jboolean *iarr = env->GetBooleanArrayElements(ja, 0); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_BOOL; - for(int i=ja_start,j=idx;iReleaseBooleanArrayElements(ja, iarr, 0); -} - -/* - * Class: SafeArray - * Method: getVariant - * Signature: (I)LVariant; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_SafeArray_getVariant__I - (JNIEnv *env, jobject _this, jint idx) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - // prepare a new return value - jclass variantClass = env->FindClass("com/jacob/com/Variant"); - jmethodID variantCons = - env->GetMethodID(variantClass, "", "()V"); - // construct a variant to return - jobject newVariant = env->NewObject(variantClass, variantCons); - // get the VARIANT from the newVariant - VARIANT *v = extractVariant(env, newVariant); - if (vt == VT_VARIANT) { - SafeArrayGetElement(psa, &idx, v); - } else if (vt == VT_DISPATCH || vt == VT_UNKNOWN) { - IDispatch *disp; - SafeArrayGetElement(psa, &idx, (void *)&disp); - VariantClear(v); // whatever was there before - V_VT(v) = VT_DISPATCH; - V_DISPATCH(v) = disp; - // I am handing the pointer to COM - disp->AddRef(); - } else { - ThrowComFail(env, "safearray type is not variant/dispatch", -1); - } - return newVariant; -} - -/* - * Class: SafeArray - * Method: getVariant - * Signature: (II)LVariant; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_SafeArray_getVariant__II - (JNIEnv *env, jobject _this, jint i, jint j) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - // prepare a new return value - jclass variantClass = env->FindClass("com/jacob/com/Variant"); - jmethodID variantCons = - env->GetMethodID(variantClass, "", "()V"); - // construct a variant to return - jobject newVariant = env->NewObject(variantClass, variantCons); - // get the VARIANT from the newVariant - VARIANT *v = extractVariant(env, newVariant); - long idx[2] = {i,j}; - if (vt == VT_VARIANT) { - SafeArrayGetElement(psa, idx, v); - } else if (vt == VT_DISPATCH || vt == VT_UNKNOWN) { - IDispatch *disp; - SafeArrayGetElement(psa, idx, (void *)&disp); - VariantClear(v); // whatever was there before - V_VT(v) = VT_DISPATCH; - V_DISPATCH(v) = disp; - // I am handing the pointer to COM - disp->AddRef(); - } else { - ThrowComFail(env, "safearray type is not variant/dispatch", -1); - } - return newVariant; -} - -/* - * Class: SafeArray - * Method: setVariant - * Signature: (ILVariant;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setVariant__ILcom_jacob_com_Variant_2 - (JNIEnv *env, jobject _this, jint idx, jobject s) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - if (SafeArrayGetDim(sa) != 1) { - ThrowComFail(env, "safearray is not 1D", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - VARIANT *v = extractVariant(env, s); - if (vt == VT_VARIANT) { - SafeArrayPutElement(sa,&idx,v); - } else if (vt == VT_DISPATCH || vt == VT_UNKNOWN) { - if (V_VT(v) != VT_DISPATCH) { - ThrowComFail(env, "variant is not dispatch", -1); - return; - } - IDispatch *disp = V_DISPATCH(v); - disp->AddRef(); - SafeArrayPutElement(sa,&idx,disp); - } else { - ThrowComFail(env, "safearray type is not variant/dispatch", -1); - } -} - -/* - * Class: SafeArray - * Method: setVariant - * Signature: (IILVariant;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setVariant__IILcom_jacob_com_Variant_2 - (JNIEnv *env, jobject _this, jint i, jint j, jobject s) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - if (SafeArrayGetDim(sa) != 2) { - ThrowComFail(env, "safearray is not 2D", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - long idx[2] = {i, j}; - if (vt == VT_VARIANT) { - VARIANT *v = extractVariant(env, s); - SafeArrayPutElement(sa,idx,v); - } else if (vt == VT_DISPATCH || vt == VT_UNKNOWN) { - VARIANT *v = extractVariant(env, s); - if (V_VT(v) != VT_DISPATCH) { - ThrowComFail(env, "variant is not dispatch", -1); - return; - } - IDispatch *disp = V_DISPATCH(v); - SafeArrayPutElement(sa,idx,disp); - } else { - ThrowComFail(env, "safearray type is not variant/dispatch", -1); - } -} - -/* - * Class: SafeArray - * Method: getVariants - * Signature: (II[LVariant;I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getVariants - (JNIEnv *env, jobject _this, jint idx, jint nelem, jobjectArray ja, jint ja_start) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - int num = ub - lb + 1; - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_VARIANT) - { - jclass variantClass = env->FindClass("com/jacob/com/Variant"); - jmethodID variantCons = - env->GetMethodID(variantClass, "", "()V"); - for(int i=idx, j=ja_start;iNewObject(variantClass, variantCons); - // get the VARIANT from the newVariant - VARIANT *v = extractVariant(env, newVariant); - SafeArrayGetElement(sa, &ix, (void*) v); - env->SetObjectArrayElement(ja, j, newVariant); - } - } else { - ThrowComFail(env, "safearray type is not variant", -1); - } -} - -/* - * Class: SafeArray - * Method: setVariants - * Signature: (II[LVariant;I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setVariants - (JNIEnv *env, jobject _this, jint idx, jint nelem, jobjectArray ja, jint ja_start) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(ja); - if (len > numElements(psa)) - { - len = numElements(psa); - } - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - for(int i=ja_start,j=idx;iGetObjectArrayElement(ja, i); - VARIANT *v = extractVariant(env, var); - long x = j; - SafeArrayPutElement(psa,&x,v); - } - } else { - ThrowComFail(env, "safearray type is not variant", -1); - } -} - -} +/* + * Copyright (c) 1999-2004 Sourceforge JACOB Project. + * All rights reserved. Originator: Dan Adler (http://danadler.com). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Redistributions in any form must be accompanied by information on + * how to obtain complete source code for the JACOB software. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "SafeArray.h" +// Win32 support for Ole Automation +#include +#include +#include +#include +#include +#include +#include "util.h" + +extern "C" +{ + +#define V_FLD "m_pV" + +static SAFEARRAY *makeArray(int vt, int nDims, long *lb, long *cel) +{ + if (nDims == 1) { + // no need to alloc + SAFEARRAYBOUND sab; + sab.lLbound = lb[0]; + sab.cElements = cel[0]; + SAFEARRAY *sa = SafeArrayCreate(vt,1,&sab); + return sa; + } else { + SAFEARRAYBOUND* rgsaBounds = new SAFEARRAYBOUND[nDims]; + for(int i=0;iGetObjectClass(arg); + jfieldID vf = env->GetFieldID( argClass, V_FLD, "I"); + jint vnum = env->GetIntField(arg, vf); + if (vnum != NULL) + { + // if vnum is not NULL, then there is a Variant wrapper present + VARIANT *v = (VARIANT *)vnum; + return v; + } + return NULL; +} + +// extract a SAFEARRAY from a SafeArray object +SAFEARRAY *extractSA(JNIEnv *env, jobject arg) +{ + VARIANT *v = extractWrapper(env, arg); + if (v != NULL) + { + SAFEARRAY *sa = V_ARRAY(v); + return sa; + } + return NULL; +} + +// deep copy a SAFEARRAY +SAFEARRAY *copySA(SAFEARRAY *psa) +{ + // easiest way to make a deep copy is to use VariantCopy + VARTYPE vt; + SafeArrayGetVartype(psa, &vt); + VARIANT v1, v2; + + VariantClear(&v1); + VariantClear(&v2); + V_VT(&v1) = VT_ARRAY | vt; + V_ARRAY(&v1) = psa; + VariantCopy(&v2, &v1); + SAFEARRAY *sa = V_ARRAY(&v2); + VariantInit(&v2); // make sure it's not owned by this variant + return sa; +} + +// create a VARIANT wrapper for the safearray +void setSA(JNIEnv *env, jobject arg, SAFEARRAY *sa, int copy) +{ + // construct a variant to hold the result + // the variant then owns the array + jclass argClass = env->GetObjectClass(arg); + jfieldID ajf = env->GetFieldID( argClass, V_FLD, "I"); + jint vnum = env->GetIntField(arg, ajf); + VARIANT *v = (VARIANT *)vnum; + if (v == NULL) + { + v = new VARIANT(); + VariantInit(v); + } + VARTYPE vt; + SafeArrayGetVartype(sa, &vt); + V_VT(v) = VT_ARRAY | vt; + V_ARRAY(v) = copy ? copySA(sa) : sa; + env->SetIntField(arg, ajf, (unsigned int)v); +} + +/* + * Class: SafeArray + * Method: init + * Signature: (I[I[I)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_init + (JNIEnv *env, jobject _this, jint vt, jintArray lb, jintArray cel) +{ + jint *lbounds = env->GetIntArrayElements(lb, NULL); + jint *celems = env->GetIntArrayElements(cel, NULL); + int nDims = env->GetArrayLength(lb); + // array lengths must match + if (nDims != env->GetArrayLength(cel)) return; + // build the sa according to params + if ( nDims > 0 ) + { + SAFEARRAY *sa = makeArray(vt, nDims, lbounds, celems); + env->ReleaseIntArrayElements(lb, lbounds, 0); + env->ReleaseIntArrayElements(cel, celems, 0); + jclass clazz = env->GetObjectClass(_this); + setSA(env, _this, sa, 0); + } +} + +/* + * Class: SafeArray + * Method: clone + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_com_jacob_com_SafeArray_clone + (JNIEnv *env, jobject _this) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (psa) + { + // prepare a new return value + jclass saClass = env->GetObjectClass(_this); + jmethodID saCons = env->GetMethodID(saClass, "", "()V"); + // construct an SA to return + jobject newSA = env->NewObject(saClass, saCons); + // wrap in a Variant + setSA(env, newSA, psa, 1); + return newSA; + } + return NULL; +} + +/* + * Class: SafeArray + * Method: destroy + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_destroy + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractWrapper(env, _this); + if (v) { + // this is the case where a Variant wrapper exists, in that + // case free the variant, but if there is just a raw SA, then + // the owning variant will free it + jclass saClass = env->GetObjectClass(_this); + jfieldID jf = env->GetFieldID(saClass, V_FLD, "I"); + VariantClear(v); + delete v; + env->SetIntField(_this, jf, (unsigned int)0); + } +} + +/* + * Class: SafeArray + * Method: getvt + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getvt + (JNIEnv *env, jobject _this) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (psa) { + VARTYPE vt; + SafeArrayGetVartype(psa, &vt); + return (jint)vt; + } + return NULL; +} + +/* + * Class: SafeArray + * Method: reinit + * Signature: (LSafeArray;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_reinit + (JNIEnv *env, jobject _this, jobject sa) +{ + // what to do here? +} + +/* + * Class: SafeArray + * Method: reinterpretType + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_reinterpretType + (JNIEnv *env, jobject _this, jint vt) +{ +} + +/* + * Class: SafeArray + * Method: getLBound + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getLBound__ + (JNIEnv *env, jobject _this) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (psa) { + jint lb; + SafeArrayGetLBound(psa, 1, &lb); + return lb; + } + return NULL; +} + +/* + * Class: SafeArray + * Method: getLBound + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getLBound__I + (JNIEnv *env, jobject _this, jint dim) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (psa) { + jint lb; + SafeArrayGetLBound(psa, dim, &lb); + return lb; + } + return NULL; +} + +/* + * Class: SafeArray + * Method: getUBound + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getUBound__ + (JNIEnv *env, jobject _this) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (psa) { + jint lb; + SafeArrayGetUBound(psa, 1, &lb); + return lb; + } + return NULL; +} + +/* + * Class: SafeArray + * Method: getUBound + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getUBound__I + (JNIEnv *env, jobject _this, jint dim) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (psa) { + jint lb; + SafeArrayGetUBound(psa, dim, &lb); + return lb; + } + return NULL; +} + +/* + * Class: SafeArray + * Method: getNumDim + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getNumDim + (JNIEnv *env, jobject _this) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (psa) { + return SafeArrayGetDim(psa); + } + return NULL; +} + +/* + * Class: SafeArray + * Method: getFeatures + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getFeatures + (JNIEnv *env, jobject _this) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (psa) { + SafeArrayLock(psa); + jint features = psa->fFeatures; + SafeArrayUnlock(psa); + return features; + } + return NULL; +} + +/* + * Class: SafeArray + * Method: getElemSize + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getElemSize + (JNIEnv *env, jobject _this) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (psa) { + jint siz = SafeArrayGetElemsize(psa); + return siz; + } + return NULL; +} + +static int numElements(SAFEARRAY *psa) +{ + int nDims = SafeArrayGetDim(psa); + int elems = 0; + for(int i=1;i<=nDims;i++) { + long lb, ub; + SafeArrayGetLBound(psa, i, &lb); + SafeArrayGetUBound(psa, i, &ub); + elems += ub - lb + 1; + } + return elems; +} + +/* + * Class: SafeArray + * Method: fromCharArray + * Signature: ([C)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromCharArray + (JNIEnv *env, jobject _this, jcharArray a) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (!psa) { + ThrowComFail(env, "safearray object corrupted", -1); + return; + } + VARTYPE vt; + SafeArrayGetVartype(psa, &vt); + int len = env->GetArrayLength(a); + if (len > numElements(psa)) + { + // max size of memcpy + len = numElements(psa); + } + // get the double array - don't make a copy + jchar *iarr = env->GetCharArrayElements(a, 0); + if (vt == VT_VARIANT) { + VARIANT v; + VariantInit(&v); + V_VT(&v) = VT_UI2; + for(int i=0;iReleaseCharArrayElements(a, iarr, 0); +} + +/* + * Class: SafeArray + * Method: fromIntArray + * Signature: ([I)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromIntArray + (JNIEnv *env, jobject _this, jintArray a) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (!psa) { + ThrowComFail(env, "safearray object corrupted", -1); + return; + } + VARTYPE vt; + SafeArrayGetVartype(psa, &vt); + int len = env->GetArrayLength(a); + if (len > numElements(psa)) + { + // max size of memcpy + len = numElements(psa); + } + // get the int array - don't make a copy + jint *iarr = env->GetIntArrayElements(a, 0); + if (vt == VT_VARIANT) { + VARIANT v; + VariantInit(&v); + V_VT(&v) = VT_I4; + for(int i=0;iReleaseIntArrayElements(a, iarr, 0); +} + +/* + * Class: SafeArray + * Method: fromShortArray + * Signature: ([S)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromShortArray + (JNIEnv *env, jobject _this, jshortArray a) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (!psa) { + ThrowComFail(env, "safearray object corrupted", -1); + return; + } + VARTYPE vt; + SafeArrayGetVartype(psa, &vt); + int len = env->GetArrayLength(a); + if (len > numElements(psa)) + { + // max size of memcpy + len = numElements(psa); + } + // get the short array - don't make a copy + jshort *iarr = env->GetShortArrayElements(a, 0); + if (vt == VT_VARIANT) { + VARIANT v; + VariantInit(&v); + V_VT(&v) = VT_I2; + for(int i=0;iReleaseShortArrayElements(a, iarr, 0); +} + +/* + * Class: SafeArray + * Method: fromDoubleArray + * Signature: ([D)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromDoubleArray + (JNIEnv *env, jobject _this, jdoubleArray a) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (!psa) { + ThrowComFail(env, "safearray object corrupted", -1); + return; + } + VARTYPE vt; + SafeArrayGetVartype(psa, &vt); + int len = env->GetArrayLength(a); + if (len > numElements(psa)) + { + // max size of memcpy + len = numElements(psa); + } + // get the double array - don't make a copy + jdouble *iarr = env->GetDoubleArrayElements(a, 0); + if (vt == VT_VARIANT) { + VARIANT v; + VariantInit(&v); + V_VT(&v) = VT_R8; + for(int i=0;iReleaseDoubleArrayElements(a, iarr, 0); +} + +/* + * Class: SafeArray + * Method: fromStringArray + * Signature: ([Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromStringArray + (JNIEnv *env, jobject _this, jobjectArray a) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (!psa) { + ThrowComFail(env, "safearray object corrupted", -1); + return; + } + VARTYPE vt; + SafeArrayGetVartype(psa, &vt); + int len = env->GetArrayLength(a); + if (len > numElements(psa)) + { + // max size of memcpy + len = numElements(psa); + } + if (vt == VT_VARIANT) { + VARIANT v; + VariantInit(&v); + V_VT(&v) = VT_BSTR; + for(int i=0;iGetObjectArrayElement(a, i); + const char *str = env->GetStringUTFChars(s, NULL); + CComBSTR bs(str); + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = bs.Copy(); + long x = i; + SafeArrayPutElement(psa,&x,&v); + env->ReleaseStringUTFChars(s, str); + VariantClear(&v); + } + } else if (vt == VT_BSTR) { + for(int i=0;iGetObjectArrayElement(a, i); + const char *str = env->GetStringUTFChars(s, NULL); + CComBSTR bs(str); + BSTR bstr = bs.Detach(); + long x = i; + SafeArrayPutElement(psa,&x,bstr); + env->ReleaseStringUTFChars(s, str); + } + } else { + ThrowComFail(env, "safearray cannot be assigned from string\n", 0); + } +} + +/* + * Class: SafeArray + * Method: fromByteArray + * Signature: ([B)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromByteArray + (JNIEnv *env, jobject _this, jbyteArray a) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (!psa) { + ThrowComFail(env, "safearray object corrupted", -1); + return; + } + VARTYPE vt; + SafeArrayGetVartype(psa, &vt); + int len = env->GetArrayLength(a); + if (len > numElements(psa)) + { + // max size of memcpy + len = numElements(psa); + } + // get the byte array - don't make a copy + jbyte *iarr = env->GetByteArrayElements(a, 0); + if (vt == VT_VARIANT) { + VARIANT v; + VariantInit(&v); + V_VT(&v) = VT_UI1; + for(int i=0;iReleaseByteArrayElements(a, iarr, 0); +} + +/* + * Class: SafeArray + * Method: fromFloatArray + * Signature: ([F)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromFloatArray + (JNIEnv *env, jobject _this, jfloatArray a) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (!psa) { + ThrowComFail(env, "safearray object corrupted", -1); + return; + } + VARTYPE vt; + SafeArrayGetVartype(psa, &vt); + int len = env->GetArrayLength(a); + if (len > numElements(psa)) + { + // max size of memcpy + len = numElements(psa); + } + // get the float array - don't make a copy + jfloat *iarr = env->GetFloatArrayElements(a, 0); + if (vt == VT_VARIANT) { + VARIANT v; + VariantInit(&v); + V_VT(&v) = VT_R4; + for(int i=0;iReleaseFloatArrayElements(a, iarr, 0); +} + +/* + * Class: SafeArray + * Method: fromBooleanArray + * Signature: ([Z)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromBooleanArray + (JNIEnv *env, jobject _this, jbooleanArray a) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (!psa) { + ThrowComFail(env, "safearray object corrupted", -1); + return; + } + VARTYPE vt; + SafeArrayGetVartype(psa, &vt); + int len = env->GetArrayLength(a); + if (len > numElements(psa)) + { + // max size of memcpy + len = numElements(psa); + } + // get the boolean array - don't make a copy + jboolean *iarr = env->GetBooleanArrayElements(a, 0); + if (vt == VT_VARIANT) { + VARIANT v; + VariantInit(&v); + V_VT(&v) = VT_BOOL; + for(int i=0;iReleaseBooleanArrayElements(a, iarr, 0); +} + +/* + * Class: SafeArray + * Method: fromVariantArray + * Signature: ([LVariant;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromVariantArray + (JNIEnv *env, jobject _this, jobjectArray a) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (!psa) { + ThrowComFail(env, "safearray object corrupted", -1); + return; + } + VARTYPE vt; + SafeArrayGetVartype(psa, &vt); + int len = env->GetArrayLength(a); + if (len > numElements(psa)) + { + // max size of memcpy + len = numElements(psa); + } + if (vt == VT_VARIANT) { + for(int i=0;iGetObjectArrayElement(a, i); + VARIANT *v = extractVariant(env, var); + long x = i; + if (v) SafeArrayPutElement(psa,&x,v); + } + } else { + ThrowComFail(env, "safearray cannot be assigned from variant", -1); + } +} + +/* + * Class: SafeArray + * Method: toCharArray + * Signature: ()[C + */ +JNIEXPORT jcharArray JNICALL Java_com_jacob_com_SafeArray_toCharArray + (JNIEnv *env, jobject _this) +{ + SAFEARRAY *sa = extractSA(env, _this); + if (!sa) { + ThrowComFail(env, "safearray object corrupted", -1); + return NULL; + } + long lb, ub; + SafeArrayGetLBound(sa, 1, &lb); + SafeArrayGetUBound(sa, 1, &ub); + int num = ub - lb + 1; + VARTYPE vt; + SafeArrayGetVartype(sa, &vt); + if (vt == VT_UI2 || vt == VT_I2) { + jcharArray iarr = env->NewCharArray(num); + void *pData; + SafeArrayAccessData(sa, &pData); + env->SetCharArrayRegion(iarr, 0, num, (jchar *)pData); + SafeArrayUnaccessData(sa); + return iarr; + } else if (vt == VT_VARIANT) { + jcharArray iarr = env->NewCharArray(num); + VARIANT v; + VariantInit(&v); + for(int i=lb;i<=ub;i++) { + long ix = i; + SafeArrayGetElement(sa, &ix, (void*) &v); + if (FAILED(VariantChangeType(&v, &v, 0, VT_UI2))) { + return NULL; + } + jchar val = V_UI2(&v); + env->SetCharArrayRegion(iarr, i, 1, &val); + } + return iarr; + } + return NULL; +} + +/* + * Class: SafeArray + * Method: toIntArray + * Signature: ()[I + */ +JNIEXPORT jintArray JNICALL Java_com_jacob_com_SafeArray_toIntArray + (JNIEnv *env, jobject _this) +{ + SAFEARRAY *sa = extractSA(env, _this); + if (!sa) { + ThrowComFail(env, "safearray object corrupted", -1); + return NULL; + } + long lb, ub; + SafeArrayGetLBound(sa, 1, &lb); + SafeArrayGetUBound(sa, 1, &ub); + int num = ub - lb + 1; + VARTYPE vt; + SafeArrayGetVartype(sa, &vt); + if (vt == VT_I4) { + jintArray iarr = env->NewIntArray(num); + void *pData; + SafeArrayAccessData(sa, &pData); + env->SetIntArrayRegion(iarr, 0, num, (jint *)pData); + SafeArrayUnaccessData(sa); + return iarr; + } else if (vt == VT_VARIANT) { + jintArray iarr = env->NewIntArray(num); + VARIANT v; + VariantInit(&v); + for(int i=lb;i<=ub;i++) { + long ix = i; + SafeArrayGetElement(sa, &ix, (void*) &v); + if (FAILED(VariantChangeType(&v, &v, 0, VT_I4))) { + return NULL; + } + jint val = V_I4(&v); + env->SetIntArrayRegion(iarr, i, 1, &val); + } + return iarr; + } + return NULL; +} + + +/* + * Class: SafeArray + * Method: toShortArray + * Signature: ()[S + */ +JNIEXPORT jshortArray JNICALL Java_com_jacob_com_SafeArray_toShortArray + (JNIEnv *env, jobject _this) +{ + SAFEARRAY *sa = extractSA(env, _this); + if (!sa) { + ThrowComFail(env, "safearray object corrupted", -1); + return NULL; + } + long lb, ub; + SafeArrayGetLBound(sa, 1, &lb); + SafeArrayGetUBound(sa, 1, &ub); + int num = ub - lb + 1; + VARTYPE vt; + SafeArrayGetVartype(sa, &vt); + if (vt == VT_I2) { + jshortArray iarr = env->NewShortArray(num); + void *pData; + SafeArrayAccessData(sa, &pData); + env->SetShortArrayRegion(iarr, 0, num, (jshort *)pData); + SafeArrayUnaccessData(sa); + return iarr; + } else if (vt == VT_VARIANT) { + jshortArray iarr = env->NewShortArray(num); + VARIANT v; + VariantInit(&v); + for(int i=lb;i<=ub;i++) { + long ix = i; + SafeArrayGetElement(sa, &ix, (void*) &v); + if (FAILED(VariantChangeType(&v, &v, 0, VT_I2))) { + return NULL; + } + jshort val = V_I2(&v); + env->SetShortArrayRegion(iarr, i, 1, &val); + } + return iarr; + } + return NULL; +} + +/* + * Class: SafeArray + * Method: toDoubleArray + * Signature: ()[D + */ +JNIEXPORT jdoubleArray JNICALL Java_com_jacob_com_SafeArray_toDoubleArray + (JNIEnv *env, jobject _this) +{ + SAFEARRAY *sa = extractSA(env, _this); + if (!sa) { + ThrowComFail(env, "safearray object corrupted", -1); + return NULL; + } + long lb, ub; + SafeArrayGetLBound(sa, 1, &lb); + SafeArrayGetUBound(sa, 1, &ub); + int num = ub - lb + 1; + VARTYPE vt; + SafeArrayGetVartype(sa, &vt); + if (vt == VT_R8) { + jdoubleArray iarr = env->NewDoubleArray(num); + void *pData; + SafeArrayAccessData(sa, &pData); + env->SetDoubleArrayRegion(iarr, 0, num, (jdouble *)pData); + SafeArrayUnaccessData(sa); + return iarr; + } else if (vt == VT_VARIANT) { + jdoubleArray iarr = env->NewDoubleArray(num); + VARIANT v; + VariantInit(&v); + for(int i=lb;i<=ub;i++) { + long ix = i; + SafeArrayGetElement(sa, &ix, (void*) &v); + if (FAILED(VariantChangeType(&v, &v, 0, VT_R8))) { + return NULL; + } + jdouble val = V_R8(&v); + env->SetDoubleArrayRegion(iarr, i, 1, &val); + } + return iarr; + } + return NULL; +} + +/* + * Class: SafeArray + * Method: toStringArray + * Signature: ()[Ljava/lang/String; + */ +JNIEXPORT jobjectArray JNICALL Java_com_jacob_com_SafeArray_toStringArray + (JNIEnv *env, jobject _this) +{ + SAFEARRAY *sa = extractSA(env, _this); + if (!sa) { + ThrowComFail(env, "safearray object corrupted", -1); + return NULL; + } + long lb, ub; + SafeArrayGetLBound(sa, 1, &lb); + SafeArrayGetUBound(sa, 1, &ub); + int num = ub - lb + 1; + VARTYPE vt; + SafeArrayGetVartype(sa, &vt); + if (vt == VT_VARIANT) + { + jclass sClass = env->FindClass("java/lang/String"); + jobjectArray iarr = env->NewObjectArray(num, sClass, NULL); + VARIANT v; + VariantInit(&v); + for(int i=lb;i<=ub;i++) { + long ix = i; + SafeArrayGetElement(sa, &ix, (void*) &v); + if (FAILED(VariantChangeType(&v, &v, 0, VT_BSTR))) { + return NULL; + } + BSTR bs = V_BSTR(&v); + jstring js = env->NewString(bs, SysStringLen(bs)); + env->SetObjectArrayElement(iarr, i, js); + } + return iarr; + } else if (vt == VT_BSTR) { + jclass sClass = env->FindClass("java/lang/String"); + jobjectArray iarr = env->NewObjectArray(num, sClass, NULL); + for(int i=lb;i<=ub;i++) { + BSTR bs = NULL; + long ix = i; + SafeArrayGetElement(sa, &ix, (void*) &bs); + jstring js = env->NewString(bs, SysStringLen(bs)); + env->SetObjectArrayElement(iarr, i, js); + } + return iarr; + } + ThrowComFail(env, "safearray cannot be converted to string[]", 0); + return NULL; +} + +/* + * Class: SafeArray + * Method: toByteArray + * Signature: ()[B + */ +JNIEXPORT jbyteArray JNICALL Java_com_jacob_com_SafeArray_toByteArray + (JNIEnv *env, jobject _this) +{ + SAFEARRAY *sa = extractSA(env, _this); + if (!sa) { + ThrowComFail(env, "safearray object corrupted", -1); + return NULL; + } + long lb, ub; + SafeArrayGetLBound(sa, 1, &lb); + SafeArrayGetUBound(sa, 1, &ub); + int num = ub - lb + 1; + VARTYPE vt; + SafeArrayGetVartype(sa, &vt); + if (vt == VT_I1 || vt == VT_UI1) { + jbyteArray iarr = env->NewByteArray(num); + jbyte *pData; + SafeArrayAccessData(sa, (void **)&pData); + env->SetByteArrayRegion(iarr, 0, num, pData); + SafeArrayUnaccessData(sa); + return iarr; + } else if (vt == VT_VARIANT) { + jbyteArray iarr = env->NewByteArray(num); + VARIANT v; + VariantInit(&v); + for(int i=lb,j=0;i<=ub;i++,j++) { + long ix = i; + SafeArrayGetElement(sa, &ix, (void*) &v); + if (FAILED(VariantChangeType(&v, &v, 0, VT_UI1))) { + return NULL; + } + jbyte val = V_UI1(&v); + env->SetByteArrayRegion(iarr, j, 1, &val); + } + return iarr; + } + return NULL; +} + +/* + * Class: SafeArray + * Method: toFloatArray + * Signature: ()[F + */ +JNIEXPORT jfloatArray JNICALL Java_com_jacob_com_SafeArray_toFloatArray + (JNIEnv *env, jobject _this) +{ + SAFEARRAY *sa = extractSA(env, _this); + if (!sa) { + ThrowComFail(env, "safearray object corrupted", -1); + return NULL; + } + long lb, ub; + SafeArrayGetLBound(sa, 1, &lb); + SafeArrayGetUBound(sa, 1, &ub); + int num = ub - lb + 1; + VARTYPE vt; + SafeArrayGetVartype(sa, &vt); + if (vt == VT_R4) { + jfloatArray iarr = env->NewFloatArray(num); + void *pData; + SafeArrayAccessData(sa, &pData); + env->SetFloatArrayRegion(iarr, 0, num, (jfloat *)pData); + SafeArrayUnaccessData(sa); + return iarr; + } else if (vt == VT_VARIANT) { + jfloatArray iarr = env->NewFloatArray(num); + VARIANT v; + VariantInit(&v); + for(int i=lb;i<=ub;i++) { + long ix = i; + SafeArrayGetElement(sa, &ix, (void*) &v); + if (FAILED(VariantChangeType(&v, &v, 0, VT_R4))) { + return NULL; + } + jfloat val = V_R4(&v); + env->SetFloatArrayRegion(iarr, i, 1, &val); + } + return iarr; + } + return NULL; +} + +/* + * Class: SafeArray + * Method: toBooleanArray + * Signature: ()[Z + */ +JNIEXPORT jbooleanArray JNICALL Java_com_jacob_com_SafeArray_toBooleanArray + (JNIEnv *env, jobject _this) +{ + SAFEARRAY *sa = extractSA(env, _this); + if (!sa) { + ThrowComFail(env, "safearray object corrupted", -1); + return NULL; + } + long lb, ub; + SafeArrayGetLBound(sa, 1, &lb); + SafeArrayGetUBound(sa, 1, &ub); + int num = ub - lb + 1; + VARTYPE vt; + SafeArrayGetVartype(sa, &vt); + if (vt == VT_BOOL) { + // need to loop because jboolean=1 byte and VARIANT_BOOL=2 bytes + jbooleanArray iarr = env->NewBooleanArray(num); + VARIANT_BOOL v; + for(int i=lb,j=0;i<=ub;i++,j++) { + long ix = i; + SafeArrayGetElement(sa, &ix, (void*) &v); + jboolean val = v == VARIANT_TRUE ? JNI_TRUE : JNI_FALSE; + env->SetBooleanArrayRegion(iarr, j, 1, &val); + } + return iarr; + } else if (vt == VT_VARIANT) { + jbooleanArray iarr = env->NewBooleanArray(num); + VARIANT v; + VariantInit(&v); + for(int i=lb;i<=ub;i++) { + long ix = i; + SafeArrayGetElement(sa, &ix, (void*) &v); + if (FAILED(VariantChangeType(&v, &v, 0, VT_BOOL))) { + return NULL; + } + jboolean val = V_BOOL(&v) == VARIANT_TRUE ? JNI_TRUE : JNI_FALSE; + env->SetBooleanArrayRegion(iarr, i, 1, &val); + } + return iarr; + } + return NULL; +} + +/* + * Class: SafeArray + * Method: toVariantArray + * Signature: ()[LVariant; + */ +JNIEXPORT jobjectArray JNICALL Java_com_jacob_com_SafeArray_toVariantArray + (JNIEnv *env, jobject _this) +{ + SAFEARRAY *sa = extractSA(env, _this); + if (!sa) { + ThrowComFail(env, "safearray object corrupted", -1); + return NULL; + } + long lb, ub; + SafeArrayGetLBound(sa, 1, &lb); + SafeArrayGetUBound(sa, 1, &ub); + int num = ub - lb + 1; + jclass vClass = env->FindClass("com/jacob/com/Variant"); + // create an array of Variant's + jobjectArray varr = env->NewObjectArray(num, vClass, 0); + // fill them in + jmethodID variantCons = + env->GetMethodID(vClass, "", "()V"); + for(int i=lb;i<=ub;i++) { + long ix = i; + // construct a variant to return + jobject newVariant = env->NewObject(vClass, variantCons); + // get the VARIANT from the newVariant + VARIANT *v = extractVariant(env, newVariant); + SafeArrayGetElement(sa, &ix, (void*) v); + // put in object array + env->SetObjectArrayElement(varr, i, newVariant); + } + return varr; +} + +// this is an ugly way to avoid copy/pasting the same code + +#define GET1DCODE(varType, varAccess, jtyp) \ + SAFEARRAY *sa = extractSA(env, _this); \ + if (!sa) { \ + ThrowComFail(env, "safearray object corrupted", -1); \ + return NULL; \ + } \ + if (SafeArrayGetDim(sa) != 1) { \ + ThrowComFail(env, "safearray is not 1D", -1); \ + return NULL; \ + } \ + VARTYPE vt; \ + SafeArrayGetVartype(sa, &vt); \ + if (vt == VT_VARIANT) { \ + VARIANT v; \ + VariantInit(&v); \ + SafeArrayGetElement(sa, &idx, (void*) &v); \ + if (FAILED(VariantChangeType(&v, &v, 0, varType))) { \ + ThrowComFail(env, "VariantChangeType failed", -1); \ + return NULL; \ + } \ + return (jtyp)varAccess(&v); \ + } else if (vt == varType) { \ + jtyp jc; \ + SafeArrayGetElement(sa, &idx, (void*) &jc); \ + return jc; \ + } else { \ + return NULL; \ + } + +#define GET2DCODE(varType, varAccess, jtyp) \ + SAFEARRAY *sa = extractSA(env, _this); \ + if (!sa) { \ + ThrowComFail(env, "safearray object corrupted", -1); \ + return NULL; \ + } \ + if (SafeArrayGetDim(sa) != 2) { \ + ThrowComFail(env, "safearray is not 2D", -1); \ + return NULL; \ + } \ + long idx[2] = {i, j}; \ + VARTYPE vt; \ + SafeArrayGetVartype(sa, &vt); \ + if (vt == VT_VARIANT) { \ + VARIANT v; \ + VariantInit(&v); \ + SafeArrayGetElement(sa, idx, (void*) &v); \ + if (FAILED(VariantChangeType(&v, &v, 0, varType))) { \ + ThrowComFail(env, "VariantChangeType failed", -1); \ + return NULL; \ + } \ + return (jtyp)varAccess(&v); \ + } else if (vt == varType) { \ + jtyp jc; \ + SafeArrayGetElement(sa, idx, (void*) &jc); \ + return jc; \ + } else { \ + return NULL; \ + } + + +#define SET1DCODE(varType, varAccess) \ + SAFEARRAY *sa = extractSA(env, _this); \ + if (!sa) { \ + ThrowComFail(env, "safearray object corrupted", -1); \ + return; \ + } \ + if (SafeArrayGetDim(sa) != 1) { \ + ThrowComFail(env, "safearray is not 1D", -1); \ + return; \ + } \ + VARTYPE vt; \ + SafeArrayGetVartype(sa, &vt); \ + if (vt == VT_VARIANT) { \ + VARIANT v; \ + VariantInit(&v); \ + V_VT(&v) = varType; \ + varAccess(&v) = c; \ + SafeArrayPutElement(sa,&idx,&v); \ + } else if (vt == varType) { \ + SafeArrayPutElement(sa,&idx,&c); \ + } else { \ + ThrowComFail(env, "safearray type mismatch", -1); \ + } \ + +#define SET2DCODE(varType, varAccess) \ + SAFEARRAY *sa = extractSA(env, _this); \ + if (!sa) { \ + ThrowComFail(env, "safearray object corrupted", -1); \ + return; \ + } \ + if (SafeArrayGetDim(sa) != 2) { \ + ThrowComFail(env, "safearray is not 2D", -1); \ + return; \ + } \ + VARTYPE vt; \ + SafeArrayGetVartype(sa, &vt); \ + long idx[2] = {i,j}; \ + if (vt == VT_VARIANT) { \ + VARIANT v; \ + VariantInit(&v); \ + V_VT(&v) = varType; \ + varAccess(&v) = c; \ + SafeArrayPutElement(sa,idx,&v); \ + } else if (vt == varType) { \ + SafeArrayPutElement(sa,idx,&c); \ + } else { \ + ThrowComFail(env, "safearray type mismatch", -1); \ + } + +#define GETARRAYCODE(varType, varType2, varAccess, jtyp, jsetArr) \ + SAFEARRAY *sa = extractSA(env, _this); \ + if (!sa) { \ + ThrowComFail(env, "safearray object corrupted", -1); \ + return; \ + } \ + VARTYPE vt; \ + SafeArrayGetVartype(sa, &vt); \ + if (vt == varType || vt == varType2) { \ + jtyp *pData; \ + SafeArrayAccessData(sa, (void **)&pData); \ + env->jsetArr(ja, ja_start, nelem, &pData[idx]); \ + SafeArrayUnaccessData(sa); \ + return; \ + } else if (vt == VT_VARIANT) { \ + VARIANT v; \ + VariantInit(&v); \ + for(int i=idx, j=ja_start;ijsetArr(ja, j, 1, &val); \ + } \ + } + +#define SETARRAYCODE(varType, varType2, varAccess, jtyp, jgetArr, jrelArr) \ + SAFEARRAY *psa = extractSA(env, _this); \ + if (!psa) { \ + ThrowComFail(env, "safearray object corrupted", -1); \ + return; \ + } \ + VARTYPE vt; \ + SafeArrayGetVartype(psa, &vt); \ + jtyp *iarr = env->jgetArr(ja, 0); \ + if (vt == VT_VARIANT) { \ + VARIANT v; \ + VariantInit(&v); \ + V_VT(&v) = varType; \ + for(int i=ja_start,j=idx;ijrelArr(ja, iarr, 0); + +/* + * Class: SafeArray + * Method: getChar + * Signature: (I)C + */ +JNIEXPORT jchar JNICALL Java_com_jacob_com_SafeArray_getChar__I + (JNIEnv *env, jobject _this, jint idx) +{ + GET1DCODE(VT_UI2, V_UI2, jchar) +} + +/* + * Class: SafeArray + * Method: getChar + * Signature: (II)C + */ +JNIEXPORT jchar JNICALL Java_com_jacob_com_SafeArray_getChar__II + (JNIEnv *env, jobject _this, jint i, jint j) +{ + GET2DCODE(VT_UI2, V_UI2, jchar) +} + + +/* + * Class: SafeArray + * Method: setChar + * Signature: (IC)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setChar__IC + (JNIEnv *env, jobject _this, jint idx, jchar c) +{ + SET1DCODE(VT_UI2, V_UI2); +} + +/* + * Class: SafeArray + * Method: setChar + * Signature: (IIC)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setChar__IIC + (JNIEnv *env, jobject _this, jint i, jint j, jchar c) +{ + SET2DCODE(VT_UI2, V_UI2); +} + +/* + * Class: SafeArray + * Method: getChars + * Signature: (II[CI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getChars + (JNIEnv *env, jobject _this, jint idx, jint nelem, jcharArray ja, jint ja_start) +{ + GETARRAYCODE(VT_UI2, VT_I2, V_UI2, jchar, SetCharArrayRegion); +} + +/* + * Class: SafeArray + * Method: setChars + * Signature: (II[CI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setChars + (JNIEnv *env, jobject _this, jint idx, jint nelem, jcharArray ja, jint ja_start) +{ + SETARRAYCODE(VT_UI2, VT_I2, V_UI2, jchar, + GetCharArrayElements, ReleaseCharArrayElements); +} + +/* + * Class: SafeArray + * Method: getInt + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getInt__I + (JNIEnv *env, jobject _this, jint idx) +{ + GET1DCODE(VT_I4, V_I4, jint) +} + +/* + * Class: SafeArray + * Method: getInt + * Signature: (II)I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getInt__II + (JNIEnv *env, jobject _this, jint i, jint j) +{ + GET2DCODE(VT_I4, V_I4, jint) +} + +/* + * Class: SafeArray + * Method: setInt + * Signature: (II)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setInt__II + (JNIEnv *env, jobject _this, jint idx, jint c) +{ + SET1DCODE(VT_I4, V_I4); +} + +/* + * Class: SafeArray + * Method: setInt + * Signature: (III)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setInt__III + (JNIEnv *env, jobject _this, jint i, jint j, jint c) +{ + SET2DCODE(VT_I4, V_I4); +} + +/* + * Class: SafeArray + * Method: getInts + * Signature: (II[II)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getInts + (JNIEnv *env, jobject _this, jint idx, jint nelem, jintArray ja, jint ja_start) +{ + GETARRAYCODE(VT_I4, VT_I4, V_I4, jint, SetIntArrayRegion); +} + +/* + * Class: SafeArray + * Method: setInts + * Signature: (II[II)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setInts + (JNIEnv *env, jobject _this, jint idx, jint nelem, jintArray ja, jint ja_start) +{ + SETARRAYCODE(VT_I4, VT_I4, V_I4, jint, + GetIntArrayElements, ReleaseIntArrayElements); +} + +/* + * Class: SafeArray + * Method: getShort + * Signature: (I)S + */ +JNIEXPORT jshort JNICALL Java_com_jacob_com_SafeArray_getShort__I + (JNIEnv *env, jobject _this, jint idx) +{ + GET1DCODE(VT_I2, V_I2, jshort) +} + +/* + * Class: SafeArray + * Method: getShort + * Signature: (II)S + */ +JNIEXPORT jshort JNICALL Java_com_jacob_com_SafeArray_getShort__II + (JNIEnv *env, jobject _this, jint i, jint j) +{ + GET2DCODE(VT_I2, V_I2, jshort) +} + +/* + * Class: SafeArray + * Method: setShort + * Signature: (IS)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setShort__IS + (JNIEnv *env, jobject _this, jint idx, jshort c) +{ + SET1DCODE(VT_I2, V_I2); +} + +/* + * Class: SafeArray + * Method: setShort + * Signature: (IIS)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setShort__IIS + (JNIEnv *env, jobject _this, jint i, jint j, jshort c) +{ + SET2DCODE(VT_I2, V_I2); +} + +/* + * Class: SafeArray + * Method: getShorts + * Signature: (II[SI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getShorts + (JNIEnv *env, jobject _this, jint idx, jint nelem, jshortArray ja, jint ja_start) +{ + GETARRAYCODE(VT_I2, VT_I2, V_I2, jshort, SetShortArrayRegion); +} + +/* + * Class: SafeArray + * Method: setShorts + * Signature: (II[SI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setShorts + (JNIEnv *env, jobject _this, jint idx, jint nelem, jshortArray ja, jint ja_start) +{ + SETARRAYCODE(VT_I2, VT_I2, V_I2, jshort, + GetShortArrayElements, ReleaseShortArrayElements); +} + +/* + * Class: SafeArray + * Method: getDouble + * Signature: (I)D + */ +JNIEXPORT jdouble JNICALL Java_com_jacob_com_SafeArray_getDouble__I + (JNIEnv *env, jobject _this, jint idx) +{ + GET1DCODE(VT_R8, V_R8, jdouble) +} + +/* + * Class: SafeArray + * Method: getDouble + * Signature: (II)D + */ +JNIEXPORT jdouble JNICALL Java_com_jacob_com_SafeArray_getDouble__II + (JNIEnv *env, jobject _this, jint i, jint j) +{ + GET2DCODE(VT_R8, V_R8, jdouble) +} + +/* + * Class: SafeArray + * Method: setDouble + * Signature: (ID)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setDouble__ID + (JNIEnv *env, jobject _this, jint idx, jdouble c) +{ + SET1DCODE(VT_R8, V_R8); +} + +/* + * Class: SafeArray + * Method: setDouble + * Signature: (IID)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setDouble__IID + (JNIEnv *env, jobject _this, jint i, jint j, jdouble c) +{ + SET2DCODE(VT_R8, V_R8); +} + +/* + * Class: SafeArray + * Method: getDoubles + * Signature: (II[DI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getDoubles + (JNIEnv *env, jobject _this, jint idx, jint nelem, jdoubleArray ja, jint ja_start) +{ + GETARRAYCODE(VT_R8, VT_R8, V_R8, jdouble, SetDoubleArrayRegion); +} + +/* + * Class: SafeArray + * Method: setDoubles + * Signature: (II[DI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setDoubles + (JNIEnv *env, jobject _this, jint idx, jint nelem, jdoubleArray ja, jint ja_start) +{ + SETARRAYCODE(VT_R8, VT_R8, V_R8, jdouble, + GetDoubleArrayElements, ReleaseDoubleArrayElements); +} + +/* + * Class: SafeArray + * Method: getString + * Signature: (I)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_com_jacob_com_SafeArray_getString__I + (JNIEnv *env, jobject _this, jint idx) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (!psa) { + ThrowComFail(env, "safearray object corrupted", -1); \ + return NULL; + } + VARTYPE vt; + SafeArrayGetVartype(psa, &vt); + if (vt == VT_VARIANT) { + VARIANT v; + VariantInit(&v); + SafeArrayGetElement(psa, &idx, &v); + if (FAILED(VariantChangeType(&v, &v, 0, VT_BSTR))) { + return NULL; + } + BSTR bs = V_BSTR(&v); + jstring js = env->NewString(bs, SysStringLen(bs)); + return js; + } else if (vt == VT_BSTR) { + BSTR bs = NULL; + SafeArrayGetElement(psa, &idx, &bs); + jstring js = env->NewString(bs, SysStringLen(bs)); + return js; + } + ThrowComFail(env, "safearray cannot get string", 0); + return NULL; +} + +/* + * Class: SafeArray + * Method: getString + * Signature: (II)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_com_jacob_com_SafeArray_getString__II + (JNIEnv *env, jobject _this, jint i, jint j) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (!psa) { + ThrowComFail(env, "safearray object corrupted", -1); \ + return NULL; + } + VARTYPE vt; + SafeArrayGetVartype(psa, &vt); + if (vt == VT_VARIANT) { + VARIANT v; + VariantInit(&v); + long idx[2] = {i, j}; + SafeArrayGetElement(psa, idx, &v); + if (FAILED(VariantChangeType(&v, &v, 0, VT_BSTR))) { + return NULL; + } + BSTR bs = V_BSTR(&v); + jstring js = env->NewString(bs, SysStringLen(bs)); + return js; + } else if (vt == VT_BSTR) { + long idx[2] = {i, j}; + BSTR bs = NULL; + SafeArrayGetElement(psa, idx, &bs); + jstring js = env->NewString(bs, SysStringLen(bs)); + return js; + } + ThrowComFail(env, "safearray cannot get string", 0); + return NULL; +} + +/* + * Class: SafeArray + * Method: setString + * Signature: (ILjava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setString__ILjava_lang_String_2 + (JNIEnv *env, jobject _this, jint idx, jstring s) +{ + SAFEARRAY *sa = extractSA(env, _this); + if (!sa) { + ThrowComFail(env, "safearray object corrupted", -1); \ + return; + } + if (SafeArrayGetDim(sa) != 1) { + ThrowComFail(env, "safearray not 1D", -1); \ + return; + } + VARTYPE vt; + SafeArrayGetVartype(sa, &vt); + if (vt == VT_VARIANT) { + VARIANT v; + VariantInit(&v); + const char *str = env->GetStringUTFChars(s, NULL); + CComBSTR bs(str); + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = bs.Copy(); + SafeArrayPutElement(sa,&idx,&v); \ + env->ReleaseStringUTFChars(s, str); + VariantClear(&v); + } else if (vt == VT_BSTR) { + const char *str = env->GetStringUTFChars(s, NULL); + CComBSTR bs(str); + SafeArrayPutElement(sa,&idx,bs.Detach()); + env->ReleaseStringUTFChars(s, str); + } else { + ThrowComFail(env, "safearray cannot set string", 0); + } +} + +/* + * Class: SafeArray + * Method: setString + * Signature: (IILjava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setString__IILjava_lang_String_2 + (JNIEnv *env, jobject _this, jint i, jint j, jstring s) +{ + SAFEARRAY *sa = extractSA(env, _this); + if (!sa) { + ThrowComFail(env, "safearray object corrupted", -1); + return; + } + if (SafeArrayGetDim(sa) != 1) { + ThrowComFail(env, "safearray is not 1D", -1); + return; + } + VARTYPE vt; + SafeArrayGetVartype(sa, &vt); + if (vt == VT_VARIANT) { + VARIANT v; + VariantInit(&v); + const char *str = env->GetStringUTFChars(s, NULL); + CComBSTR bs(str); + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = bs.Copy(); + long idx[2] = {i,j}; + SafeArrayPutElement(sa,idx,&v); + env->ReleaseStringUTFChars(s, str); + VariantClear(&v); + } else if (vt == VT_BSTR) { + long idx[2] = {i,j}; + const char *str = env->GetStringUTFChars(s, NULL); + CComBSTR bs(str); + SafeArrayPutElement(sa,idx,bs.Detach()); + env->ReleaseStringUTFChars(s, str); + } else { + ThrowComFail(env, "safearray cannot set string", 0); + } +} + +/* + * Class: SafeArray + * Method: getStrings + * Signature: (II[Ljava/lang/String;I)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getStrings + (JNIEnv *env, jobject _this, jint idx, jint nelem, jobjectArray ja, jint ja_start) +{ + SAFEARRAY *sa = extractSA(env, _this); + if (!sa) { + ThrowComFail(env, "safearray object corrupted", -1); + return; + } + long lb, ub; + SafeArrayGetLBound(sa, 1, &lb); + SafeArrayGetUBound(sa, 1, &ub); + int num = ub - lb + 1; + VARTYPE vt; + SafeArrayGetVartype(sa, &vt); + if (vt == VT_VARIANT) + { + VARIANT v; + for(int i=idx, j=ja_start;iNewString(bs, SysStringLen(bs)); + env->SetObjectArrayElement(ja, j, js); + VariantClear(&v); + } + } + else if (vt == VT_BSTR) + { + BSTR bs = NULL; + for(int i=idx, j=ja_start;iNewString(bs, SysStringLen(bs)); + env->SetObjectArrayElement(ja, j, js); + } + } else { + ThrowComFail(env, "safearray cannot get strings", 0); + } +} + +/* + * Class: SafeArray + * Method: setStrings + * Signature: (II[Ljava/lang/String;I)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setStrings + (JNIEnv *env, jobject _this, jint idx, jint nelem, jobjectArray ja, jint ja_start) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (!psa) { + ThrowComFail(env, "safearray object corrupted", -1); + return; + } + VARTYPE vt; + SafeArrayGetVartype(psa, &vt); + int len = env->GetArrayLength(ja); + if (len > numElements(psa)) + { + len = numElements(psa); + } + if (vt == VT_VARIANT) { + VARIANT v; + VariantInit(&v); + for(int i=ja_start,j=idx;iGetObjectArrayElement(ja, i); + const char *str = env->GetStringUTFChars(s, NULL); + CComBSTR bs(str); + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = bs.Copy(); + long x = j; + SafeArrayPutElement(psa,&x,&v); + VariantClear(&v); + env->ReleaseStringUTFChars(s, str); + } + } else if (vt == VT_BSTR) { + for(int i=ja_start,j=idx;iGetObjectArrayElement(ja, i); + const char *str = env->GetStringUTFChars(s, NULL); + CComBSTR bs(str); + long x = j; + SafeArrayPutElement(psa,&x,bs.Detach()); + env->ReleaseStringUTFChars(s, str); + } + } else { + ThrowComFail(env, "safearray cannot set strings", 0); + } +} + +/* + * Class: SafeArray + * Method: getByte + * Signature: (I)B + */ +JNIEXPORT jbyte JNICALL Java_com_jacob_com_SafeArray_getByte__I + (JNIEnv *env, jobject _this, jint idx) +{ + GET1DCODE(VT_UI1, V_UI1, jbyte) +} + +/* + * Class: SafeArray + * Method: getByte + * Signature: (II)B + */ +JNIEXPORT jbyte JNICALL Java_com_jacob_com_SafeArray_getByte__II + (JNIEnv *env, jobject _this, jint i, jint j) +{ + GET2DCODE(VT_UI1, V_UI1, jbyte) +} + +/* + * Class: SafeArray + * Method: setByte + * Signature: (IB)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setByte__IB + (JNIEnv *env, jobject _this, jint idx, jbyte c) +{ + SET1DCODE(VT_UI1, V_UI1); +} + +/* + * Class: SafeArray + * Method: setByte + * Signature: (IIB)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setByte__IIB + (JNIEnv *env, jobject _this, jint i, jint j, jbyte c) +{ + SET2DCODE(VT_UI1, V_UI1); +} + +/* + * Class: SafeArray + * Method: getBytes + * Signature: (II[BI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getBytes + (JNIEnv *env, jobject _this, jint idx, jint nelem, jbyteArray ja, jint ja_start) +{ + GETARRAYCODE(VT_UI1, VT_I1, V_UI1, jbyte, SetByteArrayRegion); +} + +/* + * Class: SafeArray + * Method: setBytes + * Signature: (II[BI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBytes + (JNIEnv *env, jobject _this, jint idx, jint nelem, jbyteArray ja, jint ja_start) +{ + SETARRAYCODE(VT_UI1, VT_I1, V_UI1, jbyte, + GetByteArrayElements, ReleaseByteArrayElements); +} + +/* + * Class: SafeArray + * Method: getFloat + * Signature: (I)F + */ +JNIEXPORT jfloat JNICALL Java_com_jacob_com_SafeArray_getFloat__I + (JNIEnv *env, jobject _this, jint idx) +{ + GET1DCODE(VT_R4, V_R4, jfloat) +} + +/* + * Class: SafeArray + * Method: getFloat + * Signature: (II)F + */ +JNIEXPORT jfloat JNICALL Java_com_jacob_com_SafeArray_getFloat__II + (JNIEnv *env, jobject _this, jint i, jint j) +{ + GET2DCODE(VT_R4, V_R4, jfloat) +} + +/* + * Class: SafeArray + * Method: setFloat + * Signature: (IF)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setFloat__IF + (JNIEnv *env, jobject _this, jint idx, jfloat c) +{ + SET1DCODE(VT_R4, V_R4); +} + +/* + * Class: SafeArray + * Method: setFloat + * Signature: (IIF)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setFloat__IIF + (JNIEnv *env, jobject _this, jint i, jint j, jfloat c) +{ + SET2DCODE(VT_R4, V_R4); +} + +/* + * Class: SafeArray + * Method: getFloats + * Signature: (II[FI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getFloats + (JNIEnv *env, jobject _this, jint idx, jint nelem, jfloatArray ja, jint ja_start) +{ + GETARRAYCODE(VT_R4, VT_R4, V_R4, jfloat, SetFloatArrayRegion); +} + +/* + * Class: SafeArray + * Method: setFloats + * Signature: (II[FI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setFloats + (JNIEnv *env, jobject _this, jint idx, jint nelem, jfloatArray ja, jint ja_start) +{ + SETARRAYCODE(VT_R4, VT_R4, V_R4, jfloat, + GetFloatArrayElements, ReleaseFloatArrayElements); +} + +/* + * Class: SafeArray + * Method: getBoolean + * Signature: (I)Z + */ +JNIEXPORT jboolean JNICALL Java_com_jacob_com_SafeArray_getBoolean__I + (JNIEnv *env, jobject _this, jint idx) +{ + // code is inline because of size mismatch + SAFEARRAY *sa = extractSA(env, _this); + if (!sa) { + ThrowComFail(env, "safearray object corrupted", -1); + return NULL; + } + if (SafeArrayGetDim(sa) != 1) { + ThrowComFail(env, "safearray not 1D", -1); \ + return NULL; + } + VARTYPE vt; + SafeArrayGetVartype(sa, &vt); + if (vt == VT_VARIANT) { + VARIANT v; + VariantInit(&v); + SafeArrayGetElement(sa, &idx, (void*) &v); + if (FAILED(VariantChangeType(&v, &v, 0, VT_BOOL))) { + ThrowComFail(env, "safearray change type failed", -1); \ + return NULL; + } + jboolean jb = V_BOOL(&v) == VARIANT_TRUE ? JNI_TRUE: JNI_FALSE; + return jb; + } else if (vt == VT_BOOL) { + VARIANT_BOOL vb; + SafeArrayGetElement(sa, &idx, (void*) &vb); + jboolean jb = vb == VARIANT_TRUE ? JNI_TRUE: JNI_FALSE; + return jb; + } else { + return NULL; + } +} + +/* + * Class: SafeArray + * Method: getBoolean + * Signature: (II)Z + */ +JNIEXPORT jboolean JNICALL Java_com_jacob_com_SafeArray_getBoolean__II + (JNIEnv *env, jobject _this, jint i, jint j) +{ + // code is inline because of size mismatch + SAFEARRAY *sa = extractSA(env, _this); + if (!sa) { + ThrowComFail(env, "safearray object corrupted", -1); + return NULL; + } + if (SafeArrayGetDim(sa) != 1) { + ThrowComFail(env, "safearray is not 1D", -1); + return NULL; + } + VARTYPE vt; + SafeArrayGetVartype(sa, &vt); + long idx[2] = {i,j}; + if (vt == VT_VARIANT) { + VARIANT v; + VariantInit(&v); + SafeArrayGetElement(sa, idx, (void*) &v); + if (FAILED(VariantChangeType(&v, &v, 0, VT_BOOL))) { + ThrowComFail(env, "safearray change type failed", -1); + return NULL; + } + jboolean jb = V_BOOL(&v) == VARIANT_TRUE ? JNI_TRUE: JNI_FALSE; + return jb; + } else if (vt == VT_BOOL) { + VARIANT_BOOL vb; + SafeArrayGetElement(sa, idx, (void*) &vb); + jboolean jb = vb == VARIANT_TRUE ? JNI_TRUE: JNI_FALSE; + return jb; + } else { + return NULL; + } +} + +/* + * Class: SafeArray + * Method: setBoolean + * Signature: (IZ)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBoolean__IZ + (JNIEnv *env, jobject _this, jint idx, jboolean c) +{ + // code is inline because of size mismatch + SAFEARRAY *sa = extractSA(env, _this); + if (!sa) { + ThrowComFail(env, "safearray object corrupted", -1); + return; + } + if (SafeArrayGetDim(sa) != 1) { + ThrowComFail(env, "safearray is not 1D", -1); + return; + } + VARTYPE vt; + SafeArrayGetVartype(sa, &vt); + if (vt == VT_VARIANT) { + VARIANT v; + VariantInit(&v); + V_VT(&v) = VT_BOOL; + V_BOOL(&v) = c == JNI_TRUE ? VARIANT_TRUE : VARIANT_FALSE; + SafeArrayPutElement(sa,&idx,&v); + } else if (vt == VT_BOOL) { + VARIANT_BOOL vb = c == JNI_TRUE ? VARIANT_TRUE : VARIANT_FALSE; + SafeArrayPutElement(sa,&idx,&vb); + } else { + ThrowComFail(env, "safearray type mismatch", -1); + } +} + +/* + * Class: SafeArray + * Method: setBoolean + * Signature: (IIZ)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBoolean__IIZ + (JNIEnv *env, jobject _this, jint i, jint j, jboolean c) +{ + // code is inline because of size mismatch + SAFEARRAY *sa = extractSA(env, _this); + if (!sa) { + ThrowComFail(env, "safearray object corrupted", -1); + return; + } + if (SafeArrayGetDim(sa) != 1) { + ThrowComFail(env, "safearray is not 1D", -1); + return; + } + VARTYPE vt; + SafeArrayGetVartype(sa, &vt); + long idx[2] = {i,j}; + if (vt == VT_VARIANT) { + VARIANT v; + VariantInit(&v); + V_VT(&v) = VT_BOOL; + V_BOOL(&v) = c == JNI_TRUE ? VARIANT_TRUE : VARIANT_FALSE; + SafeArrayPutElement(sa,idx,&v); + } else if (vt == VT_BOOL) { + VARIANT_BOOL vb = c == JNI_TRUE ? VARIANT_TRUE : VARIANT_FALSE; + SafeArrayPutElement(sa,idx,&vb); + } else { + ThrowComFail(env, "safearray type mismatch", -1); + } +} + +/* + * Class: SafeArray + * Method: getBooleans + * Signature: (II[ZI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getBooleans + (JNIEnv *env, jobject _this, jint idx, jint nelem, jbooleanArray ja, jint ja_start) +{ + SAFEARRAY *sa = extractSA(env, _this); + if (!sa) { + ThrowComFail(env, "safearray object corrupted", -1); + return; + } + long lb, ub; + SafeArrayGetLBound(sa, 1, &lb); + SafeArrayGetUBound(sa, 1, &ub); + int num = ub - lb + 1; + VARTYPE vt; + SafeArrayGetVartype(sa, &vt); + if (vt == VT_BOOL) { + VARIANT_BOOL v; + for(int i=idx, j=ja_start;iSetBooleanArrayRegion(ja, j, 1, &val); + } + } else if (vt == VT_VARIANT) { + VARIANT v; + VariantInit(&v); + for(int i=idx, j=ja_start;iSetBooleanArrayRegion(ja, j, 1, &val); + } + } +} + +/* + * Class: SafeArray + * Method: setBooleans + * Signature: (II[ZI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBooleans + (JNIEnv *env, jobject _this, jint idx, jint nelem, jbooleanArray ja, jint ja_start) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (!psa) { + ThrowComFail(env, "safearray object corrupted", -1); + return; + } + VARTYPE vt; + SafeArrayGetVartype(psa, &vt); + int len = env->GetArrayLength(ja); + if (len > numElements(psa)) + { + len = numElements(psa); + } + jboolean *iarr = env->GetBooleanArrayElements(ja, 0); + if (vt == VT_VARIANT) { + VARIANT v; + VariantInit(&v); + V_VT(&v) = VT_BOOL; + for(int i=ja_start,j=idx;iReleaseBooleanArrayElements(ja, iarr, 0); +} + +/* + * Class: SafeArray + * Method: getVariant + * Signature: (I)LVariant; + */ +JNIEXPORT jobject JNICALL Java_com_jacob_com_SafeArray_getVariant__I + (JNIEnv *env, jobject _this, jint idx) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (!psa) { + ThrowComFail(env, "safearray object corrupted", -1); + return NULL; + } + VARTYPE vt; + SafeArrayGetVartype(psa, &vt); + // prepare a new return value + jclass variantClass = env->FindClass("com/jacob/com/Variant"); + jmethodID variantCons = + env->GetMethodID(variantClass, "", "()V"); + // construct a variant to return + jobject newVariant = env->NewObject(variantClass, variantCons); + // get the VARIANT from the newVariant + VARIANT *v = extractVariant(env, newVariant); + if (vt == VT_VARIANT) { + SafeArrayGetElement(psa, &idx, v); + } else if (vt == VT_DISPATCH || vt == VT_UNKNOWN) { + IDispatch *disp; + SafeArrayGetElement(psa, &idx, (void *)&disp); + VariantClear(v); // whatever was there before + V_VT(v) = VT_DISPATCH; + V_DISPATCH(v) = disp; + // I am handing the pointer to COM + disp->AddRef(); + } else { + ThrowComFail(env, "safearray type is not variant/dispatch", -1); + } + return newVariant; +} + +/* + * Class: SafeArray + * Method: getVariant + * Signature: (II)LVariant; + */ +JNIEXPORT jobject JNICALL Java_com_jacob_com_SafeArray_getVariant__II + (JNIEnv *env, jobject _this, jint i, jint j) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (!psa) { + ThrowComFail(env, "safearray object corrupted", -1); + return NULL; + } + VARTYPE vt; + SafeArrayGetVartype(psa, &vt); + // prepare a new return value + jclass variantClass = env->FindClass("com/jacob/com/Variant"); + jmethodID variantCons = + env->GetMethodID(variantClass, "", "()V"); + // construct a variant to return + jobject newVariant = env->NewObject(variantClass, variantCons); + // get the VARIANT from the newVariant + VARIANT *v = extractVariant(env, newVariant); + long idx[2] = {i,j}; + if (vt == VT_VARIANT) { + SafeArrayGetElement(psa, idx, v); + } else if (vt == VT_DISPATCH || vt == VT_UNKNOWN) { + IDispatch *disp; + SafeArrayGetElement(psa, idx, (void *)&disp); + VariantClear(v); // whatever was there before + V_VT(v) = VT_DISPATCH; + V_DISPATCH(v) = disp; + // I am handing the pointer to COM + disp->AddRef(); + } else { + ThrowComFail(env, "safearray type is not variant/dispatch", -1); + } + return newVariant; +} + +/* + * Class: SafeArray + * Method: setVariant + * Signature: (ILVariant;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setVariant__ILcom_jacob_com_Variant_2 + (JNIEnv *env, jobject _this, jint idx, jobject s) +{ + SAFEARRAY *sa = extractSA(env, _this); + if (!sa) { + ThrowComFail(env, "safearray object corrupted", -1); + return; + } + if (SafeArrayGetDim(sa) != 1) { + ThrowComFail(env, "safearray is not 1D", -1); + return; + } + VARTYPE vt; + SafeArrayGetVartype(sa, &vt); + VARIANT *v = extractVariant(env, s); + if (vt == VT_VARIANT) { + SafeArrayPutElement(sa,&idx,v); + } else if (vt == VT_DISPATCH || vt == VT_UNKNOWN) { + if (V_VT(v) != VT_DISPATCH) { + ThrowComFail(env, "variant is not dispatch", -1); + return; + } + IDispatch *disp = V_DISPATCH(v); + disp->AddRef(); + SafeArrayPutElement(sa,&idx,disp); + } else { + ThrowComFail(env, "safearray type is not variant/dispatch", -1); + } +} + +/* + * Class: SafeArray + * Method: setVariant + * Signature: (IILVariant;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setVariant__IILcom_jacob_com_Variant_2 + (JNIEnv *env, jobject _this, jint i, jint j, jobject s) +{ + SAFEARRAY *sa = extractSA(env, _this); + if (!sa) { + ThrowComFail(env, "safearray object corrupted", -1); + return; + } + if (SafeArrayGetDim(sa) != 2) { + ThrowComFail(env, "safearray is not 2D", -1); + return; + } + VARTYPE vt; + SafeArrayGetVartype(sa, &vt); + long idx[2] = {i, j}; + if (vt == VT_VARIANT) { + VARIANT *v = extractVariant(env, s); + SafeArrayPutElement(sa,idx,v); + } else if (vt == VT_DISPATCH || vt == VT_UNKNOWN) { + VARIANT *v = extractVariant(env, s); + if (V_VT(v) != VT_DISPATCH) { + ThrowComFail(env, "variant is not dispatch", -1); + return; + } + IDispatch *disp = V_DISPATCH(v); + SafeArrayPutElement(sa,idx,disp); + } else { + ThrowComFail(env, "safearray type is not variant/dispatch", -1); + } +} + +/* + * Class: SafeArray + * Method: getVariants + * Signature: (II[LVariant;I)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getVariants + (JNIEnv *env, jobject _this, jint idx, jint nelem, jobjectArray ja, jint ja_start) +{ + SAFEARRAY *sa = extractSA(env, _this); + if (!sa) { + ThrowComFail(env, "safearray object corrupted", -1); + return; + } + long lb, ub; + SafeArrayGetLBound(sa, 1, &lb); + SafeArrayGetUBound(sa, 1, &ub); + int num = ub - lb + 1; + VARTYPE vt; + SafeArrayGetVartype(sa, &vt); + if (vt == VT_VARIANT) + { + jclass variantClass = env->FindClass("com/jacob/com/Variant"); + jmethodID variantCons = + env->GetMethodID(variantClass, "", "()V"); + for(int i=idx, j=ja_start;iNewObject(variantClass, variantCons); + // get the VARIANT from the newVariant + VARIANT *v = extractVariant(env, newVariant); + SafeArrayGetElement(sa, &ix, (void*) v); + env->SetObjectArrayElement(ja, j, newVariant); + } + } else { + ThrowComFail(env, "safearray type is not variant", -1); + } +} + +/* + * Class: SafeArray + * Method: setVariants + * Signature: (II[LVariant;I)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setVariants + (JNIEnv *env, jobject _this, jint idx, jint nelem, jobjectArray ja, jint ja_start) +{ + SAFEARRAY *psa = extractSA(env, _this); + if (!psa) { + ThrowComFail(env, "safearray object corrupted", -1); + return; + } + VARTYPE vt; + SafeArrayGetVartype(psa, &vt); + int len = env->GetArrayLength(ja); + if (len > numElements(psa)) + { + len = numElements(psa); + } + if (vt == VT_VARIANT) { + VARIANT v; + VariantInit(&v); + for(int i=ja_start,j=idx;iGetObjectArrayElement(ja, i); + VARIANT *v = extractVariant(env, var); + long x = j; + SafeArrayPutElement(psa,&x,v); + } + } else { + ThrowComFail(env, "safearray type is not variant", -1); + } +} + +} diff --git a/jni/SafeArray.h b/jni/SafeArray.h index 94d7203..ab76556 100644 --- a/jni/SafeArray.h +++ b/jni/SafeArray.h @@ -1,693 +1,693 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jacob_com_SafeArray */ - -#ifndef _Included_com_jacob_com_SafeArray -#define _Included_com_jacob_com_SafeArray -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jacob_com_SafeArray - * Method: init - * Signature: (I[I[I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_init - (JNIEnv *, jobject, jint, jintArray, jintArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: clone - * Signature: ()Ljava/lang/Object; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_SafeArray_clone - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: destroy - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_destroy - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: getvt - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getvt - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: reinit - * Signature: (Lcom_jacob_com_SafeArray;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_reinit - (JNIEnv *, jobject, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: reinterpretType - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_reinterpretType - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getLBound - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getLBound__ - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: getLBound - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getLBound__I - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getUBound - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getUBound__ - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: getUBound - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getUBound__I - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getNumDim - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getNumDim - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: getFeatures - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getFeatures - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: getElemSize - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getElemSize - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: fromCharArray - * Signature: ([C)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromCharArray - (JNIEnv *, jobject, jcharArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: fromIntArray - * Signature: ([I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromIntArray - (JNIEnv *, jobject, jintArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: fromShortArray - * Signature: ([S)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromShortArray - (JNIEnv *, jobject, jshortArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: fromDoubleArray - * Signature: ([D)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromDoubleArray - (JNIEnv *, jobject, jdoubleArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: fromStringArray - * Signature: ([Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromStringArray - (JNIEnv *, jobject, jobjectArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: fromByteArray - * Signature: ([B)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromByteArray - (JNIEnv *, jobject, jbyteArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: fromFloatArray - * Signature: ([F)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromFloatArray - (JNIEnv *, jobject, jfloatArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: fromBooleanArray - * Signature: ([Z)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromBooleanArray - (JNIEnv *, jobject, jbooleanArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: fromVariantArray - * Signature: ([LVariant;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromVariantArray - (JNIEnv *, jobject, jobjectArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: toCharArray - * Signature: ()[C - */ -JNIEXPORT jcharArray JNICALL Java_com_jacob_com_SafeArray_toCharArray - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: toIntArray - * Signature: ()[I - */ -JNIEXPORT jintArray JNICALL Java_com_jacob_com_SafeArray_toIntArray - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: toShortArray - * Signature: ()[S - */ -JNIEXPORT jshortArray JNICALL Java_com_jacob_com_SafeArray_toShortArray - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: toDoubleArray - * Signature: ()[D - */ -JNIEXPORT jdoubleArray JNICALL Java_com_jacob_com_SafeArray_toDoubleArray - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: toStringArray - * Signature: ()[Ljava/lang/String; - */ -JNIEXPORT jobjectArray JNICALL Java_com_jacob_com_SafeArray_toStringArray - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: toByteArray - * Signature: ()[B - */ -JNIEXPORT jbyteArray JNICALL Java_com_jacob_com_SafeArray_toByteArray - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: toFloatArray - * Signature: ()[F - */ -JNIEXPORT jfloatArray JNICALL Java_com_jacob_com_SafeArray_toFloatArray - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: toBooleanArray - * Signature: ()[Z - */ -JNIEXPORT jbooleanArray JNICALL Java_com_jacob_com_SafeArray_toBooleanArray - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: toVariantArray - * Signature: ()[LVariant; - */ -JNIEXPORT jobjectArray JNICALL Java_com_jacob_com_SafeArray_toVariantArray - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: getChar - * Signature: (I)C - */ -JNIEXPORT jchar JNICALL Java_com_jacob_com_SafeArray_getChar__I - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getChar - * Signature: (II)C - */ -JNIEXPORT jchar JNICALL Java_com_jacob_com_SafeArray_getChar__II - (JNIEnv *, jobject, jint, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setChar - * Signature: (IC)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setChar__IC - (JNIEnv *, jobject, jint, jchar); - -/* - * Class: com_jacob_com_SafeArray - * Method: setChar - * Signature: (IIC)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setChar__IIC - (JNIEnv *, jobject, jint, jint, jchar); - -/* - * Class: com_jacob_com_SafeArray - * Method: getChars - * Signature: (II[CI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getChars - (JNIEnv *, jobject, jint, jint, jcharArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setChars - * Signature: (II[CI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setChars - (JNIEnv *, jobject, jint, jint, jcharArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getInt - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getInt__I - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getInt - * Signature: (II)I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getInt__II - (JNIEnv *, jobject, jint, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setInt - * Signature: (II)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setInt__II - (JNIEnv *, jobject, jint, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setInt - * Signature: (III)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setInt__III - (JNIEnv *, jobject, jint, jint, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getInts - * Signature: (II[II)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getInts - (JNIEnv *, jobject, jint, jint, jintArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setInts - * Signature: (II[II)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setInts - (JNIEnv *, jobject, jint, jint, jintArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getShort - * Signature: (I)S - */ -JNIEXPORT jshort JNICALL Java_com_jacob_com_SafeArray_getShort__I - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getShort - * Signature: (II)S - */ -JNIEXPORT jshort JNICALL Java_com_jacob_com_SafeArray_getShort__II - (JNIEnv *, jobject, jint, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setShort - * Signature: (IS)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setShort__IS - (JNIEnv *, jobject, jint, jshort); - -/* - * Class: com_jacob_com_SafeArray - * Method: setShort - * Signature: (IIS)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setShort__IIS - (JNIEnv *, jobject, jint, jint, jshort); - -/* - * Class: com_jacob_com_SafeArray - * Method: getShorts - * Signature: (II[SI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getShorts - (JNIEnv *, jobject, jint, jint, jshortArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setShorts - * Signature: (II[SI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setShorts - (JNIEnv *, jobject, jint, jint, jshortArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getDouble - * Signature: (I)D - */ -JNIEXPORT jdouble JNICALL Java_com_jacob_com_SafeArray_getDouble__I - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getDouble - * Signature: (II)D - */ -JNIEXPORT jdouble JNICALL Java_com_jacob_com_SafeArray_getDouble__II - (JNIEnv *, jobject, jint, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setDouble - * Signature: (ID)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setDouble__ID - (JNIEnv *, jobject, jint, jdouble); - -/* - * Class: com_jacob_com_SafeArray - * Method: setDouble - * Signature: (IID)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setDouble__IID - (JNIEnv *, jobject, jint, jint, jdouble); - -/* - * Class: com_jacob_com_SafeArray - * Method: getDoubles - * Signature: (II[DI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getDoubles - (JNIEnv *, jobject, jint, jint, jdoubleArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setDoubles - * Signature: (II[DI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setDoubles - (JNIEnv *, jobject, jint, jint, jdoubleArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getString - * Signature: (I)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_com_jacob_com_SafeArray_getString__I - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getString - * Signature: (II)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_com_jacob_com_SafeArray_getString__II - (JNIEnv *, jobject, jint, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setString - * Signature: (ILjava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setString__ILjava_lang_String_2 - (JNIEnv *, jobject, jint, jstring); - -/* - * Class: com_jacob_com_SafeArray - * Method: setString - * Signature: (IILjava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setString__IILjava_lang_String_2 - (JNIEnv *, jobject, jint, jint, jstring); - -/* - * Class: com_jacob_com_SafeArray - * Method: getStrings - * Signature: (II[Ljava/lang/String;I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getStrings - (JNIEnv *, jobject, jint, jint, jobjectArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setStrings - * Signature: (II[Ljava/lang/String;I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setStrings - (JNIEnv *, jobject, jint, jint, jobjectArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getByte - * Signature: (I)B - */ -JNIEXPORT jbyte JNICALL Java_com_jacob_com_SafeArray_getByte__I - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getByte - * Signature: (II)B - */ -JNIEXPORT jbyte JNICALL Java_com_jacob_com_SafeArray_getByte__II - (JNIEnv *, jobject, jint, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setByte - * Signature: (IB)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setByte__IB - (JNIEnv *, jobject, jint, jbyte); - -/* - * Class: com_jacob_com_SafeArray - * Method: setByte - * Signature: (IIB)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setByte__IIB - (JNIEnv *, jobject, jint, jint, jbyte); - -/* - * Class: com_jacob_com_SafeArray - * Method: getBytes - * Signature: (II[BI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getBytes - (JNIEnv *, jobject, jint, jint, jbyteArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setBytes - * Signature: (II[BI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBytes - (JNIEnv *, jobject, jint, jint, jbyteArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getFloat - * Signature: (I)F - */ -JNIEXPORT jfloat JNICALL Java_com_jacob_com_SafeArray_getFloat__I - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getFloat - * Signature: (II)F - */ -JNIEXPORT jfloat JNICALL Java_com_jacob_com_SafeArray_getFloat__II - (JNIEnv *, jobject, jint, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setFloat - * Signature: (IF)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setFloat__IF - (JNIEnv *, jobject, jint, jfloat); - -/* - * Class: com_jacob_com_SafeArray - * Method: setFloat - * Signature: (IIF)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setFloat__IIF - (JNIEnv *, jobject, jint, jint, jfloat); - -/* - * Class: com_jacob_com_SafeArray - * Method: getFloats - * Signature: (II[FI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getFloats - (JNIEnv *, jobject, jint, jint, jfloatArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setFloats - * Signature: (II[FI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setFloats - (JNIEnv *, jobject, jint, jint, jfloatArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getBoolean - * Signature: (I)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jacob_com_SafeArray_getBoolean__I - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getBoolean - * Signature: (II)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jacob_com_SafeArray_getBoolean__II - (JNIEnv *, jobject, jint, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setBoolean - * Signature: (IZ)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBoolean__IZ - (JNIEnv *, jobject, jint, jboolean); - -/* - * Class: com_jacob_com_SafeArray - * Method: setBoolean - * Signature: (IIZ)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBoolean__IIZ - (JNIEnv *, jobject, jint, jint, jboolean); - -/* - * Class: com_jacob_com_SafeArray - * Method: getBooleans - * Signature: (II[ZI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getBooleans - (JNIEnv *, jobject, jint, jint, jbooleanArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setBooleans - * Signature: (II[ZI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBooleans - (JNIEnv *, jobject, jint, jint, jbooleanArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getVariant - * Signature: (I)LVariant; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_SafeArray_getVariant__I - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getVariant - * Signature: (II)LVariant; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_SafeArray_getVariant__II - (JNIEnv *, jobject, jint, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setVariant - * Signature: (ILcom/jacob/com/Variant;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setVariant__ILcom_jacob_com_Variant_2 - (JNIEnv *, jobject, jint, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: setVariant - * Signature: (IILcom/jacob/com/Variant;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setVariant__IILcom_jacob_com_Variant_2 - (JNIEnv *, jobject, jint, jint, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: getVariants - * Signature: (II[LVariant;I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getVariants - (JNIEnv *, jobject, jint, jint, jobjectArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setVariants - * Signature: (II[LVariant;I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setVariants - (JNIEnv *, jobject, jint, jint, jobjectArray, jint); - -#ifdef __cplusplus -} -#endif -#endif +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_jacob_com_SafeArray */ + +#ifndef _Included_com_jacob_com_SafeArray +#define _Included_com_jacob_com_SafeArray +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_jacob_com_SafeArray + * Method: init + * Signature: (I[I[I)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_init + (JNIEnv *, jobject, jint, jintArray, jintArray); + +/* + * Class: com_jacob_com_SafeArray + * Method: clone + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_com_jacob_com_SafeArray_clone + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_SafeArray + * Method: destroy + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_destroy + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_SafeArray + * Method: getvt + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getvt + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_SafeArray + * Method: reinit + * Signature: (Lcom_jacob_com_SafeArray;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_reinit + (JNIEnv *, jobject, jobject); + +/* + * Class: com_jacob_com_SafeArray + * Method: reinterpretType + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_reinterpretType + (JNIEnv *, jobject, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: getLBound + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getLBound__ + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_SafeArray + * Method: getLBound + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getLBound__I + (JNIEnv *, jobject, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: getUBound + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getUBound__ + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_SafeArray + * Method: getUBound + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getUBound__I + (JNIEnv *, jobject, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: getNumDim + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getNumDim + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_SafeArray + * Method: getFeatures + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getFeatures + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_SafeArray + * Method: getElemSize + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getElemSize + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_SafeArray + * Method: fromCharArray + * Signature: ([C)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromCharArray + (JNIEnv *, jobject, jcharArray); + +/* + * Class: com_jacob_com_SafeArray + * Method: fromIntArray + * Signature: ([I)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromIntArray + (JNIEnv *, jobject, jintArray); + +/* + * Class: com_jacob_com_SafeArray + * Method: fromShortArray + * Signature: ([S)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromShortArray + (JNIEnv *, jobject, jshortArray); + +/* + * Class: com_jacob_com_SafeArray + * Method: fromDoubleArray + * Signature: ([D)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromDoubleArray + (JNIEnv *, jobject, jdoubleArray); + +/* + * Class: com_jacob_com_SafeArray + * Method: fromStringArray + * Signature: ([Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromStringArray + (JNIEnv *, jobject, jobjectArray); + +/* + * Class: com_jacob_com_SafeArray + * Method: fromByteArray + * Signature: ([B)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromByteArray + (JNIEnv *, jobject, jbyteArray); + +/* + * Class: com_jacob_com_SafeArray + * Method: fromFloatArray + * Signature: ([F)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromFloatArray + (JNIEnv *, jobject, jfloatArray); + +/* + * Class: com_jacob_com_SafeArray + * Method: fromBooleanArray + * Signature: ([Z)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromBooleanArray + (JNIEnv *, jobject, jbooleanArray); + +/* + * Class: com_jacob_com_SafeArray + * Method: fromVariantArray + * Signature: ([LVariant;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromVariantArray + (JNIEnv *, jobject, jobjectArray); + +/* + * Class: com_jacob_com_SafeArray + * Method: toCharArray + * Signature: ()[C + */ +JNIEXPORT jcharArray JNICALL Java_com_jacob_com_SafeArray_toCharArray + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_SafeArray + * Method: toIntArray + * Signature: ()[I + */ +JNIEXPORT jintArray JNICALL Java_com_jacob_com_SafeArray_toIntArray + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_SafeArray + * Method: toShortArray + * Signature: ()[S + */ +JNIEXPORT jshortArray JNICALL Java_com_jacob_com_SafeArray_toShortArray + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_SafeArray + * Method: toDoubleArray + * Signature: ()[D + */ +JNIEXPORT jdoubleArray JNICALL Java_com_jacob_com_SafeArray_toDoubleArray + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_SafeArray + * Method: toStringArray + * Signature: ()[Ljava/lang/String; + */ +JNIEXPORT jobjectArray JNICALL Java_com_jacob_com_SafeArray_toStringArray + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_SafeArray + * Method: toByteArray + * Signature: ()[B + */ +JNIEXPORT jbyteArray JNICALL Java_com_jacob_com_SafeArray_toByteArray + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_SafeArray + * Method: toFloatArray + * Signature: ()[F + */ +JNIEXPORT jfloatArray JNICALL Java_com_jacob_com_SafeArray_toFloatArray + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_SafeArray + * Method: toBooleanArray + * Signature: ()[Z + */ +JNIEXPORT jbooleanArray JNICALL Java_com_jacob_com_SafeArray_toBooleanArray + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_SafeArray + * Method: toVariantArray + * Signature: ()[LVariant; + */ +JNIEXPORT jobjectArray JNICALL Java_com_jacob_com_SafeArray_toVariantArray + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_SafeArray + * Method: getChar + * Signature: (I)C + */ +JNIEXPORT jchar JNICALL Java_com_jacob_com_SafeArray_getChar__I + (JNIEnv *, jobject, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: getChar + * Signature: (II)C + */ +JNIEXPORT jchar JNICALL Java_com_jacob_com_SafeArray_getChar__II + (JNIEnv *, jobject, jint, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: setChar + * Signature: (IC)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setChar__IC + (JNIEnv *, jobject, jint, jchar); + +/* + * Class: com_jacob_com_SafeArray + * Method: setChar + * Signature: (IIC)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setChar__IIC + (JNIEnv *, jobject, jint, jint, jchar); + +/* + * Class: com_jacob_com_SafeArray + * Method: getChars + * Signature: (II[CI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getChars + (JNIEnv *, jobject, jint, jint, jcharArray, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: setChars + * Signature: (II[CI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setChars + (JNIEnv *, jobject, jint, jint, jcharArray, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: getInt + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getInt__I + (JNIEnv *, jobject, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: getInt + * Signature: (II)I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getInt__II + (JNIEnv *, jobject, jint, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: setInt + * Signature: (II)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setInt__II + (JNIEnv *, jobject, jint, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: setInt + * Signature: (III)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setInt__III + (JNIEnv *, jobject, jint, jint, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: getInts + * Signature: (II[II)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getInts + (JNIEnv *, jobject, jint, jint, jintArray, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: setInts + * Signature: (II[II)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setInts + (JNIEnv *, jobject, jint, jint, jintArray, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: getShort + * Signature: (I)S + */ +JNIEXPORT jshort JNICALL Java_com_jacob_com_SafeArray_getShort__I + (JNIEnv *, jobject, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: getShort + * Signature: (II)S + */ +JNIEXPORT jshort JNICALL Java_com_jacob_com_SafeArray_getShort__II + (JNIEnv *, jobject, jint, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: setShort + * Signature: (IS)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setShort__IS + (JNIEnv *, jobject, jint, jshort); + +/* + * Class: com_jacob_com_SafeArray + * Method: setShort + * Signature: (IIS)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setShort__IIS + (JNIEnv *, jobject, jint, jint, jshort); + +/* + * Class: com_jacob_com_SafeArray + * Method: getShorts + * Signature: (II[SI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getShorts + (JNIEnv *, jobject, jint, jint, jshortArray, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: setShorts + * Signature: (II[SI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setShorts + (JNIEnv *, jobject, jint, jint, jshortArray, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: getDouble + * Signature: (I)D + */ +JNIEXPORT jdouble JNICALL Java_com_jacob_com_SafeArray_getDouble__I + (JNIEnv *, jobject, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: getDouble + * Signature: (II)D + */ +JNIEXPORT jdouble JNICALL Java_com_jacob_com_SafeArray_getDouble__II + (JNIEnv *, jobject, jint, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: setDouble + * Signature: (ID)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setDouble__ID + (JNIEnv *, jobject, jint, jdouble); + +/* + * Class: com_jacob_com_SafeArray + * Method: setDouble + * Signature: (IID)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setDouble__IID + (JNIEnv *, jobject, jint, jint, jdouble); + +/* + * Class: com_jacob_com_SafeArray + * Method: getDoubles + * Signature: (II[DI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getDoubles + (JNIEnv *, jobject, jint, jint, jdoubleArray, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: setDoubles + * Signature: (II[DI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setDoubles + (JNIEnv *, jobject, jint, jint, jdoubleArray, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: getString + * Signature: (I)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_com_jacob_com_SafeArray_getString__I + (JNIEnv *, jobject, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: getString + * Signature: (II)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_com_jacob_com_SafeArray_getString__II + (JNIEnv *, jobject, jint, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: setString + * Signature: (ILjava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setString__ILjava_lang_String_2 + (JNIEnv *, jobject, jint, jstring); + +/* + * Class: com_jacob_com_SafeArray + * Method: setString + * Signature: (IILjava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setString__IILjava_lang_String_2 + (JNIEnv *, jobject, jint, jint, jstring); + +/* + * Class: com_jacob_com_SafeArray + * Method: getStrings + * Signature: (II[Ljava/lang/String;I)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getStrings + (JNIEnv *, jobject, jint, jint, jobjectArray, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: setStrings + * Signature: (II[Ljava/lang/String;I)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setStrings + (JNIEnv *, jobject, jint, jint, jobjectArray, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: getByte + * Signature: (I)B + */ +JNIEXPORT jbyte JNICALL Java_com_jacob_com_SafeArray_getByte__I + (JNIEnv *, jobject, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: getByte + * Signature: (II)B + */ +JNIEXPORT jbyte JNICALL Java_com_jacob_com_SafeArray_getByte__II + (JNIEnv *, jobject, jint, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: setByte + * Signature: (IB)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setByte__IB + (JNIEnv *, jobject, jint, jbyte); + +/* + * Class: com_jacob_com_SafeArray + * Method: setByte + * Signature: (IIB)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setByte__IIB + (JNIEnv *, jobject, jint, jint, jbyte); + +/* + * Class: com_jacob_com_SafeArray + * Method: getBytes + * Signature: (II[BI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getBytes + (JNIEnv *, jobject, jint, jint, jbyteArray, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: setBytes + * Signature: (II[BI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBytes + (JNIEnv *, jobject, jint, jint, jbyteArray, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: getFloat + * Signature: (I)F + */ +JNIEXPORT jfloat JNICALL Java_com_jacob_com_SafeArray_getFloat__I + (JNIEnv *, jobject, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: getFloat + * Signature: (II)F + */ +JNIEXPORT jfloat JNICALL Java_com_jacob_com_SafeArray_getFloat__II + (JNIEnv *, jobject, jint, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: setFloat + * Signature: (IF)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setFloat__IF + (JNIEnv *, jobject, jint, jfloat); + +/* + * Class: com_jacob_com_SafeArray + * Method: setFloat + * Signature: (IIF)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setFloat__IIF + (JNIEnv *, jobject, jint, jint, jfloat); + +/* + * Class: com_jacob_com_SafeArray + * Method: getFloats + * Signature: (II[FI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getFloats + (JNIEnv *, jobject, jint, jint, jfloatArray, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: setFloats + * Signature: (II[FI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setFloats + (JNIEnv *, jobject, jint, jint, jfloatArray, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: getBoolean + * Signature: (I)Z + */ +JNIEXPORT jboolean JNICALL Java_com_jacob_com_SafeArray_getBoolean__I + (JNIEnv *, jobject, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: getBoolean + * Signature: (II)Z + */ +JNIEXPORT jboolean JNICALL Java_com_jacob_com_SafeArray_getBoolean__II + (JNIEnv *, jobject, jint, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: setBoolean + * Signature: (IZ)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBoolean__IZ + (JNIEnv *, jobject, jint, jboolean); + +/* + * Class: com_jacob_com_SafeArray + * Method: setBoolean + * Signature: (IIZ)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBoolean__IIZ + (JNIEnv *, jobject, jint, jint, jboolean); + +/* + * Class: com_jacob_com_SafeArray + * Method: getBooleans + * Signature: (II[ZI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getBooleans + (JNIEnv *, jobject, jint, jint, jbooleanArray, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: setBooleans + * Signature: (II[ZI)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBooleans + (JNIEnv *, jobject, jint, jint, jbooleanArray, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: getVariant + * Signature: (I)LVariant; + */ +JNIEXPORT jobject JNICALL Java_com_jacob_com_SafeArray_getVariant__I + (JNIEnv *, jobject, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: getVariant + * Signature: (II)LVariant; + */ +JNIEXPORT jobject JNICALL Java_com_jacob_com_SafeArray_getVariant__II + (JNIEnv *, jobject, jint, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: setVariant + * Signature: (ILcom/jacob/com/Variant;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setVariant__ILcom_jacob_com_Variant_2 + (JNIEnv *, jobject, jint, jobject); + +/* + * Class: com_jacob_com_SafeArray + * Method: setVariant + * Signature: (IILcom/jacob/com/Variant;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setVariant__IILcom_jacob_com_Variant_2 + (JNIEnv *, jobject, jint, jint, jobject); + +/* + * Class: com_jacob_com_SafeArray + * Method: getVariants + * Signature: (II[LVariant;I)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getVariants + (JNIEnv *, jobject, jint, jint, jobjectArray, jint); + +/* + * Class: com_jacob_com_SafeArray + * Method: setVariants + * Signature: (II[LVariant;I)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setVariants + (JNIEnv *, jobject, jint, jint, jobjectArray, jint); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/jni/StdAfx.cpp b/jni/StdAfx.cpp index e71783f..9017396 100644 --- a/jni/StdAfx.cpp +++ b/jni/StdAfx.cpp @@ -1,41 +1,41 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Redistributions in any form must be accompanied by information on - * how to obtain complete source code for the JACOB software. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -// stdafx.cpp : source file that includes just the standard includes -// stdafx.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - -#ifdef _ATL_STATIC_REGISTRY -#include -#include -#endif - -#include +/* + * Copyright (c) 1999-2004 Sourceforge JACOB Project. + * All rights reserved. Originator: Dan Adler (http://danadler.com). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Redistributions in any form must be accompanied by information on + * how to obtain complete source code for the JACOB software. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +// stdafx.cpp : source file that includes just the standard includes +// stdafx.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +#ifdef _ATL_STATIC_REGISTRY +#include +#include +#endif + +#include diff --git a/jni/StdAfx.h b/jni/StdAfx.h index 92eb401..5310222 100644 --- a/jni/StdAfx.h +++ b/jni/StdAfx.h @@ -1,32 +1,32 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, -// but are changed infrequently - -#if !defined(AFX_STDAFX_H__9988E984_6789_11D3_A646_000000000000__INCLUDED_) -#define AFX_STDAFX_H__9988E984_6789_11D3_A646_000000000000__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#ifndef STRICT -#define STRICT -#endif -#ifndef _WIN32_WINNT -#define _WIN32_WINNT 0x0400 -#endif -//#define _ATL_APARTMENT_THREADED -#include -#include -#include -#include -//You may derive a class from CComModule and use it if you want to override -//something, but do not change the name of _Module -extern CComModule _Module; -#include - - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_STDAFX_H__9988E984_6789_11D3_A646_000000000000__INCLUDED) +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, +// but are changed infrequently + +#if !defined(AFX_STDAFX_H__9988E984_6789_11D3_A646_000000000000__INCLUDED_) +#define AFX_STDAFX_H__9988E984_6789_11D3_A646_000000000000__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#ifndef STRICT +#define STRICT +#endif +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0400 +#endif +//#define _ATL_APARTMENT_THREADED +#include +#include +#include +#include +//You may derive a class from CComModule and use it if you want to override +//something, but do not change the name of _Module +extern CComModule _Module; +#include + + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__9988E984_6789_11D3_A646_000000000000__INCLUDED) diff --git a/jni/Variant.cpp b/jni/Variant.cpp index be2c338..4a7d7cd 100644 --- a/jni/Variant.cpp +++ b/jni/Variant.cpp @@ -1,1145 +1,1145 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Redistributions in any form must be accompanied by information on - * how to obtain complete source code for the JACOB software. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include "stdafx.h" -#include "Variant.h" -// Win32 support for Ole Automation -#include -#include -#include -#include -#include -#include -#include "util.h" - -extern "C" -{ - -#define VARIANT_FLD "m_pVariant" - -// extract a VARIANT from a Variant object -VARIANT *extractVariant(JNIEnv *env, jobject arg) -{ - jclass argClass = env->GetObjectClass(arg); - jfieldID ajf = env->GetFieldID( argClass, VARIANT_FLD, "I"); - jint anum = env->GetIntField(arg, ajf); - VARIANT *v = (VARIANT *)anum; - return v; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_release - (JNIEnv *env, jobject _this) -{ - jclass clazz = env->GetObjectClass(_this); - jfieldID jf = env->GetFieldID(clazz, VARIANT_FLD, "I"); - VARIANT *v = extractVariant(env, _this); - if (v) { - // fix byref leak - if (V_VT(v) & VT_BYREF) // is this a reference - { - void *pMem = V_BSTRREF(v); // get allocated memory - if (pMem) - { - if (V_VT(v) == (VT_BYREF|VT_BSTR)) - { - BSTR *pBstr = (BSTR*)pMem; - if (*pBstr) - SysFreeString(*pBstr);// release bstr - } - CoTaskMemFree(pMem); - } - } - VariantClear(v); - delete v; - env->SetIntField(_this, jf, (unsigned int)0); - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_init - (JNIEnv *env, jobject _this) -{ - jclass clazz = env->GetObjectClass(_this); - jfieldID jf = env->GetFieldID( clazz, VARIANT_FLD, "I"); - VARIANT *v = new VARIANT(); - VariantInit(v); - env->SetIntField(_this, jf, (unsigned int)v); -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_Save - (JNIEnv *env, jobject _this, jobject outStream) -{ - VARIANT *v = extractVariant(env, _this); - if (v) - { - DWORD flags = MSHCTX_LOCAL; - jint size = VARIANT_UserSize(&flags, 0L, v); - // allocate a byte array of the right length - jbyte* pBuf = new jbyte[size]; - // clear it out - ZeroMemory(pBuf, size); - // marshall the Variant into the buffer - VARIANT_UserMarshal(&flags, (unsigned char *)pBuf, v); - // need to convert the buffer to a java byte ba[] - jbyteArray ba = env->NewByteArray(size); - env->SetByteArrayRegion(ba, 0, size, pBuf); - // and delete the original memory - delete [] pBuf; - - //java code: DataOutputStream dos = new DataOutputStream(outStream); - jclass dosCls = env->FindClass("java/io/DataOutputStream"); - jmethodID dosCons = - env->GetMethodID(dosCls, "", "(Ljava/io/OutputStream;)V"); - jmethodID dosWriteInt = - env->GetMethodID(dosCls, "writeInt", "(I)V"); - jmethodID dosWriteBytes = - env->GetMethodID(dosCls, "write", "([B)V"); - jobject dos = env->NewObject(dosCls, dosCons, outStream); - // write the size into the stream - env->CallVoidMethod(dos, dosWriteInt, size); - // write the buffer into the stream - env->CallVoidMethod(dos, dosWriteBytes, ba); - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_Load - (JNIEnv *env, jobject _this, jobject inStream) -{ - - VARIANT *v = extractVariant(env, _this); - if (!v) - { - // since the default constructor is not called when serializing in - // I need to init the underlying VARIANT - jclass clazz = env->GetObjectClass(_this); - jfieldID jf = env->GetFieldID( clazz, VARIANT_FLD, "I"); - v = new VARIANT(); - VariantInit(v); - env->SetIntField(_this, jf, (unsigned int)v); - } - if (v) - { - //java code: DataInputStream dis = new DataInputStream(outStream); - jclass disCls = env->FindClass("java/io/DataInputStream"); - jmethodID disCons = - env->GetMethodID(disCls, "", "(Ljava/io/InputStream;)V"); - jmethodID disReadInt = - env->GetMethodID(disCls, "readInt", "()I"); - jmethodID disReadBytes = - env->GetMethodID(disCls, "readFully", "([B)V"); - jobject dis = env->NewObject(disCls, disCons, inStream); - - // read in the size from the input stream - jint size = env->CallIntMethod(dis, disReadInt); - // allocate a byte array of this size - jbyteArray ba = env->NewByteArray(size); - // read it in from the input stream - env->CallVoidMethod(dis, disReadBytes, ba); - if ( size > 0 ) - { - // get a buffer from it - jbyte *pBuf = env->GetByteArrayElements(ba, 0); - // unmarshall the Variant from the buffer - DWORD flags = MSHCTX_LOCAL; - VARIANT_UserUnmarshal(&flags, (unsigned char *)pBuf, v); - // release the byte array - env->ReleaseByteArrayElements(ba, pBuf, 0); - } - } -} - -JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_toInt - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - HRESULT hr; - if (FAILED(hr = VariantChangeType(v, v, 0, VT_I4))) { - ThrowComFail(env, "VariantChangeType failed", hr); - return NULL; - } - return (jint)V_I4(v); - } - return NULL; -} - -JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_toDate - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - HRESULT hr; - if (FAILED(hr = VariantChangeType(v, v, 0, VT_DATE))) { - ThrowComFail(env, "VariantChangeType failed", hr); - return NULL; - } - return (jdouble)V_DATE(v); - } - return NULL; -} - -JNIEXPORT jboolean JNICALL Java_com_jacob_com_Variant_toBoolean - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - HRESULT hr; - if (FAILED(hr = VariantChangeType(v, v, 0, VT_BOOL))) { - ThrowComFail(env, "VariantChangeType failed", hr); - return NULL; - } - return (jboolean)V_BOOL(v); - } - return NULL; -} - -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_toEnumVariant - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) - { - HRESULT hr; - if (FAILED(hr = VariantChangeType(v, v, 0, VT_UNKNOWN))) { - ThrowComFail(env, "VariantChangeType failed", hr); - return NULL; - } - jclass autoClass = env->FindClass("com/jacob/com/EnumVariant"); - jmethodID autoCons = - env->GetMethodID(autoClass, "", "(I)V"); - // construct an Unknown object to return - IUnknown *unk = V_UNKNOWN(v); - IEnumVARIANT *ie; - hr = unk->QueryInterface(IID_IEnumVARIANT, (void **)&ie); - if (FAILED(hr)) { - ThrowComFail(env, "[toEnumVariant]: Object does not implement IEnumVariant", hr); - return NULL; - } - // I am copying the pointer to java - if (ie) ie->AddRef(); - jobject newAuto = env->NewObject(autoClass, autoCons, ie); - return newAuto; - } - return NULL; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_getNull - (JNIEnv *env, jobject _this) -{ -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putNull - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_NULL; - } -} - -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_cloneIndirect - (JNIEnv *env, jobject _this) -{ - return NULL; -} - -JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_toDouble - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - HRESULT hr; - if (FAILED(hr = VariantChangeType(v, v, 0, VT_R8))) { - ThrowComFail(env, "VariantChangeType failed", hr); - return NULL; - } - return (jdouble)V_R8(v); - } - return NULL; -} - -JNIEXPORT jlong JNICALL Java_com_jacob_com_Variant_toCurrency - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - HRESULT hr; - if (FAILED(hr = VariantChangeType(v, v, 0, VT_CY))) { - ThrowComFail(env, "VariantChangeType failed", hr); - return NULL; - } - CY cy = V_CY(v); - return (jlong)cy.int64; - } - return NULL; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putShortRef - (JNIEnv *env, jobject _this, jshort s) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - short *ps = (short *)CoTaskMemAlloc(sizeof(short)); - *ps = s; - V_VT(v) = VT_I2|VT_BYREF; - V_I2REF(v) = ps; - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putIntRef - (JNIEnv *env, jobject _this, jint s) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - long *ps = (long *)CoTaskMemAlloc(sizeof(long)); - *ps = s; - V_VT(v) = VT_I4|VT_BYREF; - V_I4REF(v) = ps; - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putDoubleRef - (JNIEnv *env, jobject _this, jdouble s) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - double *ps = (double *)CoTaskMemAlloc(sizeof(double)); - *ps = s; - V_VT(v) = VT_R8|VT_BYREF; - V_R8REF(v) = ps; - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putDateRef - (JNIEnv *env, jobject _this, jdouble s) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - double *ps = (double *)CoTaskMemAlloc(sizeof(double)); - *ps = s; - V_VT(v) = VT_DATE|VT_BYREF; - V_DATEREF(v) = ps; - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putStringRef - (JNIEnv *env, jobject _this, jstring s) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - - // need to convert to C-style char buffer - jclass strcls = env->FindClass("java/lang/String"); - jmethodID getBytes = env->GetMethodID(strcls, "getBytes", "()[B"); - jbyteArray ba = (jbyteArray)env->CallObjectMethod(s, getBytes); - int len = env->GetArrayLength(ba); - jbyte* buf = (jbyte*)alloca(len + 1); - env->GetByteArrayRegion(ba, 0, len, buf); - buf[len] = '\0'; - CComBSTR bs((char*)buf); - - BSTR *pbs = (BSTR *)CoTaskMemAlloc(sizeof(BSTR)); - bs.CopyTo(pbs); - V_VT(v) = VT_BSTR|VT_BYREF; - V_BSTRREF(v) = pbs; - } -} - -JNIEXPORT jshort JNICALL Java_com_jacob_com_Variant_getShortRef - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_I2|VT_BYREF)) { - return NULL; - } - return (jshort)*V_I2REF(v); - } - return NULL; -} - -JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getIntRef - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_I4|VT_BYREF)) { - return NULL; - } - return (jint)*V_I4REF(v); - } - return NULL; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putShort - (JNIEnv *env, jobject _this, jshort s) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_I2; - V_I2(v) = (short)s; - } -} - -JNIEXPORT jshort JNICALL Java_com_jacob_com_Variant_getShort - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != VT_I2) { - return NULL; - } - return (jshort)V_I2(v); - } - return NULL; -} - -JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getDoubleRef - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_R8|VT_BYREF)) { - return NULL; - } - return (jdouble)*V_R8REF(v); - } - return NULL; -} - -JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getDateRef - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_DATE|VT_BYREF)) { - return NULL; - } - return (jdouble)*V_DATEREF(v); - } - return NULL; -} - -JNIEXPORT jstring JNICALL Java_com_jacob_com_Variant_getStringRef - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_BSTR|VT_BYREF)) { - return NULL; - } - BSTR *bs = V_BSTRREF(v); - jstring js = env->NewString(*bs, SysStringLen(*bs)); - return js; - } - return NULL; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_VariantClear - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); - } -} - -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_toDispatch - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - HRESULT hr; - if (FAILED(hr = VariantChangeType(v, v, 0, VT_DISPATCH))) { - ThrowComFail(env, "VariantChangeType failed", hr); - return NULL; - } - jclass autoClass = env->FindClass("com/jacob/com/Dispatch"); - jmethodID autoCons = - env->GetMethodID(autoClass, "", "(I)V"); - // construct a Dispatch object to return - IDispatch *disp = V_DISPATCH(v); - // I am copying the pointer to java - if (disp) disp->AddRef(); - jobject newAuto = env->NewObject(autoClass, autoCons, disp); - return newAuto; - } - return NULL; -} - -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_clone - (JNIEnv *env, jobject _this) -{ - return NULL; -} - -JNIEXPORT jstring JNICALL Java_com_jacob_com_Variant_toString - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - switch (V_VT(v)) - { - case VT_EMPTY: - case VT_NULL: - case VT_ERROR: - // causes VariantChangeType to bomb - return env->NewStringUTF("null"); - } - HRESULT hr; - if (FAILED(hr = VariantChangeType(v, v, 0, VT_BSTR))) { - // cannot change type to a string - return env->NewStringUTF("???"); - } - BSTR bs = V_BSTR(v); - jstring js = env->NewString(bs, SysStringLen(bs)); - return js; - } - return NULL; -} - -JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getInt - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != VT_I4) { - return NULL; - } - return (jint)V_I4(v); - } - return NULL; -} - -JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getDate - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != VT_DATE) { - return NULL; - } - return (jdouble)V_DATE(v); - } - return NULL; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putInt - (JNIEnv *env, jobject _this, jint i) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_I4; - V_I4(v) = (int)i; - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putDate - (JNIEnv *env, jobject _this, jdouble date) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_DATE; - V_DATE(v) = date; - } -} - -JNIEXPORT jbyte JNICALL Java_com_jacob_com_Variant_toByte - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - HRESULT hr; - if (FAILED(hr = VariantChangeType(v, v, 0, VT_UI1))) { - ThrowComFail(env, "VariantChangeType failed", hr); - return NULL; - } - return (jbyte)V_UI1(v); - } - return NULL; -} - -JNIEXPORT jboolean JNICALL Java_com_jacob_com_Variant_getBoolean - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_BOOL)) { - return NULL; - } - return (jboolean)V_BOOL(v); - } - return NULL; -} - -JNIEXPORT jbyte JNICALL Java_com_jacob_com_Variant_getByte - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_UI1)) { - return NULL; - } - return (jbyte)V_UI1(v); - } - return NULL; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putBoolean - (JNIEnv *env, jobject _this, jboolean b) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_BOOL; - V_BOOL(v) = b == JNI_TRUE ? VARIANT_TRUE : VARIANT_FALSE; - } - else ThrowComFail(env, "putBoolean failed", -1); -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putByte - (JNIEnv *env, jobject _this, jbyte b) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_UI1; - V_UI1(v) = b; - } - else ThrowComFail(env, "putByte failed", -1); -} - -JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_toError - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - HRESULT hr; - if (FAILED(hr = VariantChangeType(v, v, 0, VT_ERROR))) { - ThrowComFail(env, "VariantChangeType failed", hr); - return NULL; - } - return (jint)V_ERROR(v); - } - return NULL; -} - -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_toObject - (JNIEnv *env, jobject _this) -{ - // not supported - return NULL; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_getEmpty - (JNIEnv *env, jobject _this) -{ -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putEmpty - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_EMPTY; - } -} - -JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getError - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != VT_ERROR) { - return NULL; - } - return (jint)V_ERROR(v); - } - return NULL; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putError - (JNIEnv *env, jobject _this, jint i) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_ERROR; - V_ERROR(v) = (int)i; - } -} - - -JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getDouble - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != VT_R8) { - return NULL; - } - return (jdouble)V_R8(v); - } - return NULL; -} - -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_getObject - (JNIEnv *env, jobject _this) -{ - // not supported - return NULL; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putCurrency - (JNIEnv *env, jobject _this, jlong cur) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - CY pf; - pf.int64 = (LONGLONG)cur; - V_VT(v) = VT_CY; - V_CY(v) = pf; - } else ThrowComFail(env, "putCurrency failed", -1); -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putObject - (JNIEnv *env, jobject _this, jobject _that) -{ - VARIANT *v = extractVariant(env, _this); - IDispatch *disp = extractDispatch(env, _that); - if (disp && v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_DISPATCH; - V_DISPATCH(v) = disp; - // I am handing the pointer to COM - disp->AddRef(); - } else ThrowComFail(env, "putObject failed", -1); -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putDouble - (JNIEnv *env, jobject _this, jdouble d) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_R8; - V_R8(v) = (double)d; - } -} - -JNIEXPORT jlong JNICALL Java_com_jacob_com_Variant_getCurrency - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != VT_CY) { - return NULL; - } - CY cy; - cy = V_CY(v); - jlong jl; - memcpy(&jl, &cy, 64); - return jl; - } - return NULL; -} - - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putFloatRef - (JNIEnv *env, jobject _this, jfloat val) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - float *pf = (float *)CoTaskMemAlloc(sizeof(float)); - *pf = val; - V_VT(v) = VT_R4|VT_BYREF; - V_R4REF(v) = pf; - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putCurrencyRef - (JNIEnv *env, jobject _this, jlong cur) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - CY *pf = (CY *)CoTaskMemAlloc(sizeof(CY)); - memcpy(pf, &cur, 64); - V_VT(v) = VT_BYREF|VT_CY; - V_CYREF(v) = pf; - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putErrorRef - (JNIEnv *env, jobject _this, jint i) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_ERROR|VT_BYREF; - V_ERROR(v) = (int)i; - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putBooleanRef - (JNIEnv *env, jobject _this, jboolean b) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - VARIANT_BOOL *br = (VARIANT_BOOL *)CoTaskMemAlloc(sizeof(VARIANT_BOOL)); - *br = b ? VARIANT_TRUE : VARIANT_FALSE; - V_VT(v) = VT_BOOL|VT_BYREF; - V_BOOLREF(v) = br; - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putByteRef - (JNIEnv *env, jobject _this, jbyte b) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - unsigned char *br = (unsigned char *)CoTaskMemAlloc(sizeof(char)); - *br = b; - V_VT(v) = VT_UI1|VT_BYREF; - V_UI1REF(v) = br; - } -} - -JNIEXPORT jstring JNICALL Java_com_jacob_com_Variant_getString - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != VT_BSTR) { - return NULL; - } - BSTR bs = V_BSTR(v); - jstring js = env->NewString(bs, SysStringLen(bs)); - return js; - } - return NULL; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putString - (JNIEnv *env, jobject _this, jstring s) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_BSTR; - - // get C-style byte array - jclass strcls = env->FindClass("java/lang/String"); - jmethodID getBytes = env->GetMethodID(strcls, "getBytes", "()[B"); - jbyteArray ba = (jbyteArray)env->CallObjectMethod(s, getBytes); - int len = env->GetArrayLength(ba); - jbyte* buf = (jbyte*)alloca(len + 1); - env->GetByteArrayRegion(ba, 0, len, buf); - buf[len] = '\0'; - - CComBSTR bs((char*)buf); - V_VT(v) = VT_BSTR; - V_BSTR(v) = bs.Copy(); - } -} - -JNIEXPORT jfloat JNICALL Java_com_jacob_com_Variant_getFloatRef - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_R4|VT_BYREF)) { - return NULL; - } - return (jfloat)*V_R4REF(v); - } - return NULL; -} - -JNIEXPORT jlong JNICALL Java_com_jacob_com_Variant_getCurrencyRef - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_CY|VT_BYREF)) { - return NULL; - } - CY *cy; - cy = V_CYREF(v); - jlong jl; - memcpy(&jl, cy, 64); - return jl; - } - return NULL; -} - -JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getErrorRef - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_ERROR|VT_BYREF)) { - return NULL; - } - return (jint)V_ERROR(v); - } - return NULL; -} - -JNIEXPORT jboolean JNICALL Java_com_jacob_com_Variant_getBooleanRef - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_BOOL|VT_BYREF)) { - return NULL; - } - return (jboolean)*V_BOOLREF(v); - } - return NULL; -} - -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_getObjectRef - (JNIEnv *env, jobject _this) -{ - return NULL; -} - - -JNIEXPORT jbyte JNICALL Java_com_jacob_com_Variant_getByteRef - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_UI1|VT_BYREF)) { - return NULL; - } - return (jbyte)*V_UI1REF(v); - } - return NULL; -} - -JNIEXPORT jfloat JNICALL Java_com_jacob_com_Variant_toFloat - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - HRESULT hr; - if (FAILED(hr = VariantChangeType(v, v, 0, VT_R4))) { - ThrowComFail(env, "VariantChangeType failed", hr); - return NULL; - } - return (jfloat)V_R4(v); - } - return NULL; -} - -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_toSafeArray - (JNIEnv *env, jobject _this, jboolean deepCopy) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if ((V_VT(v) & VT_ARRAY) == 0) - { - ThrowComFail(env, "Variant not array", -1); - return NULL; - } - // prepare a new sa obj - jclass saClass = env->FindClass("com/jacob/com/SafeArray"); - jmethodID saCons = env->GetMethodID(saClass, "", "()V"); - // construct an SA to return - jobject newSA = env->NewObject(saClass, saCons); - // pass in the deep copy indicator - setSA(env, newSA, V_ARRAY(v), deepCopy == JNI_TRUE ? 1 : 0); - return newSA; - } - return NULL; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putSafeArrayRef - (JNIEnv *env, jobject _this, jobject sa) -{ - SAFEARRAY *psa = extractSA(env, sa); - if (psa) - { - VARIANT *v = extractVariant(env, _this); - if (v) { - VARTYPE vt; - SAFEARRAY **sa = (SAFEARRAY **)CoTaskMemAlloc(sizeof(SAFEARRAY*)); - *sa = psa; - SafeArrayGetVartype(psa, &vt); - V_VT(v) = VT_ARRAY | vt | VT_BYREF; - V_ARRAYREF(v) = sa; - return; - } - ThrowComFail(env, "Can't get variant pointer", -1); - return; - } - ThrowComFail(env, "Can't get sa pointer", -1); - return; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putSafeArray - (JNIEnv *env, jobject _this, jobject sa) -{ - SAFEARRAY *psa = extractSA(env, sa); - if (psa) - { - VARIANT *v = extractVariant(env, _this); - if (v) { - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - V_VT(v) = VT_ARRAY | vt; - V_ARRAY(v) = psa; - return; - } - ThrowComFail(env, "Can't get variant pointer", -1); - return; - } - ThrowComFail(env, "Can't get sa pointer", -1); - return; -} - - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_noParam - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - V_VT(v) = VT_ERROR; - V_ERROR(v) = DISP_E_PARAMNOTFOUND; - } -} - -JNIEXPORT jfloat JNICALL Java_com_jacob_com_Variant_getFloat - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_R4)) { - return NULL; - } - return (jfloat)V_R4(v); - } - return NULL; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putFloat - (JNIEnv *env, jobject _this, jfloat val) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_R4; - V_R4(v) = val; - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_changeType - (JNIEnv *env, jobject _this, jshort t) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantChangeType(v, v, 0, t); - } -} - -JNIEXPORT jshort JNICALL Java_com_jacob_com_Variant_getvt - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - return (jshort)V_VT(v); - } - return NULL; -} - -JNIEXPORT jshort JNICALL Java_com_jacob_com_Variant_toShort - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - HRESULT hr; - if (FAILED(hr = VariantChangeType(v, v, 0, VT_I2))) { - ThrowComFail(env, "VariantChangeType failed", hr); - return NULL; - } - return (jshort)V_I2(v); - } - return NULL; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putSafeArrayRefHelper - (JNIEnv *env, jobject _this, jint pSA) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - } -} - -JNIEXPORT jboolean JNICALL Java_com_jacob_com_Variant_isNull - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (!v) return JNI_TRUE; - if ((V_VT(v) & VT_ARRAY)) - { - // is it a null safearray - if ((V_VT(v) & VT_BYREF)) - if (!V_ARRAYREF(v)) return JNI_TRUE; - else - if (!V_ARRAY(v)) return JNI_TRUE; - } - switch (V_VT(v)) - { - case VT_EMPTY: - case VT_NULL: - case VT_ERROR: - return JNI_TRUE; - // is it a null dispatch (Nothing in VB) - case VT_DISPATCH: - if (!V_DISPATCH(v)) return JNI_TRUE; - } - return JNI_FALSE; -} - -} +/* + * Copyright (c) 1999-2004 Sourceforge JACOB Project. + * All rights reserved. Originator: Dan Adler (http://danadler.com). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Redistributions in any form must be accompanied by information on + * how to obtain complete source code for the JACOB software. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "stdafx.h" +#include "Variant.h" +// Win32 support for Ole Automation +#include +#include +#include +#include +#include +#include +#include "util.h" + +extern "C" +{ + +#define VARIANT_FLD "m_pVariant" + +// extract a VARIANT from a Variant object +VARIANT *extractVariant(JNIEnv *env, jobject arg) +{ + jclass argClass = env->GetObjectClass(arg); + jfieldID ajf = env->GetFieldID( argClass, VARIANT_FLD, "I"); + jint anum = env->GetIntField(arg, ajf); + VARIANT *v = (VARIANT *)anum; + return v; +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_release + (JNIEnv *env, jobject _this) +{ + jclass clazz = env->GetObjectClass(_this); + jfieldID jf = env->GetFieldID(clazz, VARIANT_FLD, "I"); + VARIANT *v = extractVariant(env, _this); + if (v) { + // fix byref leak + if (V_VT(v) & VT_BYREF) // is this a reference + { + void *pMem = V_BSTRREF(v); // get allocated memory + if (pMem) + { + if (V_VT(v) == (VT_BYREF|VT_BSTR)) + { + BSTR *pBstr = (BSTR*)pMem; + if (*pBstr) + SysFreeString(*pBstr);// release bstr + } + CoTaskMemFree(pMem); + } + } + VariantClear(v); + delete v; + env->SetIntField(_this, jf, (unsigned int)0); + } +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_init + (JNIEnv *env, jobject _this) +{ + jclass clazz = env->GetObjectClass(_this); + jfieldID jf = env->GetFieldID( clazz, VARIANT_FLD, "I"); + VARIANT *v = new VARIANT(); + VariantInit(v); + env->SetIntField(_this, jf, (unsigned int)v); +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_Save + (JNIEnv *env, jobject _this, jobject outStream) +{ + VARIANT *v = extractVariant(env, _this); + if (v) + { + DWORD flags = MSHCTX_LOCAL; + jint size = VARIANT_UserSize(&flags, 0L, v); + // allocate a byte array of the right length + jbyte* pBuf = new jbyte[size]; + // clear it out + ZeroMemory(pBuf, size); + // marshall the Variant into the buffer + VARIANT_UserMarshal(&flags, (unsigned char *)pBuf, v); + // need to convert the buffer to a java byte ba[] + jbyteArray ba = env->NewByteArray(size); + env->SetByteArrayRegion(ba, 0, size, pBuf); + // and delete the original memory + delete [] pBuf; + + //java code: DataOutputStream dos = new DataOutputStream(outStream); + jclass dosCls = env->FindClass("java/io/DataOutputStream"); + jmethodID dosCons = + env->GetMethodID(dosCls, "", "(Ljava/io/OutputStream;)V"); + jmethodID dosWriteInt = + env->GetMethodID(dosCls, "writeInt", "(I)V"); + jmethodID dosWriteBytes = + env->GetMethodID(dosCls, "write", "([B)V"); + jobject dos = env->NewObject(dosCls, dosCons, outStream); + // write the size into the stream + env->CallVoidMethod(dos, dosWriteInt, size); + // write the buffer into the stream + env->CallVoidMethod(dos, dosWriteBytes, ba); + } +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_Load + (JNIEnv *env, jobject _this, jobject inStream) +{ + + VARIANT *v = extractVariant(env, _this); + if (!v) + { + // since the default constructor is not called when serializing in + // I need to init the underlying VARIANT + jclass clazz = env->GetObjectClass(_this); + jfieldID jf = env->GetFieldID( clazz, VARIANT_FLD, "I"); + v = new VARIANT(); + VariantInit(v); + env->SetIntField(_this, jf, (unsigned int)v); + } + if (v) + { + //java code: DataInputStream dis = new DataInputStream(outStream); + jclass disCls = env->FindClass("java/io/DataInputStream"); + jmethodID disCons = + env->GetMethodID(disCls, "", "(Ljava/io/InputStream;)V"); + jmethodID disReadInt = + env->GetMethodID(disCls, "readInt", "()I"); + jmethodID disReadBytes = + env->GetMethodID(disCls, "readFully", "([B)V"); + jobject dis = env->NewObject(disCls, disCons, inStream); + + // read in the size from the input stream + jint size = env->CallIntMethod(dis, disReadInt); + // allocate a byte array of this size + jbyteArray ba = env->NewByteArray(size); + // read it in from the input stream + env->CallVoidMethod(dis, disReadBytes, ba); + if ( size > 0 ) + { + // get a buffer from it + jbyte *pBuf = env->GetByteArrayElements(ba, 0); + // unmarshall the Variant from the buffer + DWORD flags = MSHCTX_LOCAL; + VARIANT_UserUnmarshal(&flags, (unsigned char *)pBuf, v); + // release the byte array + env->ReleaseByteArrayElements(ba, pBuf, 0); + } + } +} + +JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_toInt + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + HRESULT hr; + if (FAILED(hr = VariantChangeType(v, v, 0, VT_I4))) { + ThrowComFail(env, "VariantChangeType failed", hr); + return NULL; + } + return (jint)V_I4(v); + } + return NULL; +} + +JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_toDate + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + HRESULT hr; + if (FAILED(hr = VariantChangeType(v, v, 0, VT_DATE))) { + ThrowComFail(env, "VariantChangeType failed", hr); + return NULL; + } + return (jdouble)V_DATE(v); + } + return NULL; +} + +JNIEXPORT jboolean JNICALL Java_com_jacob_com_Variant_toBoolean + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + HRESULT hr; + if (FAILED(hr = VariantChangeType(v, v, 0, VT_BOOL))) { + ThrowComFail(env, "VariantChangeType failed", hr); + return NULL; + } + return (jboolean)V_BOOL(v); + } + return NULL; +} + +JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_toEnumVariant + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) + { + HRESULT hr; + if (FAILED(hr = VariantChangeType(v, v, 0, VT_UNKNOWN))) { + ThrowComFail(env, "VariantChangeType failed", hr); + return NULL; + } + jclass autoClass = env->FindClass("com/jacob/com/EnumVariant"); + jmethodID autoCons = + env->GetMethodID(autoClass, "", "(I)V"); + // construct an Unknown object to return + IUnknown *unk = V_UNKNOWN(v); + IEnumVARIANT *ie; + hr = unk->QueryInterface(IID_IEnumVARIANT, (void **)&ie); + if (FAILED(hr)) { + ThrowComFail(env, "[toEnumVariant]: Object does not implement IEnumVariant", hr); + return NULL; + } + // I am copying the pointer to java + if (ie) ie->AddRef(); + jobject newAuto = env->NewObject(autoClass, autoCons, ie); + return newAuto; + } + return NULL; +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_getNull + (JNIEnv *env, jobject _this) +{ +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putNull + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantClear(v); // whatever was there before + V_VT(v) = VT_NULL; + } +} + +JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_cloneIndirect + (JNIEnv *env, jobject _this) +{ + return NULL; +} + +JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_toDouble + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + HRESULT hr; + if (FAILED(hr = VariantChangeType(v, v, 0, VT_R8))) { + ThrowComFail(env, "VariantChangeType failed", hr); + return NULL; + } + return (jdouble)V_R8(v); + } + return NULL; +} + +JNIEXPORT jlong JNICALL Java_com_jacob_com_Variant_toCurrency + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + HRESULT hr; + if (FAILED(hr = VariantChangeType(v, v, 0, VT_CY))) { + ThrowComFail(env, "VariantChangeType failed", hr); + return NULL; + } + CY cy = V_CY(v); + return (jlong)cy.int64; + } + return NULL; +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putShortRef + (JNIEnv *env, jobject _this, jshort s) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantClear(v); // whatever was there before + short *ps = (short *)CoTaskMemAlloc(sizeof(short)); + *ps = s; + V_VT(v) = VT_I2|VT_BYREF; + V_I2REF(v) = ps; + } +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putIntRef + (JNIEnv *env, jobject _this, jint s) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantClear(v); // whatever was there before + long *ps = (long *)CoTaskMemAlloc(sizeof(long)); + *ps = s; + V_VT(v) = VT_I4|VT_BYREF; + V_I4REF(v) = ps; + } +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putDoubleRef + (JNIEnv *env, jobject _this, jdouble s) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + double *ps = (double *)CoTaskMemAlloc(sizeof(double)); + *ps = s; + V_VT(v) = VT_R8|VT_BYREF; + V_R8REF(v) = ps; + } +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putDateRef + (JNIEnv *env, jobject _this, jdouble s) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantClear(v); // whatever was there before + double *ps = (double *)CoTaskMemAlloc(sizeof(double)); + *ps = s; + V_VT(v) = VT_DATE|VT_BYREF; + V_DATEREF(v) = ps; + } +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putStringRef + (JNIEnv *env, jobject _this, jstring s) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantClear(v); // whatever was there before + + // need to convert to C-style char buffer + jclass strcls = env->FindClass("java/lang/String"); + jmethodID getBytes = env->GetMethodID(strcls, "getBytes", "()[B"); + jbyteArray ba = (jbyteArray)env->CallObjectMethod(s, getBytes); + int len = env->GetArrayLength(ba); + jbyte* buf = (jbyte*)alloca(len + 1); + env->GetByteArrayRegion(ba, 0, len, buf); + buf[len] = '\0'; + CComBSTR bs((char*)buf); + + BSTR *pbs = (BSTR *)CoTaskMemAlloc(sizeof(BSTR)); + bs.CopyTo(pbs); + V_VT(v) = VT_BSTR|VT_BYREF; + V_BSTRREF(v) = pbs; + } +} + +JNIEXPORT jshort JNICALL Java_com_jacob_com_Variant_getShortRef + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + if (V_VT(v) != (VT_I2|VT_BYREF)) { + return NULL; + } + return (jshort)*V_I2REF(v); + } + return NULL; +} + +JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getIntRef + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + if (V_VT(v) != (VT_I4|VT_BYREF)) { + return NULL; + } + return (jint)*V_I4REF(v); + } + return NULL; +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putShort + (JNIEnv *env, jobject _this, jshort s) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantClear(v); // whatever was there before + V_VT(v) = VT_I2; + V_I2(v) = (short)s; + } +} + +JNIEXPORT jshort JNICALL Java_com_jacob_com_Variant_getShort + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + if (V_VT(v) != VT_I2) { + return NULL; + } + return (jshort)V_I2(v); + } + return NULL; +} + +JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getDoubleRef + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + if (V_VT(v) != (VT_R8|VT_BYREF)) { + return NULL; + } + return (jdouble)*V_R8REF(v); + } + return NULL; +} + +JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getDateRef + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + if (V_VT(v) != (VT_DATE|VT_BYREF)) { + return NULL; + } + return (jdouble)*V_DATEREF(v); + } + return NULL; +} + +JNIEXPORT jstring JNICALL Java_com_jacob_com_Variant_getStringRef + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + if (V_VT(v) != (VT_BSTR|VT_BYREF)) { + return NULL; + } + BSTR *bs = V_BSTRREF(v); + jstring js = env->NewString(*bs, SysStringLen(*bs)); + return js; + } + return NULL; +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_VariantClear + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantClear(v); + } +} + +JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_toDispatch + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + HRESULT hr; + if (FAILED(hr = VariantChangeType(v, v, 0, VT_DISPATCH))) { + ThrowComFail(env, "VariantChangeType failed", hr); + return NULL; + } + jclass autoClass = env->FindClass("com/jacob/com/Dispatch"); + jmethodID autoCons = + env->GetMethodID(autoClass, "", "(I)V"); + // construct a Dispatch object to return + IDispatch *disp = V_DISPATCH(v); + // I am copying the pointer to java + if (disp) disp->AddRef(); + jobject newAuto = env->NewObject(autoClass, autoCons, disp); + return newAuto; + } + return NULL; +} + +JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_clone + (JNIEnv *env, jobject _this) +{ + return NULL; +} + +JNIEXPORT jstring JNICALL Java_com_jacob_com_Variant_toString + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + switch (V_VT(v)) + { + case VT_EMPTY: + case VT_NULL: + case VT_ERROR: + // causes VariantChangeType to bomb + return env->NewStringUTF("null"); + } + HRESULT hr; + if (FAILED(hr = VariantChangeType(v, v, 0, VT_BSTR))) { + // cannot change type to a string + return env->NewStringUTF("???"); + } + BSTR bs = V_BSTR(v); + jstring js = env->NewString(bs, SysStringLen(bs)); + return js; + } + return NULL; +} + +JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getInt + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + if (V_VT(v) != VT_I4) { + return NULL; + } + return (jint)V_I4(v); + } + return NULL; +} + +JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getDate + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + if (V_VT(v) != VT_DATE) { + return NULL; + } + return (jdouble)V_DATE(v); + } + return NULL; +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putInt + (JNIEnv *env, jobject _this, jint i) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantClear(v); // whatever was there before + V_VT(v) = VT_I4; + V_I4(v) = (int)i; + } +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putDate + (JNIEnv *env, jobject _this, jdouble date) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantClear(v); // whatever was there before + V_VT(v) = VT_DATE; + V_DATE(v) = date; + } +} + +JNIEXPORT jbyte JNICALL Java_com_jacob_com_Variant_toByte + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + HRESULT hr; + if (FAILED(hr = VariantChangeType(v, v, 0, VT_UI1))) { + ThrowComFail(env, "VariantChangeType failed", hr); + return NULL; + } + return (jbyte)V_UI1(v); + } + return NULL; +} + +JNIEXPORT jboolean JNICALL Java_com_jacob_com_Variant_getBoolean + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + if (V_VT(v) != (VT_BOOL)) { + return NULL; + } + return (jboolean)V_BOOL(v); + } + return NULL; +} + +JNIEXPORT jbyte JNICALL Java_com_jacob_com_Variant_getByte + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + if (V_VT(v) != (VT_UI1)) { + return NULL; + } + return (jbyte)V_UI1(v); + } + return NULL; +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putBoolean + (JNIEnv *env, jobject _this, jboolean b) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantClear(v); // whatever was there before + V_VT(v) = VT_BOOL; + V_BOOL(v) = b == JNI_TRUE ? VARIANT_TRUE : VARIANT_FALSE; + } + else ThrowComFail(env, "putBoolean failed", -1); +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putByte + (JNIEnv *env, jobject _this, jbyte b) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantClear(v); // whatever was there before + V_VT(v) = VT_UI1; + V_UI1(v) = b; + } + else ThrowComFail(env, "putByte failed", -1); +} + +JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_toError + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + HRESULT hr; + if (FAILED(hr = VariantChangeType(v, v, 0, VT_ERROR))) { + ThrowComFail(env, "VariantChangeType failed", hr); + return NULL; + } + return (jint)V_ERROR(v); + } + return NULL; +} + +JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_toObject + (JNIEnv *env, jobject _this) +{ + // not supported + return NULL; +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_getEmpty + (JNIEnv *env, jobject _this) +{ +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putEmpty + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantClear(v); // whatever was there before + V_VT(v) = VT_EMPTY; + } +} + +JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getError + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + if (V_VT(v) != VT_ERROR) { + return NULL; + } + return (jint)V_ERROR(v); + } + return NULL; +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putError + (JNIEnv *env, jobject _this, jint i) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantClear(v); // whatever was there before + V_VT(v) = VT_ERROR; + V_ERROR(v) = (int)i; + } +} + + +JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getDouble + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + if (V_VT(v) != VT_R8) { + return NULL; + } + return (jdouble)V_R8(v); + } + return NULL; +} + +JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_getObject + (JNIEnv *env, jobject _this) +{ + // not supported + return NULL; +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putCurrency + (JNIEnv *env, jobject _this, jlong cur) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantClear(v); // whatever was there before + CY pf; + pf.int64 = (LONGLONG)cur; + V_VT(v) = VT_CY; + V_CY(v) = pf; + } else ThrowComFail(env, "putCurrency failed", -1); +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putObject + (JNIEnv *env, jobject _this, jobject _that) +{ + VARIANT *v = extractVariant(env, _this); + IDispatch *disp = extractDispatch(env, _that); + if (disp && v) { + VariantClear(v); // whatever was there before + V_VT(v) = VT_DISPATCH; + V_DISPATCH(v) = disp; + // I am handing the pointer to COM + disp->AddRef(); + } else ThrowComFail(env, "putObject failed", -1); +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putDouble + (JNIEnv *env, jobject _this, jdouble d) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantClear(v); // whatever was there before + V_VT(v) = VT_R8; + V_R8(v) = (double)d; + } +} + +JNIEXPORT jlong JNICALL Java_com_jacob_com_Variant_getCurrency + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + if (V_VT(v) != VT_CY) { + return NULL; + } + CY cy; + cy = V_CY(v); + jlong jl; + memcpy(&jl, &cy, 64); + return jl; + } + return NULL; +} + + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putFloatRef + (JNIEnv *env, jobject _this, jfloat val) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantClear(v); // whatever was there before + float *pf = (float *)CoTaskMemAlloc(sizeof(float)); + *pf = val; + V_VT(v) = VT_R4|VT_BYREF; + V_R4REF(v) = pf; + } +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putCurrencyRef + (JNIEnv *env, jobject _this, jlong cur) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantClear(v); // whatever was there before + CY *pf = (CY *)CoTaskMemAlloc(sizeof(CY)); + memcpy(pf, &cur, 64); + V_VT(v) = VT_BYREF|VT_CY; + V_CYREF(v) = pf; + } +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putErrorRef + (JNIEnv *env, jobject _this, jint i) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantClear(v); // whatever was there before + V_VT(v) = VT_ERROR|VT_BYREF; + V_ERROR(v) = (int)i; + } +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putBooleanRef + (JNIEnv *env, jobject _this, jboolean b) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantClear(v); // whatever was there before + VARIANT_BOOL *br = (VARIANT_BOOL *)CoTaskMemAlloc(sizeof(VARIANT_BOOL)); + *br = b ? VARIANT_TRUE : VARIANT_FALSE; + V_VT(v) = VT_BOOL|VT_BYREF; + V_BOOLREF(v) = br; + } +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putByteRef + (JNIEnv *env, jobject _this, jbyte b) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantClear(v); // whatever was there before + unsigned char *br = (unsigned char *)CoTaskMemAlloc(sizeof(char)); + *br = b; + V_VT(v) = VT_UI1|VT_BYREF; + V_UI1REF(v) = br; + } +} + +JNIEXPORT jstring JNICALL Java_com_jacob_com_Variant_getString + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + if (V_VT(v) != VT_BSTR) { + return NULL; + } + BSTR bs = V_BSTR(v); + jstring js = env->NewString(bs, SysStringLen(bs)); + return js; + } + return NULL; +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putString + (JNIEnv *env, jobject _this, jstring s) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantClear(v); // whatever was there before + V_VT(v) = VT_BSTR; + + // get C-style byte array + jclass strcls = env->FindClass("java/lang/String"); + jmethodID getBytes = env->GetMethodID(strcls, "getBytes", "()[B"); + jbyteArray ba = (jbyteArray)env->CallObjectMethod(s, getBytes); + int len = env->GetArrayLength(ba); + jbyte* buf = (jbyte*)alloca(len + 1); + env->GetByteArrayRegion(ba, 0, len, buf); + buf[len] = '\0'; + + CComBSTR bs((char*)buf); + V_VT(v) = VT_BSTR; + V_BSTR(v) = bs.Copy(); + } +} + +JNIEXPORT jfloat JNICALL Java_com_jacob_com_Variant_getFloatRef + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + if (V_VT(v) != (VT_R4|VT_BYREF)) { + return NULL; + } + return (jfloat)*V_R4REF(v); + } + return NULL; +} + +JNIEXPORT jlong JNICALL Java_com_jacob_com_Variant_getCurrencyRef + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + if (V_VT(v) != (VT_CY|VT_BYREF)) { + return NULL; + } + CY *cy; + cy = V_CYREF(v); + jlong jl; + memcpy(&jl, cy, 64); + return jl; + } + return NULL; +} + +JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getErrorRef + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + if (V_VT(v) != (VT_ERROR|VT_BYREF)) { + return NULL; + } + return (jint)V_ERROR(v); + } + return NULL; +} + +JNIEXPORT jboolean JNICALL Java_com_jacob_com_Variant_getBooleanRef + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + if (V_VT(v) != (VT_BOOL|VT_BYREF)) { + return NULL; + } + return (jboolean)*V_BOOLREF(v); + } + return NULL; +} + +JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_getObjectRef + (JNIEnv *env, jobject _this) +{ + return NULL; +} + + +JNIEXPORT jbyte JNICALL Java_com_jacob_com_Variant_getByteRef + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + if (V_VT(v) != (VT_UI1|VT_BYREF)) { + return NULL; + } + return (jbyte)*V_UI1REF(v); + } + return NULL; +} + +JNIEXPORT jfloat JNICALL Java_com_jacob_com_Variant_toFloat + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + HRESULT hr; + if (FAILED(hr = VariantChangeType(v, v, 0, VT_R4))) { + ThrowComFail(env, "VariantChangeType failed", hr); + return NULL; + } + return (jfloat)V_R4(v); + } + return NULL; +} + +JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_toSafeArray + (JNIEnv *env, jobject _this, jboolean deepCopy) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + if ((V_VT(v) & VT_ARRAY) == 0) + { + ThrowComFail(env, "Variant not array", -1); + return NULL; + } + // prepare a new sa obj + jclass saClass = env->FindClass("com/jacob/com/SafeArray"); + jmethodID saCons = env->GetMethodID(saClass, "", "()V"); + // construct an SA to return + jobject newSA = env->NewObject(saClass, saCons); + // pass in the deep copy indicator + setSA(env, newSA, V_ARRAY(v), deepCopy == JNI_TRUE ? 1 : 0); + return newSA; + } + return NULL; +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putSafeArrayRef + (JNIEnv *env, jobject _this, jobject sa) +{ + SAFEARRAY *psa = extractSA(env, sa); + if (psa) + { + VARIANT *v = extractVariant(env, _this); + if (v) { + VARTYPE vt; + SAFEARRAY **sa = (SAFEARRAY **)CoTaskMemAlloc(sizeof(SAFEARRAY*)); + *sa = psa; + SafeArrayGetVartype(psa, &vt); + V_VT(v) = VT_ARRAY | vt | VT_BYREF; + V_ARRAYREF(v) = sa; + return; + } + ThrowComFail(env, "Can't get variant pointer", -1); + return; + } + ThrowComFail(env, "Can't get sa pointer", -1); + return; +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putSafeArray + (JNIEnv *env, jobject _this, jobject sa) +{ + SAFEARRAY *psa = extractSA(env, sa); + if (psa) + { + VARIANT *v = extractVariant(env, _this); + if (v) { + VARTYPE vt; + SafeArrayGetVartype(psa, &vt); + V_VT(v) = VT_ARRAY | vt; + V_ARRAY(v) = psa; + return; + } + ThrowComFail(env, "Can't get variant pointer", -1); + return; + } + ThrowComFail(env, "Can't get sa pointer", -1); + return; +} + + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_noParam + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + V_VT(v) = VT_ERROR; + V_ERROR(v) = DISP_E_PARAMNOTFOUND; + } +} + +JNIEXPORT jfloat JNICALL Java_com_jacob_com_Variant_getFloat + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + if (V_VT(v) != (VT_R4)) { + return NULL; + } + return (jfloat)V_R4(v); + } + return NULL; +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putFloat + (JNIEnv *env, jobject _this, jfloat val) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantClear(v); // whatever was there before + V_VT(v) = VT_R4; + V_R4(v) = val; + } +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_changeType + (JNIEnv *env, jobject _this, jshort t) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantChangeType(v, v, 0, t); + } +} + +JNIEXPORT jshort JNICALL Java_com_jacob_com_Variant_getvt + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + return (jshort)V_VT(v); + } + return NULL; +} + +JNIEXPORT jshort JNICALL Java_com_jacob_com_Variant_toShort + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + HRESULT hr; + if (FAILED(hr = VariantChangeType(v, v, 0, VT_I2))) { + ThrowComFail(env, "VariantChangeType failed", hr); + return NULL; + } + return (jshort)V_I2(v); + } + return NULL; +} + +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putSafeArrayRefHelper + (JNIEnv *env, jobject _this, jint pSA) +{ + VARIANT *v = extractVariant(env, _this); + if (v) { + VariantClear(v); // whatever was there before + } +} + +JNIEXPORT jboolean JNICALL Java_com_jacob_com_Variant_isNull + (JNIEnv *env, jobject _this) +{ + VARIANT *v = extractVariant(env, _this); + if (!v) return JNI_TRUE; + if ((V_VT(v) & VT_ARRAY)) + { + // is it a null safearray + if ((V_VT(v) & VT_BYREF)) + if (!V_ARRAYREF(v)) return JNI_TRUE; + else + if (!V_ARRAY(v)) return JNI_TRUE; + } + switch (V_VT(v)) + { + case VT_EMPTY: + case VT_NULL: + case VT_ERROR: + return JNI_TRUE; + // is it a null dispatch (Nothing in VB) + case VT_DISPATCH: + if (!V_DISPATCH(v)) return JNI_TRUE; + } + return JNI_FALSE; +} + +} diff --git a/jni/Variant.h b/jni/Variant.h index 09f1288..0efa10b 100644 --- a/jni/Variant.h +++ b/jni/Variant.h @@ -1,613 +1,613 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_jacob_com_Variant */ - -#ifndef _Included_com_jacob_com_Variant -#define _Included_com_jacob_com_Variant -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jacob_com_Variant - * Method: toInt - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_toInt - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: toDate - * Signature: ()D - */ -JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_toDate - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: toBoolean - * Signature: ()Z - */ -JNIEXPORT jboolean JNICALL Java_com_jacob_com_Variant_toBoolean - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: toEnumVariant - * Signature: ()Lcom/jacob/com/EnumVariant; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_toEnumVariant - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getNull - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_getNull - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putNull - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putNull - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: cloneIndirect - * Signature: ()Lcom_jacob_com_Variant; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_cloneIndirect - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: toDouble - * Signature: ()D - */ -JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_toDouble - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: toCurrency - * Signature: ()J - */ -JNIEXPORT jlong JNICALL Java_com_jacob_com_Variant_toCurrency - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putShortRef - * Signature: (S)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putShortRef - (JNIEnv *, jobject, jshort); - -/* - * Class: com_jacob_com_Variant - * Method: putIntRef - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putIntRef - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_Variant - * Method: putDoubleRef - * Signature: (D)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putDoubleRef - (JNIEnv *, jobject, jdouble); - -/* - * Class: com_jacob_com_Variant - * Method: putDateRef - * Signature: (D)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putDateRef - (JNIEnv *, jobject, jdouble); - -/* - * Class: com_jacob_com_Variant - * Method: putStringRef - * Signature: (Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putStringRef - (JNIEnv *, jobject, jstring); - -/* - * Class: com_jacob_com_Variant - * Method: getShortRef - * Signature: ()S - */ -JNIEXPORT jshort JNICALL Java_com_jacob_com_Variant_getShortRef - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getIntRef - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getIntRef - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putShort - * Signature: (S)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putShort - (JNIEnv *, jobject, jshort); - -/* - * Class: com_jacob_com_Variant - * Method: getShort - * Signature: ()S - */ -JNIEXPORT jshort JNICALL Java_com_jacob_com_Variant_getShort - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getDoubleRef - * Signature: ()D - */ -JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getDoubleRef - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getDateRef - * Signature: ()D - */ -JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getDateRef - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getStringRef - * Signature: ()Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_com_jacob_com_Variant_getStringRef - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: com_jacob_com_VariantClear - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_com_jacob_com_VariantClear - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: toDispatch - * Signature: ()LDispatch; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_toDispatch - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: clone - * Signature: ()Ljava/lang/Object; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_clone - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: toString - * Signature: ()Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_com_jacob_com_Variant_toString - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getInt - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getInt - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getDate - * Signature: ()D - */ -JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getDate - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putInt - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putInt - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_Variant - * Method: putDate - * Signature: (D)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putDate - (JNIEnv *, jobject, jdouble); - -/* - * Class: com_jacob_com_Variant - * Method: toByte - * Signature: ()B - */ -JNIEXPORT jbyte JNICALL Java_com_jacob_com_Variant_toByte - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getBoolean - * Signature: ()Z - */ -JNIEXPORT jboolean JNICALL Java_com_jacob_com_Variant_getBoolean - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getByte - * Signature: ()B - */ -JNIEXPORT jbyte JNICALL Java_com_jacob_com_Variant_getByte - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putBoolean - * Signature: (Z)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putBoolean - (JNIEnv *, jobject, jboolean); - -/* - * Class: com_jacob_com_Variant - * Method: putByte - * Signature: (B)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putByte - (JNIEnv *, jobject, jbyte); - -/* - * Class: com_jacob_com_Variant - * Method: toError - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_toError - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: toObject - * Signature: ()Ljava/lang/Object; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_toObject - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getEmpty - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_getEmpty - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putEmpty - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putEmpty - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getError - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getError - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putError - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putError - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_Variant - * Method: getDouble - * Signature: ()D - */ -JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getDouble - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getObject - * Signature: ()Ljava/lang/Object; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_getObject - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putCurrency - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putCurrency - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jacob_com_Variant - * Method: putObject - * Signature: (Ljava/lang/Object;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putObject - (JNIEnv *, jobject, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putDouble - * Signature: (D)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putDouble - (JNIEnv *, jobject, jdouble); - -/* - * Class: com_jacob_com_Variant - * Method: getCurrency - * Signature: ()J - */ -JNIEXPORT jlong JNICALL Java_com_jacob_com_Variant_getCurrency - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putFloatRef - * Signature: (F)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putFloatRef - (JNIEnv *, jobject, jfloat); - -/* - * Class: com_jacob_com_Variant - * Method: putCurrencyRef - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putCurrencyRef - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jacob_com_Variant - * Method: putErrorRef - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putErrorRef - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_Variant - * Method: putBooleanRef - * Signature: (Z)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putBooleanRef - (JNIEnv *, jobject, jboolean); - -/* - * Class: com_jacob_com_Variant - * Method: putObjectRef - * Signature: (Ljava/lang/Object;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putObjectRef - (JNIEnv *, jobject, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putByteRef - * Signature: (B)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putByteRef - (JNIEnv *, jobject, jbyte); - -/* - * Class: com_jacob_com_Variant - * Method: getString - * Signature: ()Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_com_jacob_com_Variant_getString - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putString - * Signature: (Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putString - (JNIEnv *, jobject, jstring); - -/* - * Class: com_jacob_com_Variant - * Method: getFloatRef - * Signature: ()F - */ -JNIEXPORT jfloat JNICALL Java_com_jacob_com_Variant_getFloatRef - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getCurrencyRef - * Signature: ()J - */ -JNIEXPORT jlong JNICALL Java_com_jacob_com_Variant_getCurrencyRef - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getErrorRef - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getErrorRef - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getBooleanRef - * Signature: ()Z - */ -JNIEXPORT jboolean JNICALL Java_com_jacob_com_Variant_getBooleanRef - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getObjectRef - * Signature: ()Ljava/lang/Object; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_getObjectRef - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getByteRef - * Signature: ()B - */ -JNIEXPORT jbyte JNICALL Java_com_jacob_com_Variant_getByteRef - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: toFloat - * Signature: ()F - */ -JNIEXPORT jfloat JNICALL Java_com_jacob_com_Variant_toFloat - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: toSafeArray - * Signature: (Z)Lcom/jacob/com/SafeArray; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_toSafeArray - (JNIEnv *, jobject, jboolean); - -/* - * Class: com_jacob_com_Variant - * Method: putSafeArrayRef - * Signature: (LSafeArray;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putSafeArrayRef - (JNIEnv *, jobject, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putSafeArray - * Signature: (LSafeArray;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putSafeArray - (JNIEnv *, jobject, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: noParam - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_noParam - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getFloat - * Signature: ()F - */ -JNIEXPORT jfloat JNICALL Java_com_jacob_com_Variant_getFloat - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putFloat - * Signature: (F)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putFloat - (JNIEnv *, jobject, jfloat); - -/* - * Class: com_jacob_com_Variant - * Method: changeType - * Signature: (S)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_changeType - (JNIEnv *, jobject, jshort); - -/* - * Class: com_jacob_com_Variant - * Method: getvt - * Signature: ()S - */ -JNIEXPORT jshort JNICALL Java_com_jacob_com_Variant_getvt - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: toShort - * Signature: ()S - */ -JNIEXPORT jshort JNICALL Java_com_jacob_com_Variant_toShort - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: release - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_release - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: init - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_init - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: Save - * Signature: (Ljava/io/OutputStream;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_Save - (JNIEnv *, jobject, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: Load - * Signature: (Ljava/io/InputStream;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_Load - (JNIEnv *, jobject, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: isNull - * Signature: ()Z - */ -JNIEXPORT jboolean JNICALL Java_com_jacob_com_Variant_isNull - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_jacob_com_Variant */ + +#ifndef _Included_com_jacob_com_Variant +#define _Included_com_jacob_com_Variant +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_jacob_com_Variant + * Method: toInt + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_toInt + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: toDate + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_toDate + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: toBoolean + * Signature: ()Z + */ +JNIEXPORT jboolean JNICALL Java_com_jacob_com_Variant_toBoolean + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: toEnumVariant + * Signature: ()Lcom/jacob/com/EnumVariant; + */ +JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_toEnumVariant + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: getNull + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_getNull + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: putNull + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putNull + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: cloneIndirect + * Signature: ()Lcom_jacob_com_Variant; + */ +JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_cloneIndirect + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: toDouble + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_toDouble + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: toCurrency + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_com_jacob_com_Variant_toCurrency + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: putShortRef + * Signature: (S)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putShortRef + (JNIEnv *, jobject, jshort); + +/* + * Class: com_jacob_com_Variant + * Method: putIntRef + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putIntRef + (JNIEnv *, jobject, jint); + +/* + * Class: com_jacob_com_Variant + * Method: putDoubleRef + * Signature: (D)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putDoubleRef + (JNIEnv *, jobject, jdouble); + +/* + * Class: com_jacob_com_Variant + * Method: putDateRef + * Signature: (D)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putDateRef + (JNIEnv *, jobject, jdouble); + +/* + * Class: com_jacob_com_Variant + * Method: putStringRef + * Signature: (Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putStringRef + (JNIEnv *, jobject, jstring); + +/* + * Class: com_jacob_com_Variant + * Method: getShortRef + * Signature: ()S + */ +JNIEXPORT jshort JNICALL Java_com_jacob_com_Variant_getShortRef + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: getIntRef + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getIntRef + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: putShort + * Signature: (S)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putShort + (JNIEnv *, jobject, jshort); + +/* + * Class: com_jacob_com_Variant + * Method: getShort + * Signature: ()S + */ +JNIEXPORT jshort JNICALL Java_com_jacob_com_Variant_getShort + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: getDoubleRef + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getDoubleRef + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: getDateRef + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getDateRef + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: getStringRef + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_com_jacob_com_Variant_getStringRef + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: com_jacob_com_VariantClear + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_com_jacob_com_VariantClear + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: toDispatch + * Signature: ()LDispatch; + */ +JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_toDispatch + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: clone + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_clone + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: toString + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_com_jacob_com_Variant_toString + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: getInt + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getInt + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: getDate + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getDate + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: putInt + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putInt + (JNIEnv *, jobject, jint); + +/* + * Class: com_jacob_com_Variant + * Method: putDate + * Signature: (D)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putDate + (JNIEnv *, jobject, jdouble); + +/* + * Class: com_jacob_com_Variant + * Method: toByte + * Signature: ()B + */ +JNIEXPORT jbyte JNICALL Java_com_jacob_com_Variant_toByte + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: getBoolean + * Signature: ()Z + */ +JNIEXPORT jboolean JNICALL Java_com_jacob_com_Variant_getBoolean + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: getByte + * Signature: ()B + */ +JNIEXPORT jbyte JNICALL Java_com_jacob_com_Variant_getByte + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: putBoolean + * Signature: (Z)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putBoolean + (JNIEnv *, jobject, jboolean); + +/* + * Class: com_jacob_com_Variant + * Method: putByte + * Signature: (B)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putByte + (JNIEnv *, jobject, jbyte); + +/* + * Class: com_jacob_com_Variant + * Method: toError + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_toError + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: toObject + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_toObject + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: getEmpty + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_getEmpty + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: putEmpty + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putEmpty + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: getError + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getError + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: putError + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putError + (JNIEnv *, jobject, jint); + +/* + * Class: com_jacob_com_Variant + * Method: getDouble + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getDouble + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: getObject + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_getObject + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: putCurrency + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putCurrency + (JNIEnv *, jobject, jlong); + +/* + * Class: com_jacob_com_Variant + * Method: putObject + * Signature: (Ljava/lang/Object;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putObject + (JNIEnv *, jobject, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: putDouble + * Signature: (D)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putDouble + (JNIEnv *, jobject, jdouble); + +/* + * Class: com_jacob_com_Variant + * Method: getCurrency + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_com_jacob_com_Variant_getCurrency + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: putFloatRef + * Signature: (F)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putFloatRef + (JNIEnv *, jobject, jfloat); + +/* + * Class: com_jacob_com_Variant + * Method: putCurrencyRef + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putCurrencyRef + (JNIEnv *, jobject, jlong); + +/* + * Class: com_jacob_com_Variant + * Method: putErrorRef + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putErrorRef + (JNIEnv *, jobject, jint); + +/* + * Class: com_jacob_com_Variant + * Method: putBooleanRef + * Signature: (Z)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putBooleanRef + (JNIEnv *, jobject, jboolean); + +/* + * Class: com_jacob_com_Variant + * Method: putObjectRef + * Signature: (Ljava/lang/Object;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putObjectRef + (JNIEnv *, jobject, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: putByteRef + * Signature: (B)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putByteRef + (JNIEnv *, jobject, jbyte); + +/* + * Class: com_jacob_com_Variant + * Method: getString + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_com_jacob_com_Variant_getString + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: putString + * Signature: (Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putString + (JNIEnv *, jobject, jstring); + +/* + * Class: com_jacob_com_Variant + * Method: getFloatRef + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_com_jacob_com_Variant_getFloatRef + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: getCurrencyRef + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_com_jacob_com_Variant_getCurrencyRef + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: getErrorRef + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getErrorRef + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: getBooleanRef + * Signature: ()Z + */ +JNIEXPORT jboolean JNICALL Java_com_jacob_com_Variant_getBooleanRef + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: getObjectRef + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_getObjectRef + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: getByteRef + * Signature: ()B + */ +JNIEXPORT jbyte JNICALL Java_com_jacob_com_Variant_getByteRef + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: toFloat + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_com_jacob_com_Variant_toFloat + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: toSafeArray + * Signature: (Z)Lcom/jacob/com/SafeArray; + */ +JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_toSafeArray + (JNIEnv *, jobject, jboolean); + +/* + * Class: com_jacob_com_Variant + * Method: putSafeArrayRef + * Signature: (LSafeArray;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putSafeArrayRef + (JNIEnv *, jobject, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: putSafeArray + * Signature: (LSafeArray;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putSafeArray + (JNIEnv *, jobject, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: noParam + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_noParam + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: getFloat + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_com_jacob_com_Variant_getFloat + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: putFloat + * Signature: (F)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putFloat + (JNIEnv *, jobject, jfloat); + +/* + * Class: com_jacob_com_Variant + * Method: changeType + * Signature: (S)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_changeType + (JNIEnv *, jobject, jshort); + +/* + * Class: com_jacob_com_Variant + * Method: getvt + * Signature: ()S + */ +JNIEXPORT jshort JNICALL Java_com_jacob_com_Variant_getvt + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: toShort + * Signature: ()S + */ +JNIEXPORT jshort JNICALL Java_com_jacob_com_Variant_toShort + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: release + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_release + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: init + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_init + (JNIEnv *, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: Save + * Signature: (Ljava/io/OutputStream;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_Save + (JNIEnv *, jobject, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: Load + * Signature: (Ljava/io/InputStream;)V + */ +JNIEXPORT void JNICALL Java_com_jacob_com_Variant_Load + (JNIEnv *, jobject, jobject); + +/* + * Class: com_jacob_com_Variant + * Method: isNull + * Signature: ()Z + */ +JNIEXPORT jboolean JNICALL Java_com_jacob_com_Variant_isNull + (JNIEnv *, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/jni/util.cpp b/jni/util.cpp index fcbaaba..7f99f11 100644 --- a/jni/util.cpp +++ b/jni/util.cpp @@ -1,69 +1,69 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Redistributions in any form must be accompanied by information on - * how to obtain complete source code for the JACOB software. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include "Dispatch.h" -// Win32 support for Ole Automation -#include -#include -#include -#include -#include -#include -#include "util.h" - -extern "C" -{ - -void ThrowComFail(JNIEnv *env, const char* desc, jint hr) -{ - jclass failClass = env->FindClass("com/jacob/com/ComFailException"); - // call the constructor that takes hr and message - jmethodID failCons = - env->GetMethodID(failClass, "", "(ILjava/lang/String;)V"); - if (!desc) desc = "Java/COM Error"; - jstring js = env->NewStringUTF(desc); - jthrowable fail = (jthrowable)env->NewObject(failClass, failCons, hr, js); - env->Throw(fail); -} - -// if env's are different throw on the 1st env -int CheckEnv(JNIEnv *env1, JNIEnv *env2) -{ - if (env1 != env2) { - jclass failClass = env1->FindClass("com/jacob/com/WrongThreadException"); - // call the constructor that takes hr and message - jmethodID failCons = - env1->GetMethodID(failClass, "", "()V"); - env1->ThrowNew(failClass, "Wrong Thread"); - return 0; - } - return 1; -} - -} +/* + * Copyright (c) 1999-2004 Sourceforge JACOB Project. + * All rights reserved. Originator: Dan Adler (http://danadler.com). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Redistributions in any form must be accompanied by information on + * how to obtain complete source code for the JACOB software. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "Dispatch.h" +// Win32 support for Ole Automation +#include +#include +#include +#include +#include +#include +#include "util.h" + +extern "C" +{ + +void ThrowComFail(JNIEnv *env, const char* desc, jint hr) +{ + jclass failClass = env->FindClass("com/jacob/com/ComFailException"); + // call the constructor that takes hr and message + jmethodID failCons = + env->GetMethodID(failClass, "", "(ILjava/lang/String;)V"); + if (!desc) desc = "Java/COM Error"; + jstring js = env->NewStringUTF(desc); + jthrowable fail = (jthrowable)env->NewObject(failClass, failCons, hr, js); + env->Throw(fail); +} + +// if env's are different throw on the 1st env +int CheckEnv(JNIEnv *env1, JNIEnv *env2) +{ + if (env1 != env2) { + jclass failClass = env1->FindClass("com/jacob/com/WrongThreadException"); + // call the constructor that takes hr and message + jmethodID failCons = + env1->GetMethodID(failClass, "", "()V"); + env1->ThrowNew(failClass, "Wrong Thread"); + return 0; + } + return 1; +} + +} diff --git a/jni/util.h b/jni/util.h index 6595374..2ef9170 100644 --- a/jni/util.h +++ b/jni/util.h @@ -1,8 +1,8 @@ -#include -extern "C" { - VARIANT *extractVariant(JNIEnv *env, jobject arg); - void ThrowComFail(JNIEnv *env, const char* desc, jint hr); - IDispatch *extractDispatch(JNIEnv *env, jobject arg); - SAFEARRAY *extractSA(JNIEnv *env, jobject arg); - void setSA(JNIEnv *env, jobject arg, SAFEARRAY *sa, int copy); -} +#include +extern "C" { + VARIANT *extractVariant(JNIEnv *env, jobject arg); + void ThrowComFail(JNIEnv *env, const char* desc, jint hr); + IDispatch *extractDispatch(JNIEnv *env, jobject arg); + SAFEARRAY *extractSA(JNIEnv *env, jobject arg); + void setSA(JNIEnv *env, jobject arg, SAFEARRAY *sa, int copy); +}