commsfwsupport/commselements/serverden/src/sd_apiextensionregister.cpp
changeset 0 dfb7c4ff071f
--- /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 <ecom/ecom.h>
+#include "sd_std.h"
+#include "sd_apiextension.h"
+#include "sd_apiextensionregister.h"
+#include <e32base.h>
+
+
+#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<TApiExtRegister*>(aSelf);
+	__ASSERT_DEBUG(reg->iClenupInfoExtItfId, User::Panic(KSpecAssert_ElemSvrDenApiXRC, 2)); //We have just added..
+	TLinearOrder<TApiExtIdentification> 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<TApiExtIdentification> 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<TApiExtIdentification> 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<TApiExtIdentification> 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<TApiExtIdentification> order(CompareApiExtIdentifications);
+	return KErrNotFound==iApiExtList.FindInOrder(aExtItfId, order)?
+		EFalse : ETrue;
+	}
+
+const TApiExtIdentification& TApiExtRegister::operator[](TInt aIndex)
+	{
+	__ASSERT_DEBUG(aIndex>=0 && aIndex<iApiExtList.Count(), User::Panic(KSpecAssert_ElemSvrDenApiXRC, 6));
+	return iApiExtList[aIndex];
+	}
+
+