diff -r 000000000000 -r dfb7c4ff071f commsfwsupport/commselements/serverden/src/sd_apiextensionregister.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commsfwsupport/commselements/serverden/src/sd_apiextensionregister.cpp Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,102 @@ +// 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: +// SS_APIEXT_REGISTER.CPP +// +// + +#include +#include "sd_std.h" +#include "sd_apiextension.h" +#include "sd_apiextensionregister.h" +#include + + +#ifdef _DEBUG +// Panic category for "absolutely impossible!" vanilla ASSERT()-type panics from this module +// (if it could happen through user error then you should give it an explicit, documented, category + code) +_LIT(KSpecAssert_ElemSvrDenApiXRC, "ElemSvrDenApiXRC"); +#endif + +using namespace Den; +//using namespace Messages; + +TInt CompareApiExtIdentifications(const TApiExtIdentification& aExtItfId1, const TApiExtIdentification& aExtItfId2) + { + return Mem::Compare(aExtItfId1.Ptr(), sizeof(TInt)+sizeof(TInt), aExtItfId2.Ptr(), sizeof(TInt)+sizeof(TInt)); + } + +TApiExtRegister::~TApiExtRegister() + { + //We should not have anything to cleanup here. + //Every session and subsession must close all + //remaining extensions from their destructors. + __ASSERT_DEBUG(iApiExtList.Count()==0, User::Panic(KSpecAssert_ElemSvrDenApiXRC, 1)); //Panic in debug + iApiExtList.Close(); + } + +void TApiExtRegister::CleanupInterfaceRegistration(TAny* aSelf) + { + TApiExtRegister* reg = static_cast(aSelf); + __ASSERT_DEBUG(reg->iClenupInfoExtItfId, User::Panic(KSpecAssert_ElemSvrDenApiXRC, 2)); //We have just added.. + TLinearOrder order(CompareApiExtIdentifications); + TInt index = reg->iApiExtList.FindInOrder(*reg->iClenupInfoExtItfId, order); + __ASSERT_DEBUG(index!=KErrNotFound, User::Panic(KSpecAssert_ElemSvrDenApiXRC, 3)); //We have just added.. + reg->iApiExtList.Remove(index); + } + +void TApiExtRegister::CleanupInterfaceDeregistrationPushL(const TApiExtIdentification& aExtItfId) + { + //Never call this fn twice without a Pop() in between + TLinearOrder order(CompareApiExtIdentifications); + TInt index = iApiExtList.FindInOrder(aExtItfId, order); + __ASSERT_DEBUG(index!=KErrNotFound, User::Panic(KSpecAssert_ElemSvrDenApiXRC, 4)); //We have just added.. + iClenupInfoExtItfId = &iApiExtList[index]; + CleanupStack::PushL(TCleanupItem(TApiExtRegister::CleanupInterfaceRegistration, this)); + } + +void TApiExtRegister::RegisterOpenInterfaceLC(const TApiExtIdentification& aExtItfId) + { + //Never call this fn twice without a Pop() in between + TLinearOrder order(CompareApiExtIdentifications); + TInt index = iApiExtList.FindInOrder(aExtItfId, order); + User::LeaveIfError(index!=KErrNotFound? KErrAlreadyExists : KErrNone); + iApiExtList.InsertInOrderL(aExtItfId, order); + CleanupInterfaceDeregistrationPushL(aExtItfId); + } + +void TApiExtRegister::DeregisterClosedInterface(const TApiExtIdentification& aExtItfId) + { + TLinearOrder order(CompareApiExtIdentifications); + TInt index = iApiExtList.FindInOrder(aExtItfId, order); + __ASSERT_DEBUG(index!=KErrNotFound, User::Panic(KSpecAssert_ElemSvrDenApiXRC, 5)); //UDEB + if (index!=KErrNotFound) + { + iApiExtList.Remove(index); + } + } + +TBool TApiExtRegister::IsOpened(const TApiExtIdentification& aExtItfId) + { + TLinearOrder order(CompareApiExtIdentifications); + return KErrNotFound==iApiExtList.FindInOrder(aExtItfId, order)? + EFalse : ETrue; + } + +const TApiExtIdentification& TApiExtRegister::operator[](TInt aIndex) + { + __ASSERT_DEBUG(aIndex>=0 && aIndex