applayerpluginsandutils/bookmarksupport/src/bkmrkfolder.cpp
changeset 0 b16258d2340f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerpluginsandutils/bookmarksupport/src/bkmrkfolder.cpp	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,280 @@
+// Copyright (c) 2005-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:
+// Internal class for manipulating the bookmark folders.
+// @internalComponent
+// 
+//
+
+#include "bkmrk.h"
+#include "bkmrkfolder.h"
+#include "bkmrkdb.h"
+#include "repository.h"
+
+CBookmarkFolder* CBookmarkFolder::NewL(CBookmarkFolder* aParent, CBookmarkDb& aDb)
+	{
+	CBookmarkFolder* self = new (ELeave) CBookmarkFolder(aDb);
+	CleanupStack::PushL(self);
+	self->ConstructL(aParent);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CBookmarkFolder::CBookmarkFolder(CBookmarkDb& aDb)
+	: CBookmarkBase(aDb, aDb.FolderRepository())
+	{
+	}
+
+CBookmarkFolder::~CBookmarkFolder()
+	{
+	Reset();
+
+	delete iTitle;
+	delete iProperties;
+	}
+
+void CBookmarkFolder::DeleteL()
+	{
+	TInt index = iChildren.Count() - 1;
+	for (;index >= 0; --index)
+		{
+		// there should be no open handles to any bookmarks
+		__ASSERT_ALWAYS(iChildren[index]->RefCount() == 0,
+						User::Panic(Bookmark::KBookmarkErrOpenHandles, KErrGeneral));
+		iChildren[index]->DeleteL();
+		}
+	iChildren.Reset();
+
+	iDatabase.RemoveFolderL(this);
+  	iParent->Remove(*this);
+  	iParent = NULL;
+
+	iStatus = EStatusDeleted;
+	}
+
+void CBookmarkFolder::Reset()
+	{
+	TInt index = iChildren.Count() - 1;
+	for (;index >= 0; --index)
+		{
+		// there should be no open handles to any bookmarks
+		__ASSERT_ALWAYS(iChildren[index]->RefCount() == 0,
+						User::Panic(Bookmark::KBookmarkErrOpenHandles, KErrGeneral));
+		delete iChildren[index];
+		}
+	iChildren.Reset();
+	}
+
+void CBookmarkFolder::ConstructL(CBookmarkFolder* aParent)
+	{
+	if (aParent)
+		{
+		aParent->AppendL(*this);
+		}
+	}
+
+Bookmark::TType CBookmarkFolder::Type() const
+	{
+	return Bookmark::ETypeFolder;
+	}
+
+RBkFolder CBookmarkFolder::OpenFolder()
+	{
+	RBkFolder folder;
+	folder.SetItem(*this);
+	return folder;
+	}
+
+CBkmrkProperties& CBookmarkFolder::BkmrkPropertiesL()
+	{
+	if (!iProperties)
+		{
+		iProperties = CBkmrkProperties::NewL(*this, iDatabase, *iRepository);
+		if (iStatus != EStatusCreating)
+			{
+			iProperties->TransactionL(ETransLoad);
+			}
+		}
+
+	return *iProperties;
+	}
+
+void CBookmarkFolder::SendChildrenToFolderL(CBookmarkFolder& aFolder)
+	{
+	TInt index = iChildren.Count() - 1;
+	for (;index >= 0; --index)
+		{
+		aFolder.AppendL(*(iChildren[index]));
+		}
+	iChildren.Reset();
+	}
+
+void CBookmarkFolder::AppendL(CBookmarkBase& aBookmarkItem)
+	{
+	LeaveIfNotWritableL();
+	CBookmarkFolder* parent = aBookmarkItem.Parent();
+	aBookmarkItem.SetParentL(*this);
+	if (parent)
+		{
+		parent->Remove(aBookmarkItem);
+		}
+	iChildren.AppendL(&aBookmarkItem);
+	aBookmarkItem.SetDirty();
+	}
+
+void CBookmarkFolder::InsertL(CBookmarkBase& aBookmarkItem, TInt aPosition)
+	{
+	LeaveIfNotWritableL();
+	CBookmarkFolder* parent = aBookmarkItem.Parent();
+
+	if (parent == this)
+		{
+		if (Index(aBookmarkItem) == aPosition)
+			{
+			// If the item is already in the right position in this folder
+			// then there is nothing to do.
+			return;
+			}
+		}
+	else
+		{
+		aBookmarkItem.SetParentL(*this);
+		}
+
+	if (parent)
+		{
+		parent->Remove(aBookmarkItem);
+		}
+	iChildren.InsertL(&aBookmarkItem, aPosition);
+	aBookmarkItem.SetDirty();
+
+	// This changes the rank of all children after the insertion. Touch each
+	// child so that this is saved on a commit
+	TInt index = iChildren.Count() - 1;
+	for (;index >= aPosition; --index)
+		{
+		if (!iChildren[index]->IsOrphaned())
+			{
+			iChildren[index]->SetDirty();
+			}
+		}
+	}
+
+TInt CBookmarkFolder::Move(TInt aOldPosition, TInt aNewPosition)
+	{
+	TRAPD( err, LeaveIfNotWritableL() );
+	if (err != KErrNone)
+		{
+		return err;
+		}
+	TInt maxIndex = iChildren.Count() -1;
+	if (aOldPosition < 0 || aOldPosition > maxIndex ||
+		aNewPosition < 0 || aNewPosition > maxIndex)
+		{
+		return KErrArgument;
+		}
+	if (iChildren[aOldPosition]->IsOrphaned())
+		{
+		return Bookmark::KErrOrphanedItem;
+		}
+	CBookmarkBase* item = iChildren[aOldPosition];
+	iChildren.Remove(aOldPosition);
+	iChildren.Insert(item, aNewPosition);
+	return KErrNone;
+	}
+
+TInt CBookmarkFolder::Index(CBookmarkBase& aItem) const
+	{
+	return iChildren.Find(&aItem);
+	}
+
+TInt CBookmarkFolder::Find(Bookmark::TItemId aId) const
+	{
+	TInt index = iChildren.Count() - 1;
+	for (; index >= 0; --index)
+		{
+		if (iChildren[index]->Id() == aId)
+			{
+			break;
+			}
+		}
+	return index;
+	}
+
+TInt CBookmarkFolder::Count() const
+	{
+	return iChildren.Count();
+	}
+
+CBookmarkBase& CBookmarkFolder::At(TInt aIndex)
+	{
+	return *(iChildren[aIndex]);
+	}
+
+void CBookmarkFolder::Remove(CBookmarkBase& aBookmarkItem)
+	{
+	TInt index = iChildren.Find(&aBookmarkItem);
+	if (index != KErrNotFound)
+		{
+		iChildren.Remove(index);
+		}
+	}
+
+TUint32 CBookmarkFolder::IndexBase()
+	{
+	// Folder ids have the top bit set. This ensures that bookmark ids and folder ids don't
+	// clash. This bit needs to be removed to get the actual index value 
+	TUint32 indexBase = iId & ~KFolderIdMaskID;
+	return (indexBase << KBookmarkIndexShift);
+	}
+
+void CBookmarkFolder::SetIdFromIndexBase(TUint32 aIndexBase)
+	{
+	iId = aIndexBase >> KBookmarkIndexShift;
+	iId |= KFolderIdMaskID;
+	}
+
+void CBookmarkFolder::TransNewL()
+	{
+	CBookmarkBase::TransNewL();
+	BkmrkPropertiesL().TransNewL();
+	}
+
+void CBookmarkFolder::TransSaveL()
+	{
+	CBookmarkBase::TransSaveL();
+	if (iProperties)
+		{
+		BkmrkPropertiesL().TransSaveL();
+		}
+	}
+
+void CBookmarkFolder::TransLoadL()
+	{
+	CBookmarkBase::TransLoadL();
+	if (iProperties)
+		{
+		BkmrkPropertiesL().TransLoadL();
+		}
+	SetClean();
+	}
+
+void CBookmarkFolder::TransRemoveL()
+	{
+	CBookmarkBase::TransRemoveL();
+
+	// ensure extended properties are loaded
+	BkmrkPropertiesL();
+	iProperties->TransRemoveL();
+	}
+