--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/javacommons/utils/src.s60/properties.cpp Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,320 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+
+#include <memory>
+#include <jni.h>
+#include <f32file.h>
+#include <sysversioninfo.h>
+#include <versioninfo.h>
+#include <sysutil.h>
+#include <hal.h>
+
+#ifdef RD_JAVA_UI_QT
+
+#include <QLocale>
+
+#else // RD_JAVA_UI_QT
+
+#include <bautils.h>
+#include <barsc.h>
+#include <avkon.rsg>
+#include <AknUtils.h>
+
+#endif // RD_JAVA_UI_QT
+
+#include "javaenvinfo.h"
+#include "commonproperties.h"
+#include "javacommonutils.h"
+#include "exceptionbase.h"
+#include "logger.h"
+#include "s60commonutils.h"
+
+using namespace java::util;
+
+jstring getS60LocaleL(JNIEnv* env);
+
+#ifndef RD_JAVA_UI_QT
+
+HBufC* getS60LocaleTempImplL();
+
+#endif // RD_JAVA_UI_QT
+
+HBufC* MicroEditionPlatformL();
+TInt getHardwareVersionL(TDes& aHardwareType);
+
+const TUint KBufferSize = 32;
+_LIT(KMicroeditionPlatform, "S60");
+_LIT(KMicroeditionPlatformValueDefaultPrefix, "Series60");
+_LIT(KMicroeditionPlatformName, "sw_platform=");
+_LIT(KMicroeditionPlatformVersion, "sw_platform_version=");
+_LIT(KMicroeditionPlatformJavaVersion, "java_build_version=");
+
+jstring java::util::getLocaleImpl(JNIEnv* env)
+{
+ JELOG2(EUtils);
+
+#ifdef RD_JAVA_UI_QT
+
+ QString localeName = QLocale::system().name();
+
+ jstring loc = env->NewString(localeName.utf16(), localeName.size());
+ if (!loc)
+ {
+ std::bad_alloc();
+ }
+ return loc;
+
+#else // RD_JAVA_UI_QT
+ jstring loc = 0;
+ HBufC* buf = 0;
+ bool usingTempSolution = false;
+ TRAPD(err, buf = AknLangUtils::DisplayLanguageTagL());
+ if (buf == 0 && err == KErrNotSupported)
+ {
+ //At the moment DisplayLanguageTagL must be called from
+ //UI thread. Once this is fixed by the Avkon, we must
+ //use temporary solution.
+ usingTempSolution = true;
+ TRAP(err, buf = getS60LocaleTempImplL());
+ }
+ if (buf == 0)
+ {
+ std::string errorStr = "Could not solve locale when using ";
+ if (usingTempSolution)
+ {
+ errorStr.append("temp");
+ }
+ else
+ {
+ errorStr.append("original");
+ }
+ errorStr.append(" solution. Leave code = ");
+ errorStr.append(JavaCommonUtils::intToString(err));
+ throw ExceptionBase(errorStr,
+ __FILE__,__FUNCTION__,__LINE__);
+ }
+ const jchar* stringPtr = buf->Ptr();
+ const jsize stringLength = buf->Length();
+ loc = env->NewString(stringPtr, stringLength);
+ delete buf;
+ return loc;
+
+#endif // RD_JAVA_UI_QT
+}
+
+jstring java::util::getPlatformImpl(JNIEnv* aEnv)
+{
+ JELOG2(EUtils);
+
+
+ jstring platform = NULL;
+ std::auto_ptr<HBufC> propertyValue(0);
+
+ TRAP_IGNORE(propertyValue.reset(MicroEditionPlatformL()));
+ if (propertyValue.get())
+ {
+ platform = S60CommonUtils::NativeToJavaString(*aEnv,*propertyValue.get());
+ }
+ return platform;
+}
+
+#ifndef RD_JAVA_UI_QT
+
+HBufC* getS60LocaleTempImplL()
+{
+ JELOG2(EUtils);
+ _LIT(KFileName, "z:\\resource\\avkon.rsc");
+ TFileName fileName(KFileName);
+ RFs iRFs;
+ CleanupClosePushL(iRFs);
+ User::LeaveIfError(iRFs.Connect());
+ BaflUtils::NearestLanguageFile(iRFs, fileName);
+ RResourceFile resourceFile;
+ CleanupClosePushL(resourceFile);
+ resourceFile.OpenL(iRFs, fileName);
+ resourceFile.ConfirmSignatureL(0);
+ HBufC8* textBuf8 = resourceFile.AllocReadLC(R_QTN_LANGUAGE_RFC3066_TAG);
+ const TPtrC16 ptrBuf8((TText16*) textBuf8->Ptr(), (textBuf8->Length() + 1) >> 1);
+ HBufC16* tag = ptrBuf8.AllocL();
+ CleanupStack::PopAndDestroy(3);
+ return tag;
+
+}
+
+#endif // RD_JAVA_UI_QT
+
+HBufC* GetPlatformVersionL()
+{
+ VersionInfo::TPlatformVersion platformVersion;
+ User::LeaveIfError(VersionInfo::GetVersion(platformVersion));
+ TBuf<KBufferSize> version;
+
+ version.AppendNum(platformVersion.iMajorVersion);
+ version.Append('.');
+ version.AppendNum(platformVersion.iMinorVersion);
+
+ return version.AllocL();
+}
+
+HBufC* MicroEditionPlatformL()
+{
+ // First try to get the actual device name
+ // If the device name is not found the default value is used: Series60/
+ HBufC *productName= NULL;
+
+ TBuf<KBufferSize> hardwareType(0);
+ int retCode = getHardwareVersionL(hardwareType);
+
+ if (retCode == KErrNone && hardwareType.Length() > 0)
+ {
+ TInt slashAfterManufacturer = hardwareType.Locate('/');
+ TInt spaceAfterManufacturer = hardwareType.Locate(' ');
+ TPtrC productNameShort = hardwareType;
+
+ if ((slashAfterManufacturer != KErrNotFound) ||
+ (spaceAfterManufacturer != KErrNotFound))
+ {
+ if (slashAfterManufacturer == KErrNotFound)
+ {
+ productNameShort.Set(hardwareType.Left(
+ spaceAfterManufacturer));
+ }
+ else if (spaceAfterManufacturer == KErrNotFound)
+ {
+ productNameShort.Set(hardwareType.Left(
+ slashAfterManufacturer));
+ }
+ else
+ {
+ productNameShort.Set(hardwareType.Left(
+ slashAfterManufacturer < spaceAfterManufacturer ?
+ slashAfterManufacturer :
+ spaceAfterManufacturer));
+ }
+ }
+
+ productName = HBufC::NewL(productNameShort.Length());
+ productName->Des().Copy(productNameShort);
+ }
+
+ if (!productName)
+ {
+ productName = KMicroeditionPlatformValueDefaultPrefix().AllocLC();
+ }
+ else
+ {
+ CleanupStack::PushL(productName);
+ }
+
+ HBufC* platformName = NULL;
+
+ TBuf<KSysUtilVersionTextLength> swVersion;
+ if (SysUtil::GetSWVersion(swVersion) == KErrNone && swVersion.Length()>0)
+ {
+ // Assume syntax V xx.xx\ndd-mm-yy\nNHL-vvv\n(c)Vendor
+ TInt NLloc = swVersion.Locate('\n');
+ TPtrC verPtr = swVersion.Mid(2, NLloc-2); // skip "V " in the beginning
+
+ // Get platform minor and major version numbers
+ HBufC* platformVersionValue = GetPlatformVersionL();
+ CleanupStack::PushL(platformVersionValue);
+
+ // Get platform properties and values
+ HBufC* platformNameProperty = KMicroeditionPlatformName().AllocLC();
+ HBufC* platformNameValue = KMicroeditionPlatform().AllocLC();
+ HBufC* platformVersionProperty = KMicroeditionPlatformVersion().AllocLC();
+ HBufC* platformJavaVersionProperty = KMicroeditionPlatformJavaVersion().AllocLC();
+
+ // Get Java version number
+ TVersion versionInfo = Java::JavaEnvInfo::Version();
+ TVersionName versionName;
+ versionName.AppendNum(versionInfo.iMajor);
+ versionName.Append('.');
+ versionName.AppendNum(versionInfo.iMinor);
+ versionName.Append('.');
+ versionName.AppendNum(versionInfo.iBuild);
+ HBufC* platformJavaVersionValue = versionName.AllocL();
+ CleanupStack::PushL(platformJavaVersionValue);
+
+ // Calculate length of property string
+ TUint propertyLength = productName->Length() + 1 + verPtr.Length() + 1;
+ propertyLength += platformNameProperty->Length();
+ propertyLength += platformNameValue->Length() + 1;
+ propertyLength += platformVersionProperty->Length();
+ propertyLength += platformVersionValue->Length() + 1;
+ propertyLength += platformJavaVersionProperty->Length();
+ propertyLength += platformJavaVersionValue->Length();
+
+ // Concatenate properties
+ platformName = HBufC::NewL(propertyLength);
+ platformName->Des().Append(*productName);
+ platformName->Des().Append('/');
+ platformName->Des().Append(verPtr);
+ platformName->Des().Append('/');
+ platformName->Des().Append(*platformNameProperty);
+ platformName->Des().Append(*platformNameValue);
+ platformName->Des().Append(';');
+ platformName->Des().Append(*platformVersionProperty);
+ platformName->Des().Append(*platformVersionValue);
+ platformName->Des().Append(';');
+ platformName->Des().Append(*platformJavaVersionProperty);
+ platformName->Des().Append(*platformJavaVersionValue);
+
+ CleanupStack::PopAndDestroy(platformJavaVersionValue);
+ CleanupStack::PopAndDestroy(platformJavaVersionProperty);
+ CleanupStack::PopAndDestroy(platformVersionProperty);
+ CleanupStack::PopAndDestroy(platformNameValue);
+ CleanupStack::PopAndDestroy(platformNameProperty);
+ CleanupStack::PopAndDestroy(platformVersionValue);
+ }
+
+ CleanupStack::PopAndDestroy(productName);
+ return platformName;
+}
+
+jint java::util::getFreeMemoryImpl(JNIEnv*)
+{
+ JELOG2(EUtils);
+ int freeMemory = -1;
+ HAL::Get(HAL::EMemoryRAMFree, freeMemory);
+ return freeMemory;
+}
+
+TInt getHardwareVersionL(TDes& aHardwareType)
+{
+ SysVersionInfo::TProductVersion pVersion;
+
+ RFs fs;
+ User::LeaveIfError(fs.Connect());
+ CleanupClosePushL(fs);
+ TInt rc = SysVersionInfo::GetVersionInfo(pVersion, fs);
+
+ if (rc == KErrNone)
+ {
+ aHardwareType.Append(pVersion.iManufacturer);
+ aHardwareType.Append(pVersion.iModel);
+ aHardwareType.Append('/');
+ aHardwareType.Append(pVersion.iProduct);
+ aHardwareType.Append(pVersion.iRevision);
+ aHardwareType.Append(';');
+ }
+
+ CleanupStack::PopAndDestroy(&fs);
+ return rc;
+}
+