diff -r f5050f1da672 -r 04becd199f91 javatools/javaupdater/src/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javatools/javaupdater/src/main.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,307 @@ +/* +* Copyright (c) 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: OMJ S60 environment updater process. +* When OMJ is installed, this program is executed to allow +* new Java environment taken into use. +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "javauids.h" +#include "systemamstraderprivateclient.h" +#include "logger.h" + +// This file is used to indicate when converting old S60 midlets +// to OMJ midlets has been done. +_LIT(KConversionOngoing, "D:\\OMJConverting.dat"); + + +/** + * Kill old and running javaregistry.exe. After killing next call of + * Registry API re-starts the new server process. + */ +static void KillRegistry() +{ + JELOG2(EJavaConverters); + TFullName processName; + _LIT(KJavaRegistryProcess, "javaregistr*"); + TFindProcess finder(KJavaRegistryProcess); + + if (finder.Next(processName) != KErrNotFound) + { + RProcess processToKill; + TInt err = processToKill.Open(finder); + + if (KErrNone != err) + { + WLOG1(EJavaConverters, + "javaupdater: KillRegistry: Process open: %d", err); + } + else + { + LOG(EJavaConverters, EInfo, "javaupdater: KillRegistry: Killing javaregistry"); + processToKill.Kill(KErrNone); + processToKill.Close(); + } + } + else + { + WLOG(EJavaConverters, "javaupdater: KillRegistry: Registry process not found"); + } +} + +/** + * Kill running System AMS processes. + */ +static void KillSystemAms() +{ + JELOG2(EJavaConverters); + + TBool connectionOK(EFalse); + TRequestStatus status(KRequestPending); + RSystemAMSTraderPrivateClient amsClient; + + connectionOK = amsClient.ShutdownJavaEnv(status); + if (connectionOK) + { + // systemams process in this device supports nice shutdown. + // Wait until the S60 java environment has been shutdown + LOG(EJavaConverters, + EInfo, "javaupdater: KillSystemAms: Waiting for systemams nice shutdown"); + User::WaitForRequest(status); + LOG(EJavaConverters, + EInfo, "javaupdater: KillSystemAms: Systemams has shutdown"); + amsClient.Close(); + } + else + { + // must kill SystemAMS trader and SystemAMS itself + TFullName processName; + _LIT(KJavaSystemAmsTraderProcess, "SystemAMS.EXE*"); + TFindProcess finder(KJavaSystemAmsTraderProcess); + + if (finder.Next(processName) == KErrNone) + { + RProcess processToKill; + TInt err = processToKill.Open(finder); + + if (KErrNone != err) + { + WLOG1(EJavaConverters, + "javaupdater: KillSystemAms: Cannot open SystemAMS trader process: %d", err); + } + else + { + LOG(EJavaConverters, EInfo, + "javaupdater:KillSystemAms: Killing SystemAMS trader"); + processToKill.Kill(KErrNone); + processToKill.Close(); + } + } + + // now kill SystemAMS itself + _LIT(KJavaSystemAmsProcess, "SystemAMSCore.EXE*"); + finder.Find(KJavaSystemAmsProcess); + + if (finder.Next(processName) == KErrNone) + { + RProcess processToKill; + TInt err = processToKill.Open(finder); + + if (KErrNone != err) + { + WLOG1(EJavaConverters, + "javaupdater: KillSystemAms: Cannot open SystemAMS process: %d", err); + } + else + { + LOG(EJavaConverters, EInfo, "javaupdater: KillSystemAms Killing SystemAMS "); + processToKill.Kill(KErrNone); + processToKill.Close(); + } + } + } +} + +/** + * Try to kill old javapreinstaller + */ +static void KillOldPreinstaller() +{ + JELOG2(EJavaConverters); + + TFullName processName; + _LIT(KJavaOldPreinstallerProcess, "MIDP2SilentMIDletInstall.exe*"); + TFindProcess finder(KJavaOldPreinstallerProcess); + + if (finder.Next(processName) == KErrNone) + { + RProcess processToKill; + TInt err = processToKill.Open(finder); + + if (KErrNone != err) + { + WLOG1(EJavaConverters, + "javaupdater: KillOldPreinstallerL: Process open: %d", err); + } + else + { + LOG(EJavaConverters, EInfo, "javaupdater: Killing MIDP2SilentMIDletInstall"); + processToKill.Kill(KErrNone); + processToKill.Close(); + } + } +} + +/** + * Start OMJ trader (systemams.exe) in IAD mode. + * It will start Java Captain in IAD mode and + * it will start Java Preinstaller in IAD mode. + */ +_LIT(KOmjTraderExe, "systemams.exe"); +_LIT(KOmjTraderArg, "iad"); +static void StartOmjTrader() +{ + JELOG2(EJavaConverters); + RProcess proc; + int rc = proc.Create(KOmjTraderExe, KOmjTraderArg); + if (rc == KErrNone) + { + proc.Resume(); + LOG(EJavaConverters, EInfo, "javaupdater: StartOmjTrader systemams.exe was started ok"); + } + else + { + ELOG1(EJavaConverters, "javaupdater: StartOmjTrader failed: %d", rc); + } + proc.Close(); +} + +/** + * Copies (and configures) the certificates from legacy java + */ +_LIT(KJavaCertfictatesConfiguratorExe, "javacertificatesconfigurator.exe"); +static void ConfigureCertificates() +{ + JELOG2(EJavaConverters); + RProcess proc; + int rc = proc.Create(KJavaCertfictatesConfiguratorExe, KNullDesC()); + if (rc == KErrNone) + { + proc.Resume(); + TRequestStatus status; + proc.Logon(status); + User::WaitForRequest(status); + } + else + { + ELOG1(EJavaConverters, "javaupdater: ConfigureCertificates failed: %d", rc); + } + proc.Close(); +} + +/** + * Wait until preinstallation of OMJ midlets has been done. + */ +static void WaitUntilPreinstallerReady() +{ + // Create a temporary file that javapreinstaller.exe will + // then destroy after reinstallation has been done + TUint value; + RFs fs; + RFile flagFile; + TBool flagFileExists(ETrue); + TInt err = fs.Connect(); + if (KErrNone != err) + { + ELOG1(EJavaConverters, + "javaupdater: WaitUntilPreinstallerReady: Cannot connect to RFs, err %d", + err); + return; + } + err = flagFile.Replace(fs, KConversionOngoing, EFileShareAny|EFileWrite); + if (KErrNone != err) + { + ELOG1(EJavaConverters, + "javaupdater: WaitUntilPreinstallerReady: Cannot create conversion flag file, err %d", + err); + fs.Close(); + return; + } + flagFile.Close(); + + // Now wait until the file is destroyed + do + { + TRequestStatus status; + fs.NotifyChange(ENotifyFile, status, KConversionOngoing); + User::WaitForRequest(status); + LOG1(EJavaConverters, + EInfo, + "javaupdater: WaitUntilPreinstallerReady: Wait ended with status %d", + status.Int()); + + // Check whether the flag file has been destroyed + err = fs.Att(KConversionOngoing, value); + if ((KErrNotFound == err) || (KErrPathNotFound == err)) + { + flagFileExists = EFalse; + } + else if (KErrNone == err) + { + flagFileExists = ETrue; + LOG(EJavaConverters, + EInfo, + "javaupdater: WaitUntilPreinstallerReady: Flag file still exists, must wait more"); + } + else + { + WLOG1(EJavaConverters, + "javaupdater: WaitUntilPreinstallerReady: Unexpected error %d, stop waiting", + err); + flagFileExists = EFalse; + } + + } + while (flagFileExists); + + fs.Close(); +} + +/** + * Create cleanup stack and run the cleaner code inside TRAP harness + * to log unexpected leaves. + */ +TInt E32Main() +{ + __UHEAP_MARK; + CTrapCleanup* cleanupStack = CTrapCleanup::New(); + KillRegistry(); + KillSystemAms(); + KillOldPreinstaller(); + ConfigureCertificates(); + StartOmjTrader(); + WaitUntilPreinstallerReady(); + delete cleanupStack; + __UHEAP_MARKEND; + return KErrNone; +}