mtptransports/mtpptpiptransport/ptpipplugin/src/cptpipeventhandler.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 19 Mar 2010 09:40:39 +0200
changeset 17 aabe5387f5ce
parent 0 d0791faffa3f
child 47 63cf70d3ecd8
permissions -rw-r--r--
Revision: 201005 Kit: 201011

// Copyright (c) 2008-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:
// ceventhandler.cpp
// 
//

/**
 @internalComponent
*/

#include "cptpipeventhandler.h"
#include "tptpipinitevtack.h"
#include "ptpippanic.h"

__FLOG_STMT(_LIT8(KComponent,"CEventHandler");) 

/**
Creates the channel for commands. The base class constructl is called. 
*/
CPTPIPEventHandler* CPTPIPEventHandler::NewL(CPTPIPConnection& aConnection)
	{
	
	CPTPIPEventHandler* self = new(ELeave) CPTPIPEventHandler(aConnection);
	CleanupStack::PushL(self);
#ifdef __FLOG_ACTIVE    
    self->ConstructL(KComponent);
#else
    self->ConstructL();
#endif
	CleanupStack::Pop();
	return self;
	}

/**
Destructor
*/
CPTPIPEventHandler::~CPTPIPEventHandler()
	{
	__FLOG(_L8("Destructor - Entry"));
	__FLOG(_L8("Destructor - Exit"));
	}

/**
Constructor
*/
CPTPIPEventHandler::CPTPIPEventHandler(CPTPIPConnection& aConnection): 
	CPTPIPSocketHandlerBase(aConnection, CActive::EPriorityUserInput )
	{
	}

/**
Sends the init ack packet, which is created in the connection class. 
@param aEvtAck The packet containing the event acknowledgement to be sent to initiator.
*/
void CPTPIPEventHandler::SendInitAck(CPTPIPGenericContainer* aEvtAck)
	{
	__FLOG(_L8("SendInitAck - Entry"));
	iChunkStatus = aEvtAck->FirstReadChunk(iSendChunkData);
	iSendData.Set(iSendChunkData);
	iSocket.Send(iSendData,0,iStatus);
	SetState(EInitSendInProgress);
	SetActive();
	__FLOG(_L8("SendInitAck - Exit"));
	}

/**
Initiates the sending of the event data over the event channel. The base class
 implements the handling of the socket to send the actual data. 
@param aData The buffer containing the event which is created by the framework to send to the initiator
*/
void CPTPIPEventHandler::SendEventL(const MMTPType& aEvent)
    {
	__FLOG(_L8("SendEventL - Entry"));
	
	// We need to stop listening, and send the event. 
	Cancel();
	
    SendDataL(aEvent, 0);
	__FLOG(_L8("SendEventL - Exit"));
    }

/**
Signals the completion of sending data over the socket, which was started by 
SendEventL. It is called by the base sockethandler and in turn informs the 
connection.
@param aError - The error if any returned by the sockethandler. (KErrNone if no errors)
@param aSource - The event buffer which had been given by the framework to send to initiator.
*/
void CPTPIPEventHandler::SendDataCompleteL(TInt aError, const MMTPType& aSource)
    {
	__FLOG(_L8("SendDataCompleteL - Entry"));
    Connection().SendEventCompleteL(aError, aSource);
	__FLOG(_L8("SendDataCompleteL - Exit"));
    }

/**
Initiates the receiving of the event data on the event channel. 
@param aEvent The buffer containing the event received from the initiator
*/
void CPTPIPEventHandler::ReceiveEventL(MMTPType& aEvent)
    {
	__FLOG(_L8("ReceiveEventL - Entry"));
    ReceiveDataL(aEvent);
	__FLOG(_L8("ReceiveEventL - Exit"));
    }

/**
Marks the completion of receiving data over the event channel, which was started 
by ReceiveEventL. It is called by the base sockethandler and in turn informs the
connection.
@param aError - The error if any returned by the sockethandler. (KErrNone if no errors)
@param aSink - The event buffer in which an event has been received from the initiator
*/
void CPTPIPEventHandler::ReceiveDataCompleteL(TInt aError, MMTPType& aSink)
    {
	__FLOG(_L8("ReceiveDataCompleteL - Entry"));
    Connection().ReceiveEventCompleteL(aError, aSink); 
	__FLOG(_L8("ReceiveDataCompleteL - Exit"));
    }

/**
Parses the PTPIP header, gets and validates that the packet type is correct 
and sets the value of the packet length.
@return Type The PTPIP packet type received ie event or cancel. In case of invalid type, it returns 0
*/   
TInt CPTPIPEventHandler::ParsePTPIPHeaderL()
	{
	__FLOG(_L8("ParsePTPIPHeaderL - Entry"));
	
	TUint32 type = Connection().ValidateAndSetEventPayloadL();
	iPTPPacketLength = Connection().EventContainer()->Uint32L(CPTPIPGenericContainer::EPacketLength);
	
	__FLOG(_L8("ParsePTPIPHeaderL - Exit"));
	return type;
	}

/**
Called during the PTP connection establishment phase to mark the completion 
of sending the init ack to the initiator
@return Flag stating that the ini has been sent successfully.
*/
TBool CPTPIPEventHandler::HandleInitAck()
	{
	__FLOG(_L8("HandleInitAck - Entry"));
	TBool isHandled(EFalse);
	
	if (iState == EInitSendInProgress)
		{
		//Now signal the connection, set its state and set it to active.
		Connection().SetConnectionState(CPTPIPConnection::EInitialisationComplete);
		Connection().CompleteSelf(iStatus.Int());
		iState = EIdle;
		isHandled = ETrue;
		}
	__FLOG(_L8("HandleInitAck - Exit"));
	return isHandled;
	}