williamr@4: // Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@4: // All rights reserved. williamr@4: // This component and the accompanying materials are made available williamr@4: // under the terms of "Eclipse Public License v1.0" williamr@4: // which accompanies this distribution, and is available williamr@4: // at the URL "http://www.eclipse.org/legal/epl-v10.html". williamr@4: // williamr@4: // Initial Contributors: williamr@4: // Nokia Corporation - initial contribution. williamr@4: // williamr@4: // Contributors: williamr@4: // williamr@4: // Description: williamr@4: // williamr@4: williamr@4: /** williamr@4: @file williamr@4: @internalTechnology williamr@4: @released williamr@4: */ williamr@4: williamr@4: #if !defined(__ES_SAP_H__) williamr@4: #define __ES_SAP_H__ williamr@4: williamr@4: #define SYMBIAN_NETWORKING_UPS williamr@4: williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: williamr@4: namespace ESock williamr@4: { williamr@4: williamr@4: class CNetworkFlow : public CSubConnectionFlowBase, protected MSessionData, protected MSessionControl, williamr@4: protected MFlowBinderControl williamr@4: /** Service Access Point for SAPs that have a seperate control side. williamr@4: williamr@4: Provides transport services to a single protocol. Several of the calls to williamr@4: CServProviderBase have pre-conditions attached to them - for example williamr@4: a connection oriented protocol must have its local address set (either by williamr@4: a SetLocalName() or AutoBind()) before it is opened. If the socket server williamr@4: calls the CServProviderBase in such an erroneous way, the protocol should panic. williamr@4: williamr@4: It also provides an interface towards subconnection providers to allow williamr@4: SAPs to work with a seperate control path. williamr@4: williamr@4: @internalTechnology williamr@4: @released Since 9.0 */ williamr@4: { williamr@4: friend class ProtocolManager; williamr@4: williamr@4: public: williamr@4: williamr@4: IMPORT_C virtual ~CNetworkFlow(); williamr@4: williamr@4: protected: williamr@4: void SetLocalName(TSockAddr& anAddr); williamr@4: TInt SetRemName(TSockAddr& anAddr); williamr@4: TUint Write(const TDesC8& aDesc,TUint aOptions, TSockAddr* anAddr); williamr@4: TInt Write(RMBufChain& aData, TUint aOptions, TSockAddr* anAddr); williamr@4: void BindToL(const TCFDataClient::TBindTo& aBindTo); williamr@4: NetInterfaces::TInterfaceControl* FetchInterfaceControlL(TSupportedCommsApiExt aInterfaceId); williamr@4: williamr@4: protected: williamr@4: williamr@4: virtual MFlowBinderControl* DoGetBinderControlL(); williamr@4: //MFlowBinderControl williamr@4: virtual MSessionControl* GetControlL(TInt aSessionType,MSessionControlNotify& aSessionControlNotify); williamr@4: virtual void Unbind(); williamr@4: virtual MSessionData* BindL(MSessionDataNotify& aNotify); williamr@4: virtual CSubConnectionFlowBase* Flow(); //returns its own flow williamr@4: williamr@4: TBool IsBoundToSession() const williamr@4: { williamr@4: return iSessionControlNotify || iSessionDataNotify; williamr@4: } williamr@4: williamr@4: void ProcessDCIdleState(); williamr@4: williamr@4: williamr@4: protected: williamr@4: IMPORT_C CNetworkFlow(CSubConnectionFlowFactoryBase& aFactory, const Messages::TNodeId& aSubConn, CProtocolIntfBase* aProtocolIntf); williamr@4: void UpdateDestinationAddress(const TSockAddr& aDest); williamr@4: williamr@4: #define SAP_FLAG_FUNCTIONS(name, flag) \ williamr@4: inline TBool name() { return iStateFlags & flag; } \ williamr@4: inline void Set##name() { iStateFlags |= flag; } \ williamr@4: inline void Clear##name() { iStateFlags &= ~flag; } williamr@4: williamr@4: #ifdef SYMBIAN_NETWORKING_UPS williamr@4: virtual TBool ActivityRunning() = 0; williamr@4: #endif williamr@4: williamr@4: williamr@4: protected: williamr@4: TSockAddr iLocalAddress; williamr@4: TSockAddr iRemoteAddress; williamr@4: williamr@4: //upper flow williamr@4: MSessionControlNotify* iSessionControlNotify; williamr@4: MSessionDataNotify* iSessionDataNotify; williamr@4: //lower flow williamr@4: MFlowBinderControl* iLowerFlow; williamr@4: MLowerControl* iLowerControl; //just to keep the lower flow up williamr@4: williamr@4: enum TStateFlag williamr@4: { williamr@4: ELocalAddressSet = 0x00000001, williamr@4: ERemoteAddressSet = 0x00000002, williamr@4: ENoBearerRunning = 0x00000004, williamr@4: EStarted = 0x00000008, williamr@4: EIdle = 0x00000080, williamr@4: EIdleSent = 0x00000100 williamr@4: }; williamr@4: SAP_FLAG_FUNCTIONS(LocalAddressSet, ELocalAddressSet) williamr@4: SAP_FLAG_FUNCTIONS(RemoteAddressSet, ERemoteAddressSet) williamr@4: SAP_FLAG_FUNCTIONS(NoBearerGuard, ENoBearerRunning) williamr@4: SAP_FLAG_FUNCTIONS(Started, EStarted) williamr@4: SAP_FLAG_FUNCTIONS(Idle, EIdle) williamr@4: SAP_FLAG_FUNCTIONS(IdleSent, EIdleSent) williamr@4: williamr@4: TUint iStateFlags; williamr@4: }; williamr@4: williamr@4: } //namespace ESock williamr@4: williamr@4: #endif // __ES_SAP_H__ williamr@4: williamr@4: