activityfw/activitydatabase/hsactivitydbserver/s60/src/hsactivitysession_p.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 16 Apr 2010 15:16:09 +0300
changeset 61 8e5041d13c84
child 66 32469d7d46ff
permissions -rw-r--r--
Revision: 201011 Kit: 201015

/*
* 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>

const char ActivityPrimaryKeyFormat [] = "%1:%2";
// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
//
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();
    
    int errNo(KErrNone);
    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 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::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::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);
    }
}