diff -r f5050f1da672 -r 04becd199f91 javacommons/javaenv/src.s60/javaenvinfo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javacommons/javaenv/src.s60/javaenvinfo.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,218 @@ +/* +* 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: CJavaEnvInfo implementation. +* +*/ + + +#include +#include +#include + +#include +#include "logger.h" + +namespace Java +{ + +TInt ParseVersionL(TLex& aVersionText,TBool aLastVersionNumber); + +// User-agent header substring +_LIT(KUserAgentJavaString, "Configuration/CLDC-1.1 Profile/MIDP-2.1"); + +// About application Java version text +_LIT(KAboutApplicationString, "MIDP 2.1, CLDC 1.1"); + +// The path to resource file with java version +_LIT(KMicroeditionJavaVersionFile, "\\resource\\versions\\java.txt"); + +// Length of temporary buffer for string manipulation +const TUint KBufferSize = 32; + +// The min and max values for each version number +// const TUint KMajorVersionMinValue = 1; +const TUint KMajorVersionMaxValue = 127; +// const TUint KMinorVersionMaxValue = 9; +// const TUint KBuildVersionMinValue = 1; +// const TUint KBuildVersionMaxValue = 32767; + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// JavaEnvInfo::Version() +// +// The format of the version text in the version file is: +// '.', '.' +// +// @return Java environment version +// --------------------------------------------------------------------------- +EXPORT_C TVersion JavaEnvInfo::Version() +{ + JELOG2(EUtils); + + TVersion version(0, 0, 0); + + // the error occured during reading a version file is ignored + TRAP_IGNORE(version = GetJavaVersionL()); + + LOG3(EUtils,EInfo," JavaEnvInfo::Version: major = %d, minor = %d, build = %d", + version.iMajor, version.iMinor, version.iBuild); + + return version; +} + +// --------------------------------------------------------------------------- +// JavaEnvInfo::GetUserAgentHeaderL returns the user agent header part. +// +// @return Java related user agent header substring +// --------------------------------------------------------------------------- +EXPORT_C HBufC* JavaEnvInfo::GetUserAgentHeaderL() +{ + JELOG2(EUtils); + HBufC* userAgentHeader = KUserAgentJavaString().AllocL(); + return userAgentHeader; +} + +// --------------------------------------------------------------------------- +// JavaEnvInfo::GetUserAgentHeaderL just returns the hardcoded literal. In +// the future, this might be read from a resource file if there is need for +// localization. +// +// @return About application text +// --------------------------------------------------------------------------- +EXPORT_C HBufC* JavaEnvInfo::GetPlatformInfoL() +{ + JELOG2(EUtils); + HBufC* aboutString = KAboutApplicationString().AllocL(); + return aboutString; +} + +// --------------------------------------------------------------------------- +// JavaEnvInfo::GetJavaVersionL() +// +// The format of the version text in the version file is: +// '.', '.' +// +// The version file can be either in C-drive or in ROM (Z-drive). All the +// other locations are ignored. This means that when updating the Java +// environment, the new text file must be copied to C-drive. +// --------------------------------------------------------------------------- +TVersion JavaEnvInfo::GetJavaVersionL() +{ + JELOG2(EUtils); + + TInt size; + + RFs rfs; + User::LeaveIfError(rfs.Connect()); + CleanupClosePushL(rfs); + + RFile file; + //first try read the version information from C: drive + + LOG(EUtils,EInfo,"GetJavaVersionL: reading file from C: drive"); + TFileName alternateFile = TParsePtrC( + PathInfo::PhoneMemoryRootPath()).Drive(); + alternateFile.Append(KMicroeditionJavaVersionFile); + TInt ret = file.Open(rfs, alternateFile , EFileRead); + + if (ret != KErrNone) + { + LOG(EUtils,EInfo, " GetJavaVersionL: reading file from Z: drive"); + + // if the version information file is not in C:-drive (KErrPathNotFound, + // KErrNotFound) or can not be accessed for another reason, version + // information is read from Z:-drive + TFileName defaultFile = TParsePtrC( + PathInfo::RomRootPath()).Drive(); + defaultFile.Append(KMicroeditionJavaVersionFile); + User::LeaveIfError(file.Open(rfs, defaultFile, EFileRead)); + + LOG(EUtils,EInfo, " GetJavaVersionL: reading file from Z: drive"); + } + + CleanupClosePushL(file); + + User::LeaveIfError(file.Size(size)); + if (size > KBufferSize) + { + size = KBufferSize; + } + + HBufC8* buffer = HBufC8::NewLC(size); + TPtr8 des = buffer->Des(); + User::LeaveIfError(file.Read(des, size)); + + HBufC16* buffer16 = HBufC16::NewLC(size); + buffer16->Des().Copy(des); + + // parse the version numbers (major, minor, build) from the string + // leave if error occurs in string or in its format (e.g.: missing dot char, wrong value) + TLex versionText(buffer16->Des()); + TUint32 majorVersion = ParseVersionL(versionText,EFalse); + TUint32 minorVersion = ParseVersionL(versionText,EFalse); + TUint32 buildVersion = ParseVersionL(versionText,ETrue); + + TVersion version(majorVersion, minorVersion, buildVersion); + + CleanupStack::PopAndDestroy(buffer16); + CleanupStack::PopAndDestroy(buffer); + CleanupStack::PopAndDestroy(&file); + CleanupStack::PopAndDestroy(&rfs); + + return version; +} + +// +// +// +TInt ParseVersionL(TLex& aVersionText,TBool aLastVersionNumber) +{ + JELOG2(EUtils); + + aVersionText.Mark(); + while ((aVersionText.Peek()).IsDigit()) + { + // move to next char + aVersionText.Inc(); + } + TLex partialVersionText(aVersionText.MarkedToken()); + TUint32 version(0); + if (partialVersionText.BoundedVal(version, + EDecimal, + Java::KMajorVersionMaxValue) != KErrNone) + { + LOG(EUtils,EInfo, " GetJavaVersionL: format of value is corrupted (major version)"); + User::Leave(KErrCorrupt); + } + // check format + if (!aLastVersionNumber) + { + if (aVersionText.Peek() == '.') + { + // move to the next char (should be number) + aVersionText.Inc(); + } + else + { + LOG(EUtils,EInfo, " GetJavaVersionL: format of value is corrupted"); + User::Leave(KErrCorrupt); + } + } + return version; +} + +} +