javacommons/utils/src/formatterqtnative.cpp
author hgs
Fri, 15 Oct 2010 12:29:39 +0300
changeset 80 d6dafc5d983f
permissions -rw-r--r--
v2.2.19_1

/*
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: formatterqtnative
*
*/


#ifdef RD_JAVA_UI_QT
#include <qcoreapplication.h>
#include <qlibraryinfo.h>
#include <qlocale.h>
#include <qtranslator.h>
#ifdef __SYMBIAN32__
#include <hbparameterlengthlimiter.h>
#include <hbstringutil.h>
#else // __SYMBIAN32__
// If HbParameterLengthLimiter is not available, define it as empty macro.
#define HbParameterLengthLimiter(text) (text)
#endif // __SYMBIAN32__
#endif // RD_JAVA_UI_QT

#include "com_nokia_mj_impl_utils_FormatterQt.h"
#include "com_nokia_mj_impl_utils_ResourceLoader.h"
#include "com_nokia_mj_impl_utils_ResourceLoaderQt.h"
#include "javajniutils.h"
#include "logger.h"

#ifdef __SYMBIAN32__
#include "s60commonutils.h"
#else // __SYMBIAN32__
#define KErrNone (0)
#define KErrNotFound (-1)
#endif // __SYMBIAN32__

using namespace java::util;

JNIEXPORT jstring JNICALL Java_com_nokia_mj_impl_utils_ResourceLoader__1getLocaleIdQt
(JNIEnv *env, jclass)
{
#ifdef RD_JAVA_UI_QT
    QString localeName = QLocale::system().name();
    jstring loc = env->NewString(localeName.utf16(), localeName.size());
    return loc;
#else // RD_JAVA_UI_QT
    (void)env;     // just to suppress a warning
    return NULL;
#endif // RD_JAVA_UI_QT
}

JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_utils_ResourceLoaderQt__1createTranslator
(JNIEnv *aEnv, jclass, jstring aResourceName)
{
#ifdef RD_JAVA_UI_QT
    QString resourceName = QString::fromStdWString(
        JniUtils::jstringToWstring(aEnv, aResourceName)) +
        "_" + QLocale::system().name();

    if (qApp == 0)
    {
        ELOG1(EUtils,
              "ResourceLoaderQt__1createTranslator: QApplication "
              "does not exist. Loading failed for %S",
             resourceName.toStdWString().c_str());
        return KErrNotFound;
    }

    QTranslator* translator = new QTranslator();
    bool translatorLoaded = translator->load(
        resourceName, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
    if (!translatorLoaded)
    {
        translatorLoaded = translator->load(
            resourceName,
            "C:" + QLibraryInfo::location(QLibraryInfo::TranslationsPath));
    }
    if (!translatorLoaded)
    {
        translatorLoaded = translator->load(
            resourceName,
            "Z:" + QLibraryInfo::location(QLibraryInfo::TranslationsPath));
    }
    if (translatorLoaded)
    {
        qApp->installTranslator(translator);
    }
    else
    {
        ILOG1(EUtils, "__1createTranslator: loading resource %S failed",
              resourceName.toStdWString().c_str());
        delete translator;
        return KErrNotFound;
    }
    // Return handle to translator.
    return reinterpret_cast<unsigned int>(translator)>>2;
#else // RD_JAVA_UI_QT
    (void)aEnv; // just to suppress a warning
    (void)aResourceName; // just to suppress a warning
    return KErrNone;
#endif // RD_JAVA_UI_QT
}

JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_utils_ResourceLoaderQt__1deleteTranslator
(JNIEnv *, jclass, jint aHandle)
{
#ifdef RD_JAVA_UI_QT
    QTranslator *pTranslator = reinterpret_cast<QTranslator*>(aHandle<<2);
    QCoreApplication::removeTranslator(pTranslator);
    delete pTranslator;
    return KErrNone;
#else // RD_JAVA_UI_QT
    (void)aHandle; // just to suppress a warning
    return KErrNone;
#endif // RD_JAVA_UI_QT
}

JNIEXPORT jstring JNICALL Java_com_nokia_mj_impl_utils_ResourceLoaderQt__1translate
(JNIEnv *aEnv, jclass, jint aHandle, jstring aId, jint aN)
{
#ifdef RD_JAVA_UI_QT
    (void)aHandle; // just to suppress a warning
    QString id = QString::fromStdWString(JniUtils::jstringToWstring(aEnv, aId));
    QString result = QString(qtTrId(id.toUtf8().constData(), aN));
    return aEnv->NewString(result.utf16(), result.size());
#else // RD_JAVA_UI_QT
    (void)aEnv; // just to suppress a warning
    (void)aHandle; // just to suppress a warning
    (void)aId; // just to suppress a warning
    (void)aN; // just to suppress a warning
    return aId;
#endif // RD_JAVA_UI_QT
}

#ifdef RD_JAVA_UI_QT
QString FormatTextArg(JNIEnv *aEnv, QString aText, jobjectArray aArgs, int aI)
{
    // Check the type of aArgs[aI] and call correct aText.arg() method.
    jobject obj = aEnv->GetObjectArrayElement(aArgs, aI);
    jclass clazz = aEnv->FindClass("java/lang/String");
    if (aEnv->IsInstanceOf(obj, clazz))
    {
        return HbParameterLengthLimiter(aText).arg(
            QString::fromStdWString(
                JniUtils::jstringToWstring(aEnv, (jstring)obj)));
    }
    clazz = aEnv->FindClass("java/lang/Integer");
    if (aEnv->IsInstanceOf(obj, clazz))
    {
        jmethodID method = aEnv->GetMethodID(clazz, "intValue", "()I");
        return HbParameterLengthLimiter(aText).arg(
            aEnv->CallIntMethod(obj, method));
    }
    clazz = aEnv->FindClass("java/lang/Character");
    if (aEnv->IsInstanceOf(obj, clazz))
    {
        jmethodID method = aEnv->GetMethodID(clazz, "charValue", "()C");
        return HbParameterLengthLimiter(aText).arg(
            (char)aEnv->CallCharMethod(obj, method));
    }
    clazz = aEnv->FindClass("java/util/Calendar");
    if (aEnv->IsInstanceOf(obj, clazz))
    {
        jmethodID method = aEnv->GetMethodID(clazz, "get", "(I)I");
        int year = aEnv->CallIntMethod(obj, method, 1); // Calendar.YEAR
        int month = aEnv->CallIntMethod(obj, method, 2) + 1; // Calendar.MONTH
        int day = aEnv->CallIntMethod(obj, method, 5); // Calendar.DAY_OF_MONTH
        QDate date(year, month, day);
        QLocale locale;
        return HbParameterLengthLimiter(aText).arg(
            locale.toString(date, QLocale::ShortFormat));
    }
    return aText;
}
#endif // RD_JAVA_UI_QT

JNIEXPORT jstring JNICALL Java_com_nokia_mj_impl_utils_FormatterQt__1formatParameters
(JNIEnv *aEnv, jclass, jstring aText, jobjectArray aArgs)
{
#ifdef RD_JAVA_UI_QT
    std::wstring wsText = JniUtils::jstringToWstring(aEnv, aText);
    QString text = QString::fromStdWString(wsText);
    int argsLen = aEnv->GetArrayLength(aArgs);
    for (int i = 0; i < argsLen; i++)
    {
        text = FormatTextArg(aEnv, text, aArgs, i);
    }
    return aEnv->NewString(text.utf16(), text.size());
#else // RD_JAVA_UI_QT
    (void)aEnv; // just to suppress a warning
    (void)aText; // just to suppress a warning
    (void)aArgs; // just to suppress a warning
    return aText;
#endif // RD_JAVA_UI_QT
}

JNIEXPORT jstring JNICALL Java_com_nokia_mj_impl_utils_FormatterQt__1formatDigits
(JNIEnv * aEnv, jclass, jstring aText)
{
    jstring ret = aText;
#if defined(RD_JAVA_UI_QT) && defined(__SYMBIAN32__)
    QString text = QString::fromStdWString(
        JniUtils::jstringToWstring(aEnv, aText));
    text = HbStringUtil::convertDigits(text);
    ret = aEnv->NewString(text.utf16(), text.size());
#else // RD_JAVA_UI_QT && __SYMBIAN32__
    (void)aEnv; // just to suppress a warning
#endif // RD_JAVA_UI_QT && __SYMBIAN32__
    return ret;
}