diff -r 000000000000 -r dfb7c4ff071f commsfwutils/commsbufs/src/commsbufpondop.cpp --- /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 +#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& 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 & 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); + } +