javamanager/javabackup/midp2backup_usif/src.s60/javaversionbackuputil.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 06 Jul 2010 14:10:26 +0300
changeset 48 e0d6e9bd3ca7
permissions -rw-r--r--
Revision: v2.2.3 Kit: 2010127

/*
* Copyright (c) 2008-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:  Implementation of JavaVersionBackupUtil
*
*/


#include <javaenvinfo.h>
#include "javaversionbackuputil.h"
#include "logger.h"


#include <s32mem.h>
#include <e32base.h>

#define KOMJIdentifier 0x20000F3D

using namespace Java;
using namespace java::backup;

// ======== MEMBER FUNCTIONS ========

void JavaVersionBackupUtil::WriteJavaVersionL(RDesWriteStream& aStream)
{
    JELOG2(EBackup);

    // Get the Java version number from the environment API's

    TVersion version = Java::JavaEnvInfo::Version();

    PLOG3(EBackup, "JavaEnvInfo::Version: major = %d, minor = %d, build = %d",
          version.iMajor, version.iMinor, version.iBuild);

    /* Put OMJ Package UID in the front indicating that it is an
       OMJ environment from which backup was taken.  */
    aStream.WriteInt32L(KOMJIdentifier);

    // write the version numbers to the stream
    aStream.WriteInt8L(version.iMajor);
    aStream.WriteInt8L(version.iMinor);
    aStream.WriteInt16L(version.iBuild);

    ILOG(EBackup, "Version information written to stream");
}

TUint JavaVersionBackupUtil::CheckJavaVersionL(RDesReadStream& aStream, TDriveNumber aDrive, TBool versionCheck)
{
    JELOG2(EBackup);
    TInt32 omjID = 0;
    if (versionCheck)
    {
        // Read the OMJSpecific ID only on first call
        omjID = aStream.ReadInt32L();
    }

    if (omjID != KOMJIdentifier)
    {
        _LIT(KJavaRestoreConverterExe, "javarestoreconverter.exe");

        RProcess rProcess;

        TChar targetDrive;
        _LIT(KText , "");
        TBuf<15> commandLine(KText);
        RFs session;
        TInt err = session.Connect();
        if (KErrNone != err)
        {
            ELOG1(EBackup,
                  "JavaVersionBackupUtil::CheckJavaVersionL: Session Connection failed, error %d", err);
            CleanupStack::PopAndDestroy(&aStream);
            User::Leave(err);
        }

        err = session.DriveToChar(aDrive, targetDrive);
        if (KErrNone == err)
        {
            _LIT(KDrive, " -drive");
            commandLine.Append(KDrive);
            commandLine.Append(targetDrive);
        }

        err = rProcess.Create(KJavaRestoreConverterExe, commandLine);
        if (KErrNone == err)
        {
            TRequestStatus status;
            rProcess.Logon(status);
            rProcess.Resume();

            // now wait until javarestoreconverter exits
            User::WaitForRequest(status);
            if (status.Int() != KErrNone)
            {
                // Installing old JRT 1.x MIDlets to JRT 2.x failed
                err = status.Int();
                ELOG1(EBackup,
                      "JavaVersionBackupUtil::CheckJavaVersionL: Installation failed, error %d", err);
                CleanupStack::PopAndDestroy(&aStream);
                User::Leave(err);
            }
            else
            {
                LOG(EBackup,EInfo,
                    "JavaVersionBackupUtil::CheckJavaVersionL: Installing Midlets successful");
            }
        }
        else
        {
            // Cannot even start javarestoreconverter
            ELOG1(EBackup,
                  "JavaVersionBackupUtil::CheckJavaVersionL: Cannot start Installer, error %d", err);
            CleanupStack::PopAndDestroy(&aStream);
            User::Leave(err);
        }
        rProcess.Close();
        return 1;

    }
    else
    {
        TInt8 major = aStream.ReadInt8L();
        TInt8 minor = aStream.ReadInt8L();
        TInt16 build = aStream.ReadInt16L();

        TVersion version(major, minor, build);

        PLOG3(EBackup, "JavaVersion read from Stream: major = %d, minor = %d, build = %d",
              version.iMajor, version.iMinor, version.iBuild);

        // read current version and compare it with the read version
        TVersion curVersion = Java::JavaEnvInfo::Version();

        PLOG3(EBackup," Current JavaVersion: major = %d, minor = %d, build = %d",
              curVersion.iMajor, curVersion.iMinor, curVersion.iBuild);
        return 0;

    }
}