activityfw/activityserviceplugin/s60/src/afstorageproxy_p.cpp
changeset 109 e0aa398e6810
child 116 305818acdca4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/activityfw/activityserviceplugin/s60/src/afstorageproxy_p.cpp	Wed Aug 18 10:05:49 2010 +0300
@@ -0,0 +1,296 @@
+/*
+* 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 "afstorageproxy_p.h"
+
+#include <fbs.h>
+
+#include <QSize>
+#include <QPixmap>
+
+#include <XQConversions>
+
+#include <afstorageglobals.h>
+#include <afstorageclient.h>
+#include <afentry.h>
+
+#include "afstorageproxy.h"
+#include "afserializer.h"
+
+AfStorageProxyPrivate::AfStorageProxyPrivate(AfStorageProxy *q) : mClient(0), q_ptr(q)
+{    
+    QT_TRAP_THROWING(mClient = CAfStorageClient::NewL(*this));
+}
+
+AfStorageProxyPrivate::~AfStorageProxyPrivate()
+{
+    delete mClient;
+}
+
+bool AfStorageProxyPrivate::addActivity(int applicationId, const QString &activityId, const QVariant &activityData, const QVariantHash &metadata, const QPixmap &screenshot)
+{    
+    int screenshotHandle(-1);
+    CFbsBitmap* bitmap(screenshot.toSymbianCFbsBitmap());
+    if (bitmap) {
+        screenshotHandle = bitmap->Handle();
+    }
+    
+    CAfEntry *entry = createSaveEntry(applicationId, activityId, activityData, metadata);
+    int result = mClient->addActivity(*entry, screenshotHandle);    
+    delete entry;
+    delete bitmap;
+    
+    return KErrNone == result;
+}
+
+bool AfStorageProxyPrivate::updateActivity(int applicationId, const QString &activityId, const QVariant &activityData, const QVariantHash &metadata, const QPixmap &screenshot)
+{
+    int screenshotHandle(-1);
+    CFbsBitmap* bitmap(screenshot.toSymbianCFbsBitmap());
+    if (bitmap) {
+        screenshotHandle = bitmap->Handle();
+    }
+    
+    CAfEntry *entry = createSaveEntry(applicationId, activityId, activityData, metadata);
+    int result = mClient->updateActivity(*entry, screenshotHandle);    
+    delete entry;
+    delete bitmap;
+    
+    return KErrNone == result;
+}
+
+bool AfStorageProxyPrivate::saveActivity(int applicationId, const QString &activityId, const QVariant &activityData, const QVariantHash &metadata, const QPixmap &screenshot)
+{
+    int screenshotHandle(-1);
+    CFbsBitmap* bitmap(screenshot.toSymbianCFbsBitmap());
+    if (bitmap) {
+        screenshotHandle = bitmap->Handle();
+    }
+    
+    CAfEntry *entry = createSaveEntry(applicationId, activityId, activityData, metadata);
+    int result = mClient->saveActivity(*entry, screenshotHandle);    
+    delete entry;
+    delete bitmap;
+    
+    return KErrNone == result;
+}
+
+bool AfStorageProxyPrivate::removeActivity(int applicationId, const QString &activityId)
+{
+    CAfEntry *entry = createFilterEntry(applicationId, activityId);
+    int result = mClient->removeActivity(*entry);
+    delete entry;
+    return KErrNone == result;
+}
+   
+bool AfStorageProxyPrivate::removeApplicationActivities(int applicationId)
+{
+    CAfEntry *entry = createFilterEntry(applicationId);
+    int result = mClient->removeApplicationActivities(*entry);
+    delete entry;
+    return KErrNone == result;
+}
+
+bool AfStorageProxyPrivate::activities(QList<QVariantHash> &list)
+{
+    RPointerArray<CAfEntry> results;
+    
+    int result = mClient->activities(results);
+    list.clear();
+    for (int i=0; i < results.Count(); ++i) {
+        list.append(extractMetadata(results[i]));
+    }
+   
+    results.ResetAndDestroy();
+    return KErrNone == result;
+}
+
+bool AfStorageProxyPrivate::applicationActivities(QStringList &list, int applicationId)
+{
+    RPointerArray<CAfEntry> results;
+    
+    CAfEntry *entry = createFilterEntry(applicationId);
+    int result = mClient->applicationActivities(results, *entry);
+    delete entry;
+    
+    list.clear();
+    for (int i=0; i < results.Count(); ++i) {
+        list.append(XQConversions::s60DescToQString(results[i]->ActivityId()));
+    }
+   
+    results.ResetAndDestroy();
+    return KErrNone == result;
+}
+
+bool AfStorageProxyPrivate::activityData(QVariant &data, int applicationId, const QString &activityId)
+{
+    CAfEntry *entry = getEntry(applicationId, activityId);
+    
+    if (!entry) {
+        return false;
+    }
+    
+    QVariantHash deserializedData;
+    deserializedData << entry->Data(CAfEntry::Private);
+    data = deserializedData[ActivityDataKeyword];
+    delete entry;
+    return true;
+}
+
+bool AfStorageProxyPrivate::activityMetaData(QVariantHash &metadata, int applicationId, const QString &activityId)
+{
+    CAfEntry *entry = getEntry(applicationId, activityId);
+    
+    if (entry) {
+        metadata = extractMetadata(entry);
+        delete entry;
+        return true;
+    }    
+    
+    return false;
+}
+
+bool AfStorageProxyPrivate::waitActivity()
+{
+    return KErrNone == mClient->waitActivity();
+}
+    
+bool AfStorageProxyPrivate::launchActivity(int applicationId, const QString &activityUri)
+{
+    CAfEntry *entry = createFilterEntry(applicationId, activityUri);
+    int result = mClient->launchActivity(*entry);
+    delete entry;
+    return KErrNone == result;
+}
+
+bool AfStorageProxyPrivate::getThumbnail(const QSize &size, const QString &imagePath, void *userData)
+{
+    HBufC *source = XQConversions::qStringToS60Desc(imagePath);
+    int result = mClient->getThumbnail(TSize(size.width(), size.height()), *source, userData);
+    delete source;
+    return KErrNone == result;
+}
+
+bool AfStorageProxyPrivate::notifyDataChange()
+{
+    return KErrNone == mClient->notifyDataChange();
+}
+
+
+void AfStorageProxyPrivate::waitActivityRequestCompleted(int result, const TDesC8 &data)
+{
+    if (KErrCancel != result) {
+        waitActivity();
+    }
+    if (KErrNone == result) {
+        emit q_ptr->activityRequested(XQConversions::s60Desc8ToQString(data));
+    }
+}
+
+void AfStorageProxyPrivate::getThumbnailRequestCompleted(int result, int bitmapHandle, void *userData)
+{
+    if (KErrNone == result) {
+        CFbsBitmap* bitmap = new CFbsBitmap();
+        if (KErrNone == bitmap->Duplicate(bitmapHandle)) {
+            emit q_ptr->thumbnailRequested(QPixmap::fromSymbianCFbsBitmap(bitmap), userData);
+        }
+        delete bitmap;
+    }
+}
+
+void AfStorageProxyPrivate::dataChangeNotificationCompleted(int result)
+{
+    if (KErrCancel != result) {
+        notifyDataChange();
+    }
+    if (KErrNone == result) {
+        emit q_ptr->dataChanged();
+    }
+}
+ 
+CAfEntry *AfStorageProxyPrivate::createFilterEntry(int applicationId, const QString &activityId)
+{   
+    CAfEntry *entry(0); 
+    QT_TRAP_THROWING(entry = CAfEntry::NewL(0, applicationId, TPtrC(static_cast<const TUint16*>(activityId.utf16())), KNullDesC(), KNullDesC8(), KNullDesC8()));
+    return entry;
+}
+
+CAfEntry *AfStorageProxyPrivate::createSaveEntry(int applicationId, const QString &activityId, const QVariant &activityData, const QVariantHash &metadata)
+{   
+    CAfEntry *entry(0); 
+    
+    QT_TRAP_THROWING(
+        int flags(0);
+        QVariantHash privData;
+        privData.insert(ActivityDataKeyword, activityData);
+        RBuf8 privateBuff;
+        RBuf8 publicBuff;
+        CleanupClosePushL(privateBuff);
+        CleanupClosePushL(publicBuff);
+        privateBuff << privData;
+        publicBuff << metadata;
+        
+        if (metadata.contains(ActivityPersistence) && metadata[ActivityPersistence].toBool()) {
+            flags |= CAfEntry::Persistent;
+        }
+        
+        if (metadata.contains(ActivityVisibility) && !metadata[ActivityVisibility].toBool()) {
+            flags |= CAfEntry::Invisible;
+        }
+        
+        HBufC *actBuff = XQConversions::qStringToS60Desc(activityId);
+        CleanupStack::PushL(actBuff);
+        entry = CAfEntry::NewL(flags, 
+                               applicationId, 
+                               *actBuff, 
+                               KNullDesC, 
+                               privateBuff, 
+                               publicBuff);
+        CleanupStack::PopAndDestroy(actBuff);
+        CleanupStack::PopAndDestroy(&publicBuff);
+        CleanupStack::PopAndDestroy(&privateBuff);
+    );
+    return entry;
+}
+
+CAfEntry *AfStorageProxyPrivate::getEntry(int applicationId, const QString &activityId)
+{
+    CAfEntry *entry = createFilterEntry(applicationId, activityId);
+    CAfEntry *resultEntry(0);
+    int result = mClient->activityData(resultEntry, *entry);
+    delete entry;
+    
+    if (KErrNone != result) {
+        delete resultEntry;
+        resultEntry = 0;
+    }
+    
+    return resultEntry;
+}
+
+QVariantHash AfStorageProxyPrivate::extractMetadata(CAfEntry *entry)
+{
+    QVariantHash metadata;
+    metadata << entry->Data(CAfEntry::Public);
+    metadata.insert(ActivityApplicationKeyword, entry->ApplicationId());
+    metadata.insert(ActivityActivityKeyword, XQConversions::s60DescToQString(entry->ActivityId()));
+    metadata.insert(ActivityScreenshotKeyword, XQConversions::s60DescToQString(entry->ImageSrc()));
+    metadata.insert(ActivityPersistence, (entry->Flags() & CAfEntry::Persistent) ? true : false);
+    metadata.insert(ActivityVisibility, (entry->Flags() & CAfEntry::Invisible) ? false : true); 
+    return metadata;
+}
+