--- /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 <e32base.h>
+#include <e32std.h>
+
+#include <comms-infras/ss_factorycontainermap.h>
+#include <comms-infras/cfperfmetrics.h>
+#include <comms-infras/ss_subconnflow.h>
+#include <cs_subconparams.h>
+#include <comms-infras/ss_flowbinders.h>
+#include <comms-infras/ss_protflow.h>
+#include <comms-infras/nifif.h>
+#include <comms-infras/ss_nodemessages.h>
+#include <in_sock.h>
+#include <comms-infras/commsdebugutility.h>
+#include <es_mbuf.h>
+
+#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 <class T>
+ inline TInt GetOptionFromDesc(const TDesC8& aOption, T &opt) const
+ {
+ if(aOption.Length() < sizeof(T) || aOption.Length() > sizeof(T))
+ {
+ return KErrArgument;
+ }
+ TPckgBuf<T> optParams;
+ optParams.Copy(aOption);
+ opt = optParams();
+ return KErrNone;
+ }
+
+ /* Fetches an option of type T from a descriptor */
+ template <class T>
+ inline TInt CopyOptionToDesc(TDes8& aOption,const T& opt) const
+ {
+ if(aOption.Length() < sizeof(T))
+ {
+ return KErrOverflow;
+ }
+ // Descriptor containing Option
+ TPckgBuf<T> 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
+
+