smartinstaller/common/config.cpp
author Santosh V Patil <santosh.v.patil@nokia.com>
Wed, 30 Jun 2010 11:01:26 +0530
branchADM
changeset 48 364021cecc90
permissions -rw-r--r--
SmartInstaller contribution based on the Nokia Qt SDK 1.0 release

/*
* Copyright (c) 2009-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:
*     Implementation to read from the config file.
*
*
*/

#include "config.h"

// ---------------------------------------------------------------------------
// WriteIntToConfigFile
//
// Write the given TUint32 value and tag into the given file.
//
// @return TInt normal Symbian error code or KErrNone if all went OK.
// ---------------------------------------------------------------------------
//
TInt WriteIntToConfigFile( RFile& aFile, const TDesC& aTag, const TUint32 aValue )
	{
	const TInt valueLength = 10; //Length of TUint32
	TBufC<valueLength> value;
	TPtr valuePtr = value.Des();

	valuePtr.AppendNum(aValue);
	TInt err = WriteToConfigFile( aFile, aTag, value );

	return err;
	}

// ---------------------------------------------------------------------------
// WriteToConfigFile
//
// Write the given value-tag pair into the given file.
//
// @return TInt normal Symbian error code or KErrNone if all went OK.
// ---------------------------------------------------------------------------
//
TInt WriteToConfigFile( RFile& aFile, const TDesC& aTag, const TDesC& aValue )
	{
	TFileText outTextFile;
	outTextFile.Set(aFile);

	HBufC* content = HBufC::New( aTag.Length() + aValue.Length());
	if(!content)
		{
		return KErrNoMemory;
		}
	CleanupStack::PushL(content);
	TPtr ptr(content->Des());

	ptr.Copy(aTag);
	ptr.Append(aValue);

	TInt err = outTextFile.Write(ptr);
	CleanupStack::PopAndDestroy(content);

	if( err != KErrNone)
		{
		return err;
		}
	return KErrNone;
	}

// ---------------------------------------------------------------------------
// EnsureNewLineAtEnd
//
// Add a newline character as a last character in the file.
//
// @return TInt normal Symbian error code or KErrNone if all went OK.
// ---------------------------------------------------------------------------
//
TInt EnsureNewLineAtEnd(RFile& aFile)
	{
	// Get last 2-bytes before EOF
	// to check for new line character
	TInt pos = -2;
	TInt err = aFile.Seek(ESeekEnd, pos);
	if(err != KErrNone)
		{
		return err;
		}

	TBuf8<2> buf;
	err = aFile.Read(buf);
	if(err != KErrNone)
		{
		return err;
		}

	// Ascii value of new line character is 10
	if(buf[0] != 10 )
		{
		TFileText outTextFile;
		outTextFile.Set(aFile);

		// Write will append newline character
		err = outTextFile.Write(KNullDesC);
		if( err != KErrNone)
			{
			return err;
			}
		}
	return KErrNone;
	}

// ---------------------------------------------------------------------------
// ReadConfigFile
//
// Reads the configuration file to aBuffer, aLineBuffer containing the pointers to lines.
//
// @return TInt normal Symbian error code or KErrNone if all went OK.
// ---------------------------------------------------------------------------
//
TInt ReadConfigFile(RFile& aFile, TDes& aBuffer, RArray< TPtrC >& aLineBuffer )
	{
	// Read text file into buffers
	TInt ret( KErrNone );
	TFileText tf;
	tf.Set( aFile );
	aBuffer.SetMax();
	TPtr ptr( aBuffer.MidTPtr( 0 ) );
	TInt used( 0 );
	do
		{
		ret = tf.Read( ptr );
		TInt len( ptr.Length() );
		if ( ( ret == KErrNone || ret == KErrEof ) && len > 0 )
			{
			// Store non-empty text line
			TInt err( aLineBuffer.Append( ptr ) );
			if ( err == KErrNone )
				{
				ptr.SetMax();
				ptr.Set( ptr.MidTPtr( len ) );
				ptr.Zero();
				used += len;
				}
			else
				{
				ret = err;
				}
			}
		}
	while ( ret == KErrNone );
	if ( ret == KErrEof )
		{
		// reached the end of file without any other error => this is OK
		ret = KErrNone;
		}
	aBuffer.SetLength( used );

	return ret;
	}

