13d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby/*
23d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * Copyright (C) 2014 The Android Open Source Project
33d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *
43d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * Licensed under the Apache License, Version 2.0 (the "License");
53d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * you may not use this file except in compliance with the License.
63d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * You may obtain a copy of the License at
73d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *
83d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *      http://www.apache.org/licenses/LICENSE-2.0
93d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *
103d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * Unless required by applicable law or agreed to in writing, software
113d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * distributed under the License is distributed on an "AS IS" BASIS,
123d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * See the License for the specific language governing permissions and
143d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * limitations under the License.
153d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby */
163d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
173d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include "DmtJavaPluginManager.h"
183d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include "DmtJavaPluginNode.h"
193d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include "DmtJavaPluginCommon.h"
203d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include "DmtJavaMethod.h"
213d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
223d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include <android_runtime/AndroidRuntime.h>
233d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
243d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include <stdlib.h>
253d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
263d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#define DECLARE_METHOD(method, methodName, methodParam)                                     \
273d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DmtJavaMethod method(mEnv, mJavaPluginManager, (methodName), (methodParam));            \
283d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (!method.isFound())                                                                  \
293d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {                                                                                       \
303d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Failed to get %s() method\n", (methodName));                   \
313d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;                                                              \
323d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
333d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
343d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#define DECLARE_STRING(obj, str)                                                            \
353d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DmtJString obj(mEnv, mEnv->NewStringUTF(str));                                          \
363d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (!obj)                                                                               \
373d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {                                                                                       \
383d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Failed to create jstring %s\n", (!str ? "" : str));            \
393d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;                                                              \
403d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
413d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
423d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#define CHECK_EXCEPTION(retcode)                                                            \
433d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (mEnv->ExceptionCheck())                                                             \
443d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {                                                                                       \
453d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("An exception is thrown\n");                                    \
463d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        (retcode) = SYNCML_DM_FAIL;                                                         \
473d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
483d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
493d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambyDmtJavaPluginManager::DmtJavaPluginManager(const char* pPath, DMStringMap& mapParameters)
503d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    : mEnv(NULL), mJavaPluginManager(mEnv), mIsInitialized(false)
513d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{
523d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (!InitJNIEnv()                       ||
533d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        !InitJavaPluginManager()            ||
543d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        !InitJavaPlugin(pPath, mapParameters))
553d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
563d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Fail to init DmtJavaPluginManager!\n");
573d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return;
583d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
593d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
603d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    mIsInitialized = true;
613d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
623d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
633d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambyDmtJavaPluginManager::~DmtJavaPluginManager()
643d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{
653d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (InitJNIEnv() && mEnv != NULL && mJavaPluginManager != NULL)
663d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
673d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        ReleasePluginManager();
683d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
693d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
703d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
713d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambybool DmtJavaPluginManager::InitJNIEnv()
723d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{
733d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    JavaVM* jvm = android::AndroidRuntime::getJavaVM();
743d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (jvm != NULL)
753d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
763d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return jvm->GetEnv((void**)&mEnv, JNI_VERSION_1_6) == JNI_OK;
773d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
783d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
793d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    JavaVMOption options[1];
803d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    memset(&options, 0, sizeof(options));
813d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
823d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    options[0].optionString = "-Djava.class.path=/system/framework/com.android.omadm.plugin.jar:/system/framework/com.android.omadm.plugin.dev.jar";
833d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
843d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    JavaVMInitArgs initArgs;
853d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    memset(&initArgs, 0, sizeof(initArgs));
863d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
873d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    initArgs.version  = JNI_VERSION_1_6;
883d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    initArgs.options  = options;
893d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    initArgs.nOptions = 1;
903d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    initArgs.ignoreUnrecognized = JNI_TRUE;
913d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
923d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DmtJavaPlugin_Debug("Create new JVM\n");
933d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    return JNI_CreateJavaVM(&jvm, &mEnv, &initArgs) == JNI_OK;
943d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
953d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
963d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambybool DmtJavaPluginManager::InitJavaPluginManager()
973d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{
983d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DmtJavaMethod constructor(mEnv,"com/android/omadm/plugin/impl/DmtPluginManager", "<init>", "()V");
993d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (!constructor.isFound())
1003d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
1013d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return false;
1023d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
1033d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1043d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DmtJObject localPluginManager(mEnv, mEnv->NewObject(constructor.getClass(), constructor.getMethodID()));
1053d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (!localPluginManager)
1063d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
1073d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Failed to create new object for DmtPluginManager!\n");
1083d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return false;
1093d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
1103d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1113d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    mJavaPluginManager.assignValue(localPluginManager.getValue(), mEnv);
1123d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1133d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    return (mJavaPluginManager != NULL);
1143d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
1153d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1163d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambybool DmtJavaPluginManager::InitJavaPlugin(const char* pPath, DMStringMap& mapParameters)
1173d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{
1183d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (pPath == NULL)
1193d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
1203d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Path is null\n");
1213d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return false;
1223d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
1233d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1243d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DmtJavaMethod javaMethod(mEnv, mJavaPluginManager, "initJavaPlugin", "(Ljava/lang/String;[Ljava/lang/String;)Z");
1253d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (!javaMethod.isFound())
1263d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
1273d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Failed to get loadJavaPlugin()\n");
1283d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return false;
1293d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
1303d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1313d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DmtJString objPath(mEnv, mEnv->NewStringUTF(pPath));
1323d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DmtJClass  classString(mEnv, mEnv->FindClass("java/lang/String"));
1333d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DmtJObjectArray objStrArray(mEnv, mEnv->NewObjectArray(mapParameters.size() * 2, classString, NULL));
1343d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (!objPath || !classString || !objStrArray)
1353d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
1363d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Failed to create jstring or jobjectArray\n");
1373d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return false;
1383d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
1393d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1403d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    int i = 0;
1413d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    for (DMStringMap::POS it = mapParameters.begin(); it != mapParameters.end(); it++)
1423d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
1433d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJString name(mEnv,  mEnv->NewStringUTF(mapParameters.get_key(it).c_str()));
1443d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJString value(mEnv, mEnv->NewStringUTF(mapParameters.get_value(it).c_str()));
1453d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        if (!name || !value)
1463d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        {
1473d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            DmtJavaPlugin_Debug("Failed to create string for name or value\n");
1483d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            return false;
1493d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        }
1503d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        mEnv->SetObjectArrayElement(objStrArray, i    , name);
1513d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        mEnv->SetObjectArrayElement(objStrArray, i + 1, value);
1523d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1533d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        i += 2;
1543d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
1553d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1563d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    jboolean isInitialized = mEnv->CallBooleanMethod(mJavaPluginManager, javaMethod,
1573d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                                                     objPath.getValue(), objStrArray.getValue());
1583d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    return (!mEnv->ExceptionCheck() && isInitialized);
1593d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
1603d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1613d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyvoid DmtJavaPluginManager::ReleasePluginManager()
1623d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{
1633d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DmtJavaMethod javaMethod(mEnv, mJavaPluginManager, "release", "()V");
1643d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (!javaMethod.isFound()) {
1653d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Fail to get release() method\n");
1663d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return;
1673d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
1683d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1693d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    mEnv->CallVoidMethod(mJavaPluginManager, javaMethod);
1703d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
1713d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1723d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambySYNCML_DM_RET_STATUS_T DmtJavaPluginManager::GetDmtNodeValue(jint& type,
1733d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                                                             char*& pValue,
1743d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                                                             const DmtData& data)
1753d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{
1763d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DMString dmStringValue;
1773d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1783d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    SYNCML_DM_RET_STATUS_T retcode = data.GetString(dmStringValue);
1793d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (retcode != SYNCML_DM_SUCCESS)
1803d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
1813d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Fail to get string value\n");
1823d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;
1833d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
1843d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1853d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    const char* pStringValue = dmStringValue.c_str();
1863d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1873d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    size_t size = strlen(pStringValue) + 1;
1883d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1893d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    pValue = new char[size];
1903d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (!pValue) {
1913d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Fail to allocate memory\n");
1923d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;
1933d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
1943d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1953d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    strcpy(pValue, pStringValue);
1963d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1973d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    switch (data.GetType())
1983d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
1993d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        case SYNCML_DM_DATAFORMAT_NULL:
2003d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            type = JAVA_SYNCML_DM_DATAFORMAT_NULL;
2013d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            break;
2023d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2033d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        case SYNCML_DM_DATAFORMAT_STRING:
2043d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            type = JAVA_SYNCML_DM_DATAFORMAT_STRING;
2053d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            break;
2063d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2073d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        case SYNCML_DM_DATAFORMAT_INT:
2083d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            type = JAVA_SYNCML_DM_DATAFORMAT_INT;
2093d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            break;
2103d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2113d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        case SYNCML_DM_DATAFORMAT_BOOL:
2123d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            type = JAVA_SYNCML_DM_DATAFORMAT_BOOL;
2133d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            break;
2143d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2153d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        case SYNCML_DM_DATAFORMAT_BIN:
2163d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            type = JAVA_SYNCML_DM_DATAFORMAT_BIN;
2173d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            break;
2183d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2193d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        case SYNCML_DM_DATAFORMAT_DATE:
2203d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            type = JAVA_SYNCML_DM_DATAFORMAT_DATE;
2213d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            break;
2223d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2233d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        case SYNCML_DM_DATAFORMAT_TIME:
2243d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            type = JAVA_SYNCML_DM_DATAFORMAT_TIME;
2253d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            break;
2263d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2273d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        case SYNCML_DM_DATAFORMAT_FLOAT:
2283d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            type = JAVA_SYNCML_DM_DATAFORMAT_FLOAT;
2293d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            break;
2303d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2313d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        default:
2323d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            DmtJavaPlugin_Debug("Unsupported DmtData type=%d!\n", data.GetType());
2333d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            delete[] pValue;
2343d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            pValue = NULL;
2353d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            return SYNCML_DM_FAIL;
2363d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
2373d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2383d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    return SYNCML_DM_SUCCESS;
2393d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
2403d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2413d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambySYNCML_DM_RET_STATUS_T DmtJavaPluginManager::SetDmtNodeValue(const char* pType,
2423d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                                                             const char* pValue,
2433d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                                                             DmtData& data)
2443d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{
2453d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (pType == NULL)
2463d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
2473d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Failed to get value type\n");
2483d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;
2493d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
2503d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2513d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    switch (atoi(pType))
2523d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
2533d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        case JAVA_SYNCML_DM_DATAFORMAT_NULL:
2543d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            data.SetString(NULL, SYNCML_DM_DATAFORMAT_NULL);
2553d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            break;
2563d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2573d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        case JAVA_SYNCML_DM_DATAFORMAT_STRING:
2583d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            data.SetString(pValue, SYNCML_DM_DATAFORMAT_STRING);
2593d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            break;
2603d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2613d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        case JAVA_SYNCML_DM_DATAFORMAT_INT:
2623d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            data.SetString(pValue, SYNCML_DM_DATAFORMAT_INT);
2633d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            break;
2643d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2653d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        case JAVA_SYNCML_DM_DATAFORMAT_BOOL:
2663d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            data.SetString(pValue, SYNCML_DM_DATAFORMAT_BOOL);
2673d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            break;
2683d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2693d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        case JAVA_SYNCML_DM_DATAFORMAT_BIN:
2703d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            data.SetBinary((UINT8*)pValue, strlen(pValue));
2713d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            break;
2723d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2733d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        case JAVA_SYNCML_DM_DATAFORMAT_DATE:
2743d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            data.SetString(pValue, SYNCML_DM_DATAFORMAT_DATE);
2753d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            break;
2763d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2773d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        case JAVA_SYNCML_DM_DATAFORMAT_TIME:
2783d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            data.SetString(pValue, SYNCML_DM_DATAFORMAT_TIME);
2793d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            break;
2803d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2813d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        case JAVA_SYNCML_DM_DATAFORMAT_FLOAT:
2823d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            data.SetString(pValue, SYNCML_DM_DATAFORMAT_FLOAT);
2833d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            break;
2843d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2853d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        case JAVA_SYNCML_DM_DATAFORMAT_NODE:
2863d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            {
2873d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                DMStringVector vec;
2883d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                if (pValue != NULL && *pValue != 0)
2893d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                {
2903d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                    const char* nodeNameBegin = pValue;
2913d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                    const char* nodeNameEnd = strchr(nodeNameBegin, '\n');
2923d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                    while (nodeNameEnd != NULL)
2933d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                    {
2943d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                        DMString dmNodeName(nodeNameBegin, nodeNameEnd - nodeNameBegin);
2953d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                        vec.push_back(dmNodeName);
2963d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                        nodeNameBegin = nodeNameEnd + 1;
2973d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                        nodeNameEnd = strchr(nodeNameBegin, '\n');
2983d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                    }
2993d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                }
3003d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                data.SetNodeValue(vec);
3013d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            }
3023d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            break;
3033d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
3043d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        default:
3053d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            DmtJavaPlugin_Debug("Unsupported value type\n");
3063d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            return SYNCML_DM_FAIL;
3073d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
3083d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    return SYNCML_DM_SUCCESS;
3093d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
3103d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
3113d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambySYNCML_DM_RET_STATUS_T DmtJavaPluginManager::SetServerID(PDmtTree pTree)
3123d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{
3133d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if(!InitJNIEnv())
3143d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
3153d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Init JNI Env failed...\n");
3163d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;
3173d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
3183d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
3193d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DECLARE_METHOD(javaMethod, "setServerID", "(Ljava/lang/String;)V");
3203d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DECLARE_STRING(objServerID, pTree->GetPrincipal().getName().c_str());
3213d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
3223d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    mEnv->CallVoidMethod(mJavaPluginManager, javaMethod, objServerID.getValue());
3233d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    return SYNCML_DM_SUCCESS;
3243d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
3253d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
3263d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambySYNCML_DM_RET_STATUS_T DmtJavaPluginManager::SetNodeValue(const char* pPath, const DmtData& data)
3273d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{
3283d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if(!InitJNIEnv())
3293d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
3303d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Init JNI Env failed...\n");
3313d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;
3323d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
3333d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
3343d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DECLARE_METHOD(javaMethod, "setNodeValue", "(Ljava/lang/String;ILjava/lang/String;)I");
3353d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
3363d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    jint type = 0;
3373d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    char* pValue = NULL;
3383d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    SYNCML_DM_RET_STATUS_T retcode = GetDmtNodeValue(type, pValue, data);
3393d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (retcode != SYNCML_DM_SUCCESS)
3403d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
3413d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Failed to get node value\n");
3423d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return retcode;
3433d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
3443d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
3453d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DECLARE_STRING(objPath , pPath);
3463d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DECLARE_STRING(objValue, (pValue == NULL ? "" : pValue));
3473d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (pValue == NULL) {
3483d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        delete[] pValue;
3493d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        pValue = NULL;
3503d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
3513d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
3523d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    retcode = mEnv->CallIntMethod(mJavaPluginManager, javaMethod, objPath.getValue(), type, objValue.getValue());
3533d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    CHECK_EXCEPTION(retcode);
3543d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    return retcode;
3553d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
3563d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
3573d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambySYNCML_DM_RET_STATUS_T DmtJavaPluginManager::GetNodeValue(const char* pPath, DmtData& data)
3583d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{
3593d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if(!InitJNIEnv())
3603d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
3613d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Init JNI Env failed...\n");
3623d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;
3633d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
3643d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
3653d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DECLARE_METHOD(javaMethod, "getNodeValue", "(Ljava/lang/String;)[Ljava/lang/String;");
3663d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DECLARE_STRING(objPath, pPath);
3673d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
3683d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    /* The getNodeValue return objStrArray with 2 elements.         */
3693d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    /* The first element is value type and the second is the value. */
3703d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DmtJObjectArray objStrArray(mEnv);
3713d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    objStrArray = static_cast<jobjectArray>(mEnv->CallObjectMethod(mJavaPluginManager,
3723d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                                                                   javaMethod,
3733d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                                                                   (jstring)objPath));
3743d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (mEnv->ExceptionCheck() || !objStrArray)
3753d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
3763d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Got an error for getNodeValue()\n");
3773d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;
3783d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
3793d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
3803d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (mEnv->GetArrayLength(objStrArray) != 2)
3813d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
3823d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby		if (mEnv->GetArrayLength(objStrArray) == 1) {
3833d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby			DmtJObject objStatus(mEnv, mEnv->GetObjectArrayElement(objStrArray, 0));
3843d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby			if (!objStatus)
3853d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby				return SYNCML_DM_FAIL;
3863d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby			const char* pStatus = mEnv->GetStringUTFChars((jstring)objStatus.getValue(), NULL);
3873d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby			SYNCML_DM_RET_STATUS_T retcode = atoi(pStatus);
3883d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby			return retcode;
3893d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby		}
3903d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Array size is not 2!\n");
3913d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;
3923d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
3933d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
3943d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DmtJObject objType(mEnv,  mEnv->GetObjectArrayElement(objStrArray, 0));
3953d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DmtJObject objValue(mEnv, mEnv->GetObjectArrayElement(objStrArray, 1));
3963d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (!objType || !objValue)
3973d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
3983d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Failed to get value type or value object\n");
3993d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;
4003d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
4013d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
4023d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    const char* pType  = mEnv->GetStringUTFChars((jstring)objType.getValue(),  NULL);
4033d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    const char* pValue = mEnv->GetStringUTFChars((jstring)objValue.getValue(), NULL);
4043d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
4053d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    return SetDmtNodeValue(pType, pValue, data);
4063d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
4073d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
4083d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambySYNCML_DM_RET_STATUS_T DmtJavaPluginManager::CreateInteriorNode(const char* pPath)
4093d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{
4103d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if(!InitJNIEnv())
4113d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
4123d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Init JNI Env failed...\n");
4133d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;
4143d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
4153d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
4163d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DECLARE_METHOD(javaMethod, "createInteriorNode", "(Ljava/lang/String;)I");
4173d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DECLARE_STRING(objPath, pPath);
4183d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
4193d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    SYNCML_DM_RET_STATUS_T retcode = mEnv->CallIntMethod(mJavaPluginManager, javaMethod, objPath.getValue());
4203d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    CHECK_EXCEPTION(retcode);
4213d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    return retcode;
4223d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
4233d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
4243d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambySYNCML_DM_RET_STATUS_T DmtJavaPluginManager::CreateLeafNode(const char* pPath, const DmtData& data)
4253d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{
4263d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if(!InitJNIEnv())
4273d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
4283d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Init JNI Env failed...\n");
4293d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;
4303d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
4313d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
4323d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DECLARE_METHOD(javaMethod, "createLeafNode", "(Ljava/lang/String;ILjava/lang/String;)I");
4333d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
4343d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    jint type = 0;
4353d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    char* pValue = NULL;
4363d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    SYNCML_DM_RET_STATUS_T retcode = GetDmtNodeValue(type, pValue, data);
4373d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (retcode != SYNCML_DM_SUCCESS)
4383d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
4393d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Failed to get node value\n");
4403d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return retcode;
4413d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
4423d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
4433d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DECLARE_STRING(objPath,  pPath);
4443d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DECLARE_STRING(objValue, (pValue == NULL ? "" : pValue));
4453d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (pValue != NULL) {
4463d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        delete[] pValue;
4473d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        pValue = NULL;
4483d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
4493d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
4503d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    retcode = mEnv->CallIntMethod(mJavaPluginManager, javaMethod, objPath.getValue(), type, objValue.getValue());
4513d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    CHECK_EXCEPTION(retcode);
4523d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    return retcode;
4533d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
4543d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
4553d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambySYNCML_DM_RET_STATUS_T DmtJavaPluginManager::RenameNode(const char* pPath, const char* pNewNodeName)
4563d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{
4573d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if(!InitJNIEnv())
4583d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
4593d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Init JNI Env failed...\n");
4603d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;
4613d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
4623d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
4633d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DECLARE_METHOD(javaMethod, "renameNode", "(Ljava/lang/String;Ljava/lang/String;)I");
4643d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DECLARE_STRING(objPath, pPath);
4653d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DECLARE_STRING(objNewNodeName, pNewNodeName);
4663d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
4673d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    SYNCML_DM_RET_STATUS_T retcode = mEnv->CallIntMethod(mJavaPluginManager, javaMethod,
4683d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                                                         objPath.getValue(), objNewNodeName.getValue());
4693d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    CHECK_EXCEPTION(retcode);
4703d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    return retcode;
4713d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
4723d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
4733d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambySYNCML_DM_RET_STATUS_T DmtJavaPluginManager::DeleteNode(const char* pPath)
4743d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{
4753d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if(!InitJNIEnv())
4763d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
4773d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Init JNI Env failed...\n");
4783d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;
4793d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
4803d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
4813d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DECLARE_METHOD(javaMethod, "deleteNode", "(Ljava/lang/String;)I");
4823d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DECLARE_STRING(objPath, pPath);
4833d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
4843d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    SYNCML_DM_RET_STATUS_T retcode = mEnv->CallIntMethod(mJavaPluginManager, javaMethod, objPath.getValue());
4853d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    CHECK_EXCEPTION(retcode);
4863d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    return retcode;
4873d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
4883d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
4893d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambySYNCML_DM_RET_STATUS_T DmtJavaPluginManager::Commit()
4903d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{
4913d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if(!InitJNIEnv())
4923d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
4933d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Init JNI Env failed...\n");
4943d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;
4953d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
4963d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
4973d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DECLARE_METHOD(javaMethod, "commit", "()I");
4983d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
4993d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    SYNCML_DM_RET_STATUS_T retcode = mEnv->CallIntMethod(mJavaPluginManager, javaMethod);
5003d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    CHECK_EXCEPTION(retcode);
5013d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    return retcode;
5023d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
5033d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
5043d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambySYNCML_DM_RET_STATUS_T DmtJavaPluginManager::ExecuteNode(const char* pArgs,
5053d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                                                         const char* pCorrelator,
5063d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                                                         PDmtTree    pTree,
5073d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                                                         DMString&   results)
5083d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{
5093d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    results = "";
5103d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
5113d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (pArgs == NULL || pTree == NULL) /*|| pCorrelator == NULL*/
5123d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
5133d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("A parameter is null\n");
5143d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;
5153d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
5163d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
5173d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (!mIsInitialized)
5183d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
5193d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Plug-in is not initialized\n");
5203d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;
5213d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
5223d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
5233d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    SYNCML_DM_RET_STATUS_T retcode = SetServerID(pTree);
5243d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (retcode != SYNCML_DM_SUCCESS)
5253d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
5263d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Fail to set ServerID\n");
5273d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return retcode;
5283d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
5293d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
5303d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if(!InitJNIEnv())
5313d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
5323d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Init JNI Env failed...\n");
5333d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;
5343d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
5353d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
5363d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DECLARE_METHOD(javaMethod, "executeNode", "(Ljava/lang/String;Ljava/lang/String;)I");
5373d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DECLARE_STRING(objArgs, pArgs);
5383d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DECLARE_STRING(objCorrelator, (pCorrelator == NULL ? "" : pCorrelator) );
5393d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
5403d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    retcode = mEnv->CallIntMethod(mJavaPluginManager, javaMethod, objArgs.getValue(), objCorrelator.getValue());
5413d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    CHECK_EXCEPTION(retcode);
5423d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    return retcode;
5433d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
5443d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
5453d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambySYNCML_DM_RET_STATUS_T DmtJavaPluginManager::BuildPluginTree(PDmtJavaPluginTree pTree)
5463d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{
5473d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (pTree == NULL)
5483d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
5493d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Tree is NULL\n");
5503d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;
5513d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
5523d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
5533d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (!mIsInitialized)
5543d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
5553d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Plug-in is not initialized\n");
5563d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;
5573d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
5583d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
5593d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if(!InitJNIEnv())
5603d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
5613d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Init JNI Env failed...\n");
5623d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;
5633d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
5643d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
5653d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DECLARE_METHOD(javaMethod, "getNodes", "()[Ljava/lang/String;");
5663d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
5673d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DmtJObjectArray objStrArray(mEnv);
5683d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    objStrArray = (jobjectArray)(mEnv->CallObjectMethod(mJavaPluginManager, javaMethod));
5693d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if (!objStrArray)
5703d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
5713d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Fail to get nodes\n");
5723d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;
5733d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
5743d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
5753d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    if ((mEnv->GetArrayLength(objStrArray) % 3) != 0)
5763d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
5773d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJavaPlugin_Debug("Array count is invalid!\n");
5783d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return SYNCML_DM_FAIL;
5793d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
5803d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
5813d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    for (int i = 0; i < mEnv->GetArrayLength(objStrArray); i += 3)
5823d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    {
5833d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJObject objPath(mEnv,  mEnv->GetObjectArrayElement(objStrArray, i));
5843d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJObject objType(mEnv,  mEnv->GetObjectArrayElement(objStrArray, i + 1));
5853d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtJObject objValue(mEnv, mEnv->GetObjectArrayElement(objStrArray, i + 2));
5863d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        if (!objPath || !objType || !objValue)
5873d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        {
5883d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            DmtJavaPlugin_Debug("Failed to parse array, iteration:%d\n", i);
5893d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            return SYNCML_DM_FAIL;
5903d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        }
5913d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
5923d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        const char* pPath  = mEnv->GetStringUTFChars((jstring)objPath.getValue(),  NULL);
5933d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        const char* pType  = mEnv->GetStringUTFChars((jstring)objType.getValue(),  NULL);
5943d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        const char* pValue = mEnv->GetStringUTFChars((jstring)objValue.getValue(), NULL);
5953d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        if (pPath == NULL || pType == NULL || pValue == NULL)
5963d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        {
5973d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            DmtJavaPlugin_Debug("Failed to convert to string, iteration:%d\n", i);
5983d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            return SYNCML_DM_FAIL;
5993d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        }
6003d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
6013d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtData data;
6023d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
6033d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        SYNCML_DM_RET_STATUS_T retcode = SetDmtNodeValue(pType, pValue, data);
6043d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        if (retcode != SYNCML_DM_SUCCESS)
6053d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        {
6063d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            return retcode;
6073d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        }
6083d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
6093d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        PDmtJavaPluginNode pNode = new DmtJavaPluginNode(pTree, pPath, data);
6103d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
6113d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        pTree->SetNode(pPath, static_cast<PDmtNode>(pNode));
6123d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
6133d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
6143d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    return SYNCML_DM_SUCCESS;
6153d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
616