Fix for x86_64 build fail
[platform/upstream/connectedhomeip.git] / src / setup_payload / java / SetupPayloadParser-JNI.cpp
1 #include "ManualSetupPayloadParser.h"
2 #include "QRCodeSetupPayloadParser.h"
3
4 #include <support/CHIPMem.h>
5 #include <support/logging/CHIPLogging.h>
6
7 #include <vector>
8
9 #include <jni.h>
10
11 using namespace chip;
12
13 #define JNI_METHOD(RETURN, METHOD_NAME) extern "C" JNIEXPORT RETURN JNICALL Java_chip_setuppayload_SetupPayloadParser_##METHOD_NAME
14
15 static jobject TransformSetupPayload(JNIEnv * env, SetupPayload & payload);
16
17 jint JNI_OnLoad(JavaVM * jvm, void * reserved)
18 {
19     ChipLogProgress(SetupPayload, "JNI_OnLoad() called");
20     chip::Platform::MemoryInit();
21     return JNI_VERSION_1_6;
22 }
23
24 JNI_METHOD(jobject, fetchPayloadFromQrCode)(JNIEnv * env, jobject self, jstring qrCodeObj)
25 {
26     CHIP_ERROR err;
27     const char * qrString                      = NULL;
28     QRCodeSetupPayloadParser * qrPayloadParser = NULL;
29     SetupPayload payload;
30
31     qrString        = env->GetStringUTFChars(qrCodeObj, 0);
32     qrPayloadParser = new QRCodeSetupPayloadParser(qrString);
33
34     err = qrPayloadParser->populatePayload(payload);
35
36     return TransformSetupPayload(env, payload);
37 }
38
39 JNI_METHOD(jobject, fetchPayloadFromManualEntryCode)(JNIEnv * env, jobject self, jstring entryCode)
40 {
41     CHIP_ERROR err;
42     const char * entryCodeString                        = NULL;
43     ManualSetupPayloadParser * manualSetupPayloadParser = NULL;
44     SetupPayload payload;
45
46     entryCodeString          = env->GetStringUTFChars(entryCode, 0);
47     manualSetupPayloadParser = new ManualSetupPayloadParser(entryCodeString);
48
49     err = manualSetupPayloadParser->populatePayload(payload);
50
51     return TransformSetupPayload(env, payload);
52 }
53
54 jobject TransformSetupPayload(JNIEnv * env, SetupPayload & payload)
55 {
56     jclass setupPayloadClass = env->FindClass("chip/setuppayload/SetupPayload");
57     jmethodID setupConstr    = env->GetMethodID(setupPayloadClass, "<init>", "()V");
58     jobject setupPayload     = env->NewObject(setupPayloadClass, setupConstr);
59
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");
66
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);
73
74     jmethodID addOptionalInfoMid =
75         env->GetMethodID(setupPayloadClass, "addOptionalQRCodeInfo", "(Lchip/setuppayload/OptionalQRCodeInfo;)V");
76
77     std::vector<OptionalQRCodeInfo> optional_info = payload.getAllOptionalVendorData();
78     for (OptionalQRCodeInfo & info : optional_info)
79     {
80
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");
87
88         env->SetIntField(optionalInfo, tag, info.tag);
89
90         jclass enumClass  = env->FindClass("chip/setuppayload/OptionalQRCodeInfo$OptionalQRCodeInfoType");
91         jfieldID enumType = nullptr;
92
93         switch (info.tag)
94         {
95         case optionalQRCodeInfoTypeUnknown:
96             enumType =
97                 env->GetStaticFieldID(enumClass, "TYPE_UNKNOWN", "Lchip/setuppayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;");
98             break;
99         case optionalQRCodeInfoTypeString:
100             enumType =
101                 env->GetStaticFieldID(enumClass, "TYPE_STRING", "Lchip/setuppayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;");
102             break;
103         case optionalQRCodeInfoTypeInt32:
104             enumType =
105                 env->GetStaticFieldID(enumClass, "TYPE_INT32", "Lchip/setuppayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;");
106             break;
107         case optionalQRCodeInfoTypeInt64:
108             enumType =
109                 env->GetStaticFieldID(enumClass, "TYPE_INT64", "Lchip/setuppayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;");
110             break;
111         case optionalQRCodeInfoTypeUInt32:
112             enumType =
113                 env->GetStaticFieldID(enumClass, "TYPE_UINT32", "Lchip/setuppayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;");
114             break;
115         case optionalQRCodeInfoTypeUInt64:
116             enumType =
117                 env->GetStaticFieldID(enumClass, "TYPE_UINT64", "Lchip/setuppayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;");
118             break;
119         default:
120             break;
121         }
122
123         jobject enumObj = env->GetStaticObjectField(enumClass, enumType);
124         env->SetObjectField(optionalInfo, type, enumObj);
125
126         env->SetObjectField(optionalInfo, data, env->NewStringUTF(info.data.c_str()));
127         env->SetIntField(optionalInfo, int32, info.int32);
128
129         env->CallVoidMethod(setupPayload, addOptionalInfoMid, optionalInfo);
130     }
131
132     return setupPayload;
133 }