applayerpluginsandutils/bookmarksupport/src/bkmrk.cpp
changeset 0 b16258d2340f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerpluginsandutils/bookmarksupport/src/bkmrk.cpp	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,234 @@
+// 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 bookmarks.
+// @internalComponent
+// 
+//
+
+#include "bkmrk.h"
+#include "bkmrkfolder.h"
+#include "bkmrkdb.h"
+#include "repository.h"
+
+CBookmark* CBookmark::NewL(CBookmarkFolder& aParent, CBookmarkDb& aDb)
+	{
+	CBookmark* self = new (ELeave) CBookmark(aDb);
+	CleanupStack::PushL(self);
+	self->ConstructL(aParent);	
+	CleanupStack::Pop(self);
+	return self;
+	}
+	
+CBookmark::CBookmark(CBookmarkDb& aDb)
+	: CBookmarkBase(aDb, aDb.BookmarkRepository())
+	{
+	}
+	
+CBookmark::~CBookmark()
+	{
+	delete iTitle;
+	delete iUri;
+	delete iProperties;
+	}
+	
+
+void CBookmark::DeleteL()
+	{
+	iDatabase.RemoveBookmarkL(this);
+	iParent->Remove(*this);
+	iParent = NULL;
+	iStatus = EStatusDeleted;
+	}
+
+void CBookmark::ConstructL(CBookmarkFolder& aParent)
+	{
+	aParent.AppendL(*this);
+	iUri = CUri8::NewL();
+	}
+
+Bookmark::TType CBookmark::Type() const
+	{
+	return Bookmark::ETypeBookmark;
+	}
+	
+RBkBookmark CBookmark::OpenBookmark()
+	{
+	RBkBookmark bookmark;
+	bookmark.SetItem(*this);
+	return bookmark;
+	}
+
+TBool CBookmark::IsHomePage()
+	{
+	TBool isHome = EFalse;
+	CBookmark* home = iDatabase.Home();
+	if (home)
+		{
+		isHome = (home->Id() == Id());
+		}
+	return isHome;
+	}
+	
+const TTime& CBookmark::LastVisited() const
+	{
+	return iLastVisited;
+	}
+	
+void CBookmark::SetLastVisited(const TTime& aTime)
+	{
+	iLastVisited = aTime;
+	SetDirty();
+	}
+	
+void CBookmark::UpdateVisited()
+	{
+	iLastVisited.HomeTime();
+	SetDirty();
+	}
+
+const TDesC8& CBookmark::Uri() const
+	{
+	return iUri->Uri().UriDes();
+	}
+
+void CBookmark::SetUriL(const TDesC8& aUri)
+	{
+	// The aUri must be smaller that the maximim uri storage size
+	__ASSERT_ALWAYS(aUri.Length() <= Bookmark::KMaxUriLength, User::Panic(Bookmark::KBookmarkErrTooLong, KErrArgument));
+	LeaveIfNotWritableL();
+	
+	delete iUri;
+	iUri = NULL;
+	
+	TUriParser8 parser;
+	User::LeaveIfError(parser.Parse(aUri));
+	if (parser.Extract(EUriUserinfo).Length() != 0)
+		{
+		CAuthentication* auth = CAuthentication::NewL(parser);
+		CleanupStack::PushL(auth);
+		CBkmrkExtendedProperties& properties = BkmrkExtendedPropertiesL();
+		properties.SetAuthenticationL(*auth);
+		CleanupStack::PopAndDestroy(auth);
+			
+		// construct the uri without the userinfo
+		iUri = CUri8::NewL();
+		iUri->SetComponentL(parser.Extract(EUriScheme), EUriScheme);
+		iUri->SetComponentL(parser.Extract(EUriHost), EUriHost);
+		iUri->SetComponentL(parser.Extract(EUriPort), EUriPort);
+		iUri->SetComponentL(parser.Extract(EUriPath), EUriPath);
+		iUri->SetComponentL(parser.Extract(EUriQuery), EUriQuery);
+		iUri->SetComponentL(parser.Extract(EUriFragment), EUriFragment);
+		}
+	else
+		{
+		iUri = CUri8::NewL(parser);
+		}
+		
+	SetDirty();
+	}
+
+CBkmrkExtendedProperties& CBookmark::BkmrkExtendedPropertiesL()
+	{
+	if (!iProperties)
+		{
+		iProperties = CBkmrkExtendedProperties::NewL(*this, iDatabase, *iRepository);
+		if (iStatus != EStatusCreating)
+			{
+			iProperties->TransactionL(ETransLoad);
+			}
+		}
+		
+	return *iProperties;
+	}
+
+
+// From CRepositoryAccessor
+TUint32 CBookmark::IndexBase()
+	{
+	return (iId << KBookmarkIndexShift);
+	}
+	
+void CBookmark::SetIdFromIndexBase(TUint32 aIndexBase)
+	{
+	iId = aIndexBase >> KBookmarkIndexShift;
+	}
+
+void CBookmark::TransNewL()
+	{
+	CBookmarkBase::TransNewL();
+	TUint32 indexBase = IndexBase();
+	TUint32 timeLo = I64LOW(iLastVisited.Int64());
+	TUint32 timeHi = I64HIGH(iLastVisited.Int64());
+	iRepository->Create(indexBase + KBkmrkLastVisitedLoIndex, static_cast<TInt>(timeLo));
+	iRepository->Create(indexBase + KBkmrkLastVisitedHiIndex, static_cast<TInt>(timeHi));
+	iRepository->Create(indexBase + KBkmrkURIIndex, Uri());
+	BkmrkExtendedPropertiesL().TransNewL();
+	}
+	
+void CBookmark::TransSaveL()
+	{
+	TUint32 indexBase = IndexBase();
+	CBookmarkBase::TransSaveL();
+	TUint32 timeLo = I64LOW(iLastVisited.Int64());
+	TUint32 timeHi = I64HIGH(iLastVisited.Int64());
+	iRepository->Set(indexBase + KBkmrkLastVisitedLoIndex, static_cast<TInt>(timeLo));
+	iRepository->Set(indexBase + KBkmrkLastVisitedHiIndex, static_cast<TInt>(timeHi));
+	iRepository->Set(indexBase + KBkmrkURIIndex, Uri());
+	if (iProperties)
+		{
+		BkmrkExtendedPropertiesL().TransSaveL();
+		}
+	}
+
+void CBookmark::TransLoadL()
+	{
+	CBookmarkBase::TransLoadL();
+	
+	TUint32 indexBase = IndexBase();
+	TInt low  = 0;
+	TInt high = 0;
+	User::LeaveIfError(iRepository->Get(indexBase + KBkmrkLastVisitedLoIndex, low));
+	User::LeaveIfError(iRepository->Get(indexBase + KBkmrkLastVisitedHiIndex, high));
+	TUint32 timeLo = static_cast<TUint32>(low);
+	TUint32 timeHi = static_cast<TUint32>(high);
+	TInt64 time = MAKE_TINT64(timeHi, timeLo);
+	iLastVisited = time;
+	HBufC8* uriBuffer = HBufC8::NewLC(Bookmark::KMaxUriLength);
+	TPtr8 uriPtr = uriBuffer->Des();
+	User::LeaveIfError(iRepository->Get(indexBase + KBkmrkURIIndex, uriPtr));
+	SetUriL(uriPtr);
+	CleanupStack::PopAndDestroy(uriBuffer);
+	
+	if (iProperties)
+		{
+		BkmrkExtendedPropertiesL().TransLoadL();
+		}
+		
+	SetClean();
+	}
+
+void CBookmark::TransRemoveL()
+	{
+	CBookmarkBase::TransRemoveL();
+	
+	TUint32 indexBase = IndexBase();
+	iRepository->Delete(indexBase + KBkmrkLastVisitedLoIndex);
+	iRepository->Delete(indexBase + KBkmrkLastVisitedHiIndex);
+	iRepository->Delete(indexBase + KBkmrkURIIndex);
+	
+	// ensure extended properties are loaded
+	BkmrkExtendedPropertiesL();
+	iProperties->TransRemoveL();
+	}
+