// ---------------------------------------------------------------------------
// ReadConfigFile
//
// @return HBufC containg the read config file. aLineBuffer arrays pointing to lines.
// ---------------------------------------------------------------------------
//
HBufC* ReadConfigFile( RFs& aFs, const TDesC& aFullPath, RArray< TPtrC >& aLineBuffer, TInt& aError )
	{
	RFile file;
	aError = file.Open( aFs, aFullPath, EFileRead | EFileStreamText | EFileShareReadersOnly );
	if ( aError != KErrNone )
		{
		return NULL;
		}
	TInt size( 0 );
	aError = file.Size( size );
	if ( aError != KErrNone )
		{
		file.Close();
		return NULL;
		}
	// Get text size, create buffer for text and read text file
	HBufC* ret = HBufC::New( ( size + sizeof( TText ) - 1 ) / sizeof( TText ) );
	if ( !ret )
		{
		aError = KErrNoMemory;
		file.Close();
		return NULL;
		}
	TPtr ptr( ret->Des() );
	aError = ReadConfigFile( file, ptr, aLineBuffer );
	file.Close();
	if ( aError != KErrNone )
		{
		delete ret;
		aLineBuffer.Reset();
		return NULL;
		}
	return ret;
	}

// ---------------------------------------------------------------------------
// GetConfigValue
//
// Gets string specified by tag. For examples:
// Tag1=Value1  Tag1 = aTag, Value1 will be copied to aTag
// aError Normal Symbian error code or KErrNone if all went OK.
// ---------------------------------------------------------------------------
//
TPtrC GetConfigValue( const TDesC& aTag, const RArray< TPtrC >& aLineBuffer, TInt& aError )
	{
	aError = KErrNotFound;
	TPtrC ret( KNullDesC );
	const TInt tagLen( aTag.Length() );
	const TInt count( aLineBuffer.Count() );
	for( TInt i( 0 ); i < count; ++i )
		{
		TPtrC line( aLineBuffer[ i ] );
		if ( !line.Left( tagLen ).CompareF( aTag ) )
			{
			ret.Set( line.Mid( tagLen ) );
			aError = KErrNone;
			break;
			}
		}

	return ret;
	}

TInt CompareVersions(TVersion& version1,TVersion& version2)
	{
	// Compare the versions based on major,minor and build number.
	if((version1.iMajor == version2.iMajor)&&(version1.iMinor == version2.iMinor)&&(version1.iBuild == version2.iBuild))
		{
		return EEqualVersion;
		}
	else if ((version1.iMajor > version2.iMajor) ||
			((version1.iMajor == version2.iMajor)&&(version1.iMinor > version2.iMinor)) ||
			((version1.iMajor == version2.iMajor)&&(version1.iMinor == version2.iMinor)&&(version1.iBuild >= version2.iBuild)))
		{
		return EGreaterFirstVersion;
		}
	else
		{
		return EGreaterSecondVersion;
		}
	}

TBool SetVersion(const TDesC8& aVersionPtr, TVersion& aVer)
	{
	// Function will return EFalse if aVersionPtr is not a valid
	// version string
	TLex8 lex(aVersionPtr);
	TInt count = 0;
	lex.SkipSpace();

	// Get Major Version (max length 3)
	const TInt maxMajorVersionLength = 3;
	lex.Mark();
	while ( (count<maxMajorVersionLength) && (lex.Peek() != '.') )
		{
		lex.Inc();
		++count;
		}

	if (!(lex.Peek() == '.'))
		{
		return EFalse;
		}

	TLex8 lexToken(lex.MarkedToken());
	if ( lexToken.Val(aVer.iMajor) != KErrNone )
		{
		return EFalse;
		}

	// Get Minor Version(max length 2)
	const TInt maxMinorVersionLength = 2;
	count = 0;
	lex.Inc();
	lex.Mark();
	while ( (count<maxMinorVersionLength) && (lex.Peek() != '.') )
		{
		lex.Inc();
		++count;
		}

	lexToken.Assign(lex.MarkedToken());
	if ( lexToken.Val(aVer.iMinor) != KErrNone )
		{
		return EFalse;
		}

	// Check if Build Number exists,
	// otherwise return
	if (!(lex.Peek() == '.'))
		 {
		 lex.Mark();
		 lex.SkipCharacters();
		 if (lex.TokenLength() > 0)
			 {
			 return EFalse;
			 }
		 else
			 {
			 aVer.iBuild = 0;
			 return ETrue;
			 }
		 }

	// Get Build Number(max length 5)
	const TInt maxBuildNoLength = 5;
	lex.Inc();
	lex.Mark();
	lex.SkipCharacters();

	if (lex.TokenLength() > maxBuildNoLength)
		{
		return EFalse;
		}

	lexToken.Assign(lex.MarkedToken());
	if ( lexToken.Val(aVer.iBuild) != KErrNone )
		{
		return EFalse;
		}
	return ETrue;
	}