--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/smartinstaller/common/config.cpp Wed Jun 30 11:01:26 2010 +0530
@@ -0,0 +1,334 @@
+/*
+* 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;
+ }