javatools/javarestoreconverter/src.s60/restoreconvertmidlet.cpp
branchRCL_3
changeset 18 9ac0a0a7da70
parent 17 0fd27995241b
child 19 71c436fe3ce0
--- a/javatools/javarestoreconverter/src.s60/restoreconvertmidlet.cpp	Tue May 11 16:07:20 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1310 +0,0 @@
-/*
-* 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 the License "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 javarestoreconverter process
-*
-*/
-
-
-#include <apacmdln.h>
-#include <apgcli.h>
-#include <driveinfo.h>
-#include <e32base.h>
-#include <pathinfo.h>
-#include <utf.h>
-#include <zipfile.h>
-
-#include "restoreconvertmidlet.h"
-
-#include "javacommonutils.h"
-#include "javaprocessconstants.h"
-#include "javastorage.h"
-#include "javastorageentry.h"
-#include "javastoragenames.h"
-#include "javasymbianoslayer.h"
-#include "javauids.h"
-#include "logger.h"
-
-
-using namespace java::storage;
-using namespace java::util;
-
-// MIDlet name and vendor max size is 255,
-// +1 added for terminating zero needed for logging
-const TInt KMaxBufferSize = 256;
-
-// character constants needed when parsing java attributes
-const TUint32 HT = 9;  // horizontal tab
-const TUint32 LF = 10; // line feed
-const TUint32 CR = 13; // carriage return
-const TUint32 SP = 32; // space
-const TUint32 COLON = 58; // ':'
-
-
-_LIT(KJarFileNameSuffix, ".jar");
-_LIT(KJadFileNameSuffix, ".jad");
-_LIT(KFLJarFileNameSuffix, ".dm");
-_LIT(KSDJarFileNameSuffix, ".dcf");
-_LIT(KSMCBackSplash, "\\");
-_LIT(KDriveText, "drive");
-_LIT(KMidletName, "MIDlet-Name");
-_LIT(KMidletVendor, "MIDlet-Vendor");
-_LIT(KManifestEntryName, "META-INF/MANIFEST.MF");
-
-// The directory where the java applications to be converted are searched from
-_LIT(KMidletSuiteInstallBasePath, ":\\Private\\102033E6\\MIDlets\\");
-
-
-/**
- * To create new instance of this class.
- *
- * @param aFs - A reference to the file server.
- * @return Reference to the object of this class.
- * @exception If construction fails.
- *
- */
-CRestoreConvertMIDlet* CRestoreConvertMIDlet::NewLC(RFs& aFs)
-{
-    CRestoreConvertMIDlet* self = new(ELeave) CRestoreConvertMIDlet(aFs);
-    CleanupStack::PushL(self);
-    self->ConstructL();
-    return self;
-}
-
-/**
- * To do 1st phase construction for this object.
- *
- * Adds this active object to the scheduler.
- *
- * @param aFs - A reference to the file server.
- */
-CRestoreConvertMIDlet::CRestoreConvertMIDlet(RFs& aFs) :
-        CActive(EPriorityStandard), iFs(aFs), iNumberOfAppsToInstall(0)
-{
-    CActiveScheduler::Add(this);
-}
-
-/**
- * To do 2nd phase construction for this object.
- *
- * @exception If the method is not able to allocate necessary buffers.
- */
-void CRestoreConvertMIDlet::ConstructL()
-{
-    iConvertServer = new(ELeave) RestoreServer();
-    iMIDletName    = HBufC::NewL(KMaxBufferSize);
-    iMIDletVendor  = HBufC::NewL(KMaxBufferSize);
-}
-
-/**
- * Deletes this object.
- * All allocated resources are released.
- */
-CRestoreConvertMIDlet::~CRestoreConvertMIDlet()
-{
-    Cancel();
-    iInstallFiles.ResetAndDestroy();
-    iInstallFiles.Close();
-
-    iUninstallUids.clear();
-
-    iDirs.ResetAndDestroy();
-    iDirs.Close();
-
-    iIsJad.Reset();
-
-    delete iMIDletName;
-    iMIDletName = NULL;
-
-    delete iMIDletVendor;
-    iMIDletVendor = NULL;
-
-    delete iConvertServer;
-    iConvertServer = NULL;
-}
-
-/**
- * To start silent installation.
- */
-void CRestoreConvertMIDlet::Start()
-{
-    iState = EFindOutDeviceDrives;
-    CompleteRequest();
-}
-
-/**
- * To stop whole preinstaller.
- * Stops the active scheduler.
- */
-void CRestoreConvertMIDlet::Exit()
-{
-    Deque();
-    CActiveScheduler::Stop();
-}
-
-/**
- * To complete the request for this object.
- *
- * @Postconditions The following conditions are true immediately after
- * returning from this method.
- * - iStatus == KErrNone
- * - IsActive() == ETrue
- */
-void CRestoreConvertMIDlet::CompleteRequest()
-{
-    TRequestStatus *status = &iStatus;
-    User::RequestComplete(status, KErrNone);
-    if (!IsActive())
-    {
-        SetActive();
-    }
-}
-
-/**
- * To run this active object.
- *
- * The state logic is:
- *
- * EFindOutDeviceDrives:
- *    - find out all non-remote drives in the device
- *    - mark externally mountable drives (removable drives)
- *    - mark read only drives (ROM)
- *
- * EGetDriveToBeScanned:
- *    - the drive to be scanned has been given as command line argument,
- *      store it to iDrive
- *
- * EAppsInInstalledDirectories:
- *    - go through all directories in iDirs one by one
- *      and find all java applications in the subdirectories of the directory
- *    - if only .jar/.dcf/.dm file is found it is added to iInstallFiles
- *    - if .jad file is found, it is added to iInstallFiles
- *
- * EUninstallFromOMJ:
- *   - uninstall all OMJ java applications in drive iDrive using Java Installer
- *     command line options 'uninstallall -drive=<iDrive>'
- *   - then for each java application in iInstallFiles try to find it from
- *     Java Storage based on MIDlet suite name and vendor name. If the MIDlet
- *     is still installed to OMJ (to some other drive than iDrive), it must
- *     be uninstalled from OMJ to reset the state of MIDlet (RMS data etc)
- *     to original state. The actual uninstallation is not done in this
- *     state, the uids of the applications to be uninstalled are just added to
- *     iUninstallUids in string format
- *
- * EExecuteRestoreServer:
- *  - give list of uninstall uids and list of install files to restore server
- *  - start restore server in another thread (it will listen to Comms messages)
- *  - start Java Installer in poll mode
- *  - when Java Installer polls for operations to be executed, the restore server
- *    will first ask it to uninstall each Java application in the list of uninstall uids,
- *    then restore server will ask Java Installer to install each .jad or .jar/.dcf/.dm file
- *    in the list of install files.
- *    Restore server will log whether each uninstallation / installation succeeds.
- *  - after all uninstallations and installations have been done, restore server will ask
- *    Java Installer to exit.
- *  - after that this active object moves to next state.
- *
- * EExit: free resources and exit
- *
- */
-void CRestoreConvertMIDlet::RunL()
-{
-    switch (iState)
-    {
-    case EFindOutDeviceDrives:
-    {
-        LOG(EJavaConverters, EInfo,
-            "CRestoreConvertMIDlet::RunL EFindOutDeviceDrives");
-        GetAllDeviceDrivesL();
-        iState = EGetDriveToBeScanned;
-        CompleteRequest();
-    }
-    break;
-
-    case EGetDriveToBeScanned:
-    {
-        LOG(EJavaConverters, EInfo,
-            "CRestoreConvertMIDlet::RunL EGetDriveToBeScanned");
-
-        HBufC *pBufCmdLine = HBufC::NewLC(User::CommandLineLength() + 10);
-        TPtr args = pBufCmdLine->Des();
-        User::CommandLine(args);
-        LOG1WSTR(EJavaConverters, EInfo,
-                 "Command line arguments of javarestoreconverter.exe are : %s",
-                 (wchar_t *)(args.PtrZ()));
-
-        // Check which drive is to be restored now from command line.
-        TDriveNumber drive = EDriveC;
-        TInt idx = args.Find(KDriveText());
-        if (KErrNotFound == idx)
-        {
-            LOG1WSTR(EJavaConverters, EError,
-                     "no -drive<X> argument in javarestoreconveter.exe command line (%s)",
-                     (wchar_t *)(args.PtrZ()));
-            User::Leave(KErrNotFound);
-        }
-
-        TChar driveChar = args[idx + KDriveText().Length()];
-        char argLetter = args[idx + KDriveText().Length()];
-        if (argLetter >= 'A' && argLetter <= 'J')
-        {
-            drive = (TDriveNumber)(argLetter - 'A');
-        }
-        else if (argLetter >= 'a' && argLetter <= 'j')
-        {
-            drive = (TDriveNumber)(argLetter - 'a');
-        }
-        else
-        {
-            User::Leave(KErrArgument);
-        }
-        CleanupStack::PopAndDestroy(pBufCmdLine);
-        iDrive = drive;
-
-        LOG1(EJavaConverters, EInfo, "Drive is %d", drive);
-
-        // forget old search directories
-        iDirs.ResetAndDestroy();
-
-        // The specified drive will be scanned for
-        // java applications to be converted
-        if (iDriveStatuses[drive] & DriveInfo::EDrivePresent)
-        {
-            (void)iFs.DriveToChar(drive, driveChar);
-
-            // The base Java application install directory in this
-            // drive must be scanned.
-            // Reserve memory also for drive letter and terminating zero
-            // for logging.
-            HBufC *baseInstallDir = HBufC::NewLC(KMidletSuiteInstallBasePath().Length() + 2);
-
-            TPtr dirPtr(baseInstallDir->Des());
-            dirPtr.Append(driveChar);
-            dirPtr.Append(KMidletSuiteInstallBasePath());
-
-            // Add new search directory
-            iDirs.AppendL(baseInstallDir);
-            CleanupStack::Pop(baseInstallDir);
-        }
-        else
-        {
-            // Restoring MIDlets to drive X but drive X is not present
-            ELOG1(EJavaConverters,
-                  "javarestoreconverter.exe: Drive number %d is not present", drive);
-            User::Leave(KErrDisMounted);
-        }
-
-        iState = EAppsInInstalledDirectories;
-        CompleteRequest();
-    }
-    break;
-
-    case EAppsInInstalledDirectories:
-    {
-        LOG(EJavaConverters, EInfo,
-            "CRestoreConvertMIDlet::RunL EAppsInInstalledDirectories");
-
-        GetInstallFilesL(iDirs);
-
-
-        iState = EUninstallFromOMJ;
-        CompleteRequest();
-    }
-    break;
-
-    case EUninstallFromOMJ:
-    {
-        LOG(EJavaConverters, EInfo,
-            "CRestoreConvertMIDlet::RunL EUninstallFromOMJ");
-
-        // Uninstall all Java applications in current drive
-        UninstallAllFromDriveL(iDrive);
-
-        // Check all Jad / Jar files in iInstallFiles and
-        // add the Uids of those MIDlets still installed into OMJ
-        // to iUninstallUids
-        FindRemainingMIDletsToBeUninstalledL();
-
-        iState = EExecuteRestoreServer;
-        CompleteRequest();
-    }
-    break;
-
-    case EExecuteRestoreServer:
-    {
-        LOG(EJavaConverters, EInfo,
-            "CRestoreConvertMIDlet::RunL EExecuteRestoreServer");
-
-        if (iNumberOfAppsToInstall > 0)
-        {
-            // Uninstall all MIDlet suites in iUninstallUids and then
-            // install all MIDlet suites in iInstallFiles.
-
-            // Tell RestoreServer what should be uninstalled and what
-            // should be converted
-            iConvertServer->setOperations(iInstallFiles, iUninstallUids);
-
-            // Start the server
-            int err = iConvertServer->start();
-            if (0 != err)
-            {
-                // server cannot be started
-                ELOG1(EJavaConverters,
-                      "Cannot start convert server, err %d", err);
-            }
-
-            // Starts Java Installer, waits until Java Installer exits
-            RunJavaInstallerL();
-
-            iState = EExit;
-        }
-        else
-        {
-            iState = EExit;
-            CompleteRequest();
-        }
-    }
-    break;
-
-    case EExit:
-    {
-        LOG(EJavaConverters, EInfo, "CRestoreConvertMIDlet::RunL EExit");
-
-        // Stops the server if it is running
-        iConvertServer->stop();
-
-        FullCleanup();
-
-        // The whole javaappconverter process is stopped.
-        Exit();
-    }
-    break;
-    }
-}
-
-/**
- * To handle leave from RunL.
- * This method exits this active object using normal state machine
- * After calling this method this active object will exit.
- *
- * @param aError - A reason of error.
- * @return KErrNone.
- */
-TInt CRestoreConvertMIDlet::RunError(TInt aError)
-{
-    ELOG2(EJavaConverters,
-          "CRestoreConvertMIDlet::RunError(%d) from state %d", aError, iState);
-
-    Cancel();
-
-    iState = EExit;
-    CompleteRequest();
-
-    return KErrNone;
-}
-
-/**
- * To do cancelling for this object.
- *
- */
-void CRestoreConvertMIDlet::DoCancel()
-{
-    ELOG1(EJavaConverters,
-          "CRestoreConvertMIDlet::DoCancel from state %d", iState);
-
-    // Check whether restore server must be stopped
-    if (iState == EExecuteRestoreServer)
-    {
-        // Stops the server if it is running
-        iConvertServer->stop();
-    }
-}
-
-/**
- * Add .jad files in the directories specified in aDirs to iInstallFiles.
- * If a directory does not contain a .jad file but it contains a .jar/.dcf/.dm file,
- * add that file to iInstallFiles
- *
- * @param aDirs - An array of directories to be scanned.
- * @exception Unable to alloc memory for the internal buffers.
- * @exception Unable to get directory's contents.
- */
-void CRestoreConvertMIDlet::GetInstallFilesL(RPointerArray<HBufC>& aDirs)
-{
-    // Number of MIDlet installation base directories to scan,
-    // one directory per local drive
-    const TInt nBaseDirs = aDirs.Count();
-
-    for (TInt i = 0; i < nBaseDirs; i++)
-    {
-        TFileName suitePath;
-
-        // Form base directory path, MIDlets have been installed
-        // to subdirectories of this directory
-        const TPtrC& dir = ((HBufC *)(aDirs[i]))->Des();
-        TFileName baseSuitePath = dir;
-
-        CDir *entryList;
-        CDir *dirList;
-        TInt err = iFs.GetDir(baseSuitePath, KEntryAttMatchMask, ESortNone, entryList, dirList);
-        if (KErrNone != err)
-        {
-            WLOG1WSTR(EJavaConverters,
-                      "CRestoreConvertMIDlet::GetInstallFilesL Cannot list directory %s",
-                      (wchar_t *)(baseSuitePath.PtrZ()));
-
-            // If no S60 Java application has been installed to the drive,
-            // the directory does not exist but it is OK
-            if (KErrPathNotFound != err)
-            {
-                User::Leave(err);
-            }
-            continue;
-        }
-
-        // Only midlet installation directory entries are meaningfull,
-        // discard other possible entries
-        delete entryList;
-
-        TInt   nCount = dirList->Count();
-        TEntry dirEntry;
-
-        for (TInt nInd = 0; nInd < nCount; nInd++)
-        {
-            dirEntry = (*dirList)[nInd];
-            // Just to make sure this really is subdirectory
-            if (dirEntry.IsDir())
-            {
-                // Is this midlet suite subdir?
-                // Midlet suite subdirs look like this "[102b567B]"
-                // Must parse the value of the Uid as unsigned int to avoid
-                // overflow
-                TUint32 nUid;
-                TLex   lexer(dirEntry.iName);
-                lexer.Inc();
-                err = lexer.Val(nUid, EHex);
-                if (KErrNone != err)
-                {
-                    // Not midlet suite subdir, skip it
-                    continue;
-                }
-
-                // Does the subdirectory contain any Jar files?
-                suitePath = baseSuitePath;
-                suitePath.Append(dirEntry.iName);
-                suitePath.Append(KSMCBackSplash);
-
-                CDir *suiteDirEntryList;
-                err = iFs.GetDir(suitePath, KEntryAttMatchMask, ESortNone, suiteDirEntryList);
-                if (KErrNone != err)
-                {
-                    LOG1WSTR(EJavaConverters, EError,
-                             "CRestoreConvertMIDlet::GetInstallFilesL Cannot list content of suite dir %s",
-                             (wchar_t *)(suitePath.PtrZ()));
-                    User::Leave(err);
-                    return;
-                }
-                // If there is .jad or Jar file in suiteDirEntryList, adds
-                // it to iInstallFiles.
-                // Recognizes also DRM protected Jar files (.dm, .dcf)
-                AddJadJarToInstallFilesL(suitePath, suiteDirEntryList);
-                delete suiteDirEntryList;
-            }
-        } // for - loop all directory entries in a base installation directories
-        delete dirList;
-
-    } // for - loop all base installation directories
-
-    if (iInstallFiles.Count() == 0)
-    {
-        WLOG(EJavaConverters,
-             "CRestoreConvertMIDlet::GetInstallFilesL No MIDlets to convert");
-    }
-
-    // how many applications to restore
-    iNumberOfAppsToInstall = iInstallFiles.Count();
-}
-
-/**
- *  For each java application in iInstallFiles try to find it from
- *  Java Storage based on MIDlet suite name and vendor name. If the MIDlet
- *  is still installed to OMJ (to some other drive than iDrive), it must
- *  be uninstalled from OMJ to reset the state of MIDlet (RMS data etc)
- *  to original state. Add the uids of the applications to be uninstalled
- *  to iUninstallUids in string format
- */
-void CRestoreConvertMIDlet::FindRemainingMIDletsToBeUninstalledL()
-{
-    TBool namesParsed;
-    for (TInt nInd = 0; nInd < iNumberOfAppsToInstall; nInd++)
-    {
-        // Get the MIDlet-Name and MIDlet-Vendor from iInstallFiles[nInd]
-        if (iIsJad[nInd] == 1)
-        {
-            namesParsed = ParseJadL(*iInstallFiles[nInd]);
-        }
-        else
-        {
-            // If file is .jar file, get the names from Manifest
-            namesParsed = ParseJarL(*iInstallFiles[nInd]);
-        }
-
-        // Search for the MIDlet suite from Java Storage table APPLICATION_PACKAGE_TABLE
-        // If it is found, add the suite Uid in string format to iUninstallUids
-        if (namesParsed)
-        {
-            TPtr suite = iMIDletName->Des();
-            TPtr vendor = iMIDletVendor->Des();
-            std::wstring suiteUid = IsSuiteInstalled(suite, vendor);
-            if (!suiteUid.empty())
-            {
-                iUninstallUids.push_back(suiteUid);
-            }
-        }
-    }
-}
-
-/**
- * Parse MIDlet-Name and MIDlet-Vendor parameters from JAD file.
- * Parameters are stored to iMIDletName and iMIDletVendor
- *
- * @param ETrue if parsing succeeds otherwise EFalse.
- */
-TBool CRestoreConvertMIDlet::ParseJadL(const TDesC& aJadFileName)
-{
-    HBufC *jadContent = NULL;
-    // Trap leave thrown if reading jad content fails
-    TRAPD(err, jadContent = GetJadContentL(aJadFileName));
-    if (KErrNone != err)
-    {
-        ELOG1(EJavaConverters,
-              "CRestoreConvertMIDlet::ParseJadL Reading Jad content failed, error %d",
-              err);
-        return EFalse;
-    }
-    CleanupStack::PushL(jadContent);
-
-    HBufC *midletName = ParseAttribute(jadContent, KMidletName);
-    if (NULL == midletName)
-    {
-        ELOG(EJavaConverters,
-             "CRestoreConvertMIDlet::ParseJadL Parsing midlet name failed.");
-        CleanupStack::PopAndDestroy(jadContent);
-        return EFalse;
-    }
-    // store midlet name to member variable and log it
-    TPtr namePtr(iMIDletName->Des());
-    namePtr.Copy(*midletName);
-    LOG1WSTR(EJavaConverters, EInfo,
-             "CRestoreConvertMIDlet::ParseJadL MIDlet-Name %s",
-             (wchar_t *)(namePtr.PtrZ()));
-    delete midletName;
-
-    HBufC *midletVendor = ParseAttribute(jadContent, KMidletVendor);
-    if (NULL == midletVendor)
-    {
-        ELOG(EJavaConverters,
-             "CRestoreConvertMIDlet::ParseJadL Parsing midlet vendor failed.");
-        CleanupStack::PopAndDestroy(jadContent);
-        return EFalse;
-    }
-    // store midlet vendor to member variable and log it
-    TPtr vendorPtr(iMIDletVendor->Des());
-    vendorPtr.Copy(*midletVendor);
-    LOG1WSTR(EJavaConverters, EInfo,
-             "CRestoreConvertMIDlet::ParseJadL MIDlet-Vendor %s",
-             (wchar_t *)(vendorPtr.PtrZ()));
-    delete midletVendor;
-
-    CleanupStack::PopAndDestroy(jadContent);
-    return ETrue;
-}
-
-
-/**
- * Reads the whole content of the Jad file and returns it in
- * buffer in Symbian Unicode character set.
- * @param[in] aJadFile
- * @return pointer to HBufC that contains the Jad file,
- * ownership is transferred to caller
- * @exception If jad file content cannot be read
- */
-HBufC *CRestoreConvertMIDlet::GetJadContentL(const TDesC& aJadFileName)
-{
-    RFile jadFile;
-    TInt err = jadFile.Open(iFs, aJadFileName, EFileRead);
-    User::LeaveIfError(err);
-    CleanupClosePushL(jadFile);
-
-    // Reserve buffer for Jad in UTF-8 char set
-    TInt jadSize = 0;
-    err = jadFile.Size(jadSize);
-    User::LeaveIfError(err);
-    HBufC8 *bufUtf8Jad  = HBufC8::NewL(jadSize);
-    CleanupStack::PushL(bufUtf8Jad);
-
-    // Read the content in Utf8 char set
-    TPtr8 tmpPtr(bufUtf8Jad->Des());
-    err = jadFile.Read(tmpPtr, jadSize);
-    User::LeaveIfError(err);
-
-    // Convert to Unicode
-    HBufC *bufUnicodeJad =
-        CnvUtfConverter::ConvertToUnicodeFromUtf8L(*bufUtf8Jad);
-
-    CleanupStack::PopAndDestroy(bufUtf8Jad);
-    CleanupStack::PopAndDestroy(&jadFile);
-
-    // Return to caller
-    return bufUnicodeJad;
-}
-
-
-/**
- * Parse MIDlet-Name and MIDlet-Vendor parameters from Manifest inside
- * a .jar file.
- * Parameters are stored to iMIDletName and iMIDletVendor
- *
- * @param ETrue if parsing succeeds otherwise EFalse.
- */
-TBool CRestoreConvertMIDlet::ParseJarL(const TDesC& aJarFileName)
-{
-    HBufC *manifestContent = NULL;
-    // Trap leave thrown if reading Manifest content fails
-    TRAPD(err, manifestContent = GetManifestContentL(aJarFileName));
-    if (KErrNone != err)
-    {
-        ELOG1(EJavaConverters,
-              "CRestoreConvertMIDlet::ParseJarL Reading Manifest failed, error %d",
-              err);
-        return EFalse;
-    }
-    CleanupStack::PushL(manifestContent);
-
-    HBufC *midletName = ParseAttribute(manifestContent, KMidletName);
-    if (NULL == midletName)
-    {
-        ELOG(EJavaConverters,
-             "CRestoreConvertMIDlet::ParseJarL Parsing midlet name failed.");
-        CleanupStack::PopAndDestroy(manifestContent);
-        return EFalse;
-    }
-    // store midlet name to member variable and log it
-    TPtr namePtr(iMIDletName->Des());
-    namePtr.Copy(*midletName);
-    LOG1WSTR(EJavaConverters, EInfo,
-             "CRestoreConvertMIDlet::ParseJarL MIDlet-Name %s",
-             (wchar_t *)(namePtr.PtrZ()));
-    delete midletName;
-
-    HBufC *midletVendor = ParseAttribute(manifestContent, KMidletVendor);
-    if (NULL == midletVendor)
-    {
-        ELOG(EJavaConverters,
-             "CRestoreConvertMIDlet::ParseJarL Parsing midlet vendor failed.");
-        CleanupStack::PopAndDestroy(manifestContent);
-        return EFalse;
-    }
-    // store midlet vendor to member variable and log it
-    TPtr vendorPtr(iMIDletVendor->Des());
-    vendorPtr.Copy(*midletVendor);
-    LOG1WSTR(EJavaConverters, EInfo,
-             "CRestoreConvertMIDlet::ParseJarL MIDlet-Vendor %s",
-             (wchar_t *)(vendorPtr.PtrZ()));
-    delete midletVendor;
-
-    CleanupStack::PopAndDestroy(manifestContent);
-    return ETrue;
-}
-
-
-/**
- * Reads the whole content of the Manifest inside Jar file
- * and returns it in buffer in Symbian Unicode character set.
- * @param[in] aJarFile
- * @return pointer to HBufC that contains the Manifest,
- * ownership is transferred to caller
- * @exception If Manifest content cannot be read
- */
-HBufC *CRestoreConvertMIDlet::GetManifestContentL(const TDesC& aJarFileName)
-{
-    CZipFile* zipFile = CZipFile::NewL(iFs, aJarFileName);
-    CleanupStack::PushL(zipFile);
-
-    // Seek manifest file
-    CZipFileMember* zippedFile =
-        zipFile->CaseSensitiveOrCaseInsensitiveMemberL(KManifestEntryName());
-    if (!zippedFile)
-    {
-        ELOG(EJavaConverters,
-             "CRestoreConvertMIDlet::GetManifestContentL Package is missing manifest");
-        User::Leave(KErrNotFound);
-    }
-    CleanupStack::PushL(zippedFile);
-
-    TUint uncompressedSize = zippedFile->UncompressedSize();
-    if ((TUint)uncompressedSize >= (KMaxTInt/2))
-    {
-        ELOG(EJavaConverters, "CRestoreConvertMIDlet::GetManifestContentL Invalid manifest");
-        User::Leave(KErrCorrupt);
-    }
-
-    // Buffer to read Manifest into
-    HBufC8* resultData = HBufC8::NewLC(uncompressedSize);
-
-    RZipFileMemberReaderStream* zippedStream = 0;
-    TInt err = zipFile->GetInputStreamL(zippedFile, zippedStream);
-    User::LeaveIfError(err);
-    CleanupStack::PushL(zippedStream);
-
-    TPtr8 ptr(resultData->Des());
-    User::LeaveIfError(zippedStream->Read(ptr, uncompressedSize));
-
-    CleanupStack::PopAndDestroy(zippedStream);
-
-    // Manifest buffer when converted to UCS-2
-    HBufC *manifestContent = HBufC16::NewL(uncompressedSize);
-    TPtr16 ucsPtr(manifestContent->Des());
-    err = CnvUtfConverter::ConvertToUnicodeFromUtf8(ucsPtr, ptr);
-    if (KErrNone != err)
-    {
-        ELOG1(EJavaConverters,
-              "CRestoreConvertMIDlet::GetManifestContentL UTF-8 to unicode"
-              " conversion failed: %d", err);
-        User::Leave(err);
-    }
-    CleanupStack::PopAndDestroy(resultData);
-    CleanupStack::PopAndDestroy(zippedFile);
-    CleanupStack::PopAndDestroy(zipFile);
-
-    // Return to caller
-    return manifestContent;
-}
-
-
-std::wstring CRestoreConvertMIDlet::IsSuiteInstalled(TPtr& aSuiteName, TPtr& aVendorName)
-{
-    std::wstring suiteName(desToWstring(aSuiteName));
-    std::wstring vendorName(desToWstring(aVendorName));
-    std::wstring suiteUid;
-
-    // Find application uid based on names from Java Storage
-    JavaStorage *js = JavaStorage::createInstance();
-
-    try
-    {
-        js->open(JAVA_DATABASE_NAME);
-
-        JavaStorageEntry attribute;
-        JavaStorageApplicationEntry_t findPattern;
-        JavaStorageApplicationList_t  foundEntries;
-
-        // Get ID from APPLICATION_PACKAGE_TABLE  based on PACKAGE_NAME and VENDOR
-        attribute.setEntry(PACKAGE_NAME, suiteName);
-        findPattern.insert(attribute);
-        attribute.setEntry(VENDOR, vendorName);
-        findPattern.insert(attribute);
-        attribute.setEntry(ID, L"");
-        findPattern.insert(attribute);
-
-        js->search(APPLICATION_PACKAGE_TABLE , findPattern, foundEntries);
-
-        // Anything found?
-        if (foundEntries.size() > 0)
-        {
-            // The application package has been found, get the ID of the package
-            suiteUid = foundEntries.front().begin()->entryValue();
-            LOG1WSTR(EJavaConverters, EInfo,
-                     "CRestoreConvertMIDlet::IsSuiteInstalled: Found suite by name. Uid is %s",
-                     suiteUid.c_str());
-        }
-    }
-    catch (JavaStorageException& e)
-    {
-        ELOG1(EJavaConverters,
-              "CRestoreConvertMIDlet::IsSuiteInstalled: Java Storage exception %s", e.what());
-    }
-
-    try
-    {
-        js->close();
-    }
-    catch (JavaStorageException& e2)
-    {
-        WLOG1(EJavaConverters,
-              "CRestoreConvertMIDlet::IsSuiteInstalled: Java Storage exception "
-              "when closing storage %s", e2.what());
-    }
-
-    delete js;
-
-    // suiteUid is empty if suite was not found
-    return suiteUid;
-}
-
-
-/**
- * Finds the java attribute specified by aAttributeName
- * from aBuf and returns the value of that attribute
- * in HBufC.
- * @param[in] aBuf contents of .jad / Manifest file
- * @param[in] aAttributeName the name of a java attribute
- * @return the value of the attribute. Caller gets the ownership of the
- * returned HBufC.
- * If the attribute is not found, returns NULL
- */
-HBufC *CRestoreConvertMIDlet::ParseAttribute(const HBufC *aBuf, const TDesC& aAttributeName)
-{
-    TInt    nInd(0);
-    TBool   fullNameFound(EFalse);
-    TUint32 ch;
-
-    // Start parsing from the beginning
-    TPtrC parsePtr = aBuf->Mid(nInd);
-
-    do
-    {
-        // Find attribute name
-        nInd = parsePtr.Find(aAttributeName);
-        if (nInd < 0)
-        {
-            // Returns NULL if the attribute cannot be found
-            return NULL;
-        }
-
-        // Check that the attribute name was preceded by line break or
-        // it was at the beginning
-        if (nInd == 0)
-        {
-            fullNameFound = ETrue;
-        }
-        else
-        {
-            ch = parsePtr[nInd-1];
-            if ((ch == CR) || (ch == LF))
-            {
-                fullNameFound = ETrue;
-            }
-            else
-            {
-                // Name was just a part of longer string (not 'word match')
-                fullNameFound = EFalse;
-                // Skip to the last character of the found match.
-                // We can skip because we are insterested only in 'word' matches
-                // so the next cannot start inside the area we are skipping now.
-                parsePtr.Set(parsePtr.Mid(nInd + aAttributeName.Length() - 1));
-                continue;
-            }
-        }
-
-        // Check whether buffer ends after attribute name
-        if (nInd + aAttributeName.Length() >= parsePtr.Length())
-        {
-            // Buffer ends immediately after the found
-            // attribute name instance. No attribute value
-            return NULL;
-        }
-
-        // Check that there is a white space character or colon after
-        // attribute name
-        ch = parsePtr[nInd + aAttributeName.Length()];
-        if ((ch == COLON) || (ch == SP) || (ch == HT))
-        {
-            fullNameFound = ETrue;
-        }
-        else
-        {
-            // Name was just a part of longer string (not 'word match')
-            fullNameFound = EFalse;
-            // Skip to the next character after the found match
-            parsePtr.Set(parsePtr.Mid(nInd + aAttributeName.Length()));
-            continue;
-        }
-    }
-    while (!fullNameFound);
-
-    // Skip to the end of the attribute name and find ':' after the name.
-    // The skipped characters must be white space chacraters, otherwise
-    // the attribute name is illegal and Java Installer will not accept
-    // the Jad file / Manifest.
-    parsePtr.Set(parsePtr.Mid(nInd + aAttributeName.Length() - 1));
-    nInd = parsePtr.Locate(COLON);
-    if (nInd < 0)
-    {
-        return NULL;
-    }
-    nInd++;
-
-    // Parse attribute value (CR or LF ends)
-    TInt nEndInd = parsePtr.Locate(CR);
-    TInt nTmpInd = parsePtr.Locate(LF);
-
-    if (KErrNotFound == nEndInd)
-    {
-        nEndInd = parsePtr.Length() - 1;
-    }
-    if (KErrNotFound == nTmpInd)
-    {
-        nTmpInd = parsePtr.Length() - 1;
-    }
-
-    if (nTmpInd < nEndInd)
-    {
-        nEndInd = nTmpInd;
-    }
-
-    if (nEndInd < nInd)
-    {
-        return NULL;
-    }
-
-    TPtrC attributeValue = parsePtr.Mid(nInd, (nEndInd - nInd));
-
-    // Remove possible white space from the beginning and end of the value
-    HBufC *bufValue = attributeValue.Alloc();
-    if (NULL == bufValue)
-    {
-        return NULL;
-    }
-    TPtr value = bufValue->Des();
-    value.Trim();
-
-    return bufValue;
-} // parseAttribute
-
-
-/**
- * Uninstall all Java 2.x MIDlets from drive given in aDrive
- *
- * @param aDrive uninstallation drive
- */
-void CRestoreConvertMIDlet::UninstallAllFromDriveL(TDriveNumber &aDrive)
-{
-    // Execute Java Installer with uninstallall -drive=X command line options
-
-    LOG1(EJavaConverters, EInfo,
-         "CRestoreConvertMIDlet::UninstallAllFromDriveL Going to uninstall "
-         "MIDlets from drive number %d", aDrive);
-
-    RProcess rJavaInstaller;
-    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, do not send uninstall notification messages
-    commandLine.Append(_L(" -silent -skipotastatus -drive="));
-
-    // Add drive letter
-    commandLine.Append((TChar)('A' + aDrive));
-
-    // 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, "CRestoreConvertMIDlet::UninstallAllFromDriveL calling Rendezvous");
-        // This call will wait until Java Installer exits (or panics)
-        TRequestStatus status;
-        rJavaInstaller.Logon(status);
-
-        LOG(EJavaConverters, EInfo, "CRestoreConvertMIDlet::UninstallAllFromDriveL calling Resume");
-        rJavaInstaller.Resume();
-
-        // now wait until Java Installer exits
-        User::WaitForRequest(status);
-        if (status.Int() != KErrNone)
-        {
-            ELOG1(EJavaConverters,
-                  "CRestoreConvertMIDlet::UninstallAllFromDriveL Installer exited with error %d",
-                  status.Int());
-        }
-    }
-    else
-    {
-        ELOG1(EJavaConverters,
-              "CRestoreConvertMIDlet::UninstallAllFromDriveL Cannot start Installer, error %d", err);
-    }
-
-    LOG(EJavaConverters, EInfo, "CRestoreConvertMIDlet::UninstallAllFromDriveL calling RProcess::Close");
-    // free resources before returning
-    rJavaInstaller.Close();
-}
-
-
-/**
- * Scan the content of one directory entry and add the name of
- * .jad / .jar /.dcf/.dm file to iInstallFiles if
- * the directory contains a valid, installed Java application.
- * Recognizes also DRM protected jar files (.dm, .dcf)
- *
- * @param aSuitePathName -  directory to be scanned.
- * @param aSuiteDirEntryList - contents of the directory
- * @exception Unable to alloc memory for the internal buffers.
- */
-void CRestoreConvertMIDlet::AddJadJarToInstallFilesL(
-    const TFileName &aSuitePathName,
-    const CDir *aSuiteDirEntryList)
-{
-    if (NULL == aSuiteDirEntryList)
-    {
-        return;
-    }
-
-    TInt nCount = aSuiteDirEntryList->Count();
-    if (0 == nCount)
-    {
-        return;
-    }
-
-    TInt        suffixPos;
-    TEntry      dirEntry;
-    TBool       jarFileInSuiteDir = EFalse;
-    TBool       jadFileInSuiteDir = EFalse;
-    TFileName   jadFullPathName;
-    TFileName   jarFullPathName;
-
-    for (TInt nInd = 0; nInd < nCount; nInd++)
-    {
-        dirEntry = (*aSuiteDirEntryList)[nInd];
-        // Directory cannot be Jar file.
-        // Empty file cannot valid Jar file
-        if (dirEntry.IsDir() || (dirEntry.iSize == 0))
-        {
-            continue;
-        }
-        // get the suffix of the name
-        suffixPos = dirEntry.iName.LocateReverse('.');
-        if (suffixPos == KErrNotFound)
-        {
-            // File name does not contain '.' char
-            continue;
-        }
-        TPtrC suffix(dirEntry.iName.Mid(suffixPos));
-
-        // if the name ends with ".jar" the name is current candidate
-        // for the name to be added to iInstallFiles list
-        if (suffix.CompareF(KJarFileNameSuffix) == 0)
-        {
-            jarFullPathName = aSuitePathName;
-            jarFullPathName.Append(dirEntry.iName);
-            jarFileInSuiteDir = ETrue;
-        }
-        else if (suffix.CompareF(KJadFileNameSuffix) == 0)
-        {
-            // If .jad file is found, then it will be added
-            // to iInstallFiles list
-            jadFullPathName = aSuitePathName;
-            jadFullPathName.Append(dirEntry.iName);
-            jadFileInSuiteDir = ETrue;
-        }
-        else if (suffix.CompareF(KFLJarFileNameSuffix) == 0)
-        {
-            // forward locked and combined delivery DRM protected
-            // .jar files have suffix ".dm"
-            jarFullPathName = aSuitePathName;
-            jarFullPathName.Append(dirEntry.iName);
-            jarFileInSuiteDir = ETrue;
-        }
-        else if (suffix.CompareF(KSDJarFileNameSuffix) == 0)
-        {
-            // separate delivery DRM protected .jar files have suffix ".dcf"
-            jarFullPathName = aSuitePathName;
-            jarFullPathName.Append(dirEntry.iName);
-            jarFileInSuiteDir = ETrue;
-        }
-    }
-
-    // If directory contains a Jar file, then add something to iInstallFiles
-    if (jarFileInSuiteDir)
-    {
-        // If directory contains also .jad file, add .jad file name to iInstallFiles
-        if (jadFileInSuiteDir)
-        {
-            // Reserve one char for null terminator
-            HBufC* path = HBufC::NewLC(jadFullPathName.Length() + 1);
-            TPtr pathPtr(path->Des());
-            pathPtr.Append(jadFullPathName);
-
-            LOG1WSTR(EJavaConverters, EInfo,
-                     "CRestoreConvertMIDlet::AddJadJarToInstallFilesL Adding jad file %s",
-                     (wchar_t *)(pathPtr.PtrZ()));
-            iInstallFiles.Append(path);
-            CleanupStack::Pop(path);
-            iIsJad.AppendL(1);
-        }
-        else
-        {
-            // Reserve one char for null terminator
-            HBufC* path = HBufC::NewLC(jarFullPathName.Length() + 1);
-            TPtr pathPtr(path->Des());
-            pathPtr.Append(jarFullPathName);
-
-            LOG1WSTR(EJavaConverters, EInfo,
-                     "CRestoreConvertMIDlet::AddJadJarToInstallFilesL Adding jar file %s",
-                     (wchar_t *)(pathPtr.PtrZ()));
-            iInstallFiles.Append(path);
-            CleanupStack::Pop(path);
-            iIsJad.AppendL(0);
-        }
-    }
-}
-
-/**
- * Start Java Installer in poll mode and then wait until it exits.
- */
-void CRestoreConvertMIDlet::RunJavaInstallerL()
-{
-    LOG(EJavaConverters, EInfo, "CRestoreConvertMIDlet::RunJavaInstaller");
-
-    RProcess rJavaInstaller;
-    TFileName fileName;
-    TInt err;
-    // Max one path name, user name and password and some options ->
-    // 1536 is enough
-    TBuf<1536> commandLine;
-
-    // Build command line used to pass all necessary info to Java Installer
-    std::auto_ptr<HBufC> installerStarterDll(
-        stringToDes(java::runtime::JAVA_INSTALLER_STARTER_DLL));
-    commandLine = installerStarterDll->Des();
-    commandLine.Append(_L(" poll -address=convert"));
-
-    // Run installer silently
-    commandLine.Append(_L(" -silent -skipotastatus -silentconversion"));
-
-    // Convert old S60 applications so that applications uids,
-    // private data and RMS data are all preserved
-    commandLine.Append(_L(" -convert=yes"));
-
-    // Upgrading MIDlets is allowed
-    commandLine.Append(_L(" -upgrade=yes"));
-
-    // No OCSP checks for converted MIDlets
-    commandLine.Append(_L(" -ocsp=no"));
-
-    // Allow upgrade even if version number has not increased
-    commandLine.Append(_L(" -overwrite=yes"));
-
-    // Downloading .jar is not allowed.
-    commandLine.Append(_L(" -download=no"));
-
-    // If upgrade install, automatically upgrade also the data
-    commandLine.Append(_L(" -upgrade_data=yes"));
-
-    // MIDlets must be restored to the original drive
-    if (iDrive > -1)
-    {
-        TChar targetDrive;
-        err = RFs::DriveToChar(iDrive, targetDrive);
-        if (KErrNone == err)
-        {
-            commandLine.Append(_L(" -drive="));
-            commandLine.Append(targetDrive);
-        }
-    }
-
-    // start JavaInstaller
-    std::auto_ptr<HBufC> installerProcess(
-        stringToDes(java::runtime::JAVA_PROCESS));
-    err = rJavaInstaller.Create(installerProcess->Des(), commandLine);
-    if (KErrNone == err)
-    {
-        LOG(EJavaConverters, EInfo, "CRestoreConvertMIDlet::RunJavaInstaller calling Rendezvous");
-        // This call will wait until Java Installer exits (or panics)
-        rJavaInstaller.Logon(iStatus);
-
-        LOG(EJavaConverters, EInfo, "CRestoreConvertMIDlet::RunJavaInstaller calling Resume");
-        rJavaInstaller.Resume();
-    }
-    else
-    {
-        ELOG1(EJavaConverters,
-              "CRestoreConvertMIDlet::RunJavaInstaller Cannot start Installer, error %d", err);
-        // CActive will trap the following leave, execution will go to RunError
-        User::Leave(err);
-    }
-
-    LOG(EJavaConverters, EInfo, "CRestoreConvertMIDlet::RunJavaInstaller calling RProcess::Close");
-    // free resources before returning
-    rJavaInstaller.Close();
-
-    // now wait until Java Installer exits
-    SetActive();
-}
-
-/**
- * To cleanup member variables.
- */
-void CRestoreConvertMIDlet::FullCleanup()
-{
-    iDirs.ResetAndDestroy();
-    iInstallFiles.ResetAndDestroy();
-    iUninstallUids.clear();
-    iIsJad.Reset();
-}
-
-
-/**
- * Checks all local drives in the device and stores the DriveInfo API drive
- * status information for each drive to iDriveStatuses
- * @exception Cannot get drive list.
- */
-void CRestoreConvertMIDlet::GetAllDeviceDrivesL()
-{
-    TDriveList driveList;
-    // get all drives
-    TInt err = iFs.DriveList(driveList);
-    if (KErrNone != err)
-    {
-        ELOG1(EJavaConverters,
-              "CRestoreConvertMIDlet::GetAllDeviceDrives cannot get drive list, err %d", err);
-        User::Leave(err);
-    }
-
-    // store status of the non-remote, non-substed drives
-    TUint  status = 0;
-    for (TInt drive = 0; drive < KMaxDrives; drive++)
-    {
-        iDriveStatuses[drive] = 0;
-
-        if (driveList[drive] == 0)
-        {
-            // no such drive in this device
-            continue;
-        }
-
-        err = DriveInfo::GetDriveStatus(iFs, drive, status);
-        if (KErrNone != err)
-        {
-            ELOG2(EJavaConverters,
-                  "CRestoreConvertMIDlet::GetAllDeviceDrivesL cannot get drive %d status, err %d",
-                  drive, err);
-            User::Leave(err);
-        }
-        // D drive is temporary RAM drive, skip it
-        // Drives J to Y are substed or remote drives, skip them
-        if ((drive == EDriveD) || ((drive >= EDriveJ) && (drive <= EDriveY)))
-        {
-            continue;
-        }
-
-        iDriveStatuses[drive] = status;
-    }
-}