1 #include "ManualSetupPayloadParser.h"
2 #include "QRCodeSetupPayloadParser.h"
4 #include <support/CHIPMem.h>
5 #include <support/logging/CHIPLogging.h>
13 #define JNI_METHOD(RETURN, METHOD_NAME) extern "C" JNIEXPORT RETURN JNICALL Java_chip_setuppayload_SetupPayloadParser_##METHOD_NAME
15 static jobject TransformSetupPayload(JNIEnv * env, SetupPayload & payload);
17 jint JNI_OnLoad(JavaVM * jvm, void * reserved)
19 ChipLogProgress(SetupPayload, "JNI_OnLoad() called");
20 chip::Platform::MemoryInit();
21 return JNI_VERSION_1_6;
24 JNI_METHOD(jobject, fetchPayloadFromQrCode)(JNIEnv * env, jobject self, jstring qrCodeObj)
27 const char * qrString = NULL;
28 QRCodeSetupPayloadParser * qrPayloadParser = NULL;
31 qrString = env->GetStringUTFChars(qrCodeObj, 0);
32 qrPayloadParser = new QRCodeSetupPayloadParser(qrString);
34 err = qrPayloadParser->populatePayload(payload);
36 return TransformSetupPayload(env, payload);
39 JNI_METHOD(jobject, fetchPayloadFromManualEntryCode)(JNIEnv * env, jobject self, jstring entryCode)
42 const char * entryCodeString = NULL;
43 ManualSetupPayloadParser * manualSetupPayloadParser = NULL;
46 entryCodeString = env->GetStringUTFChars(entryCode, 0);
47 manualSetupPayloadParser = new ManualSetupPayloadParser(entryCodeString);
49 err = manualSetupPayloadParser->populatePayload(payload);
51 return TransformSetupPayload(env, payload);
54 jobject TransformSetupPayload(JNIEnv * env, SetupPayload & payload)
56 jclass setupPayloadClass = env->FindClass("chip/setuppayload/SetupPayload");
57 jmethodID setupConstr = env->GetMethodID(setupPayloadClass, "<init>", "()V");
58 jobject setupPayload = env->NewObject(setupPayloadClass, setupConstr);
60 jfieldID version = env->GetFieldID(setupPayloadClass, "version", "I");
61 jfieldID vendorId = env->GetFieldID(setupPayloadClass, "vendorId", "I");
62 jfieldID productId = env->GetFieldID(setupPayloadClass, "productId", "I");
63 jfieldID requiresCustomFlow = env->GetFieldID(setupPayloadClass, "requiresCustomFlow", "Z");
64 jfieldID discriminator = env->GetFieldID(setupPayloadClass, "discriminator", "I");
65 jfieldID setUpPinCode = env->GetFieldID(setupPayloadClass, "setupPinCode", "J");
67 env->SetIntField(setupPayload, version, payload.version);
68 env->SetIntField(setupPayload, vendorId, payload.vendorID);
69 env->SetIntField(setupPayload, productId, payload.productID);
70 env->SetBooleanField(setupPayload, requiresCustomFlow, payload.requiresCustomFlow);
71 env->SetIntField(setupPayload, discriminator, payload.discriminator);
72 env->SetLongField(setupPayload, setUpPinCode, payload.setUpPINCode);
74 jmethodID addOptionalInfoMid =
75 env->GetMethodID(setupPayloadClass, "addOptionalQRCodeInfo", "(Lchip/setuppayload/OptionalQRCodeInfo;)V");
77 std::vector<OptionalQRCodeInfo> optional_info = payload.getAllOptionalVendorData();
78 for (OptionalQRCodeInfo & info : optional_info)
81 jclass optionalInfoClass = env->FindClass("chip/setuppayload/OptionalQRCodeInfo");
82 jobject optionalInfo = env->AllocObject(optionalInfoClass);
83 jfieldID tag = env->GetFieldID(optionalInfoClass, "tag", "I");
84 jfieldID type = env->GetFieldID(optionalInfoClass, "type", "Lchip/setuppayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;");
85 jfieldID data = env->GetFieldID(optionalInfoClass, "data", "Ljava/lang/String;");
86 jfieldID int32 = env->GetFieldID(optionalInfoClass, "int32", "I");
88 env->SetIntField(optionalInfo, tag, info.tag);
90 jclass enumClass = env->FindClass("chip/setuppayload/OptionalQRCodeInfo$OptionalQRCodeInfoType");
91 jfieldID enumType = nullptr;
95 case optionalQRCodeInfoTypeUnknown:
97 env->GetStaticFieldID(enumClass, "TYPE_UNKNOWN", "Lchip/setuppayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;");
99 case optionalQRCodeInfoTypeString:
101 env->GetStaticFieldID(enumClass, "TYPE_STRING", "Lchip/setuppayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;");
103 case optionalQRCodeInfoTypeInt32:
105 env->GetStaticFieldID(enumClass, "TYPE_INT32", "Lchip/setuppayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;");
107 case optionalQRCodeInfoTypeInt64:
109 env->GetStaticFieldID(enumClass, "TYPE_INT64", "Lchip/setuppayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;");
111 case optionalQRCodeInfoTypeUInt32:
113 env->GetStaticFieldID(enumClass, "TYPE_UINT32", "Lchip/setuppayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;");
115 case optionalQRCodeInfoTypeUInt64:
117 env->GetStaticFieldID(enumClass, "TYPE_UINT64", "Lchip/setuppayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;");
123 jobject enumObj = env->GetStaticObjectField(enumClass, enumType);
124 env->SetObjectField(optionalInfo, type, enumObj);
126 env->SetObjectField(optionalInfo, data, env->NewStringUTF(info.data.c_str()));
127 env->SetIntField(optionalInfo, int32, info.int32);
129 env->CallVoidMethod(setupPayload, addOptionalInfoMid, optionalInfo);