dims 2002/12/06 10:17:42
Added: proposals/COMBridge deploy.wsdd
proposals/COMBridge/CPP COMBridge.cpp COMBridge.dep
COMBridge.dsp COMBridge.dsw COMBridge.h
COMBridge.ncb COMBridge.opt COMBridge.plg
org_apache_axis_components_bridge_COMBridge.h
proposals/COMBridge/CPP/Debug COMBridge.dll
proposals/COMBridge/java/org/apache/axis/components/bridge
COMBridge.java
Log:
Porting COMProvider in Apache SOAP to Apache Axis (Stripped down, componentized and
renamed to COMBridge)
Note:
- Since this has a mixture of C++ and java code. Am adding this to Proposals
directory.
Revision Changes Path
1.1 xml-axis/proposals/COMBridge/deploy.wsdd
Index: deploy.wsdd
===================================================================
<deployment
xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="comadd" provider="java:COM" style="rpc" use="encoded">
<parameter name="ProgID" value="Apacheadder.adder"/>
<parameter name="wsdlTargetNamespace" value="urn:javascript"/>
<parameter name="wsdlServiceElement" value="JSService"/>
<parameter name="wsdlServicePort" value="add"/>
<parameter name="wsdlPortType" value="add"/>
<operation name="add" qname="operNS:add"
xmlns:operNS="http://DefaultNamespace" returnQName="addReturn" returnType="rtns:short"
xmlns:rtns="http://www.w3.org/2001/XMLSchema" >
<parameter name="in0" type="tns:short"
xmlns:tns="http://www.w3.org/2001/XMLSchema"/>
<parameter name="in1" type="tns:short"
xmlns:tns="http://www.w3.org/2001/XMLSchema"/>
</operation>
<parameter name="allowedMethods" value="add"/>
</service>
</deployment>
1.1 xml-axis/proposals/COMBridge/CPP/COMBridge.cpp
Index: COMBridge.cpp
===================================================================
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "SOAP" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
* ITS 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.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation and was
* originally based on software copyright (c) 2001, International
* Business Machines, Inc., http://www.apache.org. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
#pragma warning(disable:4786) /*Very annoying warning that symbol exceeds debug info
size */
#include <cstdlib>
#include <sstream>
#include <string.h>
#include <iostream>
#include <deque>
#include <string>
#include <cassert>
#include <new>
#include <new.h>
#include <algorithm>
#include <jni.h>
#include <process.h>
#include <windows.h>
#include <objbase.h>
#include "COMBridge.h"
using namespace std;
HRESULT variant2object (JNIEnv * jenv, const VARIANT & var, jobject & ret,
bool * localRefCreated = NULL);
wchar_t ModuleName[MAX_PATH * 2] = { 0 };
HANDLE thisModule;
BOOL WINAPI
DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID fImpLoad)
{
if (fdwReason == DLL_PROCESS_ATTACH)
{
thisModule = hinstDll;
GetModuleFileName (hinstDll, ModuleName, sizeof ModuleName);
}
return true;
}
void
dumpVariant (VARIANT & v)
{
switch (v.vt)
{
case VT_I4:
fwprintf (stderr, L"Integer: %d\n", v.lVal);
break;
case VT_BSTR:
fwprintf (stderr, L"BStr: %s\n", v.bstrVal);
break;
case VT_BOOL:
fwprintf (stderr, L"Boolean: %d\n", v.boolVal);
break;
}
}
/*These can someday go into a msg resource file for NLS translation */
int msgCLSID2stringfailed =
(int) L"Failed to convert string to clsid hr= 0x%1!lx!";
int msgNoParms = (int) L"The number of parameters I got is: %1!u!";
int msgComInitfailed = (int) L"COM Initialize failed hr= 0x%1!lx!";
int msgCLSIDnMethod = (int) L"CLSID is:%1, method to execute is:%2";
int msgPROGIDnMethod = (int) L"Progid is:%1, method to execute is:%2";
int msgPROGID2CLSID = (int) L"Failed to convert progid to clsid hr= 0x%1!lx!";
int msgFailedCoCreate =
(int) L"Failed to create instance and interface IID_Dispatch hr=0x%1!lx!";
int msgFailedGetdipid = (int) L"Failed to get dispid for method %1";
int msgFailedDIInvoke = (int) L"Invoke of method %1 failed. hr=0x%2!lx!";
int msgSuccess = (int) L"Success! Return back to java.";
int msgCoTaskMemAllocFail =
(int) L"Insufficient resources CoTaskMemAlloc failed.";
int msgCalledDLL = (int) L"In DLL:%1!s!";
int msgInvokeFailedParms =
(int)
L"COMBridge: method:%1!s! received error %2!lu!. Error source: %3!ls!\t.
Description:%4!s!";
int msgInvokeFailedParms2 =
(int) L"Bad argument:%1!lu! method %2!ls!. hr=0x%3!lx!";
int msgInvokeFailed = (int) L"Invoke of method %1!s! failed. hr=0x%2!lx!";
int msgUnknowCPPException = (int) L"An unknown CPP exception has occurred";
int msgFailedConvertReturn =
(int)
L"Failed to convert return parameter, variant type:0x%1!lx!, Object:%2!s!,
Method:%3!s!";
int msgFailedMemory = (int) L"Failed to allocate memory!";
const short LOG_INFORMATION = 0x1000;
const short LOG_SUCCESS = 0x100;
const short LOG_WARNING = 0x10;
const short LOG_ERROR = 1;
short eventLevel = LOG_ERROR;
/*
* Undoes an action when exiting scope.
*/
struct Undoit
{
void (__stdcall * coinit) (void);
IDispatch *idisp;
VARIANT *vp;
~Undoit ()
{
if (NULL != idisp)
{
idisp->Release ();
idisp = NULL;
}
if (NULL != vp)
{
CoTaskMemFree (vp);
vp = NULL;
}
if (NULL != coinit)
{
coinit ();
coinit = NULL;
}
}
};
/*
* The actual provider.
*/
class COMBridge
{
jobject jPP; //the java pluggable provider
JNIEnv *env;
static const char *javaClass;
public:
/*
* Constructor that initializes member variables.
*/
COMBridge (JNIEnv * e, jobject jthis):jPP (jthis), env (e)
{
};
/*
* Gets the dispatch type to handle property get/set as
* well as straight method calls.
*/
WORD getMethodDispatchType (const wchar_t * mname)
{
WORD ret = DISPATCH_METHOD;
if (0 == wcsncmp (L"get_", mname, 4))
ret = DISPATCH_PROPERTYGET;
else if (0 == wcsncmp (L"set_", mname, 4))
ret = DISPATCH_PROPERTYPUT;
return ret;
}
/*
* Invokes a method on a COM object, translating parameters and results
* between Java types and COM types.
*/
jobject invoke (jstring jthreadingModel, jstring jprogid,
jstring jmethodName, jbyteArray parms_in)
{
eventlog (LOG_SUCCESS, msgCalledDLL, ModuleName);
wchar_t progid[256];
Undoit undoit;
ZeroIt (undoit);
//
// Get a local copy of parameters. The Java code for the
// Bridge has already munged the Java parameters into the
// byte array (which is really a VARIANT array) we use here.
//
jsize noParmsBytes =
NULL == parms_in ? 0 : env->GetArrayLength (parms_in);
unsigned noParms = noParmsBytes / sizeof VARIANT;
eventlog (LOG_SUCCESS, msgNoParms, noParms);
char *x = NULL;
if (noParms)
{
x = (char *) CoTaskMemAlloc (noParmsBytes);
if (NULL == x)
{
throwException (msgCoTaskMemAllocFail);
return NULL;
}
memset (x, 0, noParmsBytes);
jboolean iscopy;
jbyte *jpeer = env->GetByteArrayElements (parms_in, &iscopy);
memcpy (x, jpeer, noParmsBytes);
if (iscopy == JNI_TRUE)
env->ReleaseByteArrayElements (parms_in, jpeer, 0);
}
// VARIANT *vp= (VARIANT *)x;
undoit.vp = (VARIANT *) x;
/*
for(int i=0; i< noParms; ++i)
{
dumpVariant(vp[i]);
}
*/
//
// Initialize COM
//
DWORD coInit = COINIT_MULTITHREADED; //The default.
bool oleInit = false;
jboolean isCopy;
wchar_t *cstr =
(wchar_t *) env->GetStringChars (jthreadingModel, &isCopy);
if (0 == wcscmp (cstr, L"MULTITHREADED"))
{ //just
coInit = COINIT_MULTITHREADED; //Just recognize it.
}
else if (0 == wcscmp (cstr, L"APARTMENTTHREADED"))
{
coInit = COINIT_APARTMENTTHREADED;
}
else if (0 == wcscmp (cstr, L"SINGLEAPARTMENTTHREADED"))
{
oleInit = true;
}
if (isCopy == JNI_TRUE)
env->ReleaseStringChars (jthreadingModel, cstr);
HRESULT hr;
if (oleInit)
{
hr = OleInitialize (NULL);
if (ASSERT_FAILED (hr))
{
eventlog (LOG_WARNING, msgComInitfailed, hr);
throwException (msgComInitfailed, hr);
return NULL;
}
undoit.coinit = OleUninitialize; //Ensure we uninitialize.
}
else
{
hr = CoInitializeEx (NULL, coInit);
if (ASSERT_FAILED (hr))
{
eventlog (LOG_WARNING, msgComInitfailed, hr);
throwException (msgComInitfailed, hr);
return NULL;
}
undoit.coinit = CoUninitialize; //Ensure we uninitialize.
}
//
// Get the method name
//
cstr = (wchar_t *) env->GetStringChars (jmethodName, &isCopy);
wchar_t *methodName = _wcsdup (cstr);
if (isCopy == JNI_TRUE)
env->ReleaseStringChars (jmethodName, cstr);
if (!methodName)
{
eventlog (LOG_ERROR, msgFailedMemory);
throwException (msgFailedMemory);
return NULL;
}
//
// Get the CLSID
//
CLSID clsid;
cstr = (wchar_t *) env->GetStringChars (jprogid, &isCopy);
if (L'{' == cstr[0]) //clsid is specified as a string
{
hr = CLSIDFromString (cstr, &clsid);
if (ASSERT_FAILED (hr))
{
throwException (msgCLSID2stringfailed, hr);
if (isCopy == JNI_TRUE)
env->ReleaseStringChars (jprogid, cstr);
if (methodName)
free (methodName);
return NULL;
}
eventlog (LOG_INFORMATION, msgCLSIDnMethod, cstr, methodName);
}
else
{
eventlog (LOG_INFORMATION, msgPROGIDnMethod, cstr, methodName);
hr = CLSIDFromProgID (cstr, &clsid);
if (ASSERT_FAILED (hr))
{
eventlog (LOG_WARNING, msgPROGID2CLSID, hr);
if (isCopy == JNI_TRUE)
env->ReleaseStringChars (jprogid, cstr);
throwException (msgPROGID2CLSID, hr);
if (methodName)
free (methodName);
return NULL;
}
}
ZeroIt (progid);
wcsncpy (progid, cstr, (sizeof (progid) / (sizeof progid[0])) - 1);
if (isCopy == JNI_TRUE)
env->ReleaseStringChars (jprogid, cstr);
//
// Create an instance of the COM object
//
hr =
CoCreateInstance (clsid, NULL, CLSCTX_ALL, IID_IDispatch,
(void **) &undoit.idisp);
if (ASSERT_FAILED (hr))
{
eventlog (LOG_WARNING, msgFailedCoCreate, hr);
throwException (msgFailedCoCreate, hr);
if (methodName)
free (methodName);
return NULL;
}
//
// Get the dispatch id of the method
//
DISPID dispid;
ZeroIt (dispid);
bool isSet = false;
unsigned nameOffset = 0;
if (0 == wcsncmp (L"get_", methodName, 4))
nameOffset = 4;
else if (0 == wcsncmp (L"set_", methodName, 4))
{
nameOffset = 4;
isSet = true;
}
wchar_t *mname = methodName + nameOffset;
hr =
undoit.idisp->GetIDsOfNames (IID_NULL, &mname, 1, GetUserDefaultLCID (),
&dispid);
if (ASSERT_FAILED (hr))
{
eventlog (LOG_WARNING, msgFailedGetdipid, methodName);
throwException (msgFailedGetdipid, methodName);
if (methodName)
free (methodName);
return NULL;
}
//
// Initialize the parameter info
//
DISPPARAMS dispparams;
ZeroIt (dispparams);
dispparams.rgvarg = undoit.vp;
dispparams.cArgs = noParms;
DISPID didpp = DISPID_PROPERTYPUT;
if (isSet)
{
dispparams.cNamedArgs = 1;
dispparams.rgdispidNamedArgs = &didpp;
}
//
// Invoke the COM method
//
VARIANT result;
ZeroIt (result);
EXCEPINFO expInfo;
ZeroIt (expInfo);
unsigned parg;
ZeroIt (parg);
hr =
undoit.idisp->Invoke (dispid, IID_NULL, GetUserDefaultLCID (),
getMethodDispatchType (methodName), &dispparams,
&result, &expInfo, &parg);
//
// Translate COM errors or exceptions to Java
//
if (hr == DISP_E_EXCEPTION)
{
unsigned long err = (unsigned long) expInfo.wCode;
if (err == 0l)
err = (unsigned long) expInfo.scode;
wchar_t *source = expInfo.bstrSource ? expInfo.bstrSource : L"";
wchar_t *desc =
expInfo.bstrDescription ? expInfo.bstrDescription : L"";
throwException (msgInvokeFailedParms, methodName, err, source, desc);
if (methodName)
free (methodName);
return NULL;
}
if (ASSERT_FAILED (hr))
{
if (hr == DISP_E_TYPEMISMATCH || hr == DISP_E_PARAMNOTFOUND)
{
throwException (msgInvokeFailedParms2, noParms - parg, methodName,
hr);
if (methodName)
free (methodName);
return NULL;
}
eventlog (LOG_WARNING, msgFailedDIInvoke, methodName, hr);
throwException (msgInvokeFailed, methodName, hr);
if (methodName)
free (methodName);
return NULL;
}
//
// Convert the result to a variant
//
jobject jresult = NULL;
hr = variant2object (env, result, jresult);
if (ASSERT_FAILED (hr))
{
eventlog (LOG_ERROR, msgFailedConvertReturn, V_VT (&result), progid,
methodName);
throwException (msgFailedConvertReturn, V_VT (&result), progid,
methodName);
if (methodName)
free (methodName);
::VariantClear (&result);
return NULL;
}
if (methodName)
free (methodName);
eventlog (LOG_SUCCESS, msgSuccess);
::VariantClear (&result);
return jresult;
}
/*
* Throws a exception for a UNICODE string.
*/
BOOL throwException (const wchar_t * msg)
{
if (NULL == msg)
msg = L"Exception thrown by COMBridge";
jclass Exception = env->FindClass ("java/lang/Exception");
env->ThrowNew (Exception, ws2mbs (msg));
return true;
}
/*
* Throws a SOAP exception for a string.
*/
BOOL throwException (const char *msg)
{
if (NULL == msg)
msg = "Exception thrown by COMBridge";
jclass Exception = env->FindClass ("java/lang/Exception");
env->ThrowNew (Exception, msg);
return true;
}
/*
* Throws a SOAP exception for a Win32 message id.
*/
BOOL throwException (int id, ...)
{
va_list a;
va_start (a, id);
wchar_t *msgbuf = NULL;
FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_STRING, (wchar_t *) id, 0, 3,
(wchar_t *) & msgbuf, 10000, &a);
return throwException (msgbuf);
}
/*
* Logs an event
*/
BOOL eventlog (short eventtype, int id, ...)
{
if ((eventtype & eventLevel) == 0)
return false;
va_list a;
va_start (a, id);
wchar_t *msgbuf;
FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_STRING, (wchar_t *) id, 0, 3,
(wchar_t *) & msgbuf, 10000, &a);
// fwprintf( stderr, L"%s\n", msgbuf);
jclass spClass = env->GetObjectClass (jPP);
// jstring jmsg= env->NewStringUTF(ws2mbs(msgbuf));
jstring jmsg = env->NewString (msgbuf, wcslen (msgbuf));
jmethodID mid =
env->GetMethodID (spClass, "logit", "(ILjava/lang/String;)V");
env->CallVoidMethod (jPP, mid, (jint) eventtype, jmsg);
env->DeleteLocalRef (jmsg);
LocalFree (msgbuf);
return true;
}
}; //class COMBridge
/*
* org.apache.axis.components.bridge.COMBridge#invoke
*
* Invokes the COM method as the SOAP service.
*/
extern
"C"
JNIEXPORT
jobject
JNICALL
Java_org_apache_axis_components_bridge_COMBridge_invoke
(JNIEnv * env, jobject jo, jstring threadingModel, jstring jprogid,
jstring jmethodName, jbyteArray parms_in)
{
// Instantiate a COMBridge (see above) and call its invoke member function.
CRTDBGBRK COMBridge cp (env, jo);
#ifdef NDEBUG //This also will to debug on demand so if we are
debugging don't do the catch.
try
{
#endif
env->ExceptionClear (); //Ignore all previous errors.
return cp.invoke (threadingModel, jprogid, jmethodName, parms_in);
#ifdef NDEBUG
}
catch (wchar_t * wstr)
{
env->ExceptionClear (); //Ignore all previous errors.
cp.throwException (wstr);
return NULL;
}
catch (char *str)
{
env->ExceptionClear (); //Ignore all previous errors.
cp.throwException (str);
return NULL;
}
catch (unsigned int ui)
{
env->ExceptionClear (); //Ignore all previous errors.
wchar_t
numbuf[16];
cp.throwException (_ultow (ui, numbuf, 10));
return NULL;
}
catch (...)
{ //Main point here is not to trap the JVM!
env->ExceptionClear (); //Ignore all previous errors.
cp.throwException (msgUnknowCPPException);
return NULL;
}
#endif
}
/*
* org.apache.axis.components.bridge.COMBridge#nativeConvertToBString
*
* Converts a Java string to a BSTR.
*/
extern
"C"
JNIEXPORT
jbyteArray
JNICALL
Java_org_apache_axis_components_bridge_COMBridge_nativeConvertToBString
(JNIEnv * env, jclass jc, jstring s)
{
env->ExceptionClear (); //Let a calling thread to invoke a call record the
error.
jboolean
isCopy;
const wchar_t *
cs =
env->
GetStringChars (s, &isCopy);
BSTR
bstrS =
SysAllocString (cs);
if (isCopy == JNI_TRUE)
env->ReleaseStringChars (s, cs);
jbyteArray
jByteArray =
env->
NewByteArray (sizeof bstrS);
jbyte *
jr =
env->
GetByteArrayElements (jByteArray, &isCopy);
void *
x =
bstrS;
memcpy (jr, &x, sizeof x);
if (isCopy == JNI_TRUE)
env->ReleaseByteArrayElements (jByteArray, jr, 0);
return jByteArray;
}
/*
* Functions to create a Java Object from primitive types.
*/
jobject
bsf_makeBoolean (JNIEnv * jenv, int val)
{
jclass
classobj =
jenv->
FindClass ("java/lang/Boolean");
jmethodID
constructor =
jenv->
GetMethodID (classobj, "<init>", "(Z)V");
return jenv->NewObject (classobj, constructor, (jboolean) val);
}
jobject
bsf_makeByte (JNIEnv * jenv, int val)
{
jclass
classobj =
jenv->
FindClass ("java/lang/Byte");
jmethodID
constructor =
jenv->
GetMethodID (classobj, "<init>", "(B)V");
return jenv->NewObject (classobj, constructor, (jbyte) val);
}
jobject
bsf_makeShort (JNIEnv * jenv, int val)
{
jclass
classobj =
jenv->
FindClass ("java/lang/Short");
jmethodID
constructor =
jenv->
GetMethodID (classobj, "<init>", "(S)V");
return jenv->NewObject (classobj, constructor, (jshort) val);
}
jobject
bsf_makeInteger (JNIEnv * jenv, int val)
{
jclass
classobj =
jenv->
FindClass ("java/lang/Integer");
jmethodID
constructor =
jenv->
GetMethodID (classobj, "<init>", "(I)V");
return jenv->NewObject (classobj, constructor, (jint) val);
}
jobject
bsf_makeLong (JNIEnv * jenv, long val)
{
jclass
classobj =
jenv->
FindClass ("java/lang/Long");
jmethodID
constructor =
jenv->
GetMethodID (classobj, "<init>", "(J)V");
return jenv->NewObject (classobj, constructor, (jlong) val);
}
jobject
bsf_makeFloat (JNIEnv * jenv, float val)
{
jclass
classobj =
jenv->
FindClass ("java/lang/Float");
jmethodID
constructor =
jenv->
GetMethodID (classobj, "<init>", "(F)V");
return jenv->NewObject (classobj, constructor, (jfloat) val);
}
jobject
bsf_makeDouble (JNIEnv * jenv, double val)
{
jclass
classobj =
jenv->
FindClass ("java/lang/Double");
jmethodID
constructor =
jenv->
GetMethodID (classobj, "<init>", "(D)V");
return jenv->NewObject (classobj, constructor, (jdouble) val);
}
/*
* Create a Java Object from VARIANT types.
*/
HRESULT
variant2object (JNIEnv * jenv, const VARIANT & var, jobject & jresult,
bool * localRefCreated)
{
HRESULT
result =
S_OK;
char *
buf =
NULL;
if (localRefCreated)
*localRefCreated = true; //this is mostly the case.
switch (V_VT (&var))
{
case VT_ERROR:
case VT_EMPTY:
case VT_NULL:
if (localRefCreated)
*localRefCreated = false;
jresult = NULL;
break;
case VT_I1:
jresult = bsf_makeByte (jenv, (int) V_I1 (&var));
break;
case VT_I2:
jresult = bsf_makeShort (jenv, (int) V_I2 (&var));
break;
case VT_I4:
jresult = bsf_makeInteger (jenv, (int) V_I4 (&var));
break;
case VT_I8:
/* where's V_I8??? */
jresult = bsf_makeLong (jenv, (long) V_I4 (&var));
break;
case VT_R4:
jresult = bsf_makeFloat (jenv, (float) V_R4 (&var));
break;
case VT_R8:
jresult = bsf_makeDouble (jenv, (double) V_R8 (&var));
break;
case VT_BSTR:
/* if its a string with the right stuff, retract the object */
// buf= ws2mbs(var.bstrVal);
// jresult = jenv->NewStringUTF (buf);
jresult = jenv->NewString (var.bstrVal, wcslen (var.bstrVal));
break;
case VT_BOOL:
jresult = bsf_makeBoolean (jenv, (int) V_BOOL (&var));
break;
case VT_VARIANT:
result =
variant2object (jenv, *(V_VARIANTREF (&var)), jresult,
localRefCreated);
break;
case VT_UI1:
jresult = bsf_makeShort (jenv, (int) V_UI1 (&var));
break;
case VT_UI2:
jresult = bsf_makeInteger (jenv, (int) V_UI2 (&var));
break;
case VT_UI4:
jresult = bsf_makeLong (jenv, (long) V_UI4 (&var));
break;
case VT_UI8:
/* where's V_UI8??? */
jresult = bsf_makeLong (jenv, (long) V_UI4 (&var));
break;
case VT_INT:
jresult = bsf_makeInteger (jenv, V_INT (&var));
break;
case VT_UINT:
jresult = bsf_makeLong (jenv, (long) V_UINT (&var));
break;
default:
if (V_ISBYREF (&var))
{
if ((var.vt & (VT_BYREF | VT_ARRAY)) == (VT_BYREF | VT_ARRAY))
{ //It is an array by reference.
result = DISP_E_BADVARTYPE; //rrfoo can support needs work.
/*
//var.vt&= (~VT_BYREF);
VARIANT arraybyref;
ZeroIt(arraybyref);
arraybyref.vt = VT_ARRAY;
arraybyref.parray= *var.pparray;
result= variant2object(jenv, arraybyref, jresult localRefCreated);
*/
}
else
{ //This is a reference ... dereference.
result =
variant2object (jenv, *((VARIANT *) var.byref), jresult,
localRefCreated);
}
}
else
{
result = DISP_E_BADVARTYPE;
break;
}
} //endswitch to variant.
if (!jresult && localRefCreated)
*localRefCreated = false;
return result;
}
1.1 xml-axis/proposals/COMBridge/CPP/COMBridge.dep
Index: COMBridge.dep
===================================================================
# Microsoft Developer Studio Generated Dependency File, included by COMBridge.mak
.\COMBridge.cpp : \
"..\..\jdk13\include\jni.h"\
"..\..\jdk13\include\win32\jni_md.h"\
"..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\
".\COMBridge.h"\
".\org_apache_axis_components_bridge_COMBridge.h"\
1.1 xml-axis/proposals/COMBridge/CPP/COMBridge.dsp
Index: COMBridge.dsp
===================================================================
# Microsoft Developer Studio Project File - Name="COMBridge" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=COMBridge - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "COMBridge.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "COMBridge.mak" CFG="COMBridge - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "COMBridge - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "COMBridge - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "COMBridge - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D
"_MBCS" /D "_USRDLL" /D "COMBRIDGE_EXPORTS" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE"
/D "UNICODE" /D "_USRDLL" /D "COMBRIDGE_EXPORTS" /D "_WIN32_DCOM" /YX /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
/nologo /dll /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
/nologo /dll /machine:I386
!ELSEIF "$(CFG)" == "COMBridge - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS"
/D "_MBCS" /D "_USRDLL" /D "COMBRIDGE_EXPORTS" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "c:\jdk13\include" /I
"c:\jdk13\include\win32" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D
"UNICODE" /D "_USRDLL" /D "COMBRIDGE_EXPORTS" /D "_WIN32_DCOM" /YX /FD /GZ /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
/nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
/nologo /dll /debug /machine:I386 /pdbtype:sept /libpath:"c:\jdk13\lib"
!ENDIF
# Begin Target
# Name "COMBridge - Win32 Release"
# Name "COMBridge - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\COMBridge.cpp
# End Source File
# Begin Source File
SOURCE=.\COMBridge.h
# End Source File
# Begin Source File
SOURCE=.\org_apache_axis_components_bridge_COMBridge.h
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# End Group
# Begin Group "Resource Files"
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# End Group
# End Target
# End Project
1.1 xml-axis/proposals/COMBridge/CPP/COMBridge.dsw
Index: COMBridge.dsw
===================================================================
Microsoft Developer Studio Workspace File, Format Version 6.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
Project: "COMBridge"=.\COMBridge.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################
1.1 xml-axis/proposals/COMBridge/CPP/COMBridge.h
Index: COMBridge.h
===================================================================
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "SOAP" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
* ITS 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.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation and was
* originally based on software copyright (c) 2001, International
* Business Machines, Inc., http://www.apache.org. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
#if !defined I9b76b170db194c3c92c61e375e31a96e
#define I9b76b170db194c3c92c61e375e31a96e
#include <deque>
#include <malloc.h>
#include <exception>
#include <new>
#include <new.h>
#include <windows.h>
#include <jni.h>
#include "org_apache_axis_components_bridge_COMBridge.h"
extern wchar_t ModuleName[MAX_PATH * 2];
extern HANDLE thisModule;
#if !defined(NDEBUG)
#include <CRTDBG.H>
#define CRTDBGBRK {if(getenv("CRTDBGBRK")){ _CrtDbgBreak();}}
#else
#define CRTDBGBRK
#endif
#if defined(FAILED)
#include <cassert>
#if defined(NDEBUG)
#define ASSERT_FAILED FAILED
#else
#define ASSERT_FAILED(S) ( (true == FAILED((S))) ?((bool) (assert(0),true)) : false)
#endif
#endif
inline wchar_t *
mbs2wsConvert (const char *s, void *d)
{
size_t size = strlen (s);
if (d && !size)
*(wchar_t *) d = L'\0';
if (d && size)
{
((wchar_t *) d)[MultiByteToWideChar (CP_ACP, // code page
MB_COMPOSITE, // character-type
options
s, // address of string to map
size, // number of bytes in string
(wchar_t *) d, // address of
wide-character buffer
((size << 1) + 1) // size of buffer
)] = L'\0';
}
return (wchar_t *) d;
}
#define mbs2ws(s) (mbs2wsConvert((s), _alloca( (2+strlen((const char *)(s)))<<1)))
inline LPOLESTR
mbs2LPOLESTR (const char *s)
{
wchar_t *ws = mbs2ws (s);
if (ws)
{
return _wcsdup (ws);
}
return NULL;
}
inline LPOLESTR
mbs2LPOLESTR (const std::string & s)
{
return mbs2LPOLESTR (s.c_str ());
}
inline char *
ws2mbsConvert (const wchar_t * s, void *d)
{
size_t size = wcslen (s); //It maybe the same size as the widechar string
if (!size && d)
*((char *) d) = '\0';
if (d && size)
{
((char *) d)[WideCharToMultiByte (CP_ACP, // code page
WC_COMPOSITECHECK, // character-type
options
s, // address of string to map
size, // number of chars in string
(char *) d, // address of mbs-character
buffer
size << 1, // size of buffer in bytes ,
//Use system default character.
NULL, NULL)] = L'\0';
}
return (char *) d;
}
// TODO: this requires sufficient stack for a copy of the string,
// which may simply not be available.
#define ws2mbs(s) (ws2mbsConvert((s), _alloca( ((2+(wcslen((const wchar_t
*)(s))<<1))))))
template < class T > inline void
ZeroIt (T & t)
{
memset (&t, 0, sizeof t);
};
#endif /*I9b76b170-db19-4c3c-92c6-1e375e31a96e */
1.1 xml-axis/proposals/COMBridge/CPP/COMBridge.ncb
Index: COMBridge.ncb
===================================================================
Microsoft C/C++ program database 2.00
1.1 xml-axis/proposals/COMBridge/CPP/COMBridge.opt
<<Binary file>>
1.1 xml-axis/proposals/COMBridge/CPP/COMBridge.plg
Index: COMBridge.plg
===================================================================
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: COMBridge - Win32 Debug--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "C:\TEMP\RSPD9.tmp" with contents
[
/nologo /MTd /W3 /Gm /GX /ZI /Od /I "c:\jdk13\include" /I "c:\jdk13\include\win32"
/D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /D "_USRDLL" /D
"COMBRIDGE_EXPORTS" /D "_WIN32_DCOM" /Fp"Debug/COMBridge.pch" /YX /Fo"Debug/"
/Fd"Debug/" /FD /GZ /c
"C:\jakarta\xml-axis\proposals\COMBridge\CPP\COMBridge.cpp"
]
Creating command line "cl.exe @C:\TEMP\RSPD9.tmp"
Creating temporary file "C:\TEMP\RSPDA.tmp" with contents
[
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib
ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes
/pdb:"Debug/COMBridge.pdb" /debug /machine:I386 /out:"Debug/COMBridge.dll"
/implib:"Debug/COMBridge.lib" /pdbtype:sept /libpath:"c:\jdk13\lib"
".\Debug\COMBridge.obj"
]
Creating command line "link.exe @C:\TEMP\RSPDA.tmp"
<h3>Output Window</h3>
Compiling...
COMBridge.cpp
Linking...
Creating library Debug/COMBridge.lib and object Debug/COMBridge.exp
<h3>Results</h3>
COMBridge.dll - 0 error(s), 0 warning(s)
</pre>
</body>
</html>
1.1
xml-axis/proposals/COMBridge/CPP/org_apache_axis_components_bridge_COMBridge.h
Index: org_apache_axis_components_bridge_COMBridge.h
===================================================================
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_apache_axis_components_bridge_COMBridge */
#ifndef _Included_org_apache_axis_components_bridge_COMBridge
#define _Included_org_apache_axis_components_bridge_COMBridge
#ifdef __cplusplus
extern "C" {
#endif
/* Inaccessible static: dllLoadException */
#undef org_apache_axis_components_bridge_COMBridge_sizeOfVariant
#define org_apache_axis_components_bridge_COMBridge_sizeOfVariant 16L
/*
* Class: org_apache_axis_components_bridge_COMBridge
* Method: invoke
* Signature:
(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[B)Ljava/lang/Object;
*/
JNIEXPORT jobject JNICALL Java_org_apache_axis_components_bridge_COMBridge_invoke
(JNIEnv *, jobject, jstring, jstring, jstring, jbyteArray);
/*
* Class: org_apache_axis_components_bridge_COMBridge
* Method: nativeConvertToBString
* Signature: (Ljava/lang/String;)[B
*/
JNIEXPORT jbyteArray JNICALL
Java_org_apache_axis_components_bridge_COMBridge_nativeConvertToBString
(JNIEnv *, jclass, jstring);
#ifdef __cplusplus
}
#endif
#endif
1.1 xml-axis/proposals/COMBridge/CPP/Debug/COMBridge.dll
<<Binary file>>
1.1
xml-axis/proposals/COMBridge/java/org/apache/axis/components/bridge/COMBridge.java
Index: COMBridge.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "SOAP" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
* ITS 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.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation and was
* originally based on software copyright (c) 2001, International
* Business Machines, Inc., http://www.apache.org. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.axis.components.bridge;
import java.util.Hashtable;
import java.util.Vector;
/**
* Class COMBridge
*
* @author James Snell <[EMAIL PROTECTED]>
* @author Davanum Srinivas <[EMAIL PROTECTED]>
*/
public class COMBridge {
/** Field vp */
private byte[] vp = null;
/** Field progid */
private String progid = null;
/** Field threadingModel */
private String threadingModel = null;
/** Field dllLoadException */
static Throwable dllLoadException =
null; // Can hold an exception on
from the loading of the c++ dll.
/** Field libName */
static final String libName = "COMBridge"; // C++ dll name.
/** Field sizeOfVariant */
private static final int sizeOfVariant = 16;
static {
try {
System.loadLibrary(libName);
} catch (java.lang.SecurityException e) {
dllLoadException = e;
} catch (java.lang.UnsatisfiedLinkError e) {
dllLoadException = e;
}
}
/**
* Method execute
*
* @param methodName
* @param parms
* @param props
*
* @return
*
* @throws Throwable
*/
public Object execute(String methodName, Vector parms, Hashtable props)
throws Throwable {
if (null != dllLoadException) {
throw dllLoadException;
}
int noParms = 0;
if (parms != null) {
vp = new byte[sizeOfVariant * parms.size()];
noParms = parms.size();
}
for (int i = 0; i < noParms; ++i) {
// Yes. Parameters are reversed here.
objectToVariant((parms.elementAt(noParms - i - 1)), vp,
i * sizeOfVariant);
}
progid = (String) props.get("progid");
threadingModel = (String) props.get("threadmodel");
if (null == threadingModel) {
threadingModel = "MULTITHREADED";
}
return invoke(threadingModel, progid, methodName, vp);
}
/**
* Method logit
*
* @param level
* @param msg
*/
protected void logit(int level, String msg) // Called by CPP
{
System.out.println("CPP:" + msg);
}
/**
* Method invoke
*
* @param threadingModel
* @param progId
* @param methodName
* @param parms
*
* @return
*
* @throws Exception
*/
private native Object invoke(
String threadingModel, String progId, String methodName, byte[] parms)
throws Exception;
/**
* Method nativeConvertToBString
*
* @param o
*
* @return
*/
private static native byte[] nativeConvertToBString(String o);
/**
* Method objectToVariant
*
* @param o
* @param bo
* @param os
*
* @return
*
* @throws Exception
*/
private final byte[] objectToVariant(Object o, byte[] bo, int os)
throws Exception {
byte[] v = bo;
if (null == v) {
v = new byte[sizeOfVariant]; // Size of a variant
os = 0;
}
if (null == o) { // to be safe.
v[os + 0] = 1; // VT_NULL
v[os + 1] = 0;
} else if (o instanceof java.lang.Boolean) // VT_R8
{
v[os + 0] = 11; // VT_BOOL
v[os + 1] = 0;
byte x = (byte) ((((Boolean) o).booleanValue())
? 0xff
: 0);
v[os + 8] = x;
v[os + 9] = x;
v[os + 10] = x;
v[os + 11] = x;
} else if (o instanceof java.lang.Integer) // VT_R8
{
v[os + 0] = 3; // VT_I4
v[os + 1] = 0;
int x = ((Integer) o).intValue();
v[os + 8] = (byte) x;
v[os + 9] = (byte) ((x >>> 8) & 0xff);
v[os + 10] = (byte) ((x >>> 16) & 0xff);
v[os + 11] = (byte) ((x >>> 24) & 0xff);
} else if (o instanceof java.lang.String) {
v[os + 0] = 8; // VT_BSTR
v[os + 1] = 0;
byte[] pbs = nativeConvertToBString((String) o);
v[os + 8] = pbs[0];
v[os + 9] = pbs[1];
v[os + 10] = pbs[2];
v[os + 11] = pbs[3];
} else if (o instanceof java.lang.Long) // VT_R8
{ // COM has no long type so promote it to double which can contain it.
v[os + 0] = 5; // VT_R8
v[os + 1] = 0;
long x = Double.doubleToLongBits((double) (((Long) o).longValue()));
v[os + 8] = (byte) x;
v[os + 9] = (byte) ((x >>> 8) & 0xff);
v[os + 10] = (byte) ((x >>> 16) & 0xff);
v[os + 11] = (byte) ((x >>> 24) & 0xff);
v[os + 12] = (byte) ((x >>> 32) & 0xff);
v[os + 13] = (byte) ((x >>> 40) & 0xff);
v[os + 14] = (byte) ((x >>> 48) & 0xff);
v[os + 15] = (byte) ((x >>> 56) & 0xff);
} else if (o instanceof java.lang.Short) {
v[os + 0] = 2; // VT_I2
v[os + 1] = 0;
int x = ((Short) o).intValue();
v[os + 8] = (byte) x;
v[os + 9] = (byte) ((x >>> 8) & 0xff);
v[os + 10] = (byte) ((x >>> 16) & 0xff);
v[os + 11] = (byte) ((x >>> 24) & 0xff);
} else if (o instanceof java.lang.Float) {
v[os + 0] = 4; // VT_R4
v[os + 1] = 0;
int x = Float.floatToIntBits(((Float) o).floatValue());
v[os + 8] = (byte) x;
v[os + 9] = (byte) ((x >>> 8) & 0xff);
v[os + 10] = (byte) ((x >>> 16) & 0xff);
v[os + 11] = (byte) ((x >>> 24) & 0xff);
} else if (o instanceof java.lang.Double) // VT_R8
{
v[os + 0] = 5; // VT_R8
v[os + 1] = 0;
long x = Double.doubleToLongBits(((Double) o).doubleValue());
v[os + 8] = (byte) x;
v[os + 9] = (byte) ((x >>> 8) & 0xff);
v[os + 10] = (byte) ((x >>> 16) & 0xff);
v[os + 11] = (byte) ((x >>> 24) & 0xff);
v[os + 12] = (byte) ((x >>> 32) & 0xff);
v[os + 13] = (byte) ((x >>> 40) & 0xff);
v[os + 14] = (byte) ((x >>> 48) & 0xff);
v[os + 15] = (byte) ((x >>> 56) & 0xff);
} else if (o instanceof java.lang.Byte) {
v[os + 0] = 17; // VT_UI1
v[os + 1] = 0;
byte x = ((Byte) o).byteValue();
v[os + 8] = x;
} else if (o instanceof java.lang.Character) {
v[os + 0] = 17; // VT_UI1
v[os + 1] = 0;
byte x = (byte) ((Character) o).charValue();
v[os + 8] = x;
} else if (o instanceof java.lang.Void) {
v[os + 0] = 1; // VT_NULL
v[os + 1] = 0;
} else if (o.getClass().isArray()) {
// ArrayInfo ai= new ArrayInfo(o);
// v= ai.toVariant();
throw new Exception(
"Currently arrays are unsupported, type received:"
+ o.getClass().getName());
} else {
throw new Exception("Currently unsupported data type received:"
+ o.getClass().getName());
}
return v;
}
public static void main(String[] args) throws Throwable {
org.apache.axis.components.bridge.COMBridge bridge = new
org.apache.axis.components.bridge.COMBridge();
Hashtable props = new Hashtable();
props.put("progid", "Apacheadder.adder");
String methodName2 = "add";
Vector params2 = new Vector();
params2.add(new Short("6"));
params2.add(new Short("5"));
Object ret2 = bridge.execute(methodName2, params2, props);
System.out.println("return:" + ret2);
}
}