iaupdate/IAD/api/client/src/iaupdateclient.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
parent 18 f9033e605ee2
child 26 8b7f4e561641
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
* Copyright (c) 2007-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:   This module contains the implementation of IAUpdateClient
*                class member functions.
*
*/



//INCLUDES
#include <eikenv.h>
#include <apgcli.h>
#include <e32math.h>
#include <iaupdateparameters.h>
#include <iaupdateresult.h>
#include <xqservicerequest.h>
#include <xqserviceutil.h>
#include <xqrequestinfo.h>

#include "iaupdateclient.h"
#include "iaupdateclientdefines.h"
#include "iaupdatedebug.h"


// -----------------------------------------------------------------------------
// IAUpdateClient::IAUpdateClient
// 
// -----------------------------------------------------------------------------
// 
IAUpdateClient::IAUpdateClient(MIAUpdateObserver& observer):
    mObserver(observer)
    {
    mServiceRequest = NULL;
    mCurrentRequestType = NoOperation;
    }

// -----------------------------------------------------------------------------
// IAUpdateClient::~IAUpdateClient
// 
// -----------------------------------------------------------------------------
// 
IAUpdateClient::~IAUpdateClient() 
    {
    if ( mServiceRequest)
        {
        delete mServiceRequest;
        }
    }


// -----------------------------------------------------------------------------
// IAUpdateClient::initRequest
// 
// -----------------------------------------------------------------------------
// 
int IAUpdateClient::initRequest(const CIAUpdateParameters* updateParameters, const QString& message, bool toBackground)
{
    IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::initRequest() begin");
    int error(KErrNone);
    if (mCurrentRequestType != NoOperation) 
        {
        error = KErrServerBusy;
        }
    else if (!mServiceRequest)
    {
        mServiceRequest = new XQServiceRequest("com.nokia.services.swupdate.swupdate_interface", message, false);
        if (mServiceRequest)
        {    
            connect(mServiceRequest, SIGNAL(requestCompleted(QVariant)), this, SLOT(requestCompleted(QVariant)));
            connect(mServiceRequest, SIGNAL(requestError(int)), this, SLOT(requestError(int)));
        }
        else
        {
            error = KErrNoMemory;
        }
    }
    else
    {
        mServiceRequest->setMessage(message);
    }
    
    
    if (error == KErrNone)
    {    
        XQRequestInfo requestInfo;
        requestInfo.setBackground(toBackground);
        mServiceRequest->setInfo(requestInfo); 
        int wgId = 0;
        CEikonEnv* eikEnv = CEikonEnv::Static();
        if ( eikEnv )
        {
            RWindowGroup owngroup;
            wgId = eikEnv->RootWin().Identifier();
        }
        IAUPDATE_TRACE_1("IAUpdateClient::initRequest() wgId: %d", wgId);
        QString stringWgid;
        stringWgid.setNum(wgId);
        *mServiceRequest << stringWgid;  
        if (updateParameters)
        {    
            IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::initRequest() UID: %d", updateParameters->Uid().iUid);
            QString stringUid; 
            stringUid.setNum(updateParameters->Uid().iUid);
            *mServiceRequest << stringUid;
                
            IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::initRequest() searchcriteria: %S", &updateParameters->SearchCriteria());
            *mServiceRequest << qStringFromTDesC(updateParameters->SearchCriteria());
                
            IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::initRequest() executable: %S", &updateParameters->CommandLineExecutable());
            *mServiceRequest << qStringFromTDesC(updateParameters->CommandLineExecutable());
                
            IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::initRequest() arguments: %S8", &updateParameters->CommandLineArguments());
            *mServiceRequest << qStringFromTDesC8(updateParameters->CommandLineArguments());
                
            IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::initRequest() show progress: %d", updateParameters->ShowProgress());
            QString stringShowProgress;
            stringShowProgress.setNum(updateParameters->ShowProgress());
            *mServiceRequest << stringShowProgress;
                
            IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::initRequest() importance: %d", updateParameters->Importance());
            QString stringImportance;
            stringImportance.setNum(updateParameters->Importance());
            *mServiceRequest << stringImportance;
                
            IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::initRequest() type: %d", updateParameters->Type());
            QString stringType;
            stringType.setNum(updateParameters->Type());
            *mServiceRequest << stringType;
                
            IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::initRequest() refresh: %d", updateParameters->Refresh());
            QString stringRefresh;
            stringRefresh.setNum(updateParameters->Refresh());
            *mServiceRequest << stringRefresh;
        }
    }                 
     
    
    IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::initRequest() error code: %d", error );
    IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::initRequest() end");
    return error;
}

