obex/obexprotocol/obex/inc/obexserverstatemachine.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:11:40 +0200
changeset 0 d0791faffa3f
permissions -rw-r--r--
Revision: 201003 Kit: 201005

// Copyright (c) 2005-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:
//

/**
 @file
 @internalComponent
*/


#ifndef OBEX_SERVER_STATE_MACHINE_H
#define OBEX_SERVER_STATE_MACHINE_H

#include <obextypes.h>
#include <obex/internal/obexpacket.h>
#include <obex/transport/obextransportcontrollerbase.h>
#include "obexserveroperationstates.h"
#include "OBEXUTIL.H"
#include "logger.h"

#ifdef __FLOG_ACTIVE
_LIT8(KStateMachineCmpt, "statemachine");

#define STATE_LOG(str) CObexLog::Write(KStateMachineCmpt, str)
#define STATE_LOG_2(str, a, b) CObexLog::WriteFormat(KStateMachineCmpt, str, a, b)
#else
#define STATE_LOG(str)
#define STATE_LOG_2(str, a, b)
#endif

/**
The OBEX Server state machine's context.
This class holds all the state context information and acts
as the interface between CObexServer and the current state
@see TObexServerOperationState
*/
NONSHARABLE_CLASS(CObexServerStateMachine) : public CBase
	{
public:
	enum TObexServerOperationStateEnum
		{
		EDisconnected,
		ETransportConnected,
		EObexConnecting,
		EWaitForUserPassword,
		EReady,
		EPutOpWaitForUser,
		EPutOpReceiveObject,
		EGetOpReceiveSpecification,
		EGetOpWaitForUser,
		EGetOpSendObject,
		ESetPathOp,
		EPutOpFinal,
		EGetOpFinal,
		EDisconnecting,
		EEndOfStates
		};
	
	static CObexServerStateMachine* NewL(CObexServer& aOwner, CObexTransportControllerBase& aTransport);
	~CObexServerStateMachine();
	
	
	// Events
	void ChangeState(TObexServerOperationStateEnum aState);
	void OnPacketReceive(CObexPacket& aPacket);
	void TransportUp();
	void TransportDown();
	void Error();
	TInt RequestNotificationCompleted(CObexBaseObject* aObject);
	TInt RequestNotificationCompleted(TObexResponse aAppResponse);
	TInt RequestCompleteNotificationCompleted(TObexResponse aAppResponse);
	void ConnectionComplete();
	void Start(MObexServerNotifyAsync& aNotify);
	void Stop();
	void OverrideRequestHandling(TObexResponse aResponse);
	void WriteComplete();	
	void ReadActivityDetected();
	
	// Getter/setter functions
	CObexPacket& LastReceivedPacket() const; // no setter needed as is only ever set in OnPacketReceive()
	
	// Object specifiying object to GET
	CObexBaseObject* SpecObject() const; 	// Don't need a setter as we own
	
	// Object returned from Application for GET/PUT
	CObexBaseObject* TransObject() const;
	void SetTransObject(CObexBaseObject* aTransObject);
	
	// Access to CObexServer members
	CObexTransportControllerBase& Transport() const;
	CObexServer& Owner() const;
	MObexServerNotifyAsync& Notification() const;
	
	// Header set for final Put response
	CObexHeaderSet* PutFinalResponseHeaderSet();
	void SetPutFinalResponseHeaderSet(CObexHeaderSet* aHeaderSet);
	CObexHeader* GetHeader(); // don't need setter as we own

	// Call-back used to wrap NotificationComplete event
	void CallBack(TInt (*aFunction)(TAny* aPtr));
	void CancelCallBack();
	TBool IsCallBackActive() const;
	TObexResponse AppResponse() const;
	void SetAppResponse(TObexResponse aAppResponse);

	void ControlledTransportDown();

private:
	CObexServerStateMachine(CObexServer& aOwner, CObexTransportControllerBase& aTransport);
	void ConstructL();
	
private:
	TFixedArray<TObexServerOperationState, EEndOfStates> iStates;	
	TObexServerOperationState* iCurrentState;
	
	CObexPacket* iLastReceivedPacket;
	CObexBaseObject* iSpecObject;
	CObexBaseObject* iTransObject;
	CObexTransportControllerBase& iTransport;
	
	CObexServer& iOwner;
	MObexServerNotifyAsync* iNotification;

	CObexHeaderSet* iPutFinalResponseHeaderSet;
	CObexHeader* iHeader;

	TBool iServerStarted;
	
	CAsyncCallBack* iCallBack;
	TObexResponse iAppResponse;
	TObexServerOperationStateEnum iCurrentStateEnum;
	};

#endif	// OBEX_SERVER_STATE_MACHINE_H