--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/commsfwutils/commsbufs/mbufmgr/inc/nifmbuf.h Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,269 @@
+// 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:
+// MBuf Manager Extensions
+//
+
+/**
+@file
+
+MBuf Manager Extensions
+*/
+
+
+#ifndef __NIFMBUF_H__
+#define __NIFMBUF_H__
+
+#ifndef __ES_MBUF_H__
+#include <es_mbuf.h>
+#endif
+
+#ifndef __ES_SOCK_H__
+#include <es_sock.h>
+#endif
+
+
+//
+// Support to use single MBufs for containing C++ objects
+//
+
+class RMBufCell
+/**
+Support to use single MBufs for containing C++ objects
+
+@publishedPartner
+@released
+*/
+ {
+public:
+ IMPORT_C RMBufCell(RMBufCell* aPktHdr);
+ IMPORT_C static TAny* operator new(TUint aSize, TLeave aLeave, TUint aExtra);
+ IMPORT_C static TAny* operator new(TUint aSize, TUint aExtra) __NO_THROW;
+ IMPORT_C static void operator delete(TAny*);
+ static void operator delete(TAny*, TLeave, TUint);
+ static void operator delete(TAny*, TUint);
+ IMPORT_C RMBufCell* CopyL();
+ //
+ inline RMBufCell() {} // to prevent statement has no effect
+ static inline TAny* operator new(TUint aSize, TLeave aLeave)
+ { return RMBufCell::operator new (aSize, aLeave, 0); }
+ static inline TAny* operator new(TUint aSize)
+ { return RMBufCell::operator new (aSize, 0); }
+ inline RMBuf* MBuf();
+ //
+private:
+ RMBuf* iThisMBuf;
+ };
+
+inline RMBuf* RMBufCell::MBuf()
+ { return iThisMBuf; }
+
+class RMBufStreamQ : public RMBufQ
+/**
+MBuf Stream Queue
+@publishedPartner
+@released
+*/
+ {
+public:
+ IMPORT_C RMBufStreamQ();
+ IMPORT_C void TrimStart(TInt aOffset);
+ IMPORT_C void CopyOut(TDes8& aDes);
+ IMPORT_C void CopySegmentL(RMBufChain &aNewChain, TInt aOffset, TInt aLen);
+ IMPORT_C void Append(RMBufChain& aPacket);
+protected:
+ inline RMBufChain& AsRMBufChain() { return *((RMBufChain*)this); }
+protected:
+ // Pointers cache
+ TInt iPosition;
+ RMBuf* iMBuf;
+ TInt iOffset;
+ TInt iLength;
+ };
+
+//
+// Inter-Protocol Information carried in header MBuf
+//
+
+class RMBufPktInfo : public RMBufCell
+/**
+Inter-Protocol Information carried in header MBuf
+
+@publishedPartner
+@released
+*/
+ {
+public:
+ TSockAddr iSrcAddr; //< Source address of packet according to iProtocol
+ TSockAddr iDstAddr; //< Destination address of packet according to protocol
+ TInt iProtocol; //< ID of protocol who is giving you this
+ TInt iLength; //< Actual length of packet
+ TUint iFlags; //< Packet flags
+ };
+
+//
+// Holder for MBuf Chain with inter-protocol header split off
+//
+
+class RMBufPacketBase : public RMBufChain
+/**
+@publishedPartner
+@released
+*/
+ {
+ __DECLARE_CLEANUP
+public:
+ IMPORT_C RMBufPacketBase();
+ IMPORT_C void CopyInfoL(RMBufPacketBase& aNewPkt);
+ IMPORT_C void CopyPackedL(RMBufChain& aPacket);
+ IMPORT_C void Pack();
+ IMPORT_C void SetInfo(RMBufPktInfo* iInfo);
+ IMPORT_C void FreeInfo();
+ IMPORT_C void Free();
+ IMPORT_C void TrimStart(TInt aOffset);
+ IMPORT_C void TrimEnd(TInt aOffset);
+ IMPORT_C RMBufPktInfo* Unpack();
+ IMPORT_C RMBufPktInfo* Info();
+ IMPORT_C RMBufPktInfo* PeekInfo();
+ IMPORT_C RMBufPktInfo* NewInfoL(TUint aMBufHdrSize);
+ IMPORT_C RMBufPktInfo* NewInfo(TUint aMBufHdrSize);
+ IMPORT_C static RMBufPktInfo* PeekInfoInChain(RMBufChain& aChain);
+protected:
+ IMPORT_C RMBufPktInfo* CreateL(RMBufQ& aPacket, TInt aLength, TUint aMBufHdrSize);
+ IMPORT_C RMBufPktInfo* CreateL(TInt aLength, TUint aMBufHdrSize);
+ IMPORT_C RMBufPktInfo* CreateL(const TDesC8 &aDesc, TInt aHdrSize, TUint aMBufHdrSize);
+ IMPORT_C RMBufPktInfo* CreateCopyL(const RMBufQ& aPacket, TInt aOffset, TInt aLength, TInt aHdrSize, TUint aMBufHdrSize);
+ IMPORT_C RMBufPktInfo* CreateCopyL(RMBufStreamQ& aStream, TInt aOffset, TInt aLength, TInt aHdrSize, TUint aMBufHdrSize);
+ IMPORT_C RMBufPktInfo* CreateCopyL(const RMBufPktQ& aList, TInt aHdrSize, TUint aMBufHdrSize);
+protected:
+ RMBufPktInfo* iInfo;
+ };
+
+template <class T>
+class RMBufInfoPacketBase : public RMBufPacketBase
+/**
+@publishedPartner
+@released
+*/
+ {
+public:
+ /**
+ Splits off the info header
+ @return the packet info header
+ */
+ inline T* Unpack()
+ { return (T*)RMBufPacketBase::Unpack(); }
+ /**
+ Return pointer to info header
+ @return the info header
+ */
+ inline T* Info()
+ { return (T*)RMBufPacketBase::Info(); }
+ /**
+ Allows the packet info header to be accessed without unpacking
+ @return the packet info header
+ */
+ inline T* PeekInfo()
+ { return (T*)RMBufPacketBase::PeekInfo(); }
+ /**
+ Allows the packet info header to be accessed while still on a packet queue
+ @param aChain the chain to be accessed
+ @return the info header
+ */
+ inline static T* PeekInfoInChain(RMBufChain& aChain)
+ { return (T*)RMBufPacketBase::PeekInfoInChain(aChain); }
+ /**
+ Create an info header
+ @return the info header
+ */
+ inline T* NewInfoL()
+ { return (T*)RMBufPacketBase::NewInfoL(sizeof(T)); }
+ /**
+ Create an info header
+ @return the info header
+ */
+ inline T* NewInfo()
+ { return (T*)RMBufPacketBase::NewInfo(sizeof(T)); }
+ /**
+ Create an empty Class T chain of required header size
+ @param aHdrSize the header size
+ @return the info header
+ */
+ inline T* CreateL(TInt aHdrSize)
+ { return (T*)RMBufPacketBase::CreateL(aHdrSize, sizeof(T)); };
+ /**
+ Create a Class T chain and header from a descriptor
+ @param aDesc the buffer of data
+ @param aHdrSize the header size
+ @return the info header
+ */
+ inline T* CreateL(const TDesC8 &aDesc, TInt aHdrSize=0)
+ { return (T*)RMBufPacketBase::CreateL(aDesc, aHdrSize, sizeof(T)); };
+ /**
+ Create a Class T chain from an received MBuf Queue
+ @param aPacket the MBuf Queue
+ @param aLength the chain length
+ @return the info header
+ */
+ inline T* CreateL(RMBufQ& aPacket, TInt aLength=0)
+ { return (T*)RMBufPacketBase::CreateL(aPacket, aLength, sizeof(T)); };
+ /**
+ Create a Class T chain from an received MBuf Queue
+ @param aPacket the MBuf Queue
+ @param aOffset the offset
+ @param aLength the length of the data to be copied
+ @param aHdrSize the header size
+ @param aMBufHdrSize the MBuf Header Size
+ @return the info header
+ */
+ inline T* CreateCopyL(const RMBufQ& aPacket, TInt aOffset, TInt aLength, TInt aHdrSize=0)
+ { return (T*)RMBufPacketBase::CreateCopyL(aPacket, aOffset, aLength, aHdrSize, sizeof(T)); };
+ /**
+ Create a Class T chain by copying data from a stream queue (basically an RMBufQ)
+ aOffset and aLength specify location in stream queue.
+ @param aStream the stream queue
+ @param aOffset the offset
+ @param aLength the data length
+ @param aHdrSize the header size
+ @return the info header
+ */
+ inline T* CreateCopyL(RMBufStreamQ& aStream, TInt aOffset, TInt aLength, TInt aHdrSize=0)
+ { return (T*)RMBufPacketBase::CreateCopyL(aStream, aOffset, aLength, aHdrSize, sizeof(T)); };
+ /**
+ Build a Class T chain by copying a packet queue list, leaving space on the front
+ for a header. (Very heavily used in PPP option processing).
+ @param aList the packet queue
+ @param aHdrSize the header size
+ @return the info header
+ */
+ inline T* CreateCopyL(const RMBufPktQ& aList, TInt aHdrSize=0)
+ { return (T*)RMBufPacketBase::CreateCopyL(aList, aHdrSize, sizeof(T)); };
+ };
+
+/**
+@publishedPartner
+@released
+*/
+typedef class RMBufInfoPacketBase<RMBufPktInfo> RMBufPacket;
+
+enum TMBufExtPanic
+ {
+ EMbExtPanic_MBufAllocTooBig,
+ EMbExtPanic_HeaderTooBig,
+ EMbExtPanic_PacketHeader,
+ EMbExtPanic_PacketHeaderEmpty
+ };
+
+void MBufExtPanic(TMBufExtPanic aPanic);
+
+#endif