activityfw/storage/client/s60/src/afstorageclient_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 <fbs.h>
#include <s32mem.h>

#include <qvariant.h>
#include <XQConversions>

#include "afstorageclient_p.h"
#include "afasyncrequest_p.h"
#include "afstorageglobals.h"
#include "afserializer.h"
#include "afentry.h"
#include "afstorageentry.h"


// -----------------------------------------------------------------------------
template <class T>
void RPointerArrayCleanupMethod(TAny *aPtr)
{
    static_cast< RPointerArray<T>* >(aPtr)->ResetAndDestroy();
}

// -----------------------------------------------------------------------------
template <class T>
void CleanupResetAndDestroyPushL(RPointerArray<T> &array) {
    CleanupStack::PushL(TCleanupItem(&RPointerArrayCleanupMethod<T>, &array));
} 
// -----------------------------------------------------------------------------
/**
 * Constructor
 */
AfStorageClientPrivate::AfStorageClientPrivate(MAfAsyncRequestObserver & observer)
:
mImplementation(observer)
{
}

// -----------------------------------------------------------------------------
/**
 * Destructor
 */
AfStorageClientPrivate::~AfStorageClientPrivate()
{
    mImplementation.Close();
}

// -----------------------------------------------------------------------------
/**
 * Function implementation
 * @see AfStorageClient::connect
 */
int AfStorageClientPrivate::connect()
{
    TRAPD(errNo, mImplementation.connectL());
    return errNo;
}

// -----------------------------------------------------------------------------
/**
 * Function implementation
 * @see AfStorageClient::addActivity(const AfStorageEntry &,const QPixmap&)
 */
int AfStorageClientPrivate::addActivity(const AfStorageEntry &entry, 
                                        const QPixmap& imageSrc)
{
    return execute(AddActivity, entry, imageSrc);
}

// -----------------------------------------------------------------------------
/**
 * Function implementation
 * @see AfStorageClient::updateActivity(const AfStorageEntry &,const QPixmap&)
 */
int AfStorageClientPrivate::updateActivity(const AfStorageEntry &entry, 
                                           const QPixmap& imageSrc)
{
    return execute(UpdateActivity, entry, imageSrc);
}

// -----------------------------------------------------------------------------
/**
 * Function implementation
 * @see AfStorageClient::removeActivity(const AfStorageEntry &)
 */
int AfStorageClientPrivate::removeActivity(const AfStorageEntry &entry)
{
    return execute(RemoveActivity, entry, QPixmap());
}

// -----------------------------------------------------------------------------
/**
 * Function implementation
 * @see AfStorageClient::removeApplicationActivities(const AfStorageEntry &)
 */
int AfStorageClientPrivate::removeApplicationActivities(const AfStorageEntry &entry)
{
    return execute(RemoveApplicationActivities, entry, QPixmap());
}

// -----------------------------------------------------------------------------
/**
 * Function implementation
 * @see AfStorageClient::activities(QList<AfStorageEntry> &)
 */
int AfStorageClientPrivate::activities(QList<AfStorageEntry> &results)
{
    return execute(Activities, results, AfStorageEntry());
}

// -----------------------------------------------------------------------------
/**
 * Function implementation
 * @see AfStorageClient::applicationActivities(QList<AfStorageEntry> &, const AfStorageEntry &)
 */
int AfStorageClientPrivate::applicationActivities(QList<AfStorageEntry> &results,
                                                  const AfStorageEntry &templateEntry)
{
    return execute(ApplicationActivities, results, templateEntry);
}

// -----------------------------------------------------------------------------
/**
 * Function implementation
 * @see AfStorageClient::activityData(AfStorageEntry &, const AfStorageEntry &)
 */
int AfStorageClientPrivate::activityData(AfStorageEntry &resultEntry, 
                                         const AfStorageEntry &templateEntry)
{
    
    QList<AfStorageEntry> results;
    int errNo(execute(ApplicationActivity, results, templateEntry));
    if (0 == errNo) {
        resultEntry = results.first();
    }
    return errNo;
}

