mtpfws/mtpfw/inc/cmtpconnection.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 14 Sep 2010 22:52:29 +0300
branchRCL_3
changeset 21 74aa6861c87d
parent 20 4a793f564d72
permissions -rw-r--r--
Revision: 201032 Kit: 201035

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

/**
 @file
 @internalComponent
*/

#ifndef CMTPCONNECTION_H
#define CMTPCONNECTION_H

#include <e32property.h>
#include <e32base.h>
#include <mtp/mmtpconnection.h>
#include <mtp/mtpdataproviderapitypes.h>
#include <mtp/tmtptypeevent.h>
#include <mtp/tmtptyperesponse.h>
#include <mtp/rmtpclient.h>

#include "mmtpconnectionprotocol.h"
#include "rmtpframework.h"
#include "mtpdebug.h"
#include "mtpbuildoptions.hrh"
#include "mtpdebug.h"

class CMTPSession;
class MMTPTransportConnection;
class TRequestStatus;
class TMTPTypeRequest;
class TMTPTypeFlatBase;

#ifdef MTP_CAPTURE_TEST_DATA
class CMTPRequestLogger;
#endif

/** 
Implements the connection level portion of the MTP communication model and 
associated transport layer protocol binding. This class Implements the API 
portion (@see MMTPConnectionProtocol) of the transport layer API/SPI interface 
pair by which MTP framework and transport protocol connections 
(@see MMTPTransportConnection) interact. A unique @see CMTPConnection instance 
is created and bound to each @see MMTPTransportConnection instance that is 
loaded. 

It also implements the data provider layer MTP connection interface 
(@see MMTPConnection) which represents the virtual circuit between data provider 
and the transport layer.
@internalComponent
 
*/
class CMTPConnection : 
    public CBase,
    public MMTPConnection, 
    public MMTPConnectionProtocol
    {
private:

	class CMTPEventLink :
		public CBase
		{
	public:
		CMTPEventLink(const TMTPTypeEvent& aEvent);
		
	public:
		TSglQueLink		iLink;
		TMTPTypeEvent	iEvent;		
		};
    
public:

    static CMTPConnection* NewLC(TUint aConnectionId, MMTPTransportConnection& aTransportConnection);
    ~CMTPConnection();

    void ReceiveDataL(MMTPType& aData, const TMTPTypeRequest& aRequest, TRequestStatus& aStatus);
    void SendDataL(const MMTPType& aData, const TMTPTypeRequest& aRequest, TRequestStatus& aStatus);
    void SendEventL(const TMTPTypeEvent& aEvent);
    void SendResponseL(const TMTPTypeResponse& aResponse, const TMTPTypeRequest& aRequest, TRequestStatus& aStatus);
    IMPORT_C void SessionClosedL(TUint32 aSessionMTPId);
    IMPORT_C void SessionOpenedL(TUint32 aSessionMTPId);
    IMPORT_C TInt GetDataReceiveResult() const;
    TBool ConnectionSuspended();
    void ConnectionResumedL(MMTPTransportConnection& aTransportConnection);
    void TransactionCompleteL(const TMTPTypeRequest& aRequest);
    
public: // From MMTPConnection & MMTPConnectionProtocol

    TUint ConnectionId() const;
    
public: // From MMTPConnection

    TUint SessionCount() const;
    TBool SessionWithMTPIdExists(TUint32 aMTPId) const;
    MMTPSession& SessionWithMTPIdL(TUint32 aMTPId) const;
    TBool SessionWithUniqueIdExists(TUint32 aUniqueId) const;
    MMTPSession& SessionWithUniqueIdL(TUint32 aUniqueId) const;
    TMTPTransactionPhase TransactionPhaseL(TUint32 aMTPSessionId) const;
	void DisconnectionNotifyL();

private: // From MMTPConnectionProtocol

    void ReceivedEventL(const TMTPTypeEvent& aEvent);
    void ReceivedRequestL(const TMTPTypeRequest& aRequest);
    void ReceiveDataCompleteL(TInt aErr, const MMTPType& aData, const TMTPTypeRequest& aRequest);
    void SendDataCompleteL(TInt aErr, const MMTPType& aData, const TMTPTypeRequest& aRequest);
    void SendEventCompleteL(TInt aErr, const TMTPTypeEvent& aEvent);
    void SendResponseCompleteL(TInt aErr, const TMTPTypeResponse& aResponse, const TMTPTypeRequest& aRequest);
    void Unbind(MMTPTransportConnection& aConnection);

private:

    CMTPConnection(TUint aConnectionId, MMTPTransportConnection& aTransportConnection);
    void ConstructL();
  
    void InitiateMTPErrorRecoveryL(const TMTPTypeRequest& aRequest, TUint16 aResponseCode);
    void MTPErrorRecoveryComplete();
    void UnrecoverableMTPError();
    
    void InitiateTransactionCancelL(TInt aSessionIdx);
    
    TUint ActiveSessions() const;
    void CloseAllSessions();
    void CloseSession(TUint aIdx);
    void CompleteCloseConnection();
    CMTPSession& SessionL(const TMTPTypeFlatBase& aDataset, TInt aSessionIdElementNo) const;
    
    static TInt SessionOrder(const TUint32* aL, const CMTPSession& aR);
    static TInt SessionOrder(const CMTPSession& aL, const CMTPSession& aR);
    
    void SetState(TUint aState);
    TUint State() const;
    
    TBool ValidFrameworkRequest(CMTPSession* aSession, TUint aValidStates, TRequestStatus* aStatus);
    
    void RemoveEventsForSession(TUint32 aMTPId);
    
    void EnqueueEvent(CMTPEventLink* aLink);
    void DequeueEvent(CMTPEventLink* aLink);
	void DequeueAllEvents();

/**
  * This method define and attach the property for publishing connection state 
  *  events.
  */
    void DefineConnStatePropertyL(); 

/**
  * This method is to publish various connection state.
  */
    void PublishConnState(TMTPConnStateType aConnState);	

    void ValidateAndPublishConnState(CMTPSession& aSession, TInt aState);
	
    
private: // Owned
  
    enum TStates
        {
        EStateUnknown,
        EStateOpen,
        EStateErrorRecovery,
        EStateErrorShutdown,
        EStateShutdown
        };

    TUint                       iConnectionId;
    RPointerArray<CMTPSession>  iSessions;
    TUint                       iState;
    RMTPFramework               iSingletons;
    TAny*                       iExtendedInterface;
    TMTPTypeResponse 			iResponse;
    TSglQue<CMTPEventLink>		iEventQ;
    TInt 						iPendingEventCount;   
    TInt 						iDataReceiveResult;
    /**
    FLOGGER debug trace member variable.
    */
    __FLOG_DECLARATION_MEMBER_MUTABLE;
    
private: // Not owned

    MMTPTransportConnection*    iTransportConnection;

    //For publishing the connection state.
    RProperty iProperty; 
	
    /**
    Special build, capture request, data phase and responses to disk.
    */
#ifdef MTP_CAPTURE_TEST_DATA 
    CMTPRequestLogger*          iRequestLogger;
#endif
    };
    
#endif // CMTPCONNECTION_H