diff -r 000000000000 -r af10295192d8 networkcontrol/ipnetworklayer/inc/flow.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/networkcontrol/ipnetworklayer/inc/flow.h Tue Jan 26 15:23:49 2010 +0200 @@ -0,0 +1,262 @@ +/** +* Copyright (c) 2005-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: +* Header file for the Default SubConnection Flow +* +* +*/ + + + +/** + @file deftflow.h +*/ + +#ifndef IPSHIMFLOW_H_INCLUDED_ +#define IPSHIMFLOW_H_INCLUDED_ + +#include +#include +#include +#include +#include +#include + +#if defined __CFLOG_ACTIVE || defined SYMBIAN_TRACE_ENABLE +// CommsDebugUtility logging tags. Use them to enable tracing for ReferenceSCPR +_LIT8(KIPProtoTag1,"IPProto"); +_LIT8(KIPProtoTag2,"IPProtoFlow"); +#endif + +class CIPShimIfBase; +class MNifIfUser; +class CIPShimIncoming; + +class CIPShimSubConnectionFlow; +class CAsyncBinderClose : public CAsyncOneShot +/** +Class used to asyncronously close binders. + +Closing a binder can result in it being destroyed, so this asynchronous callback is +used to avoid destroying a binder in the same stack frame as a binder Error() upcall. +*/ + { +public: + explicit CAsyncBinderClose(CIPShimSubConnectionFlow& aFlow); + void RunL(); + +private: + CIPShimSubConnectionFlow& iFlow; + }; + +class CIPProtoBinder; + +//-===================================================================== +// IPShim PINT and PINT factory +//-===================================================================== +class CIPShimProtocolIntf : public ESock::CProtocolIntfBase +/** +@internalTechnology +*/ + { + friend class CIPShimSubConnectionFlow; + friend class CIPShimIfBase; + +public: + CIPShimProtocolIntf(ESock::CProtocolIntfFactoryBase& aFactory,const Messages::TNodeId& aCprId); + + // from CProtocolIntfBase + virtual void DoFlowCreated(ESock::CSubConnectionFlowBase& aFlow); + virtual void DoFlowBeingDeleted(ESock::CSubConnectionFlowBase& aFlow); + + void OpenRoute(); + void CloseRoute(); + + ~CIPShimProtocolIntf(); + +private: + CIPShimIfBase* FindOrCreateNifL(const TDesC8& aProtocol, const TConnectionInfo& aConnectionInfo); + void NifDisappearing(CIPShimIfBase* aNif); + +private: + RPointerArray iNifs; + }; + +class CIPShimProtocolIntfFactory : public ESock::CProtocolIntfFactoryBase +/** +@internalTechnology +*/ + { +public: + static CIPShimProtocolIntfFactory* NewL(TUid aFactoryId, ESock::CProtocolIntfFactoryContainer& aParentContainer); + virtual ESock::CProtocolIntfBase* DoCreateProtocolIntfL(ESock::TFactoryQueryBase& aQuery); + CIPShimProtocolIntfFactory(TUid aFactoryId, ESock::CProtocolIntfFactoryContainer& aParentContainer); + }; + + +class CIPShimSubConnectionFlow : public ESock::CSubConnectionFlowBase, + public ESock::MFlowBinderControl, + public ESock::MLowerControl +/** +IP Shim flow. + +@internalComponent +*/ + { + friend class CIPShimFlowFactory; + friend class CIPProtoBinder; + +// struct TBinderPair; + + +public: + // Unidirectional internal interface from Binder classes to Flow. + virtual void BinderReady(); + virtual void SendMessageToSubConnProvider(const Messages::TSignatureBase& aCFMessage); + virtual const Messages::TNodeId& GetCommsId(); + void OpenRoute(); + void CloseRoute(); + + // MIpDataMonitoringNotifications + virtual void PostConnDataReceivedThresholdReached(TUint aVolume); + virtual void PostConnDataSentThresholdReached(TUint aVolume); + virtual void PostSubConnDataReceivedThresholdReached(TUint aVolume); + virtual void PostSubConnDataSentThresholdReached(TUint aVolume); + + + void PostClientIdleIfIdle(); + void BinderError(TInt aError, CIPProtoBinder* aIf); + void AsyncBinderClose(); + + + //MFlowBinderControl, + virtual MLowerControl* GetControlL(const TDesC8& aProtocol); + virtual ESock::MLowerDataSender* BindL(const TDesC8& aProtocol, ESock::MUpperDataReceiver* aReceiver, ESock::MUpperControl* aControl); + virtual void Unbind( ESock::MUpperDataReceiver* aReceiver, ESock::MUpperControl* aControl); + virtual CSubConnectionFlowBase* Flow(); + + //MLowerControl + virtual TInt Control(TUint aLevel, TUint aName, TDes8& aOption); + +protected: + // from Messages::ANode + virtual void ReceivedL(const Messages::TRuntimeCtxId& aSender, const Messages::TNodeId& aRecipient, Messages::TSignatureBase& aMessage); + + CIPShimSubConnectionFlow(ESock::CSubConnectionFlowFactoryBase& aFactory, const Messages::TNodeId& aSubConnId, ESock::CProtocolIntfBase* aProtocolIntf); + ~CIPShimSubConnectionFlow(); + ESock::MFlowBinderControl* DoGetBinderControlL(); + + // Functions for processing SCPR messages. + virtual void StartFlowL(); + virtual void StopFlow(TInt aError); + virtual void ProcessProvisionConfigL(); + virtual void Destroy(); + virtual void BindToL(const Messages::TNodeId& aCommsBinder); +#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW + virtual void UpdateIpAddressInfoL(ESock::TCFScpr::TSetParamsRequest& aParamReq); +#else + virtual void UpdateIpAddressInfoL(ESock::TCFScpr::TParamsRequest& aParamReq); +#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW + // Utility functions for sending messages to SCPR + void PostDataClientStartedIfReady(); + void PostDataClientStoppedIfReady(); + void Error(const TInt aError); + + + TInt SetConnectionInfo(const TConnectionInfo& aInfo); + void InitialiseDataMonitoringL(CIPShimIfBase* intf); +private: + static void CleanupBinderListAppend(TAny*); + static void CleanupSignalNewInterface(TAny*); + static void CleanupBindToLower(TAny*); + inline void SetCleanupError(TInt aError); + inline TInt CleanupError(); + + void CreateBinderL(const TDesC8& aProtocol, MFlowBinderControl* aBinderControl); + TInt SetProtocolList(const TDesC8& aProtocolList); + + void MarkAllBindersForClosure(); + inline void MarkBinderForClosure(CIPProtoBinder* aBinder); + void CloseMarkedBinders(); + void SignalInterfaceDownOnAllBinders(TInt aError); + + inline CIPShimProtocolIntf* ProtocolIntf(); + +private: + RPointerArray iBinderList; + TInt iCleanupError; + // iAsyncBinderClose is pre-allocated as KErrNoMemory recovery is complex in the situations it is needed + CAsyncBinderClose iAsyncBinderClose; + TInt iStopCode; + +public: + RBuf8 iConnectionInfo; + TPtrC8 iProtocolList; // pointer to protocol list string in provisioning information + TInt iBindCallCount; + +private: + TBool iBinderReady:1; + TBool iStarting:1; + TBool iStarted:1; + TBool iDestroyPending:1; + }; + + +// ================================================================================= +// +// Other inline methods +// + +void CIPShimSubConnectionFlow::SetCleanupError(TInt aError) + { + iCleanupError = aError; + } + +TInt CIPShimSubConnectionFlow::CleanupError() + { + return iCleanupError; + } + +CIPShimProtocolIntf* CIPShimSubConnectionFlow::ProtocolIntf() + { + ASSERT(iProtocolIntf); + return static_cast(iProtocolIntf); + } + +// ========================================================================================== +// +// Flow Factory +// + +const TInt KIPShimFlowImplUid = 0x10281C36; + +class CIPShimFlowFactory : public ESock::CSubConnectionFlowFactoryBase +/** +IP Shim flow factory. + +@internalComponent +*/ + { +public: + static CIPShimFlowFactory* NewL(TAny* aConstructionParameters); + virtual ESock::CSubConnectionFlowBase* DoCreateFlowL(ESock::CProtocolIntfBase* aProtocolIntf, ESock::TFactoryQueryBase& aQuery); + virtual ESock::CProtocolIntfFactoryBase* CreateProtocolIntfFactoryL(ESock::CProtocolIntfFactoryContainer& aParentContainer); + virtual ~CIPShimFlowFactory(); + +protected: + CIPShimFlowFactory(TUid aFactoryId, ESock::CSubConnectionFlowFactoryContainer& aParentContainer); + + }; + +#endif