// -----------------------------------------------------------------------------
/**
 * Function implementation
 * @see AfStorageClient::waitActivity()
 */
int AfStorageClientPrivate::waitActivity()
{
    return execute(WaitActivity, AfStorageEntry(), QPixmap());
}

// -----------------------------------------------------------------------------
/**
 * Function implementation
 * @see AfStorageClient::getThumbnail(QSize, QString, void *)
 */
int AfStorageClientPrivate::getThumbnail(QSize size, QString imagePath, void *userData)
{
    HBufC *source = XQConversions::qStringToS60Desc(imagePath);
    TRAPD(errNo, mImplementation.getThumbnailL(TSize(size.width(), size.height()), *source, userData);)
    delete source;
    return errNo;
    
}

// -----------------------------------------------------------------------------
/**
 * Function implementation
 * @see AfStorageClient::notifyDataChange()
 */
int AfStorageClientPrivate::notifyDataChange()
{
    return execute(NotifyChange, AfStorageEntry(), QPixmap());
}

// -----------------------------------------------------------------------------
/**
 * Function implementation
 * @see AfStorageClient::launchActivity(const AfStorageEntry &)
 */
int AfStorageClientPrivate::launchActivity(const AfStorageEntry &templateEntry)
{
    return execute(LaunchActivity, templateEntry, QPixmap());
}

// -----------------------------------------------------------------------------
/**
 * Function implementation
 * @see AfStorageClient::cancelWaitActivity()
 */
int AfStorageClientPrivate::cancelWaitActivity()
{
    return execute(CancelWait, AfStorageEntry(), QPixmap());
}

// -----------------------------------------------------------------------------
/**
 * Function implementation
 * @see AfStorageClient::cancelNotifyDataChange()
 */
int AfStorageClientPrivate::cancelNotifyDataChange()
{
    return execute(CancelNotify, AfStorageEntry(), QPixmap());
}

// -----------------------------------------------------------------------------
/**
 * Function execute activity framework functinality and return results 
 */
int AfStorageClientPrivate::execute(int function, const AfStorageEntry &sourceEntry, const QPixmap& sourceImage)
{
    TRAPD(errNo,
    const CAfEntry *entry(sourceEntry.data());
    int userData(-1);
    CFbsBitmap* bitmap(sourceImage.toSymbianCFbsBitmap());
    if(0 != bitmap) {
        CleanupStack::PushL(bitmap);
        userData = bitmap->Handle();
    }
    switch (function) {
    case AddActivity:
    case UpdateActivity:
    case RemoveActivity:
    case RemoveApplicationActivities:
    case LaunchActivity:
        User::LeaveIfNull(entry);
        mImplementation.executeL(function, *entry, userData);
        break;
    
    case CancelNotify:
    case CancelWait:
    case WaitActivity:
    case NotifyChange:
        mImplementation.executeL(function);
        break;
    }
    if(0 != bitmap) {
        CleanupStack::PopAndDestroy(bitmap);
    }
    )
    return errNo;
}

// -----------------------------------------------------------------------------
/**
 * Function execute activity framework functinality and return results 
 */
int AfStorageClientPrivate::execute(int function, QList<AfStorageEntry>& resultsList,const AfStorageEntry& templateEntry)
{
    TRAPD(errNo,
    RPointerArray<CAfEntry> results;
    CleanupResetAndDestroyPushL<CAfEntry>(results);
    
    CAfEntry *entry(const_cast<CAfEntry *>(templateEntry.data()));
    if(0 == entry) {
        entry = CAfEntry::NewLC();
    }
    mImplementation.executeL(function, results, *entry);
    if(templateEntry.data() != entry) {
        CleanupStack::PopAndDestroy(entry);
    }
    
    //copy data
    while (results.Count()) {
        resultsList.append(AfStorageEntry(QSharedPointer<CAfEntry>(results[0])));
        results.Remove(0);
    }
    CleanupStack::PopAndDestroy(&results);
    )
    return errNo;
}