// Copyright (c) 2006-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:
// Core CPR Activities
// 
//

/**
 @file
 @internalComponent
*/

#ifndef SYMBIAN_CORECPRACTIVITIES_H
#define SYMBIAN_CORECPRACTIVITIES_H

#include <elements/sm_core.h>
#include <comms-infras/ss_corepractivities.h>
#include <comms-infras/corecprstates.h>



namespace CprActivities
{

DECLARE_EXPORT_ACTIVITY_MAP(coreCprActivities)


} //namespace CprActivities

namespace CprDataClientStartActivity
{
typedef MeshMachine::TNodeContext<CCoreConnectionProvider, PRStates::TContext> TContext;

EXPORT_DECLARE_SMELEMENT_HEADER( TNoTagOrNoTagBackward, MeshMachine::TStateFork<TContext>, NetStateMachine::MStateFork, TContext )
	IMPORT_C virtual TInt TransitionTag();
DECLARE_SMELEMENT_FOOTER( TNoTagOrNoTagBackward )

EXPORT_DECLARE_SMELEMENT_HEADER( TStartDataClient, MeshMachine::TStateTransition<TContext>, NetStateMachine::MStateTransition, TContext )
	IMPORT_C virtual void DoL();
DECLARE_SMELEMENT_FOOTER( TStartDataClient )

class CDataClientStartActivity : public MeshMachine::CNodeActivityBase
	{
public:
    static MeshMachine::CNodeActivityBase* NewL(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode)
			{ return new(ELeave) CDataClientStartActivity(aActivitySig, aNode); }

	virtual ~CDataClientStartActivity() {}

public:
	Messages::TClientIter<Messages::TDefaultClientMatchPolicy> iClientIter;

protected:
	IMPORT_C CDataClientStartActivity(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode);
	};

}

namespace CprPriorityUpdateActivity
{
class CPriorityUpdateActivity : public MeshMachine::CNodeParallelActivityBase
	{
public:
	TUint Priority() const
		{
		return iLastPriority;
		}
	void SetPriority(TUint aPriority)
		{
		iLastPriority = aPriority;
		}
	TBool UpdatePriority() const
		{
		return iUpdatePriority;
		}
public:
	EXPORT_DECLARE_SMELEMENT_HEADER( TNoTagOrSendPriorityToCtrlProvider, MeshMachine::TStateFork<CprStates::TContext>, NetStateMachine::MStateFork, CprStates::TContext )
		IMPORT_C virtual TInt TransitionTag();
	DECLARE_SMELEMENT_FOOTER( TNoTagOrSendPriorityToCtrlProvider )

	EXPORT_DECLARE_SMELEMENT_HEADER( TNoTagOrSendPriorityToServProvider, MeshMachine::TStateFork<CprStates::TContext>, NetStateMachine::MStateFork, CprStates::TContext )
		IMPORT_C virtual TInt TransitionTag();
	DECLARE_SMELEMENT_FOOTER( TNoTagOrSendPriorityToServProvider )

	EXPORT_DECLARE_SMELEMENT_HEADER( TUpdatePriorityForServiceProviders, MeshMachine::TStateTransition<CprStates::TContext>, NetStateMachine::MStateTransition, CprStates::TContext )
		IMPORT_C virtual void DoL();
	DECLARE_SMELEMENT_FOOTER( TUpdatePriorityForServiceProvider )

	EXPORT_DECLARE_SMELEMENT_HEADER( TUpdatePriorityForControlProvider, MeshMachine::TStateTransition<CprStates::TContext>, NetStateMachine::MStateTransition, CprStates::TContext )
		IMPORT_C virtual void DoL();
	DECLARE_SMELEMENT_FOOTER( TUpdatePriorityForControlProvider )

protected:
	CPriorityUpdateActivity(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode, TUint aActivitiesCount);
	
protected:
	TBool iUpdatePriority;

private:
	TUint iLastPriority;
	};
}

namespace CprControlClientJoinActivity
{
class CControlClientJoinActivity : public CprPriorityUpdateActivity::CPriorityUpdateActivity
	{
public:
	IMPORT_C static MeshMachine::CNodeActivityBase* NewL(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode);
	IMPORT_C virtual ~CControlClientJoinActivity();

public:

	void SaveJoinMessageData(CprStates::TContext& aContext)
		{
		if (aContext.iMessage.IsMessage<ESock::TCFPeer::TJoinRequest>())
			{
			iSendJoinComplete = ETrue;
			}
		if (aContext.Node().FindClient(aContext.iSender))
			{
			iUpdatePriority = ETrue;
			}
		}

