phonebookengines/contactsmodel/src/cntviewstore.cpp
changeset 0 e686773b3f54
child 24 0ba2181d7c28
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/contactsmodel/src/cntviewstore.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,408 @@
+// 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:
+//
+
+#include <e32base.h>
+#include <centralrepository.h>
+#include <cntdb.h>
+#include "CNTSTD.H"
+#include "rcntmodel.h"
+#include <cntviewbase.h>
+#include <cntviewstore.h>
+#include "cntviewstoreprivate.h"
+
+
+/*
+  Constant values used to access the view definition data 
+  in the central repository.
+*/
+//const TUint32 KTableMask = 0x00FF0000;
+const TUint32 KRowMask = 0x0000FF00;
+const TUint32 KColumnMask = 0x000000FF;
+
+const TUint32 KViewDefinitionsTable = 0x00010000;
+const TUint32 KViewSortOrderTable = 0x00020000;
+const TUint32 KTypeCol = 0x00000000;
+const TUint32 KNameCol = 0x00000001;
+const TUint32 KSortPluginCol = 0x00000002;
+const TUint32 KPreferencesCol = 0x00000003;
+const TUint32 KSortOrderIdxCol = 0x00000004;
+
+const TUid KContactsRepositoryUid = { 0x10003A73 };
+
+/** 
+	Stores a list of default remote view definitions in the contacts servers' 
+    persistent data store. The view definitions are assumed to relate to 
+    the default contacts database although this is not enforced.
+
+@param aDefaultViews Array of view definitions to store
+
+@publishedPartner
+@released
+*/
+EXPORT_C void TContactViewStore::SetDefaultViewsL(const RPointerArray<CContactDefaultViewDefinition> &aDefaultViews)
+	{
+	CRepository* rep = CRepository::NewLC(KContactsRepositoryUid);
+	
+	// Attempt to store in one transaction; if it fails, pass
+	// the error on as a leave.
+	rep->StartTransaction(CRepository::EConcurrentReadWriteTransaction);
+
+	// clear out any existing entries
+	TUint32 errorKey;
+	rep->Delete(KViewDefinitionsTable, ~(KRowMask | KColumnMask), errorKey);
+	rep->Delete(KViewSortOrderTable, ~(KRowMask | KColumnMask), errorKey);
+	
+	// for each view definition
+	TInt count = aDefaultViews.Count();
+	for (TInt i = 0; i < count; i++)
+		{
+		CContactDefaultViewDefinition* def = aDefaultViews[i];
+
+		// View Type
+		TUint32 key = (KViewDefinitionsTable | (i << 8) | KTypeCol);
+		rep->Set(key, def->ViewType());
+				
+		// View Name
+		key = (KViewDefinitionsTable | (i << 8) | KNameCol);
+		rep->Set(key, def->ViewNameL());
+		
+		// Sort Plugin Name
+		key = (KViewDefinitionsTable | (i << 8) | KSortPluginCol);
+		rep->Set(key, def->SortPluginNameL());
+
+		// View Preferences
+		key = (KViewDefinitionsTable | (i << 8) | KPreferencesCol);
+		rep->Set(key, def->ViewPreferences());
+		
+		// Sort Order Row Index
+		key = (KViewDefinitionsTable | (i << 8) | KSortOrderIdxCol);
+		rep->Set(key, i);
+		
+		// Write the entries for the sort order in the sort order table
+		// Need Assert that Count() <= 256 (i.e. 0xFF)
+		TInt fieldCount = def->SortOrder().Count();
+		for (TInt j = 0; j < fieldCount; j++)
+			{
+			key = (KViewSortOrderTable | (i << 8) | j);
+			rep->Set(key, static_cast<TInt>(def->SortOrder()[j].iUid));
+			}
+		}
+
+	User::LeaveIfError(rep->CommitTransaction(errorKey));
+		
+	CleanupStack::PopAndDestroy(rep);	
+	}
+
+/** 
+	Retrieves the list of default view definitions stored in the contacts
+    servers' persistent data storage.
+    
+@publishedPartner
+@released
+*/	
+EXPORT_C void TContactViewStore::GetDefaultViewsL(RPointerArray<CContactDefaultViewDefinition> &aDefaultViews)
+	{
+	__ASSERT_ALWAYS(aDefaultViews.Count() == 0, User::Leave(KErrArgument));
+	
+	CRepository* rep = CRepository::NewLC(KContactsRepositoryUid);
+	
+	TInt type(1);
+	TInt prefs(0);
+	TInt sortOrderRow;
+	RContactViewSortOrder viewSortOrder;
+	CleanupClosePushL(viewSortOrder);
+	TInt actualLength;
+	RBuf name;
+	name.CleanupClosePushL();
+	RBuf8 pluginName;
+	pluginName.CleanupClosePushL();	
+	
+	// Attempt to store in one transaction; if it fails, pass
+	// the error on as a leave.
+	rep->StartTransaction(CRepository::EConcurrentReadWriteTransaction);
+
+	TInt row(0);
+	const TUint32 KMask = ~KColumnMask;
+	TUint32 partialKey = (KViewDefinitionsTable | (row << 8));
+	RArray<TUint32> foundKeys;
+	CleanupClosePushL(foundKeys);
+	CContactDefaultViewDefinition* viewDef;
+		
+	TInt err = rep->FindL(partialKey, KMask, foundKeys);
+	while (err != KErrNotFound)
+		{
+		TInt count = foundKeys.Count();		
+		for (TInt col = 0; col < count; col++)
+			{
+			switch (foundKeys[col] & KColumnMask)
+				{
+				case KTypeCol:
+					{
+					err = rep->Get(foundKeys[col], type);
+					break;
+					}				
+				case KNameCol:
+					{
+					err = rep->Get(foundKeys[col], name, actualLength);
+					if (err == KErrOverflow)
+						{
+						name.ReAllocL(actualLength);
+						rep->Get(foundKeys[col], name);
+						}
+					break;
+					}
+				case KSortPluginCol:
+					{
+					err = rep->Get(foundKeys[col], pluginName, actualLength);
+					if (err == KErrOverflow)
+						{
+						pluginName.ReAllocL(actualLength);
+						rep->Get(foundKeys[col], pluginName);
+						}							
+					break;
+					}
+				case KPreferencesCol:
+					{
+					rep->Get(foundKeys[col], prefs);
+					break;
+					}
+				case KSortOrderIdxCol:
+					{
+					rep->Get(foundKeys[col], sortOrderRow);
+					
+					// read in the sort order from the sort order table
+					RArray<TUint32> foundFieldKeys;
+					partialKey = (KViewSortOrderTable | (sortOrderRow << 8));
+					err = rep->FindL(partialKey, KMask, foundFieldKeys);
+					CleanupClosePushL(foundFieldKeys);
+					for (TInt field = 0; field < foundFieldKeys.Count(); field++)
+						{
+						TInt fieldUid;
+						rep->Get(foundFieldKeys[field], fieldUid);
+						viewSortOrder.AppendL(TUid().Uid(fieldUid));
+						}
+					CleanupStack::PopAndDestroy(&foundFieldKeys);
+					break;
+					}
+				default:
+					{
+					break;
+					}
+				}
+			}
+													   
+		viewDef = CContactDefaultViewDefinition::NewLC(static_cast<CContactDefaultViewDefinition::TViewType>(type),
+													   name, viewSortOrder, 
+													   static_cast<TContactViewPreferences>(prefs), 
+													   pluginName);													   
+			
+		aDefaultViews.AppendL(viewDef);
+		CleanupStack::Pop(viewDef);	
+		viewSortOrder.Close();
+
+		row++;
+		partialKey = (KViewDefinitionsTable | (row << 8));
+		err = rep->FindL(partialKey, KMask, foundKeys);
+		}
+
+	TUint32 errorKey;
+	User::LeaveIfError(rep->CommitTransaction(errorKey));
+
+	CleanupStack::PopAndDestroy(5, rep); // foundKeys, pluginName, name, viewSortOrder, rep
+	}
+	
+/**
+  Returns an array of definitions describing the remote views that exist 
+  inside the server for the given contact database.
+  Note: The order of views in the array is not guaranteed to be the order 
+  that they were created in.
+
+@param aDbName Name of the contacts database to query for open views.
+@param aViewDefs An empty array that will be filled with any exisiting
+                 open views for the given contact database.
+
+@internalTechnology
+@test
+*/
+#if defined(_DEBUG)
+EXPORT_C void TContactViewStorePrivate::GetDefinitionsOfExistingViewsL(const TDesC& aDbName, RPointerArray<CContactDefaultViewDefinition>& aViewDefs)
+	{
+	RCntModel session;
+	CleanupClosePushL(session);
+	session.ConnectL();
+	session.GetDefinitionsOfExistingViewsL(aDbName, aViewDefs);
+	CleanupStack::PopAndDestroy(); // session
+	}
+#else
+EXPORT_C void TContactViewStorePrivate::GetDefinitionsOfExistingViewsL(const TDesC& , RPointerArray<CContactDefaultViewDefinition>& )
+	{
+	}
+#endif // _DEBUG
+	
+/**  Static constructor. Returns a default remote view definition.
+
+@param	aViewType	Type of the view. 
+@param	aViewName	The name of the view. Ignored if aViewType = ERemoteView; 
+@param 	aSortOrder	Specifies the fields to use to sort the items in the view.
+@param 	aContactTypes	Specifies which types of contact items should be included in the
+view and the behaviour for items that do not have content in any of the fields specified in the sort order.
+@param 	aSortPluginName	Specifies a plug-in that will be used to compare view contacts
+when the the view is sorted. This name is used by ECOM to select the plugin, and is matched
+with the "default_data" of all ECOM plugins that support the required interface.
+@return The newly constructed object.
+
+@publishedPartner
+@released
+*/
+EXPORT_C  CContactDefaultViewDefinition* CContactDefaultViewDefinition::NewLC(TViewType aViewType, const TDesC &aViewName, const RContactViewSortOrder &aSortOrder, TContactViewPreferences aContactTypes, const TDesC8 &aSortPluginName)
+	{
+	CContactDefaultViewDefinition* self = new (ELeave) CContactDefaultViewDefinition(aViewType, aContactTypes);
+	CleanupStack::PushL(self);
+	self->ConstructL(aViewName, aSortOrder, aSortPluginName);
+	return self;	
+	}
+
+/**  Static constructor. Returns a default remote view definition created from the contents
+     of the given stream.
+
+@param aStream Stream which the parmameters for the view definition are read from
+
+@return The newly constructed object.
+
+@publishedPartner
+@released
+*/
+EXPORT_C  CContactDefaultViewDefinition* CContactDefaultViewDefinition::NewLC(RReadStream& aStream)
+	{
+	CContactDefaultViewDefinition* self = new (ELeave) CContactDefaultViewDefinition;
+	CleanupStack::PushL(self);
+	aStream >> *self;
+	return self;	
+	}
+	
+CContactDefaultViewDefinition::CContactDefaultViewDefinition(TViewType aViewType, TContactViewPreferences aContactTypes):
+	iContactTypes(aContactTypes),
+	iViewType(aViewType)
+	{
+	}
+	
+CContactDefaultViewDefinition::CContactDefaultViewDefinition()
+	{
+	}
+	
+void CContactDefaultViewDefinition::ConstructL(const TDesC &aViewName, const RContactViewSortOrder &aSortOrder, const TDesC8 &aSortPluginName)
+	{
+	iViewName = aViewName.AllocL();
+	iSortPluginName = aSortPluginName.AllocL();
+	iSortOrder.CopyL(aSortOrder);
+	}	
+
+/**
+@publishedPartner
+@released
+*/
+EXPORT_C CContactDefaultViewDefinition::~CContactDefaultViewDefinition()
+	{
+	Close();
+	}
+	
+void CContactDefaultViewDefinition::Close()
+	{
+	iSortOrder.Close();
+	delete iSortPluginName;
+	iSortPluginName = NULL;
+	delete iViewName;	
+	iViewName = NULL;
+	}
+
+/** Gets the view name.
+@return The view name.
+
+@publishedPartner
+@released
+*/
+EXPORT_C const TDesC& CContactDefaultViewDefinition::ViewNameL() const
+	{ return *iViewName; }
+
+/** Gets the sort plugin name.
+@return The sort plugin name.
+
+@publishedPartner
+@released
+*/
+EXPORT_C const TDesC8& CContactDefaultViewDefinition::SortPluginNameL() const
+	{ return *iSortPluginName; }
+
+/** Gets the sort order.
+@return The sort order.
+
+@publishedPartner
+@released
+*/
+EXPORT_C const RContactViewSortOrder& CContactDefaultViewDefinition::SortOrder() const
+	{ return iSortOrder; }
+
+/** Gets the view preferences.
+@return The view preferences.
+
+@publishedPartner
+@released
+*/
+EXPORT_C TContactViewPreferences CContactDefaultViewDefinition::ViewPreferences() const
+	{ return iContactTypes; }
+
+/** Gets the view type.
+@return The view type.
+
+@publishedPartner
+@released
+*/
+EXPORT_C CContactDefaultViewDefinition::TViewType CContactDefaultViewDefinition::ViewType() const
+	{ return iViewType; }
+
+/** Standard object internalization function.
+@param aStream Stream from which the object is internalized.
+
+@publishedPartner
+@released
+*/
+EXPORT_C void CContactDefaultViewDefinition::InternalizeL(RReadStream &aStream)
+	{
+	// free any existing data
+	Close();
+	
+	// read in the new data
+	const TInt KMaxDescriptorLength(KMaxTInt);
+	iViewName = HBufC::NewL(aStream, KMaxDescriptorLength);
+	iSortPluginName = HBufC8::NewL(aStream, KMaxDescriptorLength);
+	aStream >> iSortOrder;
+	iContactTypes = static_cast<TContactViewPreferences>(aStream.ReadUint32L());
+	iViewType = static_cast<TViewType>(aStream.ReadUint32L());
+	}
+
+/** Standard object externalization function.
+@param aStream Stream that the object is externalized to.
+
+@publishedPartner
+@released
+*/
+EXPORT_C void CContactDefaultViewDefinition::ExternalizeL(RWriteStream &aStream) const
+	{
+	aStream << *iViewName;
+	aStream << *iSortPluginName;
+	aStream << iSortOrder;
+	aStream.WriteUint32L(static_cast<TUint32>(iContactTypes));
+	aStream.WriteUint32L(static_cast<TUint32>(iViewType));
+	}