cbsref/csyrefplugins/csy27010/inc/PortC32InterfaceBase.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 16:23:08 +0300
branchRCL_3
changeset 65 630d2f34d719
permissions -rw-r--r--
Revision: 201035 Kit: 201035

//
// * Copyright 2004 Neusoft America Inc.
// * All rights reserved.
// * This component and the accompanying materials are made available
// * under the terms of the Eclipse Public License v1.0
// * which accompanies this distribution, and is available
// * at the URL "http://www.eclipse.org/legal/epl-v10.html".
// *
// * Contributors:
// * Keith Collins (Neusoft America Inc.)  original software development and additional code and modifications.
// * Thomas Gahagen (Neusoft America Inc.)  additional code and modifications.
// * Zhen Yuan (Neusoft America Inc.)  additional code and modifications.
// *
// * Description:  This file defines the CPortC32Interface class.  This class
// *               is equivalent to client RComm subsessions. This is derived 
// *               from the C32 base class for ports CPort.
//

// CPortC32InterfaceBase.h
/** @file
 *
 * PortC32InterfaceBase:
 * - Equivalent to client RComm subsessions. This is base class 
 *   derived from the C32 base class for ports CPort.
 */

#ifndef _PORTC32INTERFACEBASE_H__
#define _PORTC32INTERFACEBASE_H__

#include <cs_port.h>
#include "CsyGlobals.h"
#include "Portfactory.h"

class CChannelMgrCmdData;
class CCsyMsgBufBpFrame;

class CPortC32InterfaceBase : public CPort
	{
public:
	virtual ~CPortC32InterfaceBase();

	// from CPort
	virtual void Destruct();
	virtual void StartRead(const TAny* aClientBuffer, TInt aLength);
	virtual void ReadCancel();
	virtual void NotifySignalChange(TUint aSignalMask);
	virtual void NotifySignalChangeCancel();
	virtual void StartWrite(const TAny* aClientBuffer, TInt aLength);
	virtual TInt SetConfig(const TDesC8& aPackage);

	// message passing
	void CompleteWriteRequest(TInt aStatus);
	virtual void SendFrameToClient(CCsyMsgBufBpFrame* aFrame) = 0;


	// utility methods
	void SetMuxChannel(CChannelMgrCmdData* aMuxChannel);
	CChannelMgrCmdData* GetMuxChannel() const;
	TInt GetPortNumber() const;
	CPortFactory::TC32ClientType GetClientType() const;

	void ModemAndCsyToClientFlowCtrl(const TFlowControl aFlowControl);
	void ReceivedV24Signals(const TUint8 aV24Signals);
	TInt SetV24Signals(const TUint aRs232Signals);

	void IncRefCount();
	void CompleteOutstandingRequest();

	// link for parent CPortFactory
	TSglQueLink iLink;

protected:
	CPortC32InterfaceBase(CPortFactory& aPortFactory,
		CPortFactory::TC32PortInfo& aPortInfo);
	void ConstructL();
	void SetDataAvailable();

	void CompleteReadRequest(TInt aStatus);
	virtual TBool ReadFromBufOrQueue() = 0;

	// utility
	void RemoveWaitingAllFrames(TBool aAddToFreeList = ETrue);
	void Shutdown();
	

	// from CPort, but not all are supported by the CSY
	virtual TInt QueryReceiveBuffer(TInt& aLength) const = 0;
	virtual void ResetBuffers(TUint aFlags) = 0;
	virtual void Break(TInt aTime);
	virtual void BreakCancel();
	virtual void WriteCancel();
	virtual TInt GetConfig(TDes8& aPackage) const;
	virtual TInt SetServerConfig(const TDesC8& aPackage);
	virtual TInt GetServerConfig(TDes8& aPackage);
	virtual TInt GetCaps(TDes8& aPackage);
	virtual TInt GetSignals(TUint& aSignals);
	virtual TInt SetSignalsToMark(TUint aSignals);
	virtual TInt SetSignalsToSpace(TUint aSignals);
	virtual TInt GetReceiveBufferLength(TInt& aLength) const;
	virtual TInt SetReceiveBufferLength(TInt aLength);
	virtual void FreeMemory(); 
	virtual void NotifyDataAvailable();
	virtual void NotifyDataAvailableCancel();
	virtual void NotifyConfigChange();
	virtual void NotifyConfigChangeCancel();
	virtual void NotifyFlowControlChange();
	virtual void NotifyFlowControlChangeCancel();
	virtual void NotifyBreak();
	virtual void NotifyBreakCancel();
	virtual void NotifyOutputEmpty();
	virtual void NotifyOutputEmptyCancel();
	virtual TInt GetFlowControlStatus(TFlowControl& aFlowControl);
	virtual TInt GetRole(TCommRole& aRole);
	virtual TInt SetRole(TCommRole aRole);

protected:

	// List of frames waiting to be read by the client
	TSglQue<CCsyMsgBufBpFrame>		iFramesWaitingToBeReadList;
	TSglQueIter<CCsyMsgBufBpFrame>	iFramesWaitingToBeReadIter;

	// attributes
	TCommRole						iRole;
	TCommConfigV01					iConfig;
	CPortFactory&					iPortFactory;

	CPortFactory::TC32PortInfo		iPortInfo;
	CChannelMgrCmdData*				iMuxChannel;

	// Pointer to client's read buffer when there is a read outstanding.
	// (This is the way C32 transfers messages from clients to CSYs.)
	TAny*							iClientBuffer;
	TInt							iClientLength;
	TInt							iPos;
	TBool							iOneOrMore;

	TFlowControl					iCsyAllowedToSendFrames;
	TBool							iFlowControlNotifyPending;

	TUint							iSignals;
	TUint							iSentSignals;
	TUint							iSignalMask;
	TBool							iSignalChangeNotifyPending;

	TBool							iDataAvailableNotifyPending;

	TBool							iIsWriteInProgress;
	TBool							iIsReadInProgress;
	};


// Inline methods
inline CChannelMgrCmdData* CPortC32InterfaceBase::GetMuxChannel() const
/**
 * Return a pointer to the mux channel associated with this C32 port.
 *
 * @return Pointer to the mux channel associated with this C32 port
 */
	{
	return iMuxChannel;
	}

inline CPortFactory::TC32ClientType CPortC32InterfaceBase::GetClientType() const
/**
 * Return the client type (command or data) for this C32 port.
 *
 * @return Client type command or data
 */
	{
	return iPortInfo.iClientType;
	}

inline TInt CPortC32InterfaceBase::GetPortNumber() const
/**
 * Return the port number for this C32 port.
 *
 * @return Port number
 */
	{
	return iPortInfo.iPortNumber;
	}

inline void CPortC32InterfaceBase::IncRefCount()
/**
 * Increment the reference count for this object.
 */
	{
	Inc();
	};

#endif  // _PORTC32INTERFACEBASE_H__