launcher/engine/src/launcherengine.cpp
branchRCL_3
changeset 46 fad26422216a
parent 45 b3cee849fa46
child 49 f8280f3bfeb7
--- a/launcher/engine/src/launcherengine.cpp	Tue Aug 31 15:15:20 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1665 +0,0 @@
-/*
-* Copyright (c) 2010 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:
-*
-*/
-
-#include <coemain.h>
-#include <eikenv.h>
-#include <pathinfo.h> 
-#include <apgtask.h>
-#include <bautils.h>
- 
-#include "launchertraces.h"
-#include "e32image.h"
-#include "launcherxmlparser.h"
-#include "launcherdllparser.h"
-#include "launcherengine.h"
-
-_LIT(KLogFileName, "LauncherLog.txt");
-_LIT(KBCLogFileName, "LauncherBCLog.txt");
-_LIT(KSystemDllsFileName, "SystemDlls.txt");
-_LIT(KRequiredDllsFileName, "RequiredDlls.xml");
-_LIT(KDotXML,".xml");
-_LIT(KDotLauncherXML,".launcherxml");
-
-_LIT(KFileSeparator, "\t");
-_LIT(KFileNewLine, "\r\n");
-
-_LIT(KNewLine, "\n");
-
-const TInt KMaxAppsArraySize=250;
-const TInt KMaxDllArraySize=5000;
-const TInt KLauncherLogBufferSize = 4096;
-
-// After this many issues, issues are buffered and printed 
-// in the end of analysis
-const TInt KBigBufferUsageThreshold=10;
-
-// Buffer allocation unit
-const TInt KBigBufferAllocBytes=1024;
-
-// ---------------------------------------------------------------------------
-
-CLauncherEngine* CLauncherEngine::NewL(MLauncherUI *aLauncherUI)
-    {
-    CLauncherEngine* self = new(ELeave) CLauncherEngine;
-    CleanupStack::PushL(self);
-    self->ConstructL(aLauncherUI);
-    CleanupStack::Pop();
-    return self;
-    }
-
-// ---------------------------------------------------------------------------
-
-CLauncherEngine::CLauncherEngine() : CActive(EActivePriorityIpcEventsHigh)
-    {
-    }
-
-// ---------------------------------------------------------------------------
-
-template <typename T>
-void AppendLogBufferL(const TDesC& aText, T*& aBuf, TInt aIncreaseStep = KLauncherLogBufferSize)
-    {
-    if( aBuf == 0 )
-        {
-        aBuf = T::NewL(aIncreaseStep);
-        }
-    
-    TInt currentMaxLength = aBuf->Des().MaxLength();
-    if( aBuf->Des().Length() + aText.Length() > currentMaxLength )
-        {
-        TInt increaseSize = Max(aText.Length(), aIncreaseStep);                
-        aBuf = aBuf->ReAllocL(aBuf->Des().MaxLength() + increaseSize );
-        }
-    aBuf->Des().Append(aText);        
-    }
-
-// ---------------------------------------------------------------------------
-
-void CLauncherEngine::ConstructL(MLauncherUI *aLauncherUI)
-    {
-    LOGSTRING("Launcher: CLauncherEngine::ConstructL");
-    
-    User::LeaveIfNull( aLauncherUI );
-    
-    iLauncherUI = aLauncherUI;
-    
-
-    iEnv = CEikonEnv::Static();
-    iLaunchingIsActive = EFalse;
-    iDLLAnalysisIsActive = EFalse;
-    iSkipHiddenAndEmbedOnly = ETrue;
-
-    User::LeaveIfError(iTimer.CreateLocal());
-
-    User::LeaveIfError(iLs.Connect());
-    User::LeaveIfError(iWs.Connect());
-
-    iAppThreadChecker = CAppThreadChecker::NewL(this);
-    iAppRunningChecker = CAppRunningChecker::NewL(this);
-
-    iAllAppsArray = new(ELeave) CDesCArrayFlat(KMaxAppsArraySize);
-    iAppsArray = new(ELeave) CDesCArrayFlat(KMaxAppsArraySize);
-    iSystemDllArray = new(ELeave) CDesCArrayFlat(KMaxDllArraySize);
-
-    iLogWriteBuf = HBufC8::NewL(KLauncherLogBufferSize);
-
-    iLogFilePath = PathInfo::PhoneMemoryRootPath();
-    iLogFilePath.Append( KLogFileName );
-    
-    iBCLogFilePath = PathInfo::PhoneMemoryRootPath();
-    iBCLogFilePath.Append( KBCLogFileName );
-
-    iSystemDllsFilePath = PathInfo::PhoneMemoryRootPath();
-    iSystemDllsFilePath.Append( KSystemDllsFileName );
-
-    iRequiredDllsFilePath = PathInfo::PhoneMemoryRootPath();
-    iRequiredDllsFilePath.Append( KRequiredDllsFileName );
-            
-    iDLLParser = CLauncherDLLParser::NewL();
-
-    CActiveScheduler::Add(this);
-    }
-
-// ---------------------------------------------------------------------------
-
-CLauncherEngine::~CLauncherEngine()
-    {
-    LOGSTRING("Launcher: CLauncherEngine::~CLauncherEngine");
-
-    Cancel();
-
-    // close the log
-    iLogFile.Close();
-    iBCLogFile.Close();
-    if (iLogWriteBuf)
-        delete iLogWriteBuf;
-
-    if (iAppRunningChecker)
-        delete iAppRunningChecker;
-    
-    if (iAppThreadChecker)
-        delete iAppThreadChecker;
-
-    if (iSystemDllArray)
-        {
-        iSystemDllArray->Reset();
-        delete iSystemDllArray;
-        }
-
-    if (iAppsArray)
-        {
-        iAppsArray->Reset();
-        delete iAppsArray;
-        }
-
-    
-    if (iAllAppsArray)
-        {
-        iAllAppsArray->Reset();
-        delete iAllAppsArray;
-        }
-    
-    delete iXMLParser;
-   // delete iDLLParser;
-    //delete iDLLElement;
-    delete iBCIssuesBigBuffer;            
-    
-    iWs.Close();
-    iLs.Close();
-    iTimer.Close();
-    }
-
-// ---------------------------------------------------------------------------
-
-void CLauncherEngine::DoCancel()
-    {
-    LOGSTRING("Launcher: CLauncherEngine::DoCancel");
-    
-    if( iXMLParser )
-        {
-        iXMLParser->Cancel();
-        }
-    iTimer.Cancel();
-    
-    }
-
-// ---------------------------------------------------------------------------
-
-void CLauncherEngine::RunL()
-    {
-    
-    LOGSTRING("Launcher: CLauncherEngine::RunL");  
-    TInt err = iStatus.Int();
-    User::LeaveIfError(err);
-    
-    // write full app path to the log file
-    WriteInitialStuffToTheLogL(iAppsArray->MdcaPoint(iAppLaunchCounter), iLogFile);
-
-    // get the uid of the current app
-    iCurrentAppUid = KNullUid;
-    TApaAppInfo appInfo;
-    iLs.GetAllApps();
-    while (iLs.GetNextApp(appInfo) == KErrNone)
-        {
-        if (appInfo.iFullName.CompareF( iAppsArray->MdcaPoint(iAppLaunchCounter) ) == 0)
-            {
-            iCurrentAppUid = appInfo.iUid;
-            break;
-            }
-        }
-
-    if (iCurrentAppUid == KNullUid)
-        {        
-        iLogWriteBuf->Des().Append(_L("[WARN: App has no UID] "));
-        }
-
-    // parse the filename
-    TParse nameParser;
-    nameParser.SetNoWild(iAppsArray->MdcaPoint(iAppLaunchCounter), NULL, NULL);
-    iCurrentAppNameAndExt.Copy(nameParser.Drive());
-    iCurrentAppNameAndExt.Append(nameParser.NameAndExt());
-
-    // do not try to launch these apps
-    if (iAppsArray->MdcaPoint(iAppLaunchCounter).FindF(_L("\\Launcher.")) != KErrNotFound
-        || iAppsArray->MdcaPoint(iAppLaunchCounter).FindF(_L("\\Phone.")) != KErrNotFound
-        || iAppsArray->MdcaPoint(iAppLaunchCounter).FindF(_L("\\Startup.")) != KErrNotFound  
-        || iAppsArray->MdcaPoint(iAppLaunchCounter).FindF(_L("\\SplashScreen.")) != KErrNotFound  
-        || iAppsArray->MdcaPoint(iAppLaunchCounter).FindF(_L("\\eshell.")) != KErrNotFound)  
-        {
-
-        iLauncherUI->PrintText(iCurrentAppNameAndExt);
-        iLauncherUI->PrintText(_L(": SKIPPED automatically\n"));
-        
-        iLogWriteBuf->Des().Append(_L("[SKIPPED automatically] "));
-        iLogWriteBuf->Des().Append(KFileNewLine);
-        iLogFile.Write(iLogWriteBuf->Des());
-
-        iSkippedCases++;
-        CheckForMoreAppsL();
-        }
-
-    else
-        {
-
-        // dependency check not needed if the app is in the ROM/ROFS, because they'll be checked automatically
-        // when the rom image is built
-        
-        if (iCurrentAppNameAndExt[0] != 'Z' && iCurrentAppNameAndExt[0] != 'z')
-            {
-
-            if (iCurrentAppNameAndExt[2] == '[')  // this is quite likely a Java application, no dependency test needed 
-                {
-                iLogWriteBuf->Des().Append(_L("[Dependency check not done] "));
-                }
-            else
-                {  // otherwise check depencies
-            
-                #ifdef __WINS__
-                
-                    // emulator not supported
-
-                #else
-
-                    // ELF binaries
-
-                    CDesCArray* missingDllArray = NULL;
-
-                    TRAPD(err, missingDllArray = DependencyCheckForE32ImageL());
-
-                    // some error happened while processing the E32 image
-                    if (err != KErrNone)
-                        {
-
-                        iLauncherUI->PrintText(iCurrentAppNameAndExt);
-                        iLauncherUI->PrintText(_L(": unable to read import table!\n"));
-                        
-                        iLogWriteBuf->Des().Append(_L("[Unable to read import table!] "));
-                        }
-
-                    // print missing dependencies
-                    else if (err==KErrNone && missingDllArray)
-                        {
-                        if (missingDllArray->MdcaCount() > 0)
-                            {
-                            iLauncherUI->PrintText(iCurrentAppNameAndExt);
-                            iLauncherUI->PrintText(_L(": missing dependencies: "));
-                            
-                            iLogWriteBuf->Des().Append(_L("[Missing dependencies: "));
-
-                            for (TInt k=0; k<missingDllArray->MdcaCount(); k++)
-                                {
-                                iLauncherUI->PrintText(missingDllArray->MdcaPoint(k));
-                                iLauncherUI->PrintText(_L(" "));
-                                
-                                iLogWriteBuf->Des().Append(missingDllArray->MdcaPoint(k));
-                                iLogWriteBuf->Des().Append(_L(" "));
-                                }
-
-                            iLauncherUI->PrintText(_L("\n"));
-
-                            iLogWriteBuf->Des().Append(_L("] "));
-                            }
-                        }
-
-                    if (missingDllArray)
-                        delete missingDllArray;
-
-                #endif
-
-                }  // if '['
-            }  // if 'Z'
-
-
-
-        // check if the app is already running
-        TApaTaskList taskList(iWs);
-        TApaTask thisTask = taskList.FindApp(iCurrentAppUid);
-        if (thisTask.Exists())
-            {
-            iLogWriteBuf->Des().Append(_L(" [OK: App already running]"));
-            iLogWriteBuf->Des().Append(KFileNewLine);
-            iLogFile.Write(iLogWriteBuf->Des());
-
-            iOkCases++;
-            CheckForMoreAppsL();
-            }
-        
-        else
-            {
-            // check the program's capabilities
-            TApaAppCapabilityBuf buf;
-            iLs.GetAppCapability(buf, iCurrentAppUid);
-            TApaAppCapability cap = buf();
-
-            // if it's embeddable only, don't launch if setting is enabled
-            if (cap.iEmbeddability == TApaAppCapability::EEmbeddableOnly && SkipHiddenAndEmbedOnly())  
-                {
-              
-                iLauncherUI->PrintText(iCurrentAppNameAndExt);
-                iLauncherUI->PrintText(_L(": SKIPPED: embeddable only\n"));
-
-                iLogWriteBuf->Des().Append(_L("[SKIPPED: embeddable only] "));
-                iLogWriteBuf->Des().Append(KFileNewLine);
-                iLogFile.Write(iLogWriteBuf->Des());
-
-                iSkippedCases++;
-                CheckForMoreAppsL();
-                }
-        
-            // if it's hidden, don't launch if setting is enabled
-            else if (cap.iAppIsHidden && SkipHiddenAndEmbedOnly())  
-                {
-                
-                iLauncherUI->PrintText(iCurrentAppNameAndExt);
-                iLauncherUI->PrintText(_L(": SKIPPED: hidden\n"));
-                
-                iLogWriteBuf->Des().Append(_L("[SKIPPED: hidden] "));
-                iLogWriteBuf->Des().Append(KFileNewLine);
-                iLogFile.Write(iLogWriteBuf->Des());
-
-                iSkippedCases++;
-                CheckForMoreAppsL();
-                }
-
-            // otherwise do the normal launch test
-            else
-                {
-                LaunchApplicationL();
-                }
-            
-            } //if (thisTask.Exists())
-        
-        } //if (iAppsArray->MdcaPoint(iAppLaunchCounter).FindF
-        
-    }
-
-// ---------------------------------------------------------------------------
-
-CDesCArray* CLauncherEngine::ListOfAllAppsL()
-    {
-    LOGSTRING("Launcher: CLauncherEngine::ListOfAllAppsL");
-
-    // find all DLLs from the system
-    iSystemDllArray->Reset();
-    TRAP_IGNORE( FindFiles(_L("*.dll"), _L("\\sys\\bin\\")) );
-
-    // write the list of DLLs to a file
-    RFile dllFile;
-    if (dllFile.Replace(iEnv->FsSession(), iSystemDllsFilePath, EFileWrite) == KErrNone)
-        {
-        TBuf8<KMaxFileName> dllName;
-
-        for (TInt i=0; i<iSystemDllArray->MdcaCount(); i++)
-            {
-            dllName.Copy( iSystemDllArray->MdcaPoint(i) );
-            dllName.Append( KFileNewLine );
-
-            dllFile.Write( dllName );
-            }
-
-        dllFile.Close();
-        }
-
-    // reset the apps list
-    iAllAppsArray->Reset();
-
-    // search all apps
-    TApaAppInfo appInfo;
-    iLs.GetAllApps();
-
-    while (iLs.GetNextApp(appInfo) == KErrNone)
-        {
-        iAllAppsArray->AppendL(appInfo.iFullName);
-        }
-
-
-    // remove launcher.app / launcher.exe from the list
-    for (TInt i=0; i<iAllAppsArray->MdcaCount(); i++)
-        {
-        if (iAllAppsArray->MdcaPoint(i).FindF(_L("\\Launcher.")) != KErrNotFound)
-            {
-            iAllAppsArray->Delete(i);
-            iAllAppsArray->Compress();
-            break;
-            }
-        }
-
-    // sort the elements
-    iAllAppsArray->Sort();
-
-    return iAllAppsArray;
-    }
-
-// ---------------------------------------------------------------------------
-
-TInt CLauncherEngine::FindFiles(const TDesC& aFileName, const TDesC& aPath)
-    {
-    TFindFile fileFinder(iEnv->FsSession());
-    CDir* fileList; 
-    TInt err = fileFinder.FindWildByDir(aFileName, aPath, fileList);
-
-    while (err == KErrNone)
-        {
-        for (TInt i=0; i<fileList->Count(); i++)
-            {
-            TParse fullentry;
-            fullentry.Set((*fileList)[i].iName, &fileFinder.File(), NULL);
-
-            TRAP(err, iSystemDllArray->AppendL(fullentry.NameAndExt())); 
-            }
-
-        delete fileList;
-        err = fileFinder.FindWild(fileList);
-        }
-    return err;
-    }
-
-// ---------------------------------------------------------------------------
-
-
-void CLauncherEngine::StartAppLaunchingL(const CArrayFix<TInt>* aSelectedApps, TBool aAutoClose)
-    {
-    LOGSTRING("Launcher: CLauncherEngine::StartAppLaunchingL");
-
-    // check that we have something to launch
-    if (aSelectedApps->Count() <= 0)
-        {
-        _LIT(message, "Nothing selected");
-        iLauncherUI->ShowErrorMessage(message);
-        }
-    else
-        {
-        // update the list of applications to be tested
-        iAppsArray->Reset();
-
-        TInt ref(0);
-        TKeyArrayFix key(0, ECmpTUint16);
-        TInt index(0);
-
-        for (TInt i=0; i<iAllAppsArray->MdcaCount(); i++)
-            {
-            ref = i;
-
-            // if the application is selected, append it to the apps array
-            if (aSelectedApps->Find(ref, key, index) == 0)  
-                {
-                iAppsArray->AppendL(iAllAppsArray->MdcaPoint(i));
-                }
-            }
-
-
-        // to make sure that our algorithm works correctly
-        if (iAppsArray->MdcaCount() != aSelectedApps->Count())
-            {
-            _LIT(message, "Something went wrong...");
-            iLauncherUI->ShowErrorMessage(message);
-            }
-
-        
-        // init
-        Cancel();
-        iLaunchingIsActive = ETrue;
-        iAutoClose = aAutoClose;
-        iAppLaunchCounter = 0;
-        iFailedCases = 0;
-        iOkCases = 0;
-        iSkippedCases = 0;
-        iTotalNumberOfCases = iAppsArray->MdcaCount();
-        iCurrentAppUid = KNullUid;
-
-        // open the log file for writing
-        if (iLogFile.Open(iEnv->FsSession(), iLogFilePath, EFileWrite) != KErrNone)
-            {
-            iEnv->FsSession().MkDirAll(iLogFilePath);
-            iLogFile.Replace(iEnv->FsSession(), iLogFilePath, EFileWrite);
-            }
-        else
-            {
-            // file opens correctly, seek to the end
-            TInt fileSize=0;
-            iLogFile.Size(fileSize);
-            iLogFile.Seek(ESeekCurrent, fileSize);
-            }
-
-        // change focus to output view!!
-        iLauncherUI->ChangeFocusToOutputView();
-
-        //text to log
-        iLauncherUI->PrintText(_L("New test started.\n"));
-
-        // start the first launch!
-        IssueLaunch();
-
-        }
-    }
-
-// ---------------------------------------------------------------------------
-
-void CLauncherEngine::IssueLaunch()
-    {
-    LOGSTRING("Launcher: CLauncherEngine::IssueLaunch");
-
-    __ASSERT_ALWAYS(!IsActive(), User::Panic(_L("Timing error?"), 100));
-
-    // this should keep the backlight on
-    User::ResetInactivityTime();
-
-    iDLLAnalysisIsActive = EFalse;
-    // some delay
-    iTimer.After(iStatus, 1000000);    
-    SetActive();
-    }
-
-// ---------------------------------------------------------------------------
-
-// ---------------------------------------------------------------------------
-
-void CLauncherEngine::WriteInitialStuffToTheLogL(const TDesC& aOwnData, RFile& aFile)
-    {
-    LOGSTRING("Launcher: CLauncherEngine::WriteInitialStuffToTheLog");
-
-    TTime time;
-    time.HomeTime();
-    TBuf<32> currentTime;
-    TBuf<32> currentDate;
-
-    // current date            
-    _LIT(KCurrentDate,"%D%M%Y%/0%1%/1%2%/2%3%/3");
-    time.FormatL(currentDate, KCurrentDate);    
-    iLogWriteBuf->Des().Copy(currentDate);    
-    AppendLogBufferL(KFileSeparator(), iLogWriteBuf);
-
-    // current time
-    _LIT(KCurrentTime,"%-B%:0%J%:1%T%:2%S%:3%+B");
-    time.FormatL(currentTime, KCurrentTime);    
-    AppendLogBufferL(currentTime, iLogWriteBuf);
-    AppendLogBufferL(KFileSeparator(), iLogWriteBuf);
-
-    // available RAM memory
-    TMemoryInfoV1Buf memory;
-    UserHal::MemoryInfo(memory);
-    iLogWriteBuf->Des().AppendNum(memory().iFreeRamInBytes);  
-    AppendLogBufferL(KFileSeparator(), iLogWriteBuf);
-
-    // own data, eg. application name
-    AppendLogBufferL(aOwnData, iLogWriteBuf);
-    AppendLogBufferL(KFileSeparator(), iLogWriteBuf);
-    AppendLogBufferL(KFileNewLine(), iLogWriteBuf);    
-
-    // write the buffer to the file
-    aFile.Write(iLogWriteBuf->Des()); 
-
-    // clear the buffer
-    iLogWriteBuf->Des().Copy(_L(""));
-    }
-
-// ---------------------------------------------------------------------------
-
-
-void CLauncherEngine::CheckForMoreAppsL()
-    {
-    LOGSTRING("Launcher: CLauncherEngine::CheckForMoreAppsL");
-
-    // make sure the launcher app is in the foreground
-    TApaTaskList taskList(iWs);
-    TUid launcherAppUid;
-    launcherAppUid.iUid = 0x101FB74F;
-    TApaTask launcherTask = taskList.FindApp(launcherAppUid);
-    launcherTask.BringToForeground();
-
-
-    // check if we have more test to be executed
-    if ( iAppLaunchCounter >= iTotalNumberOfCases-1 )
-        {
-        
-        // all done, show stats
-        TBuf<200> message;
-        message.Append( _L("Done: ") );
-        message.AppendNum( iOkCases );
-        message.Append( _L(" ok, ") );
-        message.AppendNum( iFailedCases );
-        message.Append( _L(" failed, ") );
-        message.AppendNum( iSkippedCases );
-        message.Append( _L(" skipped.") );
-
-        // print the message to the output screen
-        iLauncherUI->PrintText(message);
-        iLauncherUI->PrintText(_L("\n\n"));
-        
-        //write same stuff to the log
-        WriteInitialStuffToTheLogL(message, iLogFile);
-        iLogWriteBuf->Des().Copy(KFileNewLine);
-        iLogWriteBuf->Des().Append(KFileNewLine);        
-        iLogFile.Write(iLogWriteBuf->Des());
-
-        // close the log
-        iLogFile.Close();
-
-        iLaunchingIsActive = EFalse;
-
-        // all apps launched
-        _LIT(KAllDoneMessage, "All apps launched");
-        iLauncherUI->ShowInfoMessage(KAllDoneMessage);
-        }
-    else
-        {
-        // more apps to be launched, maintain requests
-        iAppLaunchCounter++;
-        IssueLaunch();
-        }
-  
-    }
-
-// ---------------------------------------------------------------------------
-
-void CLauncherEngine::LaunchApplicationL()
-    {
-    LOGSTRING("Launcher: CLauncherEngine::LaunchApplication");
-    LOGSTRING3("Launcher: Trying to launch %S, UID: %d", &iCurrentAppNameAndExt, iCurrentAppUid.iUid);
-
-    TRAPD(err, DoLaunchApplicationL());
-    
-    if (err!=KErrNone)
-        {
-        iLogWriteBuf->Des().Append(_L("[FAIL: Cannot launch the app] "));        
-       
-        iLauncherUI->PrintText(iCurrentAppNameAndExt);
-        iLauncherUI->PrintText(_L(": cannot launch\n"));
-        
-        // write the buffer to the log
-        iLogWriteBuf->Des().Append(KFileNewLine);        
-        iLogFile.Write(iLogWriteBuf->Des());
-
-        // this application isn't even launchable, go to next one
-        iFailedCases++;
-        CheckForMoreAppsL();        
-        }
-    
-    }
-// ---------------------------------------------------------------------------
-
-
-void CLauncherEngine::DoLaunchApplicationL()
-    {
-    LOGSTRING("Launcher: CLauncherEngine::DoLaunchApplicationL");
-
-    // create a new handle
-    RThread newThreadHandle;
-    iCurrentAppThread = newThreadHandle;
-
-
-    // Find the task with uid3
-    TApaTaskList tasklist(iWs);
-    TApaTask task=tasklist.FindApp(iCurrentAppUid);
-
-    if (task.Exists())
-        // Task exists, bring it to foreground
-        {
-        task.BringToForeground();
-        }
-    else
-        // Task doesn't exist, launch a new instance of an application
-        {
-        TApaAppInfo appInfo;
-        User::LeaveIfError(iLs.GetAppInfo(appInfo, iCurrentAppUid));
-        TApaAppCapabilityBuf capBuf;
-        User::LeaveIfError(iLs.GetAppCapability(capBuf, iCurrentAppUid));
-        TApaAppCapability& caps = capBuf();
-
-        CApaCommandLine* cmdLine=CApaCommandLine::NewLC();
-        cmdLine->SetExecutableNameL(appInfo.iFullName);
-
-        if ( caps.iLaunchInBackground )
-            // Apps capability defines that the app is launched in background
-            {
-            cmdLine->SetCommandL(EApaCommandBackground);
-            }
-        else
-            {
-            cmdLine->SetCommandL(EApaCommandRun);
-            }
-
-        // start the app
-        User::LeaveIfError(iLs.StartApp(*cmdLine, iCurrentAppThreadId));
-
-        // activate thread checker active object
-        iAppThreadChecker->ActivateChecking();
-
-        // now open a handle to the thread and register death notifier
-        TInt err = iCurrentAppThread.Open(iCurrentAppThreadId);
-        if (err == KErrNone)
-            iCurrentAppThread.Logon(iAppThreadChecker->iStatus);
-        else
-            {
-            iCurrentAppThread.Close();
-            TRequestStatus* status = &iAppThreadChecker->iStatus;
-            User::RequestComplete(status, KErrNone);
-            iAppThreadChecker->Cancel();
-            User::Leave(err);                
-            }
-
-        CleanupStack::PopAndDestroy(); // cmdLine
-        }
-
-    // the application is now running, start a check to see if it's still alive
-    iAppRunningChecker->StartTesting(); 
-
-    }
-
-// ---------------------------------------------------------------------------
-
-void CLauncherEngine::CheckIfAppIsRunningL()
-    {
-    LOGSTRING("Launcher: CLauncherEngine::CheckIfAppIsRunningL");
-
-    // cancel the death notifier since it isn't needed anymore
-    if( iCurrentAppThread.Handle() != 0 )
-        {
-        iCurrentAppThread.LogonCancel(iAppThreadChecker->iStatus);
-        }
-
-    // cancel checkers
-    iAppThreadChecker->Cancel();
-    iAppRunningChecker->Cancel(); 
-
-
-
-    // check from the window server if the app is running
-    TApaTaskList taskList(iWs);
-    TApaTask thisTask = taskList.FindApp(iCurrentAppUid);
-
-    if( !thisTask.Exists() ) // application not running -> FAIL
-        {
-        // check from the thread why it quit
-        CheckWhyThreadDiedL();
-
-        // --> CheckForMoreApps() and all the other stuff called from CheckWhyThreadDied() !
-
-        }
-    else
-        {
-        // app is running!
-        iOkCases++;
-
-        // close handle to the thread        
-        iCurrentAppThread.Close();
-
-
-        iLogWriteBuf->Des().Append(_L(" [OK]"));
-        iLogWriteBuf->Des().Append(KFileNewLine);        
-        iLogFile.Write(iLogWriteBuf->Des());
-
-
-        // close the running application if needed
-        if (iAutoClose)
-            {
-            // since the application is still open, let's close it
-            thisTask.EndTask();
-            //User::After(1000);
-            //thisTask.SendSystemEvent(EApaSystemEventShutdown);
-            //thisTask.KillTask();
-            //User::After(1000);
-            }
-
-        // this app is done now, move to the next one!
-        CheckForMoreAppsL();
-                
-        }    
-    }
-
-// ---------------------------------------------------------------------------
-
-void CLauncherEngine::CheckWhyThreadDiedL()
-    {
-    LOGSTRING("Launcher: CLauncherEngine::CheckWhyThreadDiedL");
-
-    // cancel the death notifier since it isn't needed anymore
-    if( iCurrentAppThread.Handle() != 0 )
-        {
-        iCurrentAppThread.LogonCancel(iAppThreadChecker->iStatus);
-        }
-
-    // make sure all checkers are cancelled
-    iAppRunningChecker->Cancel(); 
-    iAppThreadChecker->Cancel(); 
-
-    TBuf<256> outputText;
-    outputText.Append(_L("App.Closed. "));
-
-
-    if (iCurrentAppThread.ExitType() == EExitKill)
-        {
-        outputText.Append(_L("\"EExitKill\""));
-        }
-    else if (iCurrentAppThread.ExitType() == EExitTerminate)
-        {
-        outputText.Append(_L("\"EExitTerminate\""));
-        }
-    else if (iCurrentAppThread.ExitType() == EExitPanic)
-        {
-        outputText.Append(_L("\"EExitPanic\""));
-        }
-    else if (iCurrentAppThread.ExitType() == EExitPending)
-        {
-        outputText.Append(_L("\"EExitPending\""));
-        }
-    else // unknown reason
-        {
-        outputText.Append(_L("\"Exit_Unknown_Reason\""));
-        }        
-    
-    outputText.Append(_L(" code:"));
-    TInt exitReason = iCurrentAppThread.ExitReason();
-    outputText.AppendNum(exitReason);
-    outputText.Append(_L(" \""));
-
-    TPtrC exitCategory = iCurrentAppThread.ExitCategory();
-    outputText.Append(exitCategory);
-
-    outputText.Append(_L("\""));
-
-
-    // print to screen
-    iLauncherUI->PrintText(iCurrentAppNameAndExt);
-    iLauncherUI->PrintText(_L(": "));
-    iLauncherUI->PrintText(outputText);
-    iLauncherUI->PrintText(_L("\n"));
-    
-    // write to the log also
-    iLogWriteBuf->Des().Append(_L(" [FAIL: "));
-    iLogWriteBuf->Des().Append(outputText);
-    iLogWriteBuf->Des().Append(_L("]"));
-    iLogWriteBuf->Des().Append(KFileNewLine);
-    
-    iLogFile.Write(iLogWriteBuf->Des());
-
-    // close handle to the thread
-    //iCurrentAppThread.Close();    <-- not safe the close the handle because of the "App.Closed" dialog
-    //                                  somehow takes ownership of the thread or something
-
-    // nothing to do anymore, move to the next app
-    iFailedCases++;
-    CheckForMoreAppsL();
-    }
-
-// ---------------------------------------------------------------------------
-// ---------------------------------------------------------------------------
-
-CDesCArray* CLauncherEngine::DependencyCheckForE32ImageL()
-    {
-    LOGSTRING("Launcher: CLauncherEngine::DependencyCheckForE32ImageL");
-
-    // create an empty array for the missing dll names
-    CDesCArray* missingDllArray = new(ELeave) CDesCArrayFlat(100);
-    CleanupStack::PushL(missingDllArray);
-
-    // get a list of DLLs from the E32 image file
-    E32ImageReader* reader = E32ImageReader::NewLC();
-    CDesCArray* dllArray = reader->ListOfDLLsL( iAppsArray->MdcaPoint(iAppLaunchCounter) );
-    CleanupStack::PopAndDestroy(); // reader
-    CleanupStack::PushL(dllArray);
-
-    // compare system DLL and image DLL arrays
-    TInt pos(0);
-    for (TInt j=0; j<dllArray->MdcaCount(); j++)
-        {
-        if (iSystemDllArray->Find(dllArray->MdcaPoint(j), pos, ECmpFolded) != 0)  
-            {
-            // DLL not found, append the name to the list of missing DLLs
-            missingDllArray->AppendL(dllArray->MdcaPoint(j));  
-            }
-        }
-
-    CleanupStack::PopAndDestroy(); // dllArray
-    CleanupStack::Pop();  // missingDllArray
-
-    LOGSTRING("Launcher: CLauncherEngine::DependencyCheckForE32ImageL returns");
-
-    return missingDllArray;
-    }
-
-// ---------------------------------------------------------------------------
-
-TInt CLauncherEngine::DeleteLogFile()
-    {
-    LOGSTRING("Launcher: CLauncherEngine::DeleteLogFile");
-    return BaflUtils::DeleteFile(iEnv->FsSession(), iLogFilePath);
-    }
-
-// ---------------------------------------------------------------------------
-
-void CLauncherEngine::StopLaunchingL()
-    {
-    LOGSTRING("Launcher: CLauncherEngine::StopLaunchingL");
-    if(iLaunchingIsActive)
-        {
-        //write to the log
-        WriteInitialStuffToTheLogL(_L("Cancelled by the user !!! "), iLogFile);
-        iLogWriteBuf->Des().Copy(KFileNewLine);
-        iLogWriteBuf->Des().Append(KFileNewLine);
-        iLogFile.Write(iLogWriteBuf->Des());
-    
-        // close the log
-        iLogFile.Close();
-    
-        // print to the screen
-        iLauncherUI->PrintText(_L("Launching cancelled.\n\n"));
-    
-        // cancel all active objects
-        if( iCurrentAppThread.Handle() != 0 )
-            {
-            iCurrentAppThread.LogonCancel(iAppThreadChecker->iStatus);
-            }
-        Cancel();
-        iAppRunningChecker->Cancel(); 
-        iAppThreadChecker->Cancel(); 
-        
-        iLaunchingIsActive = EFalse;
-    
-        _LIT(KMessage, "Launching cancelled");
-        iLauncherUI->ShowInfoMessage(KMessage);
-
-        }
-    }
-
-// ---------------------------------------------------------------------------
-
-TBool CLauncherEngine::LogFileExists()
-    {
-    LOGSTRING("Launcher: CLauncherEngine::LogFileExists");
-    return BaflUtils::FileExists(iEnv->FsSession(), iLogFilePath);
-    }
-
-// ---------------------------------------------------------------------------
-
-TInt CLauncherEngine::DeleteBCLogFile()
-    {
-    LOGSTRING("Launcher: CLauncherEngine::DeleteBCLogFile");
-    return BaflUtils::DeleteFile(iEnv->FsSession(), iBCLogFilePath);
-    }
-
-
-// ---------------------------------------------------------------------------
-
-TBool CLauncherEngine::BCLogFileExists()
-    {
-    LOGSTRING("Launcher: CLauncherEngine::BCLogFileExists");
-    return BaflUtils::FileExists(iEnv->FsSession(), iBCLogFilePath);
-    }
-
-// ---------------------------------------------------------------------------
-void CLauncherEngine::AnalyseDLLsL( const TDesC& aFileName )
-    {
-    LOGSTRING("Launcher: CLauncherEngine::AnalyseDLLsL");
-    _LIT(KStartSeparator, "******************************");
-    _LIT(KStartingAnalysis, "Starting BC Analysis for DLLs.");    
-    _LIT(KInputFileSelected, "Input file selected: ");
-    
-    // Reset found issues counter and buffer
-    iFoundBCIssues = 0;    
-    delete iBCIssuesBigBuffer;
-    iBCIssuesBigBuffer = 0;
-    
-    // Reset log writing buffer:
-    iLogWriteBuf->Des().Zero();
-                
-    if( IsActive() )
-        {
-        Cancel();
-        }   
-    
-    iRequiredDllsFilePath = aFileName;
-    
-    if( BaflUtils::FileExists(iEnv->FsSession(), iRequiredDllsFilePath) == EFalse )
-        {
-        LOGSTRING2("Launcher: CLauncherEngine::AnalyseDLLsL - can't find input file: %S", &iRequiredDllsFilePath);
-        User::Leave( KErrNotFound );
-        }
-    
-    // open the log file for writing
-    if (iBCLogFile.Open(iEnv->FsSession(), iBCLogFilePath, EFileWrite) != KErrNone)
-        {
-        iEnv->FsSession().MkDirAll(iLogFilePath);
-        User::LeaveIfError( iBCLogFile.Replace(iEnv->FsSession(), iBCLogFilePath, EFileWrite) );
-        }
-    else
-        {
-        // file opens correctly, seek to the end
-        TInt fileSize=0;
-        iBCLogFile.Size(fileSize);
-        iBCLogFile.Seek(ESeekCurrent, fileSize);
-        }
-    
-    AppendLogBufferL(KFileNewLine(), iLogWriteBuf);
-    AppendLogBufferL(KStartSeparator(), iLogWriteBuf);
-    AppendLogBufferL(KFileNewLine(), iLogWriteBuf);
-    iBCLogFile.Write(iLogWriteBuf->Des());
-    iLogWriteBuf->Des().Zero();
-    
-    // Resolve file type. Should we use XML parsing or just compare DLL list
-    TBool xmlParsing =
-        KDotXML().Compare(iRequiredDllsFilePath.Right(KDotXML().Length())) == 0 ||
-        KDotLauncherXML().Compare(iRequiredDllsFilePath.Right(KDotLauncherXML().Length())) == 0;
-    
-    // Log analysis starting time and selected input file:
-    WriteInitialStuffToTheLogL(KStartingAnalysis, iBCLogFile);    
-    AppendLogBufferL(KInputFileSelected(), iLogWriteBuf);
-    AppendLogBufferL(iRequiredDllsFilePath, iLogWriteBuf);
-    AppendLogBufferL(KFileNewLine(), iLogWriteBuf);
-    iBCLogFile.Write(iLogWriteBuf->Des());
-    iLogWriteBuf->Des().Zero();
-    
-    if( xmlParsing )
-        {
-        iLauncherUI->ChangeFocusToOutputView();
-        DoBCAnalysisL();
-        }
-    else
-        {
-        DoCompareDLLListsL();
-        }
-    }
-
-// ---------------------------------------------------------------------------
-
-void CLauncherEngine::DoBCAnalysisL()
-    {
-    LOGSTRING("Launcher: CLauncherEngine::DoBCAnalysisL");
-    if( iXMLParser == 0 )
-        {
-        iXMLParser = CLauncherXMLParser::NewL(iEnv->FsSession());
-        }
-    
-    TEntry entry;
-    User::LeaveIfError(iEnv->FsSession().Entry(iRequiredDllsFilePath, entry));
-    TInt fileSize = entry.iSize;
-    
-    _LIT(KAnalysing,"Analysing DLLs");
-    iLauncherUI->ShowProgressBar(KAnalysing, 0, fileSize);
-    iDLLAnalysisIsActive = ETrue;
-    
-    iXMLParser->ParseL(iRequiredDllsFilePath, this);
-    }
-
-// ---------------------------------------------------------------------------
-
-void CLauncherEngine::CancelBCAnalysis()
-    {
-    LOGSTRING("Launcher: CLauncherEngine::CancelBCAnalysis");
-    if( iXMLParser )
-        {
-        iXMLParser->Cancel();
-        }
-    iLauncherUI->PrintText(_L("\nAnalysis cancelled.\n\n"));
-    WriteInitialStuffToTheLogL(_L("Analysis cancelled by user"), iBCLogFile);
-    iLogWriteBuf->Des().Zero();
-    iBCLogFile.Close();
-    }
-
-// ---------------------------------------------------------------------------
-
-void CLauncherEngine::DoCompareDLLListsL()
-    {
-    LOGSTRING("Launcher: CLauncherEngine::DoCompareDLLListsL");
-    
-    RFile file;
-    CleanupClosePushL(file);
-        
-    // Show progress bar 
-    _LIT(KAnalysing,"Analysing DLLs");
-    iLauncherUI->ShowWaitDialog(KAnalysing);
-
-    if(file.Open(iEnv->FsSession(), iRequiredDllsFilePath, EFileRead) != KErrNone)
-        {
-        // Hide wait dialog  
-        iLauncherUI->HideWaitDialog();
-        
-        iLauncherUI->ChangeFocusToOutputView();
-
-        TBuf<200> msg;
-
-        
-        msg.Format(_L("Unable to open %S for reading!\n\n"), &iRequiredDllsFilePath);
-        iLauncherUI->PrintText( msg );
-        }
-    else
-        {
-        
-        CDesCArray* requiredDllArray = new(ELeave) CDesCArrayFlat(KMaxDllArraySize);
-        CleanupStack::PushL(requiredDllArray);
-
-        // read all lines the text file
-        TFileName dllName;
-        TInt i(0);
-        while( ReadLineFromFileL(file, dllName) == KErrNone && i<KMaxDllArraySize )
-            {
-            dllName.TrimAll();
-
-            if (dllName.Length() > 1)
-                requiredDllArray->AppendL(dllName);
-            
-            i++;
-            }
-
-        if (requiredDllArray->MdcaCount() == 0)
-            {
-            // Hide wait dialog  
-            iLauncherUI->HideWaitDialog();
-            
-            iLauncherUI->ChangeFocusToOutputView();
-
-            TBuf<200> msg;
-            msg.Format(_L("File %S is empty!\n\n"), &iRequiredDllsFilePath);
-            iLauncherUI->PrintText( msg );
-            }
-        else
-            {
-            // compare the arrays and print any missing items
-            CDesCArray* missingDllArray = new(ELeave) CDesCArrayFlat(KMaxDllArraySize);
-            CleanupStack::PushL(missingDllArray);
-
-            TInt pos(0);
-            for (TInt j=0; j<requiredDllArray->MdcaCount(); j++)
-                {
-                if (iSystemDllArray->Find(requiredDllArray->MdcaPoint(j), pos, ECmpFolded) != 0)  
-                    {
-                    // DLL not found, append the name to the list of missing DLLs
-                    missingDllArray->AppendL(requiredDllArray->MdcaPoint(j));  
-                    }
-                }
-
-            
-            if (missingDllArray->MdcaCount() == 0)
-                {
-                _LIT(KMessage, "No missing files found");
-                AppendLogBufferL(KMessage(), iLogWriteBuf);
-                iLauncherUI->ShowInfoMessage(KMessage);
-                }
-            else
-                {
-                iLauncherUI->ChangeFocusToOutputView();
-                _LIT(KMissingFiles, "Missing files:\n");
-
-                //iLauncherUI->PrintText( KMissingFiles );
-                AppendLogBufferL(KMissingFiles(), iBCIssuesBigBuffer, KBigBufferAllocBytes);
-                
-                AppendLogBufferL(KMissingFiles(), iLogWriteBuf);
-                
-                for (TInt i=0; i<missingDllArray->MdcaCount(); i++)
-                    {
-                    //iLauncherUI->PrintText( missingDllArray->MdcaPoint(i) );
-                    AppendLogBufferL(missingDllArray->MdcaPoint(i), iBCIssuesBigBuffer, KBigBufferAllocBytes);
-                    //iLauncherUI->PrintText( _L("\n") );         
-                    AppendLogBufferL(KNewLine(), iBCIssuesBigBuffer, KBigBufferAllocBytes);
-                    
-                    AppendLogBufferL(missingDllArray->MdcaPoint(i), iLogWriteBuf);
-                    AppendLogBufferL(KFileNewLine(), iLogWriteBuf);
-                    }
-                AppendLogBufferL(KNewLine(), iBCIssuesBigBuffer, KBigBufferAllocBytes);
-                iLauncherUI->PrintText( iBCIssuesBigBuffer->Des() );
-                }
-            
-            // Hide wait dialog  
-            iLauncherUI->HideWaitDialog();
-            
-            CleanupStack::PopAndDestroy(); // missingDllArray            
-            }
-
-        CleanupStack::PopAndDestroy(); // requiredDllArray
-        }
-
-    CleanupStack::PopAndDestroy(); //file
-    iBCLogFile.Write(iLogWriteBuf->Des());
-    iLogWriteBuf->Des().Zero();
-    iBCLogFile.Close();
-    }
-
-// ---------------------------------------------------------------------------
-
-void CLauncherEngine::ParsingProgressedL(TInt aBytes)
-    {
-    LOGSTRING2("Launcher: CLauncherEngine::ParsingProgressedL - Bytes: %d", aBytes);
-    iLauncherUI->SetProgressBarValue(aBytes);
-    }
-
-// ---------------------------------------------------------------------------
-
-
-void CLauncherEngine::ElementParsedL(const CLauncherDLLElement& aDllElement)
-    {
-    LOGSTRING("Launcher: CLauncherEngine::ElementParsedL");
-    User::ResetInactivityTime();
-
-    _LIT(KIndent, "    ");
-    _LIT(KIssuesFound, "Binary compatibility issues found:"); 
-    _LIT(KDLLMissing,"DLL is missing");
-    _LIT(KUID1Changed,"UID1 changed");
-    _LIT(KUID2Changed,"UID2 changed");
-    _LIT(KUID3Changed,"UID3 changed");
-    _LIT(KSIDChanged,"SID changed");
-    _LIT(KCapabilityChanged,"Capability changed");
-    
-    if( iDLLElement == 0 )
-        {
-        iDLLElement = CLauncherDLLElement::NewL();
-        }
-    
-    TFindFile fileFinder(iEnv->FsSession());
-    _LIT(KDLLPath, "\\sys\\bin\\");
-    TInt err = fileFinder.FindByPath(aDllElement.Name(), &KDLLPath); 
-    
-    TBuf<256> issueStr;
-    
-    if( err == KErrNotFound )
-        {
-        if( iFoundBCIssues++ == 0 )
-            {                        
-            iLauncherUI->PrintText( KIssuesFound );
-            iLauncherUI->PrintText( KNewLine );            
-            AppendLogBufferL(KFileNewLine(), iLogWriteBuf);
-            AppendLogBufferL(KIssuesFound(), iLogWriteBuf);
-            AppendLogBufferL(KFileNewLine(), iLogWriteBuf);
-            }
-        issueStr.Copy(aDllElement.Name());
-        issueStr.Append(KNewLine);
-        issueStr.Append(KIndent);
-        issueStr.Append(KDLLMissing);
-        issueStr.Append(KNewLine);
-                
-        AppendLogBufferL(issueStr, iLogWriteBuf);
-        
-        TFileName dllName = aDllElement.Name();
-        LOGSTRING2("Launcher: DLL not found: %S", &dllName);
-        if( iFoundBCIssues > KBigBufferUsageThreshold )
-            {
-            if( iBCIssuesBigBuffer == 0)
-                {
-                iBCIssuesBigBuffer = HBufC::NewL(KBigBufferAllocBytes);
-                }
-            TInt maxSize = iBCIssuesBigBuffer->Des().Length() + issueStr.Length();
-            if( maxSize >= iBCIssuesBigBuffer->Des().MaxLength())
-                {
-                iBCIssuesBigBuffer = iBCIssuesBigBuffer->ReAllocL(maxSize + KBigBufferAllocBytes );                
-                }
-            TPtr ptr(iBCIssuesBigBuffer->Des());
-            ptr += issueStr;            
-            }
-        else
-            {
-            iLauncherUI->PrintText( issueStr);
-            }
-        }
-    else if( err == KErrNone)
-        {
-        // File is found, so let's try to open it:
-        RFile dllFile;
-        CleanupClosePushL(dllFile);        
-        if( dllFile.Open(iEnv->FsSession(), fileFinder.File(), EFileRead) == KErrNone )
-            {
-            // Parse DLL:
-            iDLLParser->ParseL(iEnv->FsSession(), dllFile, *iDLLElement);
-            CleanupStack::PopAndDestroy(); // dllFile            
-            RArray<CLauncherDLLElement::TDifference> diffs;
-            CleanupClosePushL(diffs);
-                        
-            // Compare DLLs:              
-            if( iDLLElement->CompareL(aDllElement, diffs))
-                {                
-                if( iFoundBCIssues++ == 0 )
-                    {
-                    iLauncherUI->PrintText( KIssuesFound );
-                    iLauncherUI->PrintText( KNewLine );                   
-                    AppendLogBufferL(KFileNewLine(), iLogWriteBuf);
-                    AppendLogBufferL(KIssuesFound(), iLogWriteBuf);
-                    AppendLogBufferL(KFileNewLine(), iLogWriteBuf);
-                    }
-                // Differencies found:
-                for( TInt i = 0; i < diffs.Count(); ++i )
-                    {                
-                    // Print DLL name:
-                    if( i == 0 )
-                        {
-                        issueStr.Copy(aDllElement.Name());
-                        issueStr.Append(KNewLine);
-                        }
-                    
-                    // Print differencies:
-                    issueStr.Append(KIndent);
-                    switch(diffs[i])
-                        {
-                        case CLauncherDLLElement::EDifference_UID1:
-                            issueStr.Append(KUID1Changed);
-                            break;
-                        case CLauncherDLLElement::EDifference_UID2:
-                            issueStr.Append( KUID2Changed );
-                            break;
-                        case CLauncherDLLElement::EDifference_UID3:
-                            issueStr.Append( KUID3Changed );
-                            break;
-                        case CLauncherDLLElement::EDifference_SID:
-                            issueStr.Append( KSIDChanged );
-                            break;
-                        case CLauncherDLLElement::EDifference_Capability:
-                            issueStr.Append( KCapabilityChanged );
-                            break;
-                        }
-                    issueStr.Append( KNewLine );                    
-                    }
-                AppendLogBufferL(issueStr, iLogWriteBuf);
-                if( iFoundBCIssues > KBigBufferUsageThreshold )
-                    {
-                    // To improve performance, don't print issues to output anymore.
-                    // Instead, store the issues in buffer and print them when analysis is done.
-                    if( iBCIssuesBigBuffer == 0)
-                        {
-                        iBCIssuesBigBuffer = HBufC::NewL(KBigBufferAllocBytes);
-                        }
-                    TInt maxSize = iBCIssuesBigBuffer->Des().Length() + issueStr.Length();
-                    if( maxSize >= iBCIssuesBigBuffer->Des().MaxLength())
-                        {
-                        TInt increaseSize = Max(issueStr.Length(), KBigBufferAllocBytes);
-                        iBCIssuesBigBuffer = iBCIssuesBigBuffer->ReAllocL(maxSize + increaseSize );                            
-                        }
-                    TPtr ptr(iBCIssuesBigBuffer->Des());
-                    ptr += issueStr;
-                    }
-                else
-                    {
-                    iLauncherUI->PrintText( issueStr);
-                    }
-                }
-            CleanupStack::Pop(); // diffs
-            diffs.Close();            
-            }
-        else
-            {
-            CleanupStack::PopAndDestroy(); // dllFile
-            }
-        }
-    }
-
-// ---------------------------------------------------------------------------
-void CLauncherEngine::DocumentParsedL(TInt aErrorCode)
-    {            
-    LOGSTRING2("Launcher: CLauncherEngine::DocumentParsedL (Error code: %d)", aErrorCode);
-        
-    iDLLAnalysisIsActive = EFalse;
-    _LIT(KParseError, "Parse error: ");
-    _LIT(KNoIssues, "No binary compatibility issues found");
-    
-    if( IsActive() )
-        {
-        Cancel();
-        }
-     
-    //hide progress bar 
-    iLauncherUI->HideProgressBar();
-
-    if( aErrorCode != KErrNone )
-        {
-        TBuf<16> errorCodeString;
-        errorCodeString.AppendNum(aErrorCode);
-        iLauncherUI->PrintText( KNewLine );
-        iLauncherUI->PrintText( KParseError );
-        iLauncherUI->PrintText( errorCodeString );
-        iLauncherUI->PrintText( KNewLine );        
-        AppendLogBufferL(KFileNewLine(), iLogWriteBuf);
-        AppendLogBufferL(KParseError(), iLogWriteBuf);
-        AppendLogBufferL(errorCodeString, iLogWriteBuf);
-        AppendLogBufferL(KFileNewLine(), iLogWriteBuf);
-        }
-    else if(iFoundBCIssues == 0)
-        {
-        iLauncherUI->PrintText( KNoIssues );
-        iLauncherUI->PrintText( KNewLine );        
-        AppendLogBufferL(KFileNewLine(), iLogWriteBuf);
-        AppendLogBufferL(KNoIssues(), iLogWriteBuf);
-        AppendLogBufferL(KFileNewLine(), iLogWriteBuf);
-        }
-    else if( iBCIssuesBigBuffer && iBCIssuesBigBuffer->Des().Length() > 0 )
-        {
-        iLauncherUI->PrintText(iBCIssuesBigBuffer->Des());
-        delete iBCIssuesBigBuffer;
-        iBCIssuesBigBuffer = 0;
-        }
-    if( iLogWriteBuf->Length() > 0 && iBCLogFile.SubSessionHandle() != 0)
-        {
-        iBCLogFile.Write(iLogWriteBuf->Des());
-        }
-    WriteInitialStuffToTheLogL(_L("Analysis ready"), iBCLogFile);
-    iLogWriteBuf->Des().Zero();
-    iBCLogFile.Close();
-    }
-
-// ---------------------------------------------------------------------------
-
-TInt CLauncherEngine::ReadLineFromFileL(RFile& aFile, TDes& aReadBuf)
-    {
-    LOGSTRING("Launcher: CLauncherEngine::ReadLineFromFile");
-
-    _LIT8(KImcvCRLF, "\r\n");
-    TInt err(KErrNone);
-
-    HBufC8* tempLine = HBufC8::NewLC(1000);
-    TPtr8 buffer = tempLine->Des();
-
-    // clear the target buffer
-    aReadBuf.Zero();
-
-    // get the current file position
-    TInt filePos(0);
-    aFile.Seek(ESeekCurrent, filePos);
-
-    // read the buffer
-    err = aFile.Read(buffer);
-
-    // check if it's the end of file
-    TInt s = buffer.Length();
-    if (s == 0)
-        err = KErrEof;
-
-    if (err == KErrNone)
-        {
-        // copy to the lfcr and then set the file pointer to the point after that
-        TInt pos = buffer.Find(KImcvCRLF);
-        if (pos != -1)
-            {
-            TFileName tempBuf;
-            buffer.SetLength(pos);
-            tempBuf.Copy(buffer);
-            aReadBuf.Justify(tempBuf, pos, ELeft, ' ');
-            filePos += (pos+2);
-
-            // set the file pointer back to after the lfcr
-            aFile.Seek(ESeekStart, filePos);
-            }
-        
-        // else fill the whole buffer
-        else
-            {
-            aReadBuf.Copy(buffer);
-            }
-        }
-
-    CleanupStack::PopAndDestroy(); // tempLine
-    return err;
-    }
-
-
-// ---------------------------------------------------------------------------
-// ---------------------------------------------------------------------------
-
-
-//////////////////////////////////////////////////////////////////////////////////////
-
-// ---------------------------------------------------------------------------
-
-CAppThreadChecker* CAppThreadChecker::NewL(CLauncherEngine* aLauncherEngine)
-    {
-    LOGSTRING("Launcher: CAppThreadChecker::NewL");
-
-    CAppThreadChecker* self = new(ELeave) CAppThreadChecker;
-    CleanupStack::PushL(self);
-    self->ConstructL(aLauncherEngine);
-    CleanupStack::Pop();
-    return self;
-    }
-
-// ---------------------------------------------------------------------------
-
-CAppThreadChecker::CAppThreadChecker() : CActive(EActivePriorityIpcEventsHigh)
-    {
-    }
-
-// ---------------------------------------------------------------------------
-
-void CAppThreadChecker::ConstructL(CLauncherEngine* aLauncherEngine)
-    {
-    LOGSTRING("Launcher: CAppThreadChecker::ConstructL");
-
-    iEnv = CEikonEnv::Static();
-
-    iLauncherEngine = aLauncherEngine;
-
-    CActiveScheduler::Add(this);
-    }
-
-// ---------------------------------------------------------------------------
-
-CAppThreadChecker::~CAppThreadChecker()
-    {
-    LOGSTRING("Launcher: CAppThreadChecker::~CAppThreadChecker");
-
-    Cancel();
-    }
-
-// ---------------------------------------------------------------------------
-
-void CAppThreadChecker::ActivateChecking()
-    {
-    LOGSTRING("Launcher: CAppThreadChecker::ActivateChecking");
-
-    __ASSERT_ALWAYS(!IsActive(), User::Panic(_L("Thread Checker"), 300));
-
-    SetActive();
-    }
-
-// ---------------------------------------------------------------------------
-
-void CAppThreadChecker::RunL()
-    {
-    LOGSTRING("Launcher: CAppThreadChecker::RunL");
-
-    // check the state of the thread
-    iLauncherEngine->CheckWhyThreadDiedL();
-    }
-
-// ---------------------------------------------------------------------------
-
-void CAppThreadChecker::DoCancel()
-    {
-    LOGSTRING("Launcher: CAppThreadChecker::DoCancel");
-    }
-
-// ---------------------------------------------------------------------------
-
-
-
-// ---------------------------------------------------------------------------
-
-//////////////////////////////////////////////////////////////////////////////////////
-
-// ---------------------------------------------------------------------------
-
-CAppRunningChecker* CAppRunningChecker::NewL(CLauncherEngine* aLauncherEngine)
-    {
-    LOGSTRING("Launcher: CAppRunningChecker::NewL");
-
-    CAppRunningChecker* self = new(ELeave) CAppRunningChecker;
-    CleanupStack::PushL(self);
-    self->ConstructL(aLauncherEngine);
-    CleanupStack::Pop();
-    return self;
-    }
-
-// ---------------------------------------------------------------------------
-
-CAppRunningChecker::CAppRunningChecker() : CActive(EActivePriorityIpcEventsHigh)
-    {
-    }
-
-// ---------------------------------------------------------------------------
-
-void CAppRunningChecker::ConstructL(CLauncherEngine* aLauncherEngine)
-    {
-    LOGSTRING("Launcher: CAppRunningChecker::ConstructL");
-
-    iEnv = CEikonEnv::Static();
-    User::LeaveIfError(iTimer.CreateLocal());
-
-    iLauncherEngine = aLauncherEngine;
-
-    CActiveScheduler::Add(this);
-    }
-
-// ---------------------------------------------------------------------------
-
-CAppRunningChecker::~CAppRunningChecker()
-    {
-    LOGSTRING("Launcher: CAppRunningChecker::~CAppRunningChecker");
-
-    Cancel();
-
-    iTimer.Close();
-    }
-
-// ---------------------------------------------------------------------------
-
-void CAppRunningChecker::StartTesting()
-    {
-    LOGSTRING("Launcher: CAppRunningChecker::StartTesting");
-
-    __ASSERT_ALWAYS(!IsActive(), User::Panic(_L("Running Checker"), 200));
-
-    // async delay of seven seconds
-    iTimer.After(iStatus, 7000000);    
-    SetActive();
-    }
-
-// ---------------------------------------------------------------------------
-
-void CAppRunningChecker::RunL()
-    {
-    LOGSTRING("Launcher: CAppRunningChecker::RunL");
-
-    // check if the application is running
-    iLauncherEngine->CheckIfAppIsRunningL();
-    }
-
-// ---------------------------------------------------------------------------
-
-void CAppRunningChecker::DoCancel()
-    {
-    LOGSTRING("Launcher: CAppRunningChecker::DoCancel");
-    iTimer.Cancel();
-    }
-
-// ---------------------------------------------------------------------------
-
-
-
-//////////////////////////////////////////////////////////////////////////////////////
-