--- /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();
+ }
+