logsui/tsrc/logsservicestester/logsservicetesterappcloser.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 04 Oct 2010 00:17:41 +0300
changeset 20 6a40edd41841
parent 6 41c0a814d878
permissions -rw-r--r--
Revision: 201037 Kit: 201039

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/

#include <QDebug>
#include <QProcess>
#include "logsservicetesterappcloser.h"

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
LogsServiceTesterAppCloser::LogsServiceTesterAppCloser(QObject* parent) : 
    QObject(parent)
{
    mAppCloseWatch = new CAppCloseWatcher(*this);    
    connect(&mTimer, SIGNAL(timeout()), this, SLOT(closeAppTimeout()));
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
LogsServiceTesterAppCloser::~LogsServiceTesterAppCloser()
{
    delete mAppCloseWatch;
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void LogsServiceTesterAppCloser::AppClosed(TInt aError)
{
    mTimer.stop();
    if (aError == KErrNone) {
        emit closed();
    } else {
        emit closeError(aError);
    }
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void LogsServiceTesterAppCloser::closeAppTimeout()
{
    mAppCloseWatch->Cancel();
    emit closeError(ErrorClosingTimeout);
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void LogsServiceTesterAppCloser::closeApp(TApaTask& aTask)
{
    if ( !mAppCloseWatch->IsActive() ) {
        mTimer.start(3000); //3 sec.
        mTimer.setSingleShot(true);
        mAppCloseWatch->Start(aTask);
        aTask.EndTask();
    } else {
        emit closeError(ErrorClosingOngoing);
    }
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void LogsServiceTesterAppCloser::closeDialerApp()
{
    qDebug() << "[LOGS_TESTER] -> LogsServiceTesterAppCloser::closeDialerApp()";

    if ( isDialerRunning(true) ){
        qDebug() << "[LOGS_TESTER] dialer is running, killing";
    } else {
        qDebug() << "[LOGS_TESTER] dialer is not running";
        emit closeError(ErrorAppNotRunning);
    }

    qDebug() << "[LOGS_TESTER] <- LogsServiceTesterAppCloser::closeDialerApp()";    
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void LogsServiceTesterAppCloser::startDialerAtBg()
{
    qDebug() << "[LOGS_TESTER] -> LogsServiceTesterAppCloser::startDialerAtBg()";    
    if ( isDialerRunning() ){
        emit closeError(ErrorAppRunning);
    } else {
        QStringList arguments;
        arguments << "-logsbootup";
    
        QProcess myProcess;
        if ( !myProcess.startDetached("logs", arguments) ){
            qDebug() << "[LOGS_TESTER]  Failed to start"; 
            emit closeError(-1);
        }
    }
    qDebug() << "[LOGS_TESTER] <- LogsServiceTesterAppCloser::startDialerAtBg()";    
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
bool LogsServiceTesterAppCloser::isDialerRunning(bool close)
{
    const TUid KUidDialer = { 0x101F4CD5 };
    bool running( false );
    RWsSession ws;
    TInt err = ws.Connect();
    if (err == KErrNone) {
        TApaTaskList tl( ws);
        TApaTask dialerTask = (TApaTask)tl.FindApp( KUidDialer );   
        running = dialerTask.Exists();
        if ( close ){
            closeApp(dialerTask);
        }
    }    
    ws.Close();
    return running;
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
CAppCloseWatcher::CAppCloseWatcher(MCloseOberver& aObserver) :  
    CActive(CActive::EPriorityStandard), iObserver(aObserver)
    {
    CActiveScheduler::Add(this);    
    }

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
CAppCloseWatcher::~CAppCloseWatcher()
    {
    Cancel();
    }

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void CAppCloseWatcher::Start(const TApaTask& aTask)
    {
    qDebug() << "[LOGS_TESTER] -> CAppCloseWatcher::Start()!";
    if (!IsActive())
        {
        TInt err = iThread.Open(aTask.ThreadId());
        if (err == KErrNone)
            {
            qDebug() << "[LOGS_TESTER] calling  iThread.Logon(iStatus)";    
            iOriginalProcessPriority = iThread.ProcessPriority();
            iThread.SetProcessPriority(EPriorityForeground);
            iThread.Logon(iStatus);
            SetActive();
            }
        else
            {
            qDebug() << "[LOGS_TESTER] calling  iThread.Open() failed: "<< err;
            TRequestStatus* s = &iStatus;
            User::RequestComplete(s, err);
            SetActive();
            }
        } 
    qDebug() << "[LOGS_TESTER] <- CAppCloseWatcher::Start()";    
    }

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void CAppCloseWatcher::DoCancel()
    {
    qDebug() << "[LOGS_TESTER] -> CAppCloseWatcher::DoCancel()";
    iThread.LogonCancel(iStatus);
    iThread.SetProcessPriority(iOriginalProcessPriority);
    iThread.Close();
    qDebug() << "[LOGS_TESTER] -> CAppCloseWatcher::DoCancel()";
    }

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void CAppCloseWatcher::RunL()
    {
    qDebug() << "[LOGS_TESTER] -> CAppCloseWatcher::RunL()";
    if (iThread.Handle())
        iThread.SetProcessPriority(iOriginalProcessPriority);
    iThread.Close();
    iObserver.AppClosed(iStatus.Int());
    qDebug() << "[LOGS_TESTER] <- CAppCloseWatcher::RunL()";
    }