diff -r 000000000000 -r 307788aac0a8 realtimenetprots/rtp/cfrtp/inc/rtpbaseflow.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/rtp/cfrtp/inc/rtpbaseflow.h Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,261 @@ +// 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: +// RTP Base Flow definitions. +// +// + +/** + @file + @internalComponent +*/ + +#ifndef CRTPBASEFLOW_H +#define CRTPBASEFLOW_H + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cfrtphandler.h" + +using namespace ESock; +class ESock::CSubConnectionFlowBase; + +#if defined(_DEBUG) || defined(__RTP_LOG_ACTIVE) + #define KRtpFlowTag KCFNodeTag +_LIT8(KRtpBaseFlowTag, "RtpBaseFlow"); +#endif + + +_LIT (KRtpFlowPanic,"RtpFlowPanic"); + +namespace RtpFlowPanics +{ +enum + { + KPanicNoServiceProvider = 1, + KPanicNoControlProvider = 2, + KPanicNoDataClient = 2, + + KPanicIncorrectMessage = 3, + + KPanicUnexpectedExecutionPath =4, + KPanicIncorrectState = 5, + KPanicPeerMisbehaving = 6, + KPanicIncompleteBuffer = 7, + }; +} +//Fetches out an integer option. Returns if error. +#define GETOPTION_OR_RETURN(optDESC,optVal) do{TInt optRet; optRet = GetOptionFromDesc(optDESC,optVal); \ + if(KErrNone != optRet)return optRet;}while(0) + +class CRtpBaseFlow :public ESock::CSubConnectionFlowBase, public ESock::MFlowBinderControl, + public MSessionControlNotify, MSessionDataNotify,ESock::MSessionData,ESock::MSessionControl,public MRtpDataSender + /** CRtpBaseFlow is the base calss for both RTP and RTCP Flows + + @internalComponent + + **/ + { + + friend class CRtpFlowFactory; + + public: + + // Handling SCPR messages + void StopFlow(TCFDataClient::TStop& aMessage); + void BindToL(TCFDataClient::TBindTo& aBindTo); + void Destroy(); + + void ProcessDCIdleState(); + void CompleteStart(TInt aError); + + TInt iIsStarting; + TUint iStartActivityId:16; + + + //CSubConnectionFlowBase + virtual MFlowBinderControl* DoGetBinderControlL(); + + // MFlowBinderControl Methods + virtual ESock::MSessionControl* GetControlL(TInt aSessionType, ESock::MSessionControlNotify& aSessionControlNotify); + virtual ESock::MSessionData* BindL(ESock::MSessionDataNotify& aNotify); + virtual void Unbind(); + virtual CSubConnectionFlowBase& CloneFlowL(); + virtual CSubConnectionFlowBase* Flow(); + + // APIs From MSessionControl + public: + virtual void ActiveOpen(); + virtual void ActiveOpen(const TDesC8& aConnectionData); + virtual TInt PassiveOpen(TUint aQueueSize); + virtual TInt PassiveOpen(TUint aQueueSize,const TDesC8& aConnectionData); + virtual void AutoBind(); + virtual void LocalName(TSockAddr& anAddr) const; +#ifndef SYMBIAN_STRICT_EXPLICIT_SOCKET_BINDING + virtual TInt SetLocalName(TSockAddr& anAddr); +#else + virtual void SetLocalName(TSockAddr& anAddr); +#endif //SYMBIAN_STRICT_EXPLICIT_SOCKET_BINDING + virtual void RemName(TSockAddr& anAddr) const; + virtual TInt SetRemName(TSockAddr& anAddr); + virtual void Shutdown(MSessionControl::TCloseType option); + virtual void Shutdown(MSessionControl::TCloseType option, const TDesC8& aDisconnectionData); + virtual TInt SecurityCheck(MProvdSecurityChecker* aSecurityChecker); + virtual TInt GetOption(TUint level, TUint name, TDes8 &anOption) const; + virtual TInt SetOption(TUint level, TUint name, const TDesC8 &anOption); + virtual void Ioctl(TUint level, TUint name, TDes8 *anOption); + virtual void CancelIoctl(TUint aLevel, TUint aName); + virtual void Start(); + // END MSessionControl + + public: + //APIs from MSessionData + virtual TUint Write(const TDesC8& aDesc,TUint aOptions, TSockAddr* anAddr = NULL); + virtual TInt Write(RMBufChain& aData, TUint aOptions, TSockAddr* anAddr = NULL )=0; + virtual void GetData(TDes8& aDesc,TUint options,TSockAddr* anAddr=NULL); + virtual TInt GetData(RMBufChain& aData, TUint aLength,TUint aOptions,TSockAddr* anAddr=NULL)=0; + //End MSessionData + + public: + //APIs from MSessionDataNotify + virtual void NewData(TUint aCount); + virtual void CanSend(); + //End MSessionDataNotify + + public: + /* from MSessionControlNotify */ + virtual void ConnectComplete(); + virtual void ConnectComplete(const TDesC8& aConnectData); + virtual void ConnectComplete(CSubConnectionFlowBase& aSSP); + virtual void ConnectComplete(CSubConnectionFlowBase& aSSP,const TDesC8& aConnectData); + + /* From MRtpDataSender */ + virtual void SendData(TDes8& aBuffer,TSockAddr& aRemoteAddr, TInt aFlags, TRequestStatus& aStatus)=0; + + virtual void CanClose(MSessionControlNotify::TDelete aDelete=MSessionControlNotify::EDelete); + virtual void CanClose(const TDesC8& aDisconnectData,MSessionControlNotify::TDelete aDelete=MSessionControlNotify::EDelete); + virtual TInt Error(TInt anError,TUint anOperationMask=MSessionControlNotify::EErrorAllOperations); + virtual void Disconnect(); + virtual void Disconnect(TDesC8& aDisconnectData); + virtual void IoctlComplete(TDesC8* aBuf); + virtual void DisconnectFromListener(CSubConnectionFlowBase& ) + { + return; + } +#ifdef SYMBIAN_STRICT_EXPLICIT_SOCKET_BINDING + //New callback to notify the completion of the asynchrnous call SetLocalName + virtual void SetLocalNameComplete(); +#endif //SYMBIAN_STRICT_EXPLICIT_SOCKET_BINDING + + /* Custom cleaning up */ + virtual void DoCanClose(MSessionControlNotify::TDelete aDelete)=0; + + /* Update Local address*/ + virtual void DoUpdateLocalAddress(const TSockAddr& anAddr)=0; + + virtual TInt DoSetOption(TUint level, TUint name, const TDesC8 &anOption)=0; + virtual TInt DoGetOption(TUint level, TUint name, TDes8 &anOption) const=0; + + virtual ~CRtpBaseFlow(); + + protected: + CRtpBaseFlow(ESock::CSubConnectionFlowFactoryBase& aFactory, const Messages::TNodeId& aSubConnId, ESock::CProtocolIntfBase* aProtocolIntf); + + /* Helper funtion that will send a No Bearer and save the Activity ID */ + TInt HandleProvisionMessage(Messages::TSignatureBase& aMessage); + /* Creates and Sends a provision Done message with the Error Code */ + TInt HandleBindToMessage(Messages::TSignatureBase& aMessage, TInt aErrCode); + /* handles a TError Message from SubConnection */ + TInt HandleError(TInt aErrorCode); + + /* Fetches an option of type T from a descriptor */ + template + inline TInt GetOptionFromDesc(const TDesC8& aOption, T &opt) const + { + if(aOption.Length() < sizeof(T) || aOption.Length() > sizeof(T)) + { + return KErrArgument; + } + TPckgBuf optParams; + optParams.Copy(aOption); + opt = optParams(); + return KErrNone; + } + + /* Fetches an option of type T from a descriptor */ + template + inline TInt CopyOptionToDesc(TDes8& aOption,const T& opt) const + { + if(aOption.Length() < sizeof(T)) + { + return KErrOverflow; + } + // Descriptor containing Option + TPckgBuf optParams(opt); + aOption.Copy(optParams); + return KErrNone; + } + + protected: + ESock::MSessionDataNotify* iSessionDataNotify; + ESock::MSessionControlNotify* iSessionControlNotify; + + // Rtp Buffer + RMBufChain iRtpUpperLayerBuffer, iRtpLowerLayerBuffer; + + MSessionControl* iSSP; + MSessionData* iSSPData; + MFlowBinderControl* iFlowBinder; + Messages::RNodeInterface iServiceProvider; + + /* Incase flows wants to hold on to an Activity */ + TUint iScprActivityId; + + /* Store destination address if connected */ + TSockAddr iDestAddr; + /* Connected already .. thats it */ + TBool iConnected; + + /* We have issued a NoBearer and Waiting for its result */ + TBool iWaitingForBindTo; + + /* We received an imediate ShutDown. When UnBind is called + * shoot ourselves */ + TBool iRecvdImmediateShutDown; + + Messages::RRequestOriginator iStartRequest; + +#ifdef SYMBIAN_STRICT_EXPLICIT_SOCKET_BINDING + TSockAddr iLocalAddress; +#endif //SYMBIAN_STRICT_EXPLICIT_SOCKET_BINDING +}; + + + + +#endif // CRTPBASEFLOW_H + +