diff -r 000000000000 -r dfb7c4ff071f datacommsserver/esockserver/inc/es_sap.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/datacommsserver/esockserver/inc/es_sap.h Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,129 @@ +// Copyright (c) 1997-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: +// + +/** + @file + @internalTechnology + @released +*/ + +#if !defined(__ES_SAP_H__) +#define __ES_SAP_H__ + +#define SYMBIAN_NETWORKING_UPS + +#include +#include +#include +#include +#include + +namespace ESock +{ + +class CNetworkFlow : public CSubConnectionFlowBase, protected MSessionData, protected MSessionControl, + protected MFlowBinderControl +/** Service Access Point for SAPs that have a seperate control side. + +Provides transport services to a single protocol. Several of the calls to +CServProviderBase have pre-conditions attached to them - for example +a connection oriented protocol must have its local address set (either by +a SetLocalName() or AutoBind()) before it is opened. If the socket server +calls the CServProviderBase in such an erroneous way, the protocol should panic. + +It also provides an interface towards subconnection providers to allow +SAPs to work with a seperate control path. + +@internalTechnology +@released Since 9.0 */ + { + friend class ProtocolManager; +public: + + IMPORT_C virtual ~CNetworkFlow(); + +protected: + void SetLocalName(TSockAddr& anAddr); + TInt SetRemName(TSockAddr& anAddr); + TUint Write(const TDesC8& aDesc,TUint aOptions, TSockAddr* anAddr); + TInt Write(RMBufChain& aData, TUint aOptions, TSockAddr* anAddr); + void BindToL(const TCFDataClient::TBindTo& aBindTo); + NetInterfaces::TInterfaceControl* FetchInterfaceControlL(TSupportedCommsApiExt aInterfaceId); + +protected: + + virtual MFlowBinderControl* DoGetBinderControlL(); + //MFlowBinderControl + virtual MSessionControl* GetControlL(TInt aSessionType,MSessionControlNotify& aSessionControlNotify); + virtual void Unbind(); + virtual MSessionData* BindL(MSessionDataNotify& aNotify); + virtual CSubConnectionFlowBase* Flow(); //returns its own flow + + TBool IsBoundToSession() const + { + return iSessionControlNotify || iSessionDataNotify; + } + + void ProcessDCIdleState(); + +#ifdef SYMBIAN_NETWORKING_UPS + virtual TBool ActivityRunning() = 0; +#else + inline TBool NoBearerGuard() + { return iNoBearerRunning; } + inline void SetNoBearerGuard() + { iNoBearerRunning = ETrue; } + inline void ClearNoBearerGuard() + { iNoBearerRunning = EFalse; } +#endif + +protected: + IMPORT_C CNetworkFlow(CSubConnectionFlowFactoryBase& aFactory, const Messages::TNodeId& aSubConn, CProtocolIntfBase* aProtocolIntf); + void UpdateDestinationAddress(const TSockAddr& aDest); + +protected: + TSockAddr iLocalAddress; + TSockAddr iRemoteAddress; + + //upper flow + MSessionControlNotify* iSessionControlNotify; + MSessionDataNotify* iSessionDataNotify; + //lower flow + MFlowBinderControl* iLowerFlow; + MLowerControl* iLowerControl; //just to keep the lower flow up + + enum TDCIdleState + { + EClientsPresent = 0, // presumption is we're always created for a client (ie HR or socket) + EIdle = 1, + EIdleSent = 2 + }; + TBool iLocalAddressSet:1; + TBool iRemoteAddressSet:1; + TBool iConnectionInfoSet:1; + TBool iJoinOutstanding:1; + TBool iLeaveOutstanding:1; +#ifndef SYMBIAN_NETWORKING_UPS + TBool iNoBearerRunning:1; // NoBearer msg has been issued to SCPR +#endif + TBool iIsStarted:1; + TDCIdleState iDCIdle:2; + }; + +} //namespace ESock + +#endif // __ES_SAP_H__ + +