javatools/javacleaner/src.s60/main.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 27 Apr 2010 16:30:29 +0300
branchRCL_3
changeset 14 04becd199f91
permissions -rw-r--r--
Revision: v2.1.22 Kit: 201017

/*
* 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: Java platform 2.0 cleaner process (javacleaner.exe)
*              When OMJ is uninstalled, this program is executed to
*              uninstall all OMJ midlets, unregister OMJ
*              specific MIDlet starter and reregister old starter
*/


#include <e32std.h>
#include <e32base.h>
#include <apgcli.h> // for RApaLsSession
#include <e32property.h>
#include <swinstallerinternalpskeys.h>

#include "javauids.h"
#include "logger.h"


/**
 * Start Java Installer process with commandline options
 * that ask it to uninstall all OMJ midlets. Wait until
 * the uninstallation has been done.
 */
static void UninstallAllOmjMidlets()
{
    LOG(EJavaConverters, EInfo, "javacleaner: UninstallAllOmjMidlets: Going to start installer");

    RProcess rJavaInstaller;
    // Just command 'uninstallall', 256 is more than enough
    TBuf<256> commandLine;

    // Build command line used to pass all necessary info to Java Installer
    commandLine = _L("javainstallerstarter");
    commandLine.Append(_L(" uninstallall -forceuninstall -captainmsgs=no"));

    // Run installer silently
    commandLine.Append(_L(" -silent -skipotastatus"));

    // start JavaInstaller
#ifdef RD_JAVA_S60_RELEASE_5_0_IAD
    TBuf<128> processName = _L("j9midps60");
#else // RD_JAVA_S60_RELEASE_5_0_IAD
    TBuf<128> processName = _L("javamidp");
#endif // RD_JAVA_S60_RELEASE_5_0_IAD

    TInt err = rJavaInstaller.Create(processName, commandLine);
    if (KErrNone == err)
    {
        LOG(EJavaConverters, EInfo, "javacleaner: UninstallAllOmjMidlets calling Rendezvous");
        // This call will wait until Java Installer exits (or panics)
        TRequestStatus status;
        rJavaInstaller.Logon(status);

        LOG(EJavaConverters, EInfo, "javacleaner: UninstallAllOmjMidlets calling Resume");
        rJavaInstaller.Resume();

        // now wait until Java Installer exits
        User::WaitForRequest(status);
        if (status.Int() != KErrNone)
        {
            ELOG1(EJavaConverters,
                  "javacleaner: UninstallAllOmjMidlets Installer exited with error %d",
                  status.Int());
        }
    }
    else
    {
        ELOG1(EJavaConverters,
              "javacleaner: UninstallAllOmjMidlets Cannot start Installer, error %d", err);
    }

    LOG(EJavaConverters, EInfo, "javacleaner: UninstallAllOmjMidlets calling RProcess::Close");
    // free resources before returning
    rJavaInstaller.Close();
}


/**
 * Start Java Installer process with commandline option
 * that asks it to delete all PS keys that Java Installer uses and
 * remove all unnecessary directories that OMJ has created.
 * Wait until the uninstallation has been done.
 */
static void CleanOmjDataAndPsKeys()
{
    LOG(EJavaConverters, EInfo, "javacleaner: CleanOmjDataAndPsKeys: Going to start installer");

    RProcess rJavaInstaller;
    // Just command 'removealldata', 256 is more than enough
    TBuf<256> commandLine;

    // Build command line used to pass all necessary info to Java Installer
    commandLine = _L("javainstallerstarter");
    commandLine.Append(_L(" removealldata"));

    // Run installer silently
    commandLine.Append(_L(" -silent"));

    // start JavaInstaller
#ifdef RD_JAVA_S60_RELEASE_5_0_IAD
    TBuf<128> processName = _L("j9midps60");
#else // RD_JAVA_S60_RELEASE_5_0_IAD
    TBuf<128> processName = _L("javamidp");
#endif // RD_JAVA_S60_RELEASE_5_0_IAD

    TInt err = rJavaInstaller.Create(processName, commandLine);
    if (KErrNone == err)
    {
        LOG(EJavaConverters, EInfo, "javacleaner: CleanOmjDataAndPsKeys calling Rendezvous");
        // This call will wait until Java Installer exits (or panics)
        TRequestStatus status;
        rJavaInstaller.Logon(status);

        LOG(EJavaConverters, EInfo, "javacleaner: CleanOmjDataAndPsKeys calling Resume");
        rJavaInstaller.Resume();

        // now wait until Java Installer exits
        User::WaitForRequest(status);
        if (status.Int() != KErrNone)
        {
            ELOG1(EJavaConverters,
                  "javacleaner: CleanOmjDataAndPsKeys Installer exited with error %d",
                  status.Int());
        }
    }
    else
    {
        ELOG1(EJavaConverters,
              "javacleaner: CleanOmjDataAndPsKeys Cannot start Installer, error %d", err);
    }

    LOG(EJavaConverters, EInfo, "javacleaner: CleanOmjDataAndPsKeys calling RProcess::Close");
    // free resources before returning
    rJavaInstaller.Close();
}

/**
 * Return true if really uninstalling OMJ
 */
static TBool IsCleaningNeeded()
{
    TBool clean(EFalse);
    TInt  value(0);
    // Ignore errors, if the value cannot be read, cleaning is not done.
    RProperty::Get(KPSUidSWInstallerUiNotification, KSWInstallerUninstallation, value);
    if (0 == value)
    {
        // Native installer is updating OMJ. Do not clean
        LOG(EJavaConverters, EInfo,
            "javacleaner: IsCleaningNeeded(): Updating OMJ. No cleaning needed.");
        clean = EFalse;
    }
    else
    {
        // Really uninstalling OMJ
        clean = ETrue;
    }

    return clean;
}

/**
 * Create cleanup stack and run the cleaner code inside TRAP harness
 * to log unexpected leaves.
 */
TInt E32Main()
{
    __UHEAP_MARK;
    CTrapCleanup* cleanupStack = CTrapCleanup::New();

    if (IsCleaningNeeded())
    {
        UninstallAllOmjMidlets();
        // Must wait for a moment so that the Java Installer instance
        // started by previous call exits fully
        User::After(500000);
        CleanOmjDataAndPsKeys();
    }

    delete cleanupStack;
    __UHEAP_MARKEND;
    return KErrNone;
}
// eof