commsfwutils/commsbufs/src/commsbufpondop.cpp
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commsfwutils/commsbufs/src/commsbufpondop.cpp	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,84 @@
+// Copyright (c) 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:
+//
+
+#include "es_commsbuf_internal.h"
+#include <comms-infras/commsbufpondop.h>
+#include "commsbufpondintf.h"
+#include "systemsharedbufs.h"
+
+EXPORT_C RCommsBufPondOp::RCommsBufPondOp()
+	{
+	}
+
+/**
+Opens the CommsBuf pond with the supplied pool information. An array of pools 
+will be created. The pool information will be typically read from c32start.ini
+
+@aPoolInfo	An array of pool creation information 
+
+@return KErrNoMemory on failure otherwise KErrNone
+*/
+EXPORT_C TInt RCommsBufPondOp::Open(RArray<TCommsBufPoolCreateInfo>& aPoolInfo, TInt aMaxMBufSize /* =0 */)
+	{
+	// Do not allow multiple opens.
+	__ASSERT_ALWAYS(Dll::Tls() == NULL, CommsBuf::Panic(EMBuf_AlreadyInit));  // Probably this panic code is not good?
+	
+	// Check whether we do have a mbuf mgr implemenation (leagcy)
+	_LIT ( KMBufMgrImplDllName, "mbufmgrimpl.dll");		
+	RLibrary lib;
+	if (lib.Load(KMBufMgrImplDllName) == KErrNone)
+		{
+		typedef MCommsBufPondIntf*(* TMBufMgrNew)(RArray <TCommsBufPoolCreateInfo>& aPoolInfo, RLibrary& aLibrary, TInt aMaxMBufSize);
+
+		// ok We do have the library. We will get the first function ordinal via 
+		// lookup and initialize the MBufmgr.			
+		TMBufMgrNew libFn = (TMBufMgrNew)lib.Lookup(1); // We have only one export in the MBufmgr which CMBufManager::New
+		iPondImpl = libFn(aPoolInfo, lib, aMaxMBufSize);		
+		}
+	else
+		{
+		iPondImpl = CSystemSharedBufPond::New(aPoolInfo);
+		}
+	if (iPondImpl == NULL )
+		return KErrNoMemory;
+	
+	TCommsBufPondTLSOp tlsOp(*this);
+	tlsOp.Set();
+	return KErrNone;
+	}
+
+EXPORT_C void RCommsBufPondOp::Close()
+	{	
+	RLibrary lib;
+	if(iPondImpl)
+		iPondImpl->Release(lib);
+	Dll::SetTls(NULL);
+	iPondImpl = NULL;	
+	lib.Close();
+	}
+
+
+EXPORT_C void TCommsBufPondTLSOp::Set()
+	{
+	Dll::SetTls(iPond.iPondImpl);
+	iPond.iPondImpl->SetContext();				
+	}
+
+EXPORT_C RCommsBufPond TCommsBufPondTLSOp::Get()
+	{
+	MCommsBufPondIntf* impl = STATIC_CAST(MCommsBufPondIntf*, Dll::Tls());
+	return RCommsBufPond(impl);		
+	}
+