commonservices/PlatformEnv/platformver/src/versioninfo.cpp
changeset 0 4e1aa6a622a0
child 78 3f0699f2e14c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commonservices/PlatformEnv/platformver/src/versioninfo.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,163 @@
+/*
+* Copyright (c) 2007 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:  Interface for quering system version information.
+*
+*/
+
+
+//  INCLUDES
+#include <e32std.h>
+#include <f32file.h>
+#include "versioninfo.h"
+#include "platformverdebug.h"
+
+// CONSTANTS
+_LIT( KS60ProductIDFiles, "z:\\system\\install\\series60v*.sis" );
+const TInt KS60ProductIDPos = 9; // Length of 'series60v'
+_LIT( KS60ProductIDSplitMark, "." ); // For splitting 'XX.YY' to 'XX' and 'YY'
+
+
+// ============================= LOCAL FUNCTIONS ===============================
+// -----------------------------------------------------------------------------
+// GetPlatformVersion
+// -----------------------------------------------------------------------------
+//
+static TInt GetPlatformVersion(
+        VersionInfo::TPlatformVersion& aVersion,
+        RFs& aFs )
+    {
+    FUNC_LOG
+
+    CDir* productIds = NULL;
+    TFindFile find( aFs );
+    TInt ret( find.FindWildByPath( KS60ProductIDFiles, NULL, productIds ) );
+    if ( ret == KErrNone && productIds )
+        {
+        ret = productIds->Sort( ESortByName | EDescending );
+        }
+
+    TPtrC ptr;
+    TInt splitPos( KErrNotFound );
+    if ( ret == KErrNone && productIds )
+        {
+        // Get version string 'XX.YY'
+        TParsePtrC parse( ( *productIds )[ 0 ].iName );
+        ptr.Set( parse.Name().Mid( KS60ProductIDPos ) );
+        splitPos = ptr.Find( KS60ProductIDSplitMark );
+        }
+
+    if ( splitPos != KErrNotFound )
+        {
+        // Get major version
+        TLex lex( ptr.Left( splitPos ) );
+        ret = lex.Val( aVersion.iMajorVersion, EDecimal );
+        if ( ret == KErrNone )
+            {
+            // Get minor version
+            lex.Assign( ptr.Mid(
+                splitPos + KS60ProductIDSplitMark().Length() ) );
+            ret = lex.Val( aVersion.iMinorVersion, EDecimal );
+            }
+        }
+
+    if ( !productIds || splitPos == KErrNotFound || ret == KErrNotFound ||
+        ret == KErrPathNotFound )
+        {
+        ret = KErrNotSupported; // Use not supported if info is unavailable
+        }
+
+    delete productIds;
+    return ret;
+    }
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// VersionInfo::GetVersion
+// -----------------------------------------------------------------------------
+EXPORT_C TInt VersionInfo::GetVersion( TVersionBase& aVersion )
+    {
+    FUNC_LOG_WITH_CLIENT_NAME
+
+    RFs fs;
+    TInt ret( fs.Connect() );
+    if ( ret == KErrNone )
+        {
+        ret = GetVersion( aVersion, fs );
+        fs.Close();
+        }
+
+    LOG_IF_ERROR2(
+        ret,
+        "VersionInfo::GetVersion-aType=%d,ret=%d",
+        aVersion.iType, ret )
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// VersionInfo::GetVersion
+// -----------------------------------------------------------------------------
+EXPORT_C TInt VersionInfo::GetVersion( TVersionBase& aVersion, RFs& aFs )
+    {
+    FUNC_LOG_WITH_CLIENT_NAME
+
+    // Make sure that trap handler exists because used APIs may 
+    // require cleanup stack even any leaving methods are not called.
+    CTrapCleanup* cs = NULL;
+    if ( !User::TrapHandler() )
+        {
+        // Setup temporary trap handler
+        cs = CTrapCleanup::New();
+        if ( !cs )
+            {
+            ERROR_LOG2(
+                "VersionInfo::GetVersion-type=%d,ret=%d",
+                aVersion.iType, KErrNoMemory )
+
+            return KErrNoMemory;
+            }
+        }
+
+    TInt ret( KErrNotSupported );
+    switch( aVersion.iType )
+        {
+        case EPlatformVersion:
+            {
+            ret = GetPlatformVersion(
+                static_cast< TPlatformVersion& >( aVersion ), aFs );
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+
+    if ( cs )
+        {
+        // Remove temporary trap handler
+        User::SetTrapHandler( NULL );
+        delete cs;
+        }
+
+    LOG_IF_ERROR2( ret,
+        "VersionInfo::GetVersion-type=%d,ret=%d",
+        aVersion.iType, ret )
+
+    return ret;
+    }
+
+//  End of File