// -----------------------------------------------------------------------------
// IAUpdateClient::checkUpdates
// 
// -----------------------------------------------------------------------------
//
void IAUpdateClient::checkUpdates(const CIAUpdateParameters& updateParameters)
    {
    IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::checkUpdates()");
    QString message("checkUpdates(QString,QString,QString,QString,QString,QString,QString,QString,QString)");
    //QString message("checkUpdates(int,int)");
    int ret = initRequest(&updateParameters,message,!updateParameters.ShowProgress());
    if (ret == KErrNone)
        {
        if (mServiceRequest->send()) 
            {
            mCurrentRequestType = CheckUpdates;
            }
        else
            {
            mObserver.CheckUpdatesComplete(ret,0);        
            }
        }
    }

// -----------------------------------------------------------------------------
// IAUpdateClient::showUpdates
// 
// -----------------------------------------------------------------------------
//
void IAUpdateClient::showUpdates(const CIAUpdateParameters& updateParameters)
    {
    IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::showUpdates()");
    QString message("showUpdates(QString,QString,QString,QString,QString,QString,QString,QString,QString)");
    int ret = initRequest(&updateParameters, message, false);
    if (ret == KErrNone)
        {
        if (mServiceRequest->send())
            {
            mCurrentRequestType = ShowUpdates;
            }
        else
            {
            mObserver.UpdateComplete(ret,NULL);
            }
        }
    }
    

// -----------------------------------------------------------------------------
// IAUpdateClient::updateQuery
// 
// -----------------------------------------------------------------------------
//    
void IAUpdateClient::updateQuery()
{
    IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::updateQuery() begin");
    QString message("updateQuery(QString)");
    CIAUpdateParameters* nullParameters = NULL;
    int ret = initRequest(nullParameters, message, false);
    if (ret == KErrNone)
    {
        if (mServiceRequest->send()) 
        {
            mCurrentRequestType = UpdateQuery;
        }
        else
        {
            mObserver.UpdateQueryComplete(ret,false);
        }
    }
	IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::updateQuery() end");    
}

// -----------------------------------------------------------------------------
// IAUpdateClient::update
// 
// -----------------------------------------------------------------------------
// 
void IAUpdateClient::update()
{
    mObserver.UpdateComplete(KErrNotSupported,NULL);
}

// -----------------------------------------------------------------------------
// IAUpdateClient::broughtToForeground
// 
// -----------------------------------------------------------------------------
//
void IAUpdateClient::broughtToForeground()
{
    IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::broughtToForeground() begin");
    if (mServiceRequest)
    {
        QString message("broughtToForeground(int)");
        CIAUpdateParameters* nullParameters = NULL;
        int ret = initRequest(nullParameters, message, false);
        if (ret == KErrNone)
        {
            if (mServiceRequest->send())
            {
                mCurrentRequestType = BroughtToForeground;
            }
        }
    } 
    IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::broughtToForeground() end");
}

// -----------------------------------------------------------------------------
// IAUpdateClient::requestCompleted
// 
// -----------------------------------------------------------------------------
//
void IAUpdateClient::requestCompleted(const QVariant& value)
{
    IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::requestCompleted() begin");
    RequestType requestType = mCurrentRequestType;
    IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::requestCompleted()request type: %d", requestType );
    QList<QVariant> resultlist = value.toList();
    int errorCode = resultlist.at(0).toInt();
    CIAUpdateResult* updateResult(NULL);
            
    if ( requestType == ShowUpdates )
    {
        // Update result object is required.
        // Notice that the ownership is transferred later.
        // So, this function does not need to delete updateResult object.
        TRAPD( trapError, updateResult = CIAUpdateResult::NewL() );
        if ( updateResult )
        {
            updateResult->SetSuccessCount(resultlist.at(1).toInt());
            updateResult->SetFailCount(resultlist.at(2).toInt());
            updateResult->SetCancelCount(resultlist.at(3).toInt());
        }
        else
        {
            // Something went wrong when creating update result object.
            // Update the error code accordingly.
            errorCode = trapError;
        }
            // Let's assume that connection is not needed anymore
        if (mServiceRequest)
        {
            delete mServiceRequest;
            mServiceRequest= NULL;
        }
    }
        
    // Inform that no operation is going on anymore.
    // This is required for busy check.
    mCurrentRequestType = NoOperation;
        
    // Use the request type of the ongoing operation to check what callback
    // function to call.
    int countOfUpdates = 0;
    bool updateNow = false;
    switch (requestType)
    {
        case CheckUpdates:
        countOfUpdates = resultlist.at(1).toInt();    
        if (countOfUpdates == 0)
        {
            // Let's assume that connection is not needed anymore
            delete mServiceRequest;  
            mServiceRequest= NULL;
        }
        IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::requestCompleted() count of updates: %d", countOfUpdates );
        mObserver.CheckUpdatesComplete(errorCode, countOfUpdates);
        break;

        case ShowUpdates:
        // Notice that ownership of result object is transferred here.
        IAUPDATE_TRACE_3("[IAUPDATE] IAUpdateClient::requestCompleted() success count: %d failed count: %d cancelled count: %d", updateResult->SuccessCount(), updateResult->FailCount(), updateResult->CancelCount() );
        mObserver.UpdateComplete(errorCode, updateResult);
        break;
                
        case UpdateQuery:
        updateNow = resultlist.at(1).toBool();      
        if ( !updateNow )
        {
            // Let's assume that connection is not needed anymore
            delete mServiceRequest;
            mServiceRequest= NULL;
        }    
        IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::requestCompleted() update now: %d", updateNow );
        mObserver.UpdateQueryComplete(errorCode, updateNow);
        break;
             
        default:
        // Should not ever come here.
        break;
    }
            
    // Do not anything else than return after callback function is called because 
    // this instance can be deleted by a client in a callback function
    // 
    IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::requestCompleted() end");
}

// -----------------------------------------------------------------------------
// IAUpdateClient::requestError
// 
// -----------------------------------------------------------------------------
//
void IAUpdateClient::requestError(int /*err*/)
{
    IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::requestError() begin");
    if ( mServiceRequest)
        {
            delete mServiceRequest;
            mServiceRequest= NULL;
        }
    RequestType requestType = mCurrentRequestType;
    mCurrentRequestType = NoOperation;
    // because this method is called also when iaupdate is closed normally, error code is not passed to a client   
    CIAUpdateResult* updateResult(NULL);
    switch (requestType)
    {
        case CheckUpdates:
        mObserver.CheckUpdatesComplete(0, 0);
        break;

        case ShowUpdates:
        // Notice that ownership of result object is transferred here.
        TRAP_IGNORE( updateResult = CIAUpdateResult::NewL() );    
        mObserver.UpdateComplete(0, updateResult);
        break;
                    
        case UpdateQuery:
        mObserver.UpdateQueryComplete(0, false);
        break;
                 
        default:
        // Should not ever come here.
        break;
    }
    IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::requestError() end");
}     

// -----------------------------------------------------------------------------
// IAUpdateClient::qStringFromTDesC16
// 
// -----------------------------------------------------------------------------
//
QString IAUpdateClient::qStringFromTDesC16( const TDesC16& aDes16 )             
{
    return QString::fromUtf16( aDes16.Ptr(), aDes16.Length() );
}

// -----------------------------------------------------------------------------
// IAUpdateClient::qStringFromTDesC8
// 
// -----------------------------------------------------------------------------
//
QString IAUpdateClient::qStringFromTDesC8( const TDesC8& aDes8 )                
{
    return QString::fromUtf8( reinterpret_cast<const char*>( aDes8.Ptr() ), aDes8.Length() );
}

// -----------------------------------------------------------------------------
// IAUpdateClient::qStringFromTDesC
// 
// -----------------------------------------------------------------------------
//
QString IAUpdateClient::qStringFromTDesC( const TDesC& aDes )                    
{
#if defined(_UNICODE)
    return qStringFromTDesC16( aDes );
#else
    return qStringFromTDesC8( aDes );
#endif
}