activityfw/storage/client/s60/src/afasyncrequest_p.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 06 Jul 2010 14:37:10 +0300
changeset 104 9b022b1f357c
permissions -rw-r--r--
Revision: 201025 Kit: 2010127

/*
* 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 "afasyncrequest_p.h"
#include "afstorageclient_p.h"
#include "afstorageclient.h"
#include "afentry.h"
#include <fbs.h>
#include <XQConversions>

// -----------------------------------------------------------------------------
/**
 * Create and initialize handler for anyc. activity requests
 * @param observer - request completion observer
 * @param session - activity client implementation
 * @param cmd - requested functionality
 */
void CAfAsyncRequestPrivate::NewLD(MAfAsyncRequestObserver &observer, 
                                   RAfStorageClientImplementation & session,
                                   ActivityCmd cmd)
{
    CAfAsyncRequestPrivate* self = new(ELeave)CAfAsyncRequestPrivate(observer, session, cmd);
    CleanupStack::PushL(self);
    self->ConstructL();
    session.PushL(self);
    CleanupStack::Pop(self);
}

// -----------------------------------------------------------------------------
/**
 * First phase construction
 * @param observer - request completion observer
 * @param session - activity client implementation
 * @param cmd - requested functionality
 */
CAfAsyncRequestPrivate::CAfAsyncRequestPrivate(MAfAsyncRequestObserver & observer, 
                                               RAfStorageClientImplementation & session,
                                               ActivityCmd cmd)
:
CActive(EPriorityStandard),
mObserver(observer),
mSession(session),
mCmd(cmd)
{
    CActiveScheduler::Add(this);
    RProcess process;
    mIds[0] = static_cast<TInt>(process.SecureId().iId);
}

// -----------------------------------------------------------------------------
/**
 * Second phase construction
 */
void CAfAsyncRequestPrivate::ConstructL()
{
    mSession.sendAsync(mCmd, 
                       TIpcArgs(&mIds[0],&mIds[1], &mIds[2], &mIds[3]),
                       iStatus);
    SetActive();
}

// -----------------------------------------------------------------------------
/**
 * Destructor
 */
CAfAsyncRequestPrivate::~CAfAsyncRequestPrivate()
{
    Cancel();
}

// -----------------------------------------------------------------------------
/**
 * Cancel pending requst
 */
void CAfAsyncRequestPrivate::DoCancel()
{
    TRAP_IGNORE(
    switch (mCmd) {
    case WaitActivity: mSession.executeL(CancelWait); break;
    case NotifyChange: mSession.executeL(CancelNotify); break;
    }
    )
}

// -----------------------------------------------------------------------------
/**
 * Function handle request completion, copy data, forward information and destroy handler 
 */
void CAfAsyncRequestPrivate::RunL()
{
    User::LeaveIfError(iStatus.Int());
    switch (mCmd) {
    case WaitActivity:
        {
        RBuf8 data;
        CleanupClosePushL(data);
        CAfEntry::ReallocL(data, (mIds[0])());
        mSession.getDataL((mIds[3])(), data);
        mObserver.asyncRequestCompleated(iStatus.Int(), mCmd, XQConversions::s60Desc8ToQString(data));
        CleanupStack::PopAndDestroy(&data);
        break;
        }
    case NotifyChange:
        mObserver.asyncRequestCompleated(iStatus.Int(), mCmd);
        break;
    }
    mSession.Pop(this);
    delete this;
}

// -----------------------------------------------------------------------------
/**
 * Function handle request processing errors
 * @param error - error code 
 */
TInt CAfAsyncRequestPrivate::RunError(TInt error)
{
    (WaitActivity == mCmd) ? mObserver.asyncRequestCompleated(error, mCmd, QString::null) :
                             mObserver.asyncRequestCompleated(error, mCmd);
    mSession.Pop(this);
    delete this;
    return KErrNone;
}