ConnSettingsValue *IAPConfPrivate::variantToValue(const QVariant &variant) { // Convert variant to ConnSettingsValue ConnSettingsValue *value = conn_settings_value_new(); if (value == 0) { qWarning("IAPConf: Unable to create new ConnSettingsValue"); return 0; } switch(variant.type()) { case QVariant::Invalid: value->type = CONN_SETTINGS_VALUE_INVALID; break; case QVariant::String: { char *valueStr = strdup(QSTRING_TO_CONST_CSTR(variant.toString())); value->type = CONN_SETTINGS_VALUE_STRING; value->value.string_val = valueStr; break; } case QVariant::Int: value->type = CONN_SETTINGS_VALUE_INT; value->value.int_val = variant.toInt(); break; case QMetaType::Float: case QVariant::Double: value->type = CONN_SETTINGS_VALUE_DOUBLE; value->value.double_val = variant.toDouble(); break; case QVariant::Bool: value->type = CONN_SETTINGS_VALUE_BOOL; value->value.bool_val = variant.toBool() ? 1 : 0; break; case QVariant::ByteArray: { QByteArray array = variant.toByteArray(); value->type = CONN_SETTINGS_VALUE_BYTE_ARRAY; value->value.byte_array.len = array.size(); value->value.byte_array.val = (unsigned char *)malloc(array.size()); memcpy(value->value.byte_array.val, array.constData(), array.size()); break; } case QVariant::List: { QVariantList list = variant.toList(); ConnSettingsValue **list_val = (ConnSettingsValue **)malloc( (list.size() + 1) * sizeof(ConnSettingsValue *)); for (int idx = 0; idx < list.size(); idx++) { list_val[idx] = variantToValue(list.at(idx)); } list_val[list.size()] = 0; value->type = CONN_SETTINGS_VALUE_LIST; value->value.list_val = list_val; break; } default: qWarning("IAPConf: Can not handle QVariant of type %d", variant.type()); conn_settings_value_destroy(value); return 0; } return value; }
QVariant JClass::callStatic(const char* name, const char* sig, QList<QVariant> args) { JScope s; JNIEnv* env = *JVM::instance(); jmethodID mid = env->GetStaticMethodID(m_class, name, sig); if (!mid) throw RuntimeException(QObject::tr("Method %1 %2 not found").arg(name).arg(sig)); JValue vals[args.size()]; jvalue jargs[args.size()]; for(int i=0;i<args.size();i++) { vals[i] = variantToValue(args[i]); jargs[i] = vals[i]; } const char* rvtype = strchr(sig, ')'); if (!rvtype) throw RuntimeException(QObject::tr("Invalid method return type").arg(name).arg(sig)); rvtype++; QVariant retval; switch (*rvtype) { case 'V': env->CallStaticVoidMethodA(m_class, mid, jargs); break; case '[': { jobject obj = env->CallStaticObjectMethodA(m_class, mid, jargs); retval.setValue<JArray>(JArray(obj)); break; } case 'L': { jclass string_class = env->FindClass("java/lang/String"); jobject obj = env->CallStaticObjectMethodA(m_class, mid, jargs); if (obj && env->IsInstanceOf(obj, string_class) && !strcmp(rvtype+1, "java/lang/String;")) retval = JString(jstring(obj)).str(); else { QVariant var; var.setValue<JObject>(JObject(obj)); retval = var; } break; } case 'Z': retval = (bool) env->CallStaticBooleanMethodA(m_class, mid, jargs); break; case 'B': retval = env->CallStaticByteMethodA(m_class, mid, jargs); break; case 'C': retval = env->CallStaticCharMethodA(m_class, mid, jargs); break; case 'S': retval = env->CallStaticShortMethodA(m_class, mid, jargs); break; case 'I': retval = env->CallStaticIntMethodA(m_class, mid, jargs); break; case 'J': retval = (qlonglong) env->CallStaticLongMethodA(m_class, mid, jargs); break; case 'F': retval = env->CallStaticFloatMethodA(m_class, mid, jargs); break; case 'D': retval = env->CallStaticDoubleMethodA(m_class, mid, jargs); break; default: throw RuntimeException(QObject::tr("Unknown Java data type: %1").arg(*rvtype)); } JObject ex = env->ExceptionOccurred(); if (!ex.isNull()) { env->ExceptionClear(); ex.call("printStackTrace"); QString message = ex.call("getMessage", JSignature().retString()).toString(); QString className = ex.getClass().getClassName(); throw JException(message, className, ex); } return retval; }