diff -r 000000000000 -r af10295192d8 networkprotocols/tcpipv4v6prt/inc/in_trans.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/networkprotocols/tcpipv4v6prt/inc/in_trans.h Tue Jan 26 15:23:49 2010 +0200 @@ -0,0 +1,186 @@ +// Copyright (c) 2006-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: +// in_trans.h - transport layer protocol base +// + + + +/** + @internalComponent +*/ +#ifndef __IN_TRANS_H__ +#define __IN_TRANS_H__ + +#include "inet.h" +#include "inet6log.h" + + +#define SYMBIAN_NETWORKING_UPS + +enum TProviderMatchEnum + { + EMatchNone, + EMatchLocalPort, + EMatchServerUnspecAddr, + EMatchServerSpecAddr, + EMatchExact, + EMatchConnection = EMatchExact + }; + + +class CProviderInet6Transport; +class CProtocolInet6Transport : public CProtocolInet6Base + { +public: + CProtocolInet6Transport(); + ~CProtocolInet6Transport(); + + CProtocolInet6Transport& operator=(const CProtocolInet6Transport&); // Sugar + virtual void InitL(TDesC& aTag); + virtual void BindL(CProtocolBase *protocol, TUint id); + virtual void StartL(); + virtual TInt Send(RMBufChain &aPacket,CProtocolBase* aSourceProtocol=NULL); +#ifndef SYMBIAN_STRICT_EXPLICIT_SOCKET_BINDING + virtual CProviderInet6Transport* LocateSap(TProviderMatchEnum aRank, TUint aFamily, + const TInetAddr& aLocalAddr, + const TInetAddr& aRemoteAddr = TInetAddr(), + CProviderInet6Base *aSap = NULL); +#else +virtual CProviderInet6Transport* LocateSap(TProviderMatchEnum aRank, TUint aFamily, + const TInetAddr& aLocalAddr, + const TInetAddr& aRemoteAddr = TInetAddr(), + CProviderInet6Base *aSap = NULL,TUint32 aSourceIfIndex = 0); +#endif //SYMBIAN_STRICT_EXPLICIT_SOCKET_BINDING + virtual TUint AssignAutoPort(); + + inline TUint Random(TUint aMax) { return (TUint)Math::Rand(iSeed) % aMax; } + +#ifdef _LOG + virtual void LogProviders(TUint aPort); +#endif + + TInt GetIniValue(const TDesC &aSection, const TDesC &aName, + TInt aDefault, TInt aMin, TInt aMax, TBool aBoundMode = EFalse) const; + +private: + TInt64 iSeed; + }; + +#ifdef SYMBIAN_NETWORKING_UPS +class MProviderBindings : public MInetBase + { + public: + virtual TBool HasSocket() = 0; + }; + +const TUint KApiVer_MProviderBindings = 0; + +class CProviderInet6Transport : public CProviderInet6Base, public MProviderBindings +#else +class CProviderInet6Transport : public CProviderInet6Base +#endif + { + friend class CProtocolInet6Transport; + +public: + CProviderInet6Transport(CProtocolInet6Base *aProtocol); + virtual ~CProviderInet6Transport(); + + virtual void LocalName(TSockAddr &anAddr) const; + virtual TInt SetLocalName(TSockAddr &anAddr); + virtual void RemName(TSockAddr &anAddr) const; + virtual TInt SetRemName(TSockAddr &anAddr); + virtual void AutoBind(); + virtual TInt SetOption(TUint aLevel, TUint aName, const TDesC8& aOption); + virtual TInt GetOption(TUint aLevel, TUint aName, TDes8& aOption) const; + + virtual void CanSend(); + virtual void Error(TInt aError, TUint aOperationMask = MSocketNotify::EErrorAllOperations); + CProtocolInet6Transport* Protocol() const { return (CProtocolInet6Transport*)iProtocol; } + virtual void IcmpError(TInt aError, TUint aOperationMask, TInt aType, TInt aCode, + const TInetAddr& aSrcAddr, const TInetAddr& aDstAddr, const TInetAddr& aErrAddr); + +#ifdef SYMBIAN_NETWORKING_UPS + TBool HasSocket(); + void *GetApiL(const TDesC8& aApiName, TUint* aVersion); +protected: + TBool ConnectionInfoSet(); +#endif +protected: + + struct TSockFlags + { + TUint16 iRecvClose:1; + TUint16 iSendClose:1; + TUint16 iConnected:1; + TUint16 iFlowStopped:1; + TUint16 iReuse:1; + TUint16 iAttached:1; // If true, ESock has a pointer to this socket + TUint16 iNotify:1; // If true, we can notify ESock of events +// TUint16 iRawMode:1; // If true, user received UDP packets with IP header +// TUint16 iHeaderIncluded:1; // If true, user sends UDP packets with IP header + TUint16 iReportIcmp:1; // If true, report ICMP errors to application +// TUint16 iSynchSend:1; // If true, block socket write to UDP socket in PENDING and HOLD states + TUint16 iAddressSet:1; // If true, application has bound the socket to a specific IP address + } iSockFlags; + TUint iAppFamily; + TUint iSockFamily; +// UPS support +#ifdef SYMBIAN_NETWORKING_UPS + TUint iConnectionInfoReceived:1; +#endif + }; + +class RMBufSockQ : public RMBufChain + { +public: + void AppendL(const TDesC8& aData, TInt aLength); + TInt AppendDes(const TDesC8& aData, TInt aLength); + TInt AppendAtLeast(RMBufChain& aChain, TInt aLength); + TInt RemoveAtMost(RMBufChain& aChain, TInt aLength); + static inline RMBufSockQ& Cast(RMBufChain& aChain) { return (RMBufSockQ&)aChain; } + }; + +class TDualBufPtr + { +private: + enum BufferTypeEnum { ENone, ERMBufChain, EDes8, EDesC8 }; + +public: + TDualBufPtr(); + TDualBufPtr(RMBufChain& aChain) : iType(ERMBufChain), iChain(&aChain) { } + TDualBufPtr(TDes8& aDesc) : iType(EDes8), iDesc(&aDesc) { } + TDualBufPtr(const TDesC8& aDesc) : iType(EDesC8), iDescC(&aDesc) { } + + void CopyInL(const RMBufChain& aQueue, TInt aOffset, TInt aLength); + TInt CopyIn(const RMBufChain& aQueue, TInt aOffset, TInt aLength); + void CopyOut(RMBufChain& aChain, TInt aOffset) const; + TInt Consume(RMBufChain& aQueue, TInt aLength, RMBufAllocator& aAllocator); + TInt AppendL(RMBufChain& aQueue, TInt aLength); + TInt Append(RMBufChain& aQueue, TInt aLength); //ASSERTS if used with Des type + void Free(); + + inline TInt Length() const { return (iType == ERMBufChain) ? (iChain->IsEmpty() ? 0 : iChain->Length()) : iDesc->Length(); } + +private: + union + { + RMBufChain *iChain; + TDes8 *iDesc; + const TDesC8 *iDescC; + }; + BufferTypeEnum iType; + }; + +#endif