layouts/cdl/CdlEngine/src/CdlChangeObserver.cpp
changeset 0 05e9090e2422
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/layouts/cdl/CdlEngine/src/CdlChangeObserver.cpp	Thu Dec 17 09:14:12 2009 +0200
@@ -0,0 +1,201 @@
+/*
+* 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 "CdlChangeObserver.h"
+#include "CCdlEngine.h"
+
+const TInt KCdlGranularity = 4;
+
+
+//
+// CCdlChangeMonitor
+//
+
+CCdlChangeMonitor::CCdlChangeMonitor(RCdlSession& aServer, CCdlEngine* aEngine)
+: CActive(EPriorityStandard), iServer(aServer), iEngine(aEngine)
+	{
+	CActiveScheduler::Add(this);
+	Queue();
+	}
+
+CCdlChangeMonitor::~CCdlChangeMonitor()
+	{
+	Cancel();
+	}
+
+void CCdlChangeMonitor::Queue()
+	{
+	iServer.NotifyChange(iStatus, iChange);
+	SetActive();
+	}
+
+void CCdlChangeMonitor::RunL()
+	{
+	if (iStatus == KErrNone)
+		Queue();
+
+	TRAP_IGNORE(ProcessL());
+	}
+
+void CCdlChangeMonitor::ProcessL()
+	{
+	switch (iChange().iType)
+		{
+		case SCdlServerChange::EGlobalCustomisation:
+			iEngine->HandleGlobalCustomisationChangeL(iChange().iSize);
+			break;
+
+		case SCdlServerChange::EAvailableRefs:
+			iEngine->HandleAvailableRefsChangeL();
+			break;
+
+		default:
+			Panic(ECdlEngPanic_BadChangeType);
+			break;
+		}
+	}
+
+void CCdlChangeMonitor::DoCancel()
+	{
+	iServer.CancelNotifyChange();
+	}
+
+
+//
+// CCdlChangeObserver
+//
+
+CCdlChangeObserver* CCdlChangeObserver::NewLC(MCdlChangeObserver* aObserver, TUid aUid)
+	{
+	CCdlChangeObserver* self = new(ELeave) CCdlChangeObserver;
+	CleanupStack::PushL(self);
+	self->iObserver = aObserver;
+	self->AddUidL(aUid);
+	return self;
+	}
+
+CCdlChangeObserver* CCdlChangeObserver::NewLC(MCdlChangeObserver* aObserver)
+	{
+	CCdlChangeObserver* self = new(ELeave) CCdlChangeObserver;
+	CleanupStack::PushL(self);
+	self->iObserver = aObserver;
+	return self;
+	}
+
+CCdlChangeObserver::~CCdlChangeObserver()
+	{
+	}
+
+MCdlChangeObserver* CCdlChangeObserver::Observer() const
+	{
+	return iObserver;
+	}
+
+void CCdlChangeObserver::AddUidL(TUid aUid)
+	{
+	iUids.AddL(aUid);
+	}
+
+void CCdlChangeObserver::HandleCustomisationChangeL(const CCdlUids& aUids)
+	{
+	CCdlUids* change = iUids.IntersectionLC(aUids);
+	if (change->Count())
+		iObserver->HandleCustomisationChangeL(*change);
+	CleanupStack::PopAndDestroy(change);
+	}
+
+void CCdlChangeObserver::HandleAvailableRefsChangeL()
+	{
+	iObserver->HandleAvailableRefsChangeL();
+	}
+
+
+//
+// CCdlChangeObservers
+//
+
+CCdlChangeObservers::CCdlChangeObservers()
+: iObservers(KCdlGranularity)
+	{
+	}
+
+CCdlChangeObservers::~CCdlChangeObservers()
+	{
+	iObservers.ResetAndDestroy();
+	}
+
+void CCdlChangeObservers::AddCustomisationChangeObserverL(MCdlChangeObserver* aObserver, TUid aUid)
+	{
+	TInt index = FindIndex(aObserver);
+	if (index == KErrNotFound)
+		{
+		iObservers.AppendL(CCdlChangeObserver::NewLC(aObserver, aUid));
+		CleanupStack::Pop();
+		}
+	else
+		{
+		iObservers[index]->AddUidL(aUid);
+		}
+	}
+
+void CCdlChangeObservers::AddGeneralChangeObserverL(MCdlChangeObserver* aObserver)
+	{
+	TInt index = FindIndex(aObserver);
+	if (index == KErrNotFound)
+		{
+		iObservers.AppendL(CCdlChangeObserver::NewLC(aObserver));
+		CleanupStack::Pop();
+		}
+	}
+
+void CCdlChangeObservers::RemoveChangeObserver(MCdlChangeObserver* aObserver)
+	{
+	TInt index = FindIndex(aObserver);
+	if (index != KErrNotFound)
+		{
+		delete iObservers[index];
+		iObservers.Delete(index);
+		}
+	}
+
+void CCdlChangeObservers::HandleCustomisationChangeL(const CCdlUids& aUids)
+	{
+	TInt count = iObservers.Count();
+	for (TInt ii=0; ii<count; ii++)
+		{
+		iObservers[ii]->HandleCustomisationChangeL(aUids);
+		}
+	}
+
+void CCdlChangeObservers::HandleAvailableRefsChangeL()
+	{
+	TInt count = iObservers.Count();
+	for (TInt ii=0; ii<count; ii++)
+		{
+		iObservers[ii]->HandleAvailableRefsChangeL();
+		}
+	}
+
+TInt CCdlChangeObservers::FindIndex(MCdlChangeObserver* aObserver) const
+	{
+	TInt count = iObservers.Count();
+	for (TInt ii=0; ii<count; ii++)
+		{
+		if (iObservers[ii]->Observer() == aObserver)
+			return ii;
+		}
+	return KErrNotFound;
+	}