activityfw/activitydatabase/hsactivitydbserver/s60/src/hsactivitysession_p.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 03 May 2010 12:48:45 +0300
changeset 66 32469d7d46ff
parent 61 8e5041d13c84
permissions -rw-r--r--
Revision: 201015 Kit: 201018

/*
* 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: Application entry point
*
*/
#include "hsactivityserver_p.h"
#include "hsactivitysession_p.h"
#include "hsactivityglobals.h"
#include "hsserializer.h"
#include <qglobal.h>
#include <qpixmap.h>
// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
HsActivitySessionPrivate::HsActivitySessionPrivate(HsActivityDbClientInterface &storage)
    : mStorage(storage), mAppId(KErrNotFound)
{
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
HsActivitySessionPrivate::~HsActivitySessionPrivate()
{
    CancelNotify();
    mData.Close();
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void HsActivitySessionPrivate::ServiceL(const RMessage2 &message)
{
    mActivity.clear();
    mResult.clear();
    mName.clear();

    switch (message.Function()) {
        case AddActivity:
            HandleAddActivityL(message);
            break;
        case UpdateActivity:
            HandleUpdateActivityL(message);
            break;
        case RemoveActivity:
            HandleRemoveActivityL(message);
            break;
        case RemoveApplicationActivities:
            HandleRemoveApplicationActivitiesL(message);
            break;
        case Activities:
            HandleActivitiesL(message);
            break;
        case ApplicationActivities:
            HandleApplicationActivitiesL(message);
            break;
        case LaunchActivity:
            HandleLaunchActivityL(message);
            break;
        case WaitActivity:
            HandleWaitActivityL(message);
            return; //!!!!! This message shouldn't be compleated !!!!!
        case GetThumbnail:
            HandleGetThumbnailL(message);
            break;
        case GetData:
            HandleGetDataL(message);
            break;
        case CancelWait:
            HandleCancelWaitActivity(message);
            break;
        default:
            message.Panic(KErr400, CServer2::EBadMessageNumber);
    }
    message.Complete(KErrNone);
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void HsActivitySessionPrivate::ServiceError(const RMessage2 &message, TInt error)
{
    message.Complete(error);
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void HsActivitySessionPrivate::HandleAddActivityL(const RMessage2 &message)
{
    ReadDataL(message);
    LeaveIfNotZero(mStorage.addActivity(mActivity));
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void HsActivitySessionPrivate::HandleUpdateActivityL(const RMessage2 &message)
{
    ReadDataL(message);
    LeaveIfNotZero(mStorage.updateActivity(mActivity));
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void HsActivitySessionPrivate::HandleRemoveActivityL(const RMessage2 &message)
{
    ReadDataL(message);
    LeaveIfNotZero(mStorage.removeActivity(mActivity));
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void HsActivitySessionPrivate::HandleRemoveApplicationActivitiesL(const RMessage2 &message)
{
    ReadDataL(message);
    LeaveIfNotZero(mStorage.removeApplicationActivities(mActivity));
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void HsActivitySessionPrivate::HandleActivitiesL(const RMessage2 &message)
{
    int errNo(KErrNone);
    QT_TRYCATCH_LEAVING(errNo = mStorage.activities(mResult));
    LeaveIfNotZero(errNo);
    mData << mResult;
    TPckgC<int> dataSize(mData.Size());
    message.WriteL(1, dataSize);
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void HsActivitySessionPrivate::HandleApplicationActivitiesL(const RMessage2 &message)
{
    int errNo(KErrNone);
    ReadDataL(message);
    QT_TRYCATCH_LEAVING(errNo = mStorage.applicationActivities(mResult, mActivity));
    LeaveIfNotZero(errNo);
    mData << mResult;
    TPckgC<int> dataSize(mData.Size());
    message.WriteL(1, dataSize);
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void HsActivitySessionPrivate::HandleLaunchActivityL(const RMessage2 &message)
{
    ReadDataL(message);
    LaunchActivityL();
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void HsActivitySessionPrivate::HandleWaitActivityL(const RMessage2 &message)
{
    ReadDataL(message);
    WaitActivityL(message);
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void HsActivitySessionPrivate::HandleGetThumbnailL(const RMessage2 &message)
{
    ReadDataL(message);
    GetThumbnailL(message);
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void HsActivitySessionPrivate::HandleCancelWaitActivity(const RMessage2& /*message*/)
{
    CancelNotify();
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void HsActivitySessionPrivate::HandleGetDataL(const RMessage2 &message)
{
    message.WriteL(0, mData);
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void HsActivitySessionPrivate::LaunchActivityL()
{
    CServer2 *const server(const_cast<CServer2 *>(Server()));
    if (mActivity.end() == mActivity.find(ActivityApplicationKeyword) ||
            mActivity.end() == mActivity.find(ActivityActivityKeyword)) {
        User::Leave(KErrCorrupt);
    }
    static_cast<HsActivityServerPrivate *>
    (server)->notifyL(mActivity.find(ActivityApplicationKeyword).value().toInt(),
                      mActivity.find(ActivityActivityKeyword).value().toString());
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void HsActivitySessionPrivate::LaunchActivityL(const RMessage2 &message,
        const QString &name)
{
    if (mData.MaxSize() < name.toAscii().length()) {
        mData.ReAlloc(name.toAscii().length());
    }
    mData.Copy(reinterpret_cast<const TUint8*>(name.toAscii().data()),
                                               name.toAscii().length());
    TPckgC<int> dataSize(mData.Size());
    message.WriteL(1, dataSize);
    message.Complete(KErrNone);
}
// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void HsActivitySessionPrivate::WaitActivityL(const RMessage2 &msg)
{
    CServer2 *const server(const_cast<CServer2 *>(Server()));
    if (mActivity.end() == mActivity.find(ActivityApplicationKeyword)) {
        User::Leave(KErrCorrupt);
    }
    mAppId = mActivity.find(ActivityApplicationKeyword).value().toInt();
    static_cast<HsActivityServerPrivate *>
    (server)->waitNotification(mAppId, msg);
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void HsActivitySessionPrivate::GetThumbnailL(const RMessage2 &message)
{
    if (mActivity.constEnd() == mActivity.constFind(ActivityScreenshotKeyword)) {
        User::Leave(KErrGeneral);
    }
    mData << QPixmap(mActivity.constFind(ActivityScreenshotKeyword).value().toString());
    TPckgC<int> dataSize(mData.Size());
    message.WriteL(1, dataSize);
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void HsActivitySessionPrivate::CancelNotify()
{
    if (mAppId != KErrNotFound) {
        CServer2 *const server(const_cast<CServer2 *>(Server()));
        static_cast<HsActivityServerPrivate *>(server)->cancelNotify(mAppId);
        mAppId = KErrNotFound;
    }
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void HsActivitySessionPrivate::CancelNotify(RMessage2 &message)
{
    message.Complete(KErrCancel);
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void HsActivitySessionPrivate::ReadDataL(const RMessage2 &src)
{
    int srcLength = src.GetDesLength(0);
    User::LeaveIfError(srcLength);
    RBuf8 buffer;
    CleanupClosePushL(buffer);
    buffer.CreateL(srcLength);
    src.ReadL(0, buffer, 0);
    if (buffer.Length() != srcLength) {
        User::Leave(KErrCorrupt);
    }
    mActivity << buffer;
    CleanupStack::PopAndDestroy(&buffer);
}

// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
void HsActivitySessionPrivate::LeaveIfNotZero(int errNo)
{
    if (KErrNone != errNo) {
        User::LeaveIfError(errNo);
        User::Leave(KErrGeneral);
    }
}