commonservices/PlatformEnv/sysversioninfo/src/sysversioninfo.cpp
changeset 0 4e1aa6a622a0
equal deleted inserted replaced
-1:000000000000 0:4e1aa6a622a0
       
     1 /*
       
     2 * Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Provides version information
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 #include <e32std.h>
       
    21 #include <f32file.h>
       
    22 #include <extendedversioninfoplugin.h>
       
    23 #include <extendedversioninfoplugin.hrh>
       
    24 #include <data_caging_paths_strings.hrh>
       
    25 #include "sysversioninfo.h"
       
    26 #include "sysversioninfodebug.h"
       
    27 
       
    28 // MACROS
       
    29 // needed because _LIT macro does not expand parameter, which is also macro
       
    30 #define _SYSVERSION_CREATE_LIT(a,b) _LIT(a,b)
       
    31 
       
    32 // CONSTANTS
       
    33 const TInt KMaxTextLineLength = 256;
       
    34 _LIT( KNewLinePattern, "\\n" );
       
    35 _LIT( KNewline, "\n" );
       
    36 
       
    37 // Model version string
       
    38 _LIT( KModelVersionFileName, "Z:\\resource\\versions\\model.txt" );
       
    39 
       
    40 // Firmware version
       
    41 _LIT( KFWIDVersionFileName, "Z:\\resource\\versions\\fwid*.txt" );
       
    42 _LIT( KFWIDVersionTag, "version=" );
       
    43 _LIT( KFWIDVersionSeparator, " " );
       
    44 
       
    45 // Customer variant version
       
    46 _LIT( KOPIDVersionFileName, "Z:\\resource\\versions\\customersw.txt" );
       
    47 
       
    48 // Product version
       
    49 _LIT( KProductVersionFileName, "Z:\\resource\\versions\\product.txt" );
       
    50 _LIT( KManufacturerTag, "Manufacturer=" );
       
    51 _LIT( KModelTag, "Model=" );
       
    52 _LIT( KProductTag, "Product=" );
       
    53 _LIT( KRevisionTag, "Revision=" );
       
    54 
       
    55 // Platform version
       
    56 _LIT( KPlatformVersionFileName, "Z:\\resource\\versions\\platform.txt" );
       
    57 _LIT( KSymbianOSMajorVersionTag, "SymbianOSMajorVersion=" );
       
    58 _LIT( KSymbianOSMinorVersionTag, "SymbianOSMinorVersion=" );
       
    59 
       
    60 
       
    61 // ======== LOCAL FUNCTIONS ========
       
    62 
       
    63 // ---------------------------------------------------------------------------
       
    64 // AppendTillMax
       
    65 // ---------------------------------------------------------------------------
       
    66 //
       
    67 static TInt AppendTillMax( TDes& aDst, const TDesC& aSrc )
       
    68     {
       
    69     FUNC_LOG
       
    70 
       
    71     TInt ret( KErrNone );
       
    72     TInt maxLen( aDst.MaxLength() - aDst.Length() );
       
    73     if ( aSrc.Length() <= maxLen )
       
    74         {
       
    75         aDst.Append( aSrc );
       
    76         }
       
    77     else
       
    78         {
       
    79         aDst.Append( aSrc.Left( maxLen ) );
       
    80         ret = KErrTooBig;
       
    81         }
       
    82     LOG_IF_ERROR1( ret, "AppendTillMax-ret=%d", ret )
       
    83     return ret;
       
    84     }
       
    85 
       
    86 // ---------------------------------------------------------------------------
       
    87 // RemoveNewLines
       
    88 // ---------------------------------------------------------------------------
       
    89 //
       
    90 static void RemoveNewLines( TDes& aValue )
       
    91     {
       
    92     FUNC_LOG
       
    93 
       
    94     // Replace new-line patterns with real ones
       
    95     TInt lnPatLen( KNewLinePattern().Length() );
       
    96     TInt lnLen( KNewline().Length() );
       
    97     TInt lnDiff( lnPatLen - lnLen );
       
    98     TInt len( aValue.Length() );
       
    99     TPtr ptr( aValue.MidTPtr( 0 ) );
       
   100     TInt pos( ptr.Find( KNewLinePattern ) );
       
   101     while ( pos != KErrNotFound )
       
   102         {
       
   103         ptr.Replace( pos, lnPatLen, KNewline );
       
   104         len -= lnDiff;
       
   105         ptr.Set( ptr.MidTPtr( pos ) );
       
   106         pos = ptr.Find( KNewLinePattern );
       
   107         }
       
   108     aValue.SetLength( len );
       
   109     }
       
   110 
       
   111 // ---------------------------------------------------------------------------
       
   112 // GetTextFromFile
       
   113 // ---------------------------------------------------------------------------
       
   114 //
       
   115 static TInt GetTextFromFile(
       
   116         RFile& aFile,
       
   117         TDes& aValue,
       
   118         const TDesC& aTag = KNullDesC )
       
   119     {
       
   120     FUNC_LOG
       
   121 
       
   122     // Create line buffer and fetch text from file
       
   123     HBufC* buffer = HBufC::New( KMaxTextLineLength );
       
   124     if ( !buffer )
       
   125         {
       
   126         ERROR_LOG1( "GetTextFromFile-ret=%d", KErrNoMemory )
       
   127         return KErrNoMemory;
       
   128         }
       
   129     TPtr ptr( buffer->Des() );
       
   130     TFileText tf;
       
   131     tf.Set( aFile );
       
   132     TInt tagLen( aTag.Length() );
       
   133     TInt ret( KErrNone );
       
   134     for( ;; )
       
   135         {
       
   136         // Fetch next text line
       
   137         ptr.Zero();
       
   138         ret = tf.Read( ptr );
       
   139         if ( ret != KErrNone && ret != KErrTooBig )
       
   140             {
       
   141             break; // Unexpected error did happen
       
   142             }
       
   143         if ( !tagLen || !ptr.Left( tagLen ).CompareF( aTag ) )
       
   144             {
       
   145             TInt ret2( AppendTillMax( aValue, ptr.Mid( tagLen ) ) );
       
   146             if ( ret == KErrNone && ret2 != KErrNone )
       
   147                 {
       
   148                 ret = ret2;
       
   149                 }
       
   150             break; // Text read was successful
       
   151             }
       
   152         }
       
   153     if ( ret == KErrEof )
       
   154         {
       
   155         ret = KErrNone; // Suppress end of file
       
   156         }
       
   157     delete buffer;
       
   158     LOG_IF_ERROR1( ret, "GetTextFromFile-ret=%d", ret )
       
   159     return ret;
       
   160     }
       
   161 // ---------------------------------------------------------------------------
       
   162 // GetTextFromFile
       
   163 // ---------------------------------------------------------------------------
       
   164 //
       
   165 static TInt GetTextFromFile(
       
   166         RFs& aFs,
       
   167         const TDesC& aFilename,
       
   168         TDes& aValue,
       
   169         TBool aRemoveNewLines,
       
   170         const TDesC& aTag = KNullDesC )
       
   171     {
       
   172     FUNC_LOG
       
   173 
       
   174     RFile file;
       
   175     TInt ret( file.Open( aFs, aFilename,
       
   176         EFileRead | EFileStreamText | EFileShareReadersOnly ) );
       
   177     if ( ret == KErrNone )
       
   178         {
       
   179         ret = GetTextFromFile( file, aValue, aTag );
       
   180         file.Close();
       
   181         }
       
   182     else if ( ret == KErrNotFound || ret == KErrPathNotFound )
       
   183         {
       
   184         ret = KErrNotSupported;
       
   185         }
       
   186     if ( aRemoveNewLines &&
       
   187         ( ret == KErrNone || ret == KErrTooBig ) )
       
   188         {
       
   189         RemoveNewLines( aValue );
       
   190         }
       
   191     LOG_IF_ERROR1( ret, "GetTextFromFile-2-ret=%d", ret )
       
   192     return ret;
       
   193     }
       
   194 
       
   195 // ---------------------------------------------------------------------------
       
   196 // GetFWIDTextFromFile
       
   197 // ---------------------------------------------------------------------------
       
   198 //
       
   199 static TInt GetFWIDTextFromFile( RFs& aFs, TDes& aValue )
       
   200     {
       
   201     FUNC_LOG
       
   202 
       
   203     // Solve file names and concatenate tagged info from each file
       
   204     HBufC* buffer = HBufC::New( KMaxFileName );
       
   205     if ( !buffer )
       
   206         {
       
   207         ERROR_LOG1( "GetFWIDTextFromFile-ret=%d", KErrNoMemory )
       
   208         return KErrNoMemory;
       
   209         }
       
   210     TPtr ptr( buffer->Des() );
       
   211     TFindFile find( aFs );
       
   212     CDir* files = NULL;
       
   213     TInt ret( find.FindWildByPath( KFWIDVersionFileName, NULL, files ) );
       
   214     if ( ret == KErrNone && files )
       
   215         {
       
   216         TPtrC driveAndPath(
       
   217             TParsePtrC( KFWIDVersionFileName ).DriveAndPath() );
       
   218         TInt count( files->Count() );
       
   219         for ( TInt i( 0 ); i < count; ++i )
       
   220             {
       
   221             // Setup file name and read info
       
   222             ptr.Copy( driveAndPath );
       
   223             ptr.Append( ( *files )[ i ].iName );
       
   224             TInt ret2( GetTextFromFile(
       
   225                 aFs, ptr, aValue, EFalse, KFWIDVersionTag ) );
       
   226             if ( ret2 != KErrNone )
       
   227                 {
       
   228                 ret = ret2;
       
   229                 }
       
   230             else if ( i + 1 < count )
       
   231                 {
       
   232                 // Separate infos read from different files
       
   233                 ret = AppendTillMax( aValue, KFWIDVersionSeparator );
       
   234                 }
       
   235             if ( ret != KErrNone )
       
   236                 {
       
   237                 break;
       
   238                 }
       
   239             }
       
   240         if ( !count )
       
   241             {
       
   242             ret = KErrNotSupported;
       
   243             }
       
   244         }
       
   245     else if ( ret == KErrNotFound || ret == KErrPathNotFound )
       
   246         {
       
   247         ret = KErrNotSupported;
       
   248         }
       
   249     delete files;
       
   250     delete buffer;
       
   251     if ( ret == KErrNone || ret == KErrTooBig )
       
   252         {
       
   253         RemoveNewLines( aValue );
       
   254         }
       
   255     LOG_IF_ERROR1( ret, "GetFWIDTextFromFile-ret=%d", ret )
       
   256     return ret;
       
   257     }
       
   258 
       
   259 // ---------------------------------------------------------------------------
       
   260 // ReadTextFile
       
   261 // ---------------------------------------------------------------------------
       
   262 //
       
   263 static TInt ReadTextFile(
       
   264         RFile& aFile,
       
   265         TDes& aBuffer,
       
   266         RArray< TPtrC >& aLineBuffer )
       
   267     {
       
   268     FUNC_LOG
       
   269 
       
   270     // Read text file into buffers
       
   271     TInt ret( KErrNone );
       
   272     TFileText tf;
       
   273     tf.Set( aFile );
       
   274     aBuffer.SetMax();
       
   275     TPtr ptr( aBuffer.MidTPtr( 0 ) );
       
   276     TInt used( 0 );
       
   277     do
       
   278         {
       
   279         ret = tf.Read( ptr );
       
   280         TInt len( ptr.Length() );
       
   281         if ( ( ret == KErrNone || ret == KErrEof ) && len > 0 )
       
   282             {
       
   283             // Store non empty text line
       
   284             TInt err( aLineBuffer.Append( ptr ) );
       
   285             if ( err == KErrNone )
       
   286                 {
       
   287                 ptr.SetMax();
       
   288                 ptr.Set( ptr.MidTPtr( len ) );
       
   289                 ptr.Zero();
       
   290                 used += len;
       
   291                 }
       
   292             else
       
   293                 {
       
   294                 ret = err;
       
   295                 }
       
   296             }
       
   297         }
       
   298     while ( ret == KErrNone );
       
   299     if ( ret == KErrEof )
       
   300         {
       
   301         ret = KErrNone;
       
   302         }
       
   303     aBuffer.SetLength( used );
       
   304     LOG_IF_ERROR1( ret, "ReadTextFile-ret=%d", ret )
       
   305     return ret;
       
   306     }
       
   307 
       
   308 // ---------------------------------------------------------------------------
       
   309 // ReadTextFile
       
   310 // ---------------------------------------------------------------------------
       
   311 //
       
   312 static HBufC* ReadTextFile(
       
   313         RFs& aFs,
       
   314         const TDesC& aFullPath,
       
   315         RArray< TPtrC >& aLineBuffer,
       
   316         TInt& aError )
       
   317     {
       
   318     FUNC_LOG
       
   319 
       
   320     RFile file;
       
   321     aError = file.Open( aFs, aFullPath,
       
   322         EFileRead | EFileStreamText | EFileShareReadersOnly );
       
   323     if ( aError != KErrNone )
       
   324         {
       
   325         ERROR_LOG1( "ReadTextFile-2-aError=%d", aError )
       
   326         return NULL;
       
   327         }
       
   328     TInt size( 0 );
       
   329     aError = file.Size( size );
       
   330     if ( aError != KErrNone )
       
   331         {
       
   332         file.Close();
       
   333         ERROR_LOG1( "ReadTextFile-3-aError=%d", aError )
       
   334         return NULL;
       
   335         }
       
   336     // Get text size, create buffer for text and read text file
       
   337     HBufC* ret = HBufC::New( ( size + sizeof( TText ) - 1 ) / sizeof( TText ) );
       
   338     if ( !ret )
       
   339         {
       
   340         aError = KErrNoMemory;
       
   341         file.Close();
       
   342         ERROR_LOG2( "ReadTextFile-4-aError=%d,size=%d", aError, size )
       
   343         return NULL;
       
   344         }
       
   345     TPtr ptr( ret->Des() );
       
   346     aError = ReadTextFile( file, ptr, aLineBuffer );
       
   347     file.Close();
       
   348     if ( aError != KErrNone )
       
   349         {
       
   350         delete ret;
       
   351         aLineBuffer.Reset();
       
   352         ERROR_LOG1( "ReadTextFile-5-aError=%d", aError )
       
   353         return NULL;
       
   354         }
       
   355     return ret;
       
   356     }
       
   357 
       
   358 // ---------------------------------------------------------------------------
       
   359 // GetTagValue
       
   360 // ---------------------------------------------------------------------------
       
   361 //
       
   362 static TPtrC GetTagValue(
       
   363         const TDesC& aTag,
       
   364         const RArray< TPtrC >& aLineBuffer,
       
   365         TInt& aError )
       
   366     {
       
   367     FUNC_LOG
       
   368 
       
   369     aError = KErrNotFound;
       
   370     TPtrC ret( KNullDesC );
       
   371     TInt tagLen( aTag.Length() );
       
   372     TInt count( aLineBuffer.Count() );
       
   373     for( TInt i( 0 ); i < count; ++i )
       
   374         {
       
   375         TPtrC line( aLineBuffer[ i ] );
       
   376         if ( !line.Left( tagLen ).CompareF( aTag ) )
       
   377             {
       
   378             ret.Set( line.Mid( tagLen ) );
       
   379             aError = KErrNone;
       
   380             break;
       
   381             }
       
   382         }
       
   383     LOG_IF_ERROR1( aError, "GetTagValue-aError=%d", aError )
       
   384     return ret;
       
   385     }
       
   386 
       
   387 // ---------------------------------------------------------------------------
       
   388 // GetTagValue
       
   389 // ---------------------------------------------------------------------------
       
   390 //
       
   391 static TInt GetTagValue(
       
   392         TDes& aValue,
       
   393         const TDesC& aTag,
       
   394         const RArray< TPtrC >& aLineBuffer )
       
   395     {
       
   396     FUNC_LOG
       
   397 
       
   398     aValue.Zero();
       
   399     TInt ret( KErrNotFound );
       
   400     TPtrC value( GetTagValue( aTag, aLineBuffer, ret ) );
       
   401     if ( ret == KErrNone )
       
   402         {
       
   403         aValue.Copy( value.Left(
       
   404             Min( aValue.MaxLength(), value.Length() ) ) );
       
   405         RemoveNewLines( aValue );
       
   406         }
       
   407     LOG_IF_ERROR1( ret, "GetTagValue-ret=%d", ret )
       
   408     return ret;
       
   409     }
       
   410 
       
   411 // ---------------------------------------------------------------------------
       
   412 // GetTagValue
       
   413 // ---------------------------------------------------------------------------
       
   414 //
       
   415 static TInt GetTagValue(
       
   416         TInt& aValue,
       
   417         const TDesC& aTag,
       
   418         const RArray< TPtrC >& aLineBuffer )
       
   419     {
       
   420     FUNC_LOG
       
   421 
       
   422     aValue = 0;
       
   423     TInt ret( KErrNotFound );
       
   424     TPtrC value( GetTagValue( aTag, aLineBuffer, ret ) );
       
   425     if ( ret == KErrNone )
       
   426         {
       
   427         TLex lex( value );
       
   428         ret = lex.Val( aValue );
       
   429         if ( ret != KErrNone )
       
   430             {
       
   431             aValue = 0;
       
   432             }
       
   433         }
       
   434     LOG_IF_ERROR1( ret, "GetTagValue-2-ret=%d", ret )
       
   435     return ret;
       
   436     }
       
   437 
       
   438 // ----------------------------------------------------------------------------
       
   439 // ReadSymbianOSVersion
       
   440 // ----------------------------------------------------------------------------
       
   441 //
       
   442 static TInt ReadSymbianOSVersion(
       
   443         SysVersionInfo::TSymbianOSVersion& aOSVersion, RFs& aFs )
       
   444     {
       
   445     FUNC_LOG
       
   446 
       
   447     RArray< TPtrC > lineBuffer;
       
   448     TInt value( 0 );
       
   449     TInt ret( KErrNone );
       
   450     HBufC* buffer = ReadTextFile(
       
   451         aFs, KPlatformVersionFileName, lineBuffer, ret );
       
   452     if ( buffer )
       
   453         {
       
   454         ret = GetTagValue( value, KSymbianOSMajorVersionTag, lineBuffer );
       
   455         if ( ret == KErrNone )
       
   456             {
       
   457             aOSVersion.iMajorVersion = value;
       
   458             }
       
   459         if ( ret == KErrNone )
       
   460             {
       
   461             ret = GetTagValue( value, KSymbianOSMinorVersionTag, lineBuffer );
       
   462             if ( ret == KErrNone )
       
   463                 {
       
   464                 aOSVersion.iMinorVersion = value;
       
   465                 }
       
   466             }
       
   467         delete buffer;
       
   468         }
       
   469     lineBuffer.Close();
       
   470     if ( ret == KErrNotFound || ret == KErrPathNotFound )
       
   471         {
       
   472         ret = KErrNotSupported;
       
   473         }
       
   474     return ret;
       
   475     }
       
   476 
       
   477 // ---------------------------------------------------------------------------
       
   478 // ReadProductVersion
       
   479 // ---------------------------------------------------------------------------
       
   480 //
       
   481 static TInt ReadProductVersion(
       
   482         SysVersionInfo::TProductVersion& aProductVersion, RFs& aFs )
       
   483     {
       
   484     FUNC_LOG
       
   485 
       
   486     RArray< TPtrC > lineBuffer;
       
   487     TInt ret( KErrNone );
       
   488     HBufC* buffer = ReadTextFile(
       
   489         aFs, KProductVersionFileName, lineBuffer, ret );
       
   490     if ( buffer )
       
   491         {
       
   492         // Ignore value not found errors, value just stays empty
       
   493         GetTagValue(
       
   494             aProductVersion.iManufacturer, KManufacturerTag, lineBuffer );
       
   495         GetTagValue(
       
   496             aProductVersion.iModel, KModelTag, lineBuffer );
       
   497         GetTagValue(
       
   498             aProductVersion.iProduct, KProductTag, lineBuffer );
       
   499         GetTagValue(
       
   500             aProductVersion.iRevision, KRevisionTag, lineBuffer );
       
   501         delete buffer;
       
   502         }
       
   503     lineBuffer.Close();
       
   504     if ( ret == KErrNotFound || ret == KErrPathNotFound )
       
   505         {
       
   506         ret = KErrNotSupported;
       
   507         }
       
   508     return ret;
       
   509     }
       
   510 
       
   511 // ---------------------------------------------------------------------------
       
   512 // ReadProductInformation
       
   513 // ---------------------------------------------------------------------------
       
   514 //
       
   515 static TInt ReadProductInformation(
       
   516     SysVersionInfo::TVersionInfoType aType,
       
   517     TDes& aValue )
       
   518     {
       
   519     FUNC_LOG;
       
   520 
       
   521     using namespace ExtendedVersionInfoPluginApi;
       
   522 
       
   523     TFileName prodInfoDllPath;
       
   524 
       
   525     _SYSVERSION_CREATE_LIT( KPluginDllName, EXTVERSIONINFO_PLUGIN_STRING );
       
   526     _SYSVERSION_CREATE_LIT( KPluginFolder, SHARED_LIB_DIR );
       
   527     _LIT( KExtPluginPathFormat, "z:%S\\%S" );
       
   528 
       
   529     prodInfoDllPath.Format(
       
   530         KExtPluginPathFormat, &KPluginFolder, &KPluginDllName );
       
   531 
       
   532     RLibrary prodInfoDll;
       
   533 
       
   534     TInt ret = prodInfoDll.Load( prodInfoDllPath );
       
   535 
       
   536 
       
   537     if ( ret == KErrNone )
       
   538         {
       
   539         TLibraryFunction libFunc =
       
   540             prodInfoDll.Lookup( EGetProductInformationFuncL );
       
   541 
       
   542         if ( libFunc )
       
   543             {
       
   544             GetProductInformationFuncL getL =
       
   545                 reinterpret_cast<GetProductInformationFuncL>(libFunc);
       
   546             TRAP( ret, ((*getL)( aType, aValue )) );
       
   547             }
       
   548         else
       
   549             {
       
   550             ret = KErrNotSupported;
       
   551             }
       
   552         prodInfoDll.Close();
       
   553         }
       
   554     else
       
   555         {
       
   556         ret = KErrNotSupported;
       
   557         }
       
   558 
       
   559     return ret;
       
   560     }
       
   561 // ======== MEMBER FUNCTIONS ========
       
   562 
       
   563 // ---------------------------------------------------------------------------
       
   564 // SysVersionInfo::GetVersionInfo
       
   565 // ---------------------------------------------------------------------------
       
   566 //
       
   567 EXPORT_C TInt SysVersionInfo::GetVersionInfo(
       
   568         const TVersionInfoType aType, TDes& aValue )
       
   569     {
       
   570     FUNC_LOG_WITH_CLIENT_NAME
       
   571 
       
   572     RFs fs;
       
   573     TInt ret( fs.Connect() );
       
   574     if ( ret == KErrNone )
       
   575         {
       
   576         ret = GetVersionInfo( aType, aValue, fs );
       
   577         fs.Close();
       
   578         }
       
   579     else
       
   580         {
       
   581         aValue.Zero();
       
   582         }
       
   583     LOG_IF_ERROR2(
       
   584         ret,
       
   585         "SysVersionInfo::GetVersionInfo-aType=%d,ret=%d",
       
   586         aType, ret )
       
   587     return ret;
       
   588     }
       
   589 
       
   590 // ---------------------------------------------------------------------------
       
   591 // SysVersionInfo::GetVersionInfo
       
   592 // ---------------------------------------------------------------------------
       
   593 //
       
   594 EXPORT_C TInt SysVersionInfo::GetVersionInfo(
       
   595         const TVersionInfoType aType, TDes& aValue, RFs& aFs )
       
   596     {
       
   597     FUNC_LOG_WITH_CLIENT_NAME
       
   598 
       
   599     aValue.Zero();
       
   600 
       
   601     TInt ret( KErrNotSupported );
       
   602     // if a version info text file does not exist attempt to read from
       
   603     // the adaptation interface
       
   604     TBool readProductInfo( EFalse );
       
   605 
       
   606     switch ( aType )
       
   607         {
       
   608         case EFWVersion:
       
   609             {
       
   610             ret = GetFWIDTextFromFile( aFs, aValue );
       
   611             readProductInfo = (ret == KErrNotSupported);
       
   612             break;
       
   613             }
       
   614         case EOPVersion:
       
   615             {
       
   616             ret = GetTextFromFile(
       
   617                 aFs, KOPIDVersionFileName, aValue, ETrue );
       
   618             readProductInfo = (ret == KErrNotSupported);
       
   619             break;
       
   620             }
       
   621         case EModelVersion:
       
   622             {
       
   623             ret = GetTextFromFile(
       
   624                 aFs, KModelVersionFileName, aValue, ETrue );
       
   625             readProductInfo = (ret == KErrNotSupported);
       
   626             break;
       
   627             }
       
   628         case EProductCode: // product code is fetched only from the plugin
       
   629             readProductInfo = ETrue;
       
   630             break;
       
   631 
       
   632         default:
       
   633             {
       
   634             break;
       
   635             }
       
   636         }
       
   637 
       
   638     if ( readProductInfo )
       
   639         {
       
   640         ret = ReadProductInformation( aType, aValue );
       
   641         }
       
   642 
       
   643     if ( ret != KErrNone && ret != KErrTooBig )
       
   644         {
       
   645         aValue.Zero();
       
   646         }
       
   647     LOG_IF_ERROR2(
       
   648         ret,
       
   649         "SysVersionInfo::GetVersionInfo-2-aType=%d,ret=%d",
       
   650         aType, ret )
       
   651     return ret;
       
   652     }
       
   653 
       
   654 // ---------------------------------------------------------------------------
       
   655 // SysVersionInfo::GetVersionInfo
       
   656 // ---------------------------------------------------------------------------
       
   657 //
       
   658 EXPORT_C TInt SysVersionInfo::GetVersionInfo( TVersionBase& aVersion )
       
   659     {
       
   660     FUNC_LOG_WITH_CLIENT_NAME
       
   661 
       
   662     RFs fs;
       
   663     TInt ret( fs.Connect() );
       
   664     if ( ret == KErrNone )
       
   665         {
       
   666         ret = GetVersionInfo( aVersion, fs );
       
   667         fs.Close();
       
   668         }
       
   669     LOG_IF_ERROR2(
       
   670         ret,
       
   671         "SysVersionInfo::GetVersionInfo-3-iType=%d,ret=%d",
       
   672         aVersion.iType, ret )
       
   673     return ret;
       
   674     }
       
   675 
       
   676 // ---------------------------------------------------------------------------
       
   677 // SysVersionInfo::GetVersionInfo
       
   678 // ---------------------------------------------------------------------------
       
   679 //
       
   680 EXPORT_C TInt SysVersionInfo::GetVersionInfo(
       
   681         TVersionBase& aVersion, RFs& aFs )
       
   682     {
       
   683     FUNC_LOG_WITH_CLIENT_NAME
       
   684 
       
   685     TInt ret( KErrNotSupported );
       
   686     switch( aVersion.iType )
       
   687         {
       
   688         case ESymbianOSVersion:
       
   689             {
       
   690             ret = ReadSymbianOSVersion(
       
   691                 static_cast< TSymbianOSVersion& >( aVersion ), aFs );
       
   692             break;
       
   693             }
       
   694         case EProductVersion:
       
   695             {
       
   696             ret = ReadProductVersion(
       
   697                 static_cast< TProductVersion& >( aVersion ), aFs );
       
   698             break;
       
   699             }
       
   700         default:
       
   701             {
       
   702             break;
       
   703             }
       
   704         }
       
   705     LOG_IF_ERROR2(
       
   706         ret,
       
   707         "SysVersionInfo::GetVersionInfo-4-iType=%d,ret=%d",
       
   708         aVersion.iType, ret )
       
   709     return ret;
       
   710     }
       
   711 
       
   712 // End of File