appinstaller/AppinstUi/sisxsifplugin/tsrc/testinstaller/activerunner_symbian.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 15:21:33 +0300
branchRCL_3
changeset 25 7333d7932ef7
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
* 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:  Test installer that uses Usif::RSoftwareInstall API.
*
*/

#include "activerunner_symbian.h"
#include "activerunner.h"

_LIT( KDefaultOcspResponderUrl, "http://4fil30423.noe.nokia.com:45000/" );


ActiveRunnerPrivate::ActiveRunnerPrivate( ActiveRunner *aRunner ) :
        CActive( CActive::EPriorityStandard ), q_ptr( aRunner )
    {
    CActiveScheduler::Add( this );
    }

ActiveRunnerPrivate::~ActiveRunnerPrivate()
    {
    Cancel();
    if( iUseSif )
        {
        iSoftwareInstall.Close();
        }
    else
        {
        iSWInstLauncher.Close();
        }
    iFs.Close();
    delete iFileName;
    delete iArguments;
    delete iResults;
    }

TInt ActiveRunnerPrivate::Initialize( bool aUseSif )
    {
    TRAPD( err, DoInitializeL( aUseSif ) );
    return err;
    }

TInt ActiveRunnerPrivate::Install( const QString& aFileName, bool aSilent, bool aOpenFile, bool aOcsp )
    {
    TRAPD( err, DoInstallL( aFileName, aSilent, aOpenFile, aOcsp ) );
    return err;
    }

TInt ActiveRunnerPrivate::Remove( const Usif::TComponentId& aComponentId, bool aSilent )
    {
    TRAPD( err, DoRemoveL( aComponentId, aSilent ) );
    return err;
    }

TInt ActiveRunnerPrivate::Remove( const TUid& aUid, const TDesC8& aMime, bool aSilent )
    {
    TRAPD( err, DoRemoveL( aUid, aMime, aSilent ) );
    return err;
    }

void ActiveRunnerPrivate::DoCancel()
    {
    if( iUseSif )
        {
        iSoftwareInstall.CancelOperation();
        }
    else
        {
        iSWInstLauncher.CancelAsyncRequest( SwiUI::ERequestInstall );
        }
    }

void ActiveRunnerPrivate::RunL()
    {
    User::LeaveIfError( iStatus.Int() );

    RDebug::Printf( "USIFTestInstaller: Installation completed" );
    if( q_ptr )
        {
        q_ptr->handleCompletion();
        }
    }

TInt ActiveRunnerPrivate::RunError( TInt aError )
    {
    RDebug::Printf( "USIFTestInstaller: Error %d", aError );
    if( q_ptr )
        {
        q_ptr->handleError( aError );
        }
    return KErrNone;
    }

void ActiveRunnerPrivate::DoInitializeL( bool aUseSif )
    {
    iUseSif = aUseSif;
    User::LeaveIfError( iFs.Connect() );
    User::LeaveIfError( iFs.ShareProtected() );
    if( iUseSif )
        {
        User::LeaveIfError( iSoftwareInstall.Connect() );
        }
    else
        {
        User::LeaveIfError( iSWInstLauncher.Connect() );
        }
    }

void ActiveRunnerPrivate::DoInstallL( const QString& aFileName, bool aSilent, bool aOpenFile, bool aOcsp )
    {
    if( iFileName )
        {
        delete iFileName;
        iFileName = NULL;
        }
    iFileName = HBufC16::NewL( aFileName.length() );
    TPtr16 fileName( iFileName->Des() );
    fileName.Copy( reinterpret_cast<const TText*>( aFileName.constData() ) );

    // Convert forward-slashes to backward-slashes
    const TChar KBackSlash = '\\';
    const TChar KSlash = '/';
    for( TInt i = 0; i < fileName.Length(); ++i )
        {
        if( fileName[i] == KSlash )
            {
            fileName[i] = KBackSlash;
            }
        }

    RFile fileHandle;
    if( aOpenFile )
        {
        User::LeaveIfError( fileHandle.Open( iFs, fileName, EFileRead ) );
        CleanupClosePushL( fileHandle );
        }

    if( iUseSif )
        {
        delete iArguments;
        iArguments = NULL;
        iArguments = Usif::COpaqueNamedParams::NewL();

        delete iResults;
        iResults = NULL;
        iResults = Usif::COpaqueNamedParams::NewL();

        if( aSilent )
            {
            iArguments->AddIntL( Usif::KSifInParam_InstallSilently, ETrue );
            }
        if( aOcsp )
            {
            iArguments->AddIntL( Usif::KSifInParam_PerformOCSP, Usif::EAllowed );
            iArguments->AddStringL( Usif::KSifInParam_OCSPUrl, KDefaultOcspResponderUrl );
            }

        if( aOpenFile )
            {
            iSoftwareInstall.Install( fileHandle, *iArguments, *iResults, iStatus );
            }
        else
            {
            iSoftwareInstall.Install( fileName, *iArguments, *iResults, iStatus );
            }
        }
    else
        {
        if( aSilent )
            {
            SwiUI::TInstallOptions defaultOptions;
            SwiUI::TInstallOptionsPckg optPckg( defaultOptions );

            if( aOpenFile )
                {
                iSWInstLauncher.SilentInstall( iStatus, fileHandle, optPckg );
                }
            else
                {
                iSWInstLauncher.SilentInstall( iStatus, fileName, optPckg );
                }
            }
        else
            {
            if( aOpenFile )
                {
                iSWInstLauncher.Install( iStatus, fileHandle );
                }
            else
                {
                iSWInstLauncher.Install( iStatus, fileName  );
                }
            }
        }

    if( aOpenFile )
        {
        CleanupStack::PopAndDestroy( &fileHandle );
        }

    SetActive();
    }

void ActiveRunnerPrivate::DoRemoveL( const Usif::TComponentId& aComponentId, bool aSilent )
    {
    if( aSilent )
        {
        delete iArguments;
        iArguments = NULL;
        iArguments = Usif::COpaqueNamedParams::NewL();
        iArguments->AddIntL( Usif::KSifInParam_InstallSilently, 1 );

        delete iResults;
        iResults = NULL;
        iResults = Usif::COpaqueNamedParams::NewL();

        iSoftwareInstall.Uninstall( aComponentId, *iArguments, *iResults, iStatus );
        }
    else
        {
        iSoftwareInstall.Uninstall( aComponentId, iStatus );
        }
    SetActive();
    }

void ActiveRunnerPrivate::DoRemoveL( const TUid& aUid, const TDesC8& aMime, bool aSilent )
    {
    if( aSilent )
        {
        SwiUI::TUninstallOptions defaultOptions;
        SwiUI::TUninstallOptionsPckg optPckg( defaultOptions );
        iSWInstLauncher.SilentUninstall( iStatus, aUid, optPckg, aMime );
        }
    else
        {
        iSWInstLauncher.Uninstall( iStatus, aUid, aMime );
        }
    SetActive();
    }