	TBool NeedToSendJoinComplete() const
		{
		return iSendJoinComplete;
		}

public:

	EXPORT_DECLARE_SMELEMENT_HEADER( TAddClientOrUpdatePriority, MeshMachine::TStateFork<CprStates::TContext>, NetStateMachine::MStateFork, CprStates::TContext )
		IMPORT_C virtual TInt TransitionTag();
	DECLARE_SMELEMENT_FOOTER( TAddClientOrUpdatePriority )

	EXPORT_DECLARE_SMELEMENT_HEADER( TNoTagOrSendActive, MeshMachine::TStateFork<CprStates::TContext>, NetStateMachine::MStateFork, CprStates::TContext )
		IMPORT_C virtual TInt TransitionTag();
	DECLARE_SMELEMENT_FOOTER( TNoTagOrSendActive )

	EXPORT_DECLARE_SMELEMENT_HEADER( TSendJoinCompleteIfRequest,  MeshMachine::TStateTransition<CprStates::TContext>, NetStateMachine::MStateTransition, CprStates::TContext )
		IMPORT_C virtual void DoL();
	DECLARE_SMELEMENT_FOOTER( TSendJoinCompleteIfRequest )

private:
	TBool iSendJoinComplete;

protected:
	CControlClientJoinActivity(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode, TUint aActivitiesCount);
	};
}

namespace CprClientLeaveActivity
{
class CClientLeaveActivity : public CprPriorityUpdateActivity::CPriorityUpdateActivity
	{
public:
	IMPORT_C static MeshMachine::CNodeActivityBase* NewL(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode);
	IMPORT_C virtual ~CClientLeaveActivity();

public:
	typedef MeshMachine::TNodeContext<CCoreConnectionProvider, CprStates::TContext> TContext;

	void SaveLeaveMessageData(const TContext& aContext)
		{
		iSendLeaveComplete = aContext.iMessage.IsMessage<ESock::TCFPeer::TLeaveRequest>() ? ETrue: EFalse;
		}
	
	TBool NeedToSendLeaveComplete() const
		{
		return iSendLeaveComplete;

		}
public:
	EXPORT_DECLARE_SMELEMENT_HEADER( TSendLeaveCompleteIfRequest, MeshMachine::TStateTransition<TContext>, NetStateMachine::MStateTransition, TContext )
		IMPORT_C virtual void DoL();
	DECLARE_SMELEMENT_FOOTER( TSendLeaveCompleteIfRequest )

	EXPORT_DECLARE_SMELEMENT_HEADER( TSaveLeaveMessageData, MeshMachine::TStateTransition<TContext>, NetStateMachine::MStateTransition, TContext )
		IMPORT_C virtual void DoL();
	DECLARE_SMELEMENT_FOOTER( TSaveLeaveMessageData )

	DECLARE_AGGREGATED_TRANSITION2(
		TSendLeaveCompleteAndSendDataClientIdleIfNeeded,
		TSendLeaveCompleteIfRequest,
		CoreNetStates::TSendDataClientIdleIfNoClients
		)
	DECLARE_AGGREGATED_TRANSITION3(
		TRemoveClientAndDestroyOrphanedDataClients,
		TSaveLeaveMessageData,
		MeshMachine::TRemoveClient,
		PRStates::TDestroyOrphanedDataClients
		)

private:
	TBool iSendLeaveComplete;

protected:
	CClientLeaveActivity(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode, TUint aActivitiesCount);
	};
}

namespace CprBindToActivity
{
class CCprBindToActivity : public PRActivities::CBindToActivity
	{
protected:
	typedef MeshMachine::TNodeContext<CCoreConnectionProvider, CoreNetStates::TContext> TContext;
public:
	EXPORT_DECLARE_SMELEMENT_HEADER( TSendControlClientJoinRequestWithPriority, MeshMachine::TStateTransition<CCprBindToActivity::TContext>, NetStateMachine::MStateTransition, CCprBindToActivity::TContext )
   		virtual void DoL();
	DECLARE_SMELEMENT_FOOTER( TSendControlClientJoinRequestWithPriority )

protected:
	CCprBindToActivity(const MeshMachine::TNodeActivity& aActivitySig,  MeshMachine::AMMNodeBase& aNode, TInt aNextActivityCount);

// private:
// if you are adding any data here don't forget to override NewL.
	};
}

#endif //SYMBIAN_CORECPRACTIVITIES_H

