void convertToVariant(NPP npp, const Any& any, NPVariant* variant, bool result)
{
    switch (any.getType())
    {
    case Any::Empty:
        NULL_TO_NPVARIANT(*variant);
        break;
    case Any::Bool:
        BOOLEAN_TO_NPVARIANT(any.toBoolean(), *variant);
        break;
    case Any::Int32:
    case Any::Uint32:
        INT32_TO_NPVARIANT(static_cast<int32_t>(any), *variant);
        break;
    case Any::Int64:
    case Any::Uint64:
    case Any::Float32:
    case Any::Float64:
        DOUBLE_TO_NPVARIANT(static_cast<double>(any), *variant);
        break;
    case Any::Dynamic:
        if (any.isString())
        {
            std::string value = any.toString();
            if (value.length() == 0)
            {
                STRINGN_TO_NPVARIANT(0, 0, *variant);
            }
            else if (!result)
            {
                STRINGN_TO_NPVARIANT(value.c_str(), static_cast<uint32_t>(value.length()), *variant);
            }
            else {
                void* buffer = NPN_MemAlloc(value.length());
                if (!buffer)
                {
                    STRINGN_TO_NPVARIANT(0, 0, *variant);
                }
                else
                {
                    memmove(buffer, value.c_str(), value.length());
                    STRINGN_TO_NPVARIANT(static_cast<NPUTF8*>(buffer), static_cast<uint32_t>(value.length()), *variant);
                }
            }
        }
        else
        {
            assert(any.isObject());
            convertToVariant(npp, any.toObject(), variant, result);
        }
        break;
    default:
        VOID_TO_NPVARIANT(*variant);
        break;
    }
}
示例#2
0
文件: com4j.cpp 项目: Alcar32/com4j
JNIEXPORT jobject JNICALL Java_com4j_Native_invokeDispatch( JNIEnv* env, jclass _, jlong pComObject, jint dispId, jint flag, jobjectArray args) {
	
	DISPPARAMS params;
	DISPID dispIdPropertyPut = DISPID_PROPERTYPUT;
	
	params.cArgs = env->GetArrayLength(args);
	params.cNamedArgs = 0;
	params.rgdispidNamedArgs = NULL;
	VARIANT* p = new VARIANT[params.cArgs];
	params.rgvarg = p;

	for(unsigned int i=0; i<params.cArgs; i++ ) {
    // we have to store the params in reverse order! (scm)
    int destIndex = params.cArgs - 1 - i; 
		VARIANT* v = convertToVariant(env,env->GetObjectArrayElement(args,i));
		if(v==NULL) {
			// VariantInit(&p[i]);
			p[destIndex] = vtMissing;
		} else {
			p[destIndex] = *v;	// just transfer the ownership
			delete v;
		}
	}

  // see MSDN IDispatch::Invoke
  // "When you use IDispatch::Invoke() with DISPATCH_PROPERTYPUT or DISPATCH_PROPERTYPUTREF, you have to specially
  //  initialize the cNamedArgs and rgdispidNamedArgs elements of your DISPPARAMS structure with the following:"
	if(flag==DISPATCH_PROPERTYPUT || flag==DISPATCH_PROPERTYPUTREF) {
		params.cNamedArgs = 1;
		params.rgdispidNamedArgs = &dispIdPropertyPut;
	}

	EXCEPINFO excepInfo;
	memset(&excepInfo,0,sizeof(EXCEPINFO));

	jobject retVal = com4j_Variant_new(env);

	HRESULT hr = reinterpret_cast<IDispatch*>(pComObject)->Invoke(
		dispId, IID_NULL, 0, (WORD) flag, &params, com4jVariantToVARIANT(env,retVal), &excepInfo, NULL );

	if(FAILED(hr)) {
		error(env,__FILE__,__LINE__,hr,"Invocation failed: %s",(LPCSTR)_bstr_t(excepInfo.bstrDescription));
	}

	delete p;

	return retVal;
}
示例#3
0
STDMETHODIMP CEventReceiver::Invoke( DISPID dispid, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pResult, EXCEPINFO* pExcepInfo, UINT* puArgErr ) {
	AttachThread jniScope(jniModule);
	JNIEnv* pEnv = jniScope;
	
	jobjectArray ar = pEnv->NewObjectArray(pDispParams->cArgs,com4j_Variant,NULL);

	{// copy arguments into com4j Variant types, since we may later change their types
		LockedArray<jobject> data(pEnv,ar);
		int len = pDispParams->cArgs;
		for( int i=0; i<len; i++ ) {
			data[len-i-1] = com4j_Variant_new(pEnv);
			::VariantCopy(com4jVariantToVARIANT(pEnv,data[len-i-1]), &pDispParams->rgvarg[i]);
		}
	}

	jobject r = com4jEventProxy_invoke(pEnv,eventProxy, (jint)dispid,(jint)wFlags,ar);
	
	// check if there was any exception
	jthrowable t = pEnv->ExceptionOccurred();
	if(t!=NULL) {
		pEnv->ExceptionClear();
		if(pExcepInfo!=NULL) {
			pExcepInfo->wCode = 1000;	// Java doesn't have any notion of 'error code'
			pExcepInfo->wReserved = 0;
			pExcepInfo->bstrSource		= SysAllocString(JString(pEnv,com4jEventProxy_getErrorSource(pEnv,t)));
			pExcepInfo->bstrDescription = SysAllocString(JString(pEnv,com4jEventProxy_getErrorDetail(pEnv,t)));
			pExcepInfo->bstrHelpFile = NULL;
			pExcepInfo->dwHelpContext = 0;
			pExcepInfo->pvReserved = NULL;
			pExcepInfo->pfnDeferredFillIn = NULL;
			pExcepInfo->scode = 0;
		}

		return DISP_E_EXCEPTION;
	}

	if(r!=NULL && pResult!=NULL) {
		VARIANT* pSrc = convertToVariant(pEnv,r);
		::VariantCopy(pResult,pSrc);
		::VariantClear(pSrc);
	}

	return S_OK;
}
    void JSObjectProxy::put( KJS::ExecState *exec,
                             const KJS::Identifier &p, const KJS::Value &v,
                             int attr ) {
        if ( !isAllowed( exec->interpreter() ) ) {
            kdWarning() << "JS put request from unknown interpreter, ignoring" << endl;
            return ;
        }

        if ( !policy->hasCapability( JSSecurityPolicy::CapabilitySetProperties ) ) {
            ObjectImp::put( exec, p, v, attr );
            return ;
        }

        if ( !obj ) {
            kdDebug( 80001 ) << "JS setting '" << p.ascii() << "' but qobj has died" << endl;
            ObjectImp::put( exec, p, v, attr );
            return ;
        }

        // Properties
        QMetaObject *meta = obj->metaObject();
        int propIndex = meta->findProperty( p.ascii(), true );
        if ( propIndex != -1 ) {
            QVariant val = convertToVariant( exec, v );
            if ( meta->property(propIndex, true)->isEnumType() ) {
                obj->setProperty( p.ascii(), val.toUInt() );
            } else if ( val.isValid() ) {
                obj->setProperty( p.ascii(), val );
            } else {
                kdWarning(80001) << "Error setting value." << endl;
            }
        } else {
            ObjectImp::put( exec, p, v, attr );
        }

        if ( jspart->factory() ->eventMapper() ->isEventHandler( p ) ) {
            if ( evproxy.isNull() )
                evproxy = new KJSEmbed::JSObjectEventProxy( this );
            evproxy->addFilter( jspart->factory() ->eventMapper() ->findEventType( p ) );
            kdDebug( 80001 ) << "Adding event handler " << p.ascii() << endl;
        }
    }
QVariant KJSEmbedPart::getVariant( const QString & valueName ) const
{
	return convertToVariant( js->globalExec(), getValue( valueName ) );
} 
示例#6
0
JNIEXPORT void JNICALL Java_com4j_Variant_set0(JNIEnv * env, jobject, jobject value, jobject image) {
	VARIANT *destVar = (VARIANT*)env->GetDirectBufferAddress(image);
	VARIANT *newVar = convertToVariant(env, value);
	VariantCopy(destVar, newVar);
}