201041
authorhgs
Fri, 15 Oct 2010 12:24:46 +0300
changeset 81 640d30f4fb64
parent 77 c18f9fa7f42e
child 84 63017c97b1d6
201041
contacts_plat/contacts_ui_api/inc/cntabstractengine.h
contacts_plat/contacts_ui_api/inc/cntabstractview.h
contacts_plat/contacts_ui_api/inc/cntviewparams.h
contacts_plat/contacts_ui_extensions_api/tsrc/contactcardplugin/contactcardplugin.pro
contacts_plat/presence_cache_api/tsrc/mt_preseceqt/entitytests.cpp
contacts_plat/presence_cache_api/tsrc/mt_preseceqt/entitytests.h
contacts_plat/presence_cache_api/tsrc/mt_preseceqt/mt_preseceqt.pro
contacts_plat/presence_cache_api/tsrc/mt_preseceqt/start.cpp
contactwidgethsplugin/contactwidgeths/inc/contactwidgeths.h
contactwidgethsplugin/contactwidgeths/src/commlauncherwidget.cpp
contactwidgethsplugin/contactwidgeths/src/contactwidgeths.cpp
contactwidgethsplugin/contactwidgeths/t_contactwidgeths/t_contactwidgeths.pro
contactwidgethsplugin/t_contactwidgethsplugin/t_contactwidgethsplugin.pro
package_definition.xml
phonebookengines/bwins/cntimageutilityu.def
phonebookengines/cntactions/src/cntemailaction.cpp
phonebookengines/cntactions/tsrc/mt_cntactions/testrunner.cpp
phonebookengines/cntfindplugin/group/cntfindplugin.mmp
phonebookengines/cntfindplugin/group/cntfindpluginuid.h
phonebookengines/cntfindplugin/rom/cntfindplugin.iby
phonebookengines/cntfindplugin/src/101f85f4.rss
phonebookengines/cntfindplugin/src/cntfindplugin.cpp
phonebookengines/cntfindplugin/src/cntfindplugin.h
phonebookengines/cntfindplugin/src/dllmain.cpp
phonebookengines/cntimageutility/cntimageutility.pro
phonebookengines/cntimageutility/inc/cntimageutilityglobal.h
phonebookengines/cntimageutility/inc/cntorientationhelper.h
phonebookengines/cntimageutility/src/cntorientationhelper.cpp
phonebookengines/cntlistmodel/cntlistmodel.pro
phonebookengines/cntlistmodel/inc/cntcache.h
phonebookengines/cntlistmodel/inc/cntcache_p.h
phonebookengines/cntlistmodel/inc/cntdefaultinfoprovider.h
phonebookengines/cntlistmodel/inc/cntdisplaytextformatter.h
phonebookengines/cntlistmodel/inc/cntlistmodel.h
phonebookengines/cntlistmodel/inc/cntlistmodel_p.h
phonebookengines/cntlistmodel/inc/cntlistmodelglobal.h
phonebookengines/cntlistmodel/inc/cntnamefetcher.h
phonebookengines/cntlistmodel/inc/cntpresenceinfoprovider.h
phonebookengines/cntlistmodel/src/cntcache.cpp
phonebookengines/cntlistmodel/src/cntcache_p.cpp
phonebookengines/cntlistmodel/src/cntdefaultinfoprovider.cpp
phonebookengines/cntlistmodel/src/cntdisplaytextformatter.cpp
phonebookengines/cntlistmodel/src/cntlistmodel.cpp
phonebookengines/cntlistmodel/src/cntnamefetcher.cpp
phonebookengines/cntlistmodel/src/cntpresenceinfoprovider.cpp
phonebookengines/cntlistmodel/tsrc/runperftests.bat
phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/image1.png
phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/image2.png
phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/inc/testrunner.h
phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/inc/ut_cntcache.h
phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/inc/ut_cntdefaultinfoprovider.h
phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/inc/ut_cntdisplaytextformatter.h
phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/inc/ut_cntlistmodel.h
phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/inc/ut_cntpresenceinfoprovider.h
phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/runtest.cmd
phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/src/main.cpp
phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/src/testrunner.cpp
phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/src/ut_cntcache.cpp
phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/src/ut_cntdefaultinfoprovider.cpp
phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/src/ut_cntdisplaytextformatter.cpp
phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/src/ut_cntlistmodel.cpp
phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/src/ut_cntpresenceinfoprovider.cpp
phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/ut_cntlistmodel.pro
phonebookengines/cntsimutility/tsrc/ut_cntsimutility/start.cpp
phonebookengines/cntsimutility/tsrc/ut_cntsimutility/ut_cntsimutility.cpp
phonebookengines/cntsimutility/tsrc/ut_cntsimutility/ut_cntsimutility.h
phonebookengines/cntsimutility/tsrc/ut_cntsimutility/ut_cntsimutility.pro
phonebookengines/cntsimutility/tsrc/ut_cntsimutility/ut_mock_implementations.cpp
phonebookengines/cntsortplugin/group/cntsortplugin.mmp
phonebookengines/cntsortplugin/group/cntsortpluginuid.h
phonebookengines/cntsortplugin/rom/cntsortplugin.iby
phonebookengines/cntsortplugin/src/101f85a9.rss
phonebookengines/cntsortplugin/src/ccntsortplugin.cpp
phonebookengines/cntsortplugin/src/ccntsortplugin.h
phonebookengines/cntsortplugin/src/csortkeyarray.cpp
phonebookengines/cntsortplugin/src/csortkeyarray.h
phonebookengines/cntsortplugin/src/dllmain.cpp
phonebookengines/eabi/cntimageutilityu.def
phonebookengines/phonebookengines.pro
phonebookui/bwins/cntcommonuiu.def
phonebookui/bwins/cntlistmodelu.def
phonebookui/cntcommonui/cntcommonui.pro
phonebookui/cntcommonui/collections/cntcollectionlistmodelworker.cpp
phonebookui/cntcommonui/collections/cntcollectionview.cpp
phonebookui/cntcommonui/collections/cntcollectionview.h
phonebookui/cntcommonui/collections/cntfavoritesview.cpp
phonebookui/cntcommonui/collections/cntfavoritesview.h
phonebookui/cntcommonui/collections/cntgroupactionsview.cpp
phonebookui/cntcommonui/collections/cntgroupactionsview.h
phonebookui/cntcommonui/collections/cntgroupdeletepopup.cpp
phonebookui/cntcommonui/collections/cntgroupdeletepopup.h
phonebookui/cntcommonui/collections/cntgroupeditormodel.cpp
phonebookui/cntcommonui/collections/cntgroupmemberview_p.cpp
phonebookui/cntcommonui/common/cntactionlauncher.cpp
phonebookui/cntcommonui/common/cntsavemanager.cpp
phonebookui/cntcommonui/common/cntsavemanager.h
phonebookui/cntcommonui/common/cntsimengine.cpp
phonebookui/cntcommonui/contactcard/cntcontactcarddatacontainer.cpp
phonebookui/cntcommonui/contactcard/cntcontactcarddetailitem.cpp
phonebookui/cntcommonui/contactcard/cntcontactcarddetailitem.h
phonebookui/cntcommonui/contactcard/cntcontactcardview.cpp
phonebookui/cntcommonui/contactcard/cntcontactcardview.h
phonebookui/cntcommonui/contactcard/cntcontactcardview_p.cpp
phonebookui/cntcommonui/contactcard/cntcontactcardview_p.h
phonebookui/cntcommonui/contacteditors/cntdateeditorviewitem.cpp
phonebookui/cntcommonui/contacteditors/cntdetailconst.h
phonebookui/cntcommonui/contacteditors/cntdetaileditor.cpp
phonebookui/cntcommonui/contacteditors/cntdetaileditor.h
phonebookui/cntcommonui/contacteditors/cntdetailpopup.cpp
phonebookui/cntcommonui/contacteditors/cnteditview.cpp
phonebookui/cntcommonui/contacteditors/cnteditview.h
phonebookui/cntcommonui/contacteditors/cnteditview_p.cpp
phonebookui/cntcommonui/contacteditors/cnteditview_p.h
phonebookui/cntcommonui/contacteditors/cnteditviewlistmodel.cpp
phonebookui/cntcommonui/contacteditors/cntnoteeditormodel.cpp
phonebookui/cntcommonui/contacteditors/cntnoteeditorviewitem.cpp
phonebookui/cntcommonui/contacteditors/cntnoteeditorviewitem.h
phonebookui/cntcommonui/core/cntactivities.cpp
phonebookui/cntcommonui/core/cntactivities.h
phonebookui/cntcommonui/core/cntdefaultengine.cpp
phonebookui/cntcommonui/core/cntdefaultengine.h
phonebookui/cntcommonui/core/cntdefaultviewfactory.cpp
phonebookui/cntcommonui/core/cntdefaultviewmanager.cpp
phonebookui/cntcommonui/core/cntdefaultviewmanager.h
phonebookui/cntcommonui/core/cntmainwindow.cpp
phonebookui/cntcommonui/core/cntmainwindow.h
phonebookui/cntcommonui/core/cntviewnavigator.cpp
phonebookui/cntcommonui/core/cntviewnavigator.h
phonebookui/cntcommonui/resources/cntcommonui.qrc
phonebookui/cntcommonui/resources/contacts_namelist.docml
phonebookui/cntcommonui/resources/effects/item_change_layout.fxml
phonebookui/cntcommonui/resources/style/cntcommondetailviewitem.widgetml
phonebookui/cntcommonui/resources/style/cnthistoryviewitem.css
phonebookui/cntcommonui/resources/style/cnthistoryviewitem.widgetml
phonebookui/cntcommonui/resources/style/cnthistoryviewitemwidget.css
phonebookui/cntcommonui/resources/style/cnthistoryviewitemwidget.widgetml
phonebookui/cntcommonui/resources/style/cnthistoryviewitemwidget_color.css
phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/cntactionextensionexample.pro
phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/inc/cntexample2action.h
phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/inc/cntexampleaction.h
phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/inc/cntexampleactionfactory.h
phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/inc/cntexamplebaseaction.h
phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/inc/cntexampledynamicaction.h
phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/inc/cntexamplenodetailaction.h
phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/src/cntexample2action.cpp
phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/src/cntexampleaction.cpp
phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/src/cntexampleactionfactory.cpp
phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/src/cntexamplebaseaction.cpp
phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/src/cntexampledynamicaction.cpp
phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/src/cntexamplenodetailaction.cpp
phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/cntactionextensionexample.pro
phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/inc/cntexample2action.h
phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/inc/cntexampleaction.h
phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/inc/cntexampleactionfactory.h
phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/inc/cntexamplebaseaction.h
phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/inc/cntexampledynamicaction.h
phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/inc/cntexamplenodetailaction.h
phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/plugin_commonu.def
phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/src/cntexample2action.cpp
phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/src/cntexampleaction.cpp
phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/src/cntexampleactionfactory.cpp
phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/src/cntexamplebaseaction.cpp
phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/src/cntexampledynamicaction.cpp
phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/src/cntexamplenodetailaction.cpp
phonebookui/cntcommonui/views/cntactionmenubuilder.cpp
phonebookui/cntcommonui/views/cntactionmenubuilder.h
phonebookui/cntcommonui/views/cntbaseselectionview.cpp
phonebookui/cntcommonui/views/cntbaseselectionview.h
phonebookui/cntcommonui/views/cnthistoryview.cpp
phonebookui/cntcommonui/views/cnthistoryview.h
phonebookui/cntcommonui/views/cnthistoryviewitem.cpp
phonebookui/cntcommonui/views/cnthistoryviewitem.h
phonebookui/cntcommonui/views/cnthistoryviewitemwidget.cpp
phonebookui/cntcommonui/views/cnthistoryviewitemwidget.h
phonebookui/cntcommonui/views/cntimageeditorview.cpp
phonebookui/cntcommonui/views/cntimageeditorview.h
phonebookui/cntcommonui/views/cntimportsview.cpp
phonebookui/cntcommonui/views/cntimportsview.h
phonebookui/cntcommonui/views/cntimportviewcallback.h
phonebookui/cntcommonui/views/cntmycardview.cpp
phonebookui/cntcommonui/views/cntmycardview.h
phonebookui/cntcommonui/views/cntnamesview.cpp
phonebookui/cntcommonui/views/cntnamesview.h
phonebookui/cntcommonui/views/cntnamesview_p.cpp
phonebookui/cntcommonui/views/cntnamesview_p.h
phonebookui/cntcommonui/views/cntnamesviewitem.cpp
phonebookui/cntcommonui/views/cntnamesviewitem.h
phonebookui/cntcommonui/views/cntpinchgrabber.cpp
phonebookui/cntcommonui/views/cntpinchgrabber.h
phonebookui/cntcommonui/views/cntsettingsmodel.cpp
phonebookui/cntcommonui/views/cntsettingsmodel.h
phonebookui/cntcommonui/views/cntsettingsview.cpp
phonebookui/cntcommonui/views/cntsettingsview.h
phonebookui/cntcommonui/widgets/cntactionpopup.h
phonebookui/cntcommonui/widgets/cntactionpopup_p.cpp
phonebookui/cntcommonui/widgets/cntactionpopup_p.h
phonebookui/cntcommonui/widgets/cntfetchcontactpopup.cpp
phonebookui/cntcommonui/widgets/cntfetchcontactpopup.h
phonebookui/cntcommonui/widgets/cntfetchselectionitems.cpp
phonebookui/cntcommonui/widgets/cntfetchselectionitems.h
phonebookui/cntcommonui/widgets/cntimagelabel.h
phonebookui/cnthistorymodel/cnthistorymodel.cpp
phonebookui/cnthistorymodel/cnthistorymodel.h
phonebookui/cnthistorymodel/cnthistorymodel.pro
phonebookui/cnthistorymodel/cnthistorymodel_p.cpp
phonebookui/cnthistorymodel/cnthistorymodel_p.h
phonebookui/cnthistorymodel/cnthistorymodelconsts.h
phonebookui/cnthistorymodel/cnthistorymodelglobal.h
phonebookui/cnthistorymodel/inc/cnthistorymodel.h
phonebookui/cnthistorymodel/inc/cnthistorymodel_p.h
phonebookui/cnthistorymodel/inc/cnthistorymodelconsts.h
phonebookui/cnthistorymodel/inc/cnthistorymodelglobal.h
phonebookui/cnthistorymodel/src/cnthistorymodel.cpp
phonebookui/cnthistorymodel/src/cnthistorymodel_p.cpp
phonebookui/cnthistorymodel/tsrc/branch_coverage.bat
phonebookui/cnthistorymodel/tsrc/functional_coverage.bat
phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/main.cpp
phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/mt_cnthistorymodel.cpp
phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/mt_cnthistorymodel.pro
phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/testrunner.cpp
phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/testrunner.h
phonebookui/cnthistorymodel/tsrc/run_test.bat
phonebookui/cntlistmodel/cntabstractfetcher.cpp
phonebookui/cntlistmodel/cntabstractfetcher.h
phonebookui/cntlistmodel/cntcache.cpp
phonebookui/cntlistmodel/cntcache.h
phonebookui/cntlistmodel/cntcacheitems.cpp
phonebookui/cntlistmodel/cntcacheitems.h
phonebookui/cntlistmodel/cntdefaultinfoprovider.cpp
phonebookui/cntlistmodel/cntdefaultinfoprovider.h
phonebookui/cntlistmodel/cntdisplaytextformatter.cpp
phonebookui/cntlistmodel/cntdisplaytextformatter.h
phonebookui/cntlistmodel/cnticonfetcher.cpp
phonebookui/cntlistmodel/cnticonfetcher.h
phonebookui/cntlistmodel/cntinfofetcher.cpp
phonebookui/cntlistmodel/cntinfofetcher.h
phonebookui/cntlistmodel/cntlistmodel.cpp
phonebookui/cntlistmodel/cntlistmodel.h
phonebookui/cntlistmodel/cntlistmodel.pro
phonebookui/cntlistmodel/cntlistmodel_p.cpp
phonebookui/cntlistmodel/cntlistmodel_p.h
phonebookui/cntlistmodel/cntlistmodelglobal.h
phonebookui/cntlistmodel/cntnamefetcher.cpp
phonebookui/cntlistmodel/cntnamefetcher.h
phonebookui/cntlistmodel/cntpresenceinfoprovider.cpp
phonebookui/cntlistmodel/cntpresenceinfoprovider.h
phonebookui/cntlistmodel/tsrc/runperftests.bat
phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/image1.png
phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/image2.png
phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/inc/testrunner.h
phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/inc/ut_cntcache.h
phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/inc/ut_cntdefaultinfoprovider.h
phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/inc/ut_cntdisplaytextformatter.h
phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/inc/ut_cntlistmodel.h
phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/inc/ut_cntpresenceinfoprovider.h
phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/runtest.cmd
phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/src/main.cpp
phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/src/testrunner.cpp
phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/src/ut_cntcache.cpp
phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/src/ut_cntdefaultinfoprovider.cpp
phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/src/ut_cntdisplaytextformatter.cpp
phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/src/ut_cntlistmodel.cpp
phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/src/ut_cntpresenceinfoprovider.cpp
phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/ut_cntlistmodel.pro
phonebookui/eabi/cntcommonuiu.def
phonebookui/eabi/cntlistmodelu.def
phonebookui/phonebookapp/phonebookapp.pro
phonebookui/phonebookservices/inc/cntserviceassigncontactcardview.h
phonebookui/phonebookservices/inc/cntservices.h
phonebookui/phonebookservices/phonebookservices.pro
phonebookui/phonebookservices/src/cntserviceassigncontactcardview.cpp
phonebookui/phonebookservices/src/cntservicecontactfetchview.cpp
phonebookui/phonebookservices/src/cntservices.cpp
phonebookui/phonebookservices/src/main.cpp
phonebookui/phonebookservices/tsrc/ut_cntservices/main.cpp
phonebookui/phonebookservices/tsrc/ut_cntservices/ut_cntservices.cpp
phonebookui/phonebookservices/tsrc/ut_cntservices/ut_cntservices.h
phonebookui/phonebookservices/tsrc/ut_cntservices/ut_cntservices.pro
phonebookui/phonebookui.pro
phonebookui/rom/phonebook.iby
pimprotocols/phonebooksync/Server/SyncEngineServer.cpp
pimprotocols/phonebooksync/group/bld.inf
presencecache/presencecacheqt/tsrc/presencefeeddemo_qt/presencefeeddemo_qt.pro
presencecache/presencecachesymbian/presencecacheclient2/group/presencecacheclient2.mmp
presencecache/presencecachesymbian/presencecacheclient2/src/presencecacheclient.cpp
presencecache/presencecachesymbian/presencecacheserver2/group/presencecacheserver2.mmp
presencecache/presencecachesymbian/presencecacheserver2/src/presencecacheexpiry.cpp
presencecache/presencecachesymbian/presencecacheserver2/src/presencecacheserver.cpp
presencecache/presencecachesymbian/presencecachesymbian.pro
presencecache/presencecachesymbian/presencecacheutils/group/presencecacheutils.mmp
sis/contacts.pkg
sis/contacts_stub.pkg
sis/contacts_stub.sis
--- a/contacts_plat/contacts_ui_api/inc/cntabstractengine.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/contacts_plat/contacts_ui_api/inc/cntabstractengine.h	Fri Oct 15 12:24:46 2010 +0300
@@ -23,6 +23,7 @@
 class CntAbstractViewManager;
 class CntThumbnailManager;
 class CntExtensionManager;
+class CntSaveManager;
 
 QTM_USE_NAMESPACE
 
@@ -39,6 +40,7 @@
     virtual CntAbstractViewManager& viewManager() = 0;
     virtual CntExtensionManager& extensionManager() = 0;
     virtual CntThumbnailManager& thumbnailManager() = 0;
+	virtual CntSaveManager& saveManager() = 0;
 };
 
 #endif /* CNTABSTRACTENGINE_H_ */
--- a/contacts_plat/contacts_ui_api/inc/cntabstractview.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/contacts_plat/contacts_ui_api/inc/cntabstractview.h	Fri Oct 15 12:24:46 2010 +0300
@@ -34,7 +34,26 @@
      * View is activated after its added to main window and is
      * ready to be drawn.
      */
-    virtual void activate( const CntViewParameters aArgs ) = 0;
+    virtual void activate(const CntViewParameters aArgs) = 0;
+    
+    /**
+     * View details are internalized from stream to view parameters.
+     */
+    virtual bool internalize(QDataStream &stream, CntViewParameters &viewParameters) 
+    { 
+        Q_UNUSED(stream); 
+        Q_UNUSED(viewParameters);
+        return false;  
+    }
+    
+    /**
+     * View is externalized parameters and return activity name.
+     */
+    virtual QString externalize(QDataStream &stream) 
+    { 
+        Q_UNUSED(stream); 
+        return QString(); 
+    }
     
     /**
      * View is deactivated just before its removed from
--- a/contacts_plat/contacts_ui_api/inc/cntviewparams.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/contacts_plat/contacts_ui_api/inc/cntviewparams.h	Fri Oct 15 12:24:46 2010 +0300
@@ -34,7 +34,9 @@
     EViewId = 0,
     ESelectedAction,
     ESelectedContact,
+    ESelectedContactId,
     ESelectedGroupContact,
+    ESelectedGroupContactId,
     ESelectedDetail,
     ESelectionMode,
     EMyCard,
--- a/contacts_plat/contacts_ui_extensions_api/tsrc/contactcardplugin/contactcardplugin.pro	Fri Oct 08 11:42:51 2010 +0300
+++ b/contacts_plat/contacts_ui_extensions_api/tsrc/contactcardplugin/contactcardplugin.pro	Fri Oct 15 12:24:46 2010 +0300
@@ -49,4 +49,5 @@
 }
 
 target.path += $$[QT_INSTALL_PLUGINS]/contacts/extensions
-INSTALLS += target
\ No newline at end of file
+INSTALLS += target
+symbian:MMP_RULES += SMPSAFE
\ No newline at end of file
--- a/contacts_plat/presence_cache_api/tsrc/mt_preseceqt/entitytests.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/contacts_plat/presence_cache_api/tsrc/mt_preseceqt/entitytests.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -614,10 +614,8 @@
         QString testnewVal = aPresenceBuddyInfo->getAnyField( newKey );
         QVERIFY ( testnewVal== newValue );
         }
-    
+    }
 
-   
-    }
 void EntityTests::handlePresenceReadInClient(bool success, QList<PrcPresenceBuddyInfoQt*> buddyInfoList)
 {
    int cnt = buddyInfoList.count(); 
@@ -636,8 +634,7 @@
        }
     
 }
-void EntityTests::handlePresencewriteInclient(bool success)
-    
+void EntityTests::handlePresencewriteInclient(bool success)   
     {
     if(success == true)
         {
@@ -645,3 +642,95 @@
         }
     
     }
+
+/*!
+ * A helper function for the test threads used in EntityTests::test9
+ * Basically just creates a presence reader and records wether or not 
+ * succesfull
+ */   
+
+TInt EntityTests::startupTestThreadFunction(TAny* any)
+    {
+    // 1. Add cleanup stack support.    
+    CTrapCleanup* cleanupStack = CTrapCleanup::New();
+     
+    // 2. Add support for active objects        
+    CActiveScheduler* activeScheduler = new (ELeave) CActiveScheduler;          
+    CActiveScheduler::Install(activeScheduler);
+     
+    // 3. create reader, which will cause the server startup (provided it is not running)
+    PrcPresenceReader* reader = PrcPresenceReader::createReader(); 
+    
+    // 4. If reader created correctly, increase provided results counter
+    if (reader)
+        {
+        TInt* count = (TInt*) any;
+        (*count)++;
+        }
+    
+    delete reader;
+           
+    return(KErrNone);
+    }
+
+/*!
+ * Special server startup test.
+ * 
+ * 1. This test first waits that the presence server timeouts and shuts down.
+ * 2. Then two test threads are created which simultaneously try to create 
+ *    presence reader instances.
+ * 3. That causes two server instances trying to start at the same time and 
+ *    the latter fails with KErrAlreadyExists
+ * 4. We check that is handled correctly by checking that neither test thread 
+ *    panics and succesfully creates the reader
+ */
+void EntityTests::test9()
+    { 
+    // this will hold the count of succesfully created readers
+    TInt readerCount=0;
+    
+    // 1. Wait so the server time outs and shuts down.   
+    //    (we want to start fresh for this test)
+    User::After(3000000);   
+     
+    // 2. Create two test threads and start them
+    _LIT(KMyThread1, "PresenceTestThread1");
+    TBufC<48> threadName(KMyThread1); 
+    RThread thread1;
+    TRequestStatus thread1Status;
+
+    _LIT(KMyThread2, "PresenceTestThread2");
+    TBufC<48> threadName2(KMyThread2);
+    RThread thread2;
+    TRequestStatus thread2Status;
+    
+    TInt r=thread1.Create(KMyThread1, 
+            EntityTests::startupTestThreadFunction,
+            KDefaultStackSize, 
+            NULL, 
+            &readerCount);  
+    
+    TInt x=thread2.Create(KMyThread2, 
+            EntityTests::startupTestThreadFunction,
+            KDefaultStackSize,
+            NULL,
+            &readerCount);
+    
+    thread1.Logon(thread1Status); 
+    thread2.Logon(thread2Status);   
+    thread1.Resume();
+    thread2.Resume();  
+    
+    // 3. When threads are ready, verify results
+    User::WaitForRequest(thread1Status);
+    User::WaitForRequest(thread2Status);
+   
+    // verify that neither thread paniced
+    QVERIFY(thread1.ExitType() != EExitPanic);
+    QVERIFY(thread2.ExitType() != EExitPanic);
+    // verify that both succesfully created presence readers
+    QVERIFY(readerCount == 2);
+
+    thread1.Close();
+    thread2.Close();  
+    }
--- a/contacts_plat/presence_cache_api/tsrc/mt_preseceqt/entitytests.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/contacts_plat/presence_cache_api/tsrc/mt_preseceqt/entitytests.h	Fri Oct 15 12:24:46 2010 +0300
@@ -29,9 +29,7 @@
 {
 Q_OBJECT
 public:
-    explicit EntityTests(QObject *parent = 0);
-
-    
+    explicit EntityTests(QObject *parent = 0);    
 
 private slots:  // Init & cleanup
         void initTestCase();
@@ -44,8 +42,10 @@
         void test6();
         void test7();
         void test8();
+        void test9();
 
 private:
+        static TInt startupTestThreadFunction(TAny *any);
         void saveBuddy(QMap<QString,QString>& map);
         void fetchAndVerifyBuddy( QMap<QString,QString>& map );
         void  subscribeBuddy( QString &buddyId);
--- a/contacts_plat/presence_cache_api/tsrc/mt_preseceqt/mt_preseceqt.pro	Fri Oct 08 11:42:51 2010 +0300
+++ b/contacts_plat/presence_cache_api/tsrc/mt_preseceqt/mt_preseceqt.pro	Fri Oct 15 12:24:46 2010 +0300
@@ -23,7 +23,7 @@
 QT += testlib network webkit xmlpatterns
 CONFIG += mobility
 DEFINES += CNT_SOC_ENG_UNIT_TEST
-
+CONFIG += symbian_test 
 TARGET.CAPABILITY = ALL -TCB
 
 DEPENDPATH += .
@@ -32,8 +32,8 @@
 
 INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE 
 INCLUDEPATH += $$MW_LAYER_SYSTEMINCLUDE
-INCLUDEPATH +=   ..\..\..\\presence_cache_api\inc
-INCLUDEPATH +=   ..\..\inc
+INCLUDEPATH +=   ../../..//presence_cache_api/inc
+INCLUDEPATH +=   ../../inc
 
 HEADERS +=    entitytests.h
     
--- a/contacts_plat/presence_cache_api/tsrc/mt_preseceqt/start.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/contacts_plat/presence_cache_api/tsrc/mt_preseceqt/start.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -22,10 +22,12 @@
 #include <qsqldatabase.h>
 #include <qfile.h>
 
-
+#undef LOG_TO_FILE
 //QTEST_MAIN(TestOfTest);
 int main(int argc, char *argv[])
 {
+#ifdef LOG_TO_FILE
+    
     bool promptOnExit(0);
     for (int i=0; i<argc; i++) {
         if (QString(argv[i]) == "-noprompt")
@@ -45,6 +47,15 @@
     if (promptOnExit) {
         printf("Press any key...\n");
         getchar();
+     
     }
+#else
+    QApplication app(argc, argv);
+    EntityTests et;
+    QStringList args( "entitytests");
+    QTest::qExec(&et, args);
+
+
+#endif   
     return 0;
 }
--- a/contactwidgethsplugin/contactwidgeths/inc/contactwidgeths.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/contactwidgethsplugin/contactwidgeths/inc/contactwidgeths.h	Fri Oct 15 12:24:46 2010 +0300
@@ -37,6 +37,7 @@
 class HbMainWindow;
 class HbDocumentLoader;
 class HbTranslator;
+class HbDeviceMessageBox;
 
 
 QTM_USE_NAMESPACE
@@ -93,6 +94,7 @@
     void onRequestComplete();
     void onSelfContactIdChanged(const QContactLocalId &theOldId,
             const QContactLocalId &theNewId);
+    void onAboutCloseNoneContactMessage();
     
 private:
     void createUI();
@@ -114,6 +116,7 @@
     void createLauncherWithPosition();
     void loadLayout(const QString frameName, const QString textColor);
     void finishWidget();
+    void showNoneContactMessage();
 
 private:
     HbIconItem *mAvatarIconItem;
@@ -148,6 +151,8 @@
     
     bool mPendingExit;
     
+    HbDeviceMessageBox * mNoneContactMessage;
+    
     CONTACTWIDGET_TEST_FRIEND_CLASS(TestContactWidget)
 
 };
--- a/contactwidgethsplugin/contactwidgeths/src/commlauncherwidget.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/contactwidgethsplugin/contactwidgeths/src/commlauncherwidget.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -43,15 +43,6 @@
 
 const int commLauncherMargin = 120;  // heights of titlebar & comm.launcher 
 
-// TODO: THESE STRINGS ARE IN W32 SDK. THESE DEFINITIONS CAN BE REMOVED
-// WHEN EVERYBODY ARE USING IT OR LATER VERSION
-#ifndef XQOP_CONTACTS_VIEW_CONTACT_CARD
-#define XQOP_CONTACTS_VIEW_CONTACT_CARD QLatin1String("openContactCard(int)")
-#endif
-#ifndef XQI_CONTACTS_VIEW
-#define XQI_CONTACTS_VIEW QLatin1String("com.nokia.symbian.IContactsView")
-#endif
-
 
 /*!
   \class CommLauncherWidget
@@ -65,12 +56,12 @@
  mContact(0),
  mButtonCount(0),
  mRequest(NULL),
+ mCommLauncherAction(0),
  mCallButton(0),
  mSendMsgButton(0),
  mEmailButton(0),
  mPhonebookButton(0),
  mApplicationManager(0),
- mCommLauncherAction(0),
  mPendingRequest(false)
 {    
     
@@ -403,16 +394,31 @@
             //if preferred is not set select the first number
             messageNumber = mContact->detail<QContactPhoneNumber>();
         }
-        // invoke action
-        if(mCommLauncherAction)
-        	delete mCommLauncherAction;
-        mCommLauncherAction = QContactAction::action(messageActionDescriptors.at(0));
-        mCleanupHandler.add(mCommLauncherAction);
-        
-        if (!messageNumber.isEmpty()) {
-            mCommLauncherAction->invokeAction(*mContact, messageNumber);
-            
-            qDebug() << "send to number " << messageNumber.number();
+
+        if (messageNumber.isEmpty()) {
+        	qDebug() << "contact have not phone number, why am I here?";
+        } else {
+        	if (mRequest) {
+        		delete mRequest;
+        	}
+        	mRequest = mApplicationManager->create(XQI_MESSAGE_SEND,
+												   XQOP_MESSAGE_SEND_WITH_ID,
+												   false);
+        	if (mRequest) {
+        		QList<QVariant> anArguments;
+        		anArguments.append(QVariant::fromValue(messageNumber.number()));
+        		anArguments.append(QVariant(0)); // unused contactId
+        		anArguments.append(QVariant::fromValue(
+        				mContact->displayLabel()));
+        		mRequest->setArguments(anArguments);
+        		mRequest->setSynchronous(false);
+        		bool aResult = mRequest->send();
+        		if (!aResult) {
+        			qDebug() << "request for message was not successful";
+        		}
+        	} else {
+        		qDebug() << "request for message was not created.";
+        	}
         }
     } else {
         qDebug() << "contact has no Actions, can't send a message";
@@ -551,6 +557,7 @@
                                            "Launch", "launch()", false);
     mCleanupHandler.add(mRequest);
     if (mRequest) {
+    	mRequest->setSynchronous(false);
         QVariant retValue(-1);
 		bool result = mRequest->send(retValue);
 		if (!result) {
--- a/contactwidgethsplugin/contactwidgeths/src/contactwidgeths.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/contactwidgethsplugin/contactwidgeths/src/contactwidgeths.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -55,18 +55,6 @@
 // Docml file
 const QString contactWidgetDocml = ":/commlauncherwidget.docml";
 
-
-// TODO: THESE STRINGS ARE IN W32 SDK. THESE DEFINITIONS CAN BE REMOVED
-// WHEN EVERYBODY ARE USING IT OR LATER VERSION
-#ifndef XQI_CONTACTS_FETCH
-#define XQI_CONTACTS_FETCH QLatin1String("com.nokia.symbian.IContactsFetch")
-#endif
-#ifndef XQOP_CONTACTS_FETCH_SINGLE
-#define XQOP_CONTACTS_FETCH_SINGLE QLatin1String("singleFetch(QString,QString)")
-#endif
-
-
-
 /*!
   \class ContactWidgetHs
 */
@@ -92,7 +80,8 @@
   mThumbnailPixmap(QPixmap()),
   mThumbnailInProgress(false),
   mTranslator(new HbTranslator(translationsPath, translationsFile)),
-  mPendingExit(false)
+  mPendingExit(false),
+  mNoneContactMessage(0)
 {
     // Localization file loading   		
 	mTranslator->loadCommon();    
@@ -134,9 +123,6 @@
     
     connect(mThumbnailManager.data(), SIGNAL(thumbnailReady(QPixmap, void*, int, int)),
         this, SLOT(thumbnailReady(QPixmap, void*, int, int)));
-    
-
-      
 }
 
 /*!
@@ -353,6 +339,15 @@
 {
     if (mContactNameLabel) {
         mContactNameLabel->setPlainText(sName);
+        HbFontSpec aFontSpec(HbFontSpec::Secondary);
+		QFontMetrics aMetrics(aFontSpec.font());
+		int aTextWidth = aMetrics.width(sName);
+	    qreal aWidgetWidth = 11 * HbDeviceProfile::current().unitValue();
+		if (aTextWidth > aWidgetWidth) {
+		    mContactNameLabel->setAlignment(Qt::AlignLeft);
+		} else {
+		    mContactNameLabel->setAlignment(Qt::AlignHCenter);
+		}
     }    
 
     update();
@@ -406,15 +401,15 @@
         fontSpec.setTextHeight(textHeight);
     }
 
+    mContactNameLabel = new HbLabel(this);
+    mContactNameLabel->setTextWrapping(Hb::TextNoWrap);
+    mContactNameLabel->setFontSpec(fontSpec);
     if (mContactLocalId == unUsedContactId) {
-        mContactNameLabel = new HbLabel("");
+        setName("");
     } else {
-		QString name = getContactDisplayName(mContact);
-        mContactNameLabel = new HbLabel(name);
+        setName(getContactDisplayName(mContact));
     }            
     
-    mContactNameLabel->setAlignment(Qt::AlignHCenter);
-    mContactNameLabel->setFontSpec(fontSpec);
     // color from theme
     QColor textColor = HbColorScheme::color(normalTextColor);
     if (textColor.isValid()) {
@@ -484,7 +479,6 @@
 {
 	qDebug() << "mouseReleaseEvent event->type() = " << (int)event->type();
 
-	//Q_UNUSED(event);
     if (event && event->type() == QEvent::GraphicsSceneMouseRelease) {
         // If the widget doesn't have contact yet and
         // there are contacts, select one.    
@@ -492,18 +486,8 @@
             if (contactsExist()) {				    
                 launchSingleContactSelecting();                  
             } else {
-                // Otherwise ask if user wants to open phonebook
-                // tmp variable used for title, otherwise parent param is ignored in mb
-                QString title = hbTrId("txt_friend_widget_info_you_can_not_use_this_widge");
-                HbDeviceMessageBox mb( title, HbMessageBox::MessageTypeQuestion, this);
-                mb.setAction(new QAction(hbTrId("txt_common_button_open"),   &mb), 
-                    HbDeviceMessageBox::AcceptButtonRole);
-                mb.setAction(new QAction(hbTrId("txt_common_button_cancel"), &mb), 
-                    HbDeviceMessageBox::RejectButtonRole);
-                mb.setIconVisible(false);
-                if (mb.exec() == mb.action(HbDeviceMessageBox::AcceptButtonRole)) {				        
-                    mLauncher->openPhonebookCreateNew();
-                }
+            	// otherwise ask user if want create one
+            	showNoneContactMessage();
             }
         } else if (!mLauncher->isVisible()) {
             // Change the frame layout
@@ -679,25 +663,20 @@
     if (!mContactManager) { 
         createContactManager();
     }
-    bool ret=false;
-    // 
+    bool aResult = false;
+
     if (mContactManager) {
         QList<QContactLocalId> contactIds = mContactManager->contactIds();
         qDebug() << "contact count " << contactIds.count();
-        if (contactIds.count() > 0) {
-        qDebug() << "first " << contactIds.first();
-        int i;
-        for(i=0; i<contactIds.count(); i++) {
-			qDebug() << "contactIds i " << i << " id " << contactIds.at(i);
-        }                        
-            if (contactIds.first() != mContactManager->selfContactId() ||
-                contactIds.count() > 1) {
-                ret=true;
-            }
+    	if (contactIds.count() > 1) {
+    		aResult = true;
+    	} else if (contactIds.count() == 1 &&
+    			   contactIds.first() != mContactManager->selfContactId()) {
+			aResult = true;
         }
     }
     
-    return ret;
+    return aResult;
 }
 
 /*!
@@ -717,20 +696,25 @@
     mContactSelectRequest = mAppManager->create(XQI_CONTACTS_FETCH,
                                                 XQOP_CONTACTS_FETCH_SINGLE,
                                                 false);
-    mCleanupHandler.add(mContactSelectRequest);
-    connect(mContactSelectRequest, SIGNAL(requestOk(QVariant)),
-            this, SLOT(onContactSelectCompleted(QVariant)));  
-    QList<QVariant> args;
-    args << hbTrId("txt_friend_widget_title_select_contact");
-    args << KCntActionAll;
-    mContactSelectRequest->setArguments(args);
+    if (mContactSelectRequest) {
+    	mCleanupHandler.add(mContactSelectRequest);
+		connect(mContactSelectRequest, SIGNAL(requestOk(QVariant)),
+				this, SLOT(onContactSelectCompleted(QVariant)));  
+		QList<QVariant> args;
+		args << hbTrId("txt_friend_widget_title_select_contact");
+		args << KCntActionAll;
+		mContactSelectRequest->setArguments(args);
+		mContactSelectRequest->setSynchronous(false);
     
-    qDebug() << "---- setArgs done ---------------------"; //,,28.5.          
+		qDebug() << "---- setArgs done ---------------------"; //,,28.5.          
     
-    result = mContactSelectRequest->send();
-    if (!result) {
-        qDebug() << "Sending XQServiceRequest failed";
-    }  
+		result = mContactSelectRequest->send();
+		if (!result) {
+			qDebug() << "Sending XQServiceRequest failed";
+		}
+    } else {
+    	qDebug() << "mContactSelectRequest not created !!!";
+    }
     
     qDebug() << "- launchSingleContactSelecting() done"; //,,
    
@@ -882,7 +866,11 @@
     update();
 }
 
-void ContactWidgetHs::onSelfContactIdChanged(const QContactLocalId &theOldId,
+/*!
+ * check if local contact was changed to self contact,
+ * if yes remove widget form homescreen 
+ */
+void ContactWidgetHs::onSelfContactIdChanged(const QContactLocalId & /*theOldId*/,
         const QContactLocalId &theNewId) {
     if (0 != theNewId && mContactLocalId == theNewId) {
         qDebug() << "-deleting widget after selfcontact change"
@@ -891,6 +879,9 @@
     }
 }
 
+/*!
+ * function to finish widget and remove widget from homescreen
+ */
 void ContactWidgetHs::finishWidget() {
     mAvatarIconItem->deleteLater();
     mContactNameLabel->deleteLater();
@@ -903,5 +894,42 @@
     	mPendingExit = true;
     }
 }
+
+/*!
+ * Ask if user wants to open phonebook
+ */
+void ContactWidgetHs::showNoneContactMessage() {
+	if (0 == mNoneContactMessage) {
+	    QString aTitle = hbTrId("txt_friend_widget_info_you_can_not_use_this_widge");
+		mNoneContactMessage = new HbDeviceMessageBox(aTitle,
+				HbMessageBox::MessageTypeQuestion,
+				this);
+		mNoneContactMessage->setAction(
+				new QAction(hbTrId("txt_common_button_open"), mNoneContactMessage),
+		        HbDeviceMessageBox::AcceptButtonRole);
+		mNoneContactMessage->setAction(
+				new QAction(hbTrId("txt_common_button_cancel"), mNoneContactMessage),
+				HbDeviceMessageBox::RejectButtonRole);
+		mNoneContactMessage->setIconVisible(false);
+		connect(mNoneContactMessage, SIGNAL(aboutToClose()),
+				this, SLOT(onAboutCloseNoneContactMessage()));
+	}
+	mNoneContactMessage->show();
+}
+
+/*!
+ * if user select open in mNoneContactMessage,
+ * open a phonebook for creating new contact
+ */
+void ContactWidgetHs::onAboutCloseNoneContactMessage() {
+	if (mNoneContactMessage) {
+		const QAction * aResult = mNoneContactMessage->triggeredAction();
+		bool aCanOpenPhonebook = mNoneContactMessage->isAcceptAction(aResult);
+		if (aCanOpenPhonebook) {
+			mLauncher->openPhonebookCreateNew();
+		}
+	}
+}
+
 Q_IMPLEMENT_USER_METATYPE(CntServicesContact)
 Q_IMPLEMENT_USER_METATYPE_NO_OPERATORS(CntServicesContactList)
--- a/contactwidgethsplugin/contactwidgeths/t_contactwidgeths/t_contactwidgeths.pro	Fri Oct 08 11:42:51 2010 +0300
+++ b/contactwidgethsplugin/contactwidgeths/t_contactwidgeths/t_contactwidgeths.pro	Fri Oct 15 12:24:46 2010 +0300
@@ -53,6 +53,7 @@
     TARGET.UID3 = 0x2002C355
     TARGET.CAPABILITY = CAP_APPLICATION AllFiles
     TARGET.EPOCHEAPSIZE = 10000 54000000
+    MMP_RULES += SMPSAFE
 
     BLD_INF_RULES.prj_exports += \
         "./resource/test1_avatar.jpg     $$PLUGIN_SUBDIR/test1_avatar.jpg"   \
--- a/contactwidgethsplugin/t_contactwidgethsplugin/t_contactwidgethsplugin.pro	Fri Oct 08 11:42:51 2010 +0300
+++ b/contactwidgethsplugin/t_contactwidgethsplugin/t_contactwidgethsplugin.pro	Fri Oct 15 12:24:46 2010 +0300
@@ -49,6 +49,7 @@
 symbian {
     TARGET.UID3 = 0x2002C354
     TARGET.CAPABILITY = CAP_APPLICATION AllFiles
+    MMP_RULES += SMPSAFE
 }
 
 include(t_contactwidgethsplugin.pri)
--- a/package_definition.xml	Fri Oct 08 11:42:51 2010 +0300
+++ b/package_definition.xml	Fri Oct 15 12:24:46 2010 +0300
@@ -17,7 +17,33 @@
     <unit base="contacts_plat/presence_cache_api"/>
    </component>
   </collection>
+  <collection id="presencecache" name="Presence Cache" level="support">
+   <component id="presencecachesymbian" filter="s60" name="Presence Cache Symbian" introduced="^4">
+    <unit bldFile="presencecache/presencecachesymbian" qt:proFile="presencecachesymbian.pro"/>
+   </component>
+   <component id="presencecacheqt" filter="s60" name="Presence Cache Qt" introduced="^4">
+    <unit bldFile="presencecache/presencecacheqt" qt:proFile="presencecacheqt.pro"/>
+   </component>
+  </collection>
+  <collection id="phonebookengines" name="Phonebook Engines" level="engine">
+   <component id="qtcontactsmobility" filter="s60" name="Qt Contacts Mobility" class="plugin" introduced="^4">
+	<!-- need to move to this actual dir rather than including something from another collection -->
+    <!-- <unit bldFile="qtcontactsmobility" qt:proFile="qtcontactsmobility.pro"/> -->
+   </component>
+   <component id="cntactions" filter="s60" name="Contacts Actions" introduced="^4">
+    <unit bldFile="phonebookengines/cntactions" qt:proFile="cntactions.pro"/>
+   </component>
+   <component id="cntsimutility" filter="s60" name="Contacts SIM Utility" introduced="^4">
+    <unit bldFile="phonebookengines/cntsimutility" qt:proFile="cntsimutility.pro"/>
+   </component>
+   <component id="cntimageutility" name="Contacts Image Utility" filter="s60" introduced="^4">
+      <unit bldFile="phonebookengines/cntimageutility" qt:proFile="cntimageutility.pro"/>
+   </component>
+  </collection>
   <collection id="phonebookui" name="Phonebook UI" level="ui">
+   <component id="cntlistmodel" filter="s60" name="Contact List Model" introduced="^4">
+    <!--unit bldFile="phonebookengines/cntlistmodel" qt:proFile="cntlistmodel.pro"/> -->
+   </component>
    <component id="cnthistorymodel" filter="s60" name="Contacts History Model" introduced="^4">
     <!--<unit bldFile="phonebookui/cnthistorymodel" qt:proFile="cnthistorymodel.pro"/> -->
    </component>
@@ -35,30 +61,6 @@
     <unit bldFile="phonebookui" qt:proFile="phonebookui.pro"/>
    </component>
   </collection>
-  <collection id="phonebookengines" name="Phonebook Engines" level="engine">
-   <component id="cntfindplugin" filter="s60" name="Contacts Find Plugin" class="plugin" introduced="^2">
-    <unit bldFile="phonebookengines/cntfindplugin" qt:proFile="cntfindplugin.pro"/>
-   </component>
-   <component id="cntsortplugin" filter="s60" name="Contacts Sort Plugin" class="plugin" introduced="^2">
-    <unit bldFile="phonebookengines/cntsortplugin" qt:proFile="cntsortplugin.pro"/>
-   </component>
-   <component id="qtcontactsmobility" filter="s60" name="Qt Contacts Mobility" class="plugin" introduced="^4">
-	<!-- need to move to this actual dir rather than including something from another collection -->
-    <!-- <unit bldFile="qtcontactsmobility" qt:proFile="qtcontactsmobility.pro"/> -->
-   </component>
-   <component id="cntlistmodel" filter="s60" name="Contact List Model" introduced="^4">
-    <unit bldFile="phonebookengines/cntlistmodel" qt:proFile="cntlistmodel.pro"/>
-   </component>
-   <component id="cntactions" filter="s60" name="Contacts Actions" introduced="^4">
-    <unit bldFile="phonebookengines/cntactions" qt:proFile="cntactions.pro"/>
-   </component>
-   <component id="cntsimutility" filter="s60" name="Contacts SIM Utility" introduced="^4">
-    <unit bldFile="phonebookengines/cntsimutility" qt:proFile="cntsimutility.pro"/>
-   </component>
-   <component id="cntimageutility" name="Contacts Image Utility" filter="s60" introduced="^4">
-      <unit bldFile="phonebookengines/cntimageutility" qt:proFile="cntimageutility.pro"/>
-   </component>
-  </collection>
   <collection id="pimprotocols" name="PIM Protocols" level="services">
    <component id="phonebooksync" name="Phonebook Sync" purpose="optional" class="plugin" filter="s60">
     <unit bldFile="pimprotocols/phonebooksync/group" mrp="pimprotocols/phonebooksync/group/telephony_phbksync.mrp"/>
@@ -67,19 +69,16 @@
     <unit bldFile="pimprotocols/pbap/group" mrp="pimprotocols/pbap/group/bluetooth_accesshost.mrp"/>
    </component>
   </collection>
-  <collection id="presencecache" name="Presence Cache" level="support">
-   <component id="presencecachesymbian" filter="s60" name="Presence Cache Symbian" introduced="^4">
-    <unit bldFile="presencecache/presencecachesymbian" qt:proFile="presencecachesymbian.pro"/>
-   </component>
-   <component id="presencecacheqt" filter="s60" name="Presence Cache Qt" introduced="^4">
-    <unit bldFile="presencecache/presencecacheqt" qt:proFile="presencecacheqt.pro"/>
-   </component>
-  </collection>
   <collection id="contactwidgethsplugin" name="Contact Widget Homescreen Plugin" level="plugin">
 	<!-- collection is really a component, move down a directory -->
    <component id="contactwidgethsplugin_build" name="Contact Widget Homescreen Plugin Build" introduced="^4" filter="s60">
       <unit bldFile="contactwidgethsplugin" qt:proFile="contactwidgethsplugin.pro"/>
    </component>
   </collection>
+  <collection id="contacts_test" name="Contacts Unit Tests" level="support">
+   <component id="contacts_test_build" filter="s60,test,qt_unit_test" name="Contacts Unit Tests Build" purpose="development" introduced="^4">
+   		<unit bldFile="tsrc" qt:proFile="tsrc.pro"/> 
+		</component>
+	</collection>        
  </package>
 </SystemDefinition>
--- a/phonebookengines/bwins/cntimageutilityu.def	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookengines/bwins/cntimageutilityu.def	Fri Oct 15 12:24:46 2010 +0300
@@ -19,4 +19,19 @@
 	?isImageRemovable@CntImageUtility@@QAE_NABVQString@@@Z @ 18 NONAME ; bool CntImageUtility::isImageRemovable(class QString const &)
 	??0CntImageUtility@@QAE@PAVQObject@@@Z @ 19 NONAME ; CntImageUtility::CntImageUtility(class QObject *)
 	?removeImage@CntImageUtility@@QAE_NABVQString@@@Z @ 20 NONAME ; bool CntImageUtility::removeImage(class QString const &)
+	?orientation@CntOrientationHelper@@QAEAAW4Orientation@Qt@@XZ @ 21 NONAME ; enum Qt::Orientation & CntOrientationHelper::orientation(void)
+	?metaObject@CntOrientationHelper@@UBEPBUQMetaObject@@XZ @ 22 NONAME ; struct QMetaObject const * CntOrientationHelper::metaObject(void) const
+	?orientationChanged@CntOrientationHelper@@IAEXW4Orientation@Qt@@@Z @ 23 NONAME ; void CntOrientationHelper::orientationChanged(enum Qt::Orientation)
+	?trUtf8@CntOrientationHelper@@SA?AVQString@@PBD0@Z @ 24 NONAME ; class QString CntOrientationHelper::trUtf8(char const *, char const *)
+	?tr@CntOrientationHelper@@SA?AVQString@@PBD0@Z @ 25 NONAME ; class QString CntOrientationHelper::tr(char const *, char const *)
+	?getStaticMetaObject@CntOrientationHelper@@SAABUQMetaObject@@XZ @ 26 NONAME ; struct QMetaObject const & CntOrientationHelper::getStaticMetaObject(void)
+	?emitOrientationChanged@CntOrientationHelper@@AAEXABVXQSettingsKey@@ABVQVariant@@@Z @ 27 NONAME ; void CntOrientationHelper::emitOrientationChanged(class XQSettingsKey const &, class QVariant const &)
+	??1CntOrientationHelper@@UAE@XZ @ 28 NONAME ; CntOrientationHelper::~CntOrientationHelper(void)
+	?tr@CntOrientationHelper@@SA?AVQString@@PBD0H@Z @ 29 NONAME ; class QString CntOrientationHelper::tr(char const *, char const *, int)
+	??_ECntOrientationHelper@@UAE@I@Z @ 30 NONAME ; CntOrientationHelper::~CntOrientationHelper(unsigned int)
+	?qt_metacall@CntOrientationHelper@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 31 NONAME ; int CntOrientationHelper::qt_metacall(enum QMetaObject::Call, int, void * *)
+	?trUtf8@CntOrientationHelper@@SA?AVQString@@PBD0H@Z @ 32 NONAME ; class QString CntOrientationHelper::trUtf8(char const *, char const *, int)
+	?qt_metacast@CntOrientationHelper@@UAEPAXPBD@Z @ 33 NONAME ; void * CntOrientationHelper::qt_metacast(char const *)
+	?staticMetaObject@CntOrientationHelper@@2UQMetaObject@@B @ 34 NONAME ; struct QMetaObject const CntOrientationHelper::staticMetaObject
+	??0CntOrientationHelper@@QAE@PAVQObject@@@Z @ 35 NONAME ; CntOrientationHelper::CntOrientationHelper(class QObject *)
 
--- a/phonebookengines/cntactions/src/cntemailaction.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookengines/cntactions/src/cntemailaction.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -68,7 +68,8 @@
     m_request = m_AppManager.create(XQI_EMAIL_MESSAGE_SEND, "send(QVariant)", true);
     
     if (m_request) {
-        QMap<QString, QVariant> map;
+        QVariantMap dataMap;
+        QVariantMap emailMap;
         QStringList recipients;
         QList<QVariant> data;
 
@@ -76,16 +77,32 @@
         if (QContactType::TypeGroup == m_contact.type()) {
             QStringList emails;
             QVariant value = m_data.value("email");
-            if (value.canConvert<QStringList>()) {
-                emails = value.toStringList();
+            if (value.canConvert<QVariantMap>()) {
+                emailMap = value.toMap();
             }
             
-            if (!emails.isEmpty()) {
-                for (int i=0;i<emails.count();i++) {
-                    recipients.append(emails.at(i));
+            if (!emailMap.isEmpty()) {
+                QVariantMap::const_iterator i = emailMap.constBegin();
+                while (i != emailMap.constEnd()) {
+                    QString formatString;
+                    QString emailAddress;
+                    QString displayLabel;
+                    
+                    emailAddress = i.key();
+                    if (i.value().canConvert<QString>())
+                        displayLabel = i.value().toString();
+                    
+                    // Email addresses format string:
+                    // Firstname Lastname <email@address.com>
+                    if (!displayLabel.isEmpty())
+                        formatString += displayLabel + " ";
+                    formatString += "<" + emailAddress + ">";
+                    recipients.append(formatString);
+                 
+                    ++i;
                 }
-                map.insert(EMAIL_SEND_TO_KEY, recipients);
-                data.append(map);
+                dataMap.insert(EMAIL_SEND_TO_KEY, recipients);
+                data.append(dataMap);
 
                 m_request->setArguments(data);
                 m_request->send(retValue);
@@ -100,9 +117,17 @@
         else if (m_detail.definitionName() == QContactEmailAddress::DefinitionName) {
             const QContactEmailAddress &email = static_cast<const QContactEmailAddress &>(m_detail);
 
-            recipients.append(email.emailAddress());
-            map.insert(EMAIL_SEND_TO_KEY, recipients);
-            data.append(map);
+            // Email addresses format string:
+            // Firstname Lastname <email@address.com>
+            QString formatString;
+            QString displayLabel = m_contact.displayLabel();
+            if (!displayLabel.isEmpty())
+                formatString += displayLabel + " ";
+            formatString += "<" + email.emailAddress() + ">";
+            
+            recipients.append(formatString);
+            dataMap.insert(EMAIL_SEND_TO_KEY, recipients);
+            data.append(dataMap);
 
             m_request->setArguments(data);
             m_request->send(retValue);
--- a/phonebookengines/cntactions/tsrc/mt_cntactions/testrunner.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookengines/cntactions/tsrc/mt_cntactions/testrunner.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -37,14 +37,19 @@
   mCurrentTestFailed(false),
   mCurrentTestFailureLine(0)
 {
+ #ifdef __WINS__ 
     mTestRunParams.append(name);
+  
     mTestRunParams.append("-xml");
+    
     mTestRunParams.append("-o");
     mHomeDir = QDir::homePath();
+    	
     mTestRunParams.append(QString()); // Initial result file name
 
     if (!mHomeDir.endsWith(QString::fromAscii("/")))
         mHomeDir += QString::fromAscii("/");
+#endif 
 }
 
 TestRunner::~TestRunner()
@@ -55,13 +60,18 @@
 {
     QString className(testObject.metaObject()->className());
     printf("Running tests for %s ... ", className.toUtf8().data());
+#ifdef __WINS__    
     QString resultFileName = mHomeDir + className + ".xml";
     mTestRunParams.replace(mTestRunParams.count()-1,resultFileName);
     int errorsBefore = mErrors.count();
     int error = QTest::qExec(&testObject, mTestRunParams);
     parse(resultFileName);
     printf("Failures: %d\n",mErrors.count()-errorsBefore);
-    fflush(stdout);
+   	fflush(stdout);  	
+#else
+    int error = QTest::qExec(&testObject);
+#endif
+    
     return error;
 }
 
@@ -78,7 +88,7 @@
         printf("All passed.\n\n");
     }
     fflush(stdout);
-    
+#ifdef __WINS__       
     //To write in file
     QFile file("C:\\TestResult.txt");
     if(file.open(QIODevice::WriteOnly)) 
@@ -101,7 +111,8 @@
         
         ts << endl;
         file.close();
-    } 
+    }
+#endif      
 }
 
 void TestRunner::parse(const QString& fileName)
--- a/phonebookengines/cntfindplugin/group/cntfindplugin.mmp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-/*
-* Copyright (c) 2002 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: 
-*     Build information file for contact model plugin needed for chinese find
-*
-*/
-
-
-#include "cntfindpluginuid.h"
-#include <platform_paths.hrh>
-#include <data_caging_paths.hrh>
-
-TARGET          cntfindplugin.dll
-TARGETTYPE      PLUGIN
-UID             KEComPluginUID2 KCntModelFindPluginDllUID3
-CAPABILITY      CAP_ECOM_PLUGIN
-VENDORID        VID_DEFAULT
-
-SOURCEPATH      ../src
-SOURCE          dllmain.cpp
-SOURCE          cntfindplugin.cpp
-
-USERINCLUDE     ../group
-APP_LAYER_SYSTEMINCLUDE
-
-START RESOURCE  101f85f4.rss
-TARGET          cntfindplugin
-TARGETPATH      resource/plugins
-END
-
-LIBRARY         euser.lib
-LIBRARY         ECom.lib
-LIBRARY         findutil.lib
--- a/phonebookengines/cntfindplugin/group/cntfindpluginuid.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/*
-* Copyright (c) 2002 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: 
-*    Common header for Contact Model Find Plugin UIDs. 
-*
-*
-*/
-
-#ifndef     __CntFindPluginUid_H__
-#define     __CntFindPluginUid_H__
-
-// Contact Model Find Plugin DLL UID
-#define KCntModelFindPluginDllUID3              0x101F85F4
-
-// Contact Model Find Plugin Interface UID
-#define KCntModelFindPluginInterfaceUID         0x101F85F5
-
-// Implementation UID
-#define KCntModelFindPluginImplementationUID    0x101F85F6
-
-//
-// Common system UIDs
-//
-
-// ECom Plugin UID 2
-#define KEComPluginUID2                         0x10009D8D
-
-#endif // CntFindPluginUid
-
--- a/phonebookengines/cntfindplugin/rom/cntfindplugin.iby	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-/*
-* 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:
-*
-*/
-
-#ifndef __CNTFINDPLUGIN_IBY__
-#define __CNTFINDPLUGIN_IBY__
-
-ECOM_PLUGIN(cntfindplugin.dll,101f85f4.RSC)
-
-#endif
--- a/phonebookengines/cntfindplugin/src/101f85f4.rss	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-/*
-* Copyright (c) 2002 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: 
-*     Contact model ECOM plugin resource file
-*
-*/
-
-
-#include <ecom/registryinfo.rh>
-#include "cntfindpluginuid.h"
-
-RESOURCE REGISTRY_INFO theInfo
-	{
-	dll_uid = KCntModelFindPluginDllUID3;
-	interfaces = 
-		{
-		INTERFACE_INFO
-			{
-			interface_uid = KCntModelFindPluginInterfaceUID;
-			implementations = 
-				{
-				IMPLEMENTATION_INFO
-					{
-					implementation_uid = KCntModelFindPluginImplementationUID;
-					version_no = 1;
-					display_name = "Contacts Find Plugin";
-					default_data = "<none>";
-					opaque_data = "";
-					}
-				};
-			}
-		};
-	}
--- a/phonebookengines/cntfindplugin/src/cntfindplugin.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,106 +0,0 @@
-/*
-* Copyright (c) 2002 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: 
-*     Contact model ECOM plugin for chinese find.
-*
-*/
-
-
-// INCLUDE FILES
-#include "cntfindplugin.h"
-#include <FindUtil.h>
-
-// ========================== MEMBER FUNCTIONS ===============================
-
-// ---------------------------------------------------------------------------
-// CAknFindUtilBase::NewL
-// ---------------------------------------------------------------------------
-//
-CAknFindUtilBase* CAknFindUtilBase::NewL()
-	{
-	CAknFindUtilBase* self=new(ELeave) CAknFindUtilBase;
-    CleanupStack::PushL( self );
-    self->OpenL();
-    CleanupStack::Pop();
-	return self;
-	}
-
-// ---------------------------------------------------------------------------
-// CAknFindUtilBase::~CAknFindUtilBase
-// ---------------------------------------------------------------------------
-//
-CAknFindUtilBase::~CAknFindUtilBase()
-	{
-	delete iFindUtil;
-	}
-
-// ---------------------------------------------------------------------------
-// CAknFindUtilBase::CAknFindUtilBase
-// ---------------------------------------------------------------------------
-//
-CAknFindUtilBase::CAknFindUtilBase()
-	{
-	}
-
-// ---------------------------------------------------------------------------
-// CAknFindUtilBase::OpenL
-// ---------------------------------------------------------------------------
-//
-void CAknFindUtilBase::OpenL()
-	{
-    if (!iFindUtil)
-        {
-        iFindUtil = CFindUtil::NewL();
-        }
-	}
-
-// ---------------------------------------------------------------------------
-// CAknFindUtilBase::Close
-// ---------------------------------------------------------------------------
-//
-void CAknFindUtilBase::Close()
-	{
-    delete iFindUtil;
-    iFindUtil = NULL;
-	}
-
-// ---------------------------------------------------------------------------
-// CAknFindUtilBase::Match
-// ---------------------------------------------------------------------------
-//
-TBool CAknFindUtilBase::Match(const TDesC& aContactsField, const TDesC& aWord)
-	{
-	return iFindUtil->Interface()->Match(aContactsField, aWord);
-	}
-
-// ---------------------------------------------------------------------------
-// CAknFindUtilBase::IsWordValidForMatching
-// ---------------------------------------------------------------------------
-//
-TBool CAknFindUtilBase::IsWordValidForMatching(const TDesC& aWord)
-	{
-    return iFindUtil->Interface()->IsWordValidForMatching(aWord);
-	}
-
-// ---------------------------------------------------------------------------
-// CAknFindUtilBase::MatchRefineL
-// ---------------------------------------------------------------------------
-//
-TBool CAknFindUtilBase::MatchRefineL
-        (const TDesC& aItemString, const TDesC &aSearchText)
-	{
-	return iFindUtil->Interface()->MatchRefineL(aItemString, aSearchText);
-	}
-
-// End of File
--- a/phonebookengines/cntfindplugin/src/cntfindplugin.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-/*
-* Copyright (c) 2002 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: 
-*     Contact model ECOM plugin for chinese find.
-*
-*/
-
-
-#ifndef __CntFindPlugin_H__
-#define __CntFindPlugin_H__
-
-// INCLUDES
-#include <cntviewfindconfig.h>
-
-// FORWARD DECLARATIONS
-class CFindUtil;
-
-// CLASS DECLARATION
-
-/**
- * This class implements the functionality promised by 
- * the CFindUtilInterface definition class.
- */
-class CAknFindUtilBase : public CContactViewFindConfigInterface
-    {
-    public: // Construction / Destruction
-        /**
-         * Two phase static constructor.
-         * @return Newly created instance of CAknFindUtilBase.
-         */
-	    static CAknFindUtilBase* NewL();
-	    ~CAknFindUtilBase();
-
-    private:	// From CContactViewFindConfigInterface
-	    void OpenL();
-	    void Close();
-	    TBool Match(const TDesC& aContactsField, const TDesC& aWord);	
-	    TBool IsWordValidForMatching(const TDesC& aWord);
-	    TBool MatchRefineL( const TDesC& aItemString, const TDesC& aSearchText);
-
-    private: // Implementation
-        /**
-         * Standard C++ constructor.
-         */
-	    CAknFindUtilBase();
-
-    private: // Data
-        /// Own: Find utility that implements the actual finding functionality
-	    CFindUtil* iFindUtil;
-    };
-
-#endif // __CAknFindUtilBase_H__
-
-// End of File
--- a/phonebookengines/cntfindplugin/src/dllmain.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
-* Copyright (c) 2002 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:
-*
-*/
-
-
-// INCLUDES
-#include <e32std.h>
-#include <ecom/implementationproxy.h>
-
-#include "cntfindplugin.h"
-#include "cntfindpluginuid.h"
-
-// Define the interface UIDs
-const TImplementationProxy ImplementationTable[] = 
-	{
-    IMPLEMENTATION_PROXY_ENTRY(KCntModelFindPluginImplementationUID,
-                               CAknFindUtilBase::NewL)
-	};
-
-// The one and only exported function that is the ECom entry point
-EXPORT_C const TImplementationProxy* ImplementationGroupProxy
-        (TInt& aTableCount)
-	{
-	aTableCount =
-	    sizeof(ImplementationTable) / sizeof(TImplementationProxy);
-
-	return ImplementationTable;
-	}
-
-/**
- * Standard Symbian OS DLL entry point.	
- */
-#ifndef EKA2
-TBool E32Dll(TDllReason)
-    {
-    return ETrue;
-    }
-#endif //  EKA2
-
-// End of File
--- a/phonebookengines/cntimageutility/cntimageutility.pro	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookengines/cntimageutility/cntimageutility.pro	Fri Oct 15 12:24:46 2010 +0300
@@ -31,13 +31,16 @@
 
 INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
 INCLUDEPATH += inc
+INCLUDEPATH += ../../inc
 
 HEADERS += inc/cntimageutilityglobal.h \
-           inc/cntimageutility.h
+           inc/cntimageutility.h \
+           inc/cntorientationhelper.h
 
-SOURCES += src/cntimageutility.cpp
+SOURCES += src/cntimageutility.cpp \
+		   src/cntorientationhelper.cpp
 
-LIBS += -lplatformenv -lefsrv
+LIBS += -lplatformenv -lefsrv -lxqsettingsmanager
 defBlock = \      
 	"$${LITERAL_HASH}if defined(EABI)" \
 		"DEFFILE  ../eabi/cntimageutility.def" \
--- a/phonebookengines/cntimageutility/inc/cntimageutilityglobal.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookengines/cntimageutility/inc/cntimageutilityglobal.h	Fri Oct 15 12:24:46 2010 +0300
@@ -20,10 +20,13 @@
 
 #include <QtCore/QtGlobal>
 
-#if defined(CNTIMAGEUTILITY_LIBRARY)
-#  define CNTIMAGEUTILITYLIB_EXPORT Q_DECL_EXPORT
+
+#ifdef CNTIMAGEUTILITY_NO_EXPORT
+#define CNTIMAGEUTILITYLIB_EXPORT 
+#elif CNTIMAGEUTILITY_LIBRARY
+#define CNTIMAGEUTILITYLIB_EXPORT Q_DECL_EXPORT
 #else
-#  define CNTIMAGEUTILITYLIB_EXPORT Q_DECL_IMPORT
+#define CNTIMAGEUTILITYLIB_EXPORT Q_DECL_IMPORT
 #endif
 
 #endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/cntimageutility/inc/cntorientationhelper.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,49 @@
+/*
+* 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:  
+*
+*/
+
+#ifndef CNTORIENTATIONHELPER_H_
+#define CNTORIENTATIONHELPER_H_
+
+#include "cntimageutilityglobal.h"
+
+#include <QObject>
+#include <xqsettingskey.h>
+#include <xqsettingsmanager.h>
+
+class CNTIMAGEUTILITYLIB_EXPORT CntOrientationHelper : public QObject
+{
+    Q_OBJECT
+public:
+    CntOrientationHelper( QObject* parent = NULL );
+    ~CntOrientationHelper();
+    
+    Qt::Orientation& orientation();
+    
+signals:
+    void orientationChanged( Qt::Orientation orientation );
+    
+private slots:
+    void emitOrientationChanged( const XQSettingsKey& key, const QVariant& value );
+    
+private:
+    XQSettingsManager* mSettings; // own
+    XQSettingsKey* mOrientationKey; // own
+    Qt::Orientation mOrientation;
+    
+    friend class TestCntOrientationHelper;
+};
+#endif /* CNTORIENTATIONHELPER_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/cntimageutility/src/cntorientationhelper.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,68 @@
+/*
+* 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 "cntorientationhelper.h"
+#include <restricted/hbcorepskeys_r.h>
+
+CntOrientationHelper::CntOrientationHelper( QObject* parent ) : 
+QObject( parent ),
+mSettings( NULL ),
+mOrientationKey( NULL )
+{
+    mSettings = new XQSettingsManager();
+    
+    mOrientationKey = new XQSettingsKey( XQSettingsKey::TargetPublishAndSubscribe, 
+        KHbPsForegroundAppOrientationCategoryUid.iUid, 
+        KHbPsForegroundAppOrientationKey);
+    
+    connect( mSettings, SIGNAL(valueChanged(const XQSettingsKey&, const QVariant&)),
+             this, SLOT(emitOrientationChanged(const XQSettingsKey&, const QVariant&)) );
+
+    int orientation = mSettings->readItemValue(*mOrientationKey, XQSettingsManager::TypeInt).toInt(); 
+    mOrientation = Qt::Orientation(orientation & 0x7F);
+
+    mSettings->startMonitoring( *mOrientationKey, XQSettingsManager::TypeInt );
+}
+
+CntOrientationHelper::~CntOrientationHelper()
+{
+    mSettings->stopMonitoring( *mOrientationKey );
+    
+    delete mSettings;
+    delete mOrientationKey;
+}
+
+Qt::Orientation& CntOrientationHelper::orientation()
+{
+    return mOrientation;
+}
+
+void CntOrientationHelper::emitOrientationChanged( const XQSettingsKey& key, const QVariant& value )
+{
+    if ( key.uid() == mOrientationKey->uid() && key.key() == mOrientationKey->key() ) 
+    {
+        bool ok;
+        int orientation = value.toInt( &ok );
+        if ( ok ) {
+            // Bits 0-7 contain the Qt::Orientation value.
+            // If bit 8 is set then the orientation is a fixed (forced) one.
+            // If bit 8 is not set then the orientation is managed automatically by the framework.
+            mOrientation = Qt::Orientation( orientation & 0x7F ); 
+            emit orientationChanged( mOrientation );   
+        }
+    }
+}
--- a/phonebookengines/cntlistmodel/cntlistmodel.pro	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-# 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:
-TEMPLATE = lib
-TARGET = cntlistmodel
-DEFINES += dll \
-    BUILD_CNTLISTMODEL
-
-MOC_DIR = moc
-
-CONFIG += hb
-
-TARGET.CAPABILITY = CAP_GENERAL_DLL
-TARGET.EPOCALLOWDLLDATA = 1
-TARGET.UID3 = 0x20026FC3
-
-INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
-INCLUDEPATH += inc
-INCLUDEPATH += ../../inc
-
-HEADERS += inc/cntlistmodelglobal.h \
-    inc/cntlistmodel.h \
-    inc/cntlistmodel_p.h \
-    inc/cntcache.h \
-    inc/cntcache_p.h \
-    inc/cntnamefetcher.h \
-    inc/cntdefaultinfoprovider.h \
-    inc/cntpresenceinfoprovider.h \
-    inc/cntdisplaytextformatter.h \
-    ../../inc/cntdebug.h
-
-SOURCES += src/cntlistmodel.cpp \
-    src/cntcache.cpp \
-    src/cntcache_p.cpp \
-    src/cntnamefetcher.cpp \
-    src/cntdefaultinfoprovider.cpp \
-    src/cntpresenceinfoprovider.cpp \
-    src/cntdisplaytextformatter.cpp
-
-LIBS += -lQtContacts \
-    -lhbcore \
-    -lthumbnailmanagerqt \
-    -lpresencecacheqt \
-    -lxqsettingsmanager \
-    -lestor \
-    -lefsrv \
-    -lxqutils
-
-DEPLOYMENT += exportheaders
-
-:BLD_INF_RULES.prj_exports += "../../contacts_plat/contacts_ui_extensions_api/inc/cntinfoproviderfactory.h APP_LAYER_PLATFORM_EXPORT_PATH(cntinfoproviderfactory.h)"
-:BLD_INF_RULES.prj_exports += "../../contacts_plat/contacts_ui_extensions_api/inc/cntinfoprovider.h APP_LAYER_PLATFORM_EXPORT_PATH(cntinfoprovider.h)"
-
-defBlock = "$${LITERAL_HASH}if defined(EABI)" \
-    "DEFFILE ../eabi/cntlistmodel.def" \
-    "$${LITERAL_HASH}else" \
-    "DEFFILE ../bwins/cntlistmodel.def" \
-    "$${LITERAL_HASH}endif"
-MMP_RULES += defBlock
--- a/phonebookengines/cntlistmodel/inc/cntcache.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,144 +0,0 @@
-/*
-* Copyright (c) 2010 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: Class for asynchronously fetching and caching
-*              basic contact info for list views.
-*
-*/
-
-#ifndef CNTCACHE_H
-#define CNTCACHE_H
-
-#include <QObject>
-#include <QSharedData>
-#include <HbIcon>
-#include <cntuids.h>
-#include <qcontactmanager.h>
-#include <cntinfoprovider.h>
-#include <collate.h>
-
-class CntContactInfoData;
-class CntNameFetcher;
-class CntCacheThread;
-class CntInfoCacheItem;
-class CntIconCacheItem;
-class CntNameCacheItem;
-
-QTM_USE_NAMESPACE
-
-/*
-   Info about one contact that can be used by listviews:
-   - the id
-   - the full name, properly formatted
-   - text, secondary information like phone number
-   - icon1, the main icon
-   - icon2, a secondary icon
- */
-class CntContactInfo : public QObject
-{
-    Q_OBJECT
-public:
-    CntContactInfo();
-    CntContactInfo(int id, const QString& name, const QString& text, const HbIcon& icon1, const HbIcon& icon2);
-    ~CntContactInfo();
-
-    CntContactInfo(const CntContactInfo& other);
-    CntContactInfo& operator=(const CntContactInfo& other);
-
-    int id() const;
-    QString name() const;
-    QString text() const;
-    HbIcon icon1() const;
-    HbIcon icon2() const;
-
-private:
-    QSharedDataPointer<CntContactInfoData> d;
-};
-
-/*
-   Singleton class that acts as a proxy to get CntContactInfo objects for contacts.
-   It also implements caching for faster access. This is why the fetchContactInfo()
-   function takes a row number and the full list of contact IDs rather than just a
-   contact ID -- the former allows caching ahead.
-   
-   The usage pattern for clients is to call fetchContactInfo() to get at least the
-   name of the contact. If all the info is cached then it will be provided. If not,
-   then the uncached info is fetched asynchronously and contactInfoUpdated signals
-   are emitted as the pieces of information arrive -- up to three times per contact;
-   once for text, once for icon1 and once for icon2.
- */
-class CntCache : public QObject
-{
-    friend class TestCntCache;
-    friend class TestCntListModel;
-    Q_OBJECT
-public:
-    static CntCache* instance(QContactManager *manager);
-    CntContactInfo fetchContactInfo(int row, const QList<QContactLocalId>& idList);
-    QList<QContactLocalId> sortIdsByName(const QSet<QContactLocalId>* idFilter = NULL) const;
-    QList<QContactLocalId> sortIdsByName(const QStringList searchList) const;
-
-signals:
-    void contactInfoUpdated(QContactLocalId contactId);
-    void contactsChanged(const QList<QContactLocalId> &changedContacts);
-    void contactsRemoved(const QList<QContactLocalId> &removedContacts);
-    void contactsAdded(const QList<QContactLocalId> &addedContacts);
-    void dataChanged();
-
-private:
-    CntCache(QContactManager *manager);
-    ~CntCache();
-    void loadNames();
-    bool contactExists(QContactLocalId contactId) const;
-    QString contactName(QContactLocalId contactId) const;
-    CntInfoCacheItem* createInfoCacheItem(int contactId);
-    CntIconCacheItem* createIconCacheItem(const QString &iconName);
-    void updateReadAheadCache(int mostRecentRow, const QList<QContactLocalId> &idList);
-    void emitContactInfoUpdated(int contactId);
-
-private slots:
-    void onShutdown();
-    void reformatNames(CntNameOrder newFormat);
-    void onNewInfo(int contactId, const ContactInfoField &infoField, const QString &infoValue);
-    void onInfoCancelled(int contactId);
-    void scheduleOneReadAheadItem();
-    void onNewIcon(const QString &iconName, const HbIcon &icon);
-    void onIconCancelled(const QString &iconName);
-    void updateContacts(const QList<QContactLocalId> &changedContacts);
-    void removeContacts(const QList<QContactLocalId> &removedContacts);
-    void addContacts(const QList<QContactLocalId> &addedContacts);
-    void setNameList(QList<CntNameCacheItem *> newSortedNames);
-
-private:
-    static CntCache *mInstance;                   // the one and only instance of CntCache
-    QContactManager *mContactManager;             // for getting notifications about changes to contacts
-    CntCacheThread *mWorker;                      // the background thread that does the actual fetching
-    CntNameFetcher *mNameFetcher;                 // the helper that fetches contact names
-
-    QList<CntNameCacheItem *> mSortedNames;       // list of all contact names, in sorted order
-    QHash<QContactLocalId, CntNameCacheItem *> mNameCache;    // cache with all contact names, indexed by contact ids
-    QHash<int,CntInfoCacheItem *> mInfoCache;     // cache with contact info, indexed by contact ids
-    QHash<QString,CntIconCacheItem *> mIconCache; // cache with icons, indexed by icon name
-    QList< QPair<int, int> > mReadAheadCache;     // cache with contacts to prefetch (they are likely to be needed soon)
-
-    int mNextInfoCacheOrder;                      // cache order for the next item to be updated/inserted in info cache
-    int mNextIconCacheOrder;                      // cache order for the next item to be updated/inserted in icon cache
-    int mEmittedContactId;                        // id of the last contact emitted to UI
-    int mUrgentContacts;                          // the number of contacts left that need to be fetched asap
-    
-    bool mHasModifiedNames;                       // monitors whether any names have changed since file cache was last updated
-    bool mAllNamesFetchStarted;                   // false until the asynch fetching of all names from the DB has started;
-                                                  // this operation is done only once
-};
-
-#endif
--- a/phonebookengines/cntlistmodel/inc/cntcache_p.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,142 +0,0 @@
-/*
-* Copyright (c) 2010 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: Private data and helper classes used by class CntCache.
-*
-*/
-
-#ifndef CNTCACHE_P_H
-#define CNTCACHE_P_H
-
-#include <QSharedData>
-#include <QSet>
-#include <HbIcon>
-#include <qcontactmanager.h>
-#include "cntinfoprovider.h"
-
-class ThumbnailManager;
-
-QTM_USE_NAMESPACE
-
-/*!
-    Private shared data for the CntContactInfo class.
- */
-class CntContactInfoData : public QSharedData
-{
-public:
-     CntContactInfoData() : id(-1), fields(0) { }
-     ~CntContactInfoData() { }
-
-public:
-    int id;
-    int fields;
-    QString name;
-    QString text;
-    HbIcon icon1;
-    HbIcon icon2;
-};
-
-/*!
-    Cache item that holds info for one contact: text and two icon names.
- */
-class CntInfoCacheItem
-{
-public:
-    int cacheOrder;
-    int contactId;
-    int latestRow;
-    QString text;
-    QString icons[2];
-};
-
-/*!
-    Cache item that holds one icon. Data member isFetched is false until the
-    icon has been fetched asynchronously.
- */
-class CntIconCacheItem
-{
-public:
-    int cacheOrder;
-    QString iconName;
-    bool isFetched;
-    QSet<int> contactIds;
-    HbIcon icon;
-};
-
-/*!
-    Worker class that fetches contact info and icons in the background.
-    CntCacheThread uses info provider plugins and thumbnail manager to retrieve
-    the actual data. This class' responsibilities are 1) fetch the requested
-    data in a timely manner and 2) interfere with the UI as little as possible.
-    This is mainly orchestrated by the client, who calls postponeJobs() when
-    the UI is active.
-    
-    If the client sends many requests (e.g. during a long scrolling operation
-    in the UI), then the oldest jobs will be cancelled. However, the cancelled jobs
-    will be informed back to the client later so that it can choose to reschedule
-    the jobs.
- */
-class CntCacheThread : public QObject
-{
-    friend class TestCntCache;
-    Q_OBJECT
-public:
-    CntCacheThread();
-    ~CntCacheThread();
-
-    void scheduleInfoJob(int contactId, int priority);
-    void scheduleIconJob(const QString& iconName, int priority);
-    void postponeJobs(int milliseconds = 0);
-    bool event(QEvent *event);
-
-public slots:
-    void resumeJobs();
-
-signals:
-    void infoFieldUpdated(int contactId, ContactInfoField infoField, const QString& infoValue);
-    void infoCancelled(int contactId);
-    void iconUpdated(const QString& iconName, const HbIcon& icon);
-    void iconCancelled(const QString& iconName);
-    void allJobsDone();
-    
-private slots:
-    void onInfoFieldReady(CntInfoProvider* sender, int contactId,
-                          ContactInfoField field, const QString& text);
-    void onIconReady(const QPixmap& pixmap, void *data, int id, int error);
-
-private:
-    void processJobs();
-    int infoJobIndex(int contactId);
-    int takeNextInfoJob();
-    int iconJobIndex(QString iconName);
-    QString takeNextIconJob();
-
-private:
-    QContactManager* mContactManager;       // for fetching QContact objects
-    ThumbnailManager* mThumbnailManager;    // for fetching icons
-
-    // maps info providers to their responsibilities
-    QMap<CntInfoProvider*, ContactInfoFields> mInfoProviders;
-
-    bool mProcessingJobs;                   // true from when job loop event has been posted until job loop exits
-    int mJobsPostponed;                     // are jobs postponed (no / for some time / until further notice)
-    QList< QPair<int,int> > mInfoJobs;      // list of all info jobs and their priorities
-    QList<int> mCancelledInfoJobs;          // list of all cancelled info jobs
-    QList< QPair<QString,int> > mIconJobs;  // list of all icon jobs and their priorities
-    QList<QString> mCancelledIconJobs;      // list of all cancelled icon jobs
-    int mIconRequestId;                     // the id for the last request to thumbnail manager
-    QString mIconRequestName;               // the name of the icon last requested from thumbnail manager
-    QTimer *mTimer;                         // timer used when postponing jobs
-};
-
-#endif
--- a/phonebookengines/cntlistmodel/inc/cntdefaultinfoprovider.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-/*
-* Copyright (c) 2010 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: Default info provider plugin for CntListModel. It can provide
-*              the phone number and the image url of a contact (text and
-*              icon1 field respectively).
-*
-*/
-
-#ifndef CNTDEFAULTPROVIDER_H
-#define CNTDEFAULTPROVIDER_H
-
-#include <cntinfoprovider.h>
-#include <qcontact.h>
-
-QTM_USE_NAMESPACE
-
-/*
-   The default info provider plugin. It can provide the phone number and the
-   image url of a contact (text and icon1 field respectively).
- */
-class CntDefaultInfoProvider : public CntInfoProvider
-{
-    friend class TestCntDefaultInfoProvider;
-    Q_OBJECT
-    
-public:
-    QString id() const { return "default"; };
-    ContactInfoFields supportedFields() const;
-    void requestInfo(const QContact& contact, ContactInfoFields requestedInfo);
-    
-signals:
-    void infoFieldReady(CntInfoProvider* sender, int contactId, ContactInfoField field, const QString& value);
-};
-
-#endif
--- a/phonebookengines/cntlistmodel/inc/cntdisplaytextformatter.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-/*
-* 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:  
-*
-*/
-
-#ifndef CNTDISPLAYTEXTFORMATTER_H_
-#define CNTDISPLAYTEXTFORMATTER_H_
-
-#include <QObject>
-#include <qcontactfilter.h>
-QTM_USE_NAMESPACE
-
-#define TAG_START "<span style=\"background-color:%1;color:%2\">"
-#define TAG_END   "</span>"
-    
-class CntDisplayTextFormatter
-{
-public:
-    virtual ~CntDisplayTextFormatter(){}
-    virtual QString formattedText( const QString aText, const QContactFilter& aCriteria ) = 0;
-};
-
-class CntDummyDisplayTextFormatter : public QObject, public CntDisplayTextFormatter
-{
-    Q_OBJECT
-public:
-    CntDummyDisplayTextFormatter(){}
-    ~CntDummyDisplayTextFormatter(){}
-    
-    inline QString formattedText( const QString aText, const QContactFilter& aCriteria )
-    {
-        Q_UNUSED( aCriteria );
-        return aText;
-    }
-};
-
-class CntHTMLDisplayTextFormatter : public QObject, public CntDisplayTextFormatter
-{
-    Q_OBJECT
-
-public:
-    CntHTMLDisplayTextFormatter();
-    virtual ~CntHTMLDisplayTextFormatter();
-    
-    /*!
-     * Format given text with applied filter. Not that only following filter is supported:
-     * 
-     * QContactDetailFilter filter;
-     * filter.setDetailDefinitionName( QContactDisplayLabel::DefinitionName );
-     * filter.setMatchFlags( QContactDetailFilter::MatchStartsWith );
-     * 
-     * \param aText Buffer where to format
-     * \param aCriteria Applied filter
-     */
-    QString formattedText( const QString aText, const QContactFilter& aCriteria );
-    
-    /*!
-     * Insert tag to given text leaving given number
-     * of characters between start and end tag. 
-     * By default highlight is inserted.
-     * 
-     * \param aText Buffer where to insert tags
-     * \param aNumOfCharacters Number of characters to highlight
-     */
-    virtual void insertTag( QString& aText, int aNumOfCharacters );
-};
-#endif /* CNTDISPLAYTEXTFORMATTER_H_ */
--- a/phonebookengines/cntlistmodel/inc/cntlistmodel.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,95 +0,0 @@
-/*
-* 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:
-*
-*/
-#ifndef CNTLISTMODEL_H
-#define CNTLISTMODEL_H
-
-#include <QAbstractListModel>
-#include <QSharedData>
-#include <HbIcon>
-
-#include "cntlistmodelglobal.h"
-#include <qcontactmanager.h>
-#include <qcontactfilter.h>
-#include <qcontactsortorder.h>
-
-QTM_USE_NAMESPACE
-
-class CntListModelData;
-class XQSettingsKey;
-class CntDisplayTextFormatter;
-
-/*!
- * CntListModel is a list model view for contacts database
- * content. It will cache contacts database entries to be
- * displayed on the screen.
- *
- * Note that that this is a prototype implementation and does
- * not yet support more advanced features, such as automatic
- * update and lazy fetching from contacts database.
- */
-class CNTLISTMODEL_EXPORT CntListModel : public QAbstractListModel
-{
-    Q_OBJECT
-    friend class TestCntListModel;
-
-public:
-    CntListModel(QContactManager* manager,
-                const QContactFilter& contactFilter = QContactFilter(),
-                bool showMyCard = true,
-                QObject *parent = 0);
-    ~CntListModel();
-
-public: // from QAbstractTableModel/QAbstractItemModel
-    QVariant data(const QModelIndex &index, int role) const;
-    int rowCount(const QModelIndex &parent = QModelIndex()) const;
-
-public:
-	QContact contact(const QModelIndex &index) const;
-    QContactLocalId contactId(const QModelIndex &index) const;
-	QModelIndex indexOfContact(const QContact &contact) const;
-	QModelIndex indexOfContactId(const QContactLocalId &contactId) const;
-	void setFilter(const QContactFilter& contactFilter = QContactFilter());
-	void showMyCard(bool enabled);
-	bool myCardStatus() const;
-	QContactLocalId myCardId() const;
-		
-private:
-    void updateContactIdsArray();
-    QContact contact(int row) const;
-    bool validRowId(int row) const;
-    int rowId(const QContactLocalId &contactId) const;
-    QVariant dataForRole(int row, int role) const;
-    void updateRelationships();
-
-private slots:
-    void handleAdded(const QList<QContactLocalId>& contactIds);
-    void handleChanged(const QList<QContactLocalId>& contactIds);
-    void handleRemoved(const QList<QContactLocalId>& contactIds);
-    void handleMyCardChanged(const QContactLocalId& oldId, const QContactLocalId& newId);
-    void handleContactInfoUpdated(QContactLocalId contactId);
-    void handleAddedRelationship(const QList<QContactLocalId>& contactIds);
-    void handleRemovedRelationship(const QList<QContactLocalId>& contactIds);
-    void handleRowSettingChanged(const XQSettingsKey& key, const QVariant& value);
-    void refreshModel();
-
-private:
-    QSharedDataPointer<CntListModelData>  d;
-    HbIcon                               m_defaultIcon;
-    HbIcon                               m_defaultMyCardIcon;
-};
-
-#endif
--- a/phonebookengines/cntlistmodel/inc/cntlistmodel_p.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,129 +0,0 @@
-/*
-* 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:
-*
-*/
-
-#ifndef MOBCNTMODELPRIVATE_H
-#define MOBCNTMODELPRIVATE_H
-
-#include <QSharedData>
-#include <QMap>
-
-#include <qcontactmanager.h>
-#include <qcontactfilter.h>
-#include <qcontactdetailfilter.h>
-#include <qcontactsortorder.h>
-#include <cntuids.h>
-#include "cntcache.h"
-#include <cntdebug.h>
-#include "cntdisplaytextformatter.h"
-#include <xqsettingsmanager.h> 
-#include <xqsettingskey.h>
-
-QTM_USE_NAMESPACE
-
-class CntListModelData : public QSharedData
-{
-public:
-    CntListModelData( const QContactFilter& contactFilter = QContactFilter(),
-                      bool showMyCard = true) :
-                          m_contactManager(NULL),
-                          m_ownedContactManager(false),
-                          m_currentRow(-1),
-                          m_showMyCard(showMyCard),
-                          m_Settings(NULL),
-                          m_NameListRowSettingkey(NULL),
-                          m_currentRowSetting(0),
-                          m_groupId(-1),
-                          m_Format( new CntDummyDisplayTextFormatter )
-        { 
-            setFilter(contactFilter);
-        }
-
-    ~CntListModelData()
-        {
-            if (m_ownedContactManager) 
-                delete m_contactManager;
-            delete m_Settings;
-            delete m_NameListRowSettingkey;
-            delete m_Format;
-        }
-
-    void setFilter(const QContactFilter& contactFilter)
-        {
-            CNT_LOG_ARGS(contactFilter.type())
-
-            m_filter = contactFilter;
-            m_currentRow = -1;
-            if (contactFilter.type() == QContactFilter::RelationshipFilter) {
-                    QContactRelationshipFilter* relationshipFilter = static_cast<QContactRelationshipFilter*>(&m_filter);
-                    CNT_LOG_ARGS("type:" << relationshipFilter->relationshipType() << "role:" << relationshipFilter->relatedContactRole())
-                    if (relationshipFilter->relationshipType() == QContactRelationship::HasMember &&
-                        relationshipFilter->relatedContactRole() == QContactRelationship::First)
-                        m_groupId = relationshipFilter->relatedContactId().localId();
-            }
-            else {
-                m_groupId = -1;
-                
-                // set proper text formatter for the display name. 
-                if ( contactFilter.type() == QContactFilter::ContactDetailFilter )
-                {
-                    delete m_Format;
-                    m_Format = NULL;
-                    
-                    QContactDetailFilter* detailFilter = static_cast<QContactDetailFilter*>( &m_filter );
-                    QStringList filter = detailFilter->value().toStringList();
-                    
-                    if ( detailFilter->detailDefinitionName() == QContactDisplayLabel::DefinitionName && 
-                         detailFilter->matchFlags() & QContactFilter::MatchStartsWith &&
-                         !filter.isEmpty() )
-                    {
-                        m_Format = new CntHTMLDisplayTextFormatter();
-                    }
-                    else
-                    {
-                        m_Format = new CntDummyDisplayTextFormatter();    
-                    }
-                }
-                    
-            }
-
-            CNT_LOG_ARGS(m_groupId)
-        }
-
-public:
-    QContactManager* m_contactManager;
-    CntCache* m_cache;
-    bool m_ownedContactManager;
-    mutable CntContactInfo m_currentContact;
-    mutable int m_currentRow;
-	
-    QList<QContactLocalId> m_contactIds;
-    QContactFilter m_filter;
-    QList<QContactSortOrder> m_sortOrders;
-    bool m_showMyCard;
-	QContactLocalId m_myCardId;
-	int nameOrder;
-	
-    XQSettingsManager* m_Settings;
-    XQSettingsKey *m_NameListRowSettingkey;
-    int m_currentRowSetting;
-    QContactLocalId m_groupId;
-    
-    CntDisplayTextFormatter* m_Format;
-};
-
-#endif // QCONTACTMODELPRIVATE_H
-
--- a/phonebookengines/cntlistmodel/inc/cntlistmodelglobal.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/*
-* 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:
-*
-*/
-
-#ifndef CNTLISTMODELGLOBAL_H
-#define CNTLISTMODELGLOBAL_H
-
-#include <QtGlobal>
-#include <QString>
-#include <QList>
-
-#ifdef CNTLISTMODEL_NO_EXPORT
-#define CNTLISTMODEL_EXPORT 
-#elif BUILD_CNTLISTMODEL
-#define CNTLISTMODEL_EXPORT Q_DECL_EXPORT
-#else
-#define CNTLISTMODEL_EXPORT Q_DECL_IMPORT
-#endif
-
-#endif
--- a/phonebookengines/cntlistmodel/inc/cntnamefetcher.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,136 +0,0 @@
-/*
-* Copyright (c) 2010 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: Private data and helper classes used by class CntCache.
-*
-*/
-
-#ifndef CNTNAMEFETCHER_H
-#define CNTNAMEFETCHER_H
-
-#include <QObject>
-#include <QContact>
-#include <QDataStream>
-#include <xqsettingsmanager.h>
-#include <xqsettingskey.h>
-#include <cntuids.h>
-
-#include <e32base.h>
-#include <s32mem.h>
-#include <e32std.h>
-#include <QObject>
-#include <QThread>
-#include <QEvent>
-#include <hbapplication.h>
-
-QTM_USE_NAMESPACE
-
-class CntSrvSession;
-
-/*!
-    Cache item that holds the formatted name of one contact.
- */
-class CntNameCacheItem
-{
-public:
-    CntNameCacheItem(QContactLocalId id, const QString &firstName, const QString &lastName, CntNameOrder nameFormat);
-    ~CntNameCacheItem();
-    QContactLocalId contactId() const { return mContactId; }
-    QString name() const { return mName; }
-    QString firstName() const;
-    QString lastName() const;
-    void setNameFormat(CntNameOrder newFormat);
-    void operator=(const CntNameCacheItem &other);
-    void externalize(QDataStream &stream);
-    static CntNameCacheItem* internalize(QDataStream &stream, CntNameOrder nameFormat);
-
-private:
-    void setFormattedName(const QString &firstName, const QString &lastName, CntNameOrder nameFormat);
-
-private:
-    QContactLocalId mContactId; // database contact id for this name
-    int mFirstNamePosition;     // length << 16 | offset
-    int mLastNamePosition;      // length << 16 | offset
-    QString mName;              // formatted name
-};
-
-/*!
-     Issues requests to CntSrv.
-  */
-class CntSrvConnection : public QObject
-{
-    Q_OBJECT
-public:
-    CntSrvConnection();
-    ~CntSrvConnection();
-    void setAsynchronous();
-    bool executeSqlQuery(const QString &sqlQuery, CntNameOrder nameFormat, int sizeHintKB);
-    QList<CntNameCacheItem *> names() { return mNames; }
-
-protected:
-    bool event(QEvent *event);
-
-signals:
-    void namesRead();
-    void namesSorted();
-
-private:
-    QThread mThread;
-    QList<CntNameCacheItem *> mNames;
-    CntSrvSession *mSession;
-    QString mSqlQuery;
-    CntNameOrder mNameFormat;
-    int mSizeHintKB;
-    bool mIsAsynchronous;
-};
-
-/*!
-    Can fetches all contact names in sorted order:
-       - from file cache (= any changes since last app exit are not reflected in this list)
-       - from database syncronously
-       - from database asyncronously
-    Fetching from the file cache takes about 0.2 seconds for 10000 contacts.
-    Fetching from the database takes about 2 seconds for 10000 contacts.
- */
-class CntNameFetcher : public QObject
-{
-    Q_OBJECT
-public:
-    CntNameFetcher();
-    ~CntNameFetcher();
-    CntNameCacheItem * readOneName(QContactLocalId contactId) const;
-    void readAllNamesAsynch();
-    bool readNamesFromCache(QList<CntNameCacheItem *> &names);
-    bool writeNamesToCache(const QList<CntNameCacheItem *> &names) const;
-    void sortNames(QList<CntNameCacheItem *> &names) const;
-    static bool compareNames(const CntNameCacheItem *a, const CntNameCacheItem *b);
-    
-signals:
-    void nameFormatChanged(CntNameOrder nameFormat);
-    void databaseAccessComplete();
-    void namesAvailable(QList<CntNameCacheItem *> contactNames);
-    
-private slots:
-    void setNameFormat(const XQSettingsKey &key, const QVariant &value);
-    void sendCompletionSignal();
-    
-private:
-    CntSrvConnection *mDbConnection;
-    CntSrvConnection *mAsynchDbConnection;
-    XQSettingsManager *mSettingsManager;
-    XQSettingsKey *mNameFormatSetting;
-    CntNameOrder mNameFormat;
-    int mBufferSizeEstimate;
-};
-
-#endif
--- a/phonebookengines/cntlistmodel/inc/cntpresenceinfoprovider.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-/*
-* Copyright (c) 2010 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: Presence info provider plugin for CntListModel. It can provide
-*              the presence information of a contact (icon2 field).
-*
-*/
-
-#ifndef CNTPRESENCEINFOPROVIDER_H
-#define CNTPRESENCEINFOPROVIDER_H
-
-#include <cntinfoprovider.h>
-#include <qcontact.h>
-
-class PrcPresenceReader;
-class PrcPresenceBuddyInfoQt;
-
-QTM_BEGIN_NAMESPACE
-class QContactManager;
-QTM_END_NAMESPACE
-
-QTM_USE_NAMESPACE
-
-/**
-    Presence info provider plugin for CntListModel. It can provide
-    the presence information of a contact (icon2 field).
- */
-class CntPresenceInfoProvider : public CntInfoProvider
-{
-    friend class TestCntPresenceInfoProvider;
-    Q_OBJECT
-    
-public:
-    CntPresenceInfoProvider();
-    ~CntPresenceInfoProvider();
-    
-	// From CntInfoProvider
-    QString id() const { return "presence"; };
-    ContactInfoFields supportedFields() const;
-    void requestInfo(const QContact& contact, ContactInfoFields requestedInfo);
-    
-private slots:
-    void handlePresenceUpdate(bool aSuccess, PrcPresenceBuddyInfoQt* aPresenceBuddyInfo);
-    
-private:
-    QString parsePresence(const QList<PrcPresenceBuddyInfoQt*>& buddyList);
-
-signals:
-    void infoFieldReady(CntInfoProvider* sender, int contactId, ContactInfoField field, const QString& value);
-    
-private:
-    PrcPresenceReader*              iReader; // owned
-    QContactManager*                mManager; // owned
-    QMap<QString, QContactLocalId>  mBuddyMap;
-};
-
-#endif
--- a/phonebookengines/cntlistmodel/src/cntcache.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1007 +0,0 @@
-/*
-* Copyright (c) 2010 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: Class for asynchronously fetching and caching basic
-*              contact info (see CntContactInfo) for list views.
-*
-*/
-
-#include <hbapplication.h>
-#include <qtcontacts.h>
-#include <qcontactmanager.h>
-#include <QTimer>
-
-#include <cntdebug.h>
-#include "cntcache.h"
-#include "cntnamefetcher.h"
-#include "cntcache_p.h"
-
-// set the singleton instance pointer to NULL
-CntCache* CntCache::mInstance = NULL;
-
-// value for first cache order to be assigned
-static const int CacheOrderStartValue = 1;
-// for avoiding wrap around with cache orders
-static const int MaxCacheOrderValue = 10000000;
-// number of items to read quickly when a new instance is requested or cache is cleared
-static const int ItemsToReadUrgently = 13;
-// number of items to read ahead into cache; this number is for one direction
-static const int ItemsToCacheAhead = 24;
-// cache size for info items (name, text, icon1name, icon2name)
-static const int InfoCacheSize = 128;
-// cache size for icon items (iconName and HbIcon)
-static const int IconCacheSize = 50;
-// number of icons in a CntContactInfo object
-static const int IconsInCntContactInfo = 2;
-// default empty text info field for a contact; it cannot be empty
-// as the listview will then ignore it, causing rendering problems
-static const QString EmptyTextField = " ";
-
-/*!
-    Provides a pointer to the CntCache singleton instance.
- */
-CntCache* CntCache::instance(QContactManager *manager)
-{
-    if (!mInstance) {
-        mInstance = new CntCache(manager);
-    }
-
-    // whenever a client requests an instance the client will want to get all info
-    // for the first couple of contacts (~a screenfull) as fast as possible
-    mInstance->mUrgentContacts = ItemsToReadUrgently;
-
-    return mInstance;
-}
-
-/*! 
-    Fetches information about a contact: name, text (e.g. phone number or
-    social status) and two icons (e.g. avatar, presence). Previously cached
-    content - at the very least the name - will be returned immediately.
-    Availability of more information will be checked asynchronously and
-    sent to clients via contactInfoUpdated() signals.
-      
-    The function takes a row and a list rather than just a contact id because
-    of read ahead caching - contacts near the requested contacts are expected
-    to be needed soon and are therefore also scheduled for caching.
-
-    \param row the row of the contact to fetch
-    \param idList a list with all the IDs in the list
-    \return a contact with some details filled in
- */
-CntContactInfo CntCache::fetchContactInfo(int row, const QList<QContactLocalId>& idList)
-{
-    CNT_ENTRY_ARGS(row << "/" << idList.count())
-
-    Q_ASSERT(row >= 0 && row < idList.count());
-
-    QString name;
-    QString text = EmptyTextField;
-    HbIcon icons[IconsInCntContactInfo];
-
-    int contactId = idList.at(row);
-
-    if (contactId != mEmittedContactId) {
-        // this request comes from the UI when a new view is created or in response to
-        // some scrolling activity; in the former case, the client should
-        // have set urgencymode on, but in the latter case:
-        // 1) postpone all jobs so the UI can use as much of the CPU as possible
-        // 2) update read ahead cache to contain all IDs of all items near this item
-        if (mUrgentContacts > 0) {
-            --mUrgentContacts;
-        } else {
-            mWorker->postponeJobs(150);
-        }
-        updateReadAheadCache(row, idList);
-    }
-
-    // fetch contact
-    if (mInfoCache.contains(contactId)) {
-        // the item is in the cache
-        CntInfoCacheItem* infoItem = mInfoCache.value(contactId);
-        for (int i = 0; i < IconsInCntContactInfo; ++i) {
-            QString iconName = infoItem->icons[i];
-            if (!iconName.isEmpty()) {
-                if (mIconCache.contains(iconName)) {
-                    CntIconCacheItem* iconItem = mIconCache.value(iconName);
-                    iconItem->cacheOrder = mNextIconCacheOrder++;
-                    icons[i] = iconItem->icon;
-                    if (!iconItem->isFetched) {
-                        // if icon has not yet been received from backend, add
-                        // this id to the list of contacts that want to be
-                        // notified when the icon is received
-                        iconItem->contactIds.insert(contactId);
-                        // also reschedule it
-                        mWorker->scheduleIconJob(iconName, row);
-                    }
-                } else {
-                    // needed icon is not in cache, so schedule it for retrieval
-                    CntIconCacheItem* iconItem = createIconCacheItem(iconName);
-                    iconItem->contactIds.insert(contactId);
-                    mWorker->scheduleIconJob(iconName, row);
-                }
-            }
-        }
-
-        // set return text
-        text = infoItem->text;
-
-        // update cache order
-        infoItem->cacheOrder = mNextInfoCacheOrder++;
-        infoItem->latestRow = row;
-    } else {
-        // the contact info is not in cache, schedule it for retrieval
-        if (contactExists(contactId)) {
-            // contact found, so add new entry to cache
-            CntInfoCacheItem* item = createInfoCacheItem(contactId);
-            item->text = text;
-            item->latestRow = row;
-
-            // ask the worker thread to fetch the information asynchronously
-            mWorker->scheduleInfoJob(contactId, row);
-        }
-    }
-
-    name = contactName(contactId);
-    CNT_EXIT_ARGS("name:" << name << "sec:" << text)
-
-    return CntContactInfo(contactId, name, text, icons[0], icons[1]);
-}
-
-/*! 
-    Creates a list of contact ids sorted according the corresponding contact names.
-
-    \param idFilter the IDs to be returned; if NULL, all contact IDs are returned
-    \return the list of ids, sorted according the contact name
- */
-QList<QContactLocalId> CntCache::sortIdsByName(const QSet<QContactLocalId>* idFilter) const
-{
-    CNT_ENTRY
-
-    QList<QContactLocalId> sortedIds;
-    
-    // allocate memory in advance to avoid repeated reallocation during population
-    // an extra 16 items are allocated to leave room for a few more contacts
-    // before reallocation is needed
-    if (!idFilter) {
-        sortedIds.reserve(mSortedNames.count() + 16);
-    } else {
-        sortedIds.reserve(idFilter->count() + 16);
-    }
-
-    // the entries in mSortedNames are already sorted, so just pick
-    // out the ids from that list in the order that they appear
-    if (!idFilter) {
-        foreach (CntNameCacheItem* item, mSortedNames) {
-            sortedIds.append(item->contactId());
-        }
-    } else {
-        foreach (CntNameCacheItem* item, mSortedNames) {
-            if (idFilter->contains(item->contactId())) {
-                sortedIds.append(item->contactId());
-            }
-        }
-    }
-
-    CNT_EXIT
-
-    return sortedIds;
-}
-
-/*!
-    Overloaded version of the function for string based searching of contact names.
-    Currently for multi part names only space and dash variations are used for filtering,
-    e.g. "Axx Bxx" or "Axx-Bxx" are the only possible matches along with the original string. 
-    
-    \param searchList list of strings which are used for search
-    \return the list of ids, sorted according the contact name
- */
-QList<QContactLocalId> CntCache::sortIdsByName(const QStringList searchList) const
-{
-    CNT_ENTRY
-    
-    QList<QContactLocalId> sortedIds;
-    int iterNames = 0;
-    int iterList = 0;
-    QString firstName = 0;
-    QString lastName = 0;
-    QString tempString = 0;
-    QString tempDash = 0;
-    QString tempSpace = 0;
-    int matchesFound = 0;
-    const QChar dash = '-';
-    const QChar space = ' ';
-    QStringList searchVariations;
-    
-    for (iterList = 0; iterList < searchList.size(); iterList++)
-    {
-        tempString = searchList.at(iterList);
-        tempDash = tempString;
-        tempSpace = tempString;
-        tempDash.insert(0, dash);
-        tempSpace.insert(0, space);
-        
-        searchVariations.append(tempString);
-        searchVariations.append(tempDash);
-        searchVariations.append(tempSpace);
-    }
-    
-    for (iterNames = 0; iterNames < mSortedNames.size(); iterNames++)
-    {
-        matchesFound = 0;
-        firstName = (mSortedNames.at(iterNames))->firstName();
-        lastName = (mSortedNames.at(iterNames))->lastName();
-        for (iterList = 0; iterList < searchVariations.size(); iterList += 3)
-        {
-            // if the current name doesn't contain any of the possible variations then it can be skipped
-            if ( !( firstName.startsWith(searchVariations.at(iterList), Qt::CaseInsensitive) ||
-                    lastName.startsWith(searchVariations.at(iterList), Qt::CaseInsensitive) ||
-                    firstName.contains(searchVariations.at(iterList+1), Qt::CaseInsensitive) ||
-                    lastName.contains(searchVariations.at(iterList+1), Qt::CaseInsensitive) ||
-                    firstName.contains(searchVariations.at(iterList+2), Qt::CaseInsensitive) ||
-                    lastName.contains(searchVariations.at(iterList+2), Qt::CaseInsensitive) ) )
-            {
-                break;
-            }
-        }
-        if (iterList == searchVariations.size())
-        {
-            sortedIds.append(mSortedNames.at(iterNames)->contactId());
-        }
-    }
-    
-    CNT_EXIT
-
-    return sortedIds;
-}
-
-/*!
-    Creates the CntCache singleton instance.
- */
-CntCache::CntCache(QContactManager *manager)
-    : mContactManager(manager),
-      mWorker(new CntCacheThread()),
-      mNameFetcher(new CntNameFetcher()),
-      mNextInfoCacheOrder(CacheOrderStartValue),
-      mNextIconCacheOrder(CacheOrderStartValue),
-      mEmittedContactId(-1),
-      mUrgentContacts(0),
-      mHasModifiedNames(false),
-      mAllNamesFetchStarted(false)
-{
-    CNT_ENTRY
-
-    // listen to name fetcher
-    connect(mNameFetcher, SIGNAL(nameFormatChanged(CntNameOrder)), this, SLOT(reformatNames(CntNameOrder)));
-    connect(mNameFetcher, SIGNAL(databaseAccessComplete()), mWorker, SLOT(resumeJobs()));
-    connect(mNameFetcher, SIGNAL(namesAvailable(QList<CntNameCacheItem *>)), this, SLOT(setNameList(QList<CntNameCacheItem *>)));
-
-    // listen to info fetcher
-    connect(mWorker, SIGNAL(infoFieldUpdated(int, const ContactInfoField&, const QString&)),
-            this, SLOT(onNewInfo(int, const ContactInfoField&, const QString&)));
-    connect(mWorker, SIGNAL(infoCancelled(int)), this, SLOT(onInfoCancelled(int)));
-
-    // listen to icon fetcher
-    connect(mWorker, SIGNAL(iconUpdated(const QString&, const HbIcon&)),
-            this, SLOT(onNewIcon(const QString&, const HbIcon&)));
-    connect(mWorker, SIGNAL(iconCancelled(const QString&)), this, SLOT(onIconCancelled(const QString&)));
-    connect(mWorker, SIGNAL(allJobsDone()), this, SLOT(scheduleOneReadAheadItem()));
-
-    // listen to contact manager
-    connect(mContactManager, SIGNAL(contactsChanged(const QList<QContactLocalId>&)), this, SLOT(updateContacts(const QList<QContactLocalId>&)));
-    connect(mContactManager, SIGNAL(contactsRemoved(const QList<QContactLocalId>&)), this, SLOT(removeContacts(const QList<QContactLocalId>&)));
-    connect(mContactManager, SIGNAL(contactsAdded(const QList<QContactLocalId>&)), this, SLOT(addContacts(const QList<QContactLocalId>&)));
-
-    // listen to application -- shut down cache only when the whole application quits
-    connect(HbApplication::instance(), SIGNAL(aboutToQuit()), this, SLOT(onShutdown()));
-
-    // load all names to RAM
-    loadNames();
-
-    CNT_EXIT
-}
-
-/*!
-    Destructs the CntCache singleton instance.
- */
-CntCache::~CntCache()
-{
-    CNT_ENTRY
-
-    if (mHasModifiedNames) {
-        mNameFetcher->writeNamesToCache(mSortedNames);
-    }
-
-    delete mWorker;
-    delete mNameFetcher;
-    
-    qDeleteAll(mInfoCache);
-    mInfoCache.clear();
-
-    qDeleteAll(mIconCache);
-    mIconCache.clear();
-
-    qDeleteAll(mNameCache);
-    mNameCache.clear();
-    mSortedNames.clear();
-
-    CNT_EXIT
-}
-
-/*! 
-    Processes a new info field that has arrived from the worker thread.
-    If the contact is in the info cache, then the info cache is updated
-    accordingly.
-    
-    A contactInfoUpdated() signal is usually also emitted. The exception
-    is if the info is the name of an icon and that icon is not in the icon
-    cache. In this case the icon is fetched before a signal is emitted.
- */
-void CntCache::onNewInfo(int contactId, const ContactInfoField& infoField, const QString& infoValue)
-{
-    CNT_ENTRY_ARGS( "id:" << contactId   << "infotype:" << infoField   << "infovalue:" << infoValue )
-
-    Q_ASSERT(infoField == ContactInfoTextField || infoField == ContactInfoIcon1Field || infoField == ContactInfoIcon2Field);
-
-    bool hasNewInfo;
-
-    if (!mInfoCache.contains(contactId)) {
-        // contact is not in cache, so nothing needs to be done
-        // except notify clients that this contact has (possibly)
-        // been changed
-        hasNewInfo = true;
-    }
-    else if (infoField == ContactInfoTextField) {
-        // update cache with new text for contact
-        mInfoCache.value(contactId)->text = infoValue;
-        hasNewInfo = true;
-    }
-    else {
-        // update cache with new icon name for contact
-        int iconIndex = (infoField == ContactInfoIcon1Field ? 0 : 1);
-
-        CntInfoCacheItem* item = mInfoCache.value(contactId);
-        QString iconName = infoValue;
-        if (item->icons[iconIndex] != iconName) {
-            item->icons[iconIndex] = iconName;
-            if (iconName.isEmpty()) {
-                hasNewInfo = true;
-            }
-            else if (mIconCache.contains(iconName)) {
-                CntIconCacheItem* iconItem = mIconCache.value(iconName);
-                if (!iconItem->isFetched) {
-                    iconItem->contactIds.insert(contactId);
-                    hasNewInfo = false;
-                }
-                else {
-                    hasNewInfo = true;
-                }
-            }
-            else if (iconName.startsWith("qtg_", Qt::CaseInsensitive)) {
-                createIconCacheItem(iconName);
-                onNewIcon(iconName, HbIcon(iconName)); 
-                hasNewInfo = true;
-            }
-            else {
-                CntIconCacheItem* iconItem = createIconCacheItem(iconName);
-                iconItem->contactIds.insert(contactId);
-				if (mInfoCache.contains(contactId)) {
-                	mWorker->scheduleIconJob(iconName, mInfoCache.value(contactId)->latestRow);
-				}
-				else {
-					// less important icon, since this contact is not in cache
-                	mWorker->scheduleIconJob(iconName, 100000);
-				}
-                hasNewInfo = false;
-            }
-        }
-        else {
-            hasNewInfo = false;
-        }
-    }
-
-    if (hasNewInfo) {
-        emitContactInfoUpdated(contactId);
-    }
-
-    CNT_EXIT
-}
-
-/*! 
-    Handle the case where a request for contact info is cancelled by the
-    worker because of too many subsequent requests.
- */
-void CntCache::onInfoCancelled(int contactId)
-{
-    CNT_ENTRY_ARGS( "id:" << contactId )
-
-    if (mInfoCache.contains(contactId)) {
-        CntInfoCacheItem* item = mInfoCache.take(contactId);
-        delete item;
-    }
-
-    emitContactInfoUpdated(contactId);
-
-    CNT_EXIT
-}
-
-/*! 
-    Processes a new icon that has arrived from the worker thread.
-    The icon cache is updated and a contactInfoUpdated() signal is
-    emitted for all contacts that use this icon.
- */
-void CntCache::onNewIcon(const QString& iconName, const HbIcon& icon)
-{
-    CNT_ENTRY_ARGS( iconName )
-
-    QSet<int> contactsToNotify;
-
-    if (mIconCache.contains(iconName)) {
-        CntIconCacheItem* item = mIconCache.value(iconName);
-        item->icon = icon;
-        item->isFetched = true;
-        contactsToNotify = item->contactIds;
-        item->contactIds.clear();
-    }
-
-    foreach (int contactId, contactsToNotify) {
-        emitContactInfoUpdated(contactId);
-    }
-
-    CNT_EXIT
-}
-
-/*! 
-    Handle the case where a request for an icon is cancelled by the worker because
-    of too many subsequent requests.
- */
-void CntCache::onIconCancelled(const QString& iconName)
-{
-    CNT_ENTRY_ARGS( iconName )
-
-    QSet<int> contactsToNotify;
-
-    if (mIconCache.contains(iconName)) {
-        CntIconCacheItem* item = mIconCache.take(iconName);
-        contactsToNotify = item->contactIds;
-        item->contactIds.clear();
-        delete item;
-    }
-
-    foreach (int contactId, contactsToNotify) {
-        emitContactInfoUpdated(contactId);
-    }
-
-    CNT_EXIT
-}
-
-/*!
-    Fetch the names of all contacts.
- */
-void CntCache::loadNames()
-{
-    CNT_ENTRY
-    
-    // read names from file cache
-    mNameFetcher->readNamesFromCache(mSortedNames);
-
-    // insert the names into the id-to-name map
-    foreach (CntNameCacheItem* item, mSortedNames) {
-        mNameCache.insert(item->contactId(), item);
-    }
-
-    // if there are no names in file cache, start the asynch
-    // read of all names immediately (normally it is done
-    // after secondary info has been read)
-    if (mSortedNames.count() == 0) {
-        mWorker->postponeJobs();
-        mAllNamesFetchStarted = true;
-        mNameFetcher->readAllNamesAsynch();
-    }
-
-    CNT_EXIT
-}
-
-/*!
-    Checks whether a contact exists.
- */
-bool CntCache::contactExists(QContactLocalId contactId) const
-{
-    return mNameCache.contains(contactId);
-}
-
-/*!
-    Fetch the name of one contact.
- */
-QString CntCache::contactName(QContactLocalId contactId) const
-{
-    CNT_ENTRY
-
-    QString name;
-
-    QHash<QContactLocalId, CntNameCacheItem*>::const_iterator i = mNameCache.find(contactId);
-    if (i != mNameCache.end()) {
-        name = i.value()->name();
-    }
-
-    CNT_EXIT
-
-    return name;
-}
-
-/*! 
-    Collects all contact IDs near the latest fetch from the UI. These will be fetched and
-    precached when UI activity slows down.
-
-    \param mostRecentRow the row of the contact that was most recently fetched
-    \param idList a list with all the IDs in the list
- */
-void CntCache::updateReadAheadCache(int mostRecentRow, const QList<QContactLocalId>& idList)
-{
-    CNT_ENTRY_ARGS( mostRecentRow )
-
-    int row;
-
-    mReadAheadCache.clear();
-    
-    // step through the area near to last fetch item and make sure all
-    // contacts in it are also in cache or in the read ahead list
-    for (int i = 1; i <= ItemsToCacheAhead; ++i) {
-        for (int j = 0; j < 2; ++j) {
-            if (j == 0) {
-                row = mostRecentRow - i;
-                if (row <= 0) {
-                    continue;
-                }
-            }
-            else {
-                row = mostRecentRow + i;
-                if (row >= idList.count()) {
-                    continue;
-                }
-            }
-            
-            int contactId = idList.at(row);
-            if (!mInfoCache.contains(contactId)) {
-                // contact is not in cache, so put the id to items to read into cache
-                mReadAheadCache.append(QPair<int,int>(contactId,row));
-            }
-            else {
-                // contact is in cache; update cache order as we want to keep this item in cache
-                mInfoCache.value(contactId)->cacheOrder = mNextInfoCacheOrder++;
-            }
-        }
-    }
-
-   CNT_EXIT
-}
-
-/*! 
-    Schedules one uncached item in the read-ahead list for retrieval.
- */
-void CntCache::scheduleOneReadAheadItem()
-{
-    CNT_ENTRY
-
-    QString name;
-
-    // fetch all names from the database if it hasn't been done yet
-    if (!mAllNamesFetchStarted) {
-        mWorker->postponeJobs();
-        mAllNamesFetchStarted = true;
-        mNameFetcher->readAllNamesAsynch();
-    }
-
-    // pick the first contact from the read ahead cache and schedule it
-    while (mReadAheadCache.count() > 0) {
-        int contactId = mReadAheadCache.first().first;
-        int contactRow = mReadAheadCache.takeFirst().second;
-        if (!mInfoCache.contains(contactId)) {
-            // contact is not in cache, so schedule it for retreival
-            if (contactExists(contactId)) {
-                // contact found, so add new entry to cache
-                CntInfoCacheItem* item = createInfoCacheItem(contactId);
-                item->text = EmptyTextField;
-                item->latestRow = contactRow;
-    
-                // schedule the info
-                mWorker->scheduleInfoJob(contactId, contactRow);
-                break;
-            }
-        }
-    }
-
-    CNT_EXIT
-}
-
-/*! 
-    Creates a new item in the info cache. If the cache is full,
-    then the least recently accessed item is removed from cache.
-    
-    /param contactId id of contact for which to create the new cache item
-    /return the newly created cache item
- */
-CntInfoCacheItem* CntCache::createInfoCacheItem(int contactId)
-{
-    CNT_ENTRY_ARGS( contactId )
-
-    if (mInfoCache.count() >= InfoCacheSize) {
-        // cache is full, so remove the oldest contact
-        int minCacheOrder = mNextInfoCacheOrder;
-        CntInfoCacheItem* oldestItem = NULL;
-        foreach (CntInfoCacheItem* i, mInfoCache) {
-            if (i->cacheOrder < minCacheOrder) {
-                minCacheOrder = i->cacheOrder;
-                oldestItem = i;
-            }
-        }
-        
-        if (oldestItem) {
-            mInfoCache.remove(oldestItem->contactId);
-            delete oldestItem;
-        }
-        
-        // cache maintenance: if the cache ids become too large,
-        // reduce all of them by MaxCacheOrderValue
-        if (mNextInfoCacheOrder >= MaxCacheOrderValue) {
-            mNextInfoCacheOrder -=  MaxCacheOrderValue;
-            foreach (CntInfoCacheItem* i, mInfoCache) {
-                i->cacheOrder -= MaxCacheOrderValue;
-            }
-        }
-    }
-    
-    // create and insert the new item
-    CntInfoCacheItem* item = new CntInfoCacheItem();
-    item->cacheOrder = mNextInfoCacheOrder++;
-    item->contactId = contactId;
-    mInfoCache.insert(contactId, item);
-    
-    CNT_EXIT
-
-    return item;
-}
-
-/*! 
-    Creates a new item in the icon cache. If the cache is full,
-    then the least recently accessed item is removed from cache.
-    
-    /param iconName name of the icon for which to create the new cache item
-    /return the newly created cache item
- */
-CntIconCacheItem* CntCache::createIconCacheItem(const QString& iconName)
-{
-    CNT_ENTRY_ARGS( iconName )
-
-    if (mIconCache.count() >= IconCacheSize) {
-        // cache is full, so remove the oldest icon
-        int minCacheOrder = mNextIconCacheOrder;
-        CntIconCacheItem* oldestItem = NULL;
-        foreach (CntIconCacheItem* i, mIconCache) {
-            if (i->cacheOrder < minCacheOrder) {
-                minCacheOrder = i->cacheOrder;
-                oldestItem = i;
-            }
-        }
-        mIconCache.remove(oldestItem->iconName);
-        delete oldestItem;
-
-        // cache maintenance: if the cache orders become too large,
-        // reduce all of them by MaxCacheOrderValue
-        if (mNextIconCacheOrder >= MaxCacheOrderValue) {
-            mNextIconCacheOrder -=  MaxCacheOrderValue;
-            foreach (CntIconCacheItem* i, mIconCache) {
-                i->cacheOrder -=  MaxCacheOrderValue;
-            }
-        }
-    }
-
-    // create and insert the new item
-    CntIconCacheItem* item = new CntIconCacheItem();
-    item->cacheOrder = mNextIconCacheOrder++;
-    item->iconName = iconName;
-    item->isFetched = false;
-    mIconCache.insert(iconName, item);
-
-    CNT_EXIT
-
-    return item;
-}
-
-/*! 
-    Notifies clients that a contact might have changed.
-    Clients can then request the info via fetchContactInfo() 
-    if they are interested.
- */
-void CntCache::emitContactInfoUpdated(int contactId)
-{
-	CNT_ENTRY_ARGS( contactId )
-
-    mEmittedContactId = contactId;
-    emit contactInfoUpdated(contactId);
-    mEmittedContactId = -1;
-
-	CNT_EXIT
-}
-
-/*! 
-    Deletes the cache.
- */
-void CntCache::onShutdown()
-{
-	CNT_ENTRY
-
-    mInstance = NULL;
-
-    disconnect(mContactManager, SIGNAL(contactsChanged(const QList<QContactLocalId>&)), this, SLOT(updateContacts(const QList<QContactLocalId>&)));
-    disconnect(mContactManager, SIGNAL(contactsRemoved(const QList<QContactLocalId>&)), this, SLOT(removeContacts(const QList<QContactLocalId>&)));
-    disconnect(mContactManager, SIGNAL(contactsAdded(const QList<QContactLocalId>&)), this, SLOT(addContacts(const QList<QContactLocalId>&)));
-
-    deleteLater();
-
-	CNT_EXIT
-}
-
-/*! 
-    Updates the names in cache according to newFormat.
-
-    This slot is called when name fetcher signals that the format of
-    names has been changed.
- */
-void CntCache::reformatNames(CntNameOrder newFormat)
-{
-    foreach (CntNameCacheItem* item, mSortedNames) {
-        item->setNameFormat(newFormat);
-    }
-
-    mNameFetcher->sortNames(mSortedNames);
-
-    mNameFetcher->writeNamesToCache(mSortedNames);
-    mHasModifiedNames = false;
-
-    emit dataChanged();
-}
-
-/*! 
-    Replaces the names in cache with the ones in this list.
-    
-    \param newSortedNames the sorted list with names; this list will be cleared and
-                          ownership will be taken of the items in the list
- */
-void CntCache::setNameList(QList<CntNameCacheItem *> newSortedNames)
-{
-    CNT_ENTRY
-    
-    bool hasModifiedContacts = false;
-    int count = newSortedNames.count();
-
-    // check if there have been any changes
-    if (mSortedNames.count() != count) {
-        hasModifiedContacts = true;
-    } else {
-        for (int i = 0; i < count; ++i) {
-            CntNameCacheItem *oldItem = mSortedNames.at(i);
-            CntNameCacheItem *newItem = newSortedNames.at(i);
-            if (oldItem->contactId() != newItem->contactId() || oldItem->name() != newItem->name()) {
-                hasModifiedContacts = true;
-                break;
-            }
-        }
-    }
-
-    // the list has changed, so use the new list instead
-    if (hasModifiedContacts) {
-        qDeleteAll(mSortedNames);
-        mNameCache.clear();
-        mSortedNames.clear();
-        
-        foreach (CntNameCacheItem* item, newSortedNames) {
-            mSortedNames.append(item);
-            mNameCache.insert(item->contactId(), item);
-        }
-        
-        // write names to file cache
-        mNameFetcher->writeNamesToCache(mSortedNames);
-        
-        // notify clients that the list of names has changed
-        emit dataChanged();
-    } else {
-        qDeleteAll(newSortedNames);
-    }
-    
-    CNT_EXIT
-}
-
-/*! 
-    Updates data in response to some contacts having changed and
-    then notifies observers that these contacts have changed.
- */
-void CntCache::updateContacts(const QList<QContactLocalId> &changedContacts)
-{
-    QString name;
-    QList<CntNameCacheItem*> items;
-
-    // reloads the names of the changed contacts and updates the
-    // list of sorted names accordingly
-    foreach (QContactLocalId contactId, changedContacts) {
-        CntNameCacheItem *newItem = mNameFetcher->readOneName(contactId);
-        if (newItem != NULL) {
-            CntNameCacheItem *oldItem = mNameCache.value(contactId);
-            if (oldItem->name() != newItem->name()) {
-                QList<CntNameCacheItem*>::iterator oldPos = qLowerBound(mSortedNames.begin(), mSortedNames.end(), oldItem, CntNameFetcher::compareNames);
-                while (*oldPos != oldItem && oldPos != mSortedNames.end()) {
-                     ++oldPos;
-                }
-                QList<CntNameCacheItem*>::iterator newPos = qUpperBound(mSortedNames.begin(), mSortedNames.end(), newItem, CntNameFetcher::compareNames);
-                if (oldPos < newPos) {
-                    mSortedNames.move(oldPos - mSortedNames.begin(), (newPos - mSortedNames.begin()) - 1);
-                } else {
-                    mSortedNames.move(oldPos - mSortedNames.begin(), newPos - mSortedNames.begin());
-                }
-                *oldItem = *newItem;
-                mHasModifiedNames = true;
-            }
-        }
-    }
-
-    // if any of the changed items have cached info, the info
-    // is scheduled for refreshing
-    foreach (QContactLocalId contactId, changedContacts) {
-        if (mInfoCache.contains(contactId)) {
-            CntInfoCacheItem* infoItem = mInfoCache.value(contactId);
-            mWorker->scheduleInfoJob(contactId, infoItem->latestRow);
-        }
-    }
-
-    // inform clients about these changes
-    emit contactsChanged(changedContacts);
-}
-
-/*! 
-    Updates data in response to some contacts having been removed
-    and then notifies observers that the contacts have been removed.
- */
-void CntCache::removeContacts(const QList<QContactLocalId> &removedContacts)
-{
-    // removed the deleted contacts from the name cache and from the
-    // list of sorted names
-    foreach (QContactLocalId contactId, removedContacts) {
-        CntNameCacheItem *item = mNameCache.take(contactId);
-        if (item) {
-            QList<CntNameCacheItem*>::iterator pos = qLowerBound(mSortedNames.begin(), mSortedNames.end(), item, CntNameFetcher::compareNames);
-            while (*pos != item && pos != mSortedNames.end()) {
-                ++pos;
-            }
-            mSortedNames.erase(pos);
-            delete item;
-            mHasModifiedNames = true;
-        }
-    }
-
-    // info for these deleted items should be removed from cache
-    foreach (QContactLocalId contactId, removedContacts) {
-        if (mInfoCache.contains(contactId)) {
-            CntInfoCacheItem* item = mInfoCache.take(contactId);
-            delete item;
-        }
-    }
-
-    // inform clients about these deleted contacts
-    emit contactsRemoved(removedContacts);
-}
-
-/*! 
-    Updates data in response to some contacts having been added
-    and then notifies observers that the contacts have been added.
- */
-void CntCache::addContacts(const QList<QContactLocalId> &addedContacts)
-{
-    // add the new contacts to the name cache and to the
-    // list of sorted names
-    foreach (QContactLocalId contactId, addedContacts) {
-        CntNameCacheItem *item = mNameFetcher->readOneName(contactId);
-        if (item != NULL) {
-            mNameCache.insert(contactId, item);
-            QList<CntNameCacheItem*>::iterator i = qUpperBound(mSortedNames.begin(), mSortedNames.end(), item, CntNameFetcher::compareNames);
-            mSortedNames.insert(i, item);
-            mHasModifiedNames = true;
-        }
-    }
-
-    // inform clients about the new contacts
-    emit contactsAdded(addedContacts);
-}
-
-/*! 
-    Creates an empty CntContactInfo object.
- */
-CntContactInfo::CntContactInfo()
-    : d(new CntContactInfoData())
-{
-}
-
-/*! 
-    Creates a CntContactInfo object with all info fields set.
- */
-CntContactInfo::CntContactInfo(int id, const QString& name, const QString& text, const HbIcon& icon1, const HbIcon& icon2)
-    : d(new CntContactInfoData())
-{
-      d->id = id;
-      d->name = name;
-      d->text = text;
-      d->icon1 = icon1;
-      d->icon2 = icon2;
-}
-
-/*! 
-    Destroys the object.
- */
-CntContactInfo::~CntContactInfo()
-{
-}
-
-/*! 
-    Copy constructor.
- */
-CntContactInfo::CntContactInfo(const CntContactInfo& other)
-    : d(other.d)
-{
-}
-
-/*! 
-    Assignment operator.
- */
-CntContactInfo& CntContactInfo::operator=(const CntContactInfo& other)
-{
-    d = other.d;
-    return *this;
-}
-
-/*! 
-    Getter function for the id.
- */
-int CntContactInfo::id() const
-{
-    return d->id;
-}
-
-/*! 
-    Getter function for the name.
- */
-QString CntContactInfo::name() const
-{
-    return d->name;
-}
-
-/*! 
-    Getter function for the text.
- */
-QString CntContactInfo::text() const
-{
-    return d->text;
-}
-
-/*! 
-    Getter function for the first icon.
- */
-HbIcon CntContactInfo::icon1() const
-{
-    return d->icon1;
-}
-
-/*! 
-    Getter function for the second icon.
- */
-HbIcon CntContactInfo::icon2() const
-{
-    return d->icon2;
-}
--- a/phonebookengines/cntlistmodel/src/cntcache_p.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,491 +0,0 @@
-/*
-* Copyright (c) 2010 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: Private data and helper classes used by class CntCache.
-*
-*/
-
-#include <QPluginLoader>
-#include <QDir>
-
-#include <qtcontacts.h>
-#include <qcontactmanager.h>
-#include <hbapplication.h>
-#include <thumbnailmanager_qt.h>
-#include <hbicon.h>
-#include <QTimer>
-
-#include "cntcache.h"
-#include "cntcache_p.h"
-#include <cntinfoproviderfactory.h>
-#include <cntinfoprovider.h>
-#include "cntdefaultinfoprovider.h"
-#include "cntpresenceinfoprovider.h"
-#include <cntdebug.h>
-
-// maximum amount of info and icon jobs respectively -- if there are more jobs,
-// then the oldest job is skipped and the client informed that this happened
-// in this way the client can request the job again if wanted
-static const int CntMaxInfoJobs = 20;
-static const int CntMaxIconJobs = 20;
-// the event for starting to process all outstanding jobs
-static const QEvent::Type ProcessJobsEvent = QEvent::User;
-// the id that states that no icon is currently pending from thumbnail manager
-static const int NoIconRequest = -1;
-// the id that states that there is no job with that key
-static const int NoSuchJob = -1;
-// different states of postponement 
-static const int JobsNotPostponed = 0;
-static const int JobsPostponedForDuration = 1;
-static const int JobsPostponedUntilResume = 2;
-
-const char *CNT_INFO_PROVIDER_EXTENSION_PLUGIN_DIRECTORY = "/resource/qt/plugins/contacts/infoproviders/";
-    
-// TODO: Provide a way (cenrep keys?) for UI to set which provider to use for
-//       what info field (and what info fields are indeed even in use).
-
-/*!
-    Creates a new thread for fetching contact info and icons in the background.
- */
-CntCacheThread::CntCacheThread()
-    : mContactManager(new QContactManager()),
-      mProcessingJobs(false),
-      mJobsPostponed(JobsNotPostponed),
-      mIconRequestId(NoIconRequest),
-      mTimer(new QTimer())
-{
-    CNT_ENTRY
-
-    // create static provider plugins
-    mInfoProviders.insert(new CntDefaultInfoProvider(), ContactInfoAllFields);
-    mInfoProviders.insert(new CntPresenceInfoProvider(), ContactInfoIcon2Field);
-
-    // load dynamic provider plugins
-    QDir pluginsDir(CNT_INFO_PROVIDER_EXTENSION_PLUGIN_DIRECTORY);
-    foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
-        // Create plugin loader
-        QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
-        if (pluginLoader.load()) {
-            CntInfoProviderFactory *factory = qobject_cast<CntInfoProviderFactory*>(pluginLoader.instance());
-            
-            if (factory) {
-                CntInfoProvider *provider = factory->infoProvider();
-                mInfoProviders.insert(provider, provider->supportedFields());
-            }
-        }
-    }
-    
-    // connect the providers
-    QMapIterator<CntInfoProvider*, ContactInfoFields> i(mInfoProviders);
-    while (i.hasNext()) {
-        i.next();
-        connect(static_cast<CntInfoProvider*>(i.key()),
-                SIGNAL(infoFieldReady(CntInfoProvider*, int, ContactInfoField, const QString&)),
-                this,
-                SLOT(onInfoFieldReady(CntInfoProvider*, int, ContactInfoField, const QString&)));
-    }
-    
-    // create & connect the thumbnail manager
-    mThumbnailManager = new ThumbnailManager(this);
-    mThumbnailManager->setMode(ThumbnailManager::Default);
-    mThumbnailManager->setQualityPreference(ThumbnailManager::OptimizeForPerformance);
-    mThumbnailManager->setThumbnailSize(ThumbnailManager::ThumbnailSmall);
-    connect(mThumbnailManager, SIGNAL(thumbnailReady(QPixmap, void *, int, int)),
-             this, SLOT(onIconReady(QPixmap, void *, int, int)));
-    
-    mTimer->setSingleShot(true);
-    connect(mTimer, SIGNAL(timeout()), this, SLOT(resumeJobs()));
-
-    CNT_EXIT
-}
-
-/*!
-    Cleans up and destructs the thread.
- */
-CntCacheThread::~CntCacheThread()
-{
-    CNT_ENTRY
-    
-    delete mContactManager;
-    disconnect(this);
-
-    mInfoJobs.clear();
-    mCancelledInfoJobs.clear();
-    mIconJobs.clear();
-    mCancelledIconJobs.clear();
-
-    if (mIconRequestId != NoIconRequest) {
-        mThumbnailManager->cancelRequest(mIconRequestId);
-        mIconRequestId = NoIconRequest;
-    }
-
-    delete mThumbnailManager;
-    mThumbnailManager = NULL;
-
-    qDeleteAll(mInfoProviders.keys());
-    mInfoProviders.clear();
-
-    CNT_EXIT
-}
-
-/*!
-    Schedules a info to be fetched for a contact. When info has been fetched
-    infoFieldUpdated() signals will be emitted, once for each field.
-    
-    /param contactId the contact for which the info is wanted
- */
-void CntCacheThread::scheduleInfoJob(int contactId, int priority)
-{
-    CNT_ENTRY_ARGS( contactId )
-
-    if (contactId <= 0)
-        return;
-
-    int index = infoJobIndex(contactId);
-    if (index != NoSuchJob) {
-        // if the job already exists, update the priority
-        if (priority < mInfoJobs.at(index).second) {
-            mInfoJobs[index] = QPair<int,int>(contactId,priority);
-        }
-        return;
-    }
-
-    if (!mProcessingJobs) {
-        // new job => start processing jobs
-        mProcessingJobs = true;
-        HbApplication::instance()->postEvent(this, new QEvent(ProcessJobsEvent));
-    }
-    
-    if (mInfoJobs.count() >= CntMaxInfoJobs) {
-        // the queue of jobs is full, so remove the oldest job
-        mCancelledInfoJobs.append(mInfoJobs.takeFirst().first);
-        CNT_LOG_ARGS( mCancelledInfoJobs.last() << "removed from joblist" )
-    }
-
-    mInfoJobs.append(QPair<int,int>(contactId, priority));
-    CNT_LOG_ARGS( contactId << "(prio:" << priority << ") appended @" << (mInfoJobs.count() - 1) );
-
-    // since this job has now been scheduled, remove it from the list of
-    // cancelled jobs in case it is there
-    mCancelledInfoJobs.removeOne(contactId);
-
-    CNT_EXIT
-}
-
-/*!
-    Schedules an icon to be fetched. An iconUpdated() signal will be emitted when the icon
-    has been fetched.
-    
-    /param iconName the name of the icon to be fetched
- */
-void CntCacheThread::scheduleIconJob(const QString& iconName, int priority)
-{
-    CNT_ENTRY_ARGS( iconName )
-
-    if (iconName.isEmpty())
-        return;
-
-    int index = iconJobIndex(iconName);
-    if (index != NoSuchJob) {
-        // if the job already exists, update the priority
-        if (priority < mIconJobs.at(index).second) {
-            mIconJobs[index] = QPair<QString,int>(iconName,priority);
-        }
-        return;
-    }
-
-    if (!mProcessingJobs) {
-        // new job, so restart job loop
-        mProcessingJobs = true;
-        HbApplication::instance()->postEvent(this, new QEvent(ProcessJobsEvent));
-    }
-
-    if (mIconJobs.count() >= CntMaxIconJobs) {
-        // the queue of jobs is full, so remove the oldest job
-        mCancelledIconJobs.append(mIconJobs.takeLast().first);
-        CNT_LOG_ARGS( mCancelledIconJobs.last() << "removed from joblist" );
-    }
-
-    mIconJobs.append(QPair<QString,int>(iconName, priority));
-    CNT_LOG_ARGS( iconName << "(prio:" << priority << ") appended @" << (mIconJobs.count() - 1) );
-
-    // since this job has now been rescheduled, remove it from the list of
-    // cancelled jobs in case it is there
-    mCancelledIconJobs.removeOne(iconName);
-
-    CNT_EXIT
-}
-
-/*!
-    Postpones outstanding jobs until milliseconds ms has passed or resumeJobs() is called.
-    This should be called if the client wants to reserve more CPU time for some urgent tasks.
-    
-    \param milliseconds The duration of the delay; 0, which is the default, means to delay
-                        until resumeJobs() is called
- */
-void CntCacheThread::postponeJobs(int milliseconds)
-{
-    CNT_ENTRY_ARGS("ms =" << milliseconds << "  type =" << mJobsPostponed)
-
-    Q_ASSERT(milliseconds >= 0);
-
-    if (milliseconds == 0) {
-        mTimer->stop();
-        mJobsPostponed = JobsPostponedUntilResume;
-    } else if (mJobsPostponed != JobsPostponedUntilResume) {
-        mTimer->stop();
-        mJobsPostponed = JobsPostponedForDuration;
-        mTimer->start(milliseconds);
-    }
-
-    CNT_EXIT
-}
-
-/*!
-    Postpones outstanding jobs until resumeJobs() is called. This must always be called after
-    postponeJobs.
- */
-void CntCacheThread::resumeJobs()
-{
-    CNT_ENTRY
-    
-    mTimer->stop();
-    mJobsPostponed = JobsNotPostponed;
-    HbApplication::instance()->postEvent(this, new QEvent(ProcessJobsEvent));
-    
-    CNT_EXIT
-}
-
-/*!
-    Handles a class-specific event that is sent by the scheduleOrUpdate functions
-    when there are jobs.
- */
-bool CntCacheThread::event(QEvent* event)
-{
-    if (event->type() == ProcessJobsEvent) {
-        processJobs();
-        return true;
-    }
-
-    return QObject::event(event);
-}
-
-/*!
-    Processes all scheduled jobs. The loop runs until all jobs are done.
-    It pauses for a while if new info jobs appear -- this means that the
-    UI is updating and so the CPU is yielded to the UI. If there are
-    again new jobs after the pause, then it pauses again, and so on.
- */
-void CntCacheThread::processJobs()
-{
-    CNT_ENTRY
-
-    bool hasDoneJobs = false;
-
-    forever {
-        int infoJobs = mInfoJobs.count();
-        int iconJobs = mIconJobs.count();
-        int totalJobs = infoJobs + iconJobs + mCancelledInfoJobs.count() + mCancelledIconJobs.count();
-        
-        if (totalJobs == 0 || totalJobs == iconJobs && mIconRequestId != NoIconRequest || mJobsPostponed != JobsNotPostponed) {
-            if (mJobsPostponed == JobsNotPostponed || totalJobs == 0) {
-                mProcessingJobs = false;
-            }
-            
-            if (totalJobs == 0 && hasDoneJobs) {
-                emit allJobsDone();
-            }
-            
-            break;
-        }
-        
-        if (infoJobs > 0) {
-            // get next job
-            int contactId = takeNextInfoJob();
-            
-            // fetch qcontact
-            QContactFetchHint restrictions;
-            restrictions.setOptimizationHints(QContactFetchHint::NoRelationships);
-			QContact contact = mContactManager->contact(contactId, restrictions);
-            
-            // request contact info from providers
-            QMapIterator<CntInfoProvider*, ContactInfoFields> i(mInfoProviders);
-            while (i.hasNext()) {
-                i.next();
-                if (i.value() != 0) {
-                    i.key()->requestInfo(contact, i.value());
-                }
-            }
-        }
-        else if (iconJobs > 0 && mIconRequestId == NoIconRequest) {
-            // request icon from thumbnail manager
-            QString iconName  = takeNextIconJob();
-            mIconRequestId = mThumbnailManager->getThumbnail(iconName, NULL, 0);
-            mIconRequestName = iconName;
-        }
-        else {
-            if (mCancelledInfoJobs.count() > 0) {
-                int contactId = mCancelledInfoJobs.takeLast();
-                emit infoCancelled(contactId);
-            }
-            else if (mCancelledIconJobs.count() > 0) {
-                QString iconName = mCancelledIconJobs.takeFirst();
-                emit iconCancelled(iconName);
-            }
-        }
-        
-        hasDoneJobs = true;
-
-        // allow signals to be passed from providers and from the client
-        HbApplication::processEvents();
-    }
-
-    CNT_EXIT
-}
-
-/*!
-    Passes an info field from a data provider up to the client via signals. The
-    client is not in the same thread, so Qt passes the signal as an event.
- */
-void CntCacheThread::onInfoFieldReady(CntInfoProvider* sender, int contactId,
-                                      ContactInfoField field, const QString& text)
-{
-    CNT_ENTRY
-
-    // there can be 3rd party providers, so we cannot blindly trust them;
-    // info is emitted only if:
-    // 1) the sender is in the list of providers
-    // 2) exactly one field bit is set in parameter 'field'
-    // 3) the field bit has been assigned to this provider
-    if (mInfoProviders.contains(sender)
-        && ((field & (field - 1)) == 0)
-        && ((field & mInfoProviders.value(sender)) != 0)) {
-        emit infoFieldUpdated(contactId, field, text);
-    }
-
-    CNT_EXIT
-}
-
-/*!
-    Passes an icon from thumbnail manager up to the client via a signal. The
-    client is not in the same thread, so Qt passes the signal as an event.
- */
-void CntCacheThread::onIconReady(const QPixmap& pixmap, void *data, int id, int error)
-{
-    CNT_ENTRY
-
-    Q_UNUSED(id);
-    Q_UNUSED(data);
-
-    Q_ASSERT(id == mIconRequestId && !mIconRequestName.isEmpty());
-    if (!mProcessingJobs) {
-        // job loop quit while waiting for this icon, so restart it
-        mProcessingJobs = true;
-        HbApplication::instance()->postEvent(this, new QEvent(ProcessJobsEvent));
-    }
-    mIconRequestId = NoIconRequest;
-
-    if (error == 0) {
-        emit iconUpdated(mIconRequestName, HbIcon(pixmap));
-    }
-
-    CNT_EXIT
-}
-
-/*!
-    Finds out the index of an info job in the job list.
-
-    \return index of the contact in the job list, or NoSuchJob if no job is scheduled for the contact
- */
-int CntCacheThread::infoJobIndex(int contactId)
-{
-    int jobCount = mInfoJobs.count();
-    for (int i = 0; i < jobCount; ++i) {
-        if (mInfoJobs.at(i).first == contactId) {
-            return i;
-        }
-    }
-    
-    return NoSuchJob;
-}
-
-/*!
-    Picks the next job from the info job list (the one with the highest priority).
-
-    \return the id of the contact for which the info should be fetched
- */
-int CntCacheThread::takeNextInfoJob()
-{
-    int selectionIndex = -1;
-    int selectionPriority = -1;
-
-    int jobCount = mInfoJobs.count();
-    if (jobCount == 0) {
-        return NoSuchJob;
-    }
-
-    for (int i = 0; i < jobCount; ++i) {
-        int jobPriority = mInfoJobs.at(i).second;
-        if (jobPriority < selectionPriority || selectionPriority == -1) {
-            selectionIndex = i;
-            selectionPriority = jobPriority;
-        }
-    }
-    
-    return mInfoJobs.takeAt(selectionIndex).first;
-}
-
-/*!
-    Picks the next job from the icon job list (the one with the highest priority).
-
-    \return the name of the icon that should be fetched
- */
-QString CntCacheThread::takeNextIconJob()
-{
-    int selectionIndex = -1;
-    int selectionPriority = -1;
-
-    int jobCount = mIconJobs.count();
-    if (jobCount == 0) {
-        return QString();
-    }
-
-    for (int i = 0; i < jobCount; ++i) {
-        int jobPriority = mIconJobs.at(i).second;
-        if (jobPriority < selectionPriority || selectionPriority == -1) {
-            selectionIndex = i;
-            selectionPriority = jobPriority;
-        }
-    }
-    
-    return mIconJobs.takeAt(selectionIndex).first;
-}
-
-/*!
-    Finds out the index of an icon job in the job list.
-
-    \return index of the icon in the job list, or NoSuchJob if a job for the icon is not scheduled.
- */
-int CntCacheThread::iconJobIndex(QString iconName)
-{
-    int jobCount = mIconJobs.count();
-    for (int i = 0; i < jobCount; ++i) {
-        if (mIconJobs.at(i).first == iconName) {
-            return i;
-        }
-    }
-    
-    return NoSuchJob;
-}
-
-
--- a/phonebookengines/cntlistmodel/src/cntdefaultinfoprovider.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-/*
-* Copyright (c) 2010 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: Default info provider plugin for CntListModel. It can provide
-*              the phone number and the image url of a contact (text and
-*              icon1 field respectively).
-*
-*/
-
-#include <qtcontacts.h>
-#include "cntdefaultinfoprovider.h"
-#include <hbglobal.h>
-
-/*!
-    /return the info fields supported by this provider
- */
-ContactInfoFields CntDefaultInfoProvider::supportedFields() const
-{
-    // this provider does not have any info for the icon2 field
-    return ContactInfoIcon1Field | ContactInfoTextField;
-}
-
-/*!
-    The contact contains all the info this provider needs, so signals with the requested info
-    fields are emitted immediately.
-
-    /param contact the contact for which info is requested
-    /param requestedInfo one or more of the flags in ContactInfoFields
- */
-void CntDefaultInfoProvider::requestInfo(const QContact& contact, ContactInfoFields requestedInfo)
-{
-    if (requestedInfo & ContactInfoTextField) {
-        QContactDetail detail = contact.preferredDetail("call");
-        QString number;
-        
-        if (!detail.isEmpty())
-        {
-            number = static_cast<QContactPhoneNumber>(detail).number();
-        }
-        else
-        {
-            QList<QContactPhoneNumber> numbers = contact.details<QContactPhoneNumber>();
-            if (numbers.count() > 1)
-                number = hbTrId("txt_phob_dblist_val_ln_numbers", numbers.count());
-            else if (numbers.count() == 1)
-                number = numbers.at(0).number();
-        }
-
-        emit infoFieldReady(this, contact.localId(), ContactInfoTextField, number);
-    }
-
-    if (requestedInfo & ContactInfoIcon1Field) {
-        QString imageUrl = contact.detail<QContactAvatar>().imageUrl().toString();
-        emit infoFieldReady(this, contact.localId(), ContactInfoIcon1Field, imageUrl);
-    }
-}
--- a/phonebookengines/cntlistmodel/src/cntdisplaytextformatter.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-/*
-* 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 "cntdisplaytextformatter.h"
-#include <qcontactdetailfilter.h>
-#include <qcontactdisplaylabel.h>
-#include <hbcolorscheme.h>
-#include <cntdebug.h>
-#include <QStringList>
-
-CntHTMLDisplayTextFormatter::CntHTMLDisplayTextFormatter()
-{
-}
-
-CntHTMLDisplayTextFormatter::~CntHTMLDisplayTextFormatter()
-{
-}
-   
-QString CntHTMLDisplayTextFormatter::formattedText( const QString aText, const QContactFilter& aCriteria )
-{
-    CNT_LOG_ARGS( "filter:" << aText )
-    if ( aCriteria.type() == QContactFilter::ContactDetailFilter ) 
-    {
-        const QContactDetailFilter& filter = static_cast<const QContactDetailFilter&>( aCriteria );
-        if ( filter.detailDefinitionName() == QContactDisplayLabel::DefinitionName && 
-             filter.matchFlags() & QContactFilter::MatchStartsWith )
-        {
-            QString formattedText;
-            // go through the words (e.g. Lastname, Firstname) and apply list of pattern to them.
-            foreach ( QString text, aText.split(QRegExp("\\s+"), QString::SkipEmptyParts) )
-            {
-                bool match( false );
-                // go through every search criteria word
-                foreach (QString pattern, filter.value().toStringList() )
-                {
-                    if ( text.startsWith(pattern, Qt::CaseInsensitive) )
-                    {
-                        insertTag( text, pattern.length() );
-                        formattedText.append( text );
-                        match = true;
-                        break; // break this inner foreach
-                    }
-                }
-                
-                // if no match found, original text is returned
-                if ( !match )
-                    formattedText.append( text );
-                
-                // put spaces back between words (split() looses them)
-                formattedText.append( " " );
-            }
-            return formattedText.trimmed();
-        }
-    }
-    return aText;
-}
-
-void CntHTMLDisplayTextFormatter::insertTag( QString& aText, int aChars )
-{
-    QColor highlight = HbColorScheme::color("qtc_lineedit_marker_normal");
-    QColor color = HbColorScheme::color("qtc_lineedit_selected");
-    
-    QString start = QString(TAG_START).arg( highlight.name().toUpper() ).arg(color.name().toUpper());
-    aText.prepend( start );
-    aText.insert( start.length() + aChars, TAG_END );
-}
-// End of File
--- a/phonebookengines/cntlistmodel/src/cntlistmodel.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,780 +0,0 @@
-/*
-* 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 "cntlistmodel_p.h"
-#include "cntlistmodel.h"
-#include "cntcache.h"
-#include "cntdebug.h"
-
-#include <qtcontacts.h>
-#include <QSet>
-#include <QTimerEvent>
-
-#include <hbindexfeedback.h>
-#include <hbframebackground.h>
-#include <hbframedrawer.h>
-#include <xqsettingsmanager.h> // for reading cenrep keys
-#include <xqsettingskey.h>
-
-const uint dummyMyCardId = 0;
-
-/*!
- * Construct a new CntListModel object using manager as the QContactManager
- * instance to communicate with the contacts database.
- *
- * \param manager A QContactManager instance to be used for
- *  communications with the contacts persistant store.
- */
-CntListModel::CntListModel(QContactManager* manager,
-                           const QContactFilter& contactFilter,
-                           bool showMyCard,
-                           QObject *parent)
-    : QAbstractListModel(parent)
-{
-    CNT_ENTRY
-
-    // create icons
-    m_defaultIcon = HbIcon("qtg_large_avatar");
-    m_defaultMyCardIcon = HbIcon("qtg_large_avatar_mycard");
-
-    // set up data
-    d = new CntListModelData(contactFilter, showMyCard);
-    d->m_contactManager = manager;
-    d->m_cache = CntCache::instance(d->m_contactManager);
-    d->m_myCardId = d->m_contactManager->selfContactId();     
-    updateContactIdsArray();
-    
-    // get current setting how to show an item in the name list and subscribe for changes
-    d->m_Settings = new XQSettingsManager;
-    d->m_NameListRowSettingkey = new XQSettingsKey(XQSettingsKey::TargetCentralRepository,
-        KCRCntSettings.iUid,
-        KCntNameListRowSetting);
-    d->m_currentRowSetting = d->m_Settings->readItemValue(*d->m_NameListRowSettingkey,
-        XQSettingsManager::TypeInt).toInt();
-    d->m_Settings->startMonitoring(*d->m_NameListRowSettingkey, XQSettingsManager::TypeInt);
-    connect(d->m_Settings, SIGNAL(valueChanged(const XQSettingsKey&, const QVariant&)), this, SLOT(handleRowSettingChanged(const XQSettingsKey&, const QVariant&)));
-    
-    // listen to cache for changes in contacts
-    connect(d->m_cache, SIGNAL(contactInfoUpdated(QContactLocalId)), this, SLOT(handleContactInfoUpdated(QContactLocalId)));
-    connect(d->m_cache, SIGNAL(contactsAdded(const QList<QContactLocalId>&)), this, SLOT(handleAdded(const QList<QContactLocalId>&)));
-    connect(d->m_cache, SIGNAL(contactsChanged(const QList<QContactLocalId>&)), this, SLOT(handleChanged(const QList<QContactLocalId>&)));
-    connect(d->m_cache, SIGNAL(contactsRemoved(const QList<QContactLocalId>&)), this, SLOT(handleRemoved(const QList<QContactLocalId>&)));
-    connect(d->m_cache, SIGNAL(dataChanged()), this, SLOT(refreshModel()));
-
-    // listen to contactmanager for changes in relationships or mycard
-    connect(d->m_contactManager, SIGNAL(selfContactIdChanged(const QContactLocalId&, const QContactLocalId&)), this, SLOT(handleMyCardChanged(const QContactLocalId&, const QContactLocalId&)));
-    connect(d->m_contactManager, SIGNAL(relationshipsAdded(const QList<QContactLocalId>&)), this, SLOT(handleAddedRelationship(const QList<QContactLocalId>&)));
-    connect(d->m_contactManager, SIGNAL(relationshipsRemoved(const QList<QContactLocalId>&)), this, SLOT(handleRemovedRelationship(const QList<QContactLocalId>&)));
-
-    CNT_EXIT
-}
-
-CntListModel::~CntListModel()
-{
-}
-
-/*!
- * Return the data to be used by the view or delegates for a particular
- * item and role.
- *
- * \param index The index of the item to return data about.
- * \param role The data should be relevant for this particular purpose.
- * \return QVariant The data for the specified index and role.
- */
-QVariant CntListModel::data(const QModelIndex &index, int role) const
-{
-    CNT_ENTRY
-    int row = index.row();
-
-    // check that row is ok
-    if (!validRowId(row)) {
-        // invalid row
-        return QVariant();
-    }
-    
-    // update current contact if needed
-    if (row != d->m_currentRow ) {
-        if (d->m_contactIds[row] == dummyMyCardId) {
-            // row contains dummy MyCard, so create dummy CntContactInfo
-            d->m_currentContact = CntContactInfo();
-        }
-        else {
-            d->m_currentContact = d->m_cache->fetchContactInfo(row, d->m_contactIds);
-        }
-        d->m_currentRow = row;
-    }
-    
-    if (role == Qt::DisplayRole) {
-        return dataForRole(row, role);
-    }
-    else if (role == Hb::IndexFeedbackRole) {
-        if (row == 0 && (d->m_myCardId == d->m_contactIds[0] || dummyMyCardId == d->m_contactIds[0])) {
-            // do not include MyCard in index feedback
-            return QVariant();
-        }
-        else {
-            return dataForRole(row, role).toStringList().at(0).toUpper();
-        }
-    }
-    else if (role == Qt::BackgroundRole) {
-        if (d->m_myCardId == d->m_contactIds[row] || dummyMyCardId == d->m_contactIds[row]) {
-            return HbFrameBackground("qtg_fr_list_parent_normal", HbFrameDrawer::NinePieces);
-        }
-    }
-    else if (role == Qt::DecorationRole) {
-        if (d->m_currentRowSetting == CntTwoRowsNameAndPhoneNumber) {
-            //icon fits only if user selected 2 rows in each name list item
-            QList<QVariant> icons;
-            HbIcon avatar = d->m_currentContact.icon1();
-            HbIcon statusIcon = d->m_currentContact.icon2();
-        
-            if (!avatar.isNull()) {
-                icons.append(avatar);
-            }
-            else if (d->m_myCardId == d->m_contactIds[row] || dummyMyCardId == d->m_contactIds[row]) {
-                icons.append(m_defaultMyCardIcon);
-            }
-            else {
-                icons.append(m_defaultIcon);
-            }
-    
-            if (!statusIcon.isNull()) {
-                icons.append(statusIcon);
-            }
-    
-            return icons;
-        }
-        else {
-            return QVariant();
-        }
-    }
-    CNT_EXIT
-    return QVariant();
-}
-
-/*!
- * Get the number of rows (contacts) in this model.
- *
- * \param parent Optional parent index value.
- * \return Number of contacts in this model.
- */
-int CntListModel::rowCount(const QModelIndex& /*parent*/) const
-{
-    return d->m_contactIds.count();
-}
-
-/*!
- * Read a full contact entry from the database for the given model
- * index value. Only the row part of the index information will be
- * read. This is just an overload of CntListModel::contact() that
- * supports old behaviour and calls:
- *      CntListModel::contact(int row);
- *
- * The entry at the requested row will have its full contact information
- * (all fields) read from the database and returned as a QContact instance.
- *
- * \param index Index for the sought contact entry in this model.
- * \return A newly constructed QContact instance for this entry - ownership
- *  is transferred to the caller.
- *
- */
-QContact CntListModel::contact(const QModelIndex &index) const
-{
-    return contact(index.row());
-}
-
-/*!
- * Returns the id for the contact at the requested row.
- *
- * \param index Index for the sought contact entry in this model.
- * \return The id for the contact, 0 if invalid index.
- *
- */
-QContactLocalId CntListModel::contactId(const QModelIndex &index) const
-{
-    CNT_ENTRY
-
-    if (!validRowId(index.row())) {
-        return 0;
-    }
-
-    CNT_EXIT
-    return d->m_contactIds[index.row()];
-}
-
-/*!
- * Return an index that points to the row relating to the supplied contact.
- *  E.g. if the contact is at row 7, the index with the following properties
- *  is returned:
- *      index.row() == 7
- 
- * \param contact The contact for whose row an index is required
- * \return a QModelIndex with the row set to match that of the contact.
- */
-QModelIndex CntListModel::indexOfContact(const QContact &contact) const
-{
-    return createIndex(rowId(contact.localId()), 0);
-}
-
-/*!
- * Return an index that points to the row relating to the supplied contact id.
- *  E.g. if the contact with this id is at row 7, the index with the following
- *  properties is returned:
- *      index.row() == 7
- 
- * \param contactId The id of the contact for whose row an index is required
- * \return a QModelIndex with the row set to match that of the contact id.
- */
-QModelIndex CntListModel::indexOfContactId(const QContactLocalId &contactId) const
-{
-    return createIndex(rowId(contactId), 0);
-}
-
-/*!
- * Set new filter and sort order for the model.
- *
- * \param contactFilter New contact filter.
- * \param contactSortOrders New sort order.
- */
-void CntListModel::setFilter(const QContactFilter& contactFilter)
-{
-    CNT_ENTRY
-    
-    d->setFilter(contactFilter);
-    
-    //refresh model
-    updateContactIdsArray();
-
-    beginResetModel();
-    reset();
-    endResetModel();
-    
-    CNT_EXIT
-}
-
-/*!
- * Enable/disable MyCard appearance in the model.
- *
- * \param enabled Status of MyCard appearance in the model.
- */
-void CntListModel::showMyCard(bool enabled)
-{
-    CNT_ENTRY
-    if (d->m_showMyCard == enabled) {
-        return;
-    }
-    
-    QContactLocalId myCardId = d->m_myCardId;
-    if (enabled) {
-        //add MyCard to the list
-        if (myCardId <= 0) {
-            // create a placeholder for MyCard
-            d->m_contactIds.insert(0, dummyMyCardId);
-        }
-        else {
-            d->m_contactIds.insert(0, myCardId);
-        }
-    }
-    else {
-        // remove MyCard from the list
-        if (myCardId <= 0) {
-            d->m_contactIds.removeOne(dummyMyCardId);
-        }
-        else {
-            d->m_contactIds.removeOne(myCardId);
-        }
-    }
-    d->m_showMyCard = enabled;
-    d->m_currentRow = -1;
-
-    beginResetModel();
-    reset();
-    endResetModel();
-    CNT_EXIT
-}
-
-/*!
- * Returns MyCard status: shown or not.
- *
- * \return true if MyCard is shown, false otherwise.
- */
-bool CntListModel::myCardStatus() const
-{
-    return d->m_showMyCard;
-}
-
-/*!
- * Returns MyCard id.
- *
- * \return MyCard id.
- */
-QContactLocalId CntListModel::myCardId() const
-{
-    return d->m_myCardId;
-}
-
-/*!
- * Gets the filtered list of the contact Ids in a sorted order  
- * 
- * \return Error status
- */
-void CntListModel::updateContactIdsArray()
-{
-    CNT_ENTRY
-
-    QContactDetailFilter* detailFilter = NULL;
-
-    if (d->m_filter.type() == QContactFilter::ContactDetailFilter) {
-        detailFilter = static_cast<QContactDetailFilter*>(&d->m_filter);
-    }
-
-    // special handling for all-contacts filter
-    if (detailFilter
-        && detailFilter->detailDefinitionName() == QContactType::DefinitionName
-        && detailFilter->detailFieldName() == QContactType::FieldType
-        && detailFilter->value() == QContactType::TypeContact) {
-        d->m_contactIds = d->m_cache->sortIdsByName(NULL);
-    } else if (detailFilter
-        && detailFilter->detailDefinitionName() == QContactDisplayLabel::DefinitionName
-        && detailFilter->detailFieldName() == QContactDisplayLabel::FieldLabel
-        && detailFilter->matchFlags() == Qt::MatchStartsWith) {
-        QStringList searchList = detailFilter->value().toStringList();
-        d->m_contactIds = d->m_cache->sortIdsByName(searchList);
-    } else {
-        QSet<QContactLocalId> filterIds = d->m_contactManager->contactIds(d->m_filter).toSet();
-        d->m_contactIds = d->m_cache->sortIdsByName(&filterIds);
-    }
-    
-    //find MyCard contact and move it to the first position
-    QContactLocalId myCardId = d->m_myCardId;
-    if (myCardId > 0) {
-        // MyCard exists
-        d->m_contactIds.removeOne(myCardId);
-        if (d->m_showMyCard) {
-            d->m_contactIds.insert(0, myCardId);
-        }
-    } 
-    else if (d->m_showMyCard) {
-        // create a placeholder for MyCard
-        d->m_contactIds.insert(0, dummyMyCardId);
-    }
-    CNT_EXIT
-}
-
-/*!
- * Read a full contact entry from the database for the row number.
- *
- * The entry at the requested row will have its full contact information
- * (all fields) read from the database and returned as a QContact instance.
- *
- * \param row Row at which the sought contact entry is in this model.
- * \return A newly constructed QContact instance for this entry - ownership
- *  is transferred to the caller.
- *
- */
-QContact CntListModel::contact(int row) const
-{
-    CNT_ENTRY
-    if (!validRowId(row) || d->m_contactIds[row] == dummyMyCardId) {
-        return QContact();
-    }
-    CNT_EXIT
-    return d->m_contactManager->contact(d->m_contactIds[row]);
-}
-
-/*!
- * Verify specified row id is valid.
- *
- * \param row A row number
- * \return bool indicating validity of row id
- */
-bool CntListModel::validRowId(int row) const
-{
-	return (row >= 0 && row < rowCount());
-}
-
-/*!
- * Fetch the id of the row containing the contact of the specified id.
- *
- * \param contactId The id of the contact
- * \return the row id of the contact or -1 if no item matched.
- */
-int CntListModel::rowId(const QContactLocalId &contactId) const
-{
-    return d->m_contactIds.indexOf(contactId);
-}
-
-/*!
- * Return the data to be used by the view for a display role.
- *
- * \param row The row of the item to return data about.
- * \param column The column of the item to return data about.
- * \return QVariant The data for the specified index.
- */
-QVariant CntListModel::dataForRole(int row, int role) const
-{
-    CNT_ENTRY
-    QStringList list;
-    QString name;
-    QString infoText;
-    bool isSelfContact = false;
-    bool isNonEmptySelfContact = false;
-    
-    QContactLocalId id = d->m_contactIds[row];
-    if (d->m_myCardId == id || dummyMyCardId == id) {
-        isSelfContact = true;
-        if (d->m_currentContact.id() == -1) {
-            // empty card
-            name = hbTrId("txt_phob_dblist_mycard");
-            infoText = hbTrId("txt_phob_dblist_mycard_val_create_my_identity");
-        }
-        else {
-            isNonEmptySelfContact = true;
-        }
-    }
-
-    if (!isSelfContact || isNonEmptySelfContact) {
-        name = d->m_currentContact.name();
-        if (name.isEmpty()) {
-            name = hbTrId("txt_phob_list_unnamed");
-        }
-        infoText = d->m_currentContact.text();
-    }
-    
-    if ( role == Qt::DisplayRole )
-    {
-        list << d->m_Format->formattedText(name, d->m_filter);
-    }
-    else
-    {
-        list << name;
-    }
-    
-    if (!isNonEmptySelfContact) {
-        if (d->m_currentRowSetting == CntTwoRowsNameAndPhoneNumber) {
-            //add additional text only if user wants 2 rows in each name list item
-            list << infoText;
-        }
-    }
-    CNT_EXIT
-    return list;
-}
-
-/*!
- * Handle adding of contacts. 
- *
- * \param contactIds Ids of contacts added.
- */
-void CntListModel::handleAdded(const QList<QContactLocalId>& contactIds)
-{
-    CNT_ENTRY
-    
-    // if contacts are added already, no need to do anything
-    bool newContacts = false;
-    for (int k = 0; k < contactIds.count() && !newContacts; k++) { 
-        if (!d->m_contactIds.contains(contactIds.at(k))) {
-            newContacts = true;
-        }
-    }
-    if (!newContacts) {
-        return;
-    }
-
-    // invalidate cached contact
-    d->m_currentRow = -1;
-    
-    QList<QContactLocalId> oldIdList = d->m_contactIds;
-    updateContactIdsArray();
-
-    QList<int> newRows;
-    for (int i = 0; i < d->m_contactIds.count(); i++) {
-        if (!oldIdList.contains(d->m_contactIds.at(i))) {
-            newRows.append(i);
-        }
-    }
-
-    if (newRows.size() == 1) {
-        beginInsertRows(QModelIndex(), newRows.at(0), newRows.at(0));
-        endInsertRows();
-    } else {
-        beginResetModel();
-        reset();
-        endResetModel();
-    }
-
-    CNT_EXIT
-}
-
-/*!
- * Handle changes in contacts. 
- *
- * \param contactIds Ids of contacts changed.
- */
-void CntListModel::handleChanged(const QList<QContactLocalId>& contactIds)
-{
-    CNT_ENTRY
-    
-    if (contactIds.count() == 0) {
-        return;
-    }
-
-    //invalidate cached contact
-    d->m_currentRow = -1; 
-
-    int firstChangedContactPosBefore = rowId(contactIds.at(0));  
-    updateContactIdsArray();
-    int firstChangedContactPosAfter = rowId(contactIds.at(0)); 
-
-    // if only one contact was updated and its position didn't change,
-    // refresh the corresponding row
-    if (contactIds.count() == 1 &&
-        firstChangedContactPosBefore == firstChangedContactPosAfter &&
-        firstChangedContactPosBefore >= 0) {
-        QModelIndex top = index(firstChangedContactPosBefore);
-        QModelIndex bottom = index(firstChangedContactPosBefore);
-        emit dataChanged(top, bottom);
-    }
-    else {
-        beginResetModel();
-        reset();
-        endResetModel();
-    }
-    
-    CNT_EXIT
-}
-
-/*!
- * Handle removing of contacts. 
- *
- * \param contactIds Ids of contacts removed.
- */
-void CntListModel::handleRemoved(const QList<QContactLocalId>& contactIds)
-{
-    CNT_ENTRY
-    
-    bool removeContacts = false;
-    QList<QContactLocalId> idList = d->m_contactIds;
-    for (int k = 0; k < contactIds.count() && !removeContacts; k++) {
-        if(idList.contains(contactIds.at(k))) {
-            removeContacts = true;
-        }
-    }
-    if (!removeContacts) {
-        return;
-    }
-    
-    //Find contacts to remove (=rows)
-    QList<int> removeRows;
-    for(int i = 0; i < contactIds.count(); i++) {
-        if (idList.contains(contactIds.at(i))) {
-            removeRows.append(rowId(contactIds.at(i)));
-        }
-    }
-    
-    // invalidate cached contact
-    d->m_currentRow = -1;
-    
-    int myCardRow = -1;
-    if (contactIds.contains(d->m_myCardId)) {
-        myCardRow = rowId(d->m_myCardId);
-        d->m_myCardId = 0;
-    }
-
-    // remove rows starting from the bottom
-    qSort(removeRows.begin(), removeRows.end(), qGreater<int>());
-    foreach (int row, removeRows) {
-        if (row != myCardRow || !d->m_showMyCard) {
-            beginRemoveRows(QModelIndex(), row, row);
-            endRemoveRows();
-        }
-    }
-
-    foreach (QContactLocalId id, contactIds) {
-        d->m_contactIds.removeOne(id);
-    }
-
-    if (myCardRow != -1 && d->m_showMyCard) {
-        d->m_contactIds.insert(0, dummyMyCardId);
-        QModelIndex index = createIndex(0, 0);
-        emit dataChanged(index, index);
-    }
-
-    CNT_EXIT
-}
-
-/*!
- * Handle my card change. 
- *
- * \param oldId Id of the old MyCard.
- * \param newId Id of the new MyCard.
- */
-void CntListModel::handleMyCardChanged(const QContactLocalId& /*oldId*/, const QContactLocalId& newId)
-{
-    CNT_ENTRY
-    
-    //invalidate cached contact
-    d->m_currentRow = -1;
-    d->m_myCardId = newId;
-
-    updateContactIdsArray();
-    
-    beginResetModel();
-    reset();
-    endResetModel();
-    
-    CNT_EXIT
-}
-
-/*!
- * Handle added relationships. 
- *
- * \param contactIds Ids of contacts added (group id and contact ids).
- */
-void CntListModel::handleAddedRelationship(const QList<QContactLocalId>& contactIds)
-{
-    CNT_ENTRY
-
-    if (contactIds.contains(d->m_groupId)) {
-        foreach (QContactLocalId id, contactIds) {
-            if (id != d->m_groupId && !d->m_contactIds.contains(id)) {
-                // at least one new contact id has been added to this group,
-                // so update the model
-                updateRelationships();
-                break;
-            }
-        }
-    }
-
-    CNT_EXIT
-}
-
-/*!
- * Handle removed relationships. 
- *
- * \param contactIds Ids of contacts removed from a relationship (group id and contact ids).
- */
-void CntListModel::handleRemovedRelationship(const QList<QContactLocalId>& contactIds)
-{
-    CNT_ENTRY
-
-    if (contactIds.contains(d->m_groupId)) {
-        foreach (QContactLocalId id, contactIds) {
-            if (d->m_contactIds.contains(id)) {
-                // at least one new contact id has been removed from this group,
-                // so update the model
-                updateRelationships();
-                break;
-            }
-        }
-    }
-
-    CNT_EXIT
-}
-
-/*!
- * Updates the model to reflect changes in the relationships.
- */
-void CntListModel::updateRelationships()
-{
-    CNT_ENTRY
-
-    //invalidate cached contact
-    d->m_currentRow = -1;
-    
-    QList<QContactLocalId> oldIdList = d->m_contactIds;
-    updateContactIdsArray();
-    
-    // find all changed rows
-    QList<int> newRows, removedRows;
-    for (int i = 0; i < d->m_contactIds.count(); i++) {
-        if (!oldIdList.contains(d->m_contactIds.at(i))) {
-            newRows.append(i);
-        }
-    }
-    for (int i = 0; i < oldIdList.count(); i++) {
-        if (!d->m_contactIds.contains(oldIdList.at(i))) {
-            removedRows.append(i);
-        }
-    }
-
-    // currently only one-row-changes are handled with beginInsertRows/beginRemoveRows
-    // if there are more than one change, the whole model is reset
-    if (removedRows.count() == 1 && newRows.count() == 0) {
-        beginRemoveRows(QModelIndex(), removedRows.at(0), removedRows.at(0));
-        endRemoveRows();
-    }
-    else if (newRows.count() == 1 && removedRows.count() == 0) {
-        beginInsertRows(QModelIndex(), newRows.at(0), newRows.at(0));
-        endInsertRows();
-    }
-    else {
-        beginResetModel();
-        endResetModel();
-    }
-
-    CNT_EXIT
-}
-
-/*!
-* Notify views that info for a contact has become
-* available or has changed.
-*
-* \param contactId the id of the contact
-*/
-void CntListModel::handleContactInfoUpdated(QContactLocalId contactId)
-{
-    CNT_ENTRY
-    
-    QModelIndex index = createIndex(rowId(contactId), 0);
-    if (index.row() == d->m_currentRow) {
-        d->m_currentRow = -1;
-    }
-    emit dataChanged(index, index);
-    
-    CNT_EXIT
-}
-
-/*!
-* Handle a change in how name list item should be represented
-*
-* \param key Central repository key
-* \param value New value in the key
-*/
-void CntListModel::handleRowSettingChanged(const XQSettingsKey& /*key*/, const QVariant& value)
-{
-    bool ok = false;
-    int newSetting = value.toInt(&ok);
-    if (ok) {
-        d->m_currentRowSetting = newSetting;
-        beginResetModel();
-        reset();
-        endResetModel();
-    }
-}
-
-/*!
-* Handle a change in data
-*/
-void CntListModel::refreshModel()
-{
-    d->m_currentRow = -1;
-
-    updateContactIdsArray();
-
-    beginResetModel();
-    reset();
-    endResetModel();
-}
--- a/phonebookengines/cntlistmodel/src/cntnamefetcher.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,643 +0,0 @@
-/*
-* Copyright (c) 2010 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: Private data and helper classes used by class CntCache.
-*
-*/
-
-#include <e32base.h>
-#include <s32mem.h>
-#include <e32std.h>
-
-#include <xqutils.h>
-#include <QEvent>
-#include <QFile>
-#include <QDir>
-#include <hbapplication.h>
-#include <hbstringutil.h>
-
-#include <cntdb.h>
-#include <cntuids.h>
-#include <cntdebug.h>
-
-#include "cntnamefetcher.h"
-
-// constants used when fetching names from CntSrv
-#define KCntSearchResultList 99
-#define KCntOpenDataBase 100
-_LIT(KCntServerExe, "CNTSRV.EXE");
-_LIT(KCntServerName, "CNTSRV");
-const TInt KAsyncMessageSlots = 6;
-const TInt KCntServerMajorVersionNumber=1;
-const TInt KCntServerMinorVersionNumber=1;
-const TInt KCntServerBuildVersionNumber=1;
-static const QEvent::Type CntAsynchOperation = QEvent::User;
-
-// constants used for file cache
-static const QString cacheFolder = "20022EF9";
-static const QString cacheFilename = "contactcache.dat";
-
-/*!
-     Internal class used by CntSrvConnection to issues requests to CntSrv.
-  */
-class CntSrvSession : public RSessionBase
-{
-public:
-    CntSrvSession() { mConnected = false; }
-    ~CntSrvSession() { RHandleBase::Close(); }
-    void executeSqlQueryL(const TDesC &sqlQuery, QList<CntNameCacheItem *> &names, CntNameOrder nameFormat, int sizeHintKB);
-
-private:
-    void connectCntSrvL();
-
-private:
-    bool mConnected;
-};
-
-CntSrvConnection::CntSrvConnection()
-    : mSession(NULL),
-      mIsAsynchronous(false)
-{
-}
-
-CntSrvConnection::~CntSrvConnection()
-{
-    disconnect();
-
-    if (mThread.isRunning()) {
-        mThread.quit();
-        mThread.wait();
-    }
-
-    delete mSession;
-
-    mNames.clear();
-}
-
-void CntSrvConnection::setAsynchronous()
-{
-    mIsAsynchronous = true;
-    mThread.start();
-    moveToThread(&mThread);
-}
-
-bool CntSrvConnection::executeSqlQuery(const QString &sqlQuery, CntNameOrder nameFormat, int sizeHintKB)
-{
-    CNT_ENTRY
-
-    if (!mSession) {
-        mSession = new CntSrvSession();
-    }
-
-    if (mIsAsynchronous) {
-        mSqlQuery = sqlQuery;
-        mNameFormat = nameFormat;
-        mSizeHintKB = sizeHintKB;
-        HbApplication::instance()->postEvent(this, new QEvent(CntAsynchOperation));
-    } else {
-        mNames.clear();
-        TPtrC queryPtr(sqlQuery.utf16(), sqlQuery.length());
-        TRAPD(err, mSession->executeSqlQueryL(queryPtr, mNames, nameFormat, sizeHintKB));
-        if (err != KErrNone) {
-            qDeleteAll(mNames);
-            mNames.clear();
-            CNT_EXIT
-            return false;
-        }
-    }
-
-    CNT_EXIT
-    
-    return true;
-}
-
-bool CntSrvConnection::event(QEvent *event)
-{
-    if (event->type() == CntAsynchOperation) {
-        CNT_ENTRY
-
-        mNames.clear();
-        TPtrC ptr(mSqlQuery.utf16(), mSqlQuery.length());
-        TRAPD(err, mSession->executeSqlQueryL(ptr, mNames, mNameFormat, mSizeHintKB));
-        if (err != KErrNone) {
-            qDeleteAll(mNames);
-            mNames.clear();
-        }
-        emit namesRead();
-        qStableSort(mNames.begin(), mNames.end(), CntNameFetcher::compareNames);
-        delete mSession;
-        mSession = NULL;
-        emit namesSorted();
-
-        CNT_EXIT
-
-        return true;
-    }
-    
-    return QObject::event(event);
-}
-
-/*!
-    Executes a special SQL query: the first column must be the contact id and
-    the subsequent columns must be varchar fields.
-    
-    \param sqlQuery the SQL to execute
-    \param names the list where the results will be stored
-    \param nameFormat the format the names should be stored in 
-    \param sizeHintKB the expected size of the buffer needed to fit the results; a too
-                      small value will effectively double the fetch time, since the
-                      buffer is then resized and the data refetched a second time
- */
-void CntSrvSession::executeSqlQueryL(const TDesC& sqlQuery, QList<CntNameCacheItem*> &names, CntNameOrder nameFormat, int sizeHintKB)
-{
-    int listSize = 0;
-
-    // read the ids and names from the database
-    if (!mConnected) {
-        connectCntSrvL();
-    }
-
-    // allocate tmeporary buffer
-    TInt bufferSize = sizeHintKB * 1024;
-    CBufFlat* buffer = CBufFlat::NewL(256);
-    CleanupStack::PushL(buffer);
-
-    // try to fetch the results, if the fetch fails with
-    // a positive value, it means the buffer was too small
-    // in this case the buffer is resized and the results
-    // are fetched again
-    for (TInt tries = 0; tries < 2 && bufferSize > 0; ++tries) {
-        buffer->ResizeL(bufferSize);
-        TPtr8 bufferPtr = buffer->Ptr(0);
-        TIpcArgs args;
-        args.Set(0, &bufferPtr);
-        args.Set(1, &sqlQuery);
-        bufferSize = SendReceive(KCntSearchResultList, args);
-        CNT_LOG_ARGS("buffer size =" << bufferSize)
-        User::LeaveIfError(bufferSize);
-    } 
-
-    // store the formatted names into the list
-    RBufReadStream readStream;
-    TInt id;
-    TBuf<256> firstName;
-    TBuf<256> lastName;
-
-    readStream.Open(*buffer);
-    for (int i = 0; (id = readStream.ReadInt32L()) != 0; ++i) {
-        readStream >> firstName;
-        readStream >> lastName;
-        CntNameCacheItem* item = new (ELeave) CntNameCacheItem(
-            id,
-            QString::fromUtf16(firstName.Ptr(), firstName.Length()),
-            QString::fromUtf16(lastName.Ptr(), lastName.Length()),
-            nameFormat);
-        if (i >= listSize - 1) {
-            // if the list is runnning out of space, resize it;
-            // initial size is 1000 and after that it doubles
-            // every time it runs out of space
-            if (listSize == 0) {
-                listSize = 1000;
-            } else {
-                listSize *= 2;
-            }
-            QT_TRY {
-                names.reserve(listSize);
-            } QT_CATCH (...) {
-                // clean up and return
-                CleanupStack::PopAndDestroy(buffer);
-                qDeleteAll(names);
-                names.clear();
-                return;
-            }
-        }
-        names.append(item);
-    }
-
-    CleanupStack::PopAndDestroy(buffer);
-}
-
-/*!
-    Connect to / create a contacts server session.
- */
-void CntSrvSession::connectCntSrvL()
-{
-    // Assume the server is already running and attempt to create a session
-    // with a maximum of KAsyncMessageSlots message slots.
-    TInt err = CreateSession(KCntServerName,
-                             TVersion(KCntServerMajorVersionNumber, KCntServerMinorVersionNumber, KCntServerBuildVersionNumber),
-                             KAsyncMessageSlots);
-    
-    // Server is not running
-    if (err == KErrNotFound) {
-        // Use the RProcess API to start the server.
-        RProcess server;
-        User::LeaveIfError(server.Create(KCntServerExe, KNullDesC));
-        
-        // Enforce server to be at system default priority EPriorityForeground
-        server.SetPriority(EPriorityForeground);
-        
-        // Synchronize with the server.
-        TRequestStatus reqStatus;
-        server.Rendezvous(reqStatus);
-        server.Resume();
-        
-        // Server will call the reciprocal static synchronization call.
-        User::WaitForRequest(reqStatus);
-        server.Close();
-        User::LeaveIfError(reqStatus.Int());
-        
-        // Create the server session.
-        User::LeaveIfError(CreateSession(KCntServerName,
-                                         TVersion(KCntServerMajorVersionNumber, KCntServerMinorVersionNumber, KCntServerBuildVersionNumber),
-                                         KAsyncMessageSlots));
-    } else {
-        User::LeaveIfError(err);
-    }
-    
-    TIpcArgs args;
-    args.Set(0, &KNullDesC);
-    User::LeaveIfError(SendReceive(KCntOpenDataBase, args));
-
-    mConnected = true;
-}
-
-/*!
-    Creates a CntNameFetcher object.
- */
-CntNameFetcher::CntNameFetcher()
-    : mDbConnection(NULL),
-      mAsynchDbConnection(NULL),
-      mSettingsManager(NULL),
-      mNameFormatSetting(NULL),
-      mBufferSizeEstimate(0)
-{
-    CNT_ENTRY
-
-    // get name format setting and listen to changes
-    mSettingsManager = new XQSettingsManager();
-    mNameFormatSetting = new XQSettingsKey(XQSettingsKey::TargetCentralRepository, KCRCntSettings.iUid, KCntNameOrdering);
-    mNameFormat = static_cast<CntNameOrder>(mSettingsManager->readItemValue(*mNameFormatSetting, XQSettingsManager::TypeInt).toInt());
-    mSettingsManager->startMonitoring(*mNameFormatSetting, XQSettingsManager::TypeInt);
-    connect(mSettingsManager, SIGNAL(valueChanged(const XQSettingsKey&, const QVariant&)), this, SLOT(setNameFormat(const XQSettingsKey&, const QVariant&)));
-
-    // connect to contacts server
-    mDbConnection = new CntSrvConnection();
-
-    CNT_EXIT
-}
-
-/*!
-    Destroys a CntNameFetcher object.
- */
-CntNameFetcher::~CntNameFetcher()
-{
-    CNT_ENTRY
-
-    delete mSettingsManager;
-    delete mNameFormatSetting;
-    delete mDbConnection;
-    delete mAsynchDbConnection;
-
-    CNT_EXIT
-}
-
-/*!
-    Reads names from the file cache.
-
-    \return true if the names were read successfully from the cache file
-
- */
-bool CntNameFetcher::readNamesFromCache(QList<CntNameCacheItem*> &names)
-{
-    CNT_ENTRY
-
-    bool success = true;
-    quint32 itemCount;
-    quint32 nameFormat;
-
-    QFile cacheFile(XQUtils::phoneMemoryRootPath() + cacheFolder + "\\" + cacheFilename);
-    if (!cacheFile.open(QIODevice::ReadOnly)) {
-        return false;
-    }
-
-    QDataStream in(&cacheFile);
-
-    mBufferSizeEstimate = 0;
-    QT_TRY {
-        // read header: nr of items, name format
-        in >> itemCount;
-        in >> nameFormat;
-        names.reserve(itemCount);
-
-        // populate list with names
-        while (itemCount-- > 0) {
-            CntNameCacheItem *item = CntNameCacheItem::internalize(in, (CntNameOrder) nameFormat);
-            names.append(item);
-            mBufferSizeEstimate += 4 + 2 * item->name().length();
-        }
-    } QT_CATCH (...) {
-        qDeleteAll(names);
-        names.clear();
-        success = false;
-    }
-    
-    cacheFile.close();
-    
-    CNT_EXIT
-    
-    return success;
-}
-
-/*!
-    Write names to the file cache.
- */
-bool CntNameFetcher::writeNamesToCache(const QList<CntNameCacheItem*> &names) const
-{
-    CNT_ENTRY
-
-    bool success = true;
-
-    // create folder for cache file if it does not already exist
-    QString path = XQUtils::phoneMemoryRootPath() + cacheFolder;
-    if (!QDir(path).exists()) {
-        QDir dir(XQUtils::phoneMemoryRootPath());
-        if (!dir.mkdir(cacheFolder)) {
-            CNT_EXIT_ARGS("failed to create folder: " << path)
-            return false;
-        }
-
-        // have to use native Symbian code to make the dir hidden
-        RFs fs;
-        fs.Connect();
-        TPtrC pathPtr(path.utf16(), path.length());
-        if (fs.SetAtt(pathPtr, KEntryAttHidden, 0) != KErrNone) {
-            fs.Close();
-            return false;
-        }
-        fs.Close();
-    }    
-
-    // open cache file for writing
-    QFile cacheFile(XQUtils::phoneMemoryRootPath() + cacheFolder + "\\" + cacheFilename);
-    if (!cacheFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
-        CNT_EXIT_ARGS("failed to create file")
-        return false;
-    }
-    QDataStream out(&cacheFile);
-
-    // write the names to the cache file
-    QT_TRY {
-        // write header
-        out << names.size();
-        out << (quint32) mNameFormat;
-
-        // write list with names
-        foreach (CntNameCacheItem* name, names) {
-            name->externalize(out);
-        }
-    } QT_CATCH (...) {
-        success = false;
-    }
-
-    cacheFile.close();
-
-    CNT_EXIT
-
-    return success;
-}
-
-/*!
-    Reads the name of one contact from the contact database synchronously.
-    
-    \param contactId the id of the contact
- */
-CntNameCacheItem* CntNameFetcher::readOneName(QContactLocalId contactId) const
-{
-    CNT_ENTRY
-
-    QString sqlQuery = QString("SELECT contact_id, first_name, last_name FROM contact WHERE (type_flags>>24)<=1 AND contact_id=%1").arg(contactId);
-    mDbConnection->executeSqlQuery(sqlQuery, mNameFormat, 2);
-    
-    if (mDbConnection->names().size() == 0) {
-        return NULL;
-    }
-
-    CNT_EXIT
-    
-    return mDbConnection->names().at(0);
-}
-
-/*!
-    Reads the names of all contacts from the contact database asynchronously.
- */
-void CntNameFetcher::readAllNamesAsynch()
-{
-    CNT_ENTRY
-    
-    if (mAsynchDbConnection != NULL) {
-        // an asynch fetch is already in progress, so no need to start a new one
-        return;
-    }
-    
-    if (mBufferSizeEstimate == 0) {
-        mBufferSizeEstimate = 240 * 1024;
-    }
-    
-    CNT_LOG_ARGS("buffer size =" << mBufferSizeEstimate)
-    
-    mAsynchDbConnection = new CntSrvConnection();
-    mAsynchDbConnection->setAsynchronous();
-    connect(mAsynchDbConnection, SIGNAL(namesRead()), this, SIGNAL(databaseAccessComplete()));
-    connect(mAsynchDbConnection, SIGNAL(namesSorted()), this, SLOT(sendCompletionSignal()));
-    mAsynchDbConnection->executeSqlQuery("SELECT contact_id, first_name, last_name FROM contact WHERE (type_flags>>24)<=1", mNameFormat, 16 + mBufferSizeEstimate / 1024);
-    
-    CNT_EXIT
-}
-
-/*!
-    Sorts the names quickly and in a locale aware manner.
- */
-void CntNameFetcher::sortNames(QList<CntNameCacheItem *> &names) const
-{
-    CNT_ENTRY
-
-    qStableSort(names.begin(), names.end(), CntNameFetcher::compareNames);
-
-    CNT_EXIT
-}
-
-/*! 
-    Compares a pair of contact names and returns true if the first
-    one should be presented before the second one in a list. This
-    static function is used e.g. when sorting lists of names.
- */
-bool CntNameFetcher::compareNames(const CntNameCacheItem* a, const CntNameCacheItem* b)
-{
-    QString aName = a->name();
-    QString bName = b->name();
-
-    if (aName.isEmpty()) {
-        return false;
-    } else if (bName.isEmpty()) {
-        return true;
-    }
-
-    return (HbStringUtil::compareC(aName, bName) < 0);
-}
-
-/*!
-    Notifies clients that the name format has changed. This function is called by the framework
-    if the name format settings is changed, see the constructor.
- */
-void CntNameFetcher::setNameFormat(const XQSettingsKey &/*key*/, const QVariant &value)
-{
-    CNT_ENTRY
-
-    bool ok = false;
-    CntNameOrder newNameFormat = static_cast<CntNameOrder>(value.toInt(&ok));
-    if (ok && newNameFormat != mNameFormat) {
-        mNameFormat = newNameFormat;
-        emit nameFormatChanged(mNameFormat);
-    }
-
-    CNT_EXIT
-}
-
-/*!
-    Emits the results of a completed asynch database operation.
- */
-void CntNameFetcher::sendCompletionSignal()
-{
-    CNT_ENTRY
-
-    emit namesAvailable(mAsynchDbConnection->names());
-
-    delete mAsynchDbConnection;
-    mAsynchDbConnection = NULL;
-
-    CNT_EXIT
-}
-
-/*!
-    Creates a CntNameCacheItem object.
- */
-CntNameCacheItem::CntNameCacheItem(QContactLocalId id, const QString& firstName, const QString& lastName, CntNameOrder nameFormat)
-{
-    mContactId = id;
-    setFormattedName(firstName, lastName, nameFormat);
-}
-
-/*!
-    Destroys a CntNameCacheItem object.
- */
-CntNameCacheItem::~CntNameCacheItem()
-{
-}
-
-/*!
-    Changes the format used to present the name.
- */
-void CntNameCacheItem::setNameFormat(CntNameOrder newFormat)
-{
-    QString firstName = mName.mid(mFirstNamePosition&0xffff, mFirstNamePosition>>16);
-    QString lastName = mName.mid(mLastNamePosition&0xffff, mLastNamePosition>>16);
-    setFormattedName(firstName, lastName, newFormat);
-}
-
-/*!
-    Copies the contents of the other cache item to this one.
- */
-void CntNameCacheItem::operator=(const CntNameCacheItem &other)
-{
-    mContactId = other.mContactId;
-    mFirstNamePosition = other.mFirstNamePosition;
-    mLastNamePosition = other.mLastNamePosition;
-    mName = other.mName;
-}
-
-/*!
-    Externalizes a CntNameCacheItem object.
- */
-void CntNameCacheItem::externalize(QDataStream &stream)
-{
-    stream << mContactId;
-    stream << mFirstNamePosition;
-    stream << mLastNamePosition;
-    stream << mName;
-}
-
-/*!
-    Internalizes a CntNameCacheItem object.
- */
-CntNameCacheItem* CntNameCacheItem::internalize(QDataStream &stream, CntNameOrder nameFormat)
-{
-    quint32 id;
-    quint32 firstNamePosition;
-    quint32 lastNamePosition;
-    QString name;
-    
-    stream >> id;
-    stream >> firstNamePosition;
-    stream >> lastNamePosition;
-    stream >> name;
-    
-    QString firstName = name.mid(firstNamePosition&0xffff, firstNamePosition>>16);
-    QString lastName = name.mid(lastNamePosition&0xffff, lastNamePosition>>16);
-
-    return new CntNameCacheItem(id, firstName, lastName, nameFormat);
-}
-
-/*!
-    Sets the formatted name and positions of the first name and last name,
-    according to the name format in the parameter.
- */
-void CntNameCacheItem::setFormattedName(const QString& firstName, const QString& lastName, CntNameOrder nameFormat)
-{
-    int firstNameLength = firstName.length();
-    int lastNameLength = lastName.length();
-
-    if (lastNameLength == 0) {
-        mName = firstName;
-        mFirstNamePosition = firstNameLength << 16;
-        mLastNamePosition = 0;
-    } else if (firstNameLength == 0) {
-        mName = lastName;
-        mFirstNamePosition = 0;
-        mLastNamePosition = lastNameLength << 16;
-    } else {
-        if (nameFormat == CntOrderLastFirst) {
-            mName = lastName + " " + firstName;
-            mFirstNamePosition = (firstNameLength << 16) | (lastNameLength + 1);
-            mLastNamePosition = (lastNameLength << 16);
-        } else if (nameFormat == CntOrderLastCommaFirst) {
-            mName = lastName + ", " + firstName;
-            mFirstNamePosition = (firstNameLength << 16) | (lastNameLength + 2);
-            mLastNamePosition = (lastNameLength << 16);
-        } else {
-            mName = firstName + " " + lastName;
-            mFirstNamePosition = (firstNameLength << 16);
-            mLastNamePosition = (lastNameLength << 16) | (firstNameLength + 1);
-        }
-    }
-}
-
-QString CntNameCacheItem::firstName() const
-{
-    return mName.mid(mFirstNamePosition&0xffff, mFirstNamePosition>>16);
-}
-
-QString CntNameCacheItem::lastName() const
-{
-    return mName.mid(mLastNamePosition&0xffff, mLastNamePosition>>16);
-}
--- a/phonebookengines/cntlistmodel/src/cntpresenceinfoprovider.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,172 +0,0 @@
-/*
-* Copyright (c) 2010 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: Presence info provider plugin for CntListModel. It can provide
-*              the presence information of a contact (icon2 field).
-*
-*/
-
-#include <qtcontacts.h>
-#include "cntpresenceinfoprovider.h"
-
-#include <prcpresencebuddyinfo_qt.h>
-#include <prcpresencereader_qt.h>
-
-CntPresenceInfoProvider::CntPresenceInfoProvider() :
-    iReader(NULL),
-    mManager(NULL)
-{
-    iReader = PrcPresenceReader::createReader();
-    connect(iReader, SIGNAL(signalPresenceNotification(bool , PrcPresenceBuddyInfoQt*)), 
-                           this, SLOT(handlePresenceUpdate(bool , PrcPresenceBuddyInfoQt*)));
-    
-    mManager = new QContactManager("symbian");
-}
-
-CntPresenceInfoProvider::~CntPresenceInfoProvider()
-{
-    delete iReader;
-    delete mManager;
-}
-
-/*!
-    /return the info fields supported by this provider
- */
-ContactInfoFields CntPresenceInfoProvider::supportedFields() const
-{
-    // this provider has only info for the icon2 field
-    return ContactInfoIcon2Field;
-}
-
-/*!
-    The contact contains all the info this provider needs, so signals with the requested info
-    fields are emitted immediately.
-
-    /param contact the contact for which info is requested
-    /param requestedInfo one or more of the flags in ContactInfoFields
- */
-void CntPresenceInfoProvider::requestInfo(const QContact& contact, ContactInfoFields requestedInfo)
-{
-    if (requestedInfo & ContactInfoIcon2Field)
-    {
-        QList<QContactOnlineAccount> accounts = contact.details<QContactOnlineAccount>();
-        
-        QList<PrcPresenceBuddyInfoQt*> buddies;
-        
-        foreach (QContactOnlineAccount account, accounts)
-        {
-            QString fullAccount = account.serviceProvider() + ':' + account.accountUri();
-            PrcPresenceBuddyInfoQt* buddy = iReader->presenceInfo(fullAccount);
-            
-            if (buddy)
-            {
-                buddies.append(buddy);
-                if (!mBuddyMap.contains(buddy->buddyId()))
-                {
-                    mBuddyMap.insert(buddy->buddyId(), contact.localId());
-                    iReader->subscribePresenceBuddyChange(buddy->buddyId());
-                }
-            }
-        }
-        
-        if (buddies.count())
-        {
-            QString icon = parsePresence(buddies);
-            
-            if (!icon.isEmpty())
-            {
-                emit infoFieldReady(this, contact.localId(), ContactInfoIcon2Field, icon);
-            }
-            
-            qDeleteAll(buddies);
-        }
-    }
-}
-
-/*!
-    Update presence icon for contact if needed. Stop listening to presence changes for buddy
-    if online account detail was deleted.
-
-    /param aErrorCode error (if any)
-    /param aPresenceBuddyInfo presence buddy that was updated
- */
-void CntPresenceInfoProvider::handlePresenceUpdate(bool aSuccess, PrcPresenceBuddyInfoQt* aPresenceBuddyInfo)
-{
-    if (aSuccess && aPresenceBuddyInfo != NULL)
-    {
-        QContactLocalId id = mBuddyMap.value(aPresenceBuddyInfo->buddyId());
-        QContact contact = mManager->contact(id);
-        
-        QList<QContactOnlineAccount> accounts = contact.details<QContactOnlineAccount>();
-        
-        QList<PrcPresenceBuddyInfoQt*> buddies;
-        bool accountFound = false;
-        
-        foreach (QContactOnlineAccount account, accounts)
-        {
-            QString fullAccount = account.serviceProvider() + ':' + account.accountUri();
-            PrcPresenceBuddyInfoQt* buddy = iReader->presenceInfo(fullAccount);
-            
-            if (buddy)
-            {
-                buddies.append(buddy);
-                
-                if (fullAccount == aPresenceBuddyInfo->buddyId())
-                {
-                    accountFound = true;
-                }
-                
-                if (!mBuddyMap.contains(buddy->buddyId()))
-                {
-                    mBuddyMap.insert(buddy->buddyId(), contact.localId());
-                    iReader->subscribePresenceBuddyChange(buddy->buddyId());
-                }
-            }
-        }
-        
-        // Account was removed, no need to listen to presence changes anymore
-        if (accounts.isEmpty() || !accountFound)
-        {
-            mBuddyMap.remove(aPresenceBuddyInfo->buddyId());
-            iReader->unSubscribePresenceBuddyChange(aPresenceBuddyInfo->buddyId());
-        }
-
-        if (id > 0)
-        {
-            QString icon = parsePresence(buddies);
-            emit infoFieldReady(this, id, ContactInfoIcon2Field, icon);
-        }
-
-        qDeleteAll(buddies);
-    }
-}
-
-/*!
-    Parse the required presence icon from multiple accounts.
-
-    /param buddyList list of buddies
- */
-QString CntPresenceInfoProvider::parsePresence(const QList<PrcPresenceBuddyInfoQt*>& buddyList)
-{
-    foreach (PrcPresenceBuddyInfoQt* buddy, buddyList)
-    {
-        PrcPresenceBuddyInfoQt::AvailabilityValues availability = buddy->availability();
-        
-        if (availability == PrcPresenceBuddyInfoQt::PrcAvailable)
-        {
-            return QString("qtg_small_online");
-        }
-    }
-    
-    return QString();
-}
--- a/phonebookengines/cntlistmodel/tsrc/runperftests.bat	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-@rem
-@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-@rem All rights reserved.
-@rem This component and the accompanying materials are made available
-@rem under the terms of "Eclipse Public License v1.0"
-@rem which accompanies this distribution, and is available
-@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
-@rem
-@rem Initial Contributors:
-@rem Nokia Corporation - initial contribution.
-@rem
-@rem Contributors:
-@rem
-@rem Description: 
-@rem
-
-echo OFF
-
-del \epoc32\winscw\c\private\e84eae91\mt_performance.log
-\epoc32\release\winscw\urel\mt_performance.exe -o mt_performance.log
-type \epoc32\winscw\c\private\e84eae91\mt_performance.log
-
-
Binary file phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/image1.png has changed
Binary file phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/image2.png has changed
--- a/phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/inc/testrunner.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-/*
-* 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:
-*
-*/
-
-#ifndef TESTRUNNER_H
-#define TESTRUNNER_H
-
-#include <QXmlDefaultHandler>
-
-
-class TestRunner : public QXmlDefaultHandler
-{
-public: // Constructors and destructor
-    TestRunner(const QString& name);
-    ~TestRunner();
-       
-public: // New functions
-    
-    int runTests(QObject& testObject);
-    void printResults();
-    
-protected: // From QXmlContentHandler 
-    bool startElement(
-        const QString& namespaceURI,
-        const QString& localName,
-        const QString& qName,
-        const QXmlAttributes& atts);
-    
-    bool endElement(
-        const QString& namespaceURI,
-        const QString& localName,
-        const QString& qName);
-    
-    bool characters(const QString& ch);
-
-private: // New functions
-
-    void parse(const QString& fileName);
-
-private: // Data
-    QStringList mTestRunParams;
-    QString mHomeDir;
-    int mTestCount;
-    QStringList mErrors;
-    bool mParsingIncidentElement;
-    bool mParsingDescriptionElement;
-    bool mCurrentTestFailed;
-    QString mCurrentTestName;
-    QString mCurrentTestFile;
-    int mCurrentTestFailureLine;
-};
-
-
-#endif // TESTRUNNER_H
--- a/phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/inc/ut_cntcache.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-/*
-* 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 <QtTest/QtTest>
-#include <QObject>
-#include <qtcontacts.h>
-
-QTM_USE_NAMESPACE
-
-static const int CntTestContacts = 6;
-
-class TestCntCache : public QObject
-{
-    Q_OBJECT
-
-private:
-    void cleanDatabase();
-    QContact createContact(QString firstName, QString lastName, QString phoneNumber, QString imageName);
-
-private slots:
-	void initTestCase();
-	void cleanupTestCase();
-    
-    void construction();
-    void fetchContactInfo();
-    void clearCache();
-	
-private:
-    QContactManager *mContactManager;
-    QContact mContacts[CntTestContacts];
-    QList<int> mContactOrder;
-};
--- a/phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/inc/ut_cntdefaultinfoprovider.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-/*
-* 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 <QtTest/QtTest>
-#include <QObject>
-#include <qtcontacts.h>
-
-class CntDefaultInfoProvider;
-
-QTM_USE_NAMESPACE
-
-class TestCntDefaultInfoProvider : public QObject
-{
-    Q_OBJECT
-
-private slots:
-    void initTestCase();
-    void create();
-    
-    void testSupportedFields();
-    void testRequestInfo();
-    
-    void cleanupTestCase();
-    
-private:
-    CntDefaultInfoProvider    *mCntDefaultInfoProvider;
-
-};
--- a/phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/inc/ut_cntdisplaytextformatter.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-/*
-* 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 <QtTest/QtTest>
-#include <QObject>
-#include <qtcontacts.h>
-
-QTM_BEGIN_NAMESPACE
-class QContactDetailFilter;
-QTM_END_NAMESPACE
-
-QTM_USE_NAMESPACE
-
-class TestCntDisplayTextFormatter : public QObject
-{
-    Q_OBJECT
-
-private slots:
-	void testFormatter();
-};
--- a/phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/inc/ut_cntlistmodel.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,88 +0,0 @@
-/*
-* 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 <QtTest/QtTest>
-#include <QObject>
-#include <qtcontacts.h>
-
-QTM_BEGIN_NAMESPACE
-class QContactManager;
-QTM_END_NAMESPACE
-
-QTM_USE_NAMESPACE
-
-class CntListModel;
-class ModelListener;
-
-class TestCntListModel : public QObject
-{
-    Q_OBJECT
-
-private:
-    void contactReady(int start, int end);
-    QContact createContact(const QString& firstName, const QString& lastName);
-    void addGroupMember(const QContact& group, const QContact& contact);
-    void removeGroupMember(const QContact& group, const QContact& contact);
-
-private slots:
-	void initTestCase();
-	void create();
-	
-	void data();
-	void rowCount();
-	
-	void contact();
-	void contactId();
-	void indexOfContact();
-	void indexOfContactId();
-	void contactManager();
-	void setFilter();
-	void myCard();
-
-	void rowId();
-	void dataForDisplayRole();
-
-    void handleAdded();
-    void handleChanged();
-    void handleRemoved();
-	void handleMyCardChanged();
-    void handleRelationships();
-	
-	void cleanupTestCase();
-	
-private:
-    QContactManager *mManager;
-    CntListModel    *mCntModel;
-    ModelListener   *mModelListener;
-    bool             mDataReady;
-
-friend class ModelListener;
-};
-
-class ModelListener : public QObject
-{
-    Q_OBJECT
-
-public:
-    ModelListener(TestCntListModel* parent);
-
-private slots:
-    void onDataChanged(QModelIndex start, QModelIndex end);
-
-private:
-    TestCntListModel* mParent;
-};
--- a/phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/inc/ut_cntpresenceinfoprovider.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-/*
-* 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 <QtTest/QtTest>
-#include <QObject>
-#include <qtcontacts.h>
-
-class CntPresenceInfoProvider;
-
-QTM_USE_NAMESPACE
-
-class TestCntPresenceInfoProvider : public QObject
-{
-    Q_OBJECT
-
-private slots:
-    void initTestCase();
-    void create();
-    
-    void testSupportedFields();
-    void testRequestInfo();
-
-    void testHandlePresenceUpdate();
-
-    void testParsePresence();
-    
-    void cleanupTestCase();
-    
-private:
-    CntPresenceInfoProvider    *mCntPresenceInfoProvider;
-
-};
--- a/phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/runtest.cmd	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-@echo off
-rem
-rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-rem All rights reserved.
-rem This component and the accompanying materials are made available
-rem under the terms of "Eclipse Public License v1.0"
-rem which accompanies this distribution, and is available
-rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
-rem
-rem Initial Contributors:
-rem Nokia Corporation - initial contribution.
-rem
-rem Contributors:
-rem
-rem Description:
-rem
-@echo on
-
-call del MON.sym
-call del MON.dat
-call del profile.txt
-
-call qmake
-call sbs reallyclean
-call sbs -c winscw_udeb
-call sbs -c winscw_udeb
-call qmake
-call ctcwrap -i d -C "EXCLUDE+moc_*.cpp" -C "EXCLUDE+ut_*.*" sbs -c winscw_udeb
-
-call \epoc32\release\winscw\udeb\ut_cntlistmodel.exe -noprompt
-call ctcpost MON.sym MON.dat -p profile.txt
-call ctc2html -i profile.txt -nsb
--- a/phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/src/main.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-/*
-* 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 "testrunner.h"
-
-#include "ut_cntlistmodel.h"
-#include "ut_cntcache.h"
-#include "ut_cntpresenceinfoprovider.h"
-#include "ut_cntdefaultinfoprovider.h"
-#include "ut_cntdisplaytextformatter.h"
-
-#include <QtTest/QtTest>
-
-int main(int argc, char *argv[]) 
-{
-    bool promptOnExit(true);
-    for (int i=0; i<argc; i++) {
-        if (QString(argv[i]) == "-noprompt")
-            promptOnExit = false;
-    }
-    printf("Running tests...\n");
-            
-    QApplication app(argc, argv);
-    
-    QTranslator translator;
-    QString lang = QLocale::system().name();
-    QString path = "z:/resource/qt/translations/";
-    translator.load(path + "contacts_" + lang);
-    app.installTranslator(&translator);
-
-    TestRunner testRunner("ut_cntlistmodel");
-    
-    TestCntDisplayTextFormatter ut_CntDisplayTextFormatter;
-    testRunner.runTests( ut_CntDisplayTextFormatter );
-    
-    TestCntListModel ut_CntListModel;
-    testRunner.runTests(ut_CntListModel);
-    
-    TestCntCache ut_CntCache;
-    testRunner.runTests(ut_CntCache);
-    
-    TestCntPresenceInfoProvider ut_CntPresenceInfoProvider;
-    testRunner.runTests(ut_CntPresenceInfoProvider);
-    
-    TestCntDefaultInfoProvider ut_CntDefaultInfoProvider;
-    testRunner.runTests(ut_CntDefaultInfoProvider);
-
-    testRunner.printResults();
-
-    if (promptOnExit) {
-        printf("Press any key...\n");
-        getchar(); 
-    }
-
-    return 0;   
-}
-
--- a/phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/src/testrunner.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,152 +0,0 @@
-/*
-* 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 "testrunner.h"
-#include <QtTest/QtTest>
-#include <QDir>
-#include <stdio.h>
-
-const char testFunctionElement[] = "TestFunction";
-const char incidentElement[] = "Incident";
-const char descriptionElement[] = "Description";
-const char nameAttr[] = "name";
-const char typeAttr[] = "type";
-const char fileAttr[] = "file";
-const char lineAttr[] = "line";
-const char attrValueFail[] = "fail";
-
-
-TestRunner::TestRunner(const QString& name)
-: mTestCount(0),
-  mParsingIncidentElement(false),
-  mParsingDescriptionElement(false),
-  mCurrentTestFailed(false),
-  mCurrentTestFailureLine(0)
-{
-    mTestRunParams.append(name);
-    mTestRunParams.append("-xml");
-    mTestRunParams.append("-o");
-    mHomeDir = QDir::homePath();
-    mTestRunParams.append(QString()); // Initial result file name
-
-    if (!mHomeDir.endsWith(QString::fromAscii("/")))
-        mHomeDir += QString::fromAscii("/");
-}
-
-TestRunner::~TestRunner()
-{
-}
-
-int TestRunner::runTests(QObject& testObject)
-{
-    QString className(testObject.metaObject()->className());
-    printf("Running tests for %s ... ", className.toUtf8().data());
-    QString resultFileName = mHomeDir + className + ".xml";
-    mTestRunParams.replace(mTestRunParams.count()-1,resultFileName);
-    int errorsBefore = mErrors.count();
-    int error = QTest::qExec(&testObject, mTestRunParams);
-    parse(resultFileName);
-    printf("Failures: %d\n",mErrors.count()-errorsBefore);
-    fflush(stdout);
-    return error;
-}
-
-void TestRunner::printResults()
-{
-    printf("\nTests executed: %d\n",mTestCount);
-    if (mErrors.count() > 0) {
-        printf("Failures (%d):\n", mErrors.count());
-        foreach(QString error, mErrors) {
-            printf("\n%s", error.toUtf8().data());
-        }
-        printf("\n");
-    } else {
-        printf("All passed.\n\n");
-    }
-    fflush(stdout);
-}
-
-void TestRunner::parse(const QString& fileName)
-{
-    QFile file(fileName);
-    QXmlInputSource inputSource(&file);
-    QXmlSimpleReader reader;
-    reader.setContentHandler(this);
-    reader.parse(inputSource);
-}
-
-bool TestRunner::startElement(
-    const QString& /*namespaceURI*/, 
-    const QString& /*localName*/, 
-    const QString& qName, 
-    const QXmlAttributes& atts)
-{
-    if (qName == QString::fromAscii(testFunctionElement)) {
-        mTestCount++;
-        mCurrentTestName = atts.value(QString::fromAscii(nameAttr));
-        return true;
-    }
-    if (qName == QString::fromAscii(incidentElement)) {
-        mParsingIncidentElement = true;
-        if (atts.value(QString::fromAscii(typeAttr)) == QString::fromAscii(attrValueFail)) {
-            mCurrentTestFailed = true;
-            mCurrentTestFile = atts.value(QString::fromAscii(fileAttr));
-            mCurrentTestFailureLine = atts.value(QString::fromAscii(lineAttr)).toInt();
-        }
-        return true;
-    }
-    mParsingDescriptionElement =
-        (qName == QString::fromAscii(descriptionElement));
-    return true;
-}
-
-bool TestRunner::endElement(
-    const QString& /*namespaceURI*/,
-    const QString& /*localName*/,
-    const QString& qName)
-{
-    if (qName == QString::fromAscii(incidentElement)) {
-        mParsingIncidentElement = false;
-        mCurrentTestFailed = false;
-        return true;
-    }
-    if (qName == QString::fromAscii(descriptionElement)) {
-        mParsingDescriptionElement = false;
-    }    
-    return true;
-}
-
-bool TestRunner::characters(const QString& ch)
-{
-    if (mParsingIncidentElement && 
-        mParsingDescriptionElement &&
-        mCurrentTestFailed) {
-        QByteArray testResult = mCurrentTestName.toAscii() + " failed:\n";
-        testResult += "File: ";
-        testResult += mCurrentTestFile.toAscii();
-        testResult += "\n";
-        testResult += "Line: ";
-        testResult += QByteArray::number(mCurrentTestFailureLine);
-        testResult += "\n";
-        testResult += "Reason: ";
-        testResult += ch.toAscii();
-        testResult += "\n";
-        mErrors.append(QString::fromAscii(testResult.data()));
-    }
-    return true;
-}
-
--- a/phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/src/ut_cntcache.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,231 +0,0 @@
-/*
-* 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 "ut_cntcache.h"
-#include "cntcache.h"
-#include "cntcache_p.h"
-
-void TestCntCache::initTestCase()
-{
-    // get contact manager
-    mContactManager = new QContactManager("symbian");
-
-    // start with a clean database
-    cleanDatabase();
-
-    // TODO: This test needs to be run with the default provider, so when there is a mechanism
-    //       to variate the info provider, use that mechanism here to select the default provider.
-
-    // create contacts; twins with same image at indexes 0,5 and 2,3 (good for increasing branch coverage)
-    mContacts[0] = createContact("Joe", "Doe", "1234567", "c:/data/images/image1.png");
-    mContacts[1] = createContact("Marja", "Meikalainen", "7654321", "");
-    mContacts[2] = createContact("Sven", "Dufva", "12121212", "c:/data/images/image2.png");
-    mContacts[3] = createContact("Twin", "Dufva", "12121212", "c:/data/images/image2.png");
-    mContacts[4] = createContact("", "", "123123", "");
-    mContacts[5] = createContact("Twin", "Doe", "1234568", "c:/data/images/image1.png");
-}
-
-void TestCntCache::cleanupTestCase()
-{
-    // end with a clean database
-    cleanDatabase();
-
-    delete mContactManager;
-    mContactManager = NULL;
-}
-
-/*
-    Test case: Constructing and deleting the cache.
- */
-void TestCntCache::construction()
-{
-    // test creation
-    QPointer<CntCache> cache = CntCache::instance();
-    QVERIFY(cache != NULL);
-    QPointer<CntCacheThread> worker = cache->mWorker;
-    QVERIFY(worker != NULL);
-
-    // test singleton property
-    QVERIFY(cache == CntCache::instance());
-
-    // test data members
-    QVERIFY(cache->mContactManager != NULL);
-    QVERIFY(worker->mContactManager != NULL);
-    QVERIFY(worker->mThumbnailManager != NULL);
-    QVERIFY(worker->mInfoProviders.count() >= 1);
-
-    // test deletion
-    cache->onShutdown();
-    QVERIFY(CntCache::mInstance == NULL);
-}
-
-/*
-    Test case: Fetch contact info.
-
-    Fetches all six contacts in two batches of four and two contacts. The contacts are
-    divided up so that one pair of twins is in the same batch and the other pair of twins
-    has one twin in each batch. This maximizes branch coverage.
- */
-void TestCntCache::fetchContactInfo()
-{
-    CntContactInfo info[CntTestContacts];    // info for each of the contacts
-
-    // create cache and attach a signal spy to it
-    CntCache* cache = CntCache::instance();
-    QSignalSpy spy(cache, SIGNAL(contactInfoUpdated(QContactLocalId)));
-
-    // create list of ids
-    QList<QContactLocalId> idList;
-    for (int i = 0; i < CntTestContacts; ++i) {
-        idList << mContacts[i].localId();
-    }
-
-    // fetch three of the contacts in rapid succession, one of them twice
-    info[1] = cache->fetchContactInfo(1, idList);
-    info[0] = cache->fetchContactInfo(0, idList);
-    info[4] = cache->fetchContactInfo(4, idList);
-    info[0] = cache->fetchContactInfo(0, idList);
-    info[5] = cache->fetchContactInfo(5, idList);
-
-    // check that names are ok
-    QVERIFY(info[1].name() == mContacts[1].displayLabel());
-    QVERIFY(info[0].name() == mContacts[0].displayLabel());
-    QVERIFY(info[4].name() == mContacts[4].displayLabel());
-    QVERIFY(info[5].name() == mContacts[5].displayLabel());
-
-    // wait for possible signals to arrive (in the future, all info could be returned immediately)
-    QTest::qWait(4000);
-    spy.clear();
-
-    // fetch all contacts -- they should be cached now by the read-ahead mechanism
-    for (int i = 0; i < CntTestContacts; ++i) {
-        info[i] = cache->fetchContactInfo(i, idList);
-    }
-
-    // confirm that no further signals from cache (i.e. they were all really cached)
-    QTest::qWait(2000);
-    QVERIFY(spy.count() == 0);
-
-    // confirm that returned data equals created data 
-    for (int i = 0; i < CntTestContacts; ++i) {
-        QVERIFY(info[i].name() == mContacts[i].displayLabel());
-        QVERIFY(info[i].text() == mContacts[i].detail<QContactPhoneNumber>().number());
-    }
-
-    // confirm that info cache contains correct data
-    int cacheItemCount = 0;
-    foreach (CntInfoCacheItem* item, cache->mInfoCache) {
-        // find corresponding contact
-        for (int i = 0; i < CntTestContacts; ++i) {
-            if (mContacts[i].localId() == item->contactId) {
-                QVERIFY(item->name == mContacts[i].displayLabel());
-                QVERIFY(item->text == mContacts[i].detail<QContactPhoneNumber>().number());
-                QVERIFY(item->icons[0].replace('\\', '/') == mContacts[i].detail<QContactAvatar>().imageUrl().toString().replace('\\', '/'));
-                ++cacheItemCount;
-            }
-        }
-    }
-    QVERIFY(cacheItemCount == CntTestContacts);
-
-    // confirm that icon cache contains correct data
-    cacheItemCount = 0;
-    foreach (CntIconCacheItem* item, cache->mIconCache) {
-        // find corresponding contact
-        for (int i = 0; i < CntTestContacts; ++i) {
-            if (mContacts[i].detail<QContactAvatar>().imageUrl().toString().replace('\\','/') == item->iconName.replace('\\','/')) {
-                QVERIFY(item->isFetched);
-                QVERIFY(!item->icon.isNull());
-                ++cacheItemCount;
-            }
-        }
-    }
-    QVERIFY(cacheItemCount == 2*2); // two images, both used by two contacts
-
-    cache->onShutdown();
-}
-
-/*
-    Test case: Clear cache.
- */
-void TestCntCache::clearCache()
-{
-    CntCache* cache = CntCache::instance();
-
-    QList<QContactLocalId> idList;
-    for (int i = 0; i < CntTestContacts; ++i) {
-        idList << mContacts[i].localId();
-    }
-
-    cache->fetchContactInfo(1, idList);
-    cache->fetchContactInfo(3, idList);
-
-    QVERIFY(cache->mInfoCache.count() == 2);
-    QTest::qWait(3000);
-    QVERIFY(cache->mIconCache.count() == 2);
-
-    cache->clearCache();
-    QVERIFY(cache->mInfoCache.count() == 0);    // icon cache needn't be cleared
-    
-    delete cache;
-}
-
-/* TODO: Test cases for overflowing info and icon requests (>30) -- IDs need not be real, just confirm
-         that cancellation notifications eventually arrive */
-
-/*  
-    Helper function for cleaning the database.
- */
-void TestCntCache::cleanDatabase()
-{
-    QList<QContactLocalId> ids = mContactManager->contactIds();
-    QMap<int, QContactManager::Error> errorMapInit;
-    mContactManager->removeContacts(ids, &errorMapInit);
-    mContactManager->removeContact(mContactManager->selfContactId());
-}
-
-/*  
-    Helper function for creating contacts.
- */
-QContact TestCntCache::createContact(QString firstName, QString lastName, QString phoneNumber, QString imageName)
-{
-    QContact contact;
-
-    if (!firstName.isEmpty() && !lastName.isEmpty()) {
-        QContactName name;
-        name.setFirstName(firstName);
-        name.setLastName(lastName);
-        contact.saveDetail(&name);
-    }
-
-    if (!phoneNumber.isEmpty()) {
-        QContactPhoneNumber number;
-        number.setNumber(phoneNumber);
-        number.setContexts(QContactDetail::ContextHome);
-        number.setSubTypes(QContactPhoneNumber::SubTypeMobile);
-        contact.saveDetail(&number);
-    }
-
-    if (!imageName.isEmpty()) {
-        QContactAvatar avatar;
-        avatar.setImageUrl(imageName);
-        contact.saveDetail(&avatar);
-    }
-
-    mContactManager->saveContact(&contact);
-
-    return contact;
-}
--- a/phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/src/ut_cntdefaultinfoprovider.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-/*
-* 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 "ut_cntdefaultinfoprovider.h"
-#include "cntdefaultinfoprovider.h"
-
-void TestCntDefaultInfoProvider::initTestCase()
-{
-    mCntDefaultInfoProvider = NULL;
-}
-
-void TestCntDefaultInfoProvider::create()
-{
-    mCntDefaultInfoProvider = new CntDefaultInfoProvider();
-}
-
-void TestCntDefaultInfoProvider::testSupportedFields()
-{
-    QVERIFY(mCntDefaultInfoProvider->supportedFields() == ContactInfoIcon1Field | ContactInfoTextField);
-}
-
-void TestCntDefaultInfoProvider::testRequestInfo()
-{
-    QSignalSpy spy(mCntDefaultInfoProvider, SIGNAL(infoFieldReady(CntInfoProvider*, int, ContactInfoField, const QString&)));
-    
-    QContact c;
-    QContactName name;
-    name.setFirstName("firstname");
-    name.setLastName("lastname");
-    c.saveDetail(&name);
-    
-    ContactInfoFields fields;
-    fields = ContactInfoIcon2Field;
-    
-    mCntDefaultInfoProvider->requestInfo(c, fields);
-    QCOMPARE(spy.count(), 0);
-    
-    fields = ContactInfoIcon1Field | ContactInfoTextField;
-    
-    mCntDefaultInfoProvider->requestInfo(c, fields);
-    QCOMPARE(spy.count(), 2);
-    spy.clear();
-    
-    QContactPhoneNumber number;
-    number.setNumber("1234567");
-    number.setContexts(QContactDetail::ContextHome);
-    number.setSubTypes(QContactPhoneNumber::SubTypeMobile);
-    c.saveDetail(&number);
-    
-    mCntDefaultInfoProvider->requestInfo(c, fields);
-    QCOMPARE(spy.count(), 2);
-    spy.clear();
-    
-    c.setPreferredDetail("call", number);
-
-    QContactPhoneNumber number2;
-    number2.setNumber("7654321");
-    number2.setContexts(QContactDetail::ContextWork);
-    number2.setSubTypes(QContactPhoneNumber::SubTypeMobile);
-    c.saveDetail(&number2);
-    
-    mCntDefaultInfoProvider->requestInfo(c, fields);
-    QCOMPARE(spy.count(), 2);
-    spy.clear();
-    
-    QContactAvatar avatar;
-    c.saveDetail(&avatar);
-    
-    mCntDefaultInfoProvider->requestInfo(c, fields);
-    QCOMPARE(spy.count(), 2);
-    spy.clear();
-    
-    avatar.setImageUrl(QUrl("dummyavatar"));
-    c.saveDetail(&avatar);
-    
-    mCntDefaultInfoProvider->requestInfo(c, fields);
-    QCOMPARE(spy.count(), 2);
-}
-
-void TestCntDefaultInfoProvider::cleanupTestCase()
-{
-    delete mCntDefaultInfoProvider;
-    mCntDefaultInfoProvider = NULL;
-}
-
--- a/phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/src/ut_cntdisplaytextformatter.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*
-* 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 "ut_cntdisplaytextformatter.h"
-#include "cntdisplaytextformatter.h"
-#include <hbcolorscheme.h>
-
-void TestCntDisplayTextFormatter::testFormatter()
-{
-    QColor color = HbColorScheme::color("qtc_lineedit_selected");
-    QColor bg = HbColorScheme::color("qtc_lineedit_marker_normal");
-    QString foo = QString("<span style=\"background-color:%1;color:%2\">f</span>oo").arg(bg.name().toUpper()).arg(color.name().toUpper());
-    
-    QContactDetailFilter filter;
-    filter.setDetailDefinitionName( QContactDisplayLabel::DefinitionName );
-    filter.setMatchFlags( QContactFilter::MatchStartsWith );
-    filter.setValue( "f" );
-    
-    CntDisplayTextFormatter* format = new CntHTMLDisplayTextFormatter;
-    QString result = format->formattedText("foo", filter );
-    QVERIFY( foo == result );
-    QVERIFY( "" == format->formattedText("", filter) );
-    // invalid filter
-    QContactRelationshipFilter invalidFilter;
-    QVERIFY( "foo" == format->formattedText("foo", invalidFilter) );
-    QVERIFY( "" == format->formattedText("", invalidFilter) );
-    
-    // dummy returns always the given text, dispite of the filter
-    CntDisplayTextFormatter* dummy = new CntDummyDisplayTextFormatter;
-    QVERIFY( "foo" == dummy->formattedText("foo", filter) );
-    QVERIFY( "foo" == dummy->formattedText("foo", invalidFilter) );
-    QVERIFY( "" == dummy->formattedText("", filter) );
-}
--- a/phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/src/ut_cntlistmodel.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,601 +0,0 @@
-/*
-* 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 "ut_cntlistmodel.h"
-#include "cntlistmodel.h"
-#include "cntlistmodel_p.h"
-
-#include <hbnamespace.h>
-#include <qtcontacts.h>
-#include <QUrl>
-
-void TestCntListModel::initTestCase()
-{
-    //let's have clean database before running tests 
-    mManager = new QContactManager("symbian");
-    QList<QContactLocalId> ids = mManager->contactIds();
-    QMap<int, QContactManager::Error> errorMapInit;
-    mManager->removeContacts(ids, &errorMapInit);
-    mManager->removeContact(mManager->selfContactId());
-}
-
-void TestCntListModel::contactReady(int startRow, int endRow)
-{
-    QVERIFY(startRow == endRow);
-    mDataReady = true;
-}
-
-void TestCntListModel::create()
-{
-    mCntModel = new CntListModel();
-    QVERIFY(mCntModel != NULL);
-    QVERIFY(mCntModel->rowCount() == 1);
-    QVERIFY(mCntModel->d->m_cache);
-    QVERIFY(mCntModel->d->m_ownedContactManager);
-    QVERIFY(mCntModel->d->m_contactManager != NULL);
-    
-    delete mCntModel;
-    mCntModel = NULL;
-    
-    mCntModel = new CntListModel(mManager);
-    QVERIFY(mCntModel != NULL);
-    QCOMPARE(mCntModel->rowCount(), 1);
-    QVERIFY(mCntModel->rowCount() == 1);
-    QVERIFY(mCntModel->d->m_cache);
-    QVERIFY(!mCntModel->d->m_ownedContactManager);
-    QVERIFY(mCntModel->d->m_contactManager != NULL);
-}
-
-void TestCntListModel::data()
-{
-    mModelListener = new ModelListener(this);
-    mDataReady = false;
-
-    //create and save contact
-    QContact c;
-    QContactName name;
-    name.setFirstName("firstname");
-    name.setLastName("lastname");
-    c.saveDetail(&name);
-    QContactPhoneNumber number;
-    number.setNumber("1234567");
-    number.setContexts(QContactDetail::ContextHome);
-    number.setSubTypes(QContactPhoneNumber::SubTypeMobile);
-    c.saveDetail(&number);
-    QContactEmailAddress email;
-    email.setEmailAddress("dummyemail");
-    c.saveDetail(&email);
-    QVERIFY(mManager->saveContact(&c));
-    QTest::qWait(1000);
-    
-    //check invalid row and column
-    QVariant ret;
-    ret = mCntModel->data(QModelIndex(), Qt::UserRole);
-    QVERIFY(ret.isNull());
-    
-    //check the saved contact's info
-    QModelIndex modelIndex = mCntModel->indexOfContact(c);
-    int row = modelIndex.row();
-    QContact contactFromModel = mCntModel->contact(modelIndex);
-    QVERIFY(c == contactFromModel);
-    
-    ret = mCntModel->data(modelIndex, Qt::UserRole); 
-    QVERIFY(ret.isNull());
-    
-    ret = mCntModel->data(modelIndex, Qt::DisplayRole); 
-    QVERIFY(ret.type() == QVariant::StringList);
-    QStringList displayContent;
-    displayContent = ret.toStringList();
-    QVERIFY(displayContent.count() == 2);
-    QVERIFY(displayContent.at(0) == "firstname lastname");
-    // second string is only an empty placeholder, e.g. " ", until cache has fetched the value
-
-    // wait for cache to signal that all contact info is ready
-    while (!mDataReady) { QTest::qWait(200); QApplication::processEvents(); }
-    mDataReady = false;
-    ret = mCntModel->data(modelIndex, Qt::DisplayRole); 
-
-    QVERIFY(ret.type() == QVariant::StringList);
-    displayContent = ret.toStringList();
-    QVERIFY(displayContent.count() == 2);
-    QVERIFY(displayContent.at(0) == "firstname lastname");
-    QVERIFY(displayContent.at(1) == "1234567");
-   
-    // check backgroundrole
-    ret = mCntModel->data(modelIndex, Qt::BackgroundRole); 
-    QVERIFY(ret.isNull());
-    
-    //check decoration role
-    ret = mCntModel->data(modelIndex, Qt::DecorationRole); 
-    QVERIFY(ret.type() == QVariant::List);
-    
-    ret = mCntModel->data(modelIndex, Hb::IndexFeedbackRole); 
-    QVERIFY(ret.type() == QVariant::String);
-
-    // add empty avatar and check decoration
-    QContactAvatar avatar;
-    c.saveDetail(&avatar);
-    QVERIFY(mManager->saveContact(&c));
-    QTest::qWait(1000);
-    ret = mCntModel->data(modelIndex, Qt::DecorationRole); 
-    QVERIFY(ret.type() == QVariant::List);
-    
-    // add data to the avatar and check decoration
-    avatar.setImageUrl(QUrl("dummyimagepath"));
-    c.saveDetail(&avatar);
-    QVERIFY(mManager->saveContact(&c));
-    QTest::qWait(1000);
-    modelIndex = mCntModel->indexOfContact(c);
-    ret = mCntModel->data(modelIndex, Qt::DecorationRole); 
-
-    // wait for cache to signal that all contact info is ready
-    while (!mDataReady) { QTest::qWait(200); QApplication::processEvents(); }
-    mDataReady = false;
-    ret = mCntModel->data(modelIndex, Qt::DecorationRole); 
-    QVERIFY(ret.type() == QVariant::List);
-    
-    // check MyCard info from the model
-    modelIndex = mCntModel->index(0, 0);
-    ret = mCntModel->data(modelIndex, Qt::BackgroundRole);
-    QVERIFY(!ret.isNull());
-    
-    // create and assign empty MyCard
-    QContact myCard;
-    QVERIFY(mManager->saveContact(&myCard));
-    QTest::qWait(1000);
-    mManager->setSelfContactId(myCard.localId());
-    QTest::qWait(1000);
-    
-    // check that MyCard was really saved
-    QCOMPARE(mCntModel->myCardId(), myCard.localId());
-    
-    // check MyCard info from the model
-    myCard = mManager->contact(mManager->selfContactId());
-    modelIndex = mCntModel->indexOfContact(myCard);
-    ret = mCntModel->data(modelIndex, Qt::BackgroundRole);
-    QVERIFY(!ret.isNull());
-    
-    ret = mCntModel->data(modelIndex, Qt::DisplayRole);
-    QVERIFY(ret.type() == QVariant::StringList);
-    displayContent = ret.toStringList();
-    QVERIFY(displayContent.count() == 1); // "Unnamed"
-    
-    // add some content to MyCard
-    myCard.saveDetail(&number);
-    QVERIFY(mManager->saveContact(&myCard));
-    QTest::qWait(1000);
-    ret = mCntModel->data(modelIndex, Qt::DisplayRole);
-    // wait for cache
-    QTest::qWait(1000);
-    ret = mCntModel->data(modelIndex, Qt::DisplayRole);
-    QVERIFY(ret.type() == QVariant::StringList);
-    displayContent = ret.toStringList();
-    QVERIFY(displayContent.contains(hbTrId("txt_phob_list_unnamed")));
-    
-    ret = mCntModel->data(modelIndex, Hb::IndexFeedbackRole); 
-    QVERIFY(ret.isNull());
-}
-
-void TestCntListModel::rowCount()
-{
-    // we should have 2 contacts in the model saved from the last test case
-    QTest::qWait(5000);
-    QCOMPARE(mCntModel->rowCount(), 2);
-}
-
-void TestCntListModel::contact()
-{
-    QList<QContactLocalId> ids = mManager->contactIds();
-    QMap<int, QContactManager::Error> errorMapContact;
-    mManager->removeContacts(ids,&errorMapContact);
-    QTest::qWait(1000);
-    
-    QModelIndex modelIndex = mCntModel->index(0, 0);
-    QContact empty = mCntModel->contact(modelIndex);
-    //QVERIFY(empty.isEmpty());
-    
-    //create and save contact
-    QContact c;
-    QContactName name;
-    name.setFirstName("firstname");
-    name.setLastName("lastname");
-    c.saveDetail(&name);
-    QContactPhoneNumber number;
-    number.setNumber("1234567");
-    number.setContexts(QContactDetail::ContextHome);
-    number.setSubTypes(QContactPhoneNumber::SubTypeMobile);
-    c.saveDetail(&number);
-    QContactEmailAddress email;
-    email.setEmailAddress("dummyemail");
-    c.saveDetail(&email);
-    QVERIFY(mManager->saveContact(&c));
-    QTest::qWait(1000);
-    
-    modelIndex = mCntModel->index(10, 0);
-    c = mCntModel->contact(modelIndex);
-    QVERIFY(c.isEmpty());
-    
-    modelIndex = mCntModel->index(1, 0);
-    c = mCntModel->contact(modelIndex);
-    QVERIFY(!c.isEmpty());
-}
-
-void TestCntListModel::contactId()
-{
-    QModelIndex modelIndex = mCntModel->index(1, 0);
-    QContact c = mCntModel->contact(modelIndex);
-    
-    QVERIFY(mCntModel->contactId(modelIndex) == c.localId());
-}
-
-void TestCntListModel::indexOfContact()
-{
-    QModelIndex modelIndex = mCntModel->index(1, 0);
-    QContact c = mCntModel->contact(modelIndex);
-    
-    QVERIFY(mCntModel->indexOfContact(c) == modelIndex);
-}
-
-void TestCntListModel::indexOfContactId()
-{
-    QModelIndex modelIndex = mCntModel->index(1, 0);
-    QContact c = mCntModel->contact(modelIndex);
-    
-    QVERIFY(mCntModel->indexOfContactId(c.localId()) == modelIndex);
-}
-
-void TestCntListModel::contactManager()
-{
-    QVERIFY(mManager == &(mCntModel->contactManager()));
-}
-
-void TestCntListModel::setFilter()
-{
-    QList<QContactLocalId> ids = mManager->contactIds();
-    QMap<int, QContactManager::Error> errorMap;
-    mManager->removeContacts(ids,&errorMap);
-    QTest::qWait(1000);
-    
-    QContact c;
-    QContactName name;
-    name.setFirstName("firstname");
-    name.setLastName("lastname");
-    c.saveDetail(&name);
-    QVERIFY(mManager->saveContact(&c));
-    
-    QContactUnionFilter unionFilter;
-
-    QContactDetailFilter landlineFilter;
-    landlineFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); 
-    landlineFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeLandline));
-    unionFilter << landlineFilter;
-
-    QContactDetailFilter mobileFilter;
-    mobileFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); 
-    mobileFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeMobile));
-    unionFilter << mobileFilter;
-    
-    mCntModel->setFilter(unionFilter);
-    
-    QModelIndex modelIndex = mCntModel->indexOfContact(c);
-    QVERIFY(modelIndex.row() < 0);
-    QVERIFY(mCntModel->d->m_filter == unionFilter);
-    QVERIFY(mCntModel->d->m_sortOrders.count() == 2);
-}
-
-void TestCntListModel::myCard()
-{
-    delete mCntModel;
-    mCntModel = 0;
-    
-    mCntModel = new CntListModel(mManager);
-    
-    QList<QContactLocalId> ids = mManager->contactIds();
-    QMap<int, QContactManager::Error> errorMap;
-    mManager->removeContacts(ids,&errorMap);
-    QTest::qWait(1000);
-    
-    QContact c;
-    QContactName name;
-    name.setFirstName("firstname");
-    name.setLastName("lastname");
-    c.saveDetail(&name);
-    QVERIFY(mManager->saveContact(&c));
-    
-    QSignalSpy spy(mCntModel, SIGNAL(modelReset()));
-    
-    QVERIFY(mCntModel->myCardStatus());
-    
-    mCntModel->showMyCard(false);
-    QVERIFY(!mCntModel->myCardStatus());
-    QCOMPARE(spy.count(), 2);
-    
-    mCntModel->showMyCard(true);
-    QVERIFY(mCntModel->myCardStatus());
-    QCOMPARE(spy.count(), 4);
-    
-    mManager->setSelfContactId(c.localId());
-    QTest::qWait(1000);
-    spy.clear();
-    
-    mCntModel->showMyCard(false);
-    QVERIFY(!mCntModel->myCardStatus());
-    QCOMPARE(spy.count(), 2);
-    
-    mCntModel->showMyCard(true);
-    QVERIFY(mCntModel->myCardStatus());
-    QCOMPARE(spy.count(), 4);
-    mCntModel->showMyCard(true);
-    QVERIFY(mCntModel->myCardStatus());
-    QCOMPARE(spy.count(), 4);
-}
-
-void TestCntListModel::rowId()
-{
-    QList<QContactLocalId> ids = mManager->contactIds();
-    QMap<int, QContactManager::Error> errorMap;
-    mManager->removeContacts(ids,&errorMap);
-    QTest::qWait(1000);
-    
-    QContact c;
-    QContactName name;
-    name.setFirstName("firstname");
-    name.setLastName("lastname");
-    c.saveDetail(&name);
-    QVERIFY(mManager->saveContact(&c));
-    
-    int row = mCntModel->rowId(c.localId());
-    QVERIFY(row > 0);
-    QVERIFY(mCntModel->validRowId(row));
-    QVERIFY(!mCntModel->validRowId(-100));
-    QVERIFY(!mCntModel->validRowId(100));
-}
-
-void TestCntListModel::dataForDisplayRole()
-{
-    QList<QContactLocalId> ids = mManager->contactIds();
-    QMap<int, QContactManager::Error> errorMap;
-    mManager->removeContacts(ids,&errorMap);
-    QTest::qWait(1000);
-    
-    QContact c;
-    QContactName name;
-    name.setFirstName("firstname");
-    name.setLastName("lastname");
-    c.saveDetail(&name);
-    QVERIFY(mManager->saveContact(&c));
-    
-    int row = mCntModel->rowId(c.localId());
-    QVariant var = mCntModel->dataForRole(row, Qt::DisplayRole);
-    QVERIFY(var.type() == QVariant::StringList);
-    
-    var = mCntModel->dataForRole(0, Qt::DisplayRole);
-    QVERIFY(var.type() == QVariant::StringList);
-}
-
-void TestCntListModel::handleAdded()
-{
-    QList<QContactLocalId> ids = mManager->contactIds();
-    QMap<int, QContactManager::Error> errorMap;
-    mManager->removeContacts(ids,&errorMap);
-    QTest::qWait(1000);
-
-    QSignalSpy spy(mCntModel, SIGNAL(rowsAboutToBeInserted(const QModelIndex&, int, int)));
-    
-    QContact c;
-    QContactName name;
-    name.setFirstName("firstname");
-    name.setLastName("lastname");
-    c.saveDetail(&name);
-    QVERIFY(mManager->saveContact(&c));
-
-    QCOMPARE(spy.count(), 1);
-    
-    QList<QContactLocalId> emptyList;
-    mCntModel->handleAdded(emptyList);
-    QCOMPARE(spy.count(), 1);
-}
-
-void TestCntListModel::handleChanged()
-{
-    QList<QContactLocalId> ids = mManager->contactIds();
-    QMap<int, QContactManager::Error> errorMap;
-    mManager->removeContacts(ids,&errorMap);
-    QTest::qWait(1000);
-    
-    QContact c;
-    QContactName name;
-    name.setFirstName("firstname");
-    name.setLastName("lastname");
-    c.saveDetail(&name);
-    QVERIFY(mManager->saveContact(&c));
-    
-    QSignalSpy spy(mCntModel, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex&)));
-
-    name.setMiddleName("mid");
-    c.saveDetail(&name);
-    QVERIFY(mManager->saveContact(&c));
-
-    QCOMPARE(spy.count(), 1);
-    
-    QList<QContactLocalId> emptyList;
-    mCntModel->handleChanged(emptyList);
-    QCOMPARE(spy.count(), 1);
-}
-
-void TestCntListModel::handleRemoved()
-{
-    QSignalSpy spy(mCntModel, SIGNAL(rowsAboutToBeRemoved(const QModelIndex&, int, int)));
-    
-    QList<QContactLocalId> ids = mManager->contactIds();
-    QMap<int, QContactManager::Error> errorMap;
-    mManager->removeContacts(ids,&errorMap);
-    QTest::qWait(1000);
-    
-    QCOMPARE(spy.count(), 1);
-    
-    QList<QContactLocalId> emptyList;
-    mCntModel->handleRemoved(emptyList);
-    QCOMPARE(spy.count(), 1);
-}
-
-void TestCntListModel::handleMyCardChanged()
-{
-    QList<QContactLocalId> ids = mManager->contactIds();
-    QMap<int, QContactManager::Error> errorMap;
-    mManager->removeContacts(ids,&errorMap);
-    QTest::qWait(1000);
-    
-    QContact c;
-    QContactName name;
-    name.setFirstName("firstname");
-    name.setLastName("lastname");
-    c.saveDetail(&name);
-    QVERIFY(mManager->saveContact(&c));
-    
-    mCntModel->handleMyCardChanged(0, c.localId());
-    QVERIFY(mCntModel->d->m_myCardId == c.localId());
-}
-
-void TestCntListModel::handleRelationships()
-{
-    // remove all contacts
-    QList<QContactLocalId> ids = mManager->contactIds();
-    QMap<int, QContactManager::Error> errorMap;
-    mManager->removeContacts(ids,&errorMap);
-    QTest::qWait(1000);
-
-    // create group "myGroup"
-    QContact group;
-    group.setType(QContactType::TypeGroup);
-    QContactName groupName;
-    groupName.setCustomLabel("myGroup");
-    group.saveDetail(&groupName);
-    mManager->saveContact(&group);
-
-    // create a relationship filter
-    QContactRelationshipFilter groupFilter;
-    groupFilter.setRelationshipType(QContactRelationship::HasMember);
-    groupFilter.setRelatedContactRole(QContactRelationship::First);
-    groupFilter.setRelatedContactId(group.id()); 
-
-    // create new listmodel
-    CntListModel* groupListModel = new CntListModel(mManager, groupFilter, false);
-    QVERIFY(groupListModel != NULL);
-
-    QCOMPARE(groupListModel->rowCount(), 0);
-
-    // create contacts
-    QList<QContact> contacts;
-    contacts << createContact("Alfa", "One");
-    contacts << createContact("Beta", "Two");
-    contacts << createContact("Gamma", "Three");
-    QTest::qWait(1000);
-    QCOMPARE(groupListModel->rowCount(), 0);
-
-    // add contacts to group
-    foreach (QContact contact, contacts) {
-        addGroupMember(group, contact);
-    }
-    QTest::qWait(1000);
-    QCOMPARE(groupListModel->rowCount(), 3);
-
-    // remove contact from group
-    removeGroupMember(group, contacts.at(1));
-    QTest::qWait(1000);
-    QCOMPARE(groupListModel->rowCount(), 2);
-
-    // add and remove empty list
-    QList<QContactLocalId> emptyList;
-    emptyList << group.localId();
-    mCntModel->handleAddedRelationship(emptyList);
-    QCOMPARE(groupListModel->rowCount(), 2);
-    mCntModel->handleRemovedRelationship(emptyList);
-    QCOMPARE(groupListModel->rowCount(), 2);
-
-    // verify that contact on second row is "Gamma Three" (comes after "Alfa One"
-    // regardless of sorting type and Beta Two was removed)
-    QVERIFY(groupListModel->indexOfContact(contacts.at(0)).row() == 0);
-    QVERIFY(groupListModel->indexOfContact(contacts.at(1)).row() == -1);
-    QVERIFY(groupListModel->indexOfContact(contacts.at(2)).row() == 1);
-
-    // create a contact and make sure list model count does not change
-    createContact("Delta", "Four");
-    QTest::qWait(1000);
-    QCOMPARE(groupListModel->rowCount(), 2);
-    
-    delete groupListModel;
-}
-
-QContact TestCntListModel::createContact(const QString& firstName, const QString& lastName)
-{
-    QContact contact;
-    QContactName name;
-    name.setFirstName(firstName);
-    name.setLastName(lastName);
-    contact.saveDetail(&name);
-    mManager->saveContact(&contact);
-
-    return contact;
-}
-
-void TestCntListModel::addGroupMember(const QContact& group, const QContact& contact)
-{
-    QContactRelationship relationship;
-    relationship.setRelationshipType(QContactRelationship::HasMember);
-    relationship.setFirst(group.id());
-    relationship.setSecond(contact.id());
-    mManager->saveRelationship(&relationship);
-}
-
-void TestCntListModel::removeGroupMember(const QContact& group, const QContact& contact)
-{
-    QContactRelationship relationship;
-    relationship.setRelationshipType(QContactRelationship::HasMember);
-    relationship.setFirst(group.id());
-    relationship.setSecond(contact.id());
-    mManager->removeRelationship(relationship);
-}
-
-void TestCntListModel::cleanupTestCase()
-{
-    mCntModel->d->m_cache->onShutdown();
-    delete mCntModel;
-    mCntModel = 0;
-    
-    //let's have clean database after running tests
-    QList<QContactLocalId> ids = mManager->contactIds();
-    QMap<int, QContactManager::Error> errorMap;
-    mManager->removeContacts(ids, &errorMap);
-    delete mManager;
-    mManager = 0;
-    delete mModelListener;
-    mModelListener = 0;
-}
-
-
-ModelListener::ModelListener(TestCntListModel* parent)
-    : mParent(parent)
-{
-    connect(mParent->mCntModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(onDataChanged(QModelIndex,QModelIndex)));
-}
-
-void ModelListener::onDataChanged(QModelIndex start, QModelIndex end)
-{
-    mParent->contactReady(start.row(), end.row());
-}
-
--- a/phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/src/ut_cntpresenceinfoprovider.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,190 +0,0 @@
-/*
-* 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 "ut_cntpresenceinfoprovider.h"
-#include "cntpresenceinfoprovider.h"
-
-#include <prcpresencebuddyinfo_qt.h>
-#include <prcpresencereader_qt.h>
-#include <prcpresencewriter_qt.h>
-
-void TestCntPresenceInfoProvider::initTestCase()
-{
-    mCntPresenceInfoProvider = NULL;
-}
-
-void TestCntPresenceInfoProvider::create()
-{
-    mCntPresenceInfoProvider = new CntPresenceInfoProvider();
-}
-
-void TestCntPresenceInfoProvider::testSupportedFields()
-{
-    QVERIFY(mCntPresenceInfoProvider->supportedFields() == ContactInfoIcon2Field);
-}
-
-void TestCntPresenceInfoProvider::testRequestInfo()
-{
-    PrcPresenceWriter *writer = PrcPresenceWriter::createWriter();
-    
-    PrcPresenceBuddyInfoQt *buddy = PrcPresenceBuddyInfoQt::createInstance();
-    buddy->setIdentity("sip:test@test.com");
-    buddy->setAvailability(PrcPresenceBuddyInfoQt::PrcNotAvailable, "meh");
-    writer->writePresence(*buddy);
-    
-    QContactManager manager("symbian");
-    
-    QContact c;
-    QContactName name;
-    name.setFirstName("firstname");
-    name.setLastName("lastname");
-    c.saveDetail(&name);
-    QContactPhoneNumber number;
-    number.setNumber("1234567");
-    number.setContexts(QContactDetail::ContextHome);
-    number.setSubTypes(QContactPhoneNumber::SubTypeMobile);
-    c.saveDetail(&number);
-    manager.saveContact(&c);
-    
-    ContactInfoFields fields;
-    fields = ContactInfoTextField;
-    
-    QSignalSpy spy(mCntPresenceInfoProvider, SIGNAL(infoFieldReady(CntInfoProvider*, int, ContactInfoField, const QString&)));
-    
-    mCntPresenceInfoProvider->requestInfo(c, fields);
-    QCOMPARE(spy.count(), 0);
-    QVERIFY(mCntPresenceInfoProvider->mBuddyMap.isEmpty());
-    
-    fields = ContactInfoIcon2Field;
-    
-    mCntPresenceInfoProvider->requestInfo(c, fields);
-    QCOMPARE(spy.count(), 0);
-    QVERIFY(mCntPresenceInfoProvider->mBuddyMap.isEmpty());
-    
-    QContactOnlineAccount account;
-    account.setSubTypes(QStringList() << QContactOnlineAccount::SubTypeSip);
-    account.setServiceProvider("sip");
-    account.setAccountUri("test@test.com");
-    c.saveDetail(&account);
-    QContactOnlineAccount account2;
-    account2.setSubTypes(QStringList() << QContactOnlineAccount::SubTypeSipVoip);
-    account.setServiceProvider("sip");
-    account2.setAccountUri("test@test.com");
-    c.saveDetail(&account2);
-    QContactOnlineAccount account3;
-    account3.setSubTypes(QStringList() << QContactOnlineAccount::SubTypeSip);
-    account3.setAccountUri("malformatted");
-    c.saveDetail(&account3);
-    manager.saveContact(&c);
-    
-    mCntPresenceInfoProvider->requestInfo(c, fields);
-    QCOMPARE(spy.count(), 0);
-    QCOMPARE(mCntPresenceInfoProvider->mBuddyMap.count(), 1);
-    
-    delete mCntPresenceInfoProvider;
-    mCntPresenceInfoProvider = NULL;
-    
-    buddy->setAvailability(PrcPresenceBuddyInfoQt::PrcAvailable, "meh");
-    writer->writePresence(*buddy);
-    
-    mCntPresenceInfoProvider = new CntPresenceInfoProvider();
-    
-    QSignalSpy spy2(mCntPresenceInfoProvider, SIGNAL(infoFieldReady(CntInfoProvider*, int, ContactInfoField, const QString&)));
-    mCntPresenceInfoProvider->requestInfo(c, fields);
-    QCOMPARE(spy2.count(), 1);
-    QCOMPARE(mCntPresenceInfoProvider->mBuddyMap.count(), 1);
-    
-    delete buddy;
-    delete writer;
-}
-
-void TestCntPresenceInfoProvider::testHandlePresenceUpdate()
-{
-    QSignalSpy spy(mCntPresenceInfoProvider, SIGNAL(infoFieldReady(CntInfoProvider*, int, ContactInfoField, const QString&)));
-    
-    PrcPresenceWriter *writer = PrcPresenceWriter::createWriter();
-    PrcPresenceReader *reader = PrcPresenceReader::createReader();
-    
-    PrcPresenceBuddyInfoQt *dummyBuddy = PrcPresenceBuddyInfoQt::createInstance();
-    dummyBuddy->setIdentity("sip:dummy@dummy.com");
-    dummyBuddy->setAvailability(PrcPresenceBuddyInfoQt::PrcAvailable, "meh");
-    writer->writePresence(*dummyBuddy);
-    
-    mCntPresenceInfoProvider->handlePresenceUpdate(true, dummyBuddy);
-    QCOMPARE(spy.count(), 0);
-
-    mCntPresenceInfoProvider->handlePresenceUpdate(false, dummyBuddy);
-    QCOMPARE(spy.count(), 0);
-
-    mCntPresenceInfoProvider->handlePresenceUpdate(true, NULL);
-    QCOMPARE(spy.count(), 0);
-    
-    PrcPresenceBuddyInfoQt *buddy = reader->presenceInfo("sip:test@test.com");
-    buddy->setAvailability(PrcPresenceBuddyInfoQt::PrcNotAvailable, "meh");
-    writer->writePresence(*buddy);
-    QTest::qWait(5000);
-    QCOMPARE(spy.count(), 1);
-    
-    QContactManager manager("symbian");
-    QContact c = manager.contact(mCntPresenceInfoProvider->mBuddyMap.value("sip:test@test.com"));
-    
-    QList<QContactOnlineAccount> accounts = c.details<QContactOnlineAccount>();
-    foreach (QContactOnlineAccount account, accounts)
-    {
-        c.removeDetail(&account);
-    }
-    manager.saveContact(&c);
-    
-    buddy->setAvailability(PrcPresenceBuddyInfoQt::PrcAvailable, "meh");
-    writer->writePresence(*buddy);
-    QTest::qWait(5000);
-    QCOMPARE(spy.count(), 2);
-    
-    delete writer;
-    delete reader;
-    delete dummyBuddy;
-    delete buddy;
-}
-
-void TestCntPresenceInfoProvider::testParsePresence()
-{
-    PrcPresenceBuddyInfoQt *buddy = PrcPresenceBuddyInfoQt::createInstance();
-    buddy->setAvailability(PrcPresenceBuddyInfoQt::PrcNotAvailable, "meh");
-
-    QList<PrcPresenceBuddyInfoQt*> buddies;
-    buddies.append(buddy);
-
-    QVERIFY(mCntPresenceInfoProvider->parsePresence(buddies).isEmpty());
-
-    buddy->setAvailability(PrcPresenceBuddyInfoQt::PrcAvailable, "meh");
-
-    QVERIFY(mCntPresenceInfoProvider->parsePresence(buddies) == "qtg_small_online");
-    
-    delete buddy;
-}
-
-void TestCntPresenceInfoProvider::cleanupTestCase()
-{
-    delete mCntPresenceInfoProvider;
-    mCntPresenceInfoProvider = NULL;
-    
-    QContactManager manager("symbian");
-    QList<QContactLocalId> ids = manager.contactIds();
-    QMap<int, QContactManager::Error> errorMap;
-    manager.removeContacts(ids, &errorMap);
-}
-
--- a/phonebookengines/cntlistmodel/tsrc/ut_cntlistmodel/ut_cntlistmodel.pro	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-#                                                                    
-# 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:                                                        
-#                                                                     
-#
-
-
-TEMPLATE = app
-TARGET =
-
-DEFINES += QT_NO_DEBUG_OUTPUT
-DEFINES += QT_NO_WARNING_OUTPUT
-DEFINES += CNTLISTMODEL_NO_EXPORT
-    
-MOC_DIR = moc
-
-QT += testlib xml
-
-CONFIG += hb
-
-TARGET.CAPABILITY = ALL \
-    -TCB
-
-INCLUDEPATH += .
-INCLUDEPATH += ../../inc
-INCLUDEPATH += ../../../../inc
-INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
-    
-HEADERS += inc/testrunner.h \
-           inc/ut_cntlistmodel.h \
-           inc/ut_cntcache.h \
-           inc/ut_cntpresenceinfoprovider.h \
-           inc/ut_cntdefaultinfoprovider.h \
-           inc/ut_cntdisplaytextformatter.h \
-           ../../inc/cntlistmodelglobal.h \
-           ../../inc/cntlistmodel.h \
-           ../../inc/cntlistmodel_p.h \
-           ../../inc/cntcache.h \
-           ../../inc/cntcache_p.h \
-           ../../inc/cntdefaultinfoprovider.h \
-           ../../inc/cntpresenceinfoprovider.h \
-           ../../inc/cntdisplaytextformatter.h \
-           ../../../../inc/cntdebug.h
-
-SOURCES += src/testrunner.cpp \
-           src/main.cpp \
-           src/ut_cntlistmodel.cpp \
-           src/ut_cntcache.cpp \
-           src/ut_cntpresenceinfoprovider.cpp \
-           src/ut_cntdefaultinfoprovider.cpp \
-           src/ut_cntdisplaytextformatter.cpp \
-           ../../src/cntlistmodel.cpp \
-           ../../src/cntcache.cpp \
-           ../../src/cntcache_p.cpp \
-           ../../src/cntdefaultinfoprovider.cpp \
-           ../../src/cntpresenceinfoprovider.cpp \
-           ../../src/cntdisplaytextformatter.cpp
-
-BLD_INF_RULES.prj_exports += "image1.png /epoc32/winscw/c/data/images/"
-BLD_INF_RULES.prj_exports += "image2.png /epoc32/winscw/c/data/images/"
-    
-LIBS += -lQtContacts \
-        -lhbcore \
-        -lthumbnailmanagerqt \
-        -lpresencecacheqt \
-        -lxqsettingsmanager
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/cntsimutility/tsrc/ut_cntsimutility/start.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,59 @@
+/*
+* Copyright (c) 2007, 2008 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:  Implementation for presence cache reader and writer.
+*
+*/
+#include "ut_cntsimutility.h"
+#include <qtest.h>
+#include <stdio.h>
+
+#include <qdebug.h>
+#include <qfile.h>
+
+#define LOG_TO_FILE
+//QTEST_MAIN(TestOfTest);
+int main(int argc, char *argv[])
+{
+#ifdef LOG_TO_FILE
+    
+    bool promptOnExit(0);
+    for (int i=0; i<argc; i++) {
+        if (QString(argv[i]) == "-noprompt")
+            promptOnExit = false;
+    }
+    printf("Running tests...\n");
+    QApplication app(argc, argv);
+
+    QString entityTestsFileName = "c:/testsimutility_qt.xml";
+   
+    QStringList args( "ut_cntsimutility");
+    args << "-xml" << "-o" << entityTestsFileName;
+    TestCntSimUtility simtests;
+    QTest::qExec(&simtests, args);
+
+    if (promptOnExit) {
+        printf("Press any key...\n");
+        getchar();
+     
+    }
+#else
+    QApplication app(argc, argv);
+    TestCntSimUtility simtests;
+    QStringList args( "ut_cntsimutility.exe");
+    QTest::qExec(&simtests, args);
+
+
+#endif   
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/cntsimutility/tsrc/ut_cntsimutility/ut_cntsimutility.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,263 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt Mobility Components.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+#include <QObject>
+#include <qdebug.h>
+#include <qtcontacts.h>
+
+#ifdef SYMBIANSIM_BACKEND_USE_ETEL_TESTSERVER
+#include <etelmm_etel_test_server.h>
+#else
+#include <etelmm.h>
+#endif
+#include <mmtsy_names.h>
+#include "ut_cntsimutility.h"
+#include "cntsimutility.h"
+
+bool  TestCntSimUtility::returnErrorInStub_1 = false;
+bool  TestCntSimUtility::returnErrorInStub_2 = false;
+
+
+TestCntSimUtility::TestCntSimUtility() :
+m_SimStore(0)
+{
+
+}
+
+TestCntSimUtility::~TestCntSimUtility()
+{
+
+}
+
+void TestCntSimUtility::initTestCase()
+{
+
+    int error = KErrNone;
+    
+    // remove all contacts  
+}
+
+void TestCntSimUtility::cleanupTestCase()
+{
+
+    delete m_SimStore;
+    m_SimStore = 0;
+}
+
+void TestCntSimUtility::TestStoreCreation()
+{
+    
+}
+
+void TestCntSimUtility::TestGetSimInfo()
+{
+    // ok case
+    TestCntSimUtility::returnErrorInStub_1 = false;
+    int error = KErrNotSupported;
+    m_SimStore = new CntSimUtility(CntSimUtility::AdnStore, error);
+    error = KErrNotSupported;
+    CntSimUtility::SimInfo simInformation_adn = m_SimStore->getSimInfo(error);
+    QVERIFY(KErrNone == error);
+    outputSimInfo(simInformation_adn);
+    
+    // error case
+    TestCntSimUtility::returnErrorInStub_1 = true;
+    simInformation_adn = m_SimStore->getSimInfo(error);
+    QVERIFY(KErrNone == KErrGeneral);
+        
+       
+}
+void TestCntSimUtility::outputSimInfo(CntSimUtility::SimInfo &results)
+    {
+    return;
+    qDebug()<< "SIMUTILITY:Totalentries = "<< results.totalEntries; 
+    qDebug()<< "SIMUTILITY:usedEntries = "<< results.usedEntries ;
+    qDebug()<< "SIMUTILITY:maxNumLength = "<<        results.maxNumLength;
+    qDebug()<< "SIMUTILITY:maxTextLength = "<<        results.maxTextLength;
+    qDebug()<< "SIMUTILITY:maxSecondNames = "<<        results.maxSecondNames;
+    qDebug()<< "SIMUTILITY:maxTextLengthSecondName = "<<        results.maxTextLengthSecondName ;
+    qDebug()<< "SIMUTILITY:maxAdditionalNumbers = "<<        results.maxAdditionalNumbers ;
+    qDebug()<< "SIMUTILITY:maxNumLengthAdditionalNumber = "<<        results.maxNumLengthAdditionalNumber;
+    qDebug()<< "SIMUTILITY:maxTextLengthAdditionalNumber = "<<        results.maxTextLengthAdditionalNumber;
+    qDebug()<< "SIMUTILITY:maxGroupNames = "<<        results.maxGroupNames ;
+    qDebug()<< "SIMUTILITY:maxTextLengthGroupName = "<<results.maxTextLengthGroupName ;
+    qDebug()<< "SIMUTILITY:maxEmailAddr = "<<results.maxEmailAddr ;
+    qDebug()<< "SIMUTILITY:maxTextLengthEmailAddr = "<<results.maxTextLengthEmailAddr;
+            
+            
+      
+    }
+
+void TestCntSimUtility::TestGetAvailableStores()
+    {
+    TestCntSimUtility::returnErrorInStub_1 = false;
+    int error1 = KErrNotSupported;
+    CntSimUtility::AvailableStores avalStores1 = m_SimStore->getAvailableStores(error1);
+    
+    
+    TestCntSimUtility::returnErrorInStub_1 = true;
+    int error2 = KErrNotSupported;
+    CntSimUtility::AvailableStores avalStores2 = m_SimStore->getAvailableStores(error2);
+    
+    QVERIFY(error1 == KErrNone);
+    QVERIFY(true == avalStores1.AdnStorePresent);
+    QVERIFY(false == avalStores1.SdnStorePresent);
+    QVERIFY(true == avalStores1.FdnStorePresent);
+    QVERIFY(false == avalStores1.OnStorePresent);
+    QVERIFY(avalStores1.SimPresent == true);
+
+    QVERIFY(error2 == KErrNone);
+    QVERIFY(false == avalStores2.AdnStorePresent);
+    QVERIFY(false == avalStores2.SdnStorePresent);
+    QVERIFY(false == avalStores2.FdnStorePresent);
+    QVERIFY(false == avalStores2.OnStorePresent);
+    QVERIFY(false == avalStores2.SimPresent);
+    
+    }
+void TestCntSimUtility::TestVerifyPin2Code()
+    {
+    TestCntSimUtility::returnErrorInStub_1 = false;
+    bool ret = m_SimStore->verifyPin2Code();
+    QVERIFY(true == ret);
+    
+    }
+void TestCntSimUtility::TestIsFdnActive()
+    {
+    TestCntSimUtility::returnErrorInStub_1 = false;
+    bool isFdnActive = m_SimStore->isFdnActive();
+    QVERIFY(isFdnActive == true);
+   
+    //check error case
+   TestCntSimUtility::returnErrorInStub_1 = true;
+   isFdnActive = m_SimStore->isFdnActive();
+   QVERIFY(isFdnActive == false);
+    
+    }
+void TestCntSimUtility::TestSetFdnStatus()
+    {
+    TestCntSimUtility::returnErrorInStub_1 = false;
+    bool fdnActive = m_SimStore->isFdnActive();
+    int err = m_SimStore->setFdnStatus(true);
+    QVERIFY(err == KErrNone);         
+    //error case
+    TestCntSimUtility::returnErrorInStub_1 = true;
+    err = m_SimStore->setFdnStatus(true);
+    QVERIFY(err == KErrGeneral);
+        
+    }
+void TestCntSimUtility::TestGetLastImportTime()
+    {
+    TestCntSimUtility::returnErrorInStub_1 = false;
+    int error1 = KErrNotSupported;
+    QDateTime datetime1 = m_SimStore->getLastImportTime(error1);
+    
+    TestCntSimUtility::returnErrorInStub_1 = true;
+    int error2 = KErrNotSupported;
+    QDateTime datetime = m_SimStore->getLastImportTime(error2);
+    
+    QVERIFY(KErrNone == error1);
+           
+    QVERIFY(KErrAccessDenied == error2);
+    
+    
+          
+    }
+
+void TestCntSimUtility::TestSetLastImportTime()
+    {
+    
+    TestCntSimUtility::returnErrorInStub_1 = false;
+    int error1 = KErrNotSupported;
+    m_SimStore->setLastImportTime(error1);
+    TestCntSimUtility::returnErrorInStub_1 = false;
+    int error2 = KErrNotSupported;
+    m_SimStore->setLastImportTime(error2);
+
+    
+    QVERIFY(KErrNone == error1);   
+    QVERIFY(KErrAccessDenied == error2);   
+        
+    }
+
+
+void TestCntSimUtility::TestStartGetSimInfo()
+    {
+    connect(m_SimStore, SIGNAL(simInfoReady(CntSimUtility::SimInfo& simInfo, int error)), this, SLOT(simInfoReady(CntSimUtility::SimInfo& simInfo, int error)));
+    bool ret = m_SimStore->startGetSimInfo();
+    QVERIFY(true == ret);
+    }
+
+void TestCntSimUtility::TestStartGetAvailableStores()
+    {
+    connect(m_SimStore, SIGNAL(availableStoresReady(CntSimUtility::AvailableStores& availableStores, int error)), this, SLOT(availableStoresReady(CntSimUtility::AvailableStores& availableStores, int error)));
+    bool ret = m_SimStore->startGetAvailableStores();
+    QVERIFY(true == ret);
+    }
+
+void TestCntSimUtility::TestNotifyAdnCacheStatus()
+    {
+    connect(m_SimStore, SIGNAL(adnCacheStatusReady(CntSimUtility::CacheStatus&, int)), this, SLOT(getSimInfoAndUpdateUI(CntSimUtility::CacheStatus&, int)));
+    bool ret = m_SimStore->notifyAdnCacheStatus();  
+    QVERIFY(true == ret);
+    }
+
+    
+void TestCntSimUtility::adnCacheStatusReady(CntSimUtility::CacheStatus& cacheStatus, int error)
+    {
+        
+    QVERIFY(cacheStatus == RMmCustomAPI::ECacheReady);
+    QVERIFY(KErrNone == error);
+    
+     }
+     
+void TestCntSimUtility::simInfoReady(CntSimUtility::SimInfo& simInfo, int error)
+    {
+    QVERIFY(KErrNone == error);
+        
+     }
+     
+void TestCntSimUtility::availableStoresReady(CntSimUtility::AvailableStores& availableStores, int error)
+    {
+    QVERIFY(KErrNone == error);
+        
+     }
+     
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/cntsimutility/tsrc/ut_cntsimutility/ut_cntsimutility.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,131 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt Mobility Components.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef _UT_SIM_UTILITY_H_
+#define _UT_SIM_UTILITY_H_
+#include <QtTest/QtTest>
+#include <QObject>
+
+#include <qtcontacts.h>
+
+#ifdef SYMBIANSIM_BACKEND_USE_ETEL_TESTSERVER
+#include <etelmm_etel_test_server.h>
+#else
+#include <etelmm.h>
+#endif
+#include <mmtsy_names.h>
+#include "cntsimutility.h"
+QTM_USE_NAMESPACE
+
+
+#ifndef QTRY_COMPARE
+#define QTRY_COMPARE(__expr, __expected) \
+    do { \
+        const int __step = 50; \
+        const int __timeout = 5000; \
+        if ((__expr) != (__expected)) { \
+            QTest::qWait(0); \
+        } \
+        for (int __i = 0; __i < __timeout && ((__expr) != (__expected)); __i+=__step) { \
+            QTest::qWait(__step); \
+        } \
+        QCOMPARE(__expr, __expected); \
+    } while(0)
+#endif
+
+//TESTED_CLASS=
+//TESTED_FILES=
+
+/*!
+*/
+class TestCntSimUtility : public QObject
+{
+Q_OBJECT
+
+public:
+    TestCntSimUtility();
+    virtual ~TestCntSimUtility();
+public:
+   static bool returnErrorInStub_1;
+   static bool returnErrorInStub_2;
+public slots:
+    void adnCacheStatusReady(CntSimUtility::CacheStatus& cacheStatus, int error);
+    void simInfoReady(CntSimUtility::SimInfo& simInfo, int error);
+    void availableStoresReady(CntSimUtility::AvailableStores& availableStores, int error);
+
+
+private slots:
+   void initTestCase();
+   void cleanupTestCase();
+   void TestStoreCreation();
+   void TestGetSimInfo();
+   void TestGetAvailableStores();
+   void TestVerifyPin2Code();
+   void TestIsFdnActive();
+   void TestSetFdnStatus();
+   void TestGetLastImportTime();
+   void TestSetLastImportTime();
+   //Async
+   //async request
+   void TestStartGetSimInfo();
+   void TestStartGetAvailableStores();
+   void TestNotifyAdnCacheStatus();
+private:
+   void initManager(QString simStore);
+   void outputSimInfo(CntSimUtility::SimInfo &results);
+private:
+    CntSimUtility* m_SimStore;
+
+    bool mAdnStorePresent;
+    bool mSdnStorePresent;
+    bool mSimPresent;
+    int mAdnStoreEntries;
+    int mSdnStoreEntries;
+    bool mSimError;
+    bool mWaitingForAdnCache;
+    bool mImportInProgress;
+    bool mAdnEntriesPresent;
+
+
+
+};
+
+#endif //_UT_SIM_UTILITY_H_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/cntsimutility/tsrc/ut_cntsimutility/ut_cntsimutility.pro	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,28 @@
+TEMPLATE=app
+TARGET=ut_cntsimutility
+QT += testlib 
+
+
+CONFIG += mobility
+
+DEFINES += SIMUTILITY_NO_EXPORT
+
+symbian: {
+    TARGET.CAPABILITY =  CAP_APPLICATION NetworkControl
+    load(data_caging_paths)
+    INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
+    SOURCES  += ut_cntsimutility.cpp \
+                ../../src/cntsimutility.cpp \
+                ../../src/asyncworker.cpp \
+                start.cpp \
+                ut_mock_implementations.cpp
+    HEADERS +=  ../../inc/cntsimutility.h \
+                ../../inc/simutilityglobal.h \
+                ../../inc/asyncworker.h \
+                ut_cntsimutility.h 
+                
+    TARGET.CAPABILITY = ReadUserData \
+                        WriteUserData
+    
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/cntsimutility/tsrc/ut_cntsimutility/ut_mock_implementations.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,565 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt Mobility Components.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+#include <QObject>
+#include <qdebug.h>
+#include <qtcontacts.h>
+
+#include <mmtsy_names.h>
+#include "ut_cntsimutility.h"
+#include "cntsimutility.h"
+ #include "centralrepository.h"
+#include <etelmm.h>
+#include <secui.h>
+#include <simutils.h>
+#include <e32property.h>
+RTelServer::RTelServer(  )
+    {
+    
+    }
+TInt RTelServer::Connect( 
+        TInt aMessageSlots )
+    {
+    if(true == TestCntSimUtility::returnErrorInStub_1)
+        {
+        return KErrGeneral;
+        }
+    return KErrNone;
+    }
+
+
+TInt RTelServer::EnumeratePhones( 
+        TInt & aNoOfPhones ) const
+    {
+
+    }
+
+TInt RTelServer::GetPhoneInfo( 
+        const TInt aIndex,
+        TPhoneInfo & aInfo ) const
+    {
+
+    if(true == TestCntSimUtility::returnErrorInStub_1)
+        {
+        return KErrGeneral;
+        }
+    return KErrNone;
+    }
+
+
+TInt RTelServer::GetTsyName( 
+        const TInt aIndexOfPhone,
+        TDes & aTsyName ) const
+    {
+    }
+
+
+
+TInt RTelServer::LoadPhoneModule( 
+        const TDesC & aFileName ) const
+    {
+
+    if(true == TestCntSimUtility::returnErrorInStub_1)
+        {
+        return KErrGeneral;
+        }
+    return KErrNone;
+    }
+
+
+TInt RTelServer::UnloadPhoneModule( 
+        const TDesC & aFileName ) const
+    {
+    }
+
+
+TInt RTelServer::IsSupportedByModule( 
+        const TDesC & aTsyName,
+        const TInt aMixin,
+        TBool & aResult ) const
+    {
+    
+    }
+
+
+TInt RTelServer::GetTsyVersionNumber( 
+        const TDesC & aTsyName,
+        TVersion & aVersion ) const
+    {
+    
+    }
+
+
+
+TInt RTelServer::SetPriorityClient(  ) const
+    {
+    
+    }
+
+
+TInt RTelServer::SetExtendedErrorGranularity( 
+        const TErrorGranularity aGranularity ) const
+    {
+   
+    }
+TInt RTelServer::__DbgMarkHeap(  )
+    {
+  
+    }
+
+TInt RTelServer::__DbgCheckHeap( 
+        TInt aCount )
+    {
+    
+    }
+
+TInt RTelServer::__DbgMarkEnd( 
+        TInt aCount )
+    {
+    
+    }
+TInt RTelServer::__DbgFailNext( 
+        TInt aCount )
+    {
+    
+    }
+TInt RTelServer::__DbgFailNextAvailable( 
+        TBool & aResult )
+    {
+    
+    }
+TInt RTelServer::SetPriorityClientV2(  ) const
+    {
+    
+    }
+RMobilePhone::RMobilePhone()
+    {
+    
+    
+    }
+TInt RMobilePhone::GetMultimodeCaps( 
+        TUint32 & aCaps ) const
+    {
+   
+    }
+void RMobilePhone::SetFdnSetting(TRequestStatus& aReqStatus, TMobilePhoneFdnSetting aFdnSetting) const
+    {
+        TRequestStatus* req = & aReqStatus;
+        if(true == TestCntSimUtility::returnErrorInStub_1)
+            {
+            User::RequestComplete(req, KErrGeneral);
+            }
+        else
+            {
+            User::RequestComplete(req, KErrNone);    
+            }
+        
+
+    
+    }
+void RMobilePhone::NotifyFdnStatusChange(TRequestStatus& aReqStatus, TMobilePhoneFdnStatus& aFdnStatus) const
+    {
+    
+    }
+
+TInt RMobilePhone::GetCurrentMode( 
+        TMobilePhoneNetworkMode & aNetworkMode ) const
+    {
+   
+    }
+
+
+TInt RMobilePhone::GetIccAccessCaps(TUint32 &acaps) const
+    {
+    if(true == TestCntSimUtility::returnErrorInStub_2)
+           {
+        return  KErrGeneral;
+           }
+    acaps = RMobilePhone::KCapsUSimAccessSupported;
+    return  KErrNone;
+    }
+void RMobilePhone::GetServiceTable(TRequestStatus& aReqStatus, TMobilePhoneServiceTable aTable, TDes8& aTableData) const
+    {
+
+    TRequestStatus* req = &aReqStatus;
+    if(true == TestCntSimUtility::returnErrorInStub_1)
+        {
+        User::RequestComplete(req, KErrGeneral);
+        }
+    else
+        {
+        User::RequestComplete(req, KErrNone);    
+        }
+
+    }
+TInt RMobilePhone::GetFdnStatus(TMobilePhoneFdnStatus& aFdnStatus) const
+{
+    if(false == TestCntSimUtility::returnErrorInStub_1)
+        {
+        aFdnStatus = RMobilePhone::EFdnActive ;
+        return KErrNone;
+    
+        }
+
+    aFdnStatus = RMobilePhone::EFdnNotActive ;
+    return KErrGeneral;
+}
+void RMobilePhone::GetFdnStatus(TRequestStatus& aReqStatus, TMobilePhoneFdnStatus& aFdnStatus) const
+{
+
+}
+
+void RMobilePhone::GetSignalStrength( 
+        TRequestStatus & aReqStatus,
+        TInt32 & aSignalStrength,
+        TInt8 & aBar ) const
+    {
+   
+    }
+
+
+void RMobilePhone::NotifySignalStrengthChange( 
+        TRequestStatus & aReqStatus,
+        TInt32 & aSignalStrength,
+        TInt8 & aBar ) const
+    {
+    }
+void RMobilePhone::GetSubscriberId(TRequestStatus& aReqStatus, TMobilePhoneSubscriberId& aId) const
+    {
+
+    TRequestStatus* req = & aReqStatus;
+    if(true == TestCntSimUtility::returnErrorInStub_1)
+        {
+        User::RequestComplete(req, KErrGeneral);
+        }
+    else
+        {
+        User::RequestComplete(req, KErrNone);    
+        }
+
+    }
+void RMobilePhone::ConstructL()
+    {
+    
+    }
+void RMobilePhone::Destruct()
+    {
+    
+    }
+
+RMobilePhoneBookStore::RMobilePhoneBookStore ()
+    {
+    
+    }
+
+void RMobilePhoneBookStore::Close ()
+    {
+    
+    }
+
+RMobilePhoneBookStore::TMobilePhoneBookInfoV5::TMobilePhoneBookInfoV5()
+    {
+    
+    }
+RMobilePhone::TMobilePhoneServiceTableV1::TMobilePhoneServiceTableV1()
+    {
+    
+    }
+RMmCustomAPI::RMmCustomAPI()
+    {
+    
+    }
+CSecuritySettings::CSecuritySettings()
+            {
+
+            }
+CSecuritySettings::~CSecuritySettings()
+            {
+
+            }
+CSecuritySettings* CSecuritySettings::NewL()
+    {
+    CSecuritySettings* self = new( ELeave ) CSecuritySettings;
+        CleanupStack::PushL( self );
+        //self->ConstructL()
+        CleanupStack::Pop( self );
+        return self;
+    }
+TBool CSecuritySettings::AskPin2L()
+    {
+    return ETrue;
+    }
+// ----
+
+
+
+CRepository * CRepository::NewL( 
+        TUid aRepositoryUid )
+    {
+    
+
+    CRepository* self = new( ELeave ) CRepository;
+    CleanupStack::PushL( self );
+    //self->ConstructL()
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+
+CRepository * CRepository::NewLC( 
+        TUid aRepositoryUid )
+    {
+   
+
+    CRepository* self = new( ELeave ) CRepository;
+    CleanupStack::PushL( self );
+    //self->ConstructL()
+    return self;
+    }
+
+
+
+CRepository::~CRepository(  )
+    {
+    
+    }
+
+TInt CRepository::Get( 
+        TUint32 aKey,
+        TInt & aValue )
+    {
+    if(true == TestCntSimUtility::returnErrorInStub_1)
+           {
+           return KErrGeneral;
+           }
+       return KErrNone;
+    
+    }
+TInt CRepository::Get(TUint32 aKey,TDes16 &aValue)
+    {
+    if(true == TestCntSimUtility::returnErrorInStub_1)
+           {
+           return KErrGeneral;
+           }
+       return KErrNone;
+    }
+
+TInt CRepository::Set(TUint32 aKey, const TDesC16& aValue)
+    {
+    if(true == TestCntSimUtility::returnErrorInStub_1)
+           {
+           return KErrGeneral;
+           }
+       return KErrNone;
+    }
+TInt CRepository::Set(TUint32 aKey, TInt aValue)
+    {
+    if(true == TestCntSimUtility::returnErrorInStub_1)
+           {
+           return KErrGeneral;
+           }
+       return KErrNone;
+    }
+
+TInt RProperty::Get(TUid aCategory, TUint aKey, TInt& aValue)
+    {
+    if(true == TestCntSimUtility::returnErrorInStub_1)
+             {
+             return KErrGeneral;
+             aValue = ESimNotSupported;
+             
+             }
+    aValue = ESimUsable;
+    return KErrNone;
+    }
+TSecUi::TSecUi(  )
+    {
+    
+    }
+
+
+void TSecUi::ConstructL(  )
+    {
+    
+    }
+
+
+
+void TSecUi::InitializeLibL(  )
+    {
+   
+    }
+
+
+
+void TSecUi::UnInitializeLib(  )
+    {
+    }
+
+
+
+TBool TSecUi::CanBeFreed(  )
+    {
+    }
+
+
+
+void TSecUi::IncreaseClientCount(  )
+    {
+    }
+
+
+void TSecUi::DecreaseClientCount(  )
+    {
+    }
+
+
+RPhone::RPhone()
+    {
+    
+      
+}
+void RPhone::Close()
+    {
+    
+    }
+void RPhone::ConstructL()
+    {
+    
+    }
+
+void RPhone::Destruct()
+    {
+    
+    }
+RMobilePhoneStore::RMobilePhoneStore()
+    {
+    
+    
+    }
+
+void RMobilePhoneStore::GetInfo(TRequestStatus& aReqStatus, TDes8& aInfo) const
+    {
+    TRequestStatus* req = & aReqStatus;
+    if(true == TestCntSimUtility::returnErrorInStub_1)
+        {
+        User::RequestComplete(req, KErrGeneral);
+        }
+    else
+        {
+        User::RequestComplete(req, KErrNone);    
+        }
+    
+
+    
+    
+    }
+void RMmCustomAPI::GetPndCacheStatus( TRequestStatus& aStatus,
+            RMmCustomAPI::TPndCacheStatus& aPndStatus,
+            const TName& aPndName ) const
+    {
+    TRequestStatus* req = & aStatus;
+    if(true == TestCntSimUtility::returnErrorInStub_1)
+        {
+        aPndStatus == RMmCustomAPI::ECacheNotReady;
+        User::RequestComplete(req, KErrGeneral);
+        }
+    else
+        {
+        aPndStatus = RMmCustomAPI::ECacheReady; 
+        User::RequestComplete(req, KErrNone);    
+        }
+    }
+void RMmCustomAPI::NotifyPndCacheReady( TRequestStatus& aStatus,
+        TName& aPndName )
+    {
+    
+    }
+int RMmCustomAPI::Open(RMobilePhone& aPhone)
+    {
+
+    if(true == TestCntSimUtility::returnErrorInStub_1)
+        {
+        return KErrGeneral;
+        }
+    return KErrNone;
+    }
+RMobilePhoneBookStore::TMobilePhoneBookInfoV2::TMobilePhoneBookInfoV2()
+    {
+    
+    }
+RMobilePhoneBookStore::TMobilePhoneBookInfoV1::TMobilePhoneBookInfoV1()
+        {
+        
+        }
+RMobilePhoneBookStore::TMobilePhoneStoreInfoV1::TMobilePhoneStoreInfoV1()
+    {
+    
+    }
+
+RTelSubSessionBase::RTelSubSessionBase()
+    {
+    
+    }
+RMobilePhone::TMultimodeType::TMultimodeType()
+    {
+    
+    }
+TInt RMobilePhoneBookStore::Open(RMobilePhone & aPhone, const TDesC& aStore)
+    {
+
+    if(true == TestCntSimUtility::returnErrorInStub_1)
+        {
+        return KErrGeneral;
+        }
+    return KErrNone;
+    }
+TInt RPhone::Open(RTelServer& aServer, TDesC16 const & aDes)
+    {
+
+    if(true == TestCntSimUtility::returnErrorInStub_1)
+        {
+        return KErrGeneral;
+        }
+    return KErrNone;
+    }
--- a/phonebookengines/cntsortplugin/group/cntsortplugin.mmp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-/*
-* Copyright (c) 2002 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: 
-*     Build information file for contact model plugin needed for japanese sort
-*
-*/
-
-
-#include "cntsortpluginuid.h"
-#include <platform_paths.hrh>
-#include <data_caging_paths.hrh>
-
-TARGET          cntsortplugin.dll
-TARGETTYPE      PLUGIN
-UID             KEComPluginUID2 KCntModelSortPluginDllUID3
-CAPABILITY      CAP_ECOM_PLUGIN
-VENDORID        VID_DEFAULT
-
-SOURCEPATH      ../src
-SOURCE          dllmain.cpp
-SOURCE          ccntsortplugin.cpp
-SOURCE          csortkeyarray.cpp
-
-USERINCLUDE     ../group
-APP_LAYER_SYSTEMINCLUDE
-
-START RESOURCE  101f85a9.rss
-TARGET          cntsortplugin
-TARGETPATH      resource/plugins
-END
-
-LIBRARY         euser.lib
-LIBRARY         ECom.lib
-LIBRARY         cntmodel.lib
-LIBRARY         sortutil.lib
--- a/phonebookengines/cntsortplugin/group/cntsortpluginuid.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/*
-* Copyright (c) 2002 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: 
-*    Common header for Contact Model Sort Plugin UIDs. 
-*
-*
-*/
-
-#ifndef     __CntSortPluginUid_H__
-#define     __CntSortPluginUid_H__
-
-// Contact Model Sort Plugin DLL UID
-#define KCntModelSortPluginDllUID3              0x101F85A9
-
-// Contact Model Sort Plugin Interface UID
-#define KCntModelSortPluginInterfaceUID         0x10200FBD
-
-// Implementation UID 
-#define KCntModelSortPluginImplementationUID    0x101F85AA
-
-//
-// Common system UIDs
-//
-
-// ECom Plugin UID 2
-#define KEComPluginUID2                         0x10009D8D
-
-#endif // CntSortPluginUid
-
--- a/phonebookengines/cntsortplugin/rom/cntsortplugin.iby	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-/*
-* 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:
-*
-*/
-
-#ifndef __CNTSORTPLUGIN_IBY__
-#define __CNTSORTPLUGIN_IBY__
-
-ECOM_PLUGIN(cntsortplugin.dll,101f85a9.rsc)
-
-#endif 
--- a/phonebookengines/cntsortplugin/src/101f85a9.rss	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-/*
-* Copyright (c) 2002 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: 
-*     Contact model ECOM plugin resource file
-*
-*/
-
-
-#include <ecom/registryinfo.rh>
-#include "cntsortpluginuid.h"
-
-RESOURCE REGISTRY_INFO theInfo
-	{
-	dll_uid = KCntModelSortPluginDllUID3;
-	interfaces = 
-		{
-		INTERFACE_INFO
-			{
-			interface_uid = KCntModelSortPluginInterfaceUID;
-			implementations = 
-				{
-				IMPLEMENTATION_INFO
-					{
-					implementation_uid = KCntModelSortPluginImplementationUID;
-					version_no = 1;
-					display_name = "Contacts Sort Plugin";
-					default_data = "/default";
-					opaque_data = "";
-					}
-				};
-			}
-		};
-	}
--- a/phonebookengines/cntsortplugin/src/ccntsortplugin.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,200 +0,0 @@
-/*
-* Copyright (c) 2002 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: 
-*     Contact model ECOM sort plugin.
-*
-*/
-
-
-// INCLUDE FILES
-#include "ccntsortplugin.h"
-
-#include <SortUtil.h>
-#include <cntdef.h>
-
-#include "csortkeyarray.h"
-
-namespace {
-
-#ifdef _DEBUG
-enum TPanicType 
-    {
-    EPanicPreCond_CompareViewContactsL = 1,
-    EPanicSortUtilFactoryReturnedNULL,
-    EPanicInvalidViewParameters,
-    EPanicDefaultCompareFunctionNULL,
-    EPanicDefaultIsSortableFunctionNULL
-    };
-
-void Panic(TPanicType aPanicType)
-    {
-    _LIT(KPanicTxt, "CCntSortPlugin");
-    User::Panic(KPanicTxt, aPanicType);
-    }
-#endif
-} // namespace
-
-// ========================== MEMBER FUNCTIONS ===============================
-
-// ---------------------------------------------------------------------------
-// CCntSortPlugin::NewL
-// ---------------------------------------------------------------------------
-//
-CCntSortPlugin* CCntSortPlugin::NewL(TAny* aParams)
-	{
-	CCntSortPlugin* self = new(ELeave) CCntSortPlugin;
-    CleanupStack::PushL( self );
-    self->ConstructL(static_cast<TSortPluginParams*>(aParams));
-    CleanupStack::Pop();
-	return self;
-	}
-
-// ---------------------------------------------------------------------------
-// CCntSortPlugin::ConstructL
-// ---------------------------------------------------------------------------
-//
-void CCntSortPlugin::ConstructL(TSortPluginParams* aParams)
-    {
-	// Validate parameters
-	if (!aParams || 
-        (aParams->iParametersRevision != KCntSortPluginViewParamsRev1Uid))
-		User::Leave(KErrArgument);
-
-    TSortPluginViewParamsRev1* viewParams = 
-        static_cast<TSortPluginViewParamsRev1*>(aParams->iViewSortParams);
-
-    __ASSERT_DEBUG(viewParams, 
-                   Panic(EPanicInvalidViewParameters));
-    __ASSERT_DEBUG(viewParams->iCompareViewContactsL, 
-                   Panic(EPanicDefaultCompareFunctionNULL));
-    __ASSERT_DEBUG(viewParams->iIsSortable, 
-                   Panic(EPanicDefaultIsSortableFunctionNULL));
-
-    iIsSortable = viewParams->iIsSortable;
-    
-    iSortUtil = CSortUtil::NewL();
-    // Sort Util factory has to return valid pointer
-    // Factory should default to european sorting if nothing else is
-    // applicable
-    __ASSERT_DEBUG(iSortUtil, Panic(EPanicSortUtilFactoryReturnedNULL));
-
-    iLeftSortKeyArray = CSortKeyArray::NewL();
-    iRightSortKeyArray = CSortKeyArray::NewL();
-    }
-
-// ---------------------------------------------------------------------------
-// CCntSortPlugin::CCntSortPlugin
-// ---------------------------------------------------------------------------
-//
-CCntSortPlugin::CCntSortPlugin()
-	{
-	}
-
-// ---------------------------------------------------------------------------
-// CCntSortPlugin::~CCntSortPlugin
-// ---------------------------------------------------------------------------
-//
-CCntSortPlugin::~CCntSortPlugin()
-	{
-    delete iSortUtil;
-    iSortOrder.Close();
-    delete iLeftSortKeyArray;
-    delete iRightSortKeyArray;
-	}
-
-void CCntSortPlugin::SetSortOrderL
-        (const RContactViewSortOrder& aViewSortOrder)
-    {
-    iSortOrder.Close();
-    iSortOrder.CopyL(aViewSortOrder);
-    }
-
-TInt CCntSortPlugin::SortStart(TSortStartTypes aSortStartType, TInt aCount)
-    {
-    TRAPD(ret, DoSortStartL(aSortStartType, aCount));
-    return ret;
-    }
-
-void CCntSortPlugin::DoSortStartL
-        (TSortStartTypes /* aSortStartType */, TInt /* aCount */)
-    {
-    iLeftSortKeyArray->Reset();
-    iRightSortKeyArray->Reset();
-
-    const TInt count = iSortOrder.Count();
-    for (TInt i = 0; i < count; ++i)
-        {
-        TFieldType fieldType = iSortOrder[i];
-        if (fieldType == KUidContactFieldGivenNamePronunciation ||
-            fieldType == KUidContactFieldFamilyNamePronunciation ||
-            fieldType == KUidContactFieldCompanyNamePronunciation)
-            {
-            iLeftSortKeyArray->AppendL
-                (TSortKey(KNullDesC, ESortKeyPronounciation));
-            iRightSortKeyArray->AppendL
-                (TSortKey(KNullDesC, ESortKeyPronounciation));
-            }
-        else
-            {
-            iLeftSortKeyArray->AppendL(TSortKey(KNullDesC, ESortKeyBasic));
-            iRightSortKeyArray->AppendL(TSortKey(KNullDesC, ESortKeyBasic));
-            }
-        }
-    }
-
-void CCntSortPlugin::SortCompleted()
-    {
-    iLeftSortKeyArray->Reset();
-    iRightSortKeyArray->Reset();
-    }
-
-TInt CCntSortPlugin::SortCompareViewContactsL
-        (const CViewContact& aLhs, const CViewContact& aRhs)
-    {
-    __ASSERT_DEBUG(aLhs.FieldCount() == iSortOrder.Count(),
-                   Panic(EPanicPreCond_CompareViewContactsL));
-    __ASSERT_DEBUG(aRhs.FieldCount() == iSortOrder.Count(),
-                   Panic(EPanicPreCond_CompareViewContactsL));
-    __ASSERT_DEBUG(iLeftSortKeyArray && 
-                   iLeftSortKeyArray->SortKeyCount() == iSortOrder.Count(),
-                   Panic(EPanicPreCond_CompareViewContactsL));
-    __ASSERT_DEBUG(iRightSortKeyArray && 
-                   iRightSortKeyArray->SortKeyCount() == iSortOrder.Count(),
-                   Panic(EPanicPreCond_CompareViewContactsL));
-
-    // Change the text in the sortkeys to correspond fields in the contacts
-    const TInt count = iSortOrder.Count();
-    for (TInt i = 0; i < count; ++i)
-        {
-        iLeftSortKeyArray->SetText(aLhs.Field(i), i);
-        iRightSortKeyArray->SetText(aRhs.Field(i), i);
-        }
-
-    return iSortUtil->Interface()->CompareItems
-        (*iLeftSortKeyArray, *iRightSortKeyArray);
-    }
-
-TInt CCntSortPlugin::ApiCompareViewContactsL
-    (const CViewContact& aLhs, const CViewContact& aRhs)
-    {
-    return SortCompareViewContactsL(aLhs, aRhs);
-    }
-
-TBool CCntSortPlugin::ViewContactIsSortable
-        (const CViewContact& aViewContact)
-    {
-    return iIsSortable(aViewContact);
-    }
-
-// End of File
--- a/phonebookengines/cntsortplugin/src/ccntsortplugin.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,93 +0,0 @@
-/*
-* Copyright (c) 2002 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: 
-*     Contact model ECOM sort plugin
-*
-*/
-
-
-#ifndef __CCntSortPlugin_H__
-#define __CCntSortPlugin_H__
-
-// INCLUDES
-#include <cntviewsortplugin.h>
-#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
-#include <cntviewsortpluginbase.h>
-#endif 
-
-// FORWARD DECLARATIONS
-class CSortUtil;
-class CSortKeyArray;
-
-// CLASS DECLARATION
-
-/**
- * This class implements the functionality promised by 
- * the CViewContactSortInterfaceDefinition definition class.
- */
-class CCntSortPlugin : public CViewContactSortPlugin
-    {
-    public: // Construction / Destruction
-        /**
-         * Two phase static constructor.
-         * @param aParams Parameters for construction.
-         * @return Newly created instance of CCntSortPlugin.
-         */
-        static CCntSortPlugin* NewL(TAny* aParams);
-        ~CCntSortPlugin();
-
-    private:	// From CContactViewSortConfigInterface
-        void SetSortOrderL(const RContactViewSortOrder& aViewSortOrder);
-        TInt SortStart(TSortStartTypes aSortStartType, TInt aCount);
-        void SortCompleted();
-        TInt SortCompareViewContactsL
-            (const CViewContact& aLhs, const CViewContact& aRhs);
-        TInt ApiCompareViewContactsL
-            (const CViewContact& aLhs, const CViewContact& aRhs);
-        TInt CompareViewContactsL(const CViewContact& aLhs, const CViewContact& aRhs);
-        TBool ViewContactIsSortable(const CViewContact& aViewContact);
-
-    private: // Implementation
-        /**
-         * Standard C++ constructor.
-         */
-        CCntSortPlugin();
-
-        /**
-         * 2nd phase constructor.
-         */
-        void ConstructL(TSortPluginParams* aParams);
-
-        /**
-         * Do the actual sort starting.
-         * @param aSortStartType Type of the sort to start.
-         * @param aCount Approximate number of contacts to process.
-         */
-        void DoSortStartL(TSortStartTypes aSortStartType, TInt aCount);
-    private: // Data
-        /// Own: The sort util
-        CSortUtil* iSortUtil;
-        /// Currently active sort order
-        RContactViewSortOrder iSortOrder;
-        /// Ref: Is sortable function 
-	    TBool(*iIsSortable)(const CViewContact& aViewContact);
-        /// Own: sort key array for left hand side
-        CSortKeyArray* iLeftSortKeyArray;
-        /// Own: sort key array for right hand side
-        CSortKeyArray* iRightSortKeyArray;
-    };
-
-#endif // __CCntSortPlugin_H__
-
-// End of File
--- a/phonebookengines/cntsortplugin/src/csortkeyarray.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,91 +0,0 @@
-/*
-* Copyright (c) 2002 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: 
-*     Sort key array for Contact model ECOM sort plugin.
-*
-*/
-
-
-#include "csortkeyarray.h"
-
-namespace {
-
-#ifdef _DEBUG
-    
-enum TPanicReason
-    {
-    EPanicPreCond_SetText
-    };
-    
-void Panic(TPanicReason aReason)
-    {
-    _LIT(KPanicText, "CSortKeyArray");
-    User::Panic(KPanicText, aReason);
-    }
-
-#endif // _DEBUG
-
-} // namespace
-
-inline CSortKeyArray::CSortKeyArray()
-    {
-    }
-
-CSortKeyArray* CSortKeyArray::NewL()
-    {
-    return new(ELeave) CSortKeyArray;
-    }
-
-CSortKeyArray::~CSortKeyArray()
-    {
-    iKeyTypes.Close();
-    iTexts.Close();
-    }
-
-void CSortKeyArray::AppendL(const TSortKey& aKey)
-    {
-    User::LeaveIfError(iKeyTypes.Append(aKey.Type()));
-    TInt err = iTexts.Append(aKey.Text());
-    if (err != KErrNone)
-        {
-        // if appending to iTexts was not successful remove also the
-        // item in iKeyTypes to keep arrays in sync.
-        iKeyTypes.Remove(iKeyTypes.Count() - 1);
-        User::Leave(err);
-        }
-    }
-
-void CSortKeyArray::SetText(const TDesC& aText, TInt aIndex)
-    {
-    __ASSERT_DEBUG(aIndex < iTexts.Count(), Panic(EPanicPreCond_SetText));
-    iTexts[aIndex].Set(aText);
-    }
-
-void CSortKeyArray::Reset()
-    {
-    iKeyTypes.Reset();
-    iTexts.Reset();
-    }
-
-TInt CSortKeyArray::SortKeyCount() const
-    {
-    return iKeyTypes.Count();
-    }
-
-TSortKey CSortKeyArray::SortKeyAt(TInt aIndex) const
-    {
-    return TSortKey(iTexts[aIndex], iKeyTypes[aIndex]);
-    }
-
-// End of File
--- a/phonebookengines/cntsortplugin/src/csortkeyarray.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,83 +0,0 @@
-/*
-* Copyright (c) 2002 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: 
-*     Sort key array for Contact model ECOM sort plugin.
-*
-*/
-
-
-#ifndef __CSortKeyArray_H__
-#define __CSortKeyArray_H__
-
-// INCLUDES
-#include <SortUtil.h>
-
-// CLASS DESCRIPTION
-/**
- * Sort key array for Contact model ECOM sort plugin.
- */
-class CSortKeyArray : public CBase, 
-                      public MSortKeyArray
-    {
-    public:
-        /**
-         * Static constructor.
-         * @return Newly created instance of this class.
-         */
-        static CSortKeyArray* NewL();
-
-        /**
-         * Standard c++ destructor.
-         */
-        ~CSortKeyArray();
-
-    public: // Interface
-        /**
-         * Appends new sortkey to the array.
-         * @param aKey New sortkey to append.
-         */
-        void AppendL(const TSortKey& aKey);
-
-        /**
-         * Resets the sortkey array.
-         */
-        void Reset();
-
-        /**
-         * Sets the text of the key in specified index.
-         * @param aText The text to set to key in index.
-         * @param aIndex The index where the key to be modified is.
-         */
-        void SetText(const TDesC& aText, TInt aIndex);
-
-    public:  // from MSortKeyArray
-        TInt SortKeyCount() const;
-        TSortKey SortKeyAt(TInt aIndex) const;
-        
-    private:
-        /**
-         * C++ constructor.
-         */
-        CSortKeyArray();
-
-    private:  // Data
-        /// Own: Array of key types.
-        RArray<TSortKeyType> iKeyTypes;
-        /// Own: Array of texts that correspond to types in array iKeyTypes.
-        RArray<TPtrC> iTexts;
-    };
-
-#endif // __CSortKeyArray_H__
-
-// End of File
--- a/phonebookengines/cntsortplugin/src/dllmain.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-/*
-* Copyright (c) 2002 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:
-*
-*/
-
-
-// INCLUDES
-#include <e32std.h>
-#include <ecom/implementationproxy.h>
-
-#include "ccntsortplugin.h"
-#include "cntsortpluginuid.h"
-
-// Define the interface UIDs
-const TImplementationProxy ImplementationTable[] = 
-	{
-    IMPLEMENTATION_PROXY_ENTRY(KCntModelSortPluginImplementationUID,
-                               CCntSortPlugin::NewL)
-	};
-
-// The one and only exported function that is the ECom entry point
-EXPORT_C const TImplementationProxy* ImplementationGroupProxy
-        (TInt& aTableCount)
-	{
-	aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
-
-	return ImplementationTable;
-	}
-
-// End of File
--- a/phonebookengines/eabi/cntimageutilityu.def	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookengines/eabi/cntimageutilityu.def	Fri Oct 15 12:24:46 2010 +0300
@@ -19,4 +19,19 @@
 	_ZNK15CntImageUtility10metaObjectEv @ 18 NONAME
 	_ZTI15CntImageUtility @ 19 NONAME
 	_ZTV15CntImageUtility @ 20 NONAME
+	_ZN20CntOrientationHelper11orientationEv @ 21 NONAME
+	_ZN20CntOrientationHelper11qt_metacallEN11QMetaObject4CallEiPPv @ 22 NONAME
+	_ZN20CntOrientationHelper11qt_metacastEPKc @ 23 NONAME
+	_ZN20CntOrientationHelper16staticMetaObjectE @ 24 NONAME DATA 16
+	_ZN20CntOrientationHelper18orientationChangedEN2Qt11OrientationE @ 25 NONAME
+	_ZN20CntOrientationHelper19getStaticMetaObjectEv @ 26 NONAME
+	_ZN20CntOrientationHelper22emitOrientationChangedERK13XQSettingsKeyRK8QVariant @ 27 NONAME
+	_ZN20CntOrientationHelperC1EP7QObject @ 28 NONAME
+	_ZN20CntOrientationHelperC2EP7QObject @ 29 NONAME
+	_ZN20CntOrientationHelperD0Ev @ 30 NONAME
+	_ZN20CntOrientationHelperD1Ev @ 31 NONAME
+	_ZN20CntOrientationHelperD2Ev @ 32 NONAME
+	_ZNK20CntOrientationHelper10metaObjectEv @ 33 NONAME
+	_ZTI20CntOrientationHelper @ 34 NONAME
+	_ZTV20CntOrientationHelper @ 35 NONAME
 
--- a/phonebookengines/phonebookengines.pro	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookengines/phonebookengines.pro	Fri Oct 15 12:24:46 2010 +0300
@@ -22,9 +22,6 @@
 
 TEMPLATE = subdirs
 
-SUBDIRS += cntfindplugin 
-SUBDIRS += cntsortplugin
-SUBDIRS += cntlistmodel 
 SUBDIRS += cntactions 
 SUBDIRS += cntsimutility
 SUBDIRS += cntimageutility
--- a/phonebookui/bwins/cntcommonuiu.def	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/bwins/cntcommonuiu.def	Fri Oct 15 12:24:46 2010 +0300
@@ -1,177 +1,187 @@
 EXPORTS
 	?trUtf8@CntDefaultViewManager@@SA?AVQString@@PBD0@Z @ 1 NONAME ; class QString CntDefaultViewManager::trUtf8(char const *, char const *)
-	?activate@CntBaseSelectionView@@UAEXV?$QMap@HVQVariant@@@@@Z @ 2 NONAME ; void CntBaseSelectionView::activate(class QMap<int, class QVariant>)
-	?setViewNavigator@CntDefaultViewManager@@QAEXPAVCntViewNavigator@@@Z @ 3 NONAME ; void CntDefaultViewManager::setViewNavigator(class CntViewNavigator *)
-	?tr@CntActionPopup@@SA?AVQString@@PBD0@Z @ 4 NONAME ; class QString CntActionPopup::tr(char const *, char const *)
-	?currentViewId@CntDefaultViewManager@@QAEHXZ @ 5 NONAME ; int CntDefaultViewManager::currentViewId(void)
-	?cleanup@CntDefaultViewManager@@AAEXXZ @ 6 NONAME ; void CntDefaultViewManager::cleanup(void)
-	??1CntMainWindow@@UAE@XZ @ 7 NONAME ; CntMainWindow::~CntMainWindow(void)
-	?viewActivated@CntContactCardView@@IAEXPAVCntAbstractViewManager@@V?$QMap@HVQVariant@@@@@Z @ 8 NONAME ; void CntContactCardView::viewActivated(class CntAbstractViewManager *, class QMap<int, class QVariant>)
-	?view@CntEditView@@UBEPAVHbView@@XZ @ 9 NONAME ; class HbView * CntEditView::view(void) const
-	?qt_metacall@CntBaseSelectionView@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 10 NONAME ; int CntBaseSelectionView::qt_metacall(enum QMetaObject::Call, int, void * *)
-	?trUtf8@CntGroupMemberView@@SA?AVQString@@PBD0H@Z @ 11 NONAME ; class QString CntGroupMemberView::trUtf8(char const *, char const *, int)
-	?d_func@CntGroupMemberView@@AAEPAVCntGroupMemberViewPrivate@@XZ @ 12 NONAME ; class CntGroupMemberViewPrivate * CntGroupMemberView::d_func(void)
-	?tr@CntMainWindow@@SA?AVQString@@PBD0@Z @ 13 NONAME ; class QString CntMainWindow::tr(char const *, char const *)
-	?staticMetaObject@CntBaseSelectionView@@2UQMetaObject@@B @ 14 NONAME ; struct QMetaObject const CntBaseSelectionView::staticMetaObject
-	?d_func@CntEditView@@AAEPAVCntEditViewPrivate@@XZ @ 15 NONAME ; class CntEditViewPrivate * CntEditView::d_func(void)
-	?changesDiscarded@CntEditView@@IAEXXZ @ 16 NONAME ; void CntEditView::changesDiscarded(void)
-	?view@CntGroupMemberView@@UBEPAVHbView@@XZ @ 17 NONAME ; class HbView * CntGroupMemberView::view(void) const
-	??_ECntDefaultViewManager@@UAE@I@Z @ 18 NONAME ; CntDefaultViewManager::~CntDefaultViewManager(unsigned int)
-	??_ECntBaseSelectionView@@UAE@I@Z @ 19 NONAME ; CntBaseSelectionView::~CntBaseSelectionView(unsigned int)
-	?view@CntBaseSelectionView@@UBEPAVHbView@@XZ @ 20 NONAME ; class HbView * CntBaseSelectionView::view(void) const
-	??1CntDefaultViewFactory@@UAE@XZ @ 21 NONAME ; CntDefaultViewFactory::~CntDefaultViewFactory(void)
-	??_ECntDefaultViewFactory@@UAE@I@Z @ 22 NONAME ; CntDefaultViewFactory::~CntDefaultViewFactory(unsigned int)
-	?trUtf8@CntDefaultViewManager@@SA?AVQString@@PBD0H@Z @ 23 NONAME ; class QString CntDefaultViewManager::trUtf8(char const *, char const *, int)
-	?staticMetaObject@CntGroupMemberView@@2UQMetaObject@@B @ 24 NONAME ; struct QMetaObject const CntGroupMemberView::staticMetaObject
-	?qt_metacast@CntActionPopup@@UAEPAXPBD@Z @ 25 NONAME ; void * CntActionPopup::qt_metacast(char const *)
-	?deleteOldView@CntDefaultViewManager@@AAEXXZ @ 26 NONAME ; void CntDefaultViewManager::deleteOldView(void)
-	?trUtf8@CntMainWindow@@SA?AVQString@@PBD0H@Z @ 27 NONAME ; class QString CntMainWindow::trUtf8(char const *, char const *, int)
-	?trUtf8@CntEditView@@SA?AVQString@@PBD0H@Z @ 28 NONAME ; class QString CntEditView::trUtf8(char const *, char const *, int)
-	??1CntEditView@@UAE@XZ @ 29 NONAME ; CntEditView::~CntEditView(void)
-	?qt_metacast@CntBaseSelectionView@@UAEPAXPBD@Z @ 30 NONAME ; void * CntBaseSelectionView::qt_metacast(char const *)
-	?metaObject@CntBaseSelectionView@@UBEPBUQMetaObject@@XZ @ 31 NONAME ; struct QMetaObject const * CntBaseSelectionView::metaObject(void) const
-	?engine@CntDefaultViewManager@@QAEAAVCntAbstractEngine@@XZ @ 32 NONAME ; class CntAbstractEngine & CntDefaultViewManager::engine(void)
-	?back@CntDefaultViewManager@@UAEXV?$QMap@HVQVariant@@@@_N@Z @ 33 NONAME ; void CntDefaultViewManager::back(class QMap<int, class QVariant>, bool)
-	??0CntKeyGrabber@@QAE@PAVHbMainWindow@@PAVQObject@@@Z @ 34 NONAME ; CntKeyGrabber::CntKeyGrabber(class HbMainWindow *, class QObject *)
-	?qt_metacall@CntViewNavigator@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 35 NONAME ; int CntViewNavigator::qt_metacall(enum QMetaObject::Call, int, void * *)
-	?activate@CntContactCardView@@UAEXV?$QMap@HVQVariant@@@@@Z @ 36 NONAME ; void CntContactCardView::activate(class QMap<int, class QVariant>)
-	?tr@CntKeyGrabber@@SA?AVQString@@PBD0H@Z @ 37 NONAME ; class QString CntKeyGrabber::tr(char const *, char const *, int)
-	?tr@CntDefaultViewManager@@SA?AVQString@@PBD0H@Z @ 38 NONAME ; class QString CntDefaultViewManager::tr(char const *, char const *, int)
-	?viewId@CntEditView@@UBEHXZ @ 39 NONAME ; int CntEditView::viewId(void) const
-	??1CntGroupMemberView@@UAE@XZ @ 40 NONAME ; CntGroupMemberView::~CntGroupMemberView(void)
-	?tr@CntGroupMemberView@@SA?AVQString@@PBD0H@Z @ 41 NONAME ; class QString CntGroupMemberView::tr(char const *, char const *, int)
-	?qt_metacast@CntContactCardView@@UAEPAXPBD@Z @ 42 NONAME ; void * CntContactCardView::qt_metacast(char const *)
-	?viewClosed@CntBaseSelectionView@@IAEXXZ @ 43 NONAME ; void CntBaseSelectionView::viewClosed(void)
-	??1CntKeyGrabber@@UAE@XZ @ 44 NONAME ; CntKeyGrabber::~CntKeyGrabber(void)
-	?showActionPopup@CntActionPopup@@QAE_NVQString@@@Z @ 45 NONAME ; bool CntActionPopup::showActionPopup(class QString)
-	?trUtf8@CntActionPopup@@SA?AVQString@@PBD0@Z @ 46 NONAME ; class QString CntActionPopup::trUtf8(char const *, char const *)
-	?tr@CntBaseSelectionView@@SA?AVQString@@PBD0H@Z @ 47 NONAME ; class QString CntBaseSelectionView::tr(char const *, char const *, int)
-	?metaObject@CntContactCardView@@UBEPBUQMetaObject@@XZ @ 48 NONAME ; struct QMetaObject const * CntContactCardView::metaObject(void) const
-	??0CntViewNavigator@@QAE@PAVQObject@@@Z @ 49 NONAME ; CntViewNavigator::CntViewNavigator(class QObject *)
-	?d_func@CntContactCardView@@ABEPBVCntContactCardViewPrivate@@XZ @ 50 NONAME ; class CntContactCardViewPrivate const * CntContactCardView::d_func(void) const
-	?trUtf8@CntBaseSelectionView@@SA?AVQString@@PBD0H@Z @ 51 NONAME ; class QString CntBaseSelectionView::trUtf8(char const *, char const *, int)
-	?getStaticMetaObject@CntBaseSelectionView@@SAABUQMetaObject@@XZ @ 52 NONAME ; struct QMetaObject const & CntBaseSelectionView::getStaticMetaObject(void)
-	??0CntDefaultViewManager@@QAE@PAVHbMainWindow@@@Z @ 53 NONAME ; CntDefaultViewManager::CntDefaultViewManager(class HbMainWindow *)
-	??_ECntGroupMemberView@@UAE@I@Z @ 54 NONAME ; CntGroupMemberView::~CntGroupMemberView(unsigned int)
-	?actionPopupCancelPressed@CntActionPopup@@IAEXXZ @ 55 NONAME ; void CntActionPopup::actionPopupCancelPressed(void)
-	?getStaticMetaObject@CntActionPopup@@SAABUQMetaObject@@XZ @ 56 NONAME ; struct QMetaObject const & CntActionPopup::getStaticMetaObject(void)
-	?next@CntViewNavigator@@QAEXABHAAV?$QFlags@W4ViewSwitchFlag@Hb@@@@@Z @ 57 NONAME ; void CntViewNavigator::next(int const &, class QFlags<enum Hb::ViewSwitchFlag> &)
-	?createView@CntDefaultViewFactory@@UAEPAVCntAbstractView@@H@Z @ 58 NONAME ; class CntAbstractView * CntDefaultViewFactory::createView(int)
-	?viewId@CntGroupMemberView@@UBEHXZ @ 59 NONAME ; int CntGroupMemberView::viewId(void) const
-	?qt_metacast@CntEditView@@UAEPAXPBD@Z @ 60 NONAME ; void * CntEditView::qt_metacast(char const *)
-	??0CntContactCardView@@QAE@_N@Z @ 61 NONAME ; CntContactCardView::CntContactCardView(bool)
-	?contactRemoved@CntEditView@@IAEX_N@Z @ 62 NONAME ; void CntEditView::contactRemoved(bool)
-	?d_func@CntActionPopup@@ABEPBVCntActionPopupPrivate@@XZ @ 63 NONAME ; class CntActionPopupPrivate const * CntActionPopup::d_func(void) const
-	?trUtf8@CntContactCardView@@SA?AVQString@@PBD0@Z @ 64 NONAME ; class QString CntContactCardView::trUtf8(char const *, char const *)
-	?metaObject@CntActionPopup@@UBEPBUQMetaObject@@XZ @ 65 NONAME ; struct QMetaObject const * CntActionPopup::metaObject(void) const
-	?staticMetaObject@CntDefaultViewManager@@2UQMetaObject@@B @ 66 NONAME ; struct QMetaObject const CntDefaultViewManager::staticMetaObject
-	?removeException@CntViewNavigator@@QAEXABH@Z @ 67 NONAME ; void CntViewNavigator::removeException(int const &)
-	?trUtf8@CntViewNavigator@@SA?AVQString@@PBD0@Z @ 68 NONAME ; class QString CntViewNavigator::trUtf8(char const *, char const *)
-	?isDefault@CntGroupMemberView@@UBE_NXZ @ 69 NONAME ; bool CntGroupMemberView::isDefault(void) const
-	?getStaticMetaObject@CntKeyGrabber@@SAABUQMetaObject@@XZ @ 70 NONAME ; struct QMetaObject const & CntKeyGrabber::getStaticMetaObject(void)
-	?metaObject@CntMainWindow@@UBEPBUQMetaObject@@XZ @ 71 NONAME ; struct QMetaObject const * CntMainWindow::metaObject(void) const
-	??_ECntMainWindow@@UAE@I@Z @ 72 NONAME ; CntMainWindow::~CntMainWindow(unsigned int)
-	?metaObject@CntDefaultViewManager@@UBEPBUQMetaObject@@XZ @ 73 NONAME ; struct QMetaObject const * CntDefaultViewManager::metaObject(void) const
-	?changeView@CntDefaultViewManager@@UAEXV?$QMap@HVQVariant@@@@@Z @ 74 NONAME ; void CntDefaultViewManager::changeView(class QMap<int, class QVariant>)
-	?qt_metacast@CntGroupMemberView@@UAEPAXPBD@Z @ 75 NONAME ; void * CntGroupMemberView::qt_metacast(char const *)
-	??_ECntContactCardView@@UAE@I@Z @ 76 NONAME ; CntContactCardView::~CntContactCardView(unsigned int)
-	?staticMetaObject@CntViewNavigator@@2UQMetaObject@@B @ 77 NONAME ; struct QMetaObject const CntViewNavigator::staticMetaObject
-	?activate@CntEditView@@UAEXV?$QMap@HVQVariant@@@@@Z @ 78 NONAME ; void CntEditView::activate(class QMap<int, class QVariant>)
-	?qt_metacall@CntContactCardView@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 79 NONAME ; int CntContactCardView::qt_metacall(enum QMetaObject::Call, int, void * *)
-	?qt_metacall@CntMainWindow@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 80 NONAME ; int CntMainWindow::qt_metacall(enum QMetaObject::Call, int, void * *)
-	?trUtf8@CntMainWindow@@SA?AVQString@@PBD0@Z @ 81 NONAME ; class QString CntMainWindow::trUtf8(char const *, char const *)
-	?trUtf8@CntKeyGrabber@@SA?AVQString@@PBD0H@Z @ 82 NONAME ; class QString CntKeyGrabber::trUtf8(char const *, char const *, int)
-	?staticMetaObject@CntMainWindow@@2UQMetaObject@@B @ 83 NONAME ; struct QMetaObject const CntMainWindow::staticMetaObject
-	?isDefault@CntContactCardView@@UBE_NXZ @ 84 NONAME ; bool CntContactCardView::isDefault(void) const
-	??1CntContactCardView@@UAE@XZ @ 85 NONAME ; CntContactCardView::~CntContactCardView(void)
-	?trUtf8@CntGroupMemberView@@SA?AVQString@@PBD0@Z @ 86 NONAME ; class QString CntGroupMemberView::trUtf8(char const *, char const *)
-	?qt_metacall@CntActionPopup@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 87 NONAME ; int CntActionPopup::qt_metacall(enum QMetaObject::Call, int, void * *)
-	??0CntBaseSelectionView@@QAE@XZ @ 88 NONAME ; CntBaseSelectionView::CntBaseSelectionView(void)
-	?tr@CntKeyGrabber@@SA?AVQString@@PBD0@Z @ 89 NONAME ; class QString CntKeyGrabber::tr(char const *, char const *)
-	??0CntMainWindow@@QAE@PAVQWidget@@H@Z @ 90 NONAME ; CntMainWindow::CntMainWindow(class QWidget *, int)
-	?setEngine@CntGroupMemberView@@UAEXAAVCntAbstractEngine@@@Z @ 91 NONAME ; void CntGroupMemberView::setEngine(class CntAbstractEngine &)
-	??1CntActionPopup@@UAE@XZ @ 92 NONAME ; CntActionPopup::~CntActionPopup(void)
-	?viewId@CntContactCardView@@UBEHXZ @ 93 NONAME ; int CntContactCardView::viewId(void) const
-	?removeEffect@CntViewNavigator@@QAEXABH@Z @ 94 NONAME ; void CntViewNavigator::removeEffect(int const &)
-	?getStaticMetaObject@CntContactCardView@@SAABUQMetaObject@@XZ @ 95 NONAME ; struct QMetaObject const & CntContactCardView::getStaticMetaObject(void)
-	?staticMetaObject@CntActionPopup@@2UQMetaObject@@B @ 96 NONAME ; struct QMetaObject const CntActionPopup::staticMetaObject
-	?staticMetaObject@CntEditView@@2UQMetaObject@@B @ 97 NONAME ; struct QMetaObject const CntEditView::staticMetaObject
-	?staticMetaObject@CntKeyGrabber@@2UQMetaObject@@B @ 98 NONAME ; struct QMetaObject const CntKeyGrabber::staticMetaObject
-	?viewOpened@CntBaseSelectionView@@IAEXPAVCntAbstractViewManager@@V?$QMap@HVQVariant@@@@@Z @ 99 NONAME ; void CntBaseSelectionView::viewOpened(class CntAbstractViewManager *, class QMap<int, class QVariant>)
-	??0CntDefaultViewFactory@@QAE@AAVCntExtensionManager@@@Z @ 100 NONAME ; CntDefaultViewFactory::CntDefaultViewFactory(class CntExtensionManager &)
-	?setEngine@CntEditView@@UAEXAAVCntAbstractEngine@@@Z @ 101 NONAME ; void CntEditView::setEngine(class CntAbstractEngine &)
-	?backPressed@CntContactCardView@@IAEXH@Z @ 102 NONAME ; void CntContactCardView::backPressed(int)
-	?isDefault@CntEditView@@UBE_NXZ @ 103 NONAME ; bool CntEditView::isDefault(void) const
-	?qt_metacall@CntKeyGrabber@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 104 NONAME ; int CntKeyGrabber::qt_metacall(enum QMetaObject::Call, int, void * *)
-	??_ECntViewNavigator@@UAE@I@Z @ 105 NONAME ; CntViewNavigator::~CntViewNavigator(unsigned int)
-	?d_func@CntGroupMemberView@@ABEPBVCntGroupMemberViewPrivate@@XZ @ 106 NONAME ; class CntGroupMemberViewPrivate const * CntGroupMemberView::d_func(void) const
-	?trUtf8@CntContactCardView@@SA?AVQString@@PBD0H@Z @ 107 NONAME ; class QString CntContactCardView::trUtf8(char const *, char const *, int)
-	?metaObject@CntKeyGrabber@@UBEPBUQMetaObject@@XZ @ 108 NONAME ; struct QMetaObject const * CntKeyGrabber::metaObject(void) const
-	?addException@CntViewNavigator@@QAEXABH0@Z @ 109 NONAME ; void CntViewNavigator::addException(int const &, int const &)
-	?getStaticMetaObject@CntGroupMemberView@@SAABUQMetaObject@@XZ @ 110 NONAME ; struct QMetaObject const & CntGroupMemberView::getStaticMetaObject(void)
-	?closeApp@CntDefaultViewManager@@MAEXXZ @ 111 NONAME ; void CntDefaultViewManager::closeApp(void)
-	??0CntGroupMemberView@@QAE@XZ @ 112 NONAME ; CntGroupMemberView::CntGroupMemberView(void)
-	?deactivate@CntGroupMemberView@@UAEXXZ @ 113 NONAME ; void CntGroupMemberView::deactivate(void)
-	??_ECntKeyGrabber@@UAE@I@Z @ 114 NONAME ; CntKeyGrabber::~CntKeyGrabber(unsigned int)
-	?deactivate@CntBaseSelectionView@@UAEXXZ @ 115 NONAME ; void CntBaseSelectionView::deactivate(void)
-	?d_func@CntEditView@@ABEPBVCntEditViewPrivate@@XZ @ 116 NONAME ; class CntEditViewPrivate const * CntEditView::d_func(void) const
-	?setViewFactory@CntDefaultViewManager@@QAEXPAVCntAbstractViewFactory@@@Z @ 117 NONAME ; void CntDefaultViewManager::setViewFactory(class CntAbstractViewFactory *)
-	?trUtf8@CntActionPopup@@SA?AVQString@@PBD0H@Z @ 118 NONAME ; class QString CntActionPopup::trUtf8(char const *, char const *, int)
-	?tr@CntViewNavigator@@SA?AVQString@@PBD0@Z @ 119 NONAME ; class QString CntViewNavigator::tr(char const *, char const *)
-	?getStaticMetaObject@CntViewNavigator@@SAABUQMetaObject@@XZ @ 120 NONAME ; struct QMetaObject const & CntViewNavigator::getStaticMetaObject(void)
-	?tr@CntViewNavigator@@SA?AVQString@@PBD0H@Z @ 121 NONAME ; class QString CntViewNavigator::tr(char const *, char const *, int)
-	?tr@CntActionPopup@@SA?AVQString@@PBD0H@Z @ 122 NONAME ; class QString CntActionPopup::tr(char const *, char const *, int)
-	?qt_metacall@CntGroupMemberView@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 123 NONAME ; int CntGroupMemberView::qt_metacall(enum QMetaObject::Call, int, void * *)
-	?metaObject@CntGroupMemberView@@UBEPBUQMetaObject@@XZ @ 124 NONAME ; struct QMetaObject const * CntGroupMemberView::metaObject(void) const
-	?qt_metacast@CntDefaultViewManager@@UAEPAXPBD@Z @ 125 NONAME ; void * CntDefaultViewManager::qt_metacast(char const *)
-	?qt_metacall@CntDefaultViewManager@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 126 NONAME ; int CntDefaultViewManager::qt_metacall(enum QMetaObject::Call, int, void * *)
-	??0CntEditView@@QAE@XZ @ 127 NONAME ; CntEditView::CntEditView(void)
-	?qt_metacast@CntViewNavigator@@UAEPAXPBD@Z @ 128 NONAME ; void * CntViewNavigator::qt_metacast(char const *)
-	?view@CntContactCardView@@UBEPAVHbView@@XZ @ 129 NONAME ; class HbView * CntContactCardView::view(void) const
-	?addToContacts@CntContactCardView@@IAEXXZ @ 130 NONAME ; void CntContactCardView::addToContacts(void)
-	?setEngine@CntBaseSelectionView@@UAEXAAVCntAbstractEngine@@@Z @ 131 NONAME ; void CntBaseSelectionView::setEngine(class CntAbstractEngine &)
-	?tr@CntContactCardView@@SA?AVQString@@PBD0H@Z @ 132 NONAME ; class QString CntContactCardView::tr(char const *, char const *, int)
-	?addRoot@CntViewNavigator@@QAEXABH@Z @ 133 NONAME ; void CntViewNavigator::addRoot(int const &)
-	?tr@CntContactCardView@@SA?AVQString@@PBD0@Z @ 134 NONAME ; class QString CntContactCardView::tr(char const *, char const *)
-	?tr@CntEditView@@SA?AVQString@@PBD0@Z @ 135 NONAME ; class QString CntEditView::tr(char const *, char const *)
-	?d_func@CntContactCardView@@AAEPAVCntContactCardViewPrivate@@XZ @ 136 NONAME ; class CntContactCardViewPrivate * CntContactCardView::d_func(void)
-	?metaObject@CntViewNavigator@@UBEPBUQMetaObject@@XZ @ 137 NONAME ; struct QMetaObject const * CntViewNavigator::metaObject(void) const
-	?activate@CntGroupMemberView@@UAEXV?$QMap@HVQVariant@@@@@Z @ 138 NONAME ; void CntGroupMemberView::activate(class QMap<int, class QVariant>)
-	?staticMetaObject@CntContactCardView@@2UQMetaObject@@B @ 139 NONAME ; struct QMetaObject const CntContactCardView::staticMetaObject
-	?trUtf8@CntBaseSelectionView@@SA?AVQString@@PBD0@Z @ 140 NONAME ; class QString CntBaseSelectionView::trUtf8(char const *, char const *)
-	?tr@CntBaseSelectionView@@SA?AVQString@@PBD0@Z @ 141 NONAME ; class QString CntBaseSelectionView::tr(char const *, char const *)
-	?trUtf8@CntKeyGrabber@@SA?AVQString@@PBD0@Z @ 142 NONAME ; class QString CntKeyGrabber::trUtf8(char const *, char const *)
-	?switchView@CntDefaultViewManager@@AAEXV?$QMap@HVQVariant@@@@V?$QFlags@W4ViewSwitchFlag@Hb@@@@@Z @ 143 NONAME ; void CntDefaultViewManager::switchView(class QMap<int, class QVariant>, class QFlags<enum Hb::ViewSwitchFlag>)
-	?deactivate@CntEditView@@UAEXXZ @ 144 NONAME ; void CntEditView::deactivate(void)
-	?addEffect@CntViewNavigator@@QAEXABH0@Z @ 145 NONAME ; void CntViewNavigator::addEffect(int const &, int const &)
-	??_ECntActionPopup@@UAE@I@Z @ 146 NONAME ; CntActionPopup::~CntActionPopup(unsigned int)
-	?d_func@CntActionPopup@@AAEPAVCntActionPopupPrivate@@XZ @ 147 NONAME ; class CntActionPopupPrivate * CntActionPopup::d_func(void)
-	?metaObject@CntEditView@@UBEPBUQMetaObject@@XZ @ 148 NONAME ; struct QMetaObject const * CntEditView::metaObject(void) const
-	?contactUpdated@CntEditView@@IAEXH@Z @ 149 NONAME ; void CntEditView::contactUpdated(int)
-	??1CntDefaultViewManager@@UAE@XZ @ 150 NONAME ; CntDefaultViewManager::~CntDefaultViewManager(void)
-	?deactivate@CntContactCardView@@UAEXXZ @ 151 NONAME ; void CntContactCardView::deactivate(void)
-	?tr@CntGroupMemberView@@SA?AVQString@@PBD0@Z @ 152 NONAME ; class QString CntGroupMemberView::tr(char const *, char const *)
-	?getStaticMetaObject@CntDefaultViewManager@@SAABUQMetaObject@@XZ @ 153 NONAME ; struct QMetaObject const & CntDefaultViewManager::getStaticMetaObject(void)
-	?trUtf8@CntViewNavigator@@SA?AVQString@@PBD0H@Z @ 154 NONAME ; class QString CntViewNavigator::trUtf8(char const *, char const *, int)
-	?tr@CntEditView@@SA?AVQString@@PBD0H@Z @ 155 NONAME ; class QString CntEditView::tr(char const *, char const *, int)
-	?qt_metacall@CntEditView@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 156 NONAME ; int CntEditView::qt_metacall(enum QMetaObject::Call, int, void * *)
-	?getStaticMetaObject@CntEditView@@SAABUQMetaObject@@XZ @ 157 NONAME ; struct QMetaObject const & CntEditView::getStaticMetaObject(void)
-	?trUtf8@CntEditView@@SA?AVQString@@PBD0@Z @ 158 NONAME ; class QString CntEditView::trUtf8(char const *, char const *)
-	??1CntViewNavigator@@UAE@XZ @ 159 NONAME ; CntViewNavigator::~CntViewNavigator(void)
-	?qt_metacast@CntMainWindow@@UAEPAXPBD@Z @ 160 NONAME ; void * CntMainWindow::qt_metacast(char const *)
-	?isDefault@CntBaseSelectionView@@UBE_NXZ @ 161 NONAME ; bool CntBaseSelectionView::isDefault(void) const
-	?back@CntViewNavigator@@QAEABHAAV?$QFlags@W4ViewSwitchFlag@Hb@@@@_N@Z @ 162 NONAME ; int const & CntViewNavigator::back(class QFlags<enum Hb::ViewSwitchFlag> &, bool)
-	?setEngine@CntContactCardView@@UAEXAAVCntAbstractEngine@@@Z @ 163 NONAME ; void CntContactCardView::setEngine(class CntAbstractEngine &)
-	??1CntBaseSelectionView@@UAE@XZ @ 164 NONAME ; CntBaseSelectionView::~CntBaseSelectionView(void)
-	?tr@CntMainWindow@@SA?AVQString@@PBD0H@Z @ 165 NONAME ; class QString CntMainWindow::tr(char const *, char const *, int)
-	?createPluginView@CntDefaultViewFactory@@AAEPAVCntAbstractView@@H@Z @ 166 NONAME ; class CntAbstractView * CntDefaultViewFactory::createPluginView(int)
-	??_ECntEditView@@UAE@I@Z @ 167 NONAME ; CntEditView::~CntEditView(unsigned int)
-	??0CntActionPopup@@QAE@PAVQContact@QtMobility@@@Z @ 168 NONAME ; CntActionPopup::CntActionPopup(class QtMobility::QContact *)
-	?backPressed@CntGroupMemberView@@IAEXXZ @ 169 NONAME ; void CntGroupMemberView::backPressed(void)
-	?executeContactAction@CntActionPopup@@IAEXAAVQContact@QtMobility@@VQContactDetail@3@VQString@@@Z @ 170 NONAME ; void CntActionPopup::executeContactAction(class QtMobility::QContact &, class QtMobility::QContactDetail, class QString)
-	?getStaticMetaObject@CntMainWindow@@SAABUQMetaObject@@XZ @ 171 NONAME ; struct QMetaObject const & CntMainWindow::getStaticMetaObject(void)
-	?eventFilter@CntKeyGrabber@@MAE_NPAVQObject@@PAVQEvent@@@Z @ 172 NONAME ; bool CntKeyGrabber::eventFilter(class QObject *, class QEvent *)
-	?qt_metacast@CntKeyGrabber@@UAEPAXPBD@Z @ 173 NONAME ; void * CntKeyGrabber::qt_metacast(char const *)
-	?tr@CntDefaultViewManager@@SA?AVQString@@PBD0@Z @ 174 NONAME ; class QString CntDefaultViewManager::tr(char const *, char const *)
-	?removeCurrentView@CntDefaultViewManager@@AAEXXZ @ 175 NONAME ; void CntDefaultViewManager::removeCurrentView(void)
+	?externalize@CntDefaultViewManager@@QBE?AVQString@@AAVQDataStream@@@Z @ 2 NONAME ; class QString CntDefaultViewManager::externalize(class QDataStream &) const
+	?activate@CntBaseSelectionView@@UAEXV?$QMap@HVQVariant@@@@@Z @ 3 NONAME ; void CntBaseSelectionView::activate(class QMap<int, class QVariant>)
+	?setViewNavigator@CntDefaultViewManager@@QAEXPAVCntViewNavigator@@@Z @ 4 NONAME ; void CntDefaultViewManager::setViewNavigator(class CntViewNavigator *)
+	?internalize@CntDefaultViewManager@@QAE_NAAVQDataStream@@@Z @ 5 NONAME ; bool CntDefaultViewManager::internalize(class QDataStream &)
+	?tr@CntActionPopup@@SA?AVQString@@PBD0@Z @ 6 NONAME ; class QString CntActionPopup::tr(char const *, char const *)
+	?cleanup@CntDefaultViewManager@@AAEXXZ @ 7 NONAME ; void CntDefaultViewManager::cleanup(void)
+	?externalize@CntEditView@@UAE?AVQString@@AAVQDataStream@@@Z @ 8 NONAME ; class QString CntEditView::externalize(class QDataStream &)
+	??1CntMainWindow@@UAE@XZ @ 9 NONAME ; CntMainWindow::~CntMainWindow(void)
+	?viewActivated@CntContactCardView@@IAEXPAVCntAbstractViewManager@@V?$QMap@HVQVariant@@@@@Z @ 10 NONAME ; void CntContactCardView::viewActivated(class CntAbstractViewManager *, class QMap<int, class QVariant>)
+	?view@CntEditView@@UBEPAVHbView@@XZ @ 11 NONAME ; class HbView * CntEditView::view(void) const
+	?qt_metacall@CntBaseSelectionView@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 12 NONAME ; int CntBaseSelectionView::qt_metacall(enum QMetaObject::Call, int, void * *)
+	?trUtf8@CntGroupMemberView@@SA?AVQString@@PBD0H@Z @ 13 NONAME ; class QString CntGroupMemberView::trUtf8(char const *, char const *, int)
+	?d_func@CntGroupMemberView@@AAEPAVCntGroupMemberViewPrivate@@XZ @ 14 NONAME ; class CntGroupMemberViewPrivate * CntGroupMemberView::d_func(void)
+	?tr@CntMainWindow@@SA?AVQString@@PBD0@Z @ 15 NONAME ; class QString CntMainWindow::tr(char const *, char const *)
+	?externalize@CntViewNavigator@@QAEXAAVQDataStream@@@Z @ 16 NONAME ; void CntViewNavigator::externalize(class QDataStream &)
+	?staticMetaObject@CntBaseSelectionView@@2UQMetaObject@@B @ 17 NONAME ; struct QMetaObject const CntBaseSelectionView::staticMetaObject
+	?d_func@CntEditView@@AAEPAVCntEditViewPrivate@@XZ @ 18 NONAME ; class CntEditViewPrivate * CntEditView::d_func(void)
+	?changesDiscarded@CntEditView@@IAEXXZ @ 19 NONAME ; void CntEditView::changesDiscarded(void)
+	?view@CntGroupMemberView@@UBEPAVHbView@@XZ @ 20 NONAME ; class HbView * CntGroupMemberView::view(void) const
+	??_ECntDefaultViewManager@@UAE@I@Z @ 21 NONAME ; CntDefaultViewManager::~CntDefaultViewManager(unsigned int)
+	??_ECntBaseSelectionView@@UAE@I@Z @ 22 NONAME ; CntBaseSelectionView::~CntBaseSelectionView(unsigned int)
+	?view@CntBaseSelectionView@@UBEPAVHbView@@XZ @ 23 NONAME ; class HbView * CntBaseSelectionView::view(void) const
+	??1CntDefaultViewFactory@@UAE@XZ @ 24 NONAME ; CntDefaultViewFactory::~CntDefaultViewFactory(void)
+	??_ECntDefaultViewFactory@@UAE@I@Z @ 25 NONAME ; CntDefaultViewFactory::~CntDefaultViewFactory(unsigned int)
+	?trUtf8@CntDefaultViewManager@@SA?AVQString@@PBD0H@Z @ 26 NONAME ; class QString CntDefaultViewManager::trUtf8(char const *, char const *, int)
+	?staticMetaObject@CntGroupMemberView@@2UQMetaObject@@B @ 27 NONAME ; struct QMetaObject const CntGroupMemberView::staticMetaObject
+	?qt_metacast@CntActionPopup@@UAEPAXPBD@Z @ 28 NONAME ; void * CntActionPopup::qt_metacast(char const *)
+	?deleteOldView@CntDefaultViewManager@@AAEXXZ @ 29 NONAME ; void CntDefaultViewManager::deleteOldView(void)
+	?trUtf8@CntMainWindow@@SA?AVQString@@PBD0H@Z @ 30 NONAME ; class QString CntMainWindow::trUtf8(char const *, char const *, int)
+	?trUtf8@CntEditView@@SA?AVQString@@PBD0H@Z @ 31 NONAME ; class QString CntEditView::trUtf8(char const *, char const *, int)
+	??1CntEditView@@UAE@XZ @ 32 NONAME ; CntEditView::~CntEditView(void)
+	?qt_metacast@CntBaseSelectionView@@UAEPAXPBD@Z @ 33 NONAME ; void * CntBaseSelectionView::qt_metacast(char const *)
+	?externalize@CntContactCardView@@UAE?AVQString@@AAVQDataStream@@@Z @ 34 NONAME ; class QString CntContactCardView::externalize(class QDataStream &)
+	?metaObject@CntBaseSelectionView@@UBEPBUQMetaObject@@XZ @ 35 NONAME ; struct QMetaObject const * CntBaseSelectionView::metaObject(void) const
+	?engine@CntDefaultViewManager@@QAEAAVCntAbstractEngine@@XZ @ 36 NONAME ; class CntAbstractEngine & CntDefaultViewManager::engine(void)
+	?back@CntDefaultViewManager@@UAEXV?$QMap@HVQVariant@@@@_N@Z @ 37 NONAME ; void CntDefaultViewManager::back(class QMap<int, class QVariant>, bool)
+	??0CntKeyGrabber@@QAE@PAVHbMainWindow@@PAVQObject@@@Z @ 38 NONAME ; CntKeyGrabber::CntKeyGrabber(class HbMainWindow *, class QObject *)
+	?qt_metacall@CntViewNavigator@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 39 NONAME ; int CntViewNavigator::qt_metacall(enum QMetaObject::Call, int, void * *)
+	?activate@CntContactCardView@@UAEXV?$QMap@HVQVariant@@@@@Z @ 40 NONAME ; void CntContactCardView::activate(class QMap<int, class QVariant>)
+	?tr@CntKeyGrabber@@SA?AVQString@@PBD0H@Z @ 41 NONAME ; class QString CntKeyGrabber::tr(char const *, char const *, int)
+	?tr@CntDefaultViewManager@@SA?AVQString@@PBD0H@Z @ 42 NONAME ; class QString CntDefaultViewManager::tr(char const *, char const *, int)
+	?viewId@CntEditView@@UBEHXZ @ 43 NONAME ; int CntEditView::viewId(void) const
+	??1CntGroupMemberView@@UAE@XZ @ 44 NONAME ; CntGroupMemberView::~CntGroupMemberView(void)
+	?tr@CntGroupMemberView@@SA?AVQString@@PBD0H@Z @ 45 NONAME ; class QString CntGroupMemberView::tr(char const *, char const *, int)
+	?qt_metacast@CntContactCardView@@UAEPAXPBD@Z @ 46 NONAME ; void * CntContactCardView::qt_metacast(char const *)
+	?viewClosed@CntBaseSelectionView@@IAEXXZ @ 47 NONAME ; void CntBaseSelectionView::viewClosed(void)
+	??1CntKeyGrabber@@UAE@XZ @ 48 NONAME ; CntKeyGrabber::~CntKeyGrabber(void)
+	?showActionPopup@CntActionPopup@@QAE_NVQString@@@Z @ 49 NONAME ; bool CntActionPopup::showActionPopup(class QString)
+	?trUtf8@CntActionPopup@@SA?AVQString@@PBD0@Z @ 50 NONAME ; class QString CntActionPopup::trUtf8(char const *, char const *)
+	?tr@CntBaseSelectionView@@SA?AVQString@@PBD0H@Z @ 51 NONAME ; class QString CntBaseSelectionView::tr(char const *, char const *, int)
+	?metaObject@CntContactCardView@@UBEPBUQMetaObject@@XZ @ 52 NONAME ; struct QMetaObject const * CntContactCardView::metaObject(void) const
+	??0CntViewNavigator@@QAE@PAVQObject@@@Z @ 53 NONAME ; CntViewNavigator::CntViewNavigator(class QObject *)
+	?d_func@CntContactCardView@@ABEPBVCntContactCardViewPrivate@@XZ @ 54 NONAME ; class CntContactCardViewPrivate const * CntContactCardView::d_func(void) const
+	?trUtf8@CntBaseSelectionView@@SA?AVQString@@PBD0H@Z @ 55 NONAME ; class QString CntBaseSelectionView::trUtf8(char const *, char const *, int)
+	?getStaticMetaObject@CntBaseSelectionView@@SAABUQMetaObject@@XZ @ 56 NONAME ; struct QMetaObject const & CntBaseSelectionView::getStaticMetaObject(void)
+	??0CntDefaultViewManager@@QAE@PAVHbMainWindow@@@Z @ 57 NONAME ; CntDefaultViewManager::CntDefaultViewManager(class HbMainWindow *)
+	??_ECntGroupMemberView@@UAE@I@Z @ 58 NONAME ; CntGroupMemberView::~CntGroupMemberView(unsigned int)
+	?actionPopupCancelPressed@CntActionPopup@@IAEXXZ @ 59 NONAME ; void CntActionPopup::actionPopupCancelPressed(void)
+	?getStaticMetaObject@CntActionPopup@@SAABUQMetaObject@@XZ @ 60 NONAME ; struct QMetaObject const & CntActionPopup::getStaticMetaObject(void)
+	?next@CntViewNavigator@@QAEXABHAAV?$QFlags@W4ViewSwitchFlag@Hb@@@@@Z @ 61 NONAME ; void CntViewNavigator::next(int const &, class QFlags<enum Hb::ViewSwitchFlag> &)
+	?createView@CntDefaultViewFactory@@UAEPAVCntAbstractView@@H@Z @ 62 NONAME ; class CntAbstractView * CntDefaultViewFactory::createView(int)
+	?viewId@CntGroupMemberView@@UBEHXZ @ 63 NONAME ; int CntGroupMemberView::viewId(void) const
+	?qt_metacast@CntEditView@@UAEPAXPBD@Z @ 64 NONAME ; void * CntEditView::qt_metacast(char const *)
+	??0CntContactCardView@@QAE@_N@Z @ 65 NONAME ; CntContactCardView::CntContactCardView(bool)
+	?contactRemoved@CntEditView@@IAEX_N@Z @ 66 NONAME ; void CntEditView::contactRemoved(bool)
+	?d_func@CntActionPopup@@ABEPBVCntActionPopupPrivate@@XZ @ 67 NONAME ; class CntActionPopupPrivate const * CntActionPopup::d_func(void) const
+	?trUtf8@CntContactCardView@@SA?AVQString@@PBD0@Z @ 68 NONAME ; class QString CntContactCardView::trUtf8(char const *, char const *)
+	?metaObject@CntActionPopup@@UBEPBUQMetaObject@@XZ @ 69 NONAME ; struct QMetaObject const * CntActionPopup::metaObject(void) const
+	?staticMetaObject@CntDefaultViewManager@@2UQMetaObject@@B @ 70 NONAME ; struct QMetaObject const CntDefaultViewManager::staticMetaObject
+	?removeException@CntViewNavigator@@QAEXABH@Z @ 71 NONAME ; void CntViewNavigator::removeException(int const &)
+	?trUtf8@CntViewNavigator@@SA?AVQString@@PBD0@Z @ 72 NONAME ; class QString CntViewNavigator::trUtf8(char const *, char const *)
+	?isDefault@CntGroupMemberView@@UBE_NXZ @ 73 NONAME ; bool CntGroupMemberView::isDefault(void) const
+	?getStaticMetaObject@CntKeyGrabber@@SAABUQMetaObject@@XZ @ 74 NONAME ; struct QMetaObject const & CntKeyGrabber::getStaticMetaObject(void)
+	?metaObject@CntMainWindow@@UBEPBUQMetaObject@@XZ @ 75 NONAME ; struct QMetaObject const * CntMainWindow::metaObject(void) const
+	??_ECntMainWindow@@UAE@I@Z @ 76 NONAME ; CntMainWindow::~CntMainWindow(unsigned int)
+	?metaObject@CntDefaultViewManager@@UBEPBUQMetaObject@@XZ @ 77 NONAME ; struct QMetaObject const * CntDefaultViewManager::metaObject(void) const
+	?internalize@CntContactCardView@@UAE_NAAVQDataStream@@AAV?$QMap@HVQVariant@@@@@Z @ 78 NONAME ; bool CntContactCardView::internalize(class QDataStream &, class QMap<int, class QVariant> &)
+	?changeView@CntDefaultViewManager@@UAEXV?$QMap@HVQVariant@@@@@Z @ 79 NONAME ; void CntDefaultViewManager::changeView(class QMap<int, class QVariant>)
+	?qt_metacast@CntGroupMemberView@@UAEPAXPBD@Z @ 80 NONAME ; void * CntGroupMemberView::qt_metacast(char const *)
+	??_ECntContactCardView@@UAE@I@Z @ 81 NONAME ; CntContactCardView::~CntContactCardView(unsigned int)
+	?staticMetaObject@CntViewNavigator@@2UQMetaObject@@B @ 82 NONAME ; struct QMetaObject const CntViewNavigator::staticMetaObject
+	?activate@CntEditView@@UAEXV?$QMap@HVQVariant@@@@@Z @ 83 NONAME ; void CntEditView::activate(class QMap<int, class QVariant>)
+	?qt_metacall@CntContactCardView@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 84 NONAME ; int CntContactCardView::qt_metacall(enum QMetaObject::Call, int, void * *)
+	?qt_metacall@CntMainWindow@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 85 NONAME ; int CntMainWindow::qt_metacall(enum QMetaObject::Call, int, void * *)
+	?trUtf8@CntMainWindow@@SA?AVQString@@PBD0@Z @ 86 NONAME ; class QString CntMainWindow::trUtf8(char const *, char const *)
+	?trUtf8@CntKeyGrabber@@SA?AVQString@@PBD0H@Z @ 87 NONAME ; class QString CntKeyGrabber::trUtf8(char const *, char const *, int)
+	?staticMetaObject@CntMainWindow@@2UQMetaObject@@B @ 88 NONAME ; struct QMetaObject const CntMainWindow::staticMetaObject
+	?saveActivity@CntMainWindow@@AAEXXZ @ 89 NONAME ; void CntMainWindow::saveActivity(void)
+	?isDefault@CntContactCardView@@UBE_NXZ @ 90 NONAME ; bool CntContactCardView::isDefault(void) const
+	??1CntContactCardView@@UAE@XZ @ 91 NONAME ; CntContactCardView::~CntContactCardView(void)
+	?trUtf8@CntGroupMemberView@@SA?AVQString@@PBD0@Z @ 92 NONAME ; class QString CntGroupMemberView::trUtf8(char const *, char const *)
+	?qt_metacall@CntActionPopup@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 93 NONAME ; int CntActionPopup::qt_metacall(enum QMetaObject::Call, int, void * *)
+	??0CntBaseSelectionView@@QAE@XZ @ 94 NONAME ; CntBaseSelectionView::CntBaseSelectionView(void)
+	?tr@CntKeyGrabber@@SA?AVQString@@PBD0@Z @ 95 NONAME ; class QString CntKeyGrabber::tr(char const *, char const *)
+	??0CntMainWindow@@QAE@PAVQWidget@@H@Z @ 96 NONAME ; CntMainWindow::CntMainWindow(class QWidget *, int)
+	?setEngine@CntGroupMemberView@@UAEXAAVCntAbstractEngine@@@Z @ 97 NONAME ; void CntGroupMemberView::setEngine(class CntAbstractEngine &)
+	??1CntActionPopup@@UAE@XZ @ 98 NONAME ; CntActionPopup::~CntActionPopup(void)
+	?viewId@CntContactCardView@@UBEHXZ @ 99 NONAME ; int CntContactCardView::viewId(void) const
+	?removeEffect@CntViewNavigator@@QAEXABH@Z @ 100 NONAME ; void CntViewNavigator::removeEffect(int const &)
+	?getStaticMetaObject@CntContactCardView@@SAABUQMetaObject@@XZ @ 101 NONAME ; struct QMetaObject const & CntContactCardView::getStaticMetaObject(void)
+	?staticMetaObject@CntEditView@@2UQMetaObject@@B @ 102 NONAME ; struct QMetaObject const CntEditView::staticMetaObject
+	?staticMetaObject@CntActionPopup@@2UQMetaObject@@B @ 103 NONAME ; struct QMetaObject const CntActionPopup::staticMetaObject
+	?staticMetaObject@CntKeyGrabber@@2UQMetaObject@@B @ 104 NONAME ; struct QMetaObject const CntKeyGrabber::staticMetaObject
+	?viewOpened@CntBaseSelectionView@@IAEXPAVCntAbstractViewManager@@V?$QMap@HVQVariant@@@@@Z @ 105 NONAME ; void CntBaseSelectionView::viewOpened(class CntAbstractViewManager *, class QMap<int, class QVariant>)
+	??0CntDefaultViewFactory@@QAE@AAVCntExtensionManager@@@Z @ 106 NONAME ; CntDefaultViewFactory::CntDefaultViewFactory(class CntExtensionManager &)
+	?setEngine@CntEditView@@UAEXAAVCntAbstractEngine@@@Z @ 107 NONAME ; void CntEditView::setEngine(class CntAbstractEngine &)
+	?backPressed@CntContactCardView@@IAEXH@Z @ 108 NONAME ; void CntContactCardView::backPressed(int)
+	?isDefault@CntEditView@@UBE_NXZ @ 109 NONAME ; bool CntEditView::isDefault(void) const
+	?qt_metacall@CntKeyGrabber@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 110 NONAME ; int CntKeyGrabber::qt_metacall(enum QMetaObject::Call, int, void * *)
+	??_ECntViewNavigator@@UAE@I@Z @ 111 NONAME ; CntViewNavigator::~CntViewNavigator(unsigned int)
+	?d_func@CntGroupMemberView@@ABEPBVCntGroupMemberViewPrivate@@XZ @ 112 NONAME ; class CntGroupMemberViewPrivate const * CntGroupMemberView::d_func(void) const
+	?trUtf8@CntContactCardView@@SA?AVQString@@PBD0H@Z @ 113 NONAME ; class QString CntContactCardView::trUtf8(char const *, char const *, int)
+	?metaObject@CntKeyGrabber@@UBEPBUQMetaObject@@XZ @ 114 NONAME ; struct QMetaObject const * CntKeyGrabber::metaObject(void) const
+	?addException@CntViewNavigator@@QAEXABH0@Z @ 115 NONAME ; void CntViewNavigator::addException(int const &, int const &)
+	?getStaticMetaObject@CntGroupMemberView@@SAABUQMetaObject@@XZ @ 116 NONAME ; struct QMetaObject const & CntGroupMemberView::getStaticMetaObject(void)
+	?closeApp@CntDefaultViewManager@@MAEXXZ @ 117 NONAME ; void CntDefaultViewManager::closeApp(void)
+	??0CntGroupMemberView@@QAE@XZ @ 118 NONAME ; CntGroupMemberView::CntGroupMemberView(void)
+	?deactivate@CntGroupMemberView@@UAEXXZ @ 119 NONAME ; void CntGroupMemberView::deactivate(void)
+	??_ECntKeyGrabber@@UAE@I@Z @ 120 NONAME ; CntKeyGrabber::~CntKeyGrabber(unsigned int)
+	?deactivate@CntBaseSelectionView@@UAEXXZ @ 121 NONAME ; void CntBaseSelectionView::deactivate(void)
+	?d_func@CntEditView@@ABEPBVCntEditViewPrivate@@XZ @ 122 NONAME ; class CntEditViewPrivate const * CntEditView::d_func(void) const
+	?setViewFactory@CntDefaultViewManager@@QAEXPAVCntAbstractViewFactory@@@Z @ 123 NONAME ; void CntDefaultViewManager::setViewFactory(class CntAbstractViewFactory *)
+	?trUtf8@CntActionPopup@@SA?AVQString@@PBD0H@Z @ 124 NONAME ; class QString CntActionPopup::trUtf8(char const *, char const *, int)
+	?tr@CntViewNavigator@@SA?AVQString@@PBD0@Z @ 125 NONAME ; class QString CntViewNavigator::tr(char const *, char const *)
+	?getStaticMetaObject@CntViewNavigator@@SAABUQMetaObject@@XZ @ 126 NONAME ; struct QMetaObject const & CntViewNavigator::getStaticMetaObject(void)
+	?tr@CntViewNavigator@@SA?AVQString@@PBD0H@Z @ 127 NONAME ; class QString CntViewNavigator::tr(char const *, char const *, int)
+	?tr@CntActionPopup@@SA?AVQString@@PBD0H@Z @ 128 NONAME ; class QString CntActionPopup::tr(char const *, char const *, int)
+	?qt_metacall@CntGroupMemberView@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 129 NONAME ; int CntGroupMemberView::qt_metacall(enum QMetaObject::Call, int, void * *)
+	?metaObject@CntGroupMemberView@@UBEPBUQMetaObject@@XZ @ 130 NONAME ; struct QMetaObject const * CntGroupMemberView::metaObject(void) const
+	?qt_metacast@CntDefaultViewManager@@UAEPAXPBD@Z @ 131 NONAME ; void * CntDefaultViewManager::qt_metacast(char const *)
+	?qt_metacall@CntDefaultViewManager@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 132 NONAME ; int CntDefaultViewManager::qt_metacall(enum QMetaObject::Call, int, void * *)
+	??0CntEditView@@QAE@XZ @ 133 NONAME ; CntEditView::CntEditView(void)
+	?qt_metacast@CntViewNavigator@@UAEPAXPBD@Z @ 134 NONAME ; void * CntViewNavigator::qt_metacast(char const *)
+	?view@CntContactCardView@@UBEPAVHbView@@XZ @ 135 NONAME ; class HbView * CntContactCardView::view(void) const
+	?addToContacts@CntContactCardView@@IAEXXZ @ 136 NONAME ; void CntContactCardView::addToContacts(void)
+	?setEngine@CntBaseSelectionView@@UAEXAAVCntAbstractEngine@@@Z @ 137 NONAME ; void CntBaseSelectionView::setEngine(class CntAbstractEngine &)
+	?tr@CntContactCardView@@SA?AVQString@@PBD0H@Z @ 138 NONAME ; class QString CntContactCardView::tr(char const *, char const *, int)
+	?addRoot@CntViewNavigator@@QAEXABH@Z @ 139 NONAME ; void CntViewNavigator::addRoot(int const &)
+	?tr@CntContactCardView@@SA?AVQString@@PBD0@Z @ 140 NONAME ; class QString CntContactCardView::tr(char const *, char const *)
+	?tr@CntEditView@@SA?AVQString@@PBD0@Z @ 141 NONAME ; class QString CntEditView::tr(char const *, char const *)
+	?d_func@CntContactCardView@@AAEPAVCntContactCardViewPrivate@@XZ @ 142 NONAME ; class CntContactCardViewPrivate * CntContactCardView::d_func(void)
+	?metaObject@CntViewNavigator@@UBEPBUQMetaObject@@XZ @ 143 NONAME ; struct QMetaObject const * CntViewNavigator::metaObject(void) const
+	?staticMetaObject@CntContactCardView@@2UQMetaObject@@B @ 144 NONAME ; struct QMetaObject const CntContactCardView::staticMetaObject
+	?activate@CntGroupMemberView@@UAEXV?$QMap@HVQVariant@@@@@Z @ 145 NONAME ; void CntGroupMemberView::activate(class QMap<int, class QVariant>)
+	?trUtf8@CntBaseSelectionView@@SA?AVQString@@PBD0@Z @ 146 NONAME ; class QString CntBaseSelectionView::trUtf8(char const *, char const *)
+	?tr@CntBaseSelectionView@@SA?AVQString@@PBD0@Z @ 147 NONAME ; class QString CntBaseSelectionView::tr(char const *, char const *)
+	?trUtf8@CntKeyGrabber@@SA?AVQString@@PBD0@Z @ 148 NONAME ; class QString CntKeyGrabber::trUtf8(char const *, char const *)
+	?switchView@CntDefaultViewManager@@AAEXV?$QMap@HVQVariant@@@@V?$QFlags@W4ViewSwitchFlag@Hb@@@@@Z @ 149 NONAME ; void CntDefaultViewManager::switchView(class QMap<int, class QVariant>, class QFlags<enum Hb::ViewSwitchFlag>)
+	?deactivate@CntEditView@@UAEXXZ @ 150 NONAME ; void CntEditView::deactivate(void)
+	?addEffect@CntViewNavigator@@QAEXABH0@Z @ 151 NONAME ; void CntViewNavigator::addEffect(int const &, int const &)
+	??_ECntActionPopup@@UAE@I@Z @ 152 NONAME ; CntActionPopup::~CntActionPopup(unsigned int)
+	?d_func@CntActionPopup@@AAEPAVCntActionPopupPrivate@@XZ @ 153 NONAME ; class CntActionPopupPrivate * CntActionPopup::d_func(void)
+	?metaObject@CntEditView@@UBEPBUQMetaObject@@XZ @ 154 NONAME ; struct QMetaObject const * CntEditView::metaObject(void) const
+	?contactUpdated@CntEditView@@IAEXH@Z @ 155 NONAME ; void CntEditView::contactUpdated(int)
+	??1CntDefaultViewManager@@UAE@XZ @ 156 NONAME ; CntDefaultViewManager::~CntDefaultViewManager(void)
+	?deactivate@CntContactCardView@@UAEXXZ @ 157 NONAME ; void CntContactCardView::deactivate(void)
+	?clearViewStack@CntViewNavigator@@QAEXXZ @ 158 NONAME ; void CntViewNavigator::clearViewStack(void)
+	?tr@CntGroupMemberView@@SA?AVQString@@PBD0@Z @ 159 NONAME ; class QString CntGroupMemberView::tr(char const *, char const *)
+	?getStaticMetaObject@CntDefaultViewManager@@SAABUQMetaObject@@XZ @ 160 NONAME ; struct QMetaObject const & CntDefaultViewManager::getStaticMetaObject(void)
+	?trUtf8@CntViewNavigator@@SA?AVQString@@PBD0H@Z @ 161 NONAME ; class QString CntViewNavigator::trUtf8(char const *, char const *, int)
+	?tr@CntEditView@@SA?AVQString@@PBD0H@Z @ 162 NONAME ; class QString CntEditView::tr(char const *, char const *, int)
+	?qt_metacall@CntEditView@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 163 NONAME ; int CntEditView::qt_metacall(enum QMetaObject::Call, int, void * *)
+	?internalize@CntEditView@@UAE_NAAVQDataStream@@AAV?$QMap@HVQVariant@@@@@Z @ 164 NONAME ; bool CntEditView::internalize(class QDataStream &, class QMap<int, class QVariant> &)
+	?getStaticMetaObject@CntEditView@@SAABUQMetaObject@@XZ @ 165 NONAME ; struct QMetaObject const & CntEditView::getStaticMetaObject(void)
+	?trUtf8@CntEditView@@SA?AVQString@@PBD0@Z @ 166 NONAME ; class QString CntEditView::trUtf8(char const *, char const *)
+	?activateView@CntDefaultViewManager@@AAEXPAVCntAbstractView@@V?$QMap@HVQVariant@@@@V?$QFlags@W4ViewSwitchFlag@Hb@@@@@Z @ 167 NONAME ; void CntDefaultViewManager::activateView(class CntAbstractView *, class QMap<int, class QVariant>, class QFlags<enum Hb::ViewSwitchFlag>)
+	??1CntViewNavigator@@UAE@XZ @ 168 NONAME ; CntViewNavigator::~CntViewNavigator(void)
+	?qt_metacast@CntMainWindow@@UAEPAXPBD@Z @ 169 NONAME ; void * CntMainWindow::qt_metacast(char const *)
+	?isDefault@CntBaseSelectionView@@UBE_NXZ @ 170 NONAME ; bool CntBaseSelectionView::isDefault(void) const
+	?back@CntViewNavigator@@QAEABHAAV?$QFlags@W4ViewSwitchFlag@Hb@@@@_N@Z @ 171 NONAME ; int const & CntViewNavigator::back(class QFlags<enum Hb::ViewSwitchFlag> &, bool)
+	?setEngine@CntContactCardView@@UAEXAAVCntAbstractEngine@@@Z @ 172 NONAME ; void CntContactCardView::setEngine(class CntAbstractEngine &)
+	??1CntBaseSelectionView@@UAE@XZ @ 173 NONAME ; CntBaseSelectionView::~CntBaseSelectionView(void)
+	?tr@CntMainWindow@@SA?AVQString@@PBD0H@Z @ 174 NONAME ; class QString CntMainWindow::tr(char const *, char const *, int)
+	?createPluginView@CntDefaultViewFactory@@AAEPAVCntAbstractView@@H@Z @ 175 NONAME ; class CntAbstractView * CntDefaultViewFactory::createPluginView(int)
+	??_ECntEditView@@UAE@I@Z @ 176 NONAME ; CntEditView::~CntEditView(unsigned int)
+	??0CntActionPopup@@QAE@PAVQContact@QtMobility@@@Z @ 177 NONAME ; CntActionPopup::CntActionPopup(class QtMobility::QContact *)
+	?backPressed@CntGroupMemberView@@IAEXXZ @ 178 NONAME ; void CntGroupMemberView::backPressed(void)
+	?executeContactAction@CntActionPopup@@IAEXAAVQContact@QtMobility@@VQContactDetail@3@VQString@@@Z @ 179 NONAME ; void CntActionPopup::executeContactAction(class QtMobility::QContact &, class QtMobility::QContactDetail, class QString)
+	?getStaticMetaObject@CntMainWindow@@SAABUQMetaObject@@XZ @ 180 NONAME ; struct QMetaObject const & CntMainWindow::getStaticMetaObject(void)
+	?eventFilter@CntKeyGrabber@@MAE_NPAVQObject@@PAVQEvent@@@Z @ 181 NONAME ; bool CntKeyGrabber::eventFilter(class QObject *, class QEvent *)
+	?qt_metacast@CntKeyGrabber@@UAEPAXPBD@Z @ 182 NONAME ; void * CntKeyGrabber::qt_metacast(char const *)
+	?tr@CntDefaultViewManager@@SA?AVQString@@PBD0@Z @ 183 NONAME ; class QString CntDefaultViewManager::tr(char const *, char const *)
+	?internalize@CntViewNavigator@@QAEHAAVQDataStream@@@Z @ 184 NONAME ; int CntViewNavigator::internalize(class QDataStream &)
+	?removeCurrentView@CntDefaultViewManager@@AAEXXZ @ 185 NONAME ; void CntDefaultViewManager::removeCurrentView(void)
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/bwins/cntlistmodelu.def	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,39 @@
+EXPORTS
+	?updateRelationships@CntListModel@@AAEXXZ @ 1 NONAME ; void CntListModel::updateRelationships(void)
+	?handleRemovedRelationship@CntListModel@@AAEXABV?$QList@I@@@Z @ 2 NONAME ; void CntListModel::handleRemovedRelationship(class QList<unsigned int> const &)
+	?refreshModel@CntListModel@@AAEXXZ @ 3 NONAME ; void CntListModel::refreshModel(void)
+	?contact@CntListModel@@QBE?AVQContact@QtMobility@@ABVQModelIndex@@@Z @ 4 NONAME ; class QtMobility::QContact CntListModel::contact(class QModelIndex const &) const
+	?updateContactIdsArray@CntListModel@@AAEXXZ @ 5 NONAME ; void CntListModel::updateContactIdsArray(void)
+	?qt_metacall@CntListModel@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 6 NONAME ; int CntListModel::qt_metacall(enum QMetaObject::Call, int, void * *)
+	?setFilter@CntListModel@@QAEXABVQContactFilter@QtMobility@@@Z @ 7 NONAME ; void CntListModel::setFilter(class QtMobility::QContactFilter const &)
+	?row@CntListModel@@ABEHABI@Z @ 8 NONAME ; int CntListModel::row(unsigned int const &) const
+	?indexOfContact@CntListModel@@QBE?AVQModelIndex@@ABVQContact@QtMobility@@@Z @ 9 NONAME ; class QModelIndex CntListModel::indexOfContact(class QtMobility::QContact const &) const
+	?handleContactInfoUpdated@CntListModel@@AAEXI@Z @ 10 NONAME ; void CntListModel::handleContactInfoUpdated(unsigned int)
+	?staticMetaObject@CntListModel@@2UQMetaObject@@B @ 11 NONAME ; struct QMetaObject const CntListModel::staticMetaObject
+	?showMyCard@CntListModel@@QAEX_N@Z @ 12 NONAME ; void CntListModel::showMyCard(bool)
+	?contact@CntListModel@@ABE?AVQContact@QtMobility@@H@Z @ 13 NONAME ; class QtMobility::QContact CntListModel::contact(int) const
+	??_ECntListModel@@UAE@I@Z @ 14 NONAME ; CntListModel::~CntListModel(unsigned int)
+	?handleAddedRelationship@CntListModel@@AAEXABV?$QList@I@@@Z @ 15 NONAME ; void CntListModel::handleAddedRelationship(class QList<unsigned int> const &)
+	?rowCount@CntListModel@@UBEHABVQModelIndex@@@Z @ 16 NONAME ; int CntListModel::rowCount(class QModelIndex const &) const
+	?isValidRow@CntListModel@@ABE_NH@Z @ 17 NONAME ; bool CntListModel::isValidRow(int) const
+	?trUtf8@CntListModel@@SA?AVQString@@PBD0H@Z @ 18 NONAME ; class QString CntListModel::trUtf8(char const *, char const *, int)
+	?metaObject@CntListModel@@UBEPBUQMetaObject@@XZ @ 19 NONAME ; struct QMetaObject const * CntListModel::metaObject(void) const
+	?myCardId@CntListModel@@QBEIXZ @ 20 NONAME ; unsigned int CntListModel::myCardId(void) const
+	?contactId@CntListModel@@QBEIABVQModelIndex@@@Z @ 21 NONAME ; unsigned int CntListModel::contactId(class QModelIndex const &) const
+	??0CntListModel@@QAE@PAVQContactManager@QtMobility@@ABVQContactFilter@2@_NPAVQObject@@@Z @ 22 NONAME ; CntListModel::CntListModel(class QtMobility::QContactManager *, class QtMobility::QContactFilter const &, bool, class QObject *)
+	?handleRemoved@CntListModel@@AAEXABV?$QList@I@@@Z @ 23 NONAME ; void CntListModel::handleRemoved(class QList<unsigned int> const &)
+	?tr@CntListModel@@SA?AVQString@@PBD0@Z @ 24 NONAME ; class QString CntListModel::tr(char const *, char const *)
+	?handleChanged@CntListModel@@AAEXABV?$QList@I@@@Z @ 25 NONAME ; void CntListModel::handleChanged(class QList<unsigned int> const &)
+	?getStaticMetaObject@CntListModel@@SAABUQMetaObject@@XZ @ 26 NONAME ; struct QMetaObject const & CntListModel::getStaticMetaObject(void)
+	?indexOfContactId@CntListModel@@QBE?AVQModelIndex@@ABI@Z @ 27 NONAME ; class QModelIndex CntListModel::indexOfContactId(unsigned int const &) const
+	?data@CntListModel@@UBE?AVQVariant@@ABVQModelIndex@@H@Z @ 28 NONAME ; class QVariant CntListModel::data(class QModelIndex const &, int) const
+	?handleRowSettingChanged@CntListModel@@AAEXABVXQSettingsKey@@ABVQVariant@@@Z @ 29 NONAME ; void CntListModel::handleRowSettingChanged(class XQSettingsKey const &, class QVariant const &)
+	?handleAdded@CntListModel@@AAEXABV?$QList@I@@@Z @ 30 NONAME ; void CntListModel::handleAdded(class QList<unsigned int> const &)
+	?trUtf8@CntListModel@@SA?AVQString@@PBD0@Z @ 31 NONAME ; class QString CntListModel::trUtf8(char const *, char const *)
+	??1CntListModel@@UAE@XZ @ 32 NONAME ; CntListModel::~CntListModel(void)
+	?tr@CntListModel@@SA?AVQString@@PBD0H@Z @ 33 NONAME ; class QString CntListModel::tr(char const *, char const *, int)
+	?dataForRole@CntListModel@@ABE?AVQVariant@@HH@Z @ 34 NONAME ; class QVariant CntListModel::dataForRole(int, int) const
+	?isMyCardShown@CntListModel@@QBE_NXZ @ 35 NONAME ; bool CntListModel::isMyCardShown(void) const
+	?handleMyCardChanged@CntListModel@@AAEXABI0@Z @ 36 NONAME ; void CntListModel::handleMyCardChanged(unsigned int const &, unsigned int const &)
+	?qt_metacast@CntListModel@@UAEPAXPBD@Z @ 37 NONAME ; void * CntListModel::qt_metacast(char const *)
+
--- a/phonebookui/cntcommonui/cntcommonui.pro	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/cntcommonui.pro	Fri Oct 15 12:24:46 2010 +0300
@@ -27,11 +27,11 @@
 DEPENDPATH += .
 INCLUDEPATH += .
 INCLUDEPATH += ../../inc
-INCLUDEPATH += ../../phonebookengines/cntlistmodel/inc
 INCLUDEPATH += ../../phonebookengines/cntimageutility/inc
 INCLUDEPATH += ../../phonebookengines/cntsimutility/inc
 INCLUDEPATH += ../phonebookapp/inc
-INCLUDEPATH += ../cnthistorymodel/inc
+INCLUDEPATH += ../cntlistmodel
+INCLUDEPATH += ../cnthistorymodel
 
 INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
 
@@ -68,6 +68,7 @@
 
 # Input
 HEADERS += ../../inc/cntdebug.h \
+    core/cntactivities.h \
     core/cntabstractviewfactory.h \
     core/cntdefaultengine.h \
     core/cntdefaultviewmanager.h \ 
@@ -135,6 +136,7 @@
     views/cntbaseselectionview.h \
     views/cnthistoryview.h \
     views/cnthistoryviewitem.h \
+    views/cnthistoryviewitemwidget.h \
     views/cntimageeditorview.h \
     views/cntimportsview.h \
     views/cntimportviewcallback.h \ 
@@ -143,13 +145,16 @@
     views/cntnamesview_p.h \
     views/cntsettingsmodel.h \
     views/cntsettingsview.h \
+    views/cntpinchgrabber.h \
+    views/cntnamesviewitem.h \
     widgets/cntactionpopup.h \
     widgets/cntactionpopup_p.h \   
     widgets/cntfetchcontactpopup.h \
     widgets/cntfetchmarkall.h \
     widgets/cntimagelabel.h      
 
-SOURCES += core/cntdefaultengine.cpp \
+SOURCES += core/cntactivities.cpp \
+    core/cntdefaultengine.cpp \
     core/cntdefaultviewfactory.cpp \
     core/cntdefaultviewmanager.cpp \ 
     core/cntextensionmanager.cpp \
@@ -214,6 +219,7 @@
     views/cntbaseselectionview.cpp \
     views/cnthistoryview.cpp \
     views/cnthistoryviewitem.cpp \
+    views/cnthistoryviewitemwidget.cpp \
     views/cntimageeditorview.cpp \
     views/cntimportsview.cpp \
     views/cntmycardview.cpp \
@@ -221,6 +227,8 @@
     views/cntnamesview_p.cpp \
     views/cntsettingsmodel.cpp \
     views/cntsettingsview.cpp \   
+    views/cntpinchgrabber.cpp \
+    views/cntnamesviewitem.cpp \
     widgets/cntactionpopup_p.cpp \
     widgets/cntactionpopup.cpp \
     widgets/cntfetchcontactpopup.cpp \
@@ -270,4 +278,5 @@
     "$${LITERAL_HASH}else" \
     "DEFFILE ../bwins/cntcommonui.def" \
     "$${LITERAL_HASH}endif"
-MMP_RULES += defBlock
\ No newline at end of file
+MMP_RULES += defBlock
+symbian:MMP_RULES += SMPSAFE
\ No newline at end of file
--- a/phonebookui/cntcommonui/collections/cntcollectionlistmodelworker.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/collections/cntcollectionlistmodelworker.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -233,9 +233,8 @@
         for(int i = 0;i < groupMemberIds.count();i++)
         {
             QContactFetchHint nameOnlyFetchHint;
-            /*QStringList details;
-            details << QContactDisplayLabel::DefinitionName;
-            nameOnlyFetchHint.setDetailDefinitionsHint(details);*/
+            QStringList details(QContactDisplayLabel::DefinitionName);
+            nameOnlyFetchHint.setDetailDefinitionsHint(details);
             nameOnlyFetchHint.setOptimizationHints(QContactFetchHint::NoRelationships);
 
             QContact contact = mManager->contact(groupMemberIds.at(i), nameOnlyFetchHint);
--- a/phonebookui/cntcommonui/collections/cntcollectionview.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/collections/cntcollectionview.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -48,6 +48,7 @@
 #include <QList>
 
 const char *CNT_COLLECTIONVIEW_XML = ":/xml/contacts_collections.docml";
+const QString CNT_ACTIVITY_MAINVIEW = "ContactsMainView";
 
 /*!
 
@@ -193,6 +194,22 @@
     CNT_EXIT
 }
 
+QString CntCollectionView::externalize(QDataStream &stream)
+{
+    CntViewParameters viewParameters;
+    viewParameters.insert(EViewId, viewId());
+  
+    stream << viewParameters;
+    
+    return CNT_ACTIVITY_MAINVIEW;
+}
+
+bool CntCollectionView::internalize(QDataStream &stream, CntViewParameters &viewParameters)
+{
+    stream >> viewParameters;
+    return true;
+}
+
 void CntCollectionView::deactivate()
 {
 
@@ -308,7 +325,7 @@
 
         if (id != favoriteGrpId)
         {
-            HbAction* deleteAction = menu->addAction(hbTrId("txt_phob_menu_delete_group"));
+            HbAction* deleteAction = menu->addAction(hbTrId("txt_common_menu_delete"));
             deleteAction->setData( data );
         }
         menu->open(this, SLOT(handleMenu(HbAction*)));
@@ -414,7 +431,7 @@
        else
        {
             CntFetchContactPopup* popup = CntFetchContactPopup::createMultiSelectionPopup(
-                    HbParameterLengthLimiter(hbTrId("txt_phob_title_members_of_1_group")).arg(groupNameCreated),
+                    HbParameterLengthLimiter("txt_phob_title_members_of_1_group").arg(groupNameCreated),
                     hbTrId("txt_common_button_save"),
                     mEngine->contactManager(SYMBIAN_BACKEND));
             connect( popup, SIGNAL(fetchReady(QSet<QContactLocalId>)), this, SLOT(handleNewGroupMembers(QSet<QContactLocalId>)) );
@@ -464,7 +481,7 @@
             groupNameCreated = hbTrId("txt_phob_list_unnamed");
         }
         HbDeviceNotificationDialog::notification(QString(), 
-                HbParameterLengthLimiter(hbTrId("txt_phob_dpophead_new_group_1_created")).arg(groupNameCreated));
+                HbParameterLengthLimiter("txt_phob_dpophead_new_group_1_created").arg(groupNameCreated));
 
         delete mHandledContact;
         mHandledContact = NULL;
@@ -493,7 +510,7 @@
     }
 
     HbLabel *headingLabel = new HbLabel();
-    headingLabel->setPlainText(HbParameterLengthLimiter(hbTrId("txt_phob_dialog_delete_1_group")).arg(name));
+    headingLabel->setPlainText(HbParameterLengthLimiter("txt_phob_dialog_delete_1_group").arg(name));
           
     HbMessageBox::question(hbTrId("txt_phob_dialog_only_group_will_be_removed_contac")
             , this, SLOT(handleDeleteGroup(int)), HbMessageBox::Delete | HbMessageBox::Cancel,
@@ -502,7 +519,7 @@
 
 void CntCollectionView::handleDeleteGroup(int action)
 {
-    if (action == HbMessageBox::Delete)
+    if (action == HbMessageBox::Delete && mHandledContact != NULL)
     {
         getContactManager()->removeContact(mHandledContact->localId());
     }
--- a/phonebookui/cntcommonui/collections/cntcollectionview.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/collections/cntcollectionview.h	Fri Oct 15 12:24:46 2010 +0300
@@ -51,6 +51,8 @@
     HbView* view() const { return mView; }
     int viewId() const { return collectionView; }
     inline void setEngine( CntAbstractEngine& aEngine ){mEngine = &aEngine;}
+    QString externalize(QDataStream &stream);
+    bool internalize(QDataStream &stream, CntViewParameters &viewParameters);
     
 public: // From CntExtensionGroupCallback
     void openView(CntViewParameters& viewParams);
--- a/phonebookui/cntcommonui/collections/cntfavoritesview.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/collections/cntfavoritesview.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -71,9 +71,9 @@
     mContact = new QContact(aArgs.value(ESelectedGroupContact).value<QContact>());
     mViewManager = &mEngine->viewManager();
 
-    HbPushButton *addButton = static_cast<HbPushButton*>(mDocumentLoader.findWidget(QString("cnt_button_add")));
-    connect(addButton, SIGNAL(clicked()), this, SLOT(openSelectionPopup()));
-    connect(addButton, SIGNAL(longPress(QPointF)), this, SLOT(openSelectionPopup()));
+    mAddButton = static_cast<HbPushButton*>(mDocumentLoader.findWidget(QString("cnt_button_add")));
+    connect(mAddButton, SIGNAL(released()), this, SLOT(openSelectionPopup()));
+    
     
     // If no contacts are present, then disable the button 
     QContactDetailFilter filter;
@@ -83,7 +83,7 @@
     QList<QContactLocalId> contactIds = getContactManager()->contactIds(filter);   
     if (contactIds.isEmpty())
     {
-        addButton->setEnabled(false); 
+        mAddButton->setEnabled(false); 
     }
     
 }
@@ -94,15 +94,18 @@
 
 void CntFavoritesView::openSelectionPopup()
 {
-    CntFetchContactPopup* popup = CntFetchContactPopup::createMultiSelectionPopup(
-            hbTrId("txt_phob_title_favorite_contacts"), 
-            hbTrId("txt_common_button_save"),
-            *getContactManager());
-    connect(popup, SIGNAL(fetchReady(QSet<QContactLocalId>)), 
-            this, SLOT(handleMemberSelection(QSet<QContactLocalId>)));
-    QSet<QContactLocalId> ids;
-    popup->setSelectedContacts(ids);
-    popup->showPopup();
+    if(mAddButton->isUnderMouse())
+    {
+        CntFetchContactPopup* popup = CntFetchContactPopup::createMultiSelectionPopup(
+                hbTrId("txt_phob_title_favorite_contacts"), 
+                hbTrId("txt_common_button_save"),
+                *getContactManager());
+        connect(popup, SIGNAL(fetchReady(QSet<QContactLocalId>)), 
+                this, SLOT(handleMemberSelection(QSet<QContactLocalId>)));
+        QSet<QContactLocalId> ids;
+        popup->setSelectedContacts(ids);
+        popup->showPopup(); 
+    }
 }
 
 void CntFavoritesView::handleMemberSelection( QSet<QContactLocalId> aIds )
--- a/phonebookui/cntcommonui/collections/cntfavoritesview.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/collections/cntfavoritesview.h	Fri Oct 15 12:24:46 2010 +0300
@@ -25,6 +25,7 @@
 
 class HbAction;
 class HbView;
+class HbPushButton;
 
 QTM_BEGIN_NAMESPACE
 class QContact;
@@ -70,6 +71,7 @@
     CntAbstractViewManager* mViewManager;
     HbDocumentLoader mDocumentLoader;
     CntAbstractEngine* mEngine;
+    HbPushButton *mAddButton;
 };
 
 #endif // CNTFAVORITESVIEW_H
--- a/phonebookui/cntcommonui/collections/cntgroupactionsview.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/collections/cntgroupactionsview.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -173,10 +173,10 @@
     mListView->setModel(mModel);
     mListView->setSelectionMode(HbAbstractItemView::NoSelection);
     
-    connect(mListView, SIGNAL(activated(const QModelIndex&)),
-                this, SLOT(listItemSelected(const QModelIndex&)));
+    connect( mListView, SIGNAL(activated(const QModelIndex&)), this, SLOT(listItemSelected(const QModelIndex&)));
     
-    connect( mListView, SIGNAL(longPressed(HbAbstractViewItem*,const QPointF&)), this, SLOT(onLongPressed(HbAbstractViewItem*,const QPointF&)) );
+    //This is to make long press act like short presswhen no tap menu  
+    mListView->setLongPressEnabled(false); 
     
     HbMainWindow* window = mView->mainWindow();
     if (window)
@@ -202,13 +202,6 @@
     mModel->appendRow(items);
 }
 
-void CntGroupActionsView::onLongPressed(HbAbstractViewItem *item, const QPointF &coords)
-{
-    Q_UNUSED(coords);
-    QModelIndex index = item->modelIndex();
-    listItemSelected(index);
-}
-
 void CntGroupActionsView::listItemSelected(const QModelIndex &index)
 {
     if (index.isValid()) {
@@ -245,7 +238,7 @@
                     }
                     else {
                         QContactEmailAddress email = contact.detail<QContactEmailAddress>();
-                        mEmailActionParams.append(email.emailAddress());
+                        mEmailActionParams.insert(email.emailAddress(),QVariant(contact.displayLabel()));
                     }
                 }
                 else {
@@ -294,16 +287,9 @@
     else if (action.compare("email", Qt::CaseInsensitive) == 0)
     {
         QContactEmailAddress email = static_cast<QContactEmailAddress>(detail);
-        mEmailActionParams.append(email.emailAddress());
+        mEmailActionParams.insert(email.emailAddress(),QVariant(contact.displayLabel()));
     }
-    
-    if (contact.preferredDetail(action).isEmpty())
-    {
-        contact.setPreferredDetail(action, detail);
-       //return value will be ignored because we cannot do anything if it fails.
-       mEngine->contactManager(SYMBIAN_BACKEND).saveContact(&contact);
-    }
-    
+   
     //actionpopup executed, decrement counter
     mPopupCount--;
     if (mPopupCount==0)
--- a/phonebookui/cntcommonui/collections/cntgroupactionsview.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/collections/cntgroupactionsview.h	Fri Oct 15 12:24:46 2010 +0300
@@ -70,7 +70,6 @@
     void actionExecuted(CntActionLauncher* aAction);
     void actionCancelled();
     void executeConferenceCallAction(QContact& aContact, const QContactDetail& aDetail, const QString& aAction);
-    void onLongPressed (HbAbstractViewItem *item, const QPointF &coords);
 
 #ifdef PBK_UNIT_TEST
 public:
@@ -96,7 +95,7 @@
     HbAction*                   mSoftkey; // owned by view
     HbListView*                 mListView; // owned by layout
     int                         mPopupCount;
-    QStringList                 mEmailActionParams;
+    QVariantMap                 mEmailActionParams;
     QVariantMap                 mMessageActionParams;
     bool                        mIsExecutingAction;
     
--- a/phonebookui/cntcommonui/collections/cntgroupdeletepopup.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/collections/cntgroupdeletepopup.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -18,7 +18,6 @@
 #include "cntgroupdeletepopup.h"
 #include <cntabstractengine.h>
 #include "cntglobal.h"
-#include <hblabel.h>
 #include <hbaction.h>
 #include <hblistview.h>
 #include <hblistviewitem.h>
@@ -28,7 +27,8 @@
 CntGroupDeletePopup::CntGroupDeletePopup(CntAbstractEngine *aEngine, QGraphicsItem *parent):
     HbSelectionDialog(parent),
     mContactManager( &aEngine->contactManager(SYMBIAN_BACKEND) ),
-    mModel(0)
+    mModel(NULL),
+    mPrimaryAction(NULL)
 {
     mModel = new CntGroupDeletePopupModel(aEngine, this);
 }
@@ -41,20 +41,21 @@
 
 void CntGroupDeletePopup::populateListOfGroup()
 {
-    HbLabel *headingLabel = new HbLabel(this);   
-    headingLabel->setPlainText(hbTrId("txt_phob_opt_delete_groups"));
-    
-    setHeadingWidget(headingLabel);
+    setHeadingText(hbTrId("txt_phob_opt_delete_groups"));
 
     setSelectionMode( HbAbstractItemView::MultiSelection );
     mModel->initializeGroupsList();
     setModel(mModel);
     clearActions(); 
-    HbAction *mPrimaryAction = new HbAction(hbTrId("txt_phob_button_delete_selected"), this);
+    mPrimaryAction = new HbAction(hbTrId("txt_phob_button_delete_selected"), this);
     addAction(mPrimaryAction);
+    mPrimaryAction->setEnabled(false);
     
-    HbAction *mSecondaryAction = new HbAction(hbTrId("txt_common_button_cancel"), this);
-    addAction(mSecondaryAction);
+    connect(this , SIGNAL(selectionChanged()), this, SLOT(checkPrimaryAction()));    
+    QModelIndexList indexes = selectedModelIndexes();
+        
+    HbAction *secondaryAction = new HbAction(hbTrId("txt_common_button_cancel"), this);
+    addAction(secondaryAction);
     
     setTimeout(HbDialog::NoTimeout);
     setDismissPolicy(HbDialog::NoDismiss);
@@ -82,3 +83,17 @@
     
     return selectionList;
 }
+
+void CntGroupDeletePopup::checkPrimaryAction()
+{
+    QModelIndexList indexes = selectedModelIndexes();
+    if (indexes.count())
+    {
+        mPrimaryAction->setEnabled(true);
+    }
+    else 
+    {
+        mPrimaryAction->setEnabled(false);
+    }
+
+}
--- a/phonebookui/cntcommonui/collections/cntgroupdeletepopup.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/collections/cntgroupdeletepopup.h	Fri Oct 15 12:24:46 2010 +0300
@@ -44,10 +44,15 @@
 
     void populateListOfGroup();
     QList<QContactLocalId> deleteGroup() const;
+    
+public slots:
+
+    void checkPrimaryAction();
 
 private:
     QContactManager          *mContactManager;
     CntGroupDeletePopupModel *mModel;  
+    HbAction                 *mPrimaryAction;
 };
 
 #endif // CNTGROUPDELETEPOPUP_H
--- a/phonebookui/cntcommonui/collections/cntgroupeditormodel.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/collections/cntgroupeditormodel.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -78,7 +78,7 @@
         mContact->removeDetail( &iGroupName );
     }
 
-    if(iGroupConfCallNumber.number().isEmpty())
+    if (iGroupConfCallNumber.number().isEmpty())
     {
         mContact->removeDetail( &iGroupConfCallNumber );
     }
--- a/phonebookui/cntcommonui/collections/cntgroupmemberview_p.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/collections/cntgroupmemberview_p.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -145,6 +145,7 @@
 void CntGroupMemberViewPrivate::activate( const CntViewParameters aArgs )
 {
     mArgs = aArgs;
+    mArgs.remove( ESelectedContact );
     mViewManager = &mEngine->viewManager();
     mThumbnailManager = &mEngine->thumbnailManager();
 
@@ -214,7 +215,7 @@
     if (mArgs.value(ESelectedAction).toString() == CNT_SAVE_ACTION)
     {
         QString name = getContactManager()->synthesizedContactDisplayLabel(*mGroupContact);
-        HbNotificationDialog::launchDialog(HbParameterLengthLimiter(hbTrId("txt_phob_dpophead_new_group_1_created").arg(name)));
+        HbNotificationDialog::launchDialog(HbParameterLengthLimiter("txt_phob_dpophead_new_group_1_created").arg(name));
     }
     decideActionButtonContext();
 }
@@ -229,12 +230,10 @@
     
     emit q->backPressed();
     
-    //save the contact if avatar has been changed.
-    QContact contact = getContactManager()->contact(mGroupContact->localId());
-    if ( contact != *mGroupContact )
-    {
-        getContactManager()->saveContact(mGroupContact);
-    }
+    // SaveManager not used here.
+    // SaveManager checks for detail count and removes if contact empty.
+    getContactManager()->saveContact(mGroupContact);
+    
     mViewManager->back(mArgs);
 }
 
@@ -265,7 +264,7 @@
     }
     
     CntFetchContactPopup* popup = CntFetchContactPopup::createMultiSelectionPopup(
-            HbParameterLengthLimiter(hbTrId("txt_phob_title_members_of_1_group")).arg(groupName),
+            HbParameterLengthLimiter("txt_phob_title_members_of_1_group").arg(groupName),
             hbTrId("txt_common_button_save"),
             mEngine->contactManager(SYMBIAN_BACKEND));
     connect( popup, SIGNAL(fetchReady(QSet<QContactLocalId>)),this, SLOT(handleManageMembers(QSet<QContactLocalId>)) );
@@ -327,7 +326,7 @@
     }
     
     HbLabel *headingLabel = new HbLabel();
-    headingLabel->setPlainText(HbParameterLengthLimiter(hbTrId("txt_phob_dialog_delete_1_group")).arg(groupName));
+    headingLabel->setPlainText(HbParameterLengthLimiter("txt_phob_dialog_delete_1_group").arg(groupName));
     
     HbMessageBox::question(hbTrId("txt_phob_dialog_only_group_will_be_removed_contac"), this, SLOT(handleDeleteGroup(int)),
             HbMessageBox::Delete | HbMessageBox::Cancel, headingLabel);
--- a/phonebookui/cntcommonui/common/cntactionlauncher.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/common/cntactionlauncher.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -19,63 +19,73 @@
 /*!
 Action launcher. Caller should delete the instance.
 */
-CntActionLauncher::CntActionLauncher( QContactManager& aContactManager, QString aAction ) : QObject(),
-mAction( aAction ),
-mContactAction( NULL ),
-mContactManager( &aContactManager )
+CntActionLauncher::CntActionLauncher( QContactManager& aContactManager, QString aAction ) :
+    QObject(),
+    mAction( aAction ),
+    mContactAction( NULL ),
+    mContactManager( &aContactManager )
+{
+    
+}
+
+CntActionLauncher::~CntActionLauncher()
+{
+    delete mContactAction;
+}
+    
+bool CntActionLauncher::execute( QContact aContact, QContactDetail aDetail )
+{
+    bool executed = false;
+    QList<QContactActionDescriptor> all = QContactAction::actionDescriptors(mAction, "symbian");
+    if ( all.count() )
     {
+        mContactAction = QContactAction::action( all.first() );
+        
+        if (mContactAction)
+        {
+            if (aContact.preferredDetail(mAction).isEmpty() && (mAction == "call"))
+            {
+                aContact.setPreferredDetail(mAction, aDetail);
+                //return value will be ignored because we cannot do anything if it fails.
+                mContactManager->saveContact(&aContact);
+            }
+
+            connect(mContactAction, SIGNAL(stateChanged(QContactAction::State)),
+                    this, SLOT(progress(QContactAction::State)));
+            executed = mContactAction->invokeAction( aContact, aDetail );
+        }
+        else
+        {
+            progress(QContactAction::FinishedWithErrorState);
+        }
+    }
+    else
+    {
+        progress(QContactAction::FinishedWithErrorState);
     }
 
-CntActionLauncher::~CntActionLauncher()
-    {
-    delete mContactAction;
-    }
-    
-bool CntActionLauncher::execute( QContact aContact, QContactDetail aDetail )
-    {
+    return executed;
+}
+
+bool CntActionLauncher::execute( QContact aGrpContact, QContactDetail aDetail, QVariantMap aParameters )
+{
     bool executed = false;
     QList<QContactActionDescriptor> all = QContactAction::actionDescriptors(mAction, "symbian");
     mContactAction = QContactAction::action( all.first() );
     if ( mContactAction )
-        {
-        if (aContact.preferredDetail(mAction).isEmpty() && (mAction == "call" || mAction == "message" || mAction == "email"))
-            {
-            aContact.setPreferredDetail(mAction, aDetail);
-            //return value will be ignored because we cannot do anything if it fails.
-            mContactManager->saveContact(&aContact);
-            }
-        
-        connect(mContactAction, SIGNAL(stateChanged(QContactAction::State)),
-                this, SLOT(progress(QContactAction::State)));
-        executed = mContactAction->invokeAction( aContact, aDetail );
-        }
-    else
-        {
-        progress(QContactAction::FinishedWithErrorState);
-        }
-    
-    return executed;
-    }
-
-bool CntActionLauncher::execute( QContact aGrpContact, QContactDetail aDetail, QVariantMap aParameters )
     {
-    bool executed = false;
-    QList<QContactActionDescriptor> all = QContactAction::actionDescriptors(mAction, "symbian");
-    mContactAction = QContactAction::action( all.first() );
-    if ( mContactAction )
-        {
         connect(mContactAction, SIGNAL(stateChanged(QContactAction::State)),
                 this, SLOT(progress(QContactAction::State)));
         executed = mContactAction->invokeAction( aGrpContact, aDetail, aParameters );
-        }
+    }
     else
-        {
+    {
         progress(QContactAction::FinishedWithErrorState);
-        }
-    
+    }
+
     return executed;
-    }
- 
+}
+
 /*!
 Launch dynamic action
 */
@@ -98,16 +108,16 @@
 }
 
 void CntActionLauncher::progress( QContactAction::State status )
-    {
+{
     switch(status)
-       {
-       case QContactAction::FinishedState:
-       case QContactAction::FinishedWithErrorState:
-           emit actionExecuted( this );
-           break;
-       default:
-           break;
-       }
+    {
+    case QContactAction::FinishedState:
+    case QContactAction::FinishedWithErrorState:
+        emit actionExecuted( this );
+        break;
+    default:
+        break;
     }
+}
 
 // End of File
--- a/phonebookui/cntcommonui/common/cntsavemanager.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/common/cntsavemanager.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -24,9 +24,8 @@
     For example "forcing" phonebook to shut down (end key, from task swapper etc..)
     in detail editors.
 */
-CntSaveManager::CntSaveManager(CntContactType type, QObject* parent) :
-    QObject(parent),
-    mContactType(type)
+CntSaveManager::CntSaveManager(QObject* parent) :
+    QObject(parent)
 {
     CNT_ENTRY
     
@@ -43,6 +42,21 @@
     CNT_EXIT
 }
 
+CntSaveManager::CntSaveResult CntSaveManager::saveContact( QContact* contact, QContactManager* manager )
+{
+    return saveContact( EContact, contact, manager );
+}
+
+CntSaveManager::CntSaveResult CntSaveManager::saveMyCard( QContact* myCard, QContactManager* manager )
+{
+    return saveContact( EMyCard, myCard, manager );
+}
+
+CntSaveManager::CntSaveResult CntSaveManager::saveGroup( QContact* group, QContactManager* manager )
+{
+    return saveContact( EGroup, group, manager );
+}
+    
 /*!
     Saves the given QContact to the given QContactManager. Also takes care of checking
     if the contact is MyCard or a group and behaves different accordingly.
@@ -51,7 +65,7 @@
     \param aManager the QContactManager which should be used for saving the contact, ownership not taken
     \return CntSaveResult enum to describe what was done to the contact (saved, updated etc...)
 */
-CntSaveManager::CntSaveResult CntSaveManager::saveContact(QContact* aContact, QContactManager* aManager)
+CntSaveManager::CntSaveResult CntSaveManager::saveContact(CntContactType type, QContact* aContact, QContactManager* aManager)
 {
     CNT_ENTRY
     
@@ -64,7 +78,7 @@
         int detailCount = aContact->details().count();
         
         // Don't set preferred details for a group
-        if (mContactType != EGroup)
+        if (type != EGroup)
         {
             setPreferredDetails( aContact );
         }
@@ -76,7 +90,7 @@
             if ( detailCount > 2 )
             {
                 bool success = aManager->saveContact( aContact );
-                if ( success && mContactType == EMyCard )
+                if ( success && type == EMyCard )
                 {
                     aManager->setSelfContactId( aContact->localId() );
                 }
@@ -104,6 +118,7 @@
     }
     
     CNT_EXIT_ARGS(result)
+    emit saveCompleted( result );
     
     return result;
 }
--- a/phonebookui/cntcommonui/common/cntsavemanager.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/common/cntsavemanager.h	Fri Oct 15 12:24:46 2010 +0300
@@ -57,17 +57,20 @@
     };
     
 public:
-    CntSaveManager(CntContactType type = EContact, QObject* parent = NULL);
+    CntSaveManager(QObject* parent = NULL);
     ~CntSaveManager();
     
-    CntSaveResult saveContact(QContact* aContact, QContactManager* aManager);
+    CntSaveResult saveContact( QContact* aContact, QContactManager* aManager );
+    CntSaveResult saveMyCard( QContact* aMyCard, QContactManager* aManager );
+    CntSaveResult saveGroup( QContact* aGroup, QContactManager* aManager );
+    
+signals:
+    void saveCompleted( CntSaveManager::CntSaveResult result );
     
 private:
+    CntSaveResult saveContact( CntContactType type, QContact* contact, QContactManager* manager );
     void setPreferredDetails(QContact* aContact);
     
-private:
-    CntContactType   mContactType;
-    
 };
 
 #endif // CNTIMAGEEDITORVIEW_H
--- a/phonebookui/cntcommonui/common/cntsimengine.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/common/cntsimengine.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -128,7 +128,7 @@
                      mAdnStorePresent = true;
                      mAdnEntriesPresent = true;
                      mWaitingForAdnCache = true;
-                     connect(mAdnSimUtility, SIGNAL(getSimInfoAndUpdateUI(CntSimUtility::CacheStatus&, int)), this, SLOT(getSimInfoAndUpdateUI(CntSimUtility::CacheStatus&, int)));
+                     connect(mAdnSimUtility, SIGNAL(adnCacheStatusReady(CntSimUtility::CacheStatus&, int)), this, SLOT(getSimInfoAndUpdateUI(CntSimUtility::CacheStatus&, int)));
                      if (!mAdnSimUtility->notifyAdnCacheStatus()) {
                          mAdnStorePresent = false;
                          mAdnEntriesPresent = false;
@@ -223,7 +223,7 @@
             QString dateStr = locale.format(date.date(), r_qtn_date_usual);
             QString dateStrLocaleDigits = HbStringUtil::convertDigits(dateStr); 
             QString dateStrFull = 
-                HbParameterLengthLimiter(hbTrId("txt_phob_dblist_import_from_1_val_updated_1")).arg(dateStrLocaleDigits);
+                HbParameterLengthLimiter("txt_phob_dblist_import_from_1_val_updated_1").arg(dateStrLocaleDigits);
             simList << dateStrFull;
         }
     }
@@ -324,12 +324,14 @@
                 QString dateStr = locale.format(date.date(), r_qtn_date_usual);
                 QString dateStrLocaleDigits = HbStringUtil::convertDigits(dateStr);
                 QString dateStrFull = 
-                    HbParameterLengthLimiter(hbTrId("txt_phob_dblist_import_from_1_val_updated_1")).arg(dateStrLocaleDigits);
+                    HbParameterLengthLimiter("txt_phob_dblist_import_from_1_val_updated_1").arg(dateStrLocaleDigits);
                 //simList << dateStrFull;
                 
                 mImportViewCallback.setListBoxItemText(simImport, dateStrFull);
             }
         }
+        
+        emit showNamesView();
     }
     
     CNT_EXIT
--- a/phonebookui/cntcommonui/contactcard/cntcontactcarddatacontainer.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/contactcard/cntcontactcarddatacontainer.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -79,7 +79,7 @@
 void CntContactCardDataContainer::setContactData(QContact* contact, bool aMyCard)
 {
     clearContactData();
-    mContact = contact;
+    mContact = new QContact(*contact);
     mSeparatorIndex = -1;
     if (contact->type() == QContactType::TypeGroup)
     {
@@ -104,6 +104,7 @@
     mCallAction = NULL;
     delete mMessageAction;
     mMessageAction = NULL;
+    delete mContact;
 }
 
 void CntContactCardDataContainer::clearContactData()
--- a/phonebookui/cntcommonui/contactcard/cntcontactcarddetailitem.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/contactcard/cntcontactcarddetailitem.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -123,7 +123,7 @@
     mSecondLineText->setText(valueText);
 
 
-    if (!mFrameItem)
+    if (!mFrameItem && mIsFocusable)
     {
         mFrameItem = new HbFrameItem(this);
         mFrameItem->frameDrawer().setFrameGraphicsName("qtg_fr_list_normal");
--- a/phonebookui/cntcommonui/contactcard/cntcontactcarddetailitem.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/contactcard/cntcontactcarddetailitem.h	Fri Oct 15 12:24:46 2010 +0300
@@ -85,6 +85,7 @@
     HbIcon                  secondaryIcon;
     
 friend class TestCntContactCardDetailItem;
+friend class TestCntContactCardView;
 };
 
 #endif // CNTCOMMLAUNCHERDETAILITEM_H
--- a/phonebookui/cntcommonui/contactcard/cntcontactcardview.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/contactcard/cntcontactcardview.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -66,8 +66,20 @@
 
 void CntContactCardView::setEngine( CntAbstractEngine& aEngine )
 {
-    Q_D( CntContactCardView );
+    Q_D(CntContactCardView);
     d->mEngine = &aEngine;
 }
 
+QString CntContactCardView::externalize(QDataStream &stream)
+{
+    Q_D(CntContactCardView);
+    return d->externalize(stream);
+}
+
+bool CntContactCardView::internalize(QDataStream &stream, CntViewParameters &viewParameters)
+{
+    Q_D(CntContactCardView);
+    return d->internalize(stream, viewParameters);
+}
+
 // end of file
--- a/phonebookui/cntcommonui/contactcard/cntcontactcardview.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/contactcard/cntcontactcardview.h	Fri Oct 15 12:24:46 2010 +0300
@@ -54,6 +54,10 @@
     int viewId() const;
      
     void setEngine( CntAbstractEngine& aEngine );
+    
+    QString externalize(QDataStream &stream);
+    bool internalize(QDataStream &stream, CntViewParameters &viewParameters);
+    
 private:
     CntContactCardViewPrivate* const d_ptr;
     Q_DECLARE_PRIVATE_D(d_ptr, CntContactCardView)
--- a/phonebookui/cntcommonui/contactcard/cntcontactcardview_p.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/contactcard/cntcontactcardview_p.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -84,6 +84,7 @@
 static const int CntInitialPopulation = 8;
 
 const char *CNT_CONTACTCARDVIEW_XML = ":/xml/contacts_contactcard.docml";
+const QString CNT_ACTIVITY_CONTACTCARD  = "ContactsCardView";
 const char *CNT_MAPTILE_INPROGRESS_ICON = "qtg_anim_small_loading_1";
 const char *CNT_MAPTILE_SEARCH_STOP_ICON = "qtg_mono_search_stop";
 /*!
@@ -107,7 +108,9 @@
     mMyCardId(0),
     mSaveManager(NULL),
     mListPopulationProgress(CntListPopulationNotInProgress),
-    mStopListPopulation(false)
+    mStopListPopulation(false),
+    mFetchAvatar(false),
+    mSeparatorlabel(NULL)
 {
     bool ok;
     document()->load(CNT_CONTACTCARDVIEW_XML, &ok);
@@ -160,20 +163,12 @@
         mProgressTimer->stop();
     }
     
-    // Clear the container to avoid double deletion
-    if (mContainerLayout != NULL)
+    if (mContainerLayout)
     {
-        int count = mContainerLayout->count();
-        for (int i=0; i<count; i++) 
-        {
-            // do not delete items. They will be deleted automatically
-            mContainerLayout->removeAt(i);
-        }
+        // Remove the separator obj from layout
+        mContainerLayout->removeItem(mSeparatorlabel);
     }
-    
-    // Delete all the detail pointers if any
-    qDeleteAll(mDetailPtrs);
-    mDetailPtrs.clear();
+    delete mSeparatorlabel;
     
     mView->deleteLater();
     
@@ -297,6 +292,7 @@
 void CntContactCardViewPrivate::activate(const CntViewParameters aArgs)
 {   
     CNT_ENTRY
+
     mArgs = aArgs;
 
     mViewManager = &mEngine->viewManager();
@@ -388,6 +384,76 @@
     CNT_EXIT
 }
 
+QString CntContactCardViewPrivate::externalize(QDataStream &stream)
+{   
+    // set activity parameters 
+    CntViewParameters viewParameters;
+    viewParameters.insert(EViewId, mArgs.value(EViewId).toInt());
+ 
+    if (mArgs.value(ESelectedContact).isValid())
+    {
+        QContact contact = mArgs.value(ESelectedContact).value<QContact>();
+        viewParameters.insert(ESelectedContactId, contact.localId()); 
+    }
+    if (mArgs.value(ESelectedGroupContact).isValid())
+    {
+        QContact contact = mArgs.value(ESelectedGroupContact).value<QContact>();
+        viewParameters.insert(ESelectedGroupContactId, QVariant(contact.localId()));
+    }
+    if (mArgs.value(EMyCard).isValid())
+    {
+        viewParameters.insert(EMyCard, mArgs.value(EMyCard));
+    }
+    if (mArgs.value(EExtraAction).isValid())
+    {
+        viewParameters.insert(EExtraAction, mArgs.value(EExtraAction));
+    }
+    
+    stream << viewParameters;
+    
+    return CNT_ACTIVITY_CONTACTCARD;
+}
+
+bool CntContactCardViewPrivate::internalize(QDataStream &stream, CntViewParameters &viewParameters)
+{
+    CntViewParameters tempViewParameters;
+    stream >> tempViewParameters;
+        
+    viewParameters.insert(EViewId, tempViewParameters.value(EViewId));
+    
+    if (tempViewParameters.value(ESelectedContactId).isValid())
+    {
+        QContact contact = contactManager()->contact(tempViewParameters.value(ESelectedContactId).toInt());
+        if (contact.isEmpty())
+        {
+            // a contact has been deleted.
+            return false;
+        }
+        else
+        {
+            QVariant var;
+            var.setValue(contact);      
+            viewParameters.insert(ESelectedContact, var);
+        }
+    }
+    if (tempViewParameters.value(ESelectedGroupContactId).isValid())
+    {
+        QVariant var;
+        var.setValue(contactManager()->contact(tempViewParameters.value(ESelectedGroupContactId).toInt()));      
+        viewParameters.insert(ESelectedGroupContact, var);
+    }
+    if (tempViewParameters.value(EMyCard).isValid())
+    {
+        viewParameters.insert(EMyCard, tempViewParameters.value(EMyCard));
+    }
+    if (tempViewParameters.value(EMyCard).isValid())
+    {
+        viewParameters.insert(EExtraAction, tempViewParameters.value(EExtraAction));
+    }
+     
+    return true;
+}
+
 void CntContactCardViewPrivate::populateHeadingItem()
 {
     CNT_ENTRY
@@ -410,12 +476,13 @@
         mHeadingItem->ungrabGesture(Qt::TapGesture);
         mImageLabel->ungrabGesture(Qt::TapGesture);
     }
-    
+
     bool online;
     mInitiialPrecenceData = mPresenceListener->initialPresences(*mContact, online);
     mHeadingItem->setOnlineStatus(online);
 
-    if (!myCard) {
+    if (!myCard)
+    {
         bool setAsFavorite = CntFavourite::isMemberOfFavouriteGroup(contactManager(), mContact);
         mHeadingItem->setFavoriteStatus(setAsFavorite); // if contact is part of favourites group
         static_cast<HbAction *>(document()->findObject("cnt:setasfavorite"))->setVisible( !setAsFavorite );
@@ -428,16 +495,11 @@
     {
         if (details.at(i).imageUrl().isValid())
         {
-            if (!mAvatar)
-            {
-                mAvatar = new QContactAvatar(details.at(i));
-                mThumbnailManager->getThumbnail(ThumbnailManager::ThumbnailLarge, mAvatar->imageUrl().toString());
-            }
-            else if (*mAvatar != details.at(i))
+            if (!mAvatar || *mAvatar != details.at(i))
             {
                 delete mAvatar;
                 mAvatar = new QContactAvatar(details.at(i));
-                mThumbnailManager->getThumbnail(ThumbnailManager::ThumbnailLarge, mAvatar->imageUrl().toString());
+                mFetchAvatar = true;
             }
             break;
         }
@@ -452,10 +514,12 @@
 
     Q_ASSERT(mContact != NULL && mScrollArea != NULL);
 
-    if (mListPopulationProgress == CntListPopulationNotInProgress) {
+    if (mListPopulationProgress == CntListPopulationNotInProgress)
+    {
         mListPopulationProgress = 0;
 
-        if (!mDataContainer) {
+        if (!mDataContainer)
+        {
             mDataContainer = new CntContactCardDataContainer(
                 mMaptile,
                 mEngine->extensionManager(),
@@ -465,45 +529,41 @@
         // fill the data container with contact details
         mDataContainer->setContactData(mContact);
         
-        // scroll area + container widget
-        mContainerWidget = mScrollArea->contentWidget();
-        if (!mContainerWidget) {
-            // initialize
-            mScrollArea->setScrollDirections(Qt::Vertical);
-            
-            mContainerWidget = new QGraphicsWidget();
-            mScrollArea->setContentWidget(mContainerWidget); // takes ownership. Old widget is deleted
-                
-            mContainerLayout = new QGraphicsLinearLayout(Qt::Vertical);
-            mContainerLayout->setContentsMargins(0, 0, 0, 0);
-            mContainerLayout->setSpacing(0);
-            mContainerLayout->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
-            
-            mContainerWidget->setLayout(mContainerLayout);   // takes ownership. Old layout is deleted
-        } else {
-            // Already initialized
-            Q_ASSERT(mContainerLayout != NULL);
-            
-            // Clear the container
-            int count = mContainerLayout->count();
-            for (int i = 0; i < count; i++) {
-                // do not delete items. They will be deleted automatically
-                mContainerLayout->removeAt(i);
-            }
+        if (mContainerLayout)
+        {
+            // Remove the separator obj from previous layout
+            // It needs to be reused
+            mContainerLayout->removeItem(mSeparatorlabel);
         }
-    
-        // Delete all the detail pointers if any
-        qDeleteAll(mDetailPtrs);
-        mDetailPtrs.clear();
+        // initialize
+        mScrollArea->setScrollDirections(Qt::Vertical);
+        
+        mContainerWidget = new QGraphicsWidget();
+        mScrollArea->setContentWidget(mContainerWidget); // takes ownership.
+        
+        mContainerLayout = new QGraphicsLinearLayout(Qt::Vertical);
+        mContainerLayout->setContentsMargins(0, 0, 0, 0);
+        mContainerLayout->setSpacing(0);
+        mContainerLayout->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
+        
+        mContainerWidget->setLayout(mContainerLayout);   // takes ownership.
     }
 
 
     do {
-        if (mListPopulationProgress == mDataContainer->itemCount() || mStopListPopulation) {
+        if (mListPopulationProgress == mDataContainer->itemCount() || mStopListPopulation)
+        {
+            if (!mStopListPopulation && mFetchAvatar)
+            {
+                // fetch the avatar if it has not yet been fetched
+                mFetchAvatar = false;
+                mThumbnailManager->getThumbnail(ThumbnailManager::ThumbnailLarge, mAvatar->imageUrl().toString());
+            }
             // population of the list has completed
             mListPopulationProgress = CntListPopulationNotInProgress;
             mStopListPopulation = false;
             disconnect(mView->mainWindow(), SIGNAL(viewReady()), this, SLOT(populateListItems()));
+            CNT_EXIT_ARGS("population completed")
             return;
         }
 
@@ -514,7 +574,6 @@
         if (pos < CntContactCardDataItem::ESeparator && dataItem->isFocusable())
         { 
             CntContactCardDetailItem* item = new CntContactCardDetailItem(mListPopulationProgress, mContainerWidget);
-            mDetailPtrs.append(item);
 
             connect(item, SIGNAL(clicked()), this, SLOT(onItemActivated()));
             
@@ -554,12 +613,16 @@
 
         // separator
         else if (pos == CntContactCardDataItem::ESeparator)
-        {      
-            HbFrameItem* frameItem = new HbFrameItem(QString("qtg_fr_list_separator"), HbFrameDrawer::NinePieces);
-            HbLabel* label = static_cast<HbLabel*>(document()->findWidget(QString("separator")));
-            label->setPlainText(dataItem->titleText());
-            label->setBackgroundItem(frameItem); // takes ownership
-            mContainerLayout->addItem(label);
+        {
+            if (!mSeparatorlabel)
+            {
+                HbFrameItem* frameItem = new HbFrameItem(QString("qtg_fr_list_separator"), HbFrameDrawer::NinePieces);
+                mSeparatorlabel = static_cast<HbLabel*>(document()->findWidget(QString("separator")));
+                mSeparatorlabel->setPlainText(dataItem->titleText());
+                mSeparatorlabel->setBackgroundItem(frameItem); // takes ownership
+                mSeparatorlabel->setParent(this);
+            }
+            mContainerLayout->addItem(mSeparatorlabel);
         }
 
         // details
@@ -588,7 +651,6 @@
             else
             {
                 CntContactCardDetailItem* item = new CntContactCardDetailItem(mListPopulationProgress, mContainerWidget, false);
-                mDetailPtrs.append(item);
                 
                 //To check whether maptile status  icon is set with the address 
                 if( ( dataItem->titleText() == hbTrId("txt_phob_formlabel_address") ||
@@ -632,11 +694,21 @@
         ++mListPopulationProgress;
     } while (mListPopulationProgress < CntInitialPopulation);
 
-    if (mListPopulationProgress <= CntInitialPopulation) {
+    if (mListPopulationProgress <= CntInitialPopulation)
+    {
         connect(mView->mainWindow(), SIGNAL(viewReady()), this, SLOT(populateListItems()));
-    } else {
+    }
+    else
+    {
         disconnect(mView->mainWindow(), SIGNAL(viewReady()), this, SLOT(populateListItems()));
         HbApplication::instance()->postEvent(this, new QEvent(ProcessPopulateListEvent));
+
+        if (mFetchAvatar)
+        {
+            // initial view has been shown, so starting fetching the avatar
+            mFetchAvatar = false;
+            mThumbnailManager->getThumbnail(ThumbnailManager::ThumbnailLarge, mAvatar->imageUrl().toString());
+        }
     }
 
     CNT_EXIT
@@ -648,9 +720,11 @@
 void CntContactCardViewPrivate::connectAction(QString actionName, const char* slot)
 {
     HbAction *action = qobject_cast<HbAction *>(document()->findObject(actionName));
-    if (action) {
+    if (action)
+    {
         action->setParent(mView);
-        if (slot != NULL) {
+        if (slot != NULL)
+        {
             connect(action, SIGNAL(triggered()), this, slot);
         }
     }
@@ -661,82 +735,82 @@
  */
 void CntContactCardViewPrivate::updateSpinningIndicator()
 {
-    //Check all address details( Preferred, Home, Work )
-    for( int index = 0 ; index < mAddressList.count(); )
+    CNT_ENTRY
+    
+    // Check all address details( Preferred, Home, Work )
+    for (int index = 0 ; index < mAddressList.count();)
     {
-        //Maptile status not received update the rotating icon
-        if( mAddressList[index]->maptileStatus == CNT_UNKNOWN_MAPTILE_STATUS )
+        // Maptile status not received update the rotating icon
+        if (mAddressList[index]->maptileStatus == CNT_UNKNOWN_MAPTILE_STATUS)
         {
-             QString iconName("qtg_anim_small_loading_");
-             mAddressList[index]->mProgressCount = mAddressList[index]->mProgressCount % 10 + 1;
-             iconName.append(QVariant(mAddressList[index]->mProgressCount).toString());
+            QString iconName("qtg_anim_small_loading_");
+            mAddressList[index]->mProgressCount = mAddressList[index]->mProgressCount % 10 + 1;
+            iconName.append(QVariant(mAddressList[index]->mProgressCount).toString());
              
-             HbIcon icon(iconName);
-             mAddressList[index]->mDetailItem->setSecondaryIconItem( icon );
-             mAddressList[index]->mDetailItem->update();   
-             mProgressTimer->start(CNT_MAPTILE_PROGRESS_TIMER);
-             index++;
+            HbIcon icon(iconName);
+            mAddressList[index]->mDetailItem->setSecondaryIconItem(icon);
+            mAddressList[index]->mDetailItem->update();   
+            mProgressTimer->start(CNT_MAPTILE_PROGRESS_TIMER);
+            index++;
         }
         else
         {
-            //Maptile status received. Show the maptile image if available
+            // Maptile status received. Show the maptile image if available
             MapTileService::AddressType sourceAddressType =
-                    static_cast <MapTileService::AddressType>( mAddressList[index]->mAddressType );
+                    static_cast <MapTileService::AddressType>(mAddressList[index]->mAddressType);
              
             QContactLocalId contactId = mContact->localId();
              
-            if( mAddressList[index] != NULL )
+            if (mAddressList[index] != NULL)
             {
-                 if( mAddressList[index]->maptileStatus == MapTileService::MapTileFetchingCompleted )
-                 {
- 
-                     //Read the maptile path and update the image
-                     QString imagePath;
-                     mMaptile->getMapTileImage( 
-                                contactId, sourceAddressType, imagePath, mView->mainWindow()->orientation() );
+                if (mAddressList[index]->maptileStatus == MapTileService::MapTileFetchingCompleted)
+                {
+                    // Read the maptile path and update the image
+                    QString imagePath;
+                    mMaptile->getMapTileImage( 
+                               contactId, sourceAddressType, imagePath, mView->mainWindow()->orientation());
 					 
-                     if( !imagePath.isEmpty() )
-                     {
-                         //Empty icon. Clear the inprogress  icon
-                         HbIcon emptyIcon;
-                         mAddressList[index]->mDetailItem->setSecondaryIconItem( emptyIcon );
+                    if (!imagePath.isEmpty())
+                    {
+                        //Empty icon. Clear the inprogress  icon
+                        HbIcon emptyIcon;
+                        mAddressList[index]->mDetailItem->setSecondaryIconItem(emptyIcon);
                          
-                         HbIcon icon( imagePath );
+                        HbIcon icon(imagePath);
                          
-                         HbLabel* maptileLabel = loadMaptileLabel( sourceAddressType );
-                         setMaptileLabel( maptileLabel, icon );
-                         mMaptileLabelList.insert( sourceAddressType, maptileLabel );
-                        
-                         //find the index of the item and insert maptile in the next index 
-                         for( int itemIndex = 0 ; itemIndex < mContainerLayout->count(); itemIndex++ )
-                         {
-                             if( mContainerLayout->itemAt(itemIndex) == mAddressList[index]->mDetailItem )
-                             {
-                                 mContainerLayout->insertItem( itemIndex+1, maptileLabel );
-                                 break;
-                             }
-                         }
-                         
-                     }
-                     else
-                     {
-                         //Maptile image not available. Show the search stop icon
-                         setMaptileSearchStopIcon( index );
-                     }
-                 }
-                 else
-                 {
-                     //Maptile fetching failed. Show the search stop icon
-                     setMaptileSearchStopIcon( index );
-                 }
+                        HbLabel* maptileLabel = loadMaptileLabel(sourceAddressType);
+                        setMaptileLabel(maptileLabel, icon);
+                        mMaptileLabelList.insert(sourceAddressType, maptileLabel);
+
+                        //find the index of the item and insert maptile in the next index 
+                        for (int itemIndex = 0 ; itemIndex < mContainerLayout->count(); itemIndex++)
+                        {
+                            if (mContainerLayout->itemAt(itemIndex) == mAddressList[index]->mDetailItem)
+                            {
+                                mContainerLayout->insertItem(itemIndex + 1, maptileLabel);
+                                break;
+                            }
+                        }
+                    }
+                    else
+                    {
+                        //Maptile image not available. Show the search stop icon
+                        setMaptileSearchStopIcon(index);
+                    }
+                }
+                else
+                {
+                    //Maptile fetching failed. Show the search stop icon
+                    setMaptileSearchStopIcon(index);
+                }
                  
-                 delete mAddressList[index];
-                 mAddressList.removeAt(index);
+                delete mAddressList[index];
+                mAddressList.removeAt(index);
             }
             else
             {
-                 //increment the index now
-                 index++;
+                //increment the index now
+                index++;
             }
         }
     }
@@ -745,42 +819,42 @@
 /*
 * Sets the search stop icon to secondary icon item
 */
-void CntContactCardViewPrivate::setMaptileSearchStopIcon( int index )
+void CntContactCardViewPrivate::setMaptileSearchStopIcon(int index)
 {
-    if( index < mAddressList.count() )
+    if (index < mAddressList.count())
     {
         QString iconName(CNT_MAPTILE_SEARCH_STOP_ICON);
         HbIcon icon(iconName);
-        mAddressList[index]->mDetailItem->setSecondaryIconItem( icon );
+        mAddressList[index]->mDetailItem->setSecondaryIconItem(icon);
         mAddressList[index]->mDetailItem->update();  
     }
 }
 
-/*
-* Slot to receive the maptile status information
-*/
-void CntContactCardViewPrivate::mapTileStatusReceived( int contactid, int addressType, int status)
+/*!
+    Slot to receive the maptile status information.
+ */
+void CntContactCardViewPrivate::mapTileStatusReceived(int contactid, int addressType, int status)
 {
-    //Update the maptile status information for all 3( Preferred, Work, Home ) address
-    for( int index = 0 ; index < mAddressList.count(); index++  )
+    // Update the maptile status information for all 3( Preferred, Work, Home ) address
+    for (int index = 0; index < mAddressList.count(); index++)
     {
-        if( mAddressList[index]->mContactId == contactid &&  
-                 mAddressList[index]->mAddressType == addressType )
+        if (mAddressList[index]->mContactId == contactid &&  
+                mAddressList[index]->mAddressType == addressType)
         {
             mAddressList[index]->maptileStatus = status;
         }
     }
-    
+
     updateSpinningIndicator();
 }
 
-/*
-* Updates correct maptile image when screen orientation changes.
-*/
+/*!
+    Updates correct maptile image when screen orientation changes.
+ */
 void CntContactCardViewPrivate::updateMaptileImage()
 {
-    //If there is no maptile displayed, return immediately
-    if( mMaptileLabelList.count() > 0 )
+    // If there is no maptile displayed, return immediately
+    if (mMaptileLabelList.count() > 0)
     {
         QContactLocalId contactId = mContact->localId();
         
@@ -790,35 +864,35 @@
         QString contextHome(QContactAddress::ContextHome.operator QString());
         QString contextWork(QContactAddress::ContextWork.operator QString());
         MapTileService::AddressType sourceAddressType 
-                                             = MapTileService::AddressPreference;
+            = MapTileService::AddressPreference;
         
         QString imagePath;
         
-        for ( int i = 0; i < addressDetails.count(); i++ )
+        for (int i = 0; i < addressDetails.count(); i++)
         {
-            if ( !addressDetails[i].contexts().isEmpty() && 
-                   addressDetails[i].contexts().at(0) == contextHome )
+            if (!addressDetails[i].contexts().isEmpty() &&
+                   addressDetails[i].contexts().at(0) == contextHome)
             {
                 sourceAddressType = MapTileService::AddressHome;
             }
-            else if ( !addressDetails[i].contexts().isEmpty() && 
-                         addressDetails[i].contexts().at(0) == contextWork )
+            else if (!addressDetails[i].contexts().isEmpty() && 
+                        addressDetails[i].contexts().at(0) == contextWork)
             {
                 sourceAddressType = MapTileService::AddressWork;
             }
-            
+
             int status = mMaptile->getMapTileImage( 
                                              contactId, 
                                              sourceAddressType, 
                                              imagePath, 
-                                             mView->mainWindow()->orientation() );
-            if( !imagePath.isEmpty() )
+                                             mView->mainWindow()->orientation());
+            if (!imagePath.isEmpty())
             {
-                HbIcon icon( imagePath );
-                HbLabel* label = mMaptileLabelList.value( sourceAddressType );
-                if( label )
+                HbIcon icon(imagePath);
+                HbLabel* label = mMaptileLabelList.value(sourceAddressType);
+                if (label)
                 {
-                    setMaptileLabel( label, icon );
+                    setMaptileLabel(label, icon);
                 }
             }
         }
@@ -826,39 +900,37 @@
 }
 
 
-/*
-* Asscoiate the maptile label widget with maptile image
-*/
-void CntContactCardViewPrivate::setMaptileLabel( HbLabel*& mapLabel, const HbIcon& icon )
+/*!
+    Asscoiate the maptile label widget with maptile image.
+ */
+void CntContactCardViewPrivate::setMaptileLabel(HbLabel*& mapLabel, const HbIcon& icon)
 {
     mapLabel->clear();
-    mapLabel->setIcon( icon );
-    
-	qreal leftMarginSize;
-	mapLabel->getContentsMargins( &leftMarginSize, 0 , 0 , 0 );
-    mapLabel->setPreferredSize( 
-          QSizeF(icon.width() + leftMarginSize, icon.height()));
-   
+    mapLabel->setIcon(icon);
+
+    qreal leftMarginSize;
+    mapLabel->getContentsMargins(&leftMarginSize, 0, 0, 0);
+    mapLabel->setPreferredSize(QSizeF(icon.width() + leftMarginSize, icon.height()));
 }
 
-/*
-* Load the maptile label based on the address type
-*/
-HbLabel* CntContactCardViewPrivate::loadMaptileLabel( int addressType )
+/*!
+    Load the maptile label based on the address type.
+ */
+HbLabel* CntContactCardViewPrivate::loadMaptileLabel(int addressType)
 {
     HbLabel* maptileLabel = NULL;
     
-    if( addressType == MapTileService::AddressPreference )
+    if (addressType == MapTileService::AddressPreference)
     {
         maptileLabel = static_cast<HbLabel*>(document()->findWidget(QString("maptilePreferenceWidget")));
     }
-    else if( addressType == MapTileService::AddressHome  )
+    else if (addressType == MapTileService::AddressHome)
     {
-        maptileLabel  = static_cast<HbLabel*>(document()->findWidget(QString("maptileHomeWidget")));
+        maptileLabel = static_cast<HbLabel*>(document()->findWidget(QString("maptileHomeWidget")));
     }
-    else if( addressType == MapTileService::AddressWork )
+    else if (addressType == MapTileService::AddressWork)
     {
-        maptileLabel  = static_cast<HbLabel*>(document()->findWidget(QString("maptileWorkWidget")));
+        maptileLabel = static_cast<HbLabel*>(document()->findWidget(QString("maptileWorkWidget")));
     }
                             
     return maptileLabel;
@@ -1003,7 +1075,7 @@
         name = hbTrId("txt_phob_list_unnamed");
     }
     
-    HbMessageBox::question(HbParameterLengthLimiter(hbTrId("txt_phob_info_delete_1")).arg(name), this, SLOT(handleDeleteContact(int)),
+    HbMessageBox::question(HbParameterLengthLimiter("txt_phob_info_delete_1").arg(name), this, SLOT(handleDeleteContact(int)),
             HbMessageBox::Delete | HbMessageBox::Cancel);
 }
 
@@ -1639,6 +1711,8 @@
         if (contactManager()->error() == QContactManager::NoError 
             && latestTimeStamp.lastModified() > localTimeStamp.lastModified())
         {
+            mListPopulationProgress = CntListPopulationNotInProgress;
+            
             if (mContact)
                 delete mContact;
             mContact = new QContact(c);
@@ -1733,6 +1807,8 @@
         QContact c = contactManager()->contact(mContact->localId());
         if (contactManager()->error() == QContactManager::NoError)
         {
+            mListPopulationProgress = CntListPopulationNotInProgress;
+            
             if (mContact)
                 delete mContact;
             mContact = new QContact(c);
--- a/phonebookui/cntcommonui/contactcard/cntcontactcardview_p.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/contactcard/cntcontactcardview_p.h	Fri Oct 15 12:24:46 2010 +0300
@@ -145,6 +145,8 @@
     CntContactCardView* q_ptr;    
     void activate(const CntViewParameters aArgs);
     void deactivate();
+    QString externalize(QDataStream &stream);
+    bool internalize(QDataStream &stream, CntViewParameters &viewParameters);
     CntDocumentLoader* document();
     QContactManager* contactManager();
     
@@ -198,9 +200,12 @@
     CntSaveManager* mSaveManager; // own
     CntAbstractEngine* mEngine;
     QTimer* mProgressTimer; // own
-    QList<CntContactCardDetailItem*>    mDetailPtrs;
     int                         mListPopulationProgress;
     bool                        mStopListPopulation;
+    bool                        mFetchAvatar;
+    HbLabel*                    mSeparatorlabel;
+    
+    friend class TestCntContactCardView;
 };
 
 #endif // CNTCOMMLAUNCHERVIEW_H
--- a/phonebookui/cntcommonui/contacteditors/cntdateeditorviewitem.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/contacteditors/cntdateeditorviewitem.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -30,7 +30,6 @@
 #include <hbpushbutton.h>
 #include <hbdialog.h>
 #include <hbdatetimepicker.h>
-#include <hblabel.h>
 #include <hbaction.h>
 
 CntDateEditorViewItem::CntDateEditorViewItem( QGraphicsItem* aParent ) : 
@@ -131,10 +130,7 @@
     picker->setDateRange(CNT_DATEPICKER_FROM, CNT_DATEPICKER_TO );
     picker->setDate( aCurrent );
 
-    HbLabel *headingText = new HbLabel( popup );
-    headingText->setPlainText( aTitle );
-
-    popup->setHeadingWidget(headingText);
+    popup->setHeadingText(aTitle);
     popup->setContentWidget(picker);
     popup->addAction(new HbAction(hbTrId("txt_common_button_ok"), popup));
     popup->addAction(new HbAction(hbTrId("txt_common_button_cancel"), popup));
--- a/phonebookui/cntcommonui/contacteditors/cntdetailconst.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/contacteditors/cntdetailconst.h	Fri Oct 15 12:24:46 2010 +0300
@@ -21,7 +21,7 @@
 #include <Qt>
 #include <QDate>
 #include <QString>
-const int CNT_NOTE_EDITOR_MIN_ROWCOUNT = 5;
+const int CNT_NOTE_EDITOR_MIN_ROWCOUNT = 3;
 const int CNT_PHONENUMBER_EDITOR_MAXLENGTH = 48;
 const int CNT_DTMF_EDITOR_MAXLENGTH = 60;
 const int CNT_URL_EDITOR_MAXLENGTH = 1000;
--- a/phonebookui/cntcommonui/contacteditors/cntdetaileditor.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/contacteditors/cntdetaileditor.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -52,7 +52,6 @@
     mViewManager(NULL),
     mEditorFactory(NULL),
     mCancel(NULL),
-    mSaveManager(NULL),
     mVirtualKeyboard(NULL)
 {
     bool ok;
@@ -88,8 +87,6 @@
     mLoader = NULL;
     delete mEditorFactory;
     mEditorFactory = NULL;
-    delete mSaveManager;
-    mSaveManager = NULL;
     delete mVirtualKeyboard;
     mVirtualKeyboard = NULL;
 }
@@ -121,15 +118,14 @@
         mView->setNavigationAction(mSoftkey);
     }
     
-    QContact selectedContact;
     if ( mId == groupEditorView )
     {
-        selectedContact = aArgs.value(ESelectedGroupContact).value<QContact>();
+        mContact = aArgs.value(ESelectedGroupContact).value<QContact>();
         connect( mDataForm, SIGNAL(itemShown(const QModelIndex&)), this, SLOT(handleItemShown(const QModelIndex&)) );
     }
     else
     {
-        selectedContact = aArgs.value(ESelectedContact).value<QContact>();
+        mContact = aArgs.value(ESelectedContact).value<QContact>();
         connect( mDataForm, SIGNAL(itemShown(const QModelIndex&)), this, SLOT(handleItemShown(const QModelIndex&)) );
     }
     
@@ -137,26 +133,7 @@
     connect(&cm, SIGNAL(contactsRemoved(const QList<QContactLocalId>&)), 
         this, SLOT(contactDeletedFromOtherSource(const QList<QContactLocalId>&)));
     
-    mEditorFactory->setupEditorView(*this, selectedContact);
-    
-    QString myCard = mArgs.value( EMyCard ).toString();
-    QContactLocalId localId = selectedContact.localId();
-    QContactLocalId selfContactId = cm.selfContactId();
-    bool isMyCard = ( localId == selfContactId && localId != 0 ) || !myCard.isEmpty();
-    
-    if (isMyCard)
-    {
-        mSaveManager = new CntSaveManager(CntSaveManager::EMyCard);
-    }
-    else if ( mId == groupEditorView )
-    {
-        mSaveManager = new CntSaveManager(CntSaveManager::EGroup);
-    }
-    else
-    {
-        mSaveManager = new CntSaveManager();
-    }
-    
+    mEditorFactory->setupEditorView(*this, mContact);
     mDataForm->setItemRecycling(true);
 
     // add new field if required
@@ -173,20 +150,17 @@
     mDataForm->verticalScrollBar()->setInteractive(true);
     
     mVirtualKeyboard = new HbShrinkingVkbHost(mView);
-        
-    connect(mVirtualKeyboard, SIGNAL(keypadOpened()), this, SLOT(handleKeypadOpen()));
-    connect(mVirtualKeyboard, SIGNAL(keypadClosed()), this, SLOT(handleKeypadClosed()));
 }
 
 void CntDetailEditor::deactivate()
 {
     QContactManager& mgr = mEngine->contactManager(SYMBIAN_BACKEND);
-    if( mId == groupEditorView) {
-        mgr.saveContact( mDataFormModel->contact() );
-    }
     
     disconnect(&mgr, SIGNAL(contactsRemoved(const QList<QContactLocalId>&)),
             this, SLOT(contactDeletedFromOtherSource(const QList<QContactLocalId>&)));
+    
+    delete mVirtualKeyboard;
+    mVirtualKeyboard = NULL;
 }
     
 bool CntDetailEditor::isDefault() const
@@ -309,17 +283,31 @@
         name = hbTrId("txt_phob_list_unnamed");
     }
     
-    CntSaveManager::CntSaveResult result = mSaveManager->saveContact(mDataFormModel->contact(), &mgr);
-    
-    if (mId != groupEditorView)
-    {
+    QString myCard = mArgs.value( EMyCard ).toString();
+    QContactLocalId localId = mContact.localId();
+    QContactLocalId selfContactId = mgr.selfContactId();
+    bool isMyCard = ( localId == selfContactId && localId != 0 ) || !myCard.isEmpty();
+        
+    CntSaveManager::CntSaveResult result;
+    CntSaveManager& saveMgr = mEngine->saveManager();
+    if (isMyCard) {
+        result = saveMgr.saveMyCard( mDataFormModel->contact(), &mgr );
+    }
+    else if ( mId == groupEditorView ) {
+        result = saveMgr.saveGroup( mDataFormModel->contact(), &mgr );
+    }
+    else {
+        result = saveMgr.saveContact( mDataFormModel->contact(), &mgr );
+    }
+        
+    if (mId != groupEditorView) {
         switch (result)
         {
         case CntSaveManager::ESaved:
-            HbDeviceNotificationDialog::notification(QString(),HbParameterLengthLimiter(hbTrId("txt_phob_dpophead_contact_1_saved")).arg(name));
+            HbDeviceNotificationDialog::notification(QString(),HbParameterLengthLimiter("txt_phob_dpophead_contact_1_saved").arg(name));
             break;
         case CntSaveManager::EUpdated:
-            HbDeviceNotificationDialog::notification(QString(),HbParameterLengthLimiter(hbTrId("txt_phob_dpophead_contacts_1_updated")).arg(name));
+            HbDeviceNotificationDialog::notification(QString(),HbParameterLengthLimiter("txt_phob_dpophead_contacts_1_updated").arg(name));
             break;
         case CntSaveManager::EFailed:
             HbDeviceNotificationDialog::notification(QString(),hbTrId("SAVING FAILED!"));
@@ -389,22 +377,4 @@
     mCancel->setDisabled(false);
 }
 
-
-void CntDetailEditor::handleKeypadOpen()
-{
-    CNT_ENTRY
-    
-  // enable full screen
-    mView->setContentFullScreen(true);
-    CNT_EXIT
-}
-
-void CntDetailEditor::handleKeypadClosed()
-{
-    CNT_ENTRY
-    // disable full screen
-    mView->setContentFullScreen(false);
-    CNT_EXIT
-}
-
 // End of File
--- a/phonebookui/cntcommonui/contacteditors/cntdetaileditor.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/contacteditors/cntdetaileditor.h	Fri Oct 15 12:24:46 2010 +0300
@@ -31,7 +31,6 @@
 class HbView;
 class HbAction;
 class CntEditorFactory;
-class CntSaveManager;
 class HbShrinkingVkbHost;
 
 class CntDetailEditor : public QObject,
@@ -52,8 +51,6 @@
     void saveContact();
     void contactDeletedFromOtherSource(const QList<QContactLocalId>& contactIds);
     void showRootView();
-    void handleKeypadOpen();
-    void handleKeypadClosed();
     
 public slots:
     void enableDiscardChanges();
@@ -91,9 +88,9 @@
     HbAction                       *mSoftkey;
     HbAction                       *mCancel;
     CntViewParameters               mArgs;
-    CntSaveManager                 *mSaveManager; // own
     CntAbstractEngine*              mEngine; // not own
     HbShrinkingVkbHost*             mVirtualKeyboard;
+    QContact                        mContact;
     friend class TestCntDetailEditor;
     };
 #endif /* CNTDETAILEDITOR_H_ */
--- a/phonebookui/cntcommonui/contacteditors/cntdetailpopup.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/contacteditors/cntdetailpopup.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -30,17 +30,14 @@
     addListItem("qtg_small_mobile", hbTrId("txt_phob_list_number"), phoneNumberEditorView );
     addListItem("qtg_small_email", hbTrId("txt_phob_list_email"), emailEditorView );
     addListItem("qtg_small_url_address", hbTrId("txt_phob_list_url"), urlEditorView);
-    addListItem("qtg_small_location", hbTrId("txt_phob_list_address"), addressEditorView );
+    addListItem("qtg_small_location", hbTrId("txt_phob_list_address2"), addressEditorView );
     addListItem("qtg_small_note", hbTrId("txt_phob_list_note"), noteEditorView);
     addListItem("qtg_small_sound", hbTrId("txt_phob_list_personal_ringing_tone"), ringToneFetcherView );
     addListItem("qtg_small_calendar", hbTrId("txt_phob_list_date"), dateEditorView);
     addListItem("qtg_small_company_details", hbTrId("txt_phob_list_company_details"), companyEditorView);
     addListItem("qtg_small_family", hbTrId("txt_phob_list_family"), familyDetailEditorView);
-    
-    HbLabel *label = new HbLabel(this);    
-    label->setPlainText(hbTrId("txt_phob_title_add_field"));
 
-    setHeadingWidget(label);
+    setHeadingText(hbTrId("txt_phob_title_add_field"));
     setTimeout(HbDialog::NoTimeout);
     setDismissPolicy(HbDialog::NoDismiss);
     setAttribute(Qt::WA_DeleteOnClose, true);
--- a/phonebookui/cntcommonui/contacteditors/cnteditview.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/contacteditors/cnteditview.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -76,4 +76,16 @@
     Q_D( CntEditView );
     d->mEngine = &aEngine;
 }
+
+QString CntEditView::externalize(QDataStream &stream)
+{
+    Q_D(CntEditView);
+    return d->externalize(stream);
+}
+
+bool CntEditView::internalize(QDataStream &stream, CntViewParameters &viewParameters)
+{
+    Q_D(CntEditView);
+    return d->internalize(stream, viewParameters);
+}
 // EOF
--- a/phonebookui/cntcommonui/contacteditors/cnteditview.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/contacteditors/cnteditview.h	Fri Oct 15 12:24:46 2010 +0300
@@ -47,6 +47,8 @@
     int viewId() const;
 
     void setEngine( CntAbstractEngine& aEngine );
+    QString externalize(QDataStream &stream);
+    bool internalize(QDataStream &stream, CntViewParameters &viewParameters);
     
 private:
     CntEditViewPrivate* const d_ptr;
--- a/phonebookui/cntcommonui/contacteditors/cnteditview_p.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/contacteditors/cnteditview_p.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -50,6 +50,7 @@
 #include <QTimer>
 
 const char *CNT_EDIT_XML = ":/xml/contacts_ev.docml";
+const QString CNT_ACTIVITY_EDITOR = "ContactsCardEdit";
 
 CntEditViewPrivate::CntEditViewPrivate() :
     mModel( NULL ),
@@ -57,8 +58,7 @@
     mThumbnailManager( NULL ),
     mContact( NULL ),
     mReq(NULL),
-    mMenu(NULL),
-    mSaveManager(NULL)
+    mMenu(NULL)
 {
     mDocument = new CntDocumentLoader;
     
@@ -97,7 +97,7 @@
     connect( add, SIGNAL(triggered()), this, SLOT(addDetailItem()) );
     connect( mDelete, SIGNAL(triggered()), this, SLOT(deleteContact()) );
     connect( mDiscard, SIGNAL(triggered()), this, SLOT(discardChanges()) );
-    connect( mSave, SIGNAL(triggered()), this, SLOT(saveChanges()) );
+    connect( mSave, SIGNAL(triggered()), this, SLOT(showPreviousView()) );
         
     connect( mSoftkey, SIGNAL(triggered()), this, SLOT(showPreviousView()) );
     connect( mImageLabel, SIGNAL(iconClicked()), this, SLOT(openImageEditor()) );
@@ -105,9 +105,6 @@
     connect( mHeading, SIGNAL(iconClicked()), this, SLOT(openImageEditor()) );
     connect( mListView, SIGNAL(activated(const QModelIndex&)), this, SLOT(activated(const QModelIndex&)) );
     connect( mListView, SIGNAL(longPressed(HbAbstractViewItem*,const QPointF&)), this, SLOT(longPressed(HbAbstractViewItem*,const QPointF&)) );
-    
-    // closing the application from task swapper or end key will cause the contact to be saved
-    connect( qApp, SIGNAL(aboutToQuit()), this, SLOT(saveChanges()));
 }
 
 CntEditViewPrivate::~CntEditViewPrivate()
@@ -125,9 +122,6 @@
         delete mMenu;
         mMenu = NULL;
     }
-    
-    delete mSaveManager;
-    mSaveManager = NULL;
 }
 
 void CntEditViewPrivate::setOrientation(Qt::Orientation orientation)
@@ -159,6 +153,7 @@
     if ( window )
     {
         connect(window, SIGNAL(viewReady()), this, SLOT(setScrollPosition()) );
+        connect(window, SIGNAL(viewReady()), this, SLOT(setObjectNames()) );
         connect(window, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(setOrientation(Qt::Orientation)));
         setOrientation(window->orientation());
     }
@@ -176,14 +171,6 @@
     QContactLocalId selfContactId = cm.selfContactId();
     mIsMyCard = ( localId == selfContactId && localId != 0 ) || !myCard.isEmpty();
     
-    if (mIsMyCard)
-    {
-        mSaveManager = new CntSaveManager(CntSaveManager::EMyCard);
-    }
-    else
-    {
-        mSaveManager = new CntSaveManager();
-    }
     
     if ( mHeading )
         mHeading->setDetails( mContact, mIsMyCard );
@@ -228,6 +215,82 @@
     CNT_EXIT
 }
 
+QString CntEditViewPrivate::externalize(QDataStream &stream)
+{
+    // closing the application from task swapper or end key will cause the contact to be saved
+    saveChanges();
+    
+    CntViewParameters viewParameters;
+    viewParameters.insert(EViewId, mArgs.value(EViewId).toInt());
+ 
+    if (mArgs.value(ESelectedContact).isValid())
+    {
+        QContact contact = mArgs.value(ESelectedContact).value<QContact>();
+        viewParameters.insert(ESelectedContactId, contact.localId()); 
+    }
+    if (mArgs.value(ESelectedGroupContact).isValid())
+    {
+        QContact contact = mArgs.value(ESelectedGroupContact).value<QContact>();
+        viewParameters.insert(ESelectedGroupContactId, contact.localId());
+    }
+    if (mArgs.value(EMyCard).isValid())
+    {
+        viewParameters.insert(EMyCard, mArgs.value(EMyCard));
+    }
+    if (mArgs.value(EExtraAction).isValid())
+    {
+        viewParameters.insert(EExtraAction, mArgs.value(EExtraAction));
+    }
+   
+    stream << viewParameters;
+    
+    return CNT_ACTIVITY_EDITOR;
+}
+
+bool CntEditViewPrivate::internalize(QDataStream &stream, CntViewParameters &viewParameters)
+{
+    CntViewParameters tempViewParameters;
+    stream >> tempViewParameters;
+    
+    viewParameters.insert(EViewId, tempViewParameters.value(EViewId));
+    
+    if (tempViewParameters.value(ESelectedContactId).isValid())
+    {
+        QContactManager &mgr = mEngine->contactManager(SYMBIAN_BACKEND);
+        
+        QContactLocalId localId = tempViewParameters.value(ESelectedContactId).toInt();
+        
+        if (!mgr.contactIds().contains(localId) && localId != 0 && mgr.selfContactId() != localId)
+        {
+            // a contact has been deleted.
+            return false;
+        }
+        else
+        {
+            QVariant var;
+            var.setValue(mgr.contact(localId));      
+            viewParameters.insert(ESelectedContact, var);
+        }
+    }
+    if (tempViewParameters.value(ESelectedGroupContactId).isValid())
+    {
+        QContactManager &mgr = mEngine->contactManager(SYMBIAN_BACKEND);
+        QVariant var;
+        var.setValue(mgr.contact(tempViewParameters.value(ESelectedGroupContactId).toInt()));      
+        viewParameters.insert(ESelectedGroupContact, var);
+    }
+    if (tempViewParameters.value(EMyCard).isValid())
+    {
+        viewParameters.insert(EMyCard, tempViewParameters.value(EMyCard));
+    }
+    if (tempViewParameters.value(EExtraAction).isValid())
+    {
+        viewParameters.insert(EExtraAction, tempViewParameters.value(EExtraAction));
+    }
+     
+    return true;
+}
+
 void CntEditViewPrivate::deactivate()
 {   
 }
@@ -418,6 +481,7 @@
          }
          else
          {
+             mReq->setSynchronous(false);
              connect(mReq, SIGNAL( requestOk( const QVariant&)), SLOT( ringToneFetchHandleOk(const QVariant&)) );
              connect(mReq, SIGNAL( requestError( int,const QString&)), SLOT(ringToneFetchHandleError(int,const QString&)) );
          }
@@ -428,25 +492,19 @@
 
 void CntEditViewPrivate::ringToneFetchHandleOk(const QVariant &result)
 {
-          
     QContactRingtone ringtone = mContact->detail<QContactRingtone>();
-    QUrl ringtoneUrl = ringtone.audioRingtoneUrl();
-    QFileInfo ringtoneFileInfo(ringtoneUrl.toString());
-    QString ringtoneFileName = ringtoneFileInfo.fileName();
-     // Contact can have only one ringtone at a time
-     // remove existing ringtone detail if any
+    // Contact can have only one ringtone at a time
+    // remove existing ringtone detail if any
+    if(!(ringtone.isEmpty()))
+     {
+        mContact->removeDetail(&ringtone);
+     }
      
-     if(!(ringtone.isEmpty()))
-         {
-         mContact->removeDetail(&ringtone);
-         }
-     
-     ringtone.setAudioRingtoneUrl(result.value<QString>());
+     ringtone.setAudioRingtoneUrl( QUrl::fromLocalFile( result.value<QString>() ) );
      mContact->saveDetail( &ringtone );
      mModel->updateRingtone();
      mSave->setEnabled( true );
      mDiscard->setEnabled( true );
-     
 }
  
 void CntEditViewPrivate::ringToneFetchHandleError(int errorCode, const QString& errorMessage)
@@ -476,7 +534,7 @@
             name = hbTrId("txt_phob_list_unnamed");
         }
         
-        HbMessageBox::question(HbParameterLengthLimiter(hbTrId("txt_phob_info_delete_1")).arg(name), this, SLOT(handleDeleteContact(int)), 
+        HbMessageBox::question(HbParameterLengthLimiter("txt_phob_info_delete_1").arg(name), this, SLOT(handleDeleteContact(int)), 
                 HbMessageBox::Delete | HbMessageBox::Cancel);
     }
     
@@ -545,7 +603,13 @@
     
     disconnect(&mgr, SIGNAL(contactsRemoved(const QList<QContactLocalId>&)),
                             this, SLOT(contactDeletedFromOtherSource(const QList<QContactLocalId>&)));
-    CntSaveManager::CntSaveResult result = mSaveManager->saveContact(mContact, &mgr);
+    
+    CntSaveManager& save = mEngine->saveManager();
+    CntSaveManager::CntSaveResult result;
+    if ( mIsMyCard )
+        result = save.saveMyCard(mContact, &mgr);
+    else
+        result = save.saveContact( mContact, &mgr );
     
     QVariant var;
     bool backToRoot(false);
@@ -554,14 +618,14 @@
     {
     case CntSaveManager::ESaved:
         emit q->contactUpdated(KCntServicesReturnValueContactSaved);
-        HbDeviceNotificationDialog::notification(QString(),HbParameterLengthLimiter(hbTrId("txt_phob_dpophead_contact_1_saved")).arg(name));
+        HbDeviceNotificationDialog::notification(QString(), HbParameterLengthLimiter("txt_phob_dpophead_contact_1_saved").arg(name));
         var.setValue(*mContact);
         mArgs.insert(ESelectedContact, var);
         mArgs.insert(ESelectedAction, CNT_CREATE_ACTION);
         break;
     case CntSaveManager::EUpdated:
         emit q->contactUpdated(KCntServicesReturnValueContactSaved);
-        HbDeviceNotificationDialog::notification(QString(),HbParameterLengthLimiter(hbTrId("txt_phob_dpophead_contacts_1_updated")).arg(name));
+        HbDeviceNotificationDialog::notification(QString(), HbParameterLengthLimiter("txt_phob_dpophead_contacts_1_updated").arg(name));
         var.setValue(*mContact);
         mArgs.insert(ESelectedContact, var);
         mArgs.insert(ESelectedAction, CNT_EDIT_ACTION);
@@ -808,5 +872,19 @@
     CNT_EXIT
 }
 
+void CntEditViewPrivate::setObjectNames()
+{
+    int itemCount = mModel->rowCount();
+    
+    for (int itemRow = 0 ; itemRow < itemCount ; itemRow++)
+    {
+        QModelIndex modelIndex = mModel->index(itemRow);
+        HbListViewItem* item = static_cast<HbListViewItem*>(mListView->itemByIndex(modelIndex));
+        if (NULL != item)
+        {
+            item->setObjectName(QString("ListViewItem %1").arg(itemRow));
+        }
+    }   
+}
 // End of File
 
--- a/phonebookui/cntcommonui/contacteditors/cnteditview_p.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/contacteditors/cnteditview_p.h	Fri Oct 15 12:24:46 2010 +0300
@@ -43,7 +43,6 @@
 class QAction;
 class HbMenu;
 class XQAiwRequest;
-class CntSaveManager;
 class CntAbstractEngine;
 
 QTM_BEGIN_NAMESPACE
@@ -63,6 +62,8 @@
     
     void activate( const CntViewParameters aArgs );
     void deactivate();
+    QString externalize(QDataStream &stream);
+    bool internalize(QDataStream &stream, CntViewParameters &viewParameters);
     
 public: // From CntEditViewItemCallback
     void openView(CntViewParameters& viewParams);
@@ -93,6 +94,7 @@
     void ringToneFetchHandleError(int errorCode, const QString& errorMessage);
     void ringToneFetchHandleOk(const QVariant &result);
     void contactDeletedFromOtherSource(const QList<QContactLocalId>& contactIds);
+    void setObjectNames();
 
 private:
     void loadAvatar();
@@ -132,7 +134,6 @@
     XQAiwRequest* mReq;
     XQApplicationManager mAppMgr;
     HbMenu *mMenu;
-    CntSaveManager* mSaveManager; // own
 
 };
 #endif /* CNTEDITVIEW_P_H_ */
--- a/phonebookui/cntcommonui/contacteditors/cnteditviewlistmodel.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/contacteditors/cnteditviewlistmodel.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -323,6 +323,7 @@
 
 void CntEditViewListModel::refresh()
 {
+    mItemList.clear();
     insertItem( EPhonenumber, mBuilder->phoneNumberItems(mContact) );
     insertItem( EEmailAddress, mBuilder->emailAddressItems(mContact) );
     insertItem( EAddressTemplate, mBuilder->addressItems(mContact) );
--- a/phonebookui/cntcommonui/contacteditors/cntnoteeditormodel.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/contacteditors/cntnoteeditormodel.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -25,6 +25,7 @@
     foreach ( QContactNote note, mContact->details<QContactNote>() )
     {
         CntDetailModelItem* item = new CntDetailModelItem(note);
+        item->setLabel(hbTrId("txt_phob_formlabel_note"));
         appendDataFormItem( item, root );
         connect( item, SIGNAL(itemDataChanged(CntDetailModelItem*)), this, SLOT(emitDataChanged(CntDetailModelItem*)) );
     }
@@ -39,6 +40,7 @@
     QContactNote emptyNote;
     mNoteList.append( emptyNote );
     CntDetailModelItem* newNote = new CntDetailModelItem(emptyNote);
+    newNote->setLabel(hbTrId("txt_phob_formlabel_note"));
     appendDataFormItem( newNote, invisibleRootItem() );
     connect( newNote, SIGNAL(itemDataChanged(CntDetailModelItem*)), this, SLOT(emitDataChanged(CntDetailModelItem*)) );
     emitDataChanged(newNote);
--- a/phonebookui/cntcommonui/contacteditors/cntnoteeditorviewitem.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/contacteditors/cntnoteeditorviewitem.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -19,62 +19,63 @@
 #include "cntdetailmodelitem.h"
 #include <hbdataformmodel.h>
 #include <hbabstractitemview.h>
-#include <hblabel.h>
-#include <hbmainwindow.h>
+#include <hblineedit.h>
+#include <hbwidget.h>
 #include <qcontactnote.h>
 #include <QGraphicsLinearLayout>
 
 CntNoteEditorViewItem::CntNoteEditorViewItem( QGraphicsItem* aParent ) :
-CntDetailViewItem(aParent),
-mEdit(NULL),
-mLayout(NULL)
-    {
-    }
+    CntDetailViewItem(aParent),
+    mEdit(NULL),
+    mLayout(NULL)
+{
+    
+}
 
 CntNoteEditorViewItem::~CntNoteEditorViewItem()
-    {
-    }
+{
     
+}
+
 HbAbstractViewItem* CntNoteEditorViewItem::createItem()
-    {
+{
     return new CntNoteEditorViewItem( *this );
-    }
+}
 
 void CntNoteEditorViewItem::textChanged(const QString& aText)
-    {
+{
     HbDataFormModel* model = static_cast<HbDataFormModel*>(itemView()->model());
     CntDetailModelItem* item = static_cast<CntDetailModelItem*>( model->itemFromIndex(modelIndex()) );
     QContactNote detail = item->detail();
     detail.setNote( aText );
     item->setDetail( detail );
-    }
+}
 
 HbWidget* CntNoteEditorViewItem::createCustomWidget()
-    {
+{
     HbDataFormModel* model = static_cast<HbDataFormModel*>(itemView()->model());
     CntDetailModelItem* item = static_cast<CntDetailModelItem*>( model->itemFromIndex(modelIndex()) );
     QContactNote detail = item->detail();
 
     mLayout = new QGraphicsLinearLayout(Qt::Vertical);
+    mLayout->setContentsMargins(0, 0, 0, 0);
     HbWidget* widget = new HbWidget();
-    
+
     mEdit = new HbLineEdit();
     mEdit->setInputMethodHints(Qt::ImhNoPredictiveText);
-    
+
     mEdit->setMaxLength( CNT_NOTE_EDITOR_MAXLENGTH );
     mEdit->setMinRows( CNT_NOTE_EDITOR_MIN_ROWCOUNT );
     mEdit->setText( detail.note() );
 
-    HbLabel* label = new HbLabel(hbTrId("txt_phob_formlabel_note"));
-    mLayout->addItem(label);
     mLayout->addItem(mEdit);
     widget->setLayout( mLayout );
-    
+
     connect( mEdit, SIGNAL(textChanged(QString)), this, SLOT(textChanged(QString)) );
-    
+
     // Naming UI components for automation testability
     QString editorObjName = detail.definitionName() + " line edit %1";
     mEdit->setObjectName(editorObjName.arg(modelIndex().row()));
     return widget;
-    }
+}
 // End of File
--- a/phonebookui/cntcommonui/contacteditors/cntnoteeditorviewitem.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/contacteditors/cntnoteeditorviewitem.h	Fri Oct 15 12:24:46 2010 +0300
@@ -21,12 +21,12 @@
 #include "cntdetailviewitem.h"
 #include <hbabstractviewitem.h>
 #include <qgraphicslinearlayout.h>
-#include <hbwidget.h>
-#include <hbtextitem.h>
-#include <hblineedit.h>
+
+class HbWidget;
+class HbLineEdit;
 
 class CntNoteEditorViewItem : public CntDetailViewItem
-    {
+{
     Q_OBJECT
     
 public:
@@ -45,6 +45,6 @@
     QGraphicsLinearLayout* mLayout;
     
     friend class T_NoteEditorTest;
-    };
+};
 
 #endif /* CNTNOTEEDITORVIEWITEM_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/core/cntactivities.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,90 @@
+/*
+* 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 "cntactivities.h"
+#include "cntglobal.h"
+#include <cntdebug.h>
+#include <afactivation.h>
+#include <afactivitystorage.h>
+#include <QPixmap>
+
+
+/*!
+Constructor, initialize member variables.
+*/
+CntActivities::CntActivities()
+{
+    mActivation = new AfActivation();
+    mActivityStorage = new AfActivityStorage();
+}
+
+/*!
+Destructor
+*/
+CntActivities::~CntActivities()
+{
+    delete mActivation;
+    delete mActivityStorage;
+}
+
+bool CntActivities::loadActivity(QByteArray &serializedModel)
+{   
+    bool isActityStartup = false;
+    if (mActivation->reason() == Af::ActivationReasonActivity)
+    {
+        QVariant data = mActivityStorage->activityData(mActivation->name());       
+        // restore state from activity data           
+        serializedModel = data.toByteArray();
+        isActityStartup = true;
+    }
+    
+    // clean up all activities from the activity manager.
+    removeActivities();
+    
+    return isActityStartup;
+}
+
+void CntActivities::saveActivity(const QString &name, const QByteArray &serializedActivity, const QPixmap &screenshot)
+{ 
+    // clean up all activities from the activity manager.
+    removeActivities();
+    
+    // do not save empty activity
+    if (name.isEmpty())
+        return;
+    
+    // screen shot
+    QVariantHash metadata;
+    metadata.insert("screenshot", screenshot);
+    
+    // add the activity to the activity manager
+    bool ok = mActivityStorage->saveActivity(name, serializedActivity, metadata);  
+    if ( !ok )
+    {
+        qFatal("Add failed");
+    }
+}
+
+void CntActivities::removeActivities()
+{ 
+    QStringList activityList = mActivityStorage->allActivities();
+    foreach (QString activity, activityList)
+    {            
+        mActivityStorage->removeActivity(activity);
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/core/cntactivities.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,48 @@
+/*
+* 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:
+*
+*/
+
+#ifndef CNTACTIVITIES_H_
+#define CNTACTIVITIES_H_
+
+#include "cntviewparams.h"
+
+class AfActivation;
+class AfActivityStorage;
+
+/*
+* Class for load and save activities of contacts application.
+*/
+class CntActivities : public QObject 
+{ 
+    Q_OBJECT
+    
+public:
+    CntActivities();
+    ~CntActivities();
+    bool loadActivity(QByteArray &serializedModel);
+    void saveActivity(const QString &name, const QByteArray &serializedActivity, const QPixmap &screenshot);
+    void removeActivities();
+      
+private:
+    AfActivation*           mActivation; 
+    AfActivityStorage*      mActivityStorage;
+
+friend class TestCntActivities;
+    
+};
+
+#endif /* CNTACTIVITIES_H_ */
--- a/phonebookui/cntcommonui/core/cntdefaultengine.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/core/cntdefaultengine.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -19,12 +19,14 @@
 #include "cntdefaultengine.h"
 #include "cntextensionmanager.h"
 #include "cntthumbnailmanager.h"
+#include "cntsavemanager.h"
 #include "cntdebug.h"
 
 CntDefaultEngine::CntDefaultEngine( CntAbstractViewManager& aManager ) :
 mViewManager( aManager ),
 mExtManager( NULL ),
-mThumbnail( NULL )
+mThumbnail( NULL ),
+mSaveManager( NULL )
 {
 }
 
@@ -82,4 +84,12 @@
     return *mThumbnail;
 }
 
+CntSaveManager& CntDefaultEngine::saveManager()
+{
+    if ( !mSaveManager )
+        mSaveManager = new CntSaveManager( this );
+    
+    return *mSaveManager;
+}
+
 // End of File
--- a/phonebookui/cntcommonui/core/cntdefaultengine.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/core/cntdefaultengine.h	Fri Oct 15 12:24:46 2010 +0300
@@ -29,17 +29,19 @@
     CntDefaultEngine( CntAbstractViewManager& aManager );
     ~CntDefaultEngine();
     
-public:
-    QContactManager& contactManager( const QString& aType );
+public: // From CntAbstractEngine
+    QContactManager& contactManager( const QString& type );
     CntAbstractViewManager& viewManager();
     CntExtensionManager& extensionManager();
     CntThumbnailManager& thumbnailManager();
+    CntSaveManager& saveManager();
     
 private:
-    QList<QContactManager*> mBackends;
+    QList<QContactManager*> mBackends; // own list content
     CntAbstractViewManager& mViewManager;
-    CntExtensionManager* mExtManager;
-    CntThumbnailManager* mThumbnail;
+    CntExtensionManager* mExtManager; // own
+    CntThumbnailManager* mThumbnail; // own
+    CntSaveManager* mSaveManager; // own
 };
 
 #endif /* CNTDEFAULTENGINE_H_ */
--- a/phonebookui/cntcommonui/core/cntdefaultviewfactory.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/core/cntdefaultviewfactory.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -38,10 +38,47 @@
 #include "cntsettingsview.h"
 #include "cntextensionmanager.h"
 
+const char *styleFiles = \
+    ":/style/cntcollectionviewlistitem.css" \
+    ":/style/cntcommondetailviewitem.css" \
+    ":/style/cntcommondetailviewitem.widgetml" \
+    ":/style/cntcontactcarddetailitem.css" \
+    ":/style/cntcontactcarddetailitem.widgetml" \
+    ":/style/cntcontactcarddetailitem_color.css" \
+    ":/style/cntcontactcardheadingitem.css" \
+    ":/style/cntcontactcardheadingitem.widgetml" \
+    ":/style/cntcontactcardheadingitem_color.css" \
+    ":/style/cnteditviewheadingitem.css" \
+    ":/style/cnteditviewheadingitem.widgetml" \
+    ":/style/cnteditviewheadingitem_color.css" \
+    ":/style/cnteditviewlistitem.css" \
+    ":/style/cnteditviewlistitem.hblistviewitem.widgetml" \
+    ":/style/cntfetchmarkall.css" \
+    ":/style/cntfetchmarkall.widgetml" \
+    ":/style/cntfetchmarkall_color.css" \
+    ":/style/cntgroupmemberviewlistitem.css" \
+    ":/style/cnthistoryviewitemwidget.css" \
+    ":/style/cnthistoryviewitemwidget.widgetml" \
+    ":/style/cnthistoryviewitemwidget_color.css" \
+    ":/style/cntimagelabel.css" \
+    ":/style/cntimagelabel.widgetml" \
+    ":/style/cntlocationbutton.css" \
+    ":/style/cntlocationbutton.hbpushbutton.widgetml" \
+    ":/style/cntselectiondialogmarkwidget_color.css";
+
 CntDefaultViewFactory::CntDefaultViewFactory( CntExtensionManager& aExt ):
     mExtensionManager( aExt )
 {
-    HbStyleLoader::registerFilePath( ":/style" );
+    QString files(styleFiles);
+    int lastPos = 0;
+    while (lastPos < files.length()) {
+        int pos = files.indexOf(":/style/", lastPos + 1);
+        if (pos == -1) {
+            pos = files.length();
+        }
+        HbStyleLoader::registerFilePath(files.mid(lastPos, pos - lastPos));
+        lastPos = pos;
+    }
 }
 
 CntDefaultViewFactory::~CntDefaultViewFactory()
--- a/phonebookui/cntcommonui/core/cntdefaultviewmanager.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/core/cntdefaultviewmanager.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -133,6 +133,7 @@
     {
         mArgs.insert( k, aArgs.value(k) );
     }
+    
     mArgs.insert(EViewId, back );
 
     if (mArgs.value(EViewId).toInt() != noView)
@@ -140,9 +141,8 @@
         switchView( mArgs, flags );
     }
     else 
-    {
+    {  
         // exiting application
-        cleanup();
         closeApp();
     }
     
@@ -164,34 +164,16 @@
     
     QFlags<Hb::ViewSwitchFlag> flags;
     mNavigator->next(aArgs.value(EViewId).toInt(), flags);
+    
+    foreach(int k, aArgs.keys())
+    {
+        mArgs.insert(k, aArgs.value(k));
+    }
+    
     switchView(aArgs, flags);
     
     CNT_EXIT
 }
-/*
-QContactManager* CntDefaultViewManager::contactManager( const QString& aType )
-{
-    CNT_ENTRY
-    
-    foreach ( QContactManager* mgr, mBackends ) 
-    {
-        QString uri = mgr->managerUri();
-        if ( aType.compare(uri, Qt::CaseInsensitive) == 0 )
-        {
-            return mgr;
-        }
-    }
-    QContactManager* manager = QContactManager::fromUri( aType );
-    
-    if ( manager )
-    {
-        mBackends.append( manager );
-    }
-    
-    CNT_EXIT
-    return manager;
-}
-*/
 
 void CntDefaultViewManager::removeCurrentView()
 {
@@ -234,11 +216,11 @@
     CNT_EXIT
 }
 
-void CntDefaultViewManager::switchView(const CntViewParameters aArgs, QFlags<Hb::ViewSwitchFlag> flags)
+void CntDefaultViewManager::switchView(const CntViewParameters args, QFlags<Hb::ViewSwitchFlag> flags)
 {
     CNT_ENTRY
 
-    int id = aArgs.value(EViewId).toInt();
+    int id = args.value(EViewId).toInt();
     if ( id != noView )
     {
         CntAbstractView* nextView(NULL);
@@ -258,20 +240,79 @@
         }
         
         mOldView = mCurrent;
-        mCurrent = nextView;
-        mMainWindow->addView(mCurrent->view());
-        mMainWindow->setCurrentView(mCurrent->view(), true, flags);
-        mCurrent->activate(aArgs);
-        
+        activateView(nextView, args, flags);
         removeCurrentView();
     }
     
     CNT_EXIT
 }
 
-int CntDefaultViewManager::currentViewId()
+void CntDefaultViewManager::activateView(CntAbstractView* nextView, const CntViewParameters args, QFlags<Hb::ViewSwitchFlag> flags)
+{
+    CNT_ENTRY
+    
+    mCurrent = nextView;
+    mMainWindow->addView(mCurrent->view());
+    mMainWindow->setCurrentView(mCurrent->view(), true, flags);
+    mCurrent->activate(args);
+    
+    CNT_EXIT
+}
+
+bool CntDefaultViewManager::internalize(QDataStream &stream)
 {
-    return mCurrent->viewId();
+    CNT_ENTRY
+    
+    int id = mNavigator->internalize(stream);   
+    if (id == noView)
+    {
+        return false;
+    }
+    
+    CntAbstractView* nextView(NULL);
+    nextView = mFactory->createView(id);
+    nextView->setEngine(*mEngine);
+     
+    CntViewParameters viewParams;
+    
+    bool success = nextView->internalize(stream, viewParams);
+    
+    if (success)
+    {
+       if (nextView->isDefault())
+       {
+           mDefaults.insert(id, nextView);
+       }
+       QFlags<Hb::ViewSwitchFlag> flags;
+       mNavigator->next(id, flags);
+       
+       activateView(nextView, viewParams, flags);
+    }
+    else
+    {
+        mNavigator->clearViewStack();
+        delete nextView;
+    }
+      
+    CNT_EXIT  
+    return success;
+}
+
+QString CntDefaultViewManager::externalize(QDataStream& stream) const
+{
+    CNT_ENTRY
+    
+    mNavigator->externalize(stream);
+    
+    QString activity;
+    
+    if (mCurrent)
+    {
+        activity = mCurrent->externalize(stream); 
+    }
+       
+    CNT_EXIT
+    return activity;  
 }
 
 // End of File
--- a/phonebookui/cntcommonui/core/cntdefaultviewmanager.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/core/cntdefaultviewmanager.h	Fri Oct 15 12:24:46 2010 +0300
@@ -53,7 +53,11 @@
     void back( const CntViewParameters aArgs, bool toRoot = false );
     
 public:
-    int currentViewId();
+    bool internalize(QDataStream &stream);
+    QString externalize(QDataStream &stream) const;
+
+private:
+    void activateView(CntAbstractView* nextView, const CntViewParameters args, QFlags<Hb::ViewSwitchFlag> flags);
     
 private slots:
     void removeCurrentView();
--- a/phonebookui/cntcommonui/core/cntmainwindow.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/core/cntmainwindow.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -20,20 +20,29 @@
 #include "cntviewnavigator.h"
 #include "cntabstractviewfactory.h"
 #include "cntkeygrabber.h"
+#include "cntapplication.h"
+#include "cntactivities.h"
 #include <cntdebug.h>
 #include <cntabstractengine.h>
 
 
 CntMainWindow::CntMainWindow(QWidget *parent, int defaultView)
     : HbMainWindow(parent),
-    mViewManager( NULL ),
-    mDefaultView( defaultView )
+    mViewManager(NULL),
+    mDefaultView(defaultView),
+    mActivities(NULL)
 {
     CNT_ENTRY
+    
     CntKeyGrabber *keyGrabber = new CntKeyGrabber(this, this);
     
     if (defaultView != noView)
     {
+        mViewManager = new CntDefaultViewManager( this );
+        mActivities = new CntActivities();
+        
+        connect(qApp, SIGNAL(aboutToQuit()), this, SLOT(saveActivity()));
+         
         CntViewNavigator* navigator = new CntViewNavigator(this);
         navigator->addException( favoritesMemberView, collectionView );
         navigator->addEffect( groupMemberView, groupActionsView );
@@ -44,15 +53,27 @@
         navigator->addRoot( collectionView );
         navigator->addRoot( groupMemberView );
         navigator->addRoot( favoritesMemberView );
-                
-        mViewManager = new CntDefaultViewManager( this );
+        
         mViewManager->setViewNavigator( navigator );
         mViewManager->setViewFactory( new CntDefaultViewFactory( mViewManager->engine().extensionManager()) );
+         
+        //load the activity
+        QByteArray serializedModel;
+        if (mActivities->loadActivity(serializedModel))
+        {
+            // restore state from activity data 
+            QDataStream stream(&serializedModel, QIODevice::ReadOnly);
+            if (mViewManager->internalize(stream))
+            {
+                // activity loaded.
+                return;
+            }
+        }
         
         //activate the view
         CntViewParameters viewParameters;
         viewParameters.insert(EViewId, defaultView);
-        mViewManager->changeView( viewParameters );
+        mViewManager->changeView( viewParameters );   
     }
 
     CNT_EXIT
@@ -61,10 +82,25 @@
 CntMainWindow::~CntMainWindow()
 {
     CNT_ENTRY
-
+    
     delete mViewManager;
     mViewManager = NULL;
     
+    delete mActivities;
+    mActivities = NULL;
+    
+    CNT_EXIT
+}
+
+void CntMainWindow::saveActivity()
+{
+    CNT_ENTRY
+        
+    QByteArray serializedActivity;
+    QDataStream stream(&serializedActivity, QIODevice::WriteOnly | QIODevice::Append);
+    QString name = mViewManager->externalize(stream);
+    mActivities->saveActivity(name, serializedActivity, QPixmap::grabWidget(this, rect()));
+    
     CNT_EXIT
 }
 
--- a/phonebookui/cntcommonui/core/cntmainwindow.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/core/cntmainwindow.h	Fri Oct 15 12:24:46 2010 +0300
@@ -25,6 +25,7 @@
 
 class CntDefaultViewManager;
 class XqKeyCapture;
+class CntActivities;
 
 class QTPBK_EXPORT CntMainWindow : public HbMainWindow
 {
@@ -35,10 +36,13 @@
     CntMainWindow(QWidget *parent=0, int defaultView = namesView);
     virtual ~CntMainWindow();
 
+private slots:
+    void saveActivity();
+    
 private:
     CntDefaultViewManager        *mViewManager;
     int                           mDefaultView;
-
+    CntActivities                *mActivities;
 };
 
 #endif // CNTMAINWINDOW_H
--- a/phonebookui/cntcommonui/core/cntviewnavigator.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/core/cntviewnavigator.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -19,8 +19,9 @@
 #include <QDebug>
 
 CntViewNavigator::CntViewNavigator( QObject* aParent ) : 
-    QObject( aParent ),
-    iTop( noView )
+    QObject(aParent),
+    mTop(noView),
+    mPreviousViewId(noView)
 {
     
 }
@@ -32,12 +33,12 @@
 
 void CntViewNavigator::next( const int& aId, QFlags<Hb::ViewSwitchFlag> &flags )
 {
-    if ( !iViewStack.isEmpty() )
+    if ( !mViewStack.isEmpty() )
     {
-        int top = iViewStack.top();
+        int top = mViewStack.top();
         
         // If any special effects are defined for the current (top) view and associated with the next view
-        if ( iEffects.contains( top ) && iEffects.value( top ) == aId ) 
+        if ( mEffects.contains( top ) && mEffects.value( top ) == aId ) 
         {
             flags = Hb::ViewSwitchUseNormalAnim | Hb::ViewSwitchUseAltEvent;
         }
@@ -46,61 +47,61 @@
             flags = Hb::ViewSwitchUseNormalAnim;
         }
     }
-    iViewStack.push( aId );
+    mViewStack.push( aId );
 }
 
 const int& CntViewNavigator::back( QFlags<Hb::ViewSwitchFlag> &flags, bool toRoot )
 {
-    iTop = noView;
+    mTop = noView;
     // Check if exception is set for current view item. Exception
     // means that instead of one step back, we go back until that 
     // execption value is located. So all items that are jumped over,
     // their history will be eared.
-    if ( !iViewStack.isEmpty() ) 
+    if ( !mViewStack.isEmpty() ) 
     {
-        int top = iViewStack.top();
+        int top = mViewStack.top();
         
         // If we need to go to the latest root view
         if ( toRoot )
         {
-            while ( !iViewStack.isEmpty() ) 
+            while ( !mViewStack.isEmpty() ) 
             {
-                int current = iViewStack.top();
+                int current = mViewStack.top();
                 
-                if ( iRoots.contains( current ) )
+                if ( mRoots.contains( current ) )
                 {
-                    iTop = current;
+                    mTop = current;
                     break;
                 }
-                iViewStack.pop();
+                mPreviousViewId = mViewStack.pop();
             }
         }
         // If any exception defined for the current (top) view
-        else if ( iExceptions.contains( top ) ) 
+        else if ( mExceptions.contains( top ) ) 
         {
-            iTop = iExceptions.value( top );
+            mTop = mExceptions.value( top );
             // cleanup the history until the exception value is found
-            while ( !iViewStack.isEmpty() ) 
+            while ( !mViewStack.isEmpty() ) 
             {
-                if ( iTop == iViewStack.top() ) 
+                if ( mTop == mViewStack.top() ) 
                 {
                     break; // don't pop the exception it self.
                 }
-                iViewStack.pop();
+                mPreviousViewId = mViewStack.pop();
             }
         }
         // No exceptions defined, go one step back
         else 
         {
-            iViewStack.pop();
-            if ( !iViewStack.isEmpty() )
+            mPreviousViewId = mViewStack.pop();
+            if ( !mViewStack.isEmpty() )
             {
-                iTop = iViewStack.top();
+                mTop = mViewStack.top();
             }
         }
         
         // If any special effects are defined for the current (top) view and associated with the previous view
-        if ( iEffects.contains( top ) && iEffects.value( top ) == iTop ) 
+        if ( mEffects.contains( top ) && mEffects.value( top ) == mTop ) 
         {
             flags = Hb::ViewSwitchUseBackAnim | Hb::ViewSwitchUseAltEvent;
         }
@@ -110,38 +111,68 @@
         }
     } 
 
-    return iTop;
+    return mTop;
 }
 
 void CntViewNavigator::addException( const int& aCurrent, const int& aBack )
 {
-    iExceptions.insert( aCurrent, aBack );
+    mExceptions.insert( aCurrent, aBack );
 }
 
 void CntViewNavigator::removeException( const int& aCurrent )
 {
-    if ( iExceptions.contains(aCurrent) )
+    if ( mExceptions.contains(aCurrent) )
     {
-        iExceptions.remove( aCurrent );
+        mExceptions.remove( aCurrent );
     }
 }
 
 void CntViewNavigator::addEffect( const int& aCurrent, const int& aBack )
 {
-    iEffects.insert( aCurrent, aBack );
+    mEffects.insert( aCurrent, aBack );
 }
 
 void CntViewNavigator::removeEffect( const int& aCurrent )
 {
-    if ( iEffects.contains(aCurrent) )
+    if ( mEffects.contains(aCurrent) )
     {
-        iEffects.remove( aCurrent );
+        mEffects.remove( aCurrent );
     }
 }
 
 void CntViewNavigator::addRoot( const int& aCurrent )
 {
-    iRoots.append( aCurrent );
+    mRoots.append( aCurrent );
+}
+ 
+int CntViewNavigator::internalize(QDataStream &stream)
+{
+    int viewId = noView;
+    //read the view id and a view stack from stream.
+    stream >> viewId >> mViewStack;
+    
+    return viewId;
 }
     
+void CntViewNavigator::externalize(QDataStream &stream)
+{
+    int viewId = noView;
+        
+    //remove top view id of stack.
+    if (!mViewStack.isEmpty()) {
+        viewId = mViewStack.pop();
+    }
+    
+    if (viewId == noView) {
+        viewId = mPreviousViewId;
+    }
+    //stream the view id and a view stack
+    stream << viewId << mViewStack;
+}
+
+void CntViewNavigator::clearViewStack()
+{
+    mViewStack.clear();
+}
+
 // End of File
--- a/phonebookui/cntcommonui/core/cntviewnavigator.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/core/cntviewnavigator.h	Fri Oct 15 12:24:46 2010 +0300
@@ -70,12 +70,28 @@
      * Set a view as a root view.
      */
     void addRoot( const int& aCurrent );
+        
+    /*!
+     * Internalize view data. Returns the previous view id.
+     */
+    int internalize(QDataStream &stream);
+    
+    /*!
+     * Externalize view data.
+     */
+    void externalize(QDataStream &stream);
+    
+    /*!
+     * Clear view stack.
+     */
+    void clearViewStack();
     
 private:
-    QStack<int> iViewStack;
-    QMap< int, int > iExceptions;
-    QMap< int, int > iEffects;
-    QList<int> iRoots;
-    int iTop;
+    QStack<int> mViewStack;
+    QMap< int, int > mExceptions;
+    QMap< int, int > mEffects;
+    QList<int> mRoots;
+    int mTop;
+    int mPreviousViewId;
 };
 #endif /* CNTVIEWNAVIGATOR_H_ */
--- a/phonebookui/cntcommonui/resources/cntcommonui.qrc	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/resources/cntcommonui.qrc	Fri Oct 15 12:24:46 2010 +0300
@@ -31,8 +31,9 @@
         <file alias="cntcontactcardheadingitem.widgetml">style/cntcontactcardheadingitem.widgetml</file>
         <file alias="cntcontactcardheadingitem.css">style/cntcontactcardheadingitem.css</file>
         <file alias="cntcontactcardheadingitem_color.css">style/cntcontactcardheadingitem_color.css</file>
-        <file alias="cnthistoryviewitem.widgetml">style/cnthistoryviewitem.widgetml</file>
-        <file alias="cnthistoryviewitem.css">style/cnthistoryviewitem.css</file>
+        <file alias="cnthistoryviewitemwidget.widgetml">style/cnthistoryviewitemwidget.widgetml</file>
+        <file alias="cnthistoryviewitemwidget.css">style/cnthistoryviewitemwidget.css</file>
+        <file alias="cnthistoryviewitemwidget_color.css">style/cnthistoryviewitemwidget_color.css</file>
         <file alias="cntcommondetailviewitem.widgetml">style/cntcommondetailviewitem.widgetml</file>
         <file alias="cntcommondetailviewitem.css">style/cntcommondetailviewitem.css</file>
         <file alias="cntimagelabel.widgetml">style/cntimagelabel.widgetml</file>
@@ -45,4 +46,7 @@
         <file alias="cntcollectionviewlistitem.css">style/cntcollectionviewlistitem.css</file>
         <file alias="cntgroupmemberviewlistitem.css">style/cntgroupmemberviewlistitem.css</file>
     </qresource>
+    <qresource prefix="/effects">
+        <file alias="item_change_layout.fxml">effects/item_change_layout.fxml</file>
+    </qresource>
 </RCC>
--- a/phonebookui/cntcommonui/resources/contacts_namelist.docml	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/resources/contacts_namelist.docml	Fri Oct 15 12:24:46 2010 +0300
@@ -60,7 +60,6 @@
             <ref object="cnt:settings" role="HbMenu:addAction"/>
         </widget>
         <string locid="txt_phob_title_contacts" name="title" value="Contacts"/>
-        <bool name="contentFullScreen" value="FALSE"/>
     </widget>
 
     <section name="no_find">
@@ -81,7 +80,6 @@
                 </layout>
             </widget>
             <string locid="txt_phob_title_contacts" name="title" value="Contacts"/>
-            <bool name="contentFullScreen" value="FALSE"/>
         </widget>
     </section>
 
@@ -104,7 +102,6 @@
                 </layout>
             </widget>
             <string locid="txt_phob_title_contacts" name="title" value="Contacts"/>
-            <bool name="contentFullScreen" value="TRUE"/>
         </widget>
     </section>
 
@@ -127,7 +124,6 @@
                 </layout>
             </widget>
             <string locid="txt_phob_title_contacts" name="title" value="Contacts"/>
-            <bool name="contentFullScreen" value="TRUE"/>
         </widget>
     </section>
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/resources/effects/item_change_layout.fxml	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,9 @@
+<layers>
+    <visual>
+        <param name="opacity" type="anim">
            <style>outquad</style>
+            <duration>0.4</duration>
+            <keyframe at="0.0">1.0</keyframe>
+            <keyframe at="0.5">0.0</keyframe>
            <keyframe at="1.0">1.0</keyframe>
+        </param>
+    </visual>
+</layers>
--- a/phonebookui/cntcommonui/resources/style/cntcommondetailviewitem.widgetml	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/resources/style/cntcommondetailviewitem.widgetml	Fri Oct 15 12:24:46 2010 +0300
@@ -1,24 +1,24 @@
 <hbwidget version="0.1" type="cntcommondetailviewitem">
   <layout name="customLayout" type="mesh">
-    <meshitem src="combobox" srcEdge="TOP" dst="" dstEdge="TOP"  spacing="-var(hb-param-margin-gene-top)" />
-    <meshitem src="combobox" srcEdge="LEFT" dst="" dstEdge="LEFT"  spacing="-var(hb-param-margin-gene-left)" />
-    <meshitem src="combobox" srcEdge="RIGHT" dst="" dstEdge="RIGHT" spacing="var(hb-param-margin-gene-right)" />
+    <meshitem src="combobox" srcEdge="TOP" dst="" dstEdge="TOP"  spacing="0un" />
+    <meshitem src="combobox" srcEdge="LEFT" dst="" dstEdge="LEFT"  spacing="0un" />
+    <meshitem src="combobox" srcEdge="RIGHT" dst="" dstEdge="RIGHT" spacing="0un" />
     
     <meshitem src="editbox" srcEdge="TOP" dst="combobox" dstEdge="BOTTOM" spacing="-var(hb-param-margin-gene-middle-vertical)" />
-    <meshitem src="editbox" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" spacing="var(hb-param-margin-gene-bottom)" />
+    <meshitem src="editbox" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" spacing="0un" />
     <meshitem src="editbox" srcEdge="LEFT" dst="combobox" dstEdge="LEFT" spacing="-var(hb-param-margin-gene-left)" />
-    <meshitem src="editbox" srcEdge="RIGHT" dst="" dstEdge="RIGHT" spacing="var(hb-param-margin-gene-right)" />
+    <meshitem src="editbox" srcEdge="RIGHT" dst="" dstEdge="RIGHT" spacing="0un" />
   </layout>
   
   <layout name="customLayout-landscape" type="mesh">
-    <meshitem src="combobox" srcEdge="LEFT" dst="" dstEdge="LEFT" spacing="-var(hb-param-margin-gene-left)" />
+    <meshitem src="combobox" srcEdge="LEFT" dst="" dstEdge="LEFT" spacing="0un" />
     <meshitem src="combobox" srcEdge="RIGHT" dst="" dstEdge="CENTERH" />
-    <meshitem src="combobox" srcEdge="TOP" dst="" dstEdge="TOP" spacing="-var(hb-param-margin-gene-top)" />
-		<meshitem src="editbox" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" spacing="var(hb-param-margin-gene-bottom)" />
+    <meshitem src="combobox" srcEdge="TOP" dst="" dstEdge="TOP" spacing="0un" />
+		<meshitem src="editbox" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" spacing="0un" />
 
     <meshitem src="editbox" srcEdge="LEFT" dst="combobox" dstEdge="RIGHT" spacing="-var(hb-param-margin-gene-left)" />
-    <meshitem src="editbox" srcEdge="RIGHT" dst="" dstEdge="RIGHT" spacing="var(hb-param-margin-gene-right)" />
-    <meshitem src="editbox" srcEdge="TOP" dst="" dstEdge="TOP" spacing="-var(hb-param-margin-gene-top)" />
-		<meshitem src="editbox" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" spacing="var(hb-param-margin-gene-bottom)" />
+    <meshitem src="editbox" srcEdge="RIGHT" dst="" dstEdge="RIGHT" spacing="0un" />
+    <meshitem src="editbox" srcEdge="TOP" dst="" dstEdge="TOP" spacing="0un" />
+		<meshitem src="editbox" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" spacing="0un" />
   </layout>
 </hbwidget>
--- a/phonebookui/cntcommonui/resources/style/cnthistoryviewitem.css	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-CntHistoryViewItem[layoutName="history"][modelItemType="StandardItem"][incoming]{
-    layout:custom-history-incoming;
-}
-
-CntHistoryViewItem[layoutName="history"][modelItemType="StandardItem"][!incoming]{
-    layout:custom-history-outgoing;
-}
-
-CntHistoryViewItem::text-3[layoutName="history"]{
-    text-height:var(hb-param-text-height-tiny);
-    font-variant:secondary;
-    text-align: left;
-}
-
-CntHistoryViewItem::frame[layoutName="history"]{
-	border-width: 0.0un;
-}
-
-CntHistoryViewItem::newitem[layoutName="history"]{
-    top:-1.0un;
-    bottom:1.0un;
-}
--- a/phonebookui/cntcommonui/resources/style/cnthistoryviewitem.widgetml	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-<hbwidget version="0.1" type="CntHistoryViewItem">
-  <layout name="custom-history-incoming" type="mesh">
-    <meshitem src="text-2" srcEdge="TOP" dst="text-1" dstEdge="BOTTOM" spacing="-var(hb-param-margin-gene-middle-vertical)" />
-    <meshitem src="text-2" srcEdge="LEFT" dst="" dstEdge="LEFT" spacing="expr(-2*var(hb-param-margin-gene-left))" />
-    <meshitem src="text-2" srcEdge="RIGHT" dst="icon-1" dstEdge="LEFT" spacing="expr(var(hb-param-margin-gene-middle-horizontal)+1.0un)" />
-    <meshitem src="text-2" srcEdge="BOTTOM" dst="text-3" dstEdge="TOP" spacing="var(hb-param-margin-gene-middle-vertical)" />
-
-    <meshitem src="text-1" srcEdge="TOP" dst="" dstEdge="TOP" spacing="-var(hb-param-margin-gene-top)"/>
-    <meshitem src="text-1" srcEdge="LEFT" dst="text-2" dstEdge="LEFT" />
-    <meshitem src="text-1" srcEdge="RIGHT" dst="text-2" dstEdge="RIGHT" />
-
-    <meshitem src="text-3" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" spacing="var(hb-param-margin-gene-bottom)"/>
-    <meshitem src="text-3" srcEdge="LEFT" dst="text-2" dstEdge="LEFT"/>
-    <meshitem src="text-3" srcEdge="RIGHT" dst="text-2" dstEdge="RIGHT" />
-
-    <meshitem src="icon-1" srcEdge="CENTERV" dst="" dstEdge="CENTERV"/>
-    <meshitem src="icon-1" srcEdge="RIGHT" dst="" dstEdge="RIGHT" spacing="var(hb-param-margin-gene-right)"/>
-
-    <meshitem src="newitem" srcEdge="LEFT" dst="" dstEdge="LEFT" spacing="-var(hb-param-margin-gene-left)"/>
-    <meshitem src="newitem" srcEdge="RIGHT" dst="text-2" dstEdge="LEFT" spacing="var(hb-param-margin-gene-middle-horizontal)"/>
-    <meshitem src="newitem" srcEdge="TOP" dst="" dstEdge="TOP"/>
-    <meshitem src="newitem" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM"/>
-
-    <meshitem src="frame" srcEdge="LEFT" dst="" dstEdge="LEFT" spacing="-var(hb-param-margin-gene-left)"/>
-    <meshitem src="frame" srcEdge="TOP" dst="" dstEdge="TOP"/>
-    <meshitem src="frame" srcEdge="RIGHT" dst="icon-1" dstEdge="LEFT" spacing="var(hb-param-margin-gene-middle-horizontal)"/>
-    <meshitem src="frame" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM"/>
-  </layout>
-
-  <layout name="custom-history-outgoing" type="mesh">
-    <meshitem src="text-2" srcEdge="TOP" dst="text-1" dstEdge="BOTTOM" spacing="-var(hb-param-margin-gene-middle-vertical)" />
-    <meshitem src="text-2" srcEdge="RIGHT" dst="" dstEdge="RIGHT" spacing="expr(2*var(hb-param-margin-gene-left))" />
-    <meshitem src="text-2" srcEdge="LEFT" dst="icon-1" dstEdge="RIGHT" spacing="expr(-var(hb-param-margin-gene-middle-horizontal)-1.0un)" />
-    <meshitem src="text-2" srcEdge="BOTTOM" dst="text-3" dstEdge="TOP" spacing="var(hb-param-margin-gene-middle-vertical)" />
-
-    <meshitem src="text-1" srcEdge="TOP" dst="" dstEdge="TOP" spacing="-var(hb-param-margin-gene-top)"/>
-    <meshitem src="text-1" srcEdge="LEFT" dst="text-2" dstEdge="LEFT" />
-    <meshitem src="text-1" srcEdge="RIGHT" dst="text-2" dstEdge="RIGHT" />
-
-    <meshitem src="text-3" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" spacing="var(hb-param-margin-gene-bottom)"/>
-    <meshitem src="text-3" srcEdge="LEFT" dst="text-2" dstEdge="LEFT"/>
-    <meshitem src="text-3" srcEdge="RIGHT" dst="text-2" dstEdge="RIGHT" />
-
-    <meshitem src="icon-1" srcEdge="CENTERV" dst="" dstEdge="CENTERV"/>
-    <meshitem src="icon-1" srcEdge="LEFT" dst="" dstEdge="LEFT" spacing="-var(hb-param-margin-gene-right)"/>
-  
-    <meshitem src="frame" srcEdge="LEFT" dst="icon-1" dstEdge="RIGHT" spacing="-var(hb-param-margin-gene-middle-horizontal)" />
-    <meshitem src="frame" srcEdge="TOP" dst="" dstEdge="TOP"/>
-    <meshitem src="frame" srcEdge="RIGHT" dst="" dstEdge="RIGHT" spacing="var(hb-param-margin-gene-left)" />
-    <meshitem src="frame" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM"/>
-  </layout>
-</hbwidget>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/resources/style/cnthistoryviewitemwidget.css	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,52 @@
+CntHistoryViewItemWidget[incoming]{
+    layout:custom-history-incoming;
+}
+
+CntHistoryViewItemWidget[!incoming]{
+    layout:custom-history-outgoing;
+}
+
+CntHistoryViewItemWidget::text-1{
+    text-height: var(hb-param-text-height-primary);
+    font-variant: primary;
+    pref-width:-1;
+    text-align: left;
+    size-policy-horizontal: ignored;
+    text-line-count-min:1;
+    text-line-count-max:1;
+    text-wrap-mode:no-wrap;
+}
+
+CntHistoryViewItemWidget::text-2{
+    text-height: var(hb-param-text-height-secondary);
+    font-variant: secondary;
+    pref-width:-1;
+    text-align: left top;
+    size-policy-horizontal: ignored;
+    text-line-count-min:1;
+    text-line-count-max:3;
+}
+
+CntHistoryViewItemWidget::text-3{
+    text-height:var(hb-param-text-height-tiny);
+    font-variant:secondary;
+    text-align: left;
+}
+
+CntHistoryViewItemWidget::icon-1{
+    fixed-height: var(hb-param-graphic-size-primary-small);
+    fixed-width: var(hb-param-graphic-size-primary-small);
+}
+
+CntHistoryViewItemWidget::frame{
+	border-width: 0.0un;
+}
+
+CntHistoryViewItemWidget::focusframe{
+	border-width: 0.0un;
+}
+
+CntHistoryViewItemWidget::newitem{
+    top:-1.0un;
+    bottom:1.0un;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/resources/style/cnthistoryviewitemwidget.widgetml	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,62 @@
+<hbwidget version="0.1" type="CntHistoryViewItemWidget">
+  <layout name="custom-history-incoming" type="mesh">
+    <meshitem src="text-2" srcEdge="TOP" dst="text-1" dstEdge="BOTTOM" spacing="-var(hb-param-margin-gene-middle-vertical)" />
+    <meshitem src="text-2" srcEdge="LEFT" dst="" dstEdge="LEFT" spacing="expr(-2*var(hb-param-margin-gene-left))" />
+    <meshitem src="text-2" srcEdge="RIGHT" dst="icon-1" dstEdge="LEFT" spacing="expr(var(hb-param-margin-gene-middle-horizontal)+1.0un)" />
+    <meshitem src="text-2" srcEdge="BOTTOM" dst="text-3" dstEdge="TOP" spacing="var(hb-param-margin-gene-middle-vertical)" />
+
+    <meshitem src="text-1" srcEdge="TOP" dst="" dstEdge="TOP" spacing="-var(hb-param-margin-gene-top)"/>
+    <meshitem src="text-1" srcEdge="LEFT" dst="text-2" dstEdge="LEFT" />
+    <meshitem src="text-1" srcEdge="RIGHT" dst="text-2" dstEdge="RIGHT" />
+
+    <meshitem src="text-3" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" spacing="var(hb-param-margin-gene-bottom)"/>
+    <meshitem src="text-3" srcEdge="LEFT" dst="text-2" dstEdge="LEFT"/>
+    <meshitem src="text-3" srcEdge="RIGHT" dst="text-2" dstEdge="RIGHT" />
+
+    <meshitem src="icon-1" srcEdge="CENTERV" dst="" dstEdge="CENTERV"/>
+    <meshitem src="icon-1" srcEdge="RIGHT" dst="" dstEdge="RIGHT" spacing="var(hb-param-margin-gene-right)"/>
+
+    <meshitem src="newitem" srcEdge="LEFT" dst="" dstEdge="LEFT" spacing="-var(hb-param-margin-gene-left)"/>
+    <meshitem src="newitem" srcEdge="RIGHT" dst="text-2" dstEdge="LEFT" spacing="var(hb-param-margin-gene-middle-horizontal)"/>
+    <meshitem src="newitem" srcEdge="TOP" dst="" dstEdge="TOP"/>
+    <meshitem src="newitem" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM"/>
+
+    <meshitem src="frame" srcEdge="LEFT" dst="" dstEdge="LEFT" spacing="-var(hb-param-margin-gene-left)"/>
+    <meshitem src="frame" srcEdge="TOP" dst="" dstEdge="TOP"/>
+    <meshitem src="frame" srcEdge="RIGHT" dst="icon-1" dstEdge="LEFT" spacing="var(hb-param-margin-gene-middle-horizontal)"/>
+    <meshitem src="frame" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM"/>
+
+    <meshitem src="focusframe" srcEdge="LEFT" dst="" dstEdge="LEFT" spacing="-var(hb-param-margin-gene-left)"/>
+    <meshitem src="focusframe" srcEdge="TOP" dst="" dstEdge="TOP"/>
+    <meshitem src="focusframe" srcEdge="RIGHT" dst="icon-1" dstEdge="LEFT" spacing="var(hb-param-margin-gene-middle-horizontal)"/>
+    <meshitem src="focusframe" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM"/>
+  </layout>
+
+  <layout name="custom-history-outgoing" type="mesh">
+    <meshitem src="text-2" srcEdge="TOP" dst="text-1" dstEdge="BOTTOM" spacing="-var(hb-param-margin-gene-middle-vertical)" />
+    <meshitem src="text-2" srcEdge="RIGHT" dst="" dstEdge="RIGHT" spacing="expr(2*var(hb-param-margin-gene-left))" />
+    <meshitem src="text-2" srcEdge="LEFT" dst="icon-1" dstEdge="RIGHT" spacing="expr(-var(hb-param-margin-gene-middle-horizontal)-1.0un)" />
+    <meshitem src="text-2" srcEdge="BOTTOM" dst="text-3" dstEdge="TOP" spacing="var(hb-param-margin-gene-middle-vertical)" />
+
+    <meshitem src="text-1" srcEdge="TOP" dst="" dstEdge="TOP" spacing="-var(hb-param-margin-gene-top)"/>
+    <meshitem src="text-1" srcEdge="LEFT" dst="text-2" dstEdge="LEFT" />
+    <meshitem src="text-1" srcEdge="RIGHT" dst="text-2" dstEdge="RIGHT" />
+
+    <meshitem src="text-3" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM" spacing="var(hb-param-margin-gene-bottom)"/>
+    <meshitem src="text-3" srcEdge="LEFT" dst="text-2" dstEdge="LEFT"/>
+    <meshitem src="text-3" srcEdge="RIGHT" dst="text-2" dstEdge="RIGHT" />
+
+    <meshitem src="icon-1" srcEdge="CENTERV" dst="" dstEdge="CENTERV"/>
+    <meshitem src="icon-1" srcEdge="LEFT" dst="" dstEdge="LEFT" spacing="-var(hb-param-margin-gene-right)"/>
+  
+    <meshitem src="frame" srcEdge="LEFT" dst="icon-1" dstEdge="RIGHT" spacing="-var(hb-param-margin-gene-middle-horizontal)" />
+    <meshitem src="frame" srcEdge="TOP" dst="" dstEdge="TOP"/>
+    <meshitem src="frame" srcEdge="RIGHT" dst="" dstEdge="RIGHT" spacing="var(hb-param-margin-gene-left)" />
+    <meshitem src="frame" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM"/>
+
+    <meshitem src="focusframe" srcEdge="LEFT" dst="icon-1" dstEdge="RIGHT" spacing="-var(hb-param-margin-gene-middle-horizontal)" />
+    <meshitem src="focusframe" srcEdge="TOP" dst="" dstEdge="TOP"/>
+    <meshitem src="focusframe" srcEdge="RIGHT" dst="" dstEdge="RIGHT" spacing="var(hb-param-margin-gene-left)" />
+    <meshitem src="focusframe" srcEdge="BOTTOM" dst="" dstEdge="BOTTOM"/>
+  </layout>
+</hbwidget>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/resources/style/cnthistoryviewitemwidget_color.css	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,31 @@
+CntHistoryViewItemWidget::text-1{
+    color: var(qtc_list_item_title_normal);
+}
+
+CntHistoryViewItemWidget::text-1[state="pressed"]{
+    color: var(qtc_list_item_pressed);
+}
+
+CntHistoryViewItemWidget::text-2{
+    color: var(qtc_list_item_content_normal);
+}
+
+CntHistoryViewItemWidget::text-2[state="pressed"]{
+    color: var(qtc_list_item_pressed);
+}
+
+CntHistoryViewItemWidget::text-3{
+    color: var(qtc_list_item_content_normal);
+}
+
+CntHistoryViewItemWidget::text-3[state="pressed"]{
+    color: var(qtc_list_item_pressed);
+}
+
+CntHistoryViewItemWidget::icon-1{
+    color: var(qtc_list_item_title_normal);
+}
+
+CntHistoryViewItemWidget::icon-1[state="pressed"]{
+    color: var(qtc_list_item_pressed);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/cntactionextensionexample.pro	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,58 @@
+#
+# 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: 
+#
+
+TEMPLATE = lib
+CONFIG += plugin
+CONFIG += hb
+CONFIG += symbian_test
+TARGET = $$qtLibraryTarget(cntexampleactionsplugin)
+DEPENDPATH += .
+INCLUDEPATH += .
+
+# Input
+HEADERS += \
+    inc/cntexampleactionfactory.h \
+    inc/cntexamplebaseaction.h \
+    inc/cntexampleaction.h \
+    inc/cntexample2action.h \
+    inc/cntexamplenodetailaction.h \
+    inc/cntexampledynamicaction.h
+    
+SOURCES += \
+    src/cntexampleactionfactory.cpp \
+    src/cntexamplebaseaction.cpp \
+    src/cntexampleaction.cpp \
+    src/cntexample2action.cpp \
+    src/cntexamplenodetailaction.cpp \
+    src/cntexampledynamicaction.cpp
+MOC_DIR = moc
+
+symbian:
+ { 
+    load(data_caging_paths)
+    TARGET.CAPABILITY = CAP_GENERAL_DLL
+    TARGET.EPOCALLOWDLLDATA = 1
+    TARGET.UID3 = 0xefa11113
+    INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
+    LIBS += -lQtContacts \
+        -lxqservice
+    target.path = /sys/bin
+    INSTALLS += target
+    symbianplugin.sources = $${TARGET}.dll
+    symbianplugin.path = /resource/qt/plugins/contacts
+    DEPLOYMENT += symbianplugin
+}
+symbian:MMP_RULES += SMPSAFE
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/inc/cntexample2action.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+#ifndef QMOBEXAMPLE2ACTION_H
+#define QMOBEXAMPLE2ACTION_H
+
+#include "cntexamplebaseaction.h"
+
+class MobExample2Action : public MobBaseAction
+{
+    Q_OBJECT
+
+public:
+    MobExample2Action(const QString& actionName, const QString& vendorName);
+    ~MobExample2Action();
+    
+    QVariantMap metaData() const;
+    QContactFilter contactFilter(const QVariant& value) const;
+    bool isDetailSupported(const QContactDetail &detail, const QContact &contact = QContact()) const;
+    QList<QContactDetail> supportedDetails(const QContact& contact) const;
+    State state() const;
+    MobExample2Action* clone() const;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/inc/cntexampleaction.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+#ifndef QMOBEXAMPLEACTION_H
+#define QMOBEXAMPLEACTION_H
+
+#include "cntexamplebaseaction.h"
+
+class MobExampleAction : public MobBaseAction
+{
+    Q_OBJECT
+
+public:
+    MobExampleAction(const QString& actionName, const QString& vendorName);
+    ~MobExampleAction();
+    
+    QVariantMap metaData() const;
+    QContactFilter contactFilter(const QVariant& value) const;
+    bool isDetailSupported(const QContactDetail &detail, const QContact &contact = QContact()) const;
+    QList<QContactDetail> supportedDetails(const QContact& contact) const;
+    State state() const;
+    MobExampleAction* clone() const;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/inc/cntexampleactionfactory.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,46 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+#ifndef MOBEXAMPLEACTIONFACTORY_H
+#define MOBEXAMPLEACTIONFACTORY_H
+
+#include <qcontactactionfactory.h>
+#include <qcontactaction.h>
+
+class MobBaseAction;
+
+QTM_USE_NAMESPACE
+
+class Q_DECL_EXPORT MobExampleActionFactory : public QContactActionFactory
+{
+    Q_OBJECT
+    Q_INTERFACES(QtMobility::QContactActionFactory)
+
+public:
+    MobExampleActionFactory();
+    ~MobExampleActionFactory();
+
+    QString name() const;
+    QList<QContactActionDescriptor> actionDescriptors() const;
+    QContactAction* instance(const QContactActionDescriptor& descriptor) const;
+    QVariantMap actionMetadata(const QContactActionDescriptor& descriptor) const;
+
+private:
+    QList<MobBaseAction *> actionList;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/inc/cntexamplebaseaction.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,70 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+#ifndef MOBBASEACTION_H
+#define MOBBASEACTION_H
+
+#include <qcontactaction.h>
+#include <qcontactactiondescriptor.h>
+
+#include <QSharedData>
+#include <QString>
+#include <QVariantMap>
+
+QTM_USE_NAMESPACE
+
+class MobBaseAction : public QContactAction
+{
+    Q_OBJECT
+
+public:   
+    MobBaseAction(const QString &actionName, const QString& vendorName);
+    virtual ~MobBaseAction();
+
+public: 
+	enum ErrorCodes {
+		GeneralError = 1,
+		DetailNotSupported
+	};
+    
+
+public: //QContactAction
+	QContactActionDescriptor actionDescriptor() const;
+    bool invokeAction(const QContact& contact, const QContactDetail& detail = QContactDetail(), const QVariantMap& parameters = QVariantMap());
+    QVariantMap results() const;
+
+public:
+	virtual void resetAction();
+	virtual MobBaseAction* clone() const = 0;
+
+public:   
+    //returns whether the actionDescription is supported by this action
+    bool actionDescriptionSupported(const QContactActionDescriptor& descriptor) const;
+    void emitResult(int errorCode, const QVariant &retValue);
+    
+    
+protected:
+    QString m_actionName;
+	QString m_vendorName;
+	int m_implementationVersion;
+	
+	QVariantMap m_result; 		//result returned to client
+	QContact m_contact;    		//contact passed to invokeAction
+	QContactDetail m_detail; 	//detail passed to invokeAction
+};
+
+#endif //MOBBASEACTION_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/inc/cntexampledynamicaction.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,59 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+#ifndef QMOBEXAMPLEDYNAMICACTION_H
+#define QMOBEXAMPLEDYNAMICACTION_H
+
+#include "cntexamplebaseaction.h"
+
+#include <QIcon>
+
+class MobExampleDynamicAction : public MobBaseAction
+{
+    Q_OBJECT
+
+public:
+    MobExampleDynamicAction(const QString& actionName, const QString& vendorName);
+    MobExampleDynamicAction(const QString& actionName, const QString& vendorName, const MobExampleDynamicAction& copy);
+    ~MobExampleDynamicAction();
+    
+    QVariantMap metaData() const;
+    QContactFilter contactFilter(const QVariant& value) const;
+    bool isDetailSupported(const QContactDetail &detail, const QContact &contact = QContact()) const;
+    QList<QContactDetail> supportedDetails(const QContact& contact) const;
+    State state() const;
+    MobExampleDynamicAction* clone() const;
+    
+    void setDefinitionName(const QString& definitionName);
+    void setFilter(QContactFilter filter);
+    void setIcon(QIcon icon);
+    void setTitleField(QString titleField);
+    void setValueField(QString valueField);
+    void setTitleFieldDetail(QString titleField);
+    void setValueFieldDetail(QString valueField);
+
+private:
+    QString mTitleField;
+    QString mValueField;
+    QString mTitleFieldDetail;
+    QString mValueFieldDetail;
+    QIcon mIcon;
+    QContactFilter mFilter;
+    QString mDefinitionName;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/inc/cntexamplenodetailaction.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+#ifndef MOBEXAMPLENODETAILACTION_H_
+#define MOBEXAMPLENODETAILACTION_H_
+
+#include "cntexamplebaseaction.h"
+
+class MobExampleNoDetailAction : public MobBaseAction
+{
+    Q_OBJECT
+
+public:
+    MobExampleNoDetailAction(const QString& actionName, const QString& vendorName);
+    ~MobExampleNoDetailAction();
+    
+    QVariantMap metaData() const;
+    QContactFilter contactFilter(const QVariant& value) const;
+    bool isDetailSupported(const QContactDetail &detail, const QContact &contact = QContact()) const;
+    QList<QContactDetail> supportedDetails(const QContact& contact) const;
+    State state() const;
+    MobExampleNoDetailAction* clone() const;
+};
+
+#endif /* MOBEXAMPLENODETAILACTION_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/src/cntexample2action.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,85 @@
+/*
+* Copyright (c) 2010 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 "cntexample2action.h"
+#include <qcontactonlineaccount.h>
+#include <xqservicerequest.h>
+#include <qcontactphonenumber.h>
+#include <qcontactfilters.h>
+#include <cntuiactionextension.h>
+
+//Action class
+MobExample2Action::MobExample2Action(const QString& actionName, const QString& vendorName) : 
+    MobBaseAction(actionName, vendorName)
+{
+}
+
+MobExample2Action::~MobExample2Action()
+{
+}
+
+QVariantMap MobExample2Action::metaData() const
+{
+    QVariantMap variantMap;
+    QVariant localization("Test action 2");
+    variantMap.insert(KCntUiActionMetaTitleText, localization);
+    const QString& string(QContactPhoneNumber::FieldNumber);
+    QVariant detailField(string);
+    variantMap.insert(KCntUiActionMetaValueTextDetail, detailField);
+    QString menuString("Do example action2");
+    QVariant longPressMenu(menuString);
+    variantMap.insert(KCntUiActionMetaValueTextLongPress, longPressMenu);
+    return variantMap;
+}
+
+QContactFilter MobExample2Action::contactFilter(const QVariant& value) const
+{
+    Q_UNUSED(value);
+    
+    QContactDetailFilter mobileFilter;
+    mobileFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); 
+    mobileFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeMobile));
+
+    return mobileFilter;
+}
+
+bool MobExample2Action::isDetailSupported(const QContactDetail &detail, const QContact &contact) const
+{
+    if(QContactPhoneNumber::DefinitionName == detail.definitionName())
+    {
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+QList<QContactDetail> MobExample2Action::supportedDetails(const QContact& contact) const
+{
+    
+}
+
+QContactAction::State MobExample2Action::state() const
+{
+
+}
+
+MobExample2Action* MobExample2Action::clone() const
+{
+     return new MobExample2Action(m_actionName, m_vendorName);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/src/cntexampleaction.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,93 @@
+/*
+* Copyright (c) 2010 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 "cntexampleaction.h"
+#include <qcontactonlineaccount.h>
+#include <xqservicerequest.h>
+#include <qcontactphonenumber.h>
+#include <qcontactfilters.h>
+#include <cntuiactionextension.h>
+#include <QIcon>
+#include <hbicon.h>
+
+//Action class
+MobExampleAction::MobExampleAction(const QString& actionName, const QString& vendorName) : 
+    MobBaseAction(actionName, vendorName)
+{
+}
+
+MobExampleAction::~MobExampleAction()
+{
+}
+
+QVariantMap MobExampleAction::metaData() const
+{
+    QVariantMap variantMap;
+    const QString& string("Test action 1");
+    QVariant localization(string);
+    variantMap.insert(KCntUiActionMetaTitleText, localization);
+    const QString& string2(QContactOnlineAccount::FieldAccountUri);
+    const QVariant detailField(string2);
+    variantMap.insert(KCntUiActionMetaValueTextDetail, detailField);
+    QString menuString("Do example action");
+    QVariant longPressMenu(menuString);
+    variantMap.insert(KCntUiActionMetaValueTextLongPress, longPressMenu);
+    HbIcon hIcon("qtg_large_voip.svg");
+    // Must be QIcon
+    QIcon icon(hIcon.qicon());
+    QVariant iconVariant(icon);
+    variantMap.insert("icon", iconVariant);
+    return variantMap;
+}
+
+QContactFilter MobExampleAction::contactFilter(const QVariant& value) const
+{
+    Q_UNUSED(value);
+    
+    QContactDetailFilter onlineFilter;
+    onlineFilter.setDetailDefinitionName(QContactOnlineAccount::DefinitionName, QContactOnlineAccount::FieldSubTypes);
+    onlineFilter.setValue(QLatin1String(QContactOnlineAccount::SubTypeImpp));
+
+    return onlineFilter;
+}
+
+bool MobExampleAction::isDetailSupported(const QContactDetail &detail, const QContact &contact) const
+{
+    if(QContactOnlineAccount::DefinitionName == detail.definitionName())
+    {
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+QList<QContactDetail> MobExampleAction::supportedDetails(const QContact& contact) const
+{
+    
+}
+
+QContactAction::State MobExampleAction::state() const
+{
+    
+}
+
+MobExampleAction* MobExampleAction::clone() const
+{
+     return new MobExampleAction(m_actionName, m_vendorName);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/src/cntexampleactionfactory.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,129 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+#ifndef ACTIONFACTORYPLUGINTARGET
+#define ACTIONFACTORYPLUGINTARGET cntexampleactionsplugin
+#endif
+#ifndef ACTIONFACTORYPLUGINNAME
+#define ACTIONFACTORYPLUGINNAME SymbianActionFactory
+#endif
+
+#include "cntexampleactionfactory.h"
+#include "cntexampleaction.h"
+#include "cntexample2action.h"
+#include "cntexamplenodetailaction.h"
+#include "cntexampledynamicaction.h"
+
+#include <qcontactonlineaccount.h>
+#include <qcontactdetailfilter.h>
+
+#define makestr(x) (#x)
+#define makename(x) makestr(x)
+
+
+//Factory class
+MobExampleActionFactory::MobExampleActionFactory() 
+{
+    // Next two actions are different, but for same service. These actions can be used
+    // also for other services, by changing "Test service". In real plugin all these actions
+    // would have been created once for each service. In this example third action is created for
+    // different service for testing purposes.
+    actionList.append(new MobExampleAction("staticaction1", "Test service"));
+    actionList.append(new MobExample2Action("staticaction2", "Test service"));
+    // This action is for second service.
+    actionList.append(new MobExampleNoDetailAction("nodetailaction", "Test service 2"));
+    
+    // create several variants of one action and change it behaviour in run time
+    MobExampleDynamicAction* nonUiItem = new MobExampleDynamicAction("dynamicaction", "Test service 2");
+    nonUiItem->setDefinitionName(QContactOnlineAccount::DefinitionName);
+    QContactDetailFilter filter;
+    filter.setDetailDefinitionName(QContactOnlineAccount::DefinitionName);
+    nonUiItem->setFilter(filter);
+    nonUiItem->setIcon(QIcon());
+    nonUiItem->setTitleField("");
+    nonUiItem->setTitleFieldDetail("");
+    actionList.append(nonUiItem);
+    
+    MobExampleDynamicAction* emptyValueField = new MobExampleDynamicAction("dynamicaction2", "Test service 2");
+    emptyValueField->setDefinitionName(QContactOnlineAccount::DefinitionName);
+    QContactDetailFilter filter2;
+    filter2.setDetailDefinitionName(QContactOnlineAccount::DefinitionName);
+    emptyValueField->setFilter(filter2);
+    emptyValueField->setIcon(QIcon());
+    emptyValueField->setTitleFieldDetail(QContactOnlineAccount::FieldServiceProvider);
+    emptyValueField->setValueField("");
+    actionList.append(emptyValueField);
+}
+
+MobExampleActionFactory::~MobExampleActionFactory()
+{
+	 while (!actionList.isEmpty())
+	     delete actionList.takeFirst();
+}
+
+QString MobExampleActionFactory::name() const
+{
+    return QString(makename(ACTIONFACTORYPLUGINNAME));
+}
+
+
+QList<QContactActionDescriptor> MobExampleActionFactory::actionDescriptors() const
+{
+   QList<QContactActionDescriptor> descriptorList; 
+   
+   //loop through all the actions and add the descriptor to the list
+   for (int i = 0; i < actionList.size(); i++)
+   {
+	   descriptorList << actionList.at(i)->actionDescriptor();   
+   }
+   
+   return descriptorList;
+}
+
+QContactAction* MobExampleActionFactory::instance(const QContactActionDescriptor& descriptor) const
+{
+    QContactAction *action(0);
+	
+    //loop through the actions and return the one that supports the descriptor
+    for (int i = 0; i < actionList.size() && action == 0; i++)
+    {
+    	if (actionList.at(i)->actionDescriptionSupported(descriptor)){
+    		//create a new heap object of the action
+    		action = actionList.at(i)->clone();
+    	}    
+    }
+  
+    return action;
+}
+
+QVariantMap MobExampleActionFactory::actionMetadata(const QContactActionDescriptor& descriptor) const
+{
+    QVariantMap map;
+    
+    //loop through the actions and return the one that supports the descriptor
+    for (int i = 0; i < actionList.size() && map.isEmpty(); i++)
+    {
+        if (actionList.at(i)->actionDescriptionSupported(descriptor))
+        {
+            map = actionList.at(i)->metaData();
+        }    
+    }
+  
+    return map;
+
+}
+
+Q_EXPORT_PLUGIN2(ACTIONFACTORYPLUGINTARGET, MobExampleActionFactory);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/src/cntexamplebaseaction.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2010 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 "cntexamplebaseaction.h"
+
+#include <xqservicerequest.h>
+#include <qcontactphonenumber.h>
+#include <qcontactonlineaccount.h>
+#include <qcontactfilters.h>
+#include <QDebug>
+
+MobBaseAction::MobBaseAction(const QString &actionName, const QString& vendorName) :
+        m_actionName(actionName),
+        m_vendorName(vendorName),
+        m_implementationVersion(1),
+        m_result(), 
+        m_contact(),
+        m_detail()
+{
+}
+        
+MobBaseAction::~MobBaseAction()
+{
+}
+
+QContactActionDescriptor MobBaseAction::actionDescriptor() const
+{
+    QContactActionDescriptor ret;
+    ret.setActionName(m_actionName);
+    ret.setVendorName(m_vendorName);
+    ret.setImplementationVersion(m_implementationVersion);
+    return ret;
+}
+
+bool MobBaseAction::invokeAction(const QContact& contact, const QContactDetail& detail, const QVariantMap& parameters)
+{
+	m_contact = contact;
+	m_detail  = detail;
+}
+
+//Clears the action data, is called after the result has been emitted to contact (emitResult function)
+void MobBaseAction::resetAction()
+{
+	m_contact = QContact(); 
+	m_detail  = QContactDetail();
+}
+
+//returns whether the actionDescription is supported by this action
+bool MobBaseAction::actionDescriptionSupported(const QContactActionDescriptor& descriptor) const
+{
+    bool supported(false);
+    
+    if ((descriptor.actionName() == m_actionName) && (descriptor.vendorName() == m_vendorName) && (descriptor.implementationVersion() == m_implementationVersion))
+        supported = true;
+    else
+        supported = false; 
+    
+    return supported;       
+}
+
+//emit the result to the client
+void MobBaseAction::emitResult(int errorCode, const QVariant &retValue)
+{
+//	m_result.clear();
+//	m_result.insert("Error", QVariant(errorCode));
+//	m_result.insert("ReturnValue", retValue);
+//	
+//	QContactAction::Status status;
+//	
+//	if (errorCode == 0){
+//		status = QContactAction::Finished;
+//	}
+//	
+//	else{
+//		status = QContactAction::FinishedWithError;
+//	}
+//	
+//	emit progress(status, m_result);
+
+	resetAction(); //reset values in the action
+}
+
+QVariantMap MobBaseAction::results() const
+{
+    return m_result;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/src/cntexampledynamicaction.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,129 @@
+/*
+* Copyright (c) 2010 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 "cntexampledynamicaction.h"
+#include <qcontactonlineaccount.h>
+#include <xqservicerequest.h>
+#include <qcontactphonenumber.h>
+#include <qcontactfilters.h>
+#include <cntuiactionextension.h>
+
+//Action class
+MobExampleDynamicAction::MobExampleDynamicAction(const QString& actionName, const QString& vendorName) : 
+    MobBaseAction(actionName, vendorName)
+{
+}
+
+MobExampleDynamicAction::MobExampleDynamicAction(const QString& actionName, const QString& vendorName, const MobExampleDynamicAction& copy) : 
+    MobBaseAction(actionName, vendorName)
+{
+    mTitleField = copy.mTitleField;
+    mValueField = copy.mValueField;
+    mTitleFieldDetail = copy.mTitleFieldDetail;
+    mValueFieldDetail = copy.mValueFieldDetail;
+    mIcon = copy.mIcon;
+    mFilter = copy.mFilter;
+    mDefinitionName = copy.mDefinitionName;
+}
+
+MobExampleDynamicAction::~MobExampleDynamicAction()
+{
+}
+
+QVariantMap MobExampleDynamicAction::metaData() const
+{
+    QVariantMap variantMap;
+    
+    variantMap.insert(KCntUiActionMetaTitleTextDetail, !mTitleField.isEmpty() ? mTitleField : mTitleFieldDetail);
+    
+    if(!mValueFieldDetail.isEmpty())
+        variantMap.insert(KCntUiActionMetaValueTextDetail, mValueFieldDetail);
+    else if(!mValueField.isEmpty())
+        variantMap.insert(KCntUiActionMetaValueText, mValueField);
+    // Must be QIcon
+    QIcon icon(mIcon);
+    QVariant iconVariant(icon);
+    variantMap.insert("icon", iconVariant);
+    return variantMap;
+}
+
+QContactFilter MobExampleDynamicAction::contactFilter(const QVariant& value) const
+{
+    return mFilter;
+}
+
+bool MobExampleDynamicAction::isDetailSupported(const QContactDetail &detail, const QContact &contact) const
+{
+    if(mDefinitionName == detail.definitionName())
+    {
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+QList<QContactDetail> MobExampleDynamicAction::supportedDetails(const QContact& contact) const
+{
+    
+}
+
+QContactAction::State MobExampleDynamicAction::state() const
+{
+    
+}
+
+MobExampleDynamicAction* MobExampleDynamicAction::clone() const
+{
+     return new MobExampleDynamicAction(m_actionName, m_vendorName, *this);
+}
+
+void MobExampleDynamicAction::setDefinitionName(const QString& definitionName)
+{
+    mDefinitionName = definitionName;
+}
+
+void MobExampleDynamicAction::setFilter(QContactFilter filter)
+{
+    mFilter = filter;
+}
+
+void MobExampleDynamicAction::setIcon(QIcon icon)
+{
+    mIcon = icon;
+}
+
+void MobExampleDynamicAction::setTitleField(QString titleField)
+{
+    mTitleField = titleField;
+}
+
+void MobExampleDynamicAction::setValueField(QString valueField)
+{
+    mValueField = valueField;
+}
+
+void MobExampleDynamicAction::setTitleFieldDetail(QString titleFieldDetail)
+{
+    mTitleFieldDetail = titleFieldDetail;
+}
+
+void MobExampleDynamicAction::setValueFieldDetail(QString valueFieldDetail)
+{
+    mValueFieldDetail = valueFieldDetail;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/tsrc/ut_contactcard/cntactionextensionexample/src/cntexamplenodetailaction.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,81 @@
+/*
+* Copyright (c) 2010 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 "cntexamplenodetailaction.h"
+#include <cntuiactionextension.h>
+
+//Action class
+MobExampleNoDetailAction::MobExampleNoDetailAction(const QString& actionName, const QString& vendorName) : 
+    MobBaseAction(actionName, vendorName)
+{
+}
+
+MobExampleNoDetailAction::~MobExampleNoDetailAction()
+{
+}
+
+QVariantMap MobExampleNoDetailAction::metaData() const
+{
+    QVariantMap variantMap;
+    QVariant localization("Test action 3");
+    variantMap.insert(KCntUiActionMetaTitleText, localization);
+    QVariant detailField("Description");
+    variantMap.insert(KCntUiActionMetaValueText, detailField);
+    QString menuString("Do action 3");
+    QVariant longPressMenu(menuString);
+    variantMap.insert(KCntUiActionMetaValueTextLongPress, longPressMenu);
+    return variantMap;
+}
+
+QContactFilter MobExampleNoDetailAction::contactFilter(const QVariant& value) const
+{
+    Q_UNUSED(value);
+    
+    QContactFilter all;
+
+    return all;
+}
+
+// If detail is empty plugin knows that this is special action query that
+// is targetted to whole contact not to specific detail on contact.
+// If you want to create action to my card only, check cntuiactionextension.h for details
+bool MobExampleNoDetailAction::isDetailSupported(const QContactDetail &detail, const QContact &contact) const
+{
+    if(detail.isEmpty())
+    {
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+QList<QContactDetail> MobExampleNoDetailAction::supportedDetails(const QContact& contact) const
+{
+    
+}
+
+QContactAction::State MobExampleNoDetailAction::state() const
+{
+
+}
+
+MobExampleNoDetailAction* MobExampleNoDetailAction::clone() const
+{
+    return new MobExampleNoDetailAction(m_actionName, m_vendorName);
+}
--- a/phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/cntactionextensionexample.pro	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,57 +0,0 @@
-#
-# 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: 
-#
-
-TEMPLATE = lib
-CONFIG += plugin
-CONFIG += hb
-TARGET = $$qtLibraryTarget(cntexampleactionsplugin)
-DEPENDPATH += .
-INCLUDEPATH += .
-
-# Input
-HEADERS += \
-    inc/cntexampleactionfactory.h \
-    inc/cntexamplebaseaction.h \
-    inc/cntexampleaction.h \
-    inc/cntexample2action.h \
-    inc/cntexamplenodetailaction.h \
-    inc/cntexampledynamicaction.h
-    
-SOURCES += \
-    src/cntexampleactionfactory.cpp \
-    src/cntexamplebaseaction.cpp \
-    src/cntexampleaction.cpp \
-    src/cntexample2action.cpp \
-    src/cntexamplenodetailaction.cpp \
-    src/cntexampledynamicaction.cpp
-MOC_DIR = moc
-
-symbian:
- { 
-    load(data_caging_paths)
-    TARGET.CAPABILITY = CAP_GENERAL_DLL
-    TARGET.EPOCALLOWDLLDATA = 1
-    TARGET.UID3 = 0xefa11113
-    INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
-    LIBS += -lQtContacts \
-        -lxqservice
-    target.path = /sys/bin
-    INSTALLS += target
-    symbianplugin.sources = $${TARGET}.dll
-    symbianplugin.path = /resource/qt/plugins/contacts
-    DEPLOYMENT += symbianplugin
-}
-symbian:MMP_RULES += SMPSAFE
\ No newline at end of file
--- a/phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/inc/cntexample2action.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-/*
-* Copyright (c) 2010 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:
-*
-*/
-
-#ifndef QMOBEXAMPLE2ACTION_H
-#define QMOBEXAMPLE2ACTION_H
-
-#include "cntexamplebaseaction.h"
-
-class MobExample2Action : public MobBaseAction
-{
-    Q_OBJECT
-
-public:
-    MobExample2Action(const QString& actionName, const QString& vendorName);
-    ~MobExample2Action();
-    
-    QVariantMap metaData() const;
-    QContactFilter contactFilter(const QVariant& value) const;
-    bool isDetailSupported(const QContactDetail &detail, const QContact &contact = QContact()) const;
-    QList<QContactDetail> supportedDetails(const QContact& contact) const;
-    State state() const;
-    MobExample2Action* clone() const;
-};
-
-#endif
--- a/phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/inc/cntexampleaction.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-/*
-* Copyright (c) 2010 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:
-*
-*/
-
-#ifndef QMOBEXAMPLEACTION_H
-#define QMOBEXAMPLEACTION_H
-
-#include "cntexamplebaseaction.h"
-
-class MobExampleAction : public MobBaseAction
-{
-    Q_OBJECT
-
-public:
-    MobExampleAction(const QString& actionName, const QString& vendorName);
-    ~MobExampleAction();
-    
-    QVariantMap metaData() const;
-    QContactFilter contactFilter(const QVariant& value) const;
-    bool isDetailSupported(const QContactDetail &detail, const QContact &contact = QContact()) const;
-    QList<QContactDetail> supportedDetails(const QContact& contact) const;
-    State state() const;
-    MobExampleAction* clone() const;
-};
-
-#endif
--- a/phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/inc/cntexampleactionfactory.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-/*
-* Copyright (c) 2010 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:
-*
-*/
-
-#ifndef MOBEXAMPLEACTIONFACTORY_H
-#define MOBEXAMPLEACTIONFACTORY_H
-
-#include <qcontactactionfactory.h>
-#include <qcontactaction.h>
-
-class MobBaseAction;
-
-QTM_USE_NAMESPACE
-
-class Q_DECL_EXPORT MobExampleActionFactory : public QContactActionFactory
-{
-    Q_OBJECT
-    Q_INTERFACES(QtMobility::QContactActionFactory)
-
-public:
-    MobExampleActionFactory();
-    ~MobExampleActionFactory();
-
-    QString name() const;
-    QList<QContactActionDescriptor> actionDescriptors() const;
-    QContactAction* instance(const QContactActionDescriptor& descriptor) const;
-    QVariantMap actionMetadata(const QContactActionDescriptor& descriptor) const;
-
-private:
-    QList<MobBaseAction *> actionList;
-};
-
-#endif
--- a/phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/inc/cntexamplebaseaction.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-/*
-* Copyright (c) 2010 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:
-*
-*/
-
-#ifndef MOBBASEACTION_H
-#define MOBBASEACTION_H
-
-#include <qcontactaction.h>
-#include <qcontactactiondescriptor.h>
-
-#include <QSharedData>
-#include <QString>
-#include <QVariantMap>
-
-QTM_USE_NAMESPACE
-
-class MobBaseAction : public QContactAction
-{
-    Q_OBJECT
-
-public:   
-    MobBaseAction(const QString &actionName, const QString& vendorName);
-    virtual ~MobBaseAction();
-
-public: 
-	enum ErrorCodes {
-		GeneralError = 1,
-		DetailNotSupported
-	};
-    
-
-public: //QContactAction
-	QContactActionDescriptor actionDescriptor() const;
-    bool invokeAction(const QContact& contact, const QContactDetail& detail = QContactDetail(), const QVariantMap& parameters = QVariantMap());
-    QVariantMap results() const;
-
-public:
-	virtual void resetAction();
-	virtual MobBaseAction* clone() const = 0;
-
-public:   
-    //returns whether the actionDescription is supported by this action
-    bool actionDescriptionSupported(const QContactActionDescriptor& descriptor) const;
-    void emitResult(int errorCode, const QVariant &retValue);
-    
-    
-protected:
-    QString m_actionName;
-	QString m_vendorName;
-	int m_implementationVersion;
-	
-	QVariantMap m_result; 		//result returned to client
-	QContact m_contact;    		//contact passed to invokeAction
-	QContactDetail m_detail; 	//detail passed to invokeAction
-};
-
-#endif //MOBBASEACTION_H
--- a/phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/inc/cntexampledynamicaction.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-/*
-* Copyright (c) 2010 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:
-*
-*/
-
-#ifndef QMOBEXAMPLEDYNAMICACTION_H
-#define QMOBEXAMPLEDYNAMICACTION_H
-
-#include "cntexamplebaseaction.h"
-
-#include <QIcon>
-
-class MobExampleDynamicAction : public MobBaseAction
-{
-    Q_OBJECT
-
-public:
-    MobExampleDynamicAction(const QString& actionName, const QString& vendorName);
-    MobExampleDynamicAction(const QString& actionName, const QString& vendorName, const MobExampleDynamicAction& copy);
-    ~MobExampleDynamicAction();
-    
-    QVariantMap metaData() const;
-    QContactFilter contactFilter(const QVariant& value) const;
-    bool isDetailSupported(const QContactDetail &detail, const QContact &contact = QContact()) const;
-    QList<QContactDetail> supportedDetails(const QContact& contact) const;
-    State state() const;
-    MobExampleDynamicAction* clone() const;
-    
-    void setDefinitionName(const QString& definitionName);
-    void setFilter(QContactFilter filter);
-    void setIcon(QIcon icon);
-    void setTitleField(QString titleField);
-    void setValueField(QString valueField);
-    void setTitleFieldDetail(QString titleField);
-    void setValueFieldDetail(QString valueField);
-
-private:
-    QString mTitleField;
-    QString mValueField;
-    QString mTitleFieldDetail;
-    QString mValueFieldDetail;
-    QIcon mIcon;
-    QContactFilter mFilter;
-    QString mDefinitionName;
-};
-
-#endif
--- a/phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/inc/cntexamplenodetailaction.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-/*
-* Copyright (c) 2010 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:
-*
-*/
-
-#ifndef MOBEXAMPLENODETAILACTION_H_
-#define MOBEXAMPLENODETAILACTION_H_
-
-#include "cntexamplebaseaction.h"
-
-class MobExampleNoDetailAction : public MobBaseAction
-{
-    Q_OBJECT
-
-public:
-    MobExampleNoDetailAction(const QString& actionName, const QString& vendorName);
-    ~MobExampleNoDetailAction();
-    
-    QVariantMap metaData() const;
-    QContactFilter contactFilter(const QVariant& value) const;
-    bool isDetailSupported(const QContactDetail &detail, const QContact &contact = QContact()) const;
-    QList<QContactDetail> supportedDetails(const QContact& contact) const;
-    State state() const;
-    MobExampleNoDetailAction* clone() const;
-};
-
-#endif /* MOBEXAMPLENODETAILACTION_H_ */
--- a/phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/plugin_commonu.def	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-; ==============================================================================
-; Generated by qmake (2.01a) (Qt 4.7.0) on: 2010-09-11T15:41:44
-; This file is generated by qmake and should not be modified by the
-; user.
-;  Name        : plugin_commonu.def
-;  Part of     : cntexampleactionsplugin
-;  Description : Fixes common plugin symbols to known ordinals
-;  Version     : 
-;
-; ==============================================================================
-
-
-EXPORTS
-	qt_plugin_query_verification_data @ 1 NONAME
-	qt_plugin_instance @ 2 NONAME
-
--- a/phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/src/cntexample2action.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-/*
-* Copyright (c) 2010 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 "cntexample2action.h"
-#include <qcontactonlineaccount.h>
-#include <xqservicerequest.h>
-#include <qcontactphonenumber.h>
-#include <qcontactfilters.h>
-#include <cntuiactionextension.h>
-
-//Action class
-MobExample2Action::MobExample2Action(const QString& actionName, const QString& vendorName) : 
-    MobBaseAction(actionName, vendorName)
-{
-}
-
-MobExample2Action::~MobExample2Action()
-{
-}
-
-QVariantMap MobExample2Action::metaData() const
-{
-    QVariantMap variantMap;
-    QVariant localization("Test action 2");
-    variantMap.insert(KCntUiActionMetaTitleText, localization);
-    const QString& string(QContactPhoneNumber::FieldNumber);
-    QVariant detailField(string);
-    variantMap.insert(KCntUiActionMetaValueTextDetail, detailField);
-    QString menuString("Do example action2");
-    QVariant longPressMenu(menuString);
-    variantMap.insert(KCntUiActionMetaValueTextLongPress, longPressMenu);
-    return variantMap;
-}
-
-QContactFilter MobExample2Action::contactFilter(const QVariant& value) const
-{
-    Q_UNUSED(value);
-    
-    QContactDetailFilter mobileFilter;
-    mobileFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); 
-    mobileFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeMobile));
-
-    return mobileFilter;
-}
-
-bool MobExample2Action::isDetailSupported(const QContactDetail &detail, const QContact &contact) const
-{
-    if(QContactPhoneNumber::DefinitionName == detail.definitionName())
-    {
-        return true;
-    }
-    else
-    {
-        return false;
-    }
-}
-
-QList<QContactDetail> MobExample2Action::supportedDetails(const QContact& contact) const
-{
-    
-}
-
-QContactAction::State MobExample2Action::state() const
-{
-
-}
-
-MobExample2Action* MobExample2Action::clone() const
-{
-     return new MobExample2Action(m_actionName, m_vendorName);
-}
--- a/phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/src/cntexampleaction.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,93 +0,0 @@
-/*
-* Copyright (c) 2010 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 "cntexampleaction.h"
-#include <qcontactonlineaccount.h>
-#include <xqservicerequest.h>
-#include <qcontactphonenumber.h>
-#include <qcontactfilters.h>
-#include <cntuiactionextension.h>
-#include <QIcon>
-#include <hbicon.h>
-
-//Action class
-MobExampleAction::MobExampleAction(const QString& actionName, const QString& vendorName) : 
-    MobBaseAction(actionName, vendorName)
-{
-}
-
-MobExampleAction::~MobExampleAction()
-{
-}
-
-QVariantMap MobExampleAction::metaData() const
-{
-    QVariantMap variantMap;
-    const QString& string("Test action 1");
-    QVariant localization(string);
-    variantMap.insert(KCntUiActionMetaTitleText, localization);
-    const QString& string2(QContactOnlineAccount::FieldAccountUri);
-    const QVariant detailField(string2);
-    variantMap.insert(KCntUiActionMetaValueTextDetail, detailField);
-    QString menuString("Do example action");
-    QVariant longPressMenu(menuString);
-    variantMap.insert(KCntUiActionMetaValueTextLongPress, longPressMenu);
-    HbIcon hIcon("qtg_large_voip.svg");
-    // Must be QIcon
-    QIcon icon(hIcon.qicon());
-    QVariant iconVariant(icon);
-    variantMap.insert("icon", iconVariant);
-    return variantMap;
-}
-
-QContactFilter MobExampleAction::contactFilter(const QVariant& value) const
-{
-    Q_UNUSED(value);
-    
-    QContactDetailFilter onlineFilter;
-    onlineFilter.setDetailDefinitionName(QContactOnlineAccount::DefinitionName, QContactOnlineAccount::FieldSubTypes);
-    onlineFilter.setValue(QLatin1String(QContactOnlineAccount::SubTypeImpp));
-
-    return onlineFilter;
-}
-
-bool MobExampleAction::isDetailSupported(const QContactDetail &detail, const QContact &contact) const
-{
-    if(QContactOnlineAccount::DefinitionName == detail.definitionName())
-    {
-        return true;
-    }
-    else
-    {
-        return false;
-    }
-}
-
-QList<QContactDetail> MobExampleAction::supportedDetails(const QContact& contact) const
-{
-    
-}
-
-QContactAction::State MobExampleAction::state() const
-{
-    
-}
-
-MobExampleAction* MobExampleAction::clone() const
-{
-     return new MobExampleAction(m_actionName, m_vendorName);
-}
--- a/phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/src/cntexampleactionfactory.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,129 +0,0 @@
-/*
-* Copyright (c) 2010 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:
-*
-*/
-#ifndef ACTIONFACTORYPLUGINTARGET
-#define ACTIONFACTORYPLUGINTARGET cntexampleactionsplugin
-#endif
-#ifndef ACTIONFACTORYPLUGINNAME
-#define ACTIONFACTORYPLUGINNAME SymbianActionFactory
-#endif
-
-#include "cntexampleactionfactory.h"
-#include "cntexampleaction.h"
-#include "cntexample2action.h"
-#include "cntexamplenodetailaction.h"
-#include "cntexampledynamicaction.h"
-
-#include <qcontactonlineaccount.h>
-#include <qcontactdetailfilter.h>
-
-#define makestr(x) (#x)
-#define makename(x) makestr(x)
-
-
-//Factory class
-MobExampleActionFactory::MobExampleActionFactory() 
-{
-    // Next two actions are different, but for same service. These actions can be used
-    // also for other services, by changing "Test service". In real plugin all these actions
-    // would have been created once for each service. In this example third action is created for
-    // different service for testing purposes.
-    actionList.append(new MobExampleAction("staticaction1", "Test service"));
-    actionList.append(new MobExample2Action("staticaction2", "Test service"));
-    // This action is for second service.
-    actionList.append(new MobExampleNoDetailAction("nodetailaction", "Test service 2"));
-    
-    // create several variants of one action and change it behaviour in run time
-    MobExampleDynamicAction* nonUiItem = new MobExampleDynamicAction("dynamicaction", "Test service 2");
-    nonUiItem->setDefinitionName(QContactOnlineAccount::DefinitionName);
-    QContactDetailFilter filter;
-    filter.setDetailDefinitionName(QContactOnlineAccount::DefinitionName);
-    nonUiItem->setFilter(filter);
-    nonUiItem->setIcon(QIcon());
-    nonUiItem->setTitleField("");
-    nonUiItem->setTitleFieldDetail("");
-    actionList.append(nonUiItem);
-    
-    MobExampleDynamicAction* emptyValueField = new MobExampleDynamicAction("dynamicaction2", "Test service 2");
-    emptyValueField->setDefinitionName(QContactOnlineAccount::DefinitionName);
-    QContactDetailFilter filter2;
-    filter2.setDetailDefinitionName(QContactOnlineAccount::DefinitionName);
-    emptyValueField->setFilter(filter2);
-    emptyValueField->setIcon(QIcon());
-    emptyValueField->setTitleFieldDetail(QContactOnlineAccount::FieldServiceProvider);
-    emptyValueField->setValueField("");
-    actionList.append(emptyValueField);
-}
-
-MobExampleActionFactory::~MobExampleActionFactory()
-{
-	 while (!actionList.isEmpty())
-	     delete actionList.takeFirst();
-}
-
-QString MobExampleActionFactory::name() const
-{
-    return QString(makename(ACTIONFACTORYPLUGINNAME));
-}
-
-
-QList<QContactActionDescriptor> MobExampleActionFactory::actionDescriptors() const
-{
-   QList<QContactActionDescriptor> descriptorList; 
-   
-   //loop through all the actions and add the descriptor to the list
-   for (int i = 0; i < actionList.size(); i++)
-   {
-	   descriptorList << actionList.at(i)->actionDescriptor();   
-   }
-   
-   return descriptorList;
-}
-
-QContactAction* MobExampleActionFactory::instance(const QContactActionDescriptor& descriptor) const
-{
-    QContactAction *action(0);
-	
-    //loop through the actions and return the one that supports the descriptor
-    for (int i = 0; i < actionList.size() && action == 0; i++)
-    {
-    	if (actionList.at(i)->actionDescriptionSupported(descriptor)){
-    		//create a new heap object of the action
-    		action = actionList.at(i)->clone();
-    	}    
-    }
-  
-    return action;
-}
-
-QVariantMap MobExampleActionFactory::actionMetadata(const QContactActionDescriptor& descriptor) const
-{
-    QVariantMap map;
-    
-    //loop through the actions and return the one that supports the descriptor
-    for (int i = 0; i < actionList.size() && map.isEmpty(); i++)
-    {
-        if (actionList.at(i)->actionDescriptionSupported(descriptor))
-        {
-            map = actionList.at(i)->metaData();
-        }    
-    }
-  
-    return map;
-
-}
-
-Q_EXPORT_PLUGIN2(ACTIONFACTORYPLUGINTARGET, MobExampleActionFactory);
--- a/phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/src/cntexamplebaseaction.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-/*
-* Copyright (c) 2010 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 "cntexamplebaseaction.h"
-
-#include <xqservicerequest.h>
-#include <qcontactphonenumber.h>
-#include <qcontactonlineaccount.h>
-#include <qcontactfilters.h>
-#include <QDebug>
-
-MobBaseAction::MobBaseAction(const QString &actionName, const QString& vendorName) :
-        m_actionName(actionName),
-        m_vendorName(vendorName),
-        m_implementationVersion(1),
-        m_result(), 
-        m_contact(),
-        m_detail()
-{
-}
-        
-MobBaseAction::~MobBaseAction()
-{
-}
-
-QContactActionDescriptor MobBaseAction::actionDescriptor() const
-{
-    QContactActionDescriptor ret;
-    ret.setActionName(m_actionName);
-    ret.setVendorName(m_vendorName);
-    ret.setImplementationVersion(m_implementationVersion);
-    return ret;
-}
-
-bool MobBaseAction::invokeAction(const QContact& contact, const QContactDetail& detail, const QVariantMap& parameters)
-{
-	m_contact = contact;
-	m_detail  = detail;
-}
-
-//Clears the action data, is called after the result has been emitted to contact (emitResult function)
-void MobBaseAction::resetAction()
-{
-	m_contact = QContact(); 
-	m_detail  = QContactDetail();
-}
-
-//returns whether the actionDescription is supported by this action
-bool MobBaseAction::actionDescriptionSupported(const QContactActionDescriptor& descriptor) const
-{
-    bool supported(false);
-    
-    if ((descriptor.actionName() == m_actionName) && (descriptor.vendorName() == m_vendorName) && (descriptor.implementationVersion() == m_implementationVersion))
-        supported = true;
-    else
-        supported = false; 
-    
-    return supported;       
-}
-
-//emit the result to the client
-void MobBaseAction::emitResult(int errorCode, const QVariant &retValue)
-{
-//	m_result.clear();
-//	m_result.insert("Error", QVariant(errorCode));
-//	m_result.insert("ReturnValue", retValue);
-//	
-//	QContactAction::Status status;
-//	
-//	if (errorCode == 0){
-//		status = QContactAction::Finished;
-//	}
-//	
-//	else{
-//		status = QContactAction::FinishedWithError;
-//	}
-//	
-//	emit progress(status, m_result);
-
-	resetAction(); //reset values in the action
-}
-
-QVariantMap MobBaseAction::results() const
-{
-    return m_result;
-}
--- a/phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/src/cntexampledynamicaction.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,129 +0,0 @@
-/*
-* Copyright (c) 2010 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 "cntexampledynamicaction.h"
-#include <qcontactonlineaccount.h>
-#include <xqservicerequest.h>
-#include <qcontactphonenumber.h>
-#include <qcontactfilters.h>
-#include <cntuiactionextension.h>
-
-//Action class
-MobExampleDynamicAction::MobExampleDynamicAction(const QString& actionName, const QString& vendorName) : 
-    MobBaseAction(actionName, vendorName)
-{
-}
-
-MobExampleDynamicAction::MobExampleDynamicAction(const QString& actionName, const QString& vendorName, const MobExampleDynamicAction& copy) : 
-    MobBaseAction(actionName, vendorName)
-{
-    mTitleField = copy.mTitleField;
-    mValueField = copy.mValueField;
-    mTitleFieldDetail = copy.mTitleFieldDetail;
-    mValueFieldDetail = copy.mValueFieldDetail;
-    mIcon = copy.mIcon;
-    mFilter = copy.mFilter;
-    mDefinitionName = copy.mDefinitionName;
-}
-
-MobExampleDynamicAction::~MobExampleDynamicAction()
-{
-}
-
-QVariantMap MobExampleDynamicAction::metaData() const
-{
-    QVariantMap variantMap;
-    
-    variantMap.insert(KCntUiActionMetaTitleTextDetail, !mTitleField.isEmpty() ? mTitleField : mTitleFieldDetail);
-    
-    if(!mValueFieldDetail.isEmpty())
-        variantMap.insert(KCntUiActionMetaValueTextDetail, mValueFieldDetail);
-    else if(!mValueField.isEmpty())
-        variantMap.insert(KCntUiActionMetaValueText, mValueField);
-    // Must be QIcon
-    QIcon icon(mIcon);
-    QVariant iconVariant(icon);
-    variantMap.insert("icon", iconVariant);
-    return variantMap;
-}
-
-QContactFilter MobExampleDynamicAction::contactFilter(const QVariant& value) const
-{
-    return mFilter;
-}
-
-bool MobExampleDynamicAction::isDetailSupported(const QContactDetail &detail, const QContact &contact) const
-{
-    if(mDefinitionName == detail.definitionName())
-    {
-        return true;
-    }
-    else
-    {
-        return false;
-    }
-}
-
-QList<QContactDetail> MobExampleDynamicAction::supportedDetails(const QContact& contact) const
-{
-    
-}
-
-QContactAction::State MobExampleDynamicAction::state() const
-{
-    
-}
-
-MobExampleDynamicAction* MobExampleDynamicAction::clone() const
-{
-     return new MobExampleDynamicAction(m_actionName, m_vendorName, *this);
-}
-
-void MobExampleDynamicAction::setDefinitionName(const QString& definitionName)
-{
-    mDefinitionName = definitionName;
-}
-
-void MobExampleDynamicAction::setFilter(QContactFilter filter)
-{
-    mFilter = filter;
-}
-
-void MobExampleDynamicAction::setIcon(QIcon icon)
-{
-    mIcon = icon;
-}
-
-void MobExampleDynamicAction::setTitleField(QString titleField)
-{
-    mTitleField = titleField;
-}
-
-void MobExampleDynamicAction::setValueField(QString valueField)
-{
-    mValueField = valueField;
-}
-
-void MobExampleDynamicAction::setTitleFieldDetail(QString titleFieldDetail)
-{
-    mTitleFieldDetail = titleFieldDetail;
-}
-
-void MobExampleDynamicAction::setValueFieldDetail(QString valueFieldDetail)
-{
-    mValueFieldDetail = valueFieldDetail;
-}
--- a/phonebookui/cntcommonui/tsrc/ut_pbkcontactcard/cntactionextensionexample/src/cntexamplenodetailaction.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-/*
-* Copyright (c) 2010 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 "cntexamplenodetailaction.h"
-#include <cntuiactionextension.h>
-
-//Action class
-MobExampleNoDetailAction::MobExampleNoDetailAction(const QString& actionName, const QString& vendorName) : 
-    MobBaseAction(actionName, vendorName)
-{
-}
-
-MobExampleNoDetailAction::~MobExampleNoDetailAction()
-{
-}
-
-QVariantMap MobExampleNoDetailAction::metaData() const
-{
-    QVariantMap variantMap;
-    QVariant localization("Test action 3");
-    variantMap.insert(KCntUiActionMetaTitleText, localization);
-    QVariant detailField("Description");
-    variantMap.insert(KCntUiActionMetaValueText, detailField);
-    QString menuString("Do action 3");
-    QVariant longPressMenu(menuString);
-    variantMap.insert(KCntUiActionMetaValueTextLongPress, longPressMenu);
-    return variantMap;
-}
-
-QContactFilter MobExampleNoDetailAction::contactFilter(const QVariant& value) const
-{
-    Q_UNUSED(value);
-    
-    QContactFilter all;
-
-    return all;
-}
-
-// If detail is empty plugin knows that this is special action query that
-// is targetted to whole contact not to specific detail on contact.
-// If you want to create action to my card only, check cntuiactionextension.h for details
-bool MobExampleNoDetailAction::isDetailSupported(const QContactDetail &detail, const QContact &contact) const
-{
-    if(detail.isEmpty())
-    {
-        return true;
-    }
-    else
-    {
-        return false;
-    }
-}
-
-QList<QContactDetail> MobExampleNoDetailAction::supportedDetails(const QContact& contact) const
-{
-    
-}
-
-QContactAction::State MobExampleNoDetailAction::state() const
-{
-
-}
-
-MobExampleNoDetailAction* MobExampleNoDetailAction::clone() const
-{
-    return new MobExampleNoDetailAction(m_actionName, m_vendorName);
-}
--- a/phonebookui/cntcommonui/views/cntactionmenubuilder.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/views/cntactionmenubuilder.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -14,80 +14,79 @@
 * Description:
 *
 */
+
 #include "cntactionmenubuilder.h"
-#include <qcontact.h>
+
 #include "cntstringmapper.h"
+#include "cntactionpopup.h"
+
 #include <hbaction.h>
-#include "cntactionpopup.h"
 
 CntActionMenuBuilder::CntActionMenuBuilder( QContactLocalId aMyCardId ) : 
-QObject(),
-iMyCardId( aMyCardId ),
-mContact( 0 ),
-mMap( 0 )
-    {
+    QObject(),
+    iMyCardId( aMyCardId ),
+    mContact( NULL ),
+    mMap( NULL )
+{
     mMap = new CntStringMapper();
-    }
+}
 
 CntActionMenuBuilder::~CntActionMenuBuilder()
 {
     delete mMap;
-    mMap = 0;
-    
     delete mContact;
-    mContact = 0;
+}
+
+HbMenu* CntActionMenuBuilder::actionMenu( QContact& aContact, QContactLocalId myCardId )
+{
+    iMyCardId = myCardId;
+    mContact = new QContact( aContact );
+    return buildActionMenu( aContact );
 }
     
 HbMenu* CntActionMenuBuilder::buildActionMenu( QContact& aContact )
 {
     HbMenu* menu = new HbMenu();
-    
+
     // Regular contact, NOT MyCard
     if ( aContact.localId() != iMyCardId )
-        {
+    {
         QList<QContactActionDescriptor> actionDescriptors = aContact.availableActions();
         QStringList actions;
         foreach ( QContactActionDescriptor d, aContact.availableActions() )
-            {
+        {
             actions << d.actionName();
-            }
-        
+        }
+
         if ( actions.contains("call", Qt::CaseInsensitive) && isSupportedDetails("call", aContact))
-            {
+        {
             createCallAction( *menu, aContact );
-            }
-        
+        }
+
         if ( actions.contains("message", Qt::CaseInsensitive) && isSupportedDetails("message", aContact) )
-            {
+        {
             createMessageAction( *menu, aContact );
-            }
-        
+        }
+
         if ( actions.contains("email", Qt::CaseInsensitive) )
-            {
+        {
             createEmailAction( *menu, aContact );
-            }
-        
+        }
+
         if ( menu->actions().size() > 0 )
             menu->addSeparator();
-        }
-    
+    }
+
     // If contact is NOT MyCard OR MyCard is not empty (detail count is more than 4)
     if ( aContact.localId() != iMyCardId || aContact.details().size() > 4 )
-        {
-        menu->addAction(hbTrId("txt_common_menu_open"), this, SLOT(emitOpenContact()) );
-        menu->addAction(hbTrId("txt_common_menu_edit"), this, SLOT(emitEditContact()) );
-        menu->addAction(hbTrId("txt_phob_menu_delete_contact"), this, SLOT(emitDeleteContact()));
-        }
+    {
+        menu->addAction( hbTrId("txt_common_menu_open"), this, SLOT(emitOpenContact()) );
+        menu->addAction( hbTrId("txt_common_menu_edit"), this, SLOT(emitEditContact()) );
+        menu->addAction( hbTrId("txt_phob_menu_delete_contact"), this, SLOT(emitDeleteContact()));
+    }
     return menu;
 }
 
-HbMenu* CntActionMenuBuilder::actionMenu( QContact& aContact, QContactLocalId myCardId)
-{
-    iMyCardId = myCardId;
-    mContact = new QContact( aContact );
-    return buildActionMenu( aContact );
-}
-
 void CntActionMenuBuilder::emitOpenContact()
 {
     emit openContact( *mContact );
@@ -107,21 +106,21 @@
 {  
     QContactDetail detail = mContact->preferredDetail("call");
     if (!detail.isEmpty())
-        {
+    {
         emit performContactAction( *mContact, detail, "call" );
-        }
+    }
     else if (mContact->details<QContactPhoneNumber>().count() == 1 )
     {
         mContact->setPreferredDetail("call", mContact->details<QContactPhoneNumber>().first());
         emit performContactAction(*mContact, mContact->details<QContactPhoneNumber>().first(), "call");
     }
     else 
-        {
+    {
         CntActionPopup *actionPopup = new CntActionPopup(mContact);
         actionPopup->showActionPopup("call");
         connect( actionPopup, SIGNAL(executeContactAction(QContact&, QContactDetail, QString)), this, 
-                SLOT(emitContactaction(QContact&,QContactDetail, QString)));
-        }
+                SLOT(emitContactAction(QContact&,QContactDetail, QString)));
+    }
 }
 
 void CntActionMenuBuilder::emitSmsContact()
@@ -141,7 +140,7 @@
         CntActionPopup *actionPopup = new CntActionPopup(mContact);
         actionPopup->showActionPopup("message");
         connect( actionPopup, SIGNAL(executeContactAction(QContact&, QContactDetail, QString)), this, 
-                SLOT(emitContactaction(QContact&,QContactDetail, QString)));
+                SLOT(emitContactAction(QContact&,QContactDetail, QString)));
     }
 }
 
@@ -149,24 +148,24 @@
 {
     QContactDetail detail = mContact->preferredDetail("email");
     if (!detail.isEmpty())
-        {
+    {
         emit performContactAction( *mContact,detail, "email" );
-        }
+    }
     else if (mContact->details<QContactEmailAddress>().count() == 1 )
     {
         mContact->setPreferredDetail("email", mContact->details<QContactEmailAddress>().first());
         emit performContactAction(*mContact, mContact->details<QContactEmailAddress>().first(), "email");
     }
     else 
-        {
+    {
         CntActionPopup *actionPopup = new CntActionPopup(mContact);
         actionPopup->showActionPopup("email");
         connect( actionPopup, SIGNAL(executeContactAction(QContact&, QContactDetail, QString)), this, 
-                SLOT(emitContactaction(QContact&,QContactDetail, QString)));
-        }
+                SLOT(emitContactAction(QContact&,QContactDetail, QString)));
+    }
 }
 
-void CntActionMenuBuilder::emitContactaction(QContact& aContact,QContactDetail contactDetail, QString aAction)
+void CntActionMenuBuilder::emitContactAction(QContact& aContact,QContactDetail contactDetail, QString aAction)
 {
     emit performContactAction( aContact,contactDetail, aAction);
 }
@@ -175,11 +174,27 @@
 {
     // Create call action
     QContactDetail detail = aContact.preferredDetail("call");
-    QContactPhoneNumber number = detail.isEmpty() ? aContact.detail<QContactPhoneNumber>() : detail;
-    QString context = number.contexts().isEmpty() ? QString() : number.contexts().first();
-    QString subtype = number.subTypes().isEmpty() ? number.definitionName() : number.subTypes().first();
+    
+    // if preferredDetail is empty and phone munbers contain more then one, use "txt_phob_menu_voice_call"
+    if (detail.isEmpty() && aContact.details<QContactPhoneNumber>().count() > 1)
+    { 
+        aMenu.addAction(hbTrId("txt_phob_menu_voice_call"), this, SLOT(emitCallContact()));     
+    }
+    else
+    {
+        QContactPhoneNumber number = detail.isEmpty() ? aContact.detail<QContactPhoneNumber>() : detail;
+        QString context = number.contexts().isEmpty() ? QString() : number.contexts().first();
+        QString subtype = number.subTypes().isEmpty() ? number.definitionName() : number.subTypes().first();
+        
+        aMenu.addAction( mMap->getItemSpecificMenuLocString( subtype, context ), this, SLOT(emitCallContact()) );
+    }
+}
 
-    aMenu.addAction( mMap->getItemSpecificMenuLocString( subtype, context ), this, SLOT(emitCallContact()) );
+void CntActionMenuBuilder::createMessageAction( HbMenu& aMenu, QContact& aContact )
+{
+    Q_UNUSED( aContact );
+    
+    aMenu.addAction(hbTrId("txt_phob_menu_send_message"), this, SLOT(emitSmsContact()));
 }
 
 void CntActionMenuBuilder::createEmailAction( HbMenu& aMenu, QContact& aContact )
@@ -192,34 +207,27 @@
     aMenu.addAction( mMap->getItemSpecificMenuLocString( email.definitionName(), context), this, SLOT(emitMailContact()) );
 }
 
-void CntActionMenuBuilder::createMessageAction( HbMenu& aMenu, QContact& aContact )
-{
-    Q_UNUSED( aContact );
-    
-    aMenu.addAction(hbTrId("txt_phob_menu_send_message"), this, SLOT(emitSmsContact()));
-}
-
 bool CntActionMenuBuilder::isSupportedDetails( const QString &actionName, const QContact &contact )
 {
     QList<QContactActionDescriptor> actionDescriptors = QContactAction::actionDescriptors(actionName, "symbian");
     if (actionDescriptors.isEmpty())
-        {
+    {
         return false;
-        }
-    
+    }
+
     QContactAction* contactAction = QContactAction::action(actionDescriptors.first()); 
     QList<QContactDetail> details = contactAction->supportedDetails(contact);
 
     delete contactAction;
-    
+
     for (int i = 0; i < details.count(); i++)
-        {
+    {
         if (contact.details().contains(details[i]))
-            {
+        {
             return true;
-            }
         }
-    
+    }
+
     return false;
 }
     
--- a/phonebookui/cntcommonui/views/cntactionmenubuilder.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/views/cntactionmenubuilder.h	Fri Oct 15 12:24:46 2010 +0300
@@ -15,8 +15,8 @@
 *
 */
 
-#ifndef CNTACTIONMENUBUILDER_H_
-#define CNTACTIONMENUBUILDER_H_
+#ifndef CNTACTIONMENUBUILDER_H
+#define CNTACTIONMENUBUILDER_H
 
 #include <QObject>
 #include <hbmenu.h>
@@ -24,6 +24,7 @@
 #include <qtcontacts.h>
 
 class CntStringMapper;
+
 QTM_BEGIN_NAMESPACE
 class QContact;
 class QContactDetail;
@@ -32,16 +33,16 @@
 QTM_USE_NAMESPACE
 
 class CntActionMenuBuilder : public QObject
-    {
+{
     Q_OBJECT
+    friend class TestCntActionMenuBuilder;
+    
 public:
     CntActionMenuBuilder( QContactLocalId aMyCardId );
     ~CntActionMenuBuilder();
     
 public:
     HbMenu* actionMenu( QContact& aContact, QContactLocalId myCardId );
-    
-public:
     HbMenu* buildActionMenu( QContact& aContact );
     
 signals:
@@ -57,22 +58,18 @@
     void emitCallContact();
     void emitSmsContact();
     void emitMailContact();
-    void emitContactaction(QContact& aContact, QContactDetail contactDetail, QString aAction);
+    void emitContactAction(QContact& aContact, QContactDetail contactDetail, QString aAction);
     
-#ifdef PBK_UNIT_TEST
-public:
-#else
-private:
-#endif
-    
+private:    
     void createCallAction( HbMenu& aMenu, QContact& aContact );
     void createMessageAction( HbMenu& aMenu, QContact& aContact );
     void createEmailAction( HbMenu& aMenu, QContact& aContact );
     bool isSupportedDetails( const QString &actionName, const QContact &contact );
 
 private:
-    QContactLocalId iMyCardId;
-    QContact* mContact;
-    CntStringMapper* mMap;
-    };
-#endif /* CNTACTIONMENUBUILDER_H_ */
+    QContactLocalId  iMyCardId;
+    QContact        *mContact;
+    CntStringMapper *mMap;
+};
+
+#endif /* CNTACTIONMENUBUILDER_H */
--- a/phonebookui/cntcommonui/views/cntbaseselectionview.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/views/cntbaseselectionview.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -29,8 +29,8 @@
 const char *CNT_SELECTION_LISTVIEW_UI_XML = ":/xml/contacts_list.docml";
 
 CntBaseSelectionView::CntBaseSelectionView() : 
-QObject(),
-mDocument(NULL)
+    QObject(),
+    mDocument(NULL)
 {
     mDocument = new HbDocumentLoader();
     
@@ -80,7 +80,8 @@
     
     mListView->setModel( mListModel );
     
-    if ( aArgs.contains(ESelectionMode) ) {
+    if ( aArgs.contains(ESelectionMode) )
+    {
         mListView->setSelectionMode( static_cast<HbAbstractItemView::SelectionMode>(aArgs.value(ESelectionMode).toInt()) );
     }
     
@@ -89,16 +90,8 @@
 
 void CntBaseSelectionView::deactivate()
 {
-}
-
-bool CntBaseSelectionView::isDefault() const
-{
-    return false;
+    
 }
 
-HbView* CntBaseSelectionView::view() const
-{
-    return mView;
-}
 
 // EOF
--- a/phonebookui/cntcommonui/views/cntbaseselectionview.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/views/cntbaseselectionview.h	Fri Oct 15 12:24:46 2010 +0300
@@ -28,10 +28,10 @@
 class HbAction;
 class CntListModel;
 
-
 class QTPBK_EXPORT CntBaseSelectionView : public QObject, public CntAbstractView
 {
     Q_OBJECT
+    friend class TestCntBaseSelectionView;
 
 public:
     CntBaseSelectionView();
@@ -44,20 +44,20 @@
 public:
     void activate( const CntViewParameters aArgs );
     void deactivate();
-    bool isDefault() const;
-    HbView* view() const;
+    bool isDefault() const { return false; }
+    HbView* view() const { return mView; }
     
     void setEngine( CntAbstractEngine& aEngine ){ mEngine = &aEngine; }
     virtual int viewId() const = 0;
     
 protected:
-    HbDocumentLoader* mDocument;
-    HbListView* mListView;
-    HbView* mView;
-    HbAction* mSoftkey;
-    CntAbstractViewManager* mMgr;
-    CntListModel* mListModel;
-    CntAbstractEngine* mEngine;
+    HbDocumentLoader        *mDocument;
+    HbListView              *mListView;
+    HbView                  *mView;
+    HbAction                *mSoftkey;
+    CntAbstractViewManager  *mMgr;
+    CntListModel            *mListModel;
+    CntAbstractEngine       *mEngine;
 };
 
 #endif /* CNTBASESELECTIONVIEW_H */
--- a/phonebookui/cntcommonui/views/cnthistoryview.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/views/cnthistoryview.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -17,6 +17,10 @@
 
 #include "cnthistoryview.h"
 
+#include "cnthistoryviewitem.h"
+#include "cntglobal.h"
+#include "cntdebug.h"
+
 #include <hblistview.h>
 #include <hbgroupbox.h>
 #include <hbdocumentloader.h>
@@ -24,19 +28,14 @@
 #include <hbview.h>
 #include <hbmessagebox.h>
 #include <hbaction.h>
-#include <xqappmgr.h>
-#include <xqservicerequest.h>
-#include <cnthistorymodel.h>
 #include <hbparameterlengthlimiter.h>
 #include <hbmainwindow.h>
 #include <hbframebackground.h>
 #include <hbabstractviewitem.h>
+#include <xqappmgr.h>
+#include <xqservicerequest.h>
+#include <cnthistorymodel.h>
 #include <QTimer>
-#include <qtcontacts.h>
-
-#include "cnthistoryviewitem.h"
-#include "cntglobal.h"
-#include "cntdebug.h"
 
 const char *CNT_HISTORYVIEW_XML = ":/xml/contacts_history.docml";
 
@@ -81,31 +80,10 @@
 {
     mView->deleteLater();
     
-    if (mDocumentLoader) {
-        delete mDocumentLoader;
-        mDocumentLoader = NULL;
-    }
-    if (mHistoryModel) {
-        delete mHistoryModel;
-        mHistoryModel = NULL;
-    }
-    if (mContact) {
-        delete mContact;
-        mContact = NULL;
-    }
-    
+    delete mDocumentLoader;
+    delete mHistoryModel;
+    delete mContact;
     delete mRequest;
-    mRequest = NULL;
-}
-
-/*!
- * Deactivate the view
- */
-void CntHistoryView::deactivate()
-{
-    QContactManager* cm = &mEngine->contactManager(SYMBIAN_BACKEND);
-    disconnect(cm, SIGNAL(contactsRemoved(const QList<QContactLocalId>&)),
-            this, SLOT(contactDeletedFromOtherSource(const QList<QContactLocalId>&)));
 }
 
 /**
@@ -126,24 +104,20 @@
     {
         name = hbTrId("txt_phob_list_unnamed");
     }
-    groupBox->setHeading(hbTrId("txt_phob_subtitle_history_with_1").arg(name));
+    groupBox->setHeading(HbParameterLengthLimiter("txt_phob_subtitle_history_with_1").arg(name));
     
     //construct listview
     mHistoryListView = static_cast<HbListView*>(docLoader()->findWidget(QString("listView")));
-    mHistoryListView->setLayoutName("history");
     CntHistoryViewItem *item = new CntHistoryViewItem;
-    item->setSecondaryTextRowCount(1, 3);
-    item->setGraphicsSize(HbListViewItem::SmallIcon);
     mHistoryListView->setItemPrototype(item); //ownership is taken
     
     // Connect listview items to respective slots
     connect(mHistoryListView, SIGNAL(activated(const QModelIndex &)),
                       this,  SLOT(itemActivated(const QModelIndex &)));
-    connect( mHistoryListView, SIGNAL(longPressed(HbAbstractViewItem*,const QPointF&)), 
-            this, SLOT(onLongPressed(HbAbstractViewItem*,const QPointF&)) );
-         
     
-    
+    // To make LongPress act like shortpress. After this only activated signal comes
+    mHistoryListView->setLongPressEnabled(false);
+
     mHistoryModel = new CntHistoryModel(mContact->localId(), cm);
     mHistoryListView->setModel(mHistoryModel); //ownership is not taken
     
@@ -174,6 +148,16 @@
 }
 
 /*!
+ * Deactivate the view
+ */
+void CntHistoryView::deactivate()
+{
+    QContactManager* cm = &mEngine->contactManager(SYMBIAN_BACKEND);
+    disconnect(cm, SIGNAL(contactsRemoved(const QList<QContactLocalId>&)),
+            this, SLOT(contactDeletedFromOtherSource(const QList<QContactLocalId>&)));
+}
+
+/*!
 Called after new items are added to or removed from comm history view
 */
 void CntHistoryView::updateScrollingPosition()
@@ -197,7 +181,7 @@
         name = hbTrId("txt_phob_list_unnamed");
     }
     
-    HbMessageBox::question(HbParameterLengthLimiter(hbTrId("txt_phob_info_clear_communications_history_with_1")).arg(name), this, 
+    HbMessageBox::question(HbParameterLengthLimiter("txt_phob_info_clear_communications_history_with_1").arg(name), this, 
             SLOT(handleClearHistory(int)), HbMessageBox::Delete | HbMessageBox::Cancel);
 }
 
@@ -212,16 +196,6 @@
     }
 }
 
-void CntHistoryView::onLongPressed(HbAbstractViewItem *item, const QPointF &coords)
-{
-    Q_UNUSED(coords);
-    QModelIndex index = item->modelIndex();
-    if (index.isValid())
-    {
-        itemActivated(index);
-    }
-}
-
 /*!
 Once list item is pressed on the list view this slot handles the 
 emitted signal
@@ -237,11 +211,13 @@
     QVariantList args;
     
     // If the list item is a call log a call is made to that item
-    if ( flags & CntCallLog ) {
+    if ( flags & CntCallLog )
+    {
         // Make a call
         QVariant number = index.data(CntPhoneNumberRole);
         
-        if ( number.isValid() ) {        
+        if ( number.isValid() )
+        {        
             interface = "com.nokia.symbian.ICallDial";
             operation = "dial(QString)";
             args << number;
@@ -257,11 +233,14 @@
             snd.send();
         }
         
-    } else if ( flags & CntMessage ) {
+    }
+    else if ( flags & CntMessage )
+    {
         // Open conversation view
         QVariant id = index.data(CntConverstaionIdRole);
         
-        if ( id.isValid() ) {
+        if ( id.isValid() )
+        {
             interface = "com.nokia.symbian.IMessageView";
             operation = "view(int)";
             args << id;
@@ -269,14 +248,16 @@
         }
     }
     
-    if ( createRequest ) {
+    if ( createRequest )
+    {
         XQApplicationManager appMng;
     
         delete mRequest;
         mRequest = NULL;
         mRequest = appMng.create(interface, operation, true); // embedded
         
-        if ( mRequest ) {
+        if ( mRequest )
+        {
             mRequest->setArguments(args); 
             mRequest->send();
         }
@@ -302,39 +283,48 @@
     mViewMgr->back( mArgs, true );
 }
 
+/*!
+Show or hide the clear history menu
+*/
+void CntHistoryView::showClearHistoryMenu()
+{
+    if (mHistoryModel->rowCount() > 0)
+    {
+        mClearHistory->setEnabled(true);
+    }
+    else
+    {
+        mClearHistory->setEnabled(false);
+    }
+}
 
+/*!
+Handle the situation where this contact is deleted from another source
+*/
 void CntHistoryView::contactDeletedFromOtherSource(const QList<QContactLocalId>& contactIds)
 {
     CNT_ENTRY
+    
     if ( contactIds.contains(mContact->localId()) )
     {
         // Do not switch to the previous view immediately. List views are
         // not updated properly if this is not done in the event loop
         QTimer::singleShot(0, this, SLOT(showRootView()));
     }
+    
     CNT_EXIT
 }
 
 /*!
-Show or hide the clear history menu
+Document loader
 */
-void CntHistoryView::showClearHistoryMenu()
-{
-    if (mHistoryModel->rowCount() > 0) {
-        mClearHistory->setEnabled(true);
-    } else {
-        mClearHistory->setEnabled(false);
-    }
-}
-
-/*!
- * Document loader
- */
 HbDocumentLoader* CntHistoryView::docLoader()
 {
-    if (!mDocumentLoader) {
+    if (!mDocumentLoader)
+    {
         mDocumentLoader = new HbDocumentLoader();
     }
+    
     return mDocumentLoader;
 }
 
--- a/phonebookui/cntcommonui/views/cnthistoryview.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/views/cnthistoryview.h	Fri Oct 15 12:24:46 2010 +0300
@@ -20,16 +20,17 @@
 
 #include <QObject>
 #include <cntabstractview.h>
-#include <qcontactid.h>
+#include <qtcontacts.h>
 
 class HbListView;
-class CntHistoryModel;
 class HbView;
-class QModelIndex;
 class HbAction;
 class HbDocumentLoader;
+class HbAbstractViewItem;
 class XQAiwRequest;
-class HbAbstractViewItem;
+class QModelIndex;
+class CntHistoryModel;
+
 
 QTM_BEGIN_NAMESPACE
 class QContact;
@@ -40,6 +41,7 @@
 class CntHistoryView : public QObject, public CntAbstractView
 {
     Q_OBJECT
+    friend class TestCntHistoryView;
     
 public: // From CntAbstractView
     CntHistoryView();
@@ -57,32 +59,25 @@
     void handleClearHistory(int action);
     void itemActivated(const QModelIndex &index);
     void showPreviousView();
+    void showRootView();
     void showClearHistoryMenu();
-    void showRootView();
     void contactDeletedFromOtherSource(const QList<QContactLocalId>& contactIds);
-    void onLongPressed (HbAbstractViewItem *item, const QPointF &coords);
-    
-    
     
 private:
     HbDocumentLoader* docLoader();
     
-#ifdef PBK_UNIT_TEST
-public:
-#else
-private:
-#endif    
-    HbListView*                 mHistoryListView; // not own
-    CntHistoryModel*            mHistoryModel; // own
-    HbView*                     mView; // not own
-    HbDocumentLoader*           mDocumentLoader; // own
-    CntAbstractViewManager*     mViewMgr; // not own
-    HbAction*                   mBackKey; // not own
-    QContact*                   mContact; // own
-    HbAction*                   mClearHistory;  // not own
-    CntViewParameters           mArgs;
-    XQAiwRequest*               mRequest;    
-    CntAbstractEngine*          mEngine;
+private:   
+    HbListView              *mHistoryListView; // not own
+    CntHistoryModel         *mHistoryModel; // own
+    HbView                  *mView; // not own
+    HbDocumentLoader        *mDocumentLoader; // own
+    CntAbstractViewManager  *mViewMgr; // not own
+    HbAction                *mBackKey; // not own
+    QContact                *mContact; // own
+    HbAction                *mClearHistory;  // not own
+    CntViewParameters        mArgs;
+    XQAiwRequest            *mRequest;    
+    CntAbstractEngine       *mEngine;
 };
 
 #endif // CNTHISTORYVIEW_H
--- a/phonebookui/cntcommonui/views/cnthistoryviewitem.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/views/cnthistoryviewitem.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -1,136 +1,77 @@
 /*
- * 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:
- *
- */
+* 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 "cnthistoryviewitem.h"
+#include "cnthistoryviewitemwidget.h"
 #include "cntdebug.h"
 
-#include <cnthistorymodel.h>
-#include <hbframedrawer.h>
-#include <hbframeitem.h>
-#include <QGraphicsWidget>
-
-#define NEW_EVENT_FRAME "qtg_fr_list_new_item"
-#define INCOMING_FOCUS_FRAME "qtg_fr_convlist_received_pressed"
-#define OUTGOING_FOCUS_FRAME "qtg_fr_convlist_sent_pressed"
+#include <QGraphicsLinearLayout>
 
-//---------------------------------------------------------------
-// HbListViewItem::HbListViewItem
-// Constructor
-//---------------------------------------------------------------
-CntHistoryViewItem::CntHistoryViewItem(QGraphicsItem* parent)
-: HbListViewItem(parent),
-  mIncoming(false),
-  mNewMessage(false),
-  mNewItem(NULL),
-  mFocusItem(NULL)
+/*!
+Constructor, initialize member variables.
+*/
+CntHistoryViewItem::CntHistoryViewItem(QGraphicsItem* parent) :
+    HbListViewItem(parent),
+    mWidget(NULL)
 {
     CNT_ENTRY
     
     CNT_EXIT
 }
 
-//---------------------------------------------------------------
-// HbListViewItem::createItem
-// Create a new decorator item.
-//---------------------------------------------------------------
+/*!
+Factory method to the items
+*/
 HbAbstractViewItem* CntHistoryViewItem::createItem()
 {
     return new CntHistoryViewItem(*this);
 }
 
-//---------------------------------------------------------------
-// HbListViewItem::updateChildItems
-//
-//---------------------------------------------------------------
+/*!
+Update the custom and standard parameters of this item identified by modelindex
+*/
 void CntHistoryViewItem::updateChildItems()
 {
     CNT_ENTRY
     
-    int flags = modelIndex().data(CntFlagsRole).toInt();
-    mIncoming = flags & CntIncoming ? true : false;
-    mNewMessage = flags & CntUnseen ? true : false;
-    
-    CNT_LOG_ARGS(mIncoming << mNewMessage)
-
-    if (mNewMessage)
+    if (!mWidget)
     {
-        if (!mNewItem)
-        {
-            mNewItem = new HbFrameItem(NEW_EVENT_FRAME, HbFrameDrawer::ThreePiecesVertical, this);
-            style()->setItemName(mNewItem, "newitem");
-        }
-    }
-    else
-    {
-        if (mNewItem)
-        {
-            delete mNewItem;
-            mNewItem = NULL;
-        }
+        mWidget = new CntHistoryViewItemWidget(this);
+        QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical);
+        layout->setContentsMargins(0, 0, 0, 0);
+        layout->addItem(mWidget);
+        setLayout(layout);
     }
     
-    HbListViewItem::updateChildItems();
-    
-    repolish();
+    mWidget->setModelIndex(modelIndex());
     
     CNT_EXIT
 }
 
-//---------------------------------------------------------------
-// HbAbstractViewItem::pressStateChanged
-// This function is called whenever item press state changes.
-//---------------------------------------------------------------
+/*!
+This function is called whenever item press state changes.
+*/
 void CntHistoryViewItem::pressStateChanged(bool pressed, bool animate)
 {
     CNT_ENTRY
     
     Q_UNUSED(animate);
-    if (pressed)
-    {
-        if (!mFocusItem)
-        {
-            // focus frame position can't be read from widgetml, we set it manually
-            QRectF frameRect = HbWidget::primitive("frame")->boundingRect();
-            QPointF framePoint = HbWidget::primitive("frame")->pos();
-            
-            frameRect.moveTo(framePoint);
-            
-            if (mIncoming)
-            {
-                mFocusItem = new HbFrameItem(INCOMING_FOCUS_FRAME, HbFrameDrawer::NinePieces, this);
-            }
-            else
-            {
-                mFocusItem = new HbFrameItem(OUTGOING_FOCUS_FRAME, HbFrameDrawer::NinePieces, this);
-            }
-            
-            mFocusItem->setGeometry(frameRect);
-            mFocusItem->setZValue(-1.0);
-            style()->setItemName(mFocusItem, "focusframe");
-        }
-    }
-    else
-    {
-        if (mFocusItem)
-        {
-            delete mFocusItem;
-            mFocusItem = NULL;
-        }
-    }
+
+    mWidget->pressStateChanged(pressed);
     
     CNT_EXIT
 }
--- a/phonebookui/cntcommonui/views/cnthistoryviewitem.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/views/cnthistoryviewitem.h	Fri Oct 15 12:24:46 2010 +0300
@@ -1,27 +1,26 @@
 /*
- * 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:Message chat View decorator item prototype
- *
- */
+* 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:
+*
+*/
 
 #ifndef CNTHISTORYVIEWITEM_H
 #define CNTHISTORYVIEWITEM_H
 
-// INCLUDES
 #include <hblistviewitem.h>
 
-class HbFrameItem;
+class CntHistoryViewItemWidget;
 
 /**
  * This class represents the item decorator of 
@@ -29,43 +28,20 @@
  */
 class CntHistoryViewItem : public HbListViewItem
 {
+    friend class TestCntHistoryView;
     Q_OBJECT
-    Q_PROPERTY( bool incoming READ getIncoming )
-    Q_PROPERTY( bool newmessage READ isNewMessage )
     
 public:
-    /*
-     * Constructor
-     * @param parent, reference of QGraphicsItem
-     * default set to 0
-     */
-    CntHistoryViewItem(QGraphicsItem* parent=0);
+    CntHistoryViewItem(QGraphicsItem* parent = NULL);
 
-    /*
-     * Factory method to the items
-     */
     HbAbstractViewItem* createItem();
-
-    /*
-     * Overriden method to draw the custom item in the list view
-     */
     void updateChildItems();
     
-    bool getIncoming() const { return mIncoming; }
-    bool isNewMessage() const { return mNewMessage; }
-    
 protected:
-    /*
-     * Overriden method to overwrite the default "pressed" effect
-     */
     void pressStateChanged(bool pressed, bool animate);
     
 private:
-    bool            mIncoming;
-    bool            mNewMessage;
-
-    HbFrameItem*    mNewItem;
-    HbFrameItem*    mFocusItem;
+    CntHistoryViewItemWidget *mWidget;
 };
 
-#endif // CNTHISTORYVIEWITEM_H
+#endif /* CNTHISTORYVIEWITEM_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/views/cnthistoryviewitemwidget.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,251 @@
+/*
+* 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 "cnthistoryviewitemwidget.h"
+#include "cntdebug.h"
+
+#include <cnthistorymodel.h>
+#include <hbiconitem.h>
+#include <hbtextitem.h>
+#include <hbframedrawer.h>
+#include <hbframeitem.h>
+
+#define NEW_EVENT_FRAME "qtg_fr_list_new_item"
+#define INCOMING_FOCUS_FRAME "qtg_fr_convlist_received_pressed"
+#define OUTGOING_FOCUS_FRAME "qtg_fr_convlist_sent_pressed"
+
+CntHistoryViewItemWidget::CntHistoryViewItemWidget(QGraphicsItem *parent) :
+    HbWidget(parent),
+    mIcon(NULL),
+    mTitle(NULL),
+    mBodyText(NULL),
+    mTimeStamp(NULL),
+    mFrameItem(NULL),
+    mFocusItem(NULL),
+    mNewItem(NULL),
+    incoming(false),
+    newmessage(false)
+{
+    CNT_ENTRY
+    
+    setProperty("state", "normal");
+    
+    CNT_EXIT
+}
+
+CntHistoryViewItemWidget::~CntHistoryViewItemWidget()
+{
+    CNT_ENTRY
+
+    CNT_EXIT
+}
+
+void CntHistoryViewItemWidget::createPrimitives()
+{
+    CNT_ENTRY
+    
+    if (!icon.isNull())
+    {
+        if (!mIcon)
+        {
+            mIcon = new HbIconItem(this);
+            mIcon->setAlignment(Qt::AlignCenter);
+            mIcon->setIcon(icon);
+            style()->setItemName(mIcon, "icon-1");
+        }
+    }
+    else
+    {
+        if (mIcon)
+        {
+            delete mIcon;
+        }
+        mIcon = NULL;
+    }
+
+    if (!title.isNull())
+    {
+        if (!mTitle)
+        {
+            mTitle = new HbTextItem(this);
+            mTitle->setText(title);
+            style()->setItemName(mTitle, "text-1");
+        }
+    }
+    else
+    {
+        if (mTitle)
+        {
+            delete mTitle;
+        }
+        mTitle = NULL;
+    }
+
+    if (!bodyText.isNull())
+    {
+        if (!mBodyText)
+        {
+            mBodyText = new HbTextItem(this);
+            mBodyText->setText(bodyText);
+            style()->setItemName(mBodyText, "text-2");
+        }
+    }
+    else
+    {
+        if (mBodyText)
+        {
+            delete mBodyText;
+        }
+        mBodyText = NULL;
+    }
+    
+    if (!timeStamp.isNull())
+    {
+        if (!mTimeStamp)
+        {
+            mTimeStamp = new HbTextItem(this);
+            mTimeStamp->setText(timeStamp);
+            style()->setItemName(mTimeStamp, "text-3");
+        }
+    }
+    else
+    {
+        if (mTimeStamp)
+        {
+            delete mTimeStamp;
+        }
+        mTimeStamp = NULL;
+    }
+
+    if (!mFrameItem)
+    {
+        mFrameItem = new HbFrameItem(this);
+        mFrameItem->frameDrawer().setFrameGraphicsName(backGround.frameGraphicsName());
+        mFrameItem->frameDrawer().setFrameType(backGround.frameType());
+        mFrameItem->setZValue(-2);
+        style()->setItemName(mFrameItem, "frame");
+    }
+    
+    CNT_EXIT
+}
+
+void CntHistoryViewItemWidget::recreatePrimitives()
+{
+    CNT_ENTRY
+    
+    HbWidget::recreatePrimitives();
+
+    delete mIcon;
+    mIcon = NULL;
+
+    delete mTitle;
+    mTitle = NULL;
+    
+    delete mBodyText;
+    mBodyText = NULL;
+    
+    delete mTimeStamp;
+    mTimeStamp= NULL;
+
+    delete mFrameItem;
+    mFrameItem = NULL;
+
+    createPrimitives();
+    
+    CNT_EXIT
+}
+
+void CntHistoryViewItemWidget::setModelIndex(const QModelIndex& index)
+{
+    CNT_ENTRY
+    
+    // CntHistoryModel ALWAYS returns 3x QString for Qt::DisplayRole
+    QStringList texts = index.data(Qt::DisplayRole).toStringList();
+    title = texts.at(0);
+    bodyText = texts.at(1);
+    timeStamp = texts.at(2);
+    
+    icon = index.data(Qt::DecorationRole).value<HbIcon>();
+    
+    backGround = index.data(Qt::BackgroundRole).value<HbFrameBackground>();
+    
+    int flags = index.data(CntFlagsRole).toInt();
+    incoming = flags & CntIncoming ? true : false;
+    newmessage = flags & CntUnseen ? true : false;
+
+    if (newmessage)
+    {
+        if (!mNewItem)
+        {
+            mNewItem = new HbFrameItem(NEW_EVENT_FRAME, HbFrameDrawer::ThreePiecesVertical, this);
+            style()->setItemName(mNewItem, "newitem");
+        }
+    }
+    else
+    {
+        if (mNewItem)
+        {
+            delete mNewItem;
+            mNewItem = NULL;
+        }
+    }
+    
+    recreatePrimitives();
+    repolish();
+    
+    setProperty("state", "normal");
+    
+    CNT_EXIT
+}
+
+void CntHistoryViewItemWidget::pressStateChanged(bool pressed)
+{
+    CNT_ENTRY
+    
+    if (pressed)
+    {
+        if (!mFocusItem)
+        {
+            if (incoming)
+            {
+                mFocusItem = new HbFrameItem(INCOMING_FOCUS_FRAME, HbFrameDrawer::NinePieces, this);
+            }
+            else
+            {
+                mFocusItem = new HbFrameItem(OUTGOING_FOCUS_FRAME, HbFrameDrawer::NinePieces, this);
+            }
+            mFocusItem->setZValue(-1.0);
+            style()->setItemName(mFocusItem, "focusframe");
+        }
+        
+        setProperty("state", "pressed");
+    }
+    else
+    {
+        if (mFocusItem)
+        {
+            delete mFocusItem;
+            mFocusItem = NULL;
+        }
+        
+        setProperty("state", "normal");
+    }
+    
+    repolish();
+    
+    CNT_EXIT
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/views/cnthistoryviewitemwidget.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,78 @@
+/*
+* 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:
+*
+*/
+
+#ifndef CNTHISTORYVIEWITEMWIDGET_H
+#define CNTHISTORYVIEWITEMWIDGET_H
+
+#include <QObject>
+#include <hbwidget.h>
+#include <hbframebackground.h>
+
+class HbIconItem;
+class HbTextItem;
+class HbFrameItem;
+
+class CntHistoryViewItemWidget : public HbWidget
+{
+    friend class TestCntHistoryView;
+    
+    Q_OBJECT
+    Q_PROPERTY( QString title READ getTitle )
+    Q_PROPERTY( QString bodyText READ getBodyText )
+    Q_PROPERTY( QString timeStamp READ getTimeStamp )
+    Q_PROPERTY( HbIcon icon READ getIcon )
+    Q_PROPERTY( bool incoming READ getIncoming )
+    Q_PROPERTY( bool newmessage READ isNewMessage )
+
+public:
+    CntHistoryViewItemWidget(QGraphicsItem *parent = 0);
+    ~CntHistoryViewItemWidget();
+
+public:
+    void createPrimitives();
+    void recreatePrimitives();
+    
+    void setModelIndex(const QModelIndex& index);
+    
+    void pressStateChanged(bool pressed);
+
+    QString getTitle() const { return title; }
+    QString getBodyText() const { return bodyText; }
+    QString getTimeStamp() const { return timeStamp; }
+    HbIcon getIcon() const { return icon; }
+    bool getIncoming() const { return incoming; }
+    bool isNewMessage() const { return newmessage; }
+
+private:
+    HbIconItem              *mIcon;
+    HbTextItem              *mTitle;
+    HbTextItem              *mBodyText;
+    HbTextItem              *mTimeStamp;
+    HbFrameItem             *mFrameItem;
+    HbFrameItem             *mFocusItem;
+    HbFrameItem             *mNewItem;
+
+    HbFrameBackground       backGround;
+    QString                 title;
+    QString                 bodyText;
+    QString                 timeStamp;
+    HbIcon                  icon;
+    bool                    incoming;
+    bool                    newmessage;
+};
+
+#endif /* CNTHISTORYVIEWITEMWIDGET_H */
--- a/phonebookui/cntcommonui/views/cntimageeditorview.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/views/cntimageeditorview.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -21,10 +21,6 @@
 #include "cntsavemanager.h"
 #include "cntimagelabel.h"
 
-#include <hblabel.h>
-#include <xqaiwrequest.h>
-#include <xqaiwdecl.h>
-
 #include "cntdebug.h"
 #include "cntglobal.h"
 
@@ -37,6 +33,9 @@
 #include <hbdevicenotificationdialog.h>
 #include <hbparameterlengthlimiter.h>
 
+#include <xqaiwrequest.h>
+#include <xqaiwdecl.h>
+
 #include <QStandardItemModel>
 #include <QApplication>
 
@@ -52,8 +51,7 @@
     mRequest(NULL),
     mViewManager(NULL),
     mListView(NULL),
-    mModel(NULL),
-    mSaveManager(NULL)
+    mModel(NULL)
 {
     bool ok = false;
     mDocumentLoader.load(CNT_IMAGE_XML, &ok);
@@ -89,17 +87,10 @@
     mView->deleteLater();
 
     delete mAvatar;
-    mAvatar = NULL;
     delete mContact;
-    mContact = NULL;
     delete mRequest;
-    mRequest = NULL;
     delete mRemoveImage;
-    mRemoveImage = NULL;
     delete mModel;
-    mModel = NULL;
-    delete mSaveManager;
-    mSaveManager = NULL;
     
     CNT_EXIT
 }
@@ -136,49 +127,31 @@
         mContact = new QContact(mArgs.value(ESelectedGroupContact).value<QContact>());
     }
     
-    QString myCard = mArgs.value( EMyCard ).toString();
-    QContactLocalId localId = mContact->localId();
-    QContactLocalId selfContactId = mEngine->contactManager(SYMBIAN_BACKEND).selfContactId();
-    bool isMyCard = ( localId == selfContactId && localId != 0 ) || !myCard.isEmpty();
-    
-    if (isMyCard)
-    {
-        mSaveManager = new CntSaveManager(CntSaveManager::EMyCard);
-    }
-    else if (mContact->type() == QContactType::TypeGroup)
-    {
-        mSaveManager = new CntSaveManager(CntSaveManager::EGroup);
-    }
-    else
-    {
-        mSaveManager = new CntSaveManager();
-    }
-    
     // set the correct image if the contact already has an image set
     mImageLabel = static_cast<CntImageLabel*>(mDocumentLoader.findWidget(QString("cnt_image_label")));
     mImageLabel->ungrabGesture(Qt::TapGesture);
     QList<QContactAvatar> details = mContact->details<QContactAvatar>();
     if (details.count() > 0)
+    {
+        for (int i = 0;i < details.count();i++)
         {
-        for (int i = 0;i < details.count();i++)
+            if (details.at(i).imageUrl().isValid())
             {
-                if (details.at(i).imageUrl().isValid())
-                    {
-                    mAvatar = new QContactAvatar(details.at(i));
-                    mThumbnailManager->getThumbnail(ThumbnailManager::ThumbnailLarge, mAvatar->imageUrl().toString());
-                    break;
-                    }
+                mAvatar = new QContactAvatar(details.at(i));
+                mThumbnailManager->getThumbnail(ThumbnailManager::ThumbnailLarge, mAvatar->imageUrl().toString());
+                break;
             }
         }
+    }
     else
-        {
+    {
         mAvatar = new QContactAvatar();
         mRemoveImage->setEnabled(false);
         if (mContact->type() == QContactType::TypeGroup)
-            {
+        {
             mImageLabel->setAvatarIcon(HbIcon("qtg_large_add_group_picture"));
-            }
         }
+    }
     
     // set up the list
     mListView = static_cast<HbListView*>(mDocumentLoader.findWidget(QString("cnt_listview")));
@@ -204,6 +177,9 @@
 
 }
 
+/*!
+Populate the list model
+*/
 void CntImageEditorView::populateModel(QStandardItemModel *model)
 {
     QStandardItem *newPhoto = new QStandardItem();
@@ -229,8 +205,9 @@
         delete mRequest;
         mRequest = 0;
     }
-    
+  
     mRequest = mAppManager.create(XQI_CAMERA_CAPTURE, XQOP_CAMERA_CAPTURE, false);
+
     if ( mRequest ) 
     {
         int mode = 0; //image mode
@@ -247,10 +224,10 @@
         args << mode;
         args << map;
         mRequest->setArguments(args);
+        mRequest->setSynchronous(false);    // this must be an Asynchronus request, If symchronous it crashes
         
         connect(mRequest, SIGNAL(requestOk(const QVariant&)), this, SLOT(handleImageChange(const QVariant&)));
-        connect(mRequest, SIGNAL(requestError(int,const QString&)), this, SLOT(handleError(int,const QString&)));
-
+        
         mRequest->send();
     }
     
@@ -271,6 +248,7 @@
     mRequest = mAppManager.create(XQI_IMAGE_FETCH, XQOP_IMAGE_FETCH, true);
     if ( mRequest ) 
     {
+        mRequest->setSynchronous(false);
         connect(mRequest, SIGNAL(requestOk(const QVariant&)), this, SLOT(handleImageChange(const QVariant&)));
         mRequest->send();
     }
@@ -307,9 +285,12 @@
     mViewManager->back( mArgs );
 }
 
+/*!
+Called when user selects to remove the image
+*/
 void CntImageEditorView::removeImage()
 {
-    QString filePath=mAvatar->imageUrl().toString();
+    QString filePath = mAvatar->imageUrl().toString();
     if(!filePath.isEmpty())
     {
         // Check if image removable.
@@ -374,6 +355,9 @@
     CNT_EXIT
 }
 
+/*!
+Called when thumbnailmanager is ready with the icon handling
+*/
 void CntImageEditorView::thumbnailReady(const QPixmap& pixmap, void *data, int id, int error)
 {
     CNT_ENTRY_ARGS("error code = " << error)
@@ -389,6 +373,9 @@
     CNT_EXIT
 }
 
+/*!
+Load the layout according to orientation
+*/
 void CntImageEditorView::setOrientation(Qt::Orientation orientation)
 {
     if (orientation == Qt::Vertical) 
@@ -425,13 +412,9 @@
     }
 }
 
-void CntImageEditorView::handleError(int errorCode, const QString& errorMessage)
-{
-    Q_UNUSED(errorCode);
-    Q_UNUSED(errorMessage);
-    CNT_LOG_ARGS("error code = " << errorCode << "errorMessage=" << errorMessage)
-}
-
+/*!
+Saves the whole contact, called when user exits phonebook (via task switcher or end key)
+*/
 void CntImageEditorView::saveContact()
 {
     mContact->saveDetail(mAvatar);
@@ -441,24 +424,44 @@
         mContact->removeDetail(mAvatar);
     }
     
-    QString name = mEngine->contactManager(SYMBIAN_BACKEND).synthesizedContactDisplayLabel(*mContact);
+    QContactManager& mgr = mEngine->contactManager( SYMBIAN_BACKEND );
+    QString name = mgr.synthesizedContactDisplayLabel(*mContact);
     
     if (name.isEmpty())
     {
         name = hbTrId("txt_phob_list_unnamed");
     }
     
-    CntSaveManager::CntSaveResult result = mSaveManager->saveContact(mContact, &mEngine->contactManager(SYMBIAN_BACKEND));
+    QString myCard = mArgs.value( EMyCard ).toString();
+    QContactLocalId localId = mContact->localId();
+    QContactLocalId selfContactId = mgr.selfContactId();
+    bool isMyCard = ( localId == selfContactId && localId != 0 ) || !myCard.isEmpty();
+    
+    CntSaveManager::CntSaveResult result;
+    CntSaveManager& save = mEngine->saveManager();
     
+    if (isMyCard)
+    {
+        result = save.saveMyCard( mContact, &mgr );
+    }
+    else if (mContact->type() == QContactType::TypeGroup)
+    {
+        result = save.saveGroup( mContact, &mgr );
+    }
+    else
+    {
+        result = save.saveContact( mContact, &mgr );
+    }
+       
     if (mContact->type() != QContactType::TypeGroup)
     {
         switch (result)
         {
         case CntSaveManager::ESaved:
-            HbDeviceNotificationDialog::notification(QString(),HbParameterLengthLimiter(hbTrId("txt_phob_dpophead_contact_1_saved")).arg(name));
+            HbDeviceNotificationDialog::notification(QString(),HbParameterLengthLimiter("txt_phob_dpophead_contact_1_saved").arg(name));
             break;
         case CntSaveManager::EUpdated:
-            HbDeviceNotificationDialog::notification(QString(),HbParameterLengthLimiter(hbTrId("txt_phob_dpophead_contacts_1_updated")).arg(name));
+            HbDeviceNotificationDialog::notification(QString(),HbParameterLengthLimiter("txt_phob_dpophead_contacts_1_updated").arg(name));
             break;
         case CntSaveManager::EFailed:
             HbDeviceNotificationDialog::notification(QString(),hbTrId("SAVING FAILED!"));
--- a/phonebookui/cntcommonui/views/cntimageeditorview.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/views/cntimageeditorview.h	Fri Oct 15 12:24:46 2010 +0300
@@ -20,17 +20,15 @@
 
 #include <QObject>
 #include <cntdocumentloader.h>
+#include <cntabstractview.h>
 #include <xqappmgr.h>
 
-#include <cntabstractview.h>
-
-class CntImageLabel;
 class HbListView;
+class HbAction;
 class XQAiwRequest;
-class HbAction;
 class QStandardItemModel;
 class QModelIndex;
-class CntSaveManager;
+class CntImageLabel;
 
 QTM_BEGIN_NAMESPACE
 class QContact;
@@ -42,6 +40,7 @@
 class CntImageEditorView : public QObject, public CntAbstractView
 {
     Q_OBJECT
+    friend class TestCntImageEditorView;
 
 public:
     CntImageEditorView();
@@ -54,41 +53,28 @@
     HbView* view() const { return mView; }
     int viewId() const { return imageEditorView; }
     inline void setEngine( CntAbstractEngine& aEngine ){ mEngine = &aEngine; }
-#ifdef PBK_UNIT_TEST
-public:
-#else
+
 private:
-#endif
     void populateModel(QStandardItemModel *model);
     void openCamera();
     void openGallery();
 
-#ifdef PBK_UNIT_TEST
-public slots:
-#else
 private slots:
-#endif
     void showPreviousView();
     void removeImage();
     void handleImageChange(const QVariant &value);
     void thumbnailReady( const QPixmap& pixmap, void *data, int id, int error );
     void setOrientation(Qt::Orientation orientation);
     void listViewActivated(const QModelIndex &index);
-    void handleError(int errorCode, const QString& errorMessage);
     void saveContact();
 
-
-#ifdef PBK_UNIT_TEST
-public:
-#else
 private:
-#endif
     QContact                *mContact; // own
     QContactAvatar          *mAvatar; // own
     CntImageLabel           *mImageLabel; // owned by layout
     XQAiwRequest            *mRequest; // own
     XQApplicationManager     mAppManager;
-    CntThumbnailManager        *mThumbnailManager; // own
+    CntThumbnailManager     *mThumbnailManager; // own
     HbView                  *mView; // own
     HbAction                *mSoftkey; // owned by view
     HbAction                *mRemoveImage; // own
@@ -96,10 +82,9 @@
     CntDocumentLoader        mDocumentLoader;
     HbListView              *mListView; // owned by layout
     QStandardItemModel      *mModel; // own
-    CntSaveManager          *mSaveManager; // own
     
-    CntViewParameters       mArgs;
-    CntAbstractEngine* mEngine;
+    CntViewParameters        mArgs;
+    CntAbstractEngine       *mEngine; // not owned
 };
 
-#endif // CNTIMAGEEDITORVIEW_H
+#endif /* CNTIMAGEEDITORVIEW_H */
--- a/phonebookui/cntcommonui/views/cntimportsview.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/views/cntimportsview.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -14,51 +14,43 @@
 * Description:  
 *
 */
-
-#include <QString.h>
-
 #include "cntimportsview.h"
-#include "cntglobal.h"
-
 #include "cntsimengine.h"
 
-#include <hbpushbutton.h>
+#include "cntglobal.h"
+#include <cntdebug.h>
+
 #include <hbaction.h>
 #include <hbview.h>
-#include <hbmenu.h>
 #include <hbframebackground.h>
-#include <QStandardItemModel>
-#include <hbmainwindow.h>
-#include <hblabel.h>
 #include <hblistview.h>
-#include <QTimer>
-#include <hbnotificationdialog.h>
-#include <hbmessagebox.h>
-#include <hbprogressbar.h>
-#include <QGraphicsLinearLayout>
-#include <hbframebackground.h>
-#include <hbabstractviewitem.h>
 #include <hbextendedlocale.h>
 #include <hbparameterlengthlimiter.h>
 #include <hblistviewitem.h>
-#include <hbstringutil.h>
+#include <hbdevicenotificationdialog.h>
+#include <hbprogressdialog.h>
+
+#include <QTimer>
+#include <QStandardItemModel>
 #include <QCoreApplication>
-#include <hbdevicenotificationdialog.h>
-#include <cntdebug.h>
 
 const char *CNT_IMPORT_UI_XML = ":/xml/contacts_sim.docml";
 
-CntImportsView::CntImportsView() : mViewManager(0),
-    mSimEngine(0),
-    mListView(0),
-    mView(0),
-    mSoftkey(0),
-    mModel(0),
-    mImportSimPopup(0),
-    mEngine(0)
+/*!
+Constructor
+*/
+CntImportsView::CntImportsView() :
+    mViewManager(NULL),
+    mSimEngine(NULL),
+    mListView(NULL),
+    mView(NULL),
+    mSoftkey(NULL),
+    mModel(NULL),
+    mImportSimPopup(NULL),
+    mEngine(NULL)
 {
     CNT_ENTRY
-    CNT_LOG_ARGS(QString("All bools reset"));
+
     bool ok = false;
     mDocumentLoader.load(CNT_IMPORT_UI_XML, &ok);
 
@@ -72,49 +64,27 @@
     }
     
     mSimEngine = new CntSimEngine(*this, *mView);
+    connect(mSimEngine, SIGNAL(showNamesView()), this, SLOT(showPreviousView()));
+    connect(mSimEngine, SIGNAL(closePopup()), this, SLOT(closeImportPopup()));
 
     //back button
     mSoftkey = new HbAction(Hb::BackNaviAction, mView);
     connect(mSoftkey, SIGNAL(triggered()), this, SLOT(showPreviousView()));
-    connect(mSimEngine, SIGNAL(showNamesView()), this, SLOT(showPreviousView()));
-    connect(mSimEngine, SIGNAL(closePopup()), this, SLOT(closeImportPopup()));
-    CNT_EXIT
-      
-}
 
-void CntImportsView::deactivate()
-{
-}
-
-   
-CntImportsView::~CntImportsView()
-{
-    CNT_ENTRY
-    mView->deleteLater();
-    delete mModel;
-    delete mSimEngine;
     CNT_EXIT
 }
 
 /*!
-Activates a previous view
+Destructor
 */
-void CntImportsView::showPreviousView()
+CntImportsView::~CntImportsView()
 {
     CNT_ENTRY
-    CntViewParameters args;
-    mViewManager->back(args);
-    CNT_EXIT
-}
-
-void CntImportsView::closeImportPopup()
-{
-    CNT_ENTRY
-    if (mImportSimPopup != NULL)
-    {
-        mImportSimPopup->close();
-        mImportSimPopup = NULL;     // Dilaog is deleted on close()
-    }
+    
+    mView->deleteLater();
+    delete mModel;
+    delete mSimEngine;
+    
     CNT_EXIT
 }
 
@@ -168,101 +138,140 @@
     CNT_EXIT
 }
 
+void CntImportsView::deactivate()
+{
+    
+}
 
+/*!
+Returns the contact manager
+*/
+QContactManager *CntImportsView::contactSymbianManager()
+{
+    if (mSimEngine)
+    {
+        return mSimEngine->contactSymbianManager();
+    }
+    
+    return NULL;
+}
+
+/*!
+Activates a previous view
+*/
+void CntImportsView::showPreviousView()
+{
+    CNT_ENTRY
+    
+    CntViewParameters args;
+    mViewManager->back(args);
+    
+    CNT_EXIT
+}
+
+/*!
+Close the import popup
+*/
+void CntImportsView::closeImportPopup()
+{
+    CNT_ENTRY
+    
+    if (mImportSimPopup != NULL)
+    {
+        mImportSimPopup->close();
+        mImportSimPopup = NULL;
+    }
+    
+    CNT_EXIT
+}
+
+/*!
+Called when list item is activated
+*/
 void CntImportsView::onListViewActivated(const QModelIndex &index)
 {
     CNT_ENTRY
+    
     int row = index.row();
     if ( row == 0 ) // row 0 has "Imports from SIM" 
     {
-       if (!mSimEngine->startSimImport())
-       {
-           //show error note
-           mSimEngine->simInfoErrorMessage(KErrAccessDenied);
-       }
-       else
-       {
-           //start popup and progress
-           showWaitNote();
-       }
-    }        
-    CNT_EXIT
-    
- }
+        if (!mSimEngine->startSimImport())
+        {
+            //show error note
+            mSimEngine->simInfoErrorMessage(KErrAccessDenied);
+        }
+        else
+        {
+            //start popup and progress
+            showWaitNote();
+        }
+    }
 
-void CntImportsView::showWaitNote()
-{
-    CNT_ENTRY
-    mImportSimPopup = new HbDialog();    
-    mImportSimPopup->setDismissPolicy(HbPopup::NoDismiss);
-    mImportSimPopup->setTimeout(HbPopup::NoTimeout);
-    mImportSimPopup->setBackgroundFaded(true);
-    mImportSimPopup->setAttribute(Qt::WA_DeleteOnClose, true);
-    
-    HbLabel *headingLabel = new HbLabel(mImportSimPopup);
-    headingLabel->setPlainText(hbTrId("txt_phob_title_import_contacts")); 
-    mImportSimPopup->setHeadingWidget(headingLabel);
-    
-    QGraphicsLinearLayout *containerLayout = new QGraphicsLinearLayout(Qt::Vertical);
-    containerLayout->setContentsMargins(0, 0, 0, 0);
-    containerLayout->setSpacing(10);
-    
-    HbLabel *icon = new HbLabel(mImportSimPopup);
-    icon->setIcon(HbIcon("qtg_large_sim"));  
-    
-    HbLabel *simText= new HbLabel(mImportSimPopup);
-    simText->setPlainText(hbTrId("txt_phob_info_importing_contacts_from_sim")); 
-    simText->setTextWrapping(Hb::TextWordWrap);
-    simText->setElideMode(Qt::ElideNone);
-    
-    HbProgressBar *progressBar = new HbProgressBar(mImportSimPopup);
-    progressBar->setRange(0,0); 
-    
-    HbPushButton *stopButton = new HbPushButton(mImportSimPopup);
-    stopButton->setText(hbTrId("txt_phob_button_cancel"));
-    connect(stopButton, SIGNAL(clicked()), mSimEngine, SLOT(stopSimImport()));
-    
-    QGraphicsLinearLayout *containerLayout1 = new QGraphicsLinearLayout(Qt::Horizontal);
-    containerLayout1->addItem(icon);
-    containerLayout1->addItem(simText);
-    
-    QGraphicsWidget *containerWidget = new QGraphicsWidget;    
-    containerLayout->addItem(containerLayout1);
-    containerLayout->addItem(progressBar);
-    containerLayout->addItem(stopButton);  
-    containerWidget->setLayout(containerLayout);
-    mImportSimPopup->setContentWidget(containerWidget);
-    mImportSimPopup->open();
     CNT_EXIT
 }
 
-void CntImportsView::setPreferredDetails( QContact *aContact )
-{
-    CNT_ENTRY
-    mSimEngine->setPreferredDetails(*aContact);
-    CNT_EXIT
-}
-
-
+/*!
+Called when importing is cancelled
+*/
 void CntImportsView::userCancelsImport()
 {   
     CNT_ENTRY
+    
     QString results;
     
     if(mSimEngine->userCancelsImport(results))
     {
         HbDeviceNotificationDialog::notification(QString(),results);
     }
+    
     CNT_EXIT
 }
 
+/*!
+Display the wait note
+*/
+void CntImportsView::showWaitNote()
+{
+    CNT_ENTRY
+    
+    mImportSimPopup = new HbProgressDialog(HbProgressDialog::WaitDialog);    
+    mImportSimPopup->setDismissPolicy(HbPopup::NoDismiss);
+    mImportSimPopup->setTimeout(HbPopup::NoTimeout);
+    mImportSimPopup->setBackgroundFaded(true);
+    mImportSimPopup->setAttribute(Qt::WA_DeleteOnClose, true);
+    
+    mImportSimPopup->setHeadingText(hbTrId("txt_phob_title_import_contacts"));
+    mImportSimPopup->setIcon(HbIcon("qtg_large_sim"));
+    mImportSimPopup->setText(hbTrId("txt_phob_info_importing_contacts_from_sim"));
+    
+    connect(mImportSimPopup, SIGNAL(cancelled()), mSimEngine, SLOT(stopSimImport()));
+
+    mImportSimPopup->show();
+    
+    CNT_EXIT
+}
+
+/*!
+Set preferred details for the given contact
+*/
+void CntImportsView::setPreferredDetails( QContact *aContact )
+{
+    CNT_ENTRY
+    
+    mSimEngine->setPreferredDetails(*aContact);
+    
+    CNT_EXIT
+}
 
 void CntImportsView::setListBoxItemText(QString& aPrimary, QString& aSecondary)
 {
     CNT_ENTRY
+    
     QList<QStandardItem*> importItems = mModel->takeRow(0);
     QStandardItem* importItem = NULL;
-    if (importItems.count() > 0) {
+    
+    if (importItems.count() > 0)
+    {
         importItem = importItems.at(0);
     }
     
@@ -278,14 +287,17 @@
         mModel->insertRow(0, importItem);
         mListView->reset();
     }
+    
     CNT_EXIT
 }
 
 void CntImportsView::setListBoxItemEnabled(bool aEnabled)
 {
     CNT_ENTRY
+    
     QList<QStandardItem*> importItems = mModel->takeRow(0);
     QStandardItem* importItem = NULL;
+    
     if ( !importItems.isEmpty() )
     {
        importItem = importItems.first();
@@ -295,17 +307,8 @@
     {
        importItem->setEnabled(aEnabled);
     }
+    
     CNT_EXIT
 }
 
-QContactManager *CntImportsView::contactSymbianManager()
-{
-    if (mSimEngine)
-    {
-        return mSimEngine->contactSymbianManager();
-    }
-    
-    return NULL;
-}
-
 // EOF
--- a/phonebookui/cntcommonui/views/cntimportsview.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/views/cntimportsview.h	Fri Oct 15 12:24:46 2010 +0300
@@ -15,26 +15,25 @@
 *
 */
 
-#ifndef CNTIMPORTSVIEW_H_
-#define CNTIMPORTSVIEW_H_
+#ifndef CNTIMPORTSVIEW_H
+#define CNTIMPORTSVIEW_H
 
 #include <QObject>
-#include <hbpushbutton.h>
-#include <hblistview.h>
 
-#include "cntactionmenubuilder.h"
-#include <hbdocumentloader.h>
 #include "cntsimutility.h"
 #include "cntimportviewcallback.h"
 
+#include <hbdocumentloader.h>
 #include <cntabstractview.h>
 
+class HbProgressDialog;
+class HbListView;
 class HbView;
 class HbAction;
 class QStandardItemModel;
-class HbDialog;
+class CntSimEngine;
+class QModelIndex;
 
-class CntSimEngine;
 QTM_BEGIN_NAMESPACE
 class QContact;
 QTM_END_NAMESPACE
@@ -43,13 +42,8 @@
 
 class CntImportsView : public QObject, public CntAbstractView, public CntImportViewCallback
 {
-
-Q_OBJECT
-
-public slots:
-
-    void onListViewActivated(const QModelIndex &index);
-    void userCancelsImport();
+    Q_OBJECT
+    friend class TestCntImportsView;
      
 public:
     CntImportsView();
@@ -64,6 +58,12 @@
     inline void setEngine( CntAbstractEngine& aEngine ){ mEngine = &aEngine; }
     QContactManager *contactSymbianManager();
     
+private slots:
+    void showPreviousView();
+    void closeImportPopup();
+    void onListViewActivated(const QModelIndex &index);
+    void userCancelsImport();
+    
 private:
     void showWaitNote();
     void setPreferredDetails( QContact *aContact );
@@ -72,30 +72,16 @@
     void setListBoxItemText(QString& aPrimary, QString& aSecondary);
     void setListBoxItemEnabled(bool aEnabled);
         
-#ifdef PBK_UNIT_TEST
-public slots:
-#else
-private slots:
-#endif
-    void showPreviousView();
-    void closeImportPopup();
-        
-#ifdef PBK_UNIT_TEST
-public :
-#else
-private :
-#endif  
-   // QContact* mContact;
-    CntAbstractViewManager* mViewManager;
-    CntSimEngine        *mSimEngine;
+private:
+    CntAbstractViewManager  *mViewManager;
+    CntSimEngine            *mSimEngine;
     HbListView              *mListView;
-    HbDocumentLoader mDocumentLoader;
-    HbView* mView; // own
-    HbAction* mSoftkey;
-	QStandardItemModel* mModel;
-    HbDialog *mImportSimPopup;
-
-    CntAbstractEngine* mEngine;
+    HbDocumentLoader         mDocumentLoader;
+    HbView                  *mView;
+    HbAction                *mSoftkey;
+	QStandardItemModel      *mModel;
+	HbProgressDialog        *mImportSimPopup;
+    CntAbstractEngine       *mEngine;
 };
 
-#endif /* CNTIMPORTSVIEW_H_ */
+#endif /* CNTIMPORTSVIEW_H */
--- a/phonebookui/cntcommonui/views/cntimportviewcallback.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/views/cntimportviewcallback.h	Fri Oct 15 12:24:46 2010 +0300
@@ -15,8 +15,8 @@
 *
 */
 
-#ifndef CNTIMPORTVIEWCALLBACK_H_
-#define CNTIMPORTVIEWCALLBACK_H_
+#ifndef CNTIMPORTVIEWCALLBACK_H
+#define CNTIMPORTVIEWCALLBACK_H
 
 class QString;
 
@@ -33,4 +33,4 @@
     virtual void setListBoxItemEnabled(bool aEnabled) = 0;
 };
 
-#endif /* CNTIMPORTVIEWCALLBACK_H_ */
+#endif /* CNTIMPORTVIEWCALLBACK_H */
--- a/phonebookui/cntcommonui/views/cntmycardview.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/views/cntmycardview.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -27,6 +27,9 @@
 
 const char *CNT_MYCARD_UI_XML = ":/xml/contacts_mc.docml";
 
+/*!
+Constructor
+*/
 CntMyCardView::CntMyCardView() :
     mContact(NULL),
     mViewManager(NULL)
@@ -48,31 +51,25 @@
     connect(mSoftkey, SIGNAL(triggered()), this, SLOT(showPreviousView()));
 }
 
+/*!
+Destructor
+*/
 CntMyCardView::~CntMyCardView()
 {
     mView->deleteLater();
     
     delete mContact;
-    mContact = NULL;
-}
-
-/*!
-Activates a previous view
-*/
-void CntMyCardView::showPreviousView()
-{
-	CntViewParameters args;
-    mViewManager->back(args);
 }
 
 /*
-Activates a default view
+Activates the view
 */
 void CntMyCardView::activate(const CntViewParameters aArgs)
 {
     mViewManager = &mEngine->viewManager();
     
-    if (mView->navigationAction() != mSoftkey) {
+    if (mView->navigationAction() != mSoftkey)
+    {
         mView->setNavigationAction(mSoftkey);
     }
     
@@ -81,21 +78,20 @@
     setOrientation(window->orientation());
     
     mContact = new QContact(aArgs.value(ESelectedContact).value<QContact>());
-    HbPushButton *newButton = static_cast<HbPushButton*>(mDocumentLoader.findWidget(QString("cnt_button_new")));
-    connect(newButton, SIGNAL(clicked()), this, SLOT(openNameEditor()));
-    connect(newButton, SIGNAL(longPress(QPointF)), this, SLOT(openNameEditor()));
+
+    mNewButton = static_cast<HbPushButton*>(mDocumentLoader.findWidget(QString("cnt_button_new")));
+    connect(mNewButton, SIGNAL(released()), this, SLOT(openEditor()));
 
-    HbPushButton *chooseButton = static_cast<HbPushButton*>(mDocumentLoader.findWidget(QString("cnt_button_choose")));
-    connect(chooseButton, SIGNAL(clicked()), this, SLOT(openMyCardSelectionView()));
-    connect(chooseButton, SIGNAL(longPress(QPointF)), this, SLOT(openMyCardSelectionView()));
-
+    mChooseButton = static_cast<HbPushButton*>(mDocumentLoader.findWidget(QString("cnt_button_choose")));
+    connect(mChooseButton, SIGNAL(released()), this, SLOT(openMyCardSelectionDialog()));
+    
     QContactDetailFilter filter;
     filter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType);
     filter.setValue(QLatin1String(QContactType::TypeContact));
 
     if (mEngine->contactManager( SYMBIAN_BACKEND ).contactIds(filter).isEmpty())
     {
-        chooseButton->setEnabled(false);
+        mChooseButton->setEnabled(false);
     }
 }
 
@@ -103,6 +99,72 @@
 {
 }
 
+/*!
+Activates a previous view
+*/
+void CntMyCardView::showPreviousView()
+{
+    CntViewParameters args;
+    mViewManager->back(args);
+}
+
+/*!
+Opens the editor view
+*/
+void CntMyCardView::openEditor()
+{
+    if (mNewButton->isUnderMouse())
+    {
+        CntViewParameters viewParameters;
+        viewParameters.insert(EViewId, editView);
+        viewParameters.insert(EMyCard, "myCard" );
+        
+        QVariant var;
+        var.setValue(*mContact);
+        viewParameters.insert(ESelectedContact, var);
+        viewParameters.insert(EExtraAction, CNT_ROOT_ACTION);
+        mViewManager->changeView(viewParameters);
+    }
+
+}
+
+/*!
+Opens the my card selection dialog
+*/
+void CntMyCardView::openMyCardSelectionDialog()
+{
+    if (mChooseButton->isUnderMouse())
+    {
+        CntFetchContactPopup* popup = CntFetchContactPopup::createSingleSelectionPopup(
+                   hbTrId("txt_phob_title_select_contact"),
+                   mEngine->contactManager(SYMBIAN_BACKEND));
+        connect( popup, SIGNAL(fetchReady(QSet<QContactLocalId>)), this, SLOT(handleMyCardSelection(QSet<QContactLocalId>)));
+        QSet<QContactLocalId> ids;
+        popup->setSelectedContacts(ids);
+        popup->showPopup();
+    }
+}
+
+/*!
+Handle the contact selection
+*/
+void CntMyCardView::handleMyCardSelection( QSet<QContactLocalId> aIds )
+{
+    QContactManager& manager = mEngine->contactManager( SYMBIAN_BACKEND );
+
+    if ( !aIds.isEmpty() ) {
+        QList<QContactLocalId> selectedContactsList = aIds.values();
+        QContact contact = manager.contact(selectedContactsList.front());
+        removeFromGroup(&contact);
+        
+        manager.setSelfContactId( contact.localId() );
+        showPreviousView();
+    }
+}
+
+/*!
+Sets the layout according to the orientation
+*/
 void CntMyCardView::setOrientation(Qt::Orientation orientation)
 {
     if (orientation == Qt::Vertical) 
@@ -118,49 +180,8 @@
 }
 
 /*!
-Opens the name detail editor view
-*/
-void CntMyCardView::openNameEditor()
-{
-    CntViewParameters viewParameters;
-    viewParameters.insert(EViewId, editView);
-    viewParameters.insert(EMyCard, "myCard" );
-    
-    QVariant var;
-    var.setValue(*mContact);
-    viewParameters.insert(ESelectedContact, var);
-    viewParameters.insert(EExtraAction, CNT_ROOT_ACTION);
-    mViewManager->changeView(viewParameters);
-}
-
-/*!
-Opens the my card selection view
+Removes the contact from all possible groups
 */
-void CntMyCardView::openMyCardSelectionView()
-{
-    CntFetchContactPopup* popup = CntFetchContactPopup::createSingleSelectionPopup(
-            hbTrId("txt_phob_title_select_contact"),
-            mEngine->contactManager(SYMBIAN_BACKEND));
-    connect( popup, SIGNAL(fetchReady(QSet<QContactLocalId>)), this, SLOT(handleMultiCardSelection(QSet<QContactLocalId>)));
-    QSet<QContactLocalId> ids;
-    popup->setSelectedContacts(ids);
-    popup->showPopup();
-}
-
-void CntMyCardView::handleMultiCardSelection( QSet<QContactLocalId> aIds )
-{
-    QContactManager& manager = mEngine->contactManager( SYMBIAN_BACKEND );
-
-    if ( !aIds.isEmpty() ) {
-        QList<QContactLocalId> selectedContactsList = aIds.values();
-        QContact contact = manager.contact(selectedContactsList.front());
-        removeFromGroup(&contact);
-        
-        manager.setSelfContactId( contact.localId() );
-        showPreviousView();
-    }
-}
-
 void CntMyCardView::removeFromGroup(const QContact* aContact)
 {
     // Fetch all groups the contact is member and remove the relationships
@@ -172,7 +193,8 @@
     QList<QContactLocalId> groupIds = mgr.contactIds(relationshipFilter);
     
     QList<QContactRelationship> relationships;
-    for(int i = 0;i < groupIds.count();i++) {
+    for(int i = 0;i < groupIds.count();i++)
+    {
         QContact groupContact = mgr.contact(groupIds.at(i));
         QContactRelationship relationship;
         relationship.setRelationshipType(QContactRelationship::HasMember);
@@ -180,6 +202,7 @@
         relationship.setSecond(aContact->id());
         relationships.append(relationship);
     }
+    
     QMap<int, QContactManager::Error> errorMap;
     mgr.removeRelationships(relationships,&errorMap);
 }
--- a/phonebookui/cntcommonui/views/cntmycardview.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/views/cntmycardview.h	Fri Oct 15 12:24:46 2010 +0300
@@ -15,8 +15,8 @@
 *
 */
 
-#ifndef CNTMYCARDVIEW_H_
-#define CNTMYCARDVIEW_H_
+#ifndef CNTMYCARDVIEW_H
+#define CNTMYCARDVIEW_H
 
 #include <QObject>
 #include <QSet>
@@ -25,6 +25,7 @@
 
 class HbView;
 class HbAction;
+class HbPushButton;
 
 QTM_BEGIN_NAMESPACE
 class QContact;
@@ -34,9 +35,9 @@
 
 class CntMyCardView : public QObject, public CntAbstractView
 {
-
-Q_OBJECT
-
+    Q_OBJECT
+    friend class TestCntMyCardView;
+    
 public:
     CntMyCardView();
     ~CntMyCardView();
@@ -52,23 +53,23 @@
     
 private slots:
     void showPreviousView();
-    void openNameEditor();
-    void openMyCardSelectionView(); 
-    void handleMultiCardSelection(QSet<QContactLocalId> aIds);
+    void openEditor();
+    void openMyCardSelectionDialog(); 
+    void handleMyCardSelection(QSet<QContactLocalId> aIds);
     void setOrientation(Qt::Orientation orientation);
 
 private: 
-    
     void removeFromGroup(const QContact* contact);
     
 private:  
-    QContact*                 mContact; // own
-    CntAbstractViewManager*   mViewManager;
-    HbDocumentLoader          mDocumentLoader;
-    HbView*                   mView; // own
-    HbAction*                 mSoftkey;
-    CntAbstractEngine*        mEngine; 
-    friend class TestCntMyCardView;
+    QContact                *mContact; // own
+    CntAbstractViewManager  *mViewManager;
+    HbDocumentLoader         mDocumentLoader;
+    HbView                  *mView; // own
+    HbAction                *mSoftkey;
+    CntAbstractEngine       *mEngine;
+    HbPushButton            *mNewButton;
+    HbPushButton            *mChooseButton;
 };
 
-#endif /* CNTMYCARDVIEW_H_ */
+#endif /* CNTMYCARDVIEW_H */
--- a/phonebookui/cntcommonui/views/cntnamesview.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/views/cntnamesview.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -19,7 +19,8 @@
 #include "cntnamesview_p.h"
 #include <hbview.h>
 
-CntNamesView::CntNamesView() : d_ptr( new CntNamesViewPrivate() )
+CntNamesView::CntNamesView() : 
+    d_ptr( new CntNamesViewPrivate() )
 {
     Q_D(CntNamesView);
     d->q_ptr = this;
@@ -68,6 +69,18 @@
     Q_D(CntNamesView);
     d->setEngine( aEngine );
 }
+
+QString CntNamesView::externalize(QDataStream &stream)
+{
+    Q_D(CntNamesView);
+    return d->externalize(stream);
+}
+
+bool CntNamesView::internalize(QDataStream &stream, CntViewParameters &viewParameters)
+{
+    Q_D(CntNamesView);
+    return d->internalize(stream, viewParameters);
+}
    
 
 // end of file
--- a/phonebookui/cntcommonui/views/cntnamesview.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/views/cntnamesview.h	Fri Oct 15 12:24:46 2010 +0300
@@ -42,6 +42,9 @@
   
     void setEngine( CntAbstractEngine& aEngine );
     
+    QString externalize(QDataStream &stream);
+    bool internalize(QDataStream &stream, CntViewParameters &viewParameters);
+    
 private:
     CntNamesViewPrivate* const d_ptr;
     Q_DECLARE_PRIVATE_D(d_ptr, CntNamesView)
--- a/phonebookui/cntcommonui/views/cntnamesview_p.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/views/cntnamesview_p.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -23,8 +23,10 @@
 #include "cntdebug.h"
 #include "cntapplication.h"
 #include "cntfavourite.h"
+#include "cntpinchgrabber.h"
+#include "cntnamesviewitem.h"
+
 #include <cntabstractengine.h>
-
 #include <cntuiextensionfactory.h>
 #include <cntuisocialextension.h>
 
@@ -34,7 +36,6 @@
 #include <hbtoolbar.h>
 #include <hbmainwindow.h>
 #include <hbview.h>
-#include <hblabel.h>
 #include <hbdocumentloader.h>
 #include <hblistview.h>
 #include <hblistviewitem.h>
@@ -51,6 +52,7 @@
 #include <QInputContext>
 
 const char *CNT_CONTACTLIST_XML = ":/xml/contacts_namelist.docml";
+const QString CNT_ACTIVITY_MAINVIEW = "ContactsMainView";
 static const int CNT_MIN_ROW_COUNT = 2;
 bool CntNamesViewPrivate::mIsFirstTimeUse = true;
 
@@ -58,23 +60,28 @@
     QObject(),
     mViewManager(NULL),
     mListModel(NULL),
+    mView(NULL),
     mListView(NULL),
-	mEmptyList(NULL),
     mSearchPanel(NULL),
     mLoader(NULL),
     mVirtualKeyboard(NULL),
+    mSoftkey(NULL),
     mNamesAction(NULL),
+    mMultipleDeleter(NULL),
     mMenuBuilder(NULL),
+    mActionGroup(NULL),
+    mMenu(NULL),
+    mViewMenu(NULL),
+    mEngine(NULL),
     mHandledContactId(0),
-    mActionGroup(NULL),
-	mMenu(NULL),
-	mFilterChanged(false)
+    mFilterChanged(false)
 {
     CNT_ENTRY
     
     bool ok;
     document()->load( CNT_CONTACTLIST_XML, &ok);
-    if (!ok) {
+    if (!ok)
+    {
         qFatal("Unable to read %S", CNT_CONTACTLIST_XML);
     }
     
@@ -87,9 +94,9 @@
     mSoftkey = new HbAction(Hb::BackNaviAction, mView);
     connect(mSoftkey, SIGNAL(triggered()), this, SLOT(showPreviousView()));
     
-    mNewContact = static_cast<HbAction*> (document()->findObject("cnt:newcontact"));
-    mNewContact->setParent(mView);
-    connect(mNewContact, SIGNAL(triggered()), this, SLOT(createNewContact()));
+    HbAction *newContact = static_cast<HbAction*> (document()->findObject("cnt:newcontact"));
+    newContact->setParent(mView);
+    connect(newContact, SIGNAL(triggered()), this, SLOT(createNewContact()));
 
     mMultipleDeleter = static_cast<HbAction*> (document()->findObject("cnt:delete"));
     mMultipleDeleter->setParent(mView);
@@ -106,9 +113,9 @@
     mNamesAction = static_cast<HbAction*> (document()->findObject("cnt:names"));
     mNamesAction->setParent(mView);
 
-    mImportSim = static_cast<HbAction*> (document()->findObject("cnt:importsim"));
-    mImportSim->setParent(mView);
-    connect(mImportSim, SIGNAL(triggered()), this, SLOT(importSim()));
+    HbAction *importSim = static_cast<HbAction*> (document()->findObject("cnt:importsim"));
+    importSim->setParent(mView);
+    connect(importSim, SIGNAL(triggered()), this, SLOT(showImportsView()));
     
     mActionGroup = new QActionGroup(this);
     groups->setActionGroup(mActionGroup);
@@ -120,17 +127,18 @@
        
     HbAction* settings = static_cast<HbAction*>(document()->findObject("cnt:settings") );
     settings->setParent(mView);
-    connect( settings, SIGNAL(triggered()), this, SLOT(showSettings()) );
+    connect( settings, SIGNAL(triggered()), this, SLOT(showSettingsView()) );
 
-    HbMenu* viewMenu = static_cast<HbMenu*>(document()->findObject("viewMenu") );
-    viewMenu->setParent(mView);
+    mViewMenu = static_cast<HbMenu*>(document()->findObject("viewMenu") );
+    mViewMenu->setParent(mView);
 
     connect(list(), SIGNAL(longPressed(HbAbstractViewItem*,QPointF)), this,
            SLOT(showContextMenu(HbAbstractViewItem*,QPointF)));
-    connect(list(), SIGNAL(activated (const QModelIndex&)), this,
+    connect(list(), SIGNAL(activated(const QModelIndex&)), this,
            SLOT(showContactView(const QModelIndex&)));
+    connect(list(), SIGNAL(pressed(const QModelIndex&)), this,
+           SLOT(setShowContextMenu(const QModelIndex&)));
 
-    mEmptyList = static_cast<HbLabel*> (document()->findWidget("emptyLabel"));
     mSearchPanel = static_cast<HbSearchPanel*> (document()->findWidget("searchPanel"));
     connect(mSearchPanel, SIGNAL(exitClicked()), this, SLOT(hideFinder()));
     connect(mSearchPanel, SIGNAL(criteriaChanged(QString)), this, SLOT(setFilter(QString)));
@@ -139,36 +147,9 @@
     CntApplication* cntApp = static_cast<CntApplication*>(qApp);
     connect(win, SIGNAL(viewReady()), cntApp, SIGNAL(applicationReady()));
     
-#ifdef __WINS__
-    mView->menu()->addAction("Change Orientation", this, SLOT(switchOrientation()) );
-#endif
     CNT_EXIT
 }
 
-void CntNamesViewPrivate::handleImportContacts( HbAction *aAction )
-{
-    CNT_ENTRY
-    
-    HbDialog *popup = static_cast<HbDialog*>(sender());
-    
-    if (popup && aAction == popup->actions().first())
-    {
-        CntViewParameters args;        
-        args.insert(EViewId, importsView);
-        mViewManager->changeView(args);
-    }
-          
-    CNT_EXIT
-}
-
-void CntNamesViewPrivate::switchOrientation()
-{
-    HbMainWindow* win = mView->mainWindow();
-    Qt::Orientation orientation = win->orientation();
-    
-    win->setOrientation( orientation == Qt::Horizontal ? Qt::Vertical : Qt::Horizontal );
-}
-
 CntNamesViewPrivate::~CntNamesViewPrivate()
 {
     CNT_ENTRY
@@ -201,7 +182,7 @@
     CNT_ENTRY
     
     mViewManager = &mEngine->viewManager();
-    if (mView->mainWindow() != NULL && !(mView->visibleItems() & Hb::AllItems))
+    if (mView->mainWindow() != NULL && !(mView->visibleItems() & Hb::ToolBarItem))
     {
         hideFinder();
     }
@@ -247,7 +228,10 @@
    
     if ( aArgs.value( EExtraAction ).toString() == CNT_FIND_ACTION  )
     {
-        showFinder();
+        connect(mView->mainWindow(), SIGNAL(viewReady()), this, SLOT(showFinder()));
+        mIsFirstTimeUse = false;
+        //there is a problem with post event of QEvent::RequestSoftwareInputPanel
+        //showFinder();
     }
     
     if (mIsFirstTimeUse)
@@ -277,10 +261,8 @@
                 note->setStandardButtons(HbMessageBox::NoButton);
                 note->addAction(new HbAction(hbTrId("txt_phob_button_import"), note));
                 note->addAction(new HbAction(hbTrId("txt_common_button_cancel"), note));
-                    
-                HbLabel *headingLabel = new HbLabel( note );
-                headingLabel->setPlainText(hbTrId("txt_phob_title_import_contacts")); 
-                note->setHeadingWidget(headingLabel);
+                
+                note->setHeadingText(hbTrId("txt_phob_title_import_contacts"));
                 
                 note->setIcon(HbIcon("qtg_large_sim"));
                 note->setText(hbTrId("txt_phob_info_your_phonebook_is_empty_do_you_wish"));
@@ -315,6 +297,26 @@
     CNT_EXIT
 }
 
+QString CntNamesViewPrivate::externalize(QDataStream &stream)
+{
+    CntViewParameters viewParameters;
+    viewParameters.insert(EViewId, namesView);
+    if (isFinderVisible())
+    {
+        viewParameters.insert(EExtraAction, CNT_FIND_ACTION);
+    }
+  
+    stream << viewParameters;
+    
+    return CNT_ACTIVITY_MAINVIEW;
+}
+
+bool CntNamesViewPrivate::internalize(QDataStream &stream, CntViewParameters &viewParameters)
+{
+    stream >> viewParameters;
+    return true;
+}
+
 void CntNamesViewPrivate::deactivate()
 {
     CNT_ENTRY
@@ -330,84 +332,23 @@
     CNT_EXIT
 }
 
-void CntNamesViewPrivate::changeDeleteActionStatus()
-{
-    CNT_ENTRY
-    
-    bool multipleContactsFound = mListModel->rowCount() >= CNT_MIN_ROW_COUNT;
-    mMultipleDeleter->setEnabled(multipleContactsFound);
-    
-    CNT_EXIT
-}
-
-void CntNamesViewPrivate::focusLineEdit()
-{
-    CNT_ENTRY
-    
-    HbLineEdit *editor = static_cast<HbLineEdit*>(mSearchPanel->primitive("lineedit"));
-    if (editor)
-    {
-        editor->setObjectName("focusLineEdit");
-        editor->setInputMethodHints(Qt::ImhNoPredictiveText);
-        editor->setText("");
-        editor->setFocus();
-        
-        // This opens the VKB
-        QInputContext *ic = qApp->inputContext();
-        if (ic)
-        {
-            QEvent *event = new QEvent(QEvent::RequestSoftwareInputPanel);
-            ic->filterEvent(event);
-            delete event;
-        }
-    }
-
-    CNT_EXIT
-}
-
-void CntNamesViewPrivate::setFilter(const QString &filterString)
-{
-    CNT_ENTRY
-
-    QContactDetailFilter filter;
-
-    if (filterString.isEmpty()) {
-        filter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType);
-        QString typeContact = QContactType::TypeContact;
-        filter.setValue(typeContact);
-    } else {
-        QStringList searchList = filterString.split(QRegExp("\\s+"), QString::SkipEmptyParts);
-        filter.setDetailDefinitionName(QContactDisplayLabel::DefinitionName,
-            QContactDisplayLabel::FieldLabel);
-        filter.setMatchFlags(QContactFilter::MatchStartsWith);
-        filter.setValue(searchList);
-    }
-
-    mListModel->setFilter(filter);
-    mFilterChanged = true;
-
-    if (mListModel->rowCount() == 0) {
-        document()->load( CNT_CONTACTLIST_XML, "find_empty" );
-    } else {
-        document()->load( CNT_CONTACTLIST_XML, "find_list" );
-    }
-    
-    CNT_EXIT
-}
-
 void CntNamesViewPrivate::showFinder()
 {
     CNT_ENTRY
     
+    disconnect(mView->mainWindow(), SIGNAL(viewReady()), this, SLOT(showFinder()));
+    
     mListModel->showMyCard(false);
     
-    HbListViewItem* proto = mListView->listItemPrototype();
+    HbListViewItem* proto = list()->listItemPrototype();
     proto->setTextFormat( Qt::RichText );
     
-    mView->hideItems(Hb::AllItems);
+    mView->hideItems(Hb::ToolBarItem);
     
     focusLineEdit();
     
+    mViewMenu = mView->takeMenu();
+    
     CNT_EXIT
 }
 
@@ -416,9 +357,9 @@
     CNT_ENTRY
     
     document()->load( CNT_CONTACTLIST_XML, "no_find" );
-    mView->showItems(Hb::AllItems);
+    mView->showItems(Hb::ToolBarItem);
     
-    HbListViewItem* proto = mListView->listItemPrototype();
+    HbListViewItem* proto = list()->listItemPrototype();
     proto->setTextFormat( Qt::PlainText );
         
     mListModel->showMyCard(true);
@@ -435,34 +376,42 @@
     
     changeDeleteActionStatus();
 
+    mView->setMenu(mViewMenu);
+
     CNT_EXIT    
 }
 
-bool CntNamesViewPrivate::isFinderVisible()
+void CntNamesViewPrivate::setFilter(const QString &filterString)
 {
     CNT_ENTRY
-    
-    bool isVisible = false;
-    if ( mSearchPanel )
+
+    QContactDetailFilter filter;
+
+    if (filterString.isEmpty())
     {
-        isVisible = mSearchPanel->isVisible();
-    }
-    
-    CNT_EXIT
-    return isVisible;
-}
-
-void CntNamesViewPrivate::showPreviousView()
-{
-    CNT_ENTRY
-    
-    if ( !isFinderVisible() )
-    {
-        mViewManager->back( CntViewParameters() );
+        filter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType);
+        QString typeContact = QContactType::TypeContact;
+        filter.setValue(typeContact);
     }
     else
     {
-        hideFinder();
+        QStringList searchList = filterString.split(QRegExp("\\s+"), QString::SkipEmptyParts);
+        filter.setDetailDefinitionName(QContactDisplayLabel::DefinitionName,
+            QContactDisplayLabel::FieldLabel);
+        filter.setMatchFlags(QContactFilter::MatchStartsWith);
+        filter.setValue(searchList);
+    }
+
+    mListModel->setFilter(filter);
+    mFilterChanged = true;
+
+    if (mListModel->rowCount() == 0)
+    {
+        document()->load( CNT_CONTACTLIST_XML, "find_empty" );
+    }
+    else
+    {
+        document()->load( CNT_CONTACTLIST_XML, "find_list" );
     }
     
     CNT_EXIT
@@ -515,12 +464,26 @@
     
     mHandledContactId = aContact.localId();
     
-    HbMessageBox::question(HbParameterLengthLimiter(hbTrId("txt_phob_info_delete_1")).arg(name), this, SLOT(handleDeleteContact(int)),
+    HbMessageBox::question(HbParameterLengthLimiter("txt_phob_info_delete_1").arg(name), this, SLOT(handleDeleteContact(int)),
             HbMessageBox::Delete | HbMessageBox::Cancel);
     
     CNT_EXIT
 }
 
+void CntNamesViewPrivate::handleDeleteContact( int aAction )
+{
+    CNT_ENTRY
+    
+    if (aAction == HbMessageBox::Delete)
+    {
+        mEngine->contactManager( SYMBIAN_BACKEND ).removeContact(mHandledContactId);
+    }
+    
+    mHandledContactId = 0;
+    
+    CNT_EXIT
+}
+
 void CntNamesViewPrivate::deleteMultipleContacts()
 {
     CNT_ENTRY
@@ -545,6 +508,26 @@
     CNT_EXIT
 }
 
+void CntNamesViewPrivate::showPreviousView()
+{
+    CNT_ENTRY
+    
+    mViewManager->back( CntViewParameters() );
+    
+    CNT_EXIT
+}
+
+void CntNamesViewPrivate::showCollectionView()
+{
+    CNT_ENTRY
+    
+    CntViewParameters args;
+    args.insert(EViewId, collectionView);
+    mViewManager->changeView(args);
+    
+    CNT_EXIT
+}
+
 void CntNamesViewPrivate::showContactView( const QModelIndex& aIndex )
 {
     CNT_ENTRY
@@ -574,29 +557,93 @@
     CNT_EXIT
 }
 
+void CntNamesViewPrivate::showContactEditorView(QContact& aContact)
+{
+    CNT_ENTRY
+    
+    CntViewParameters args;
+    args.insert(EViewId, editView);
+    
+    QVariant contact;
+    contact.setValue(aContact);
+    args.insert(ESelectedContact, contact);
+
+    mViewManager->changeView(args);
+    
+    CNT_EXIT
+}
+
+void CntNamesViewPrivate::showSettingsView()
+{
+    CNT_ENTRY
+    
+    CntViewParameters args;
+    args.insert( EViewId, settingsView );
+    mViewManager->changeView( args );
+    
+    CNT_EXIT
+}
+
+void CntNamesViewPrivate::showImportsView()
+{
+    CNT_ENTRY
+    
+    CntViewParameters args;        
+    args.insert(EViewId, importsView);
+    mViewManager->changeView(args);
+    
+    CNT_EXIT
+}
+
+void CntNamesViewPrivate::handleImportContacts( HbAction *aAction )
+{
+    CNT_ENTRY
+    
+    HbDialog *popup = static_cast<HbDialog*>(sender());
+    
+    if (popup && aAction == popup->actions().first())
+    {
+        showImportsView();
+    }
+          
+    CNT_EXIT
+}
+
+void CntNamesViewPrivate::setShowContextMenu( const QModelIndex& aIndex )
+{
+    CNT_ENTRY_ARGS(aIndex)
+    
+    QContactLocalId id = mListModel->contactId(aIndex);
+    
+    // if id is smaller than 1 (basically 0), it's the empty myCard
+    if (id < 1)
+    {
+        mListView->setLongPressEnabled(false);
+    }
+    else
+    {
+        mListView->setLongPressEnabled(true);
+    }
+    
+    CNT_EXIT
+}
+
 void CntNamesViewPrivate::showContextMenu(HbAbstractViewItem* aItem, QPointF aPoint)
 {
     CNT_ENTRY
     
     QContact contact = mListModel->contact(aItem->modelIndex());
     
-   // In case of an empty MyCard, do not show any ContextMenu
-    if (!(contact.localId() == mListModel->myCardId() && contact.details().count() <= 4))
+    if (mMenu) 
     {
-        if (mMenu) 
-        {
-            delete mMenu;
-            mMenu = NULL;
-        }
-        mMenu = mMenuBuilder->actionMenu( contact, mListModel->myCardId() );
-        mMenu->setPreferredPos( aPoint );
-        mMenu->open();
-    }
-    else
-    {
-        showContactView(contact);
+        delete mMenu;
+        mMenu = NULL;
     }
     
+    mMenu = mMenuBuilder->actionMenu( contact, mListModel->myCardId() );
+    mMenu->setPreferredPos( aPoint );
+    mMenu->open();
+
     CNT_EXIT
 }
 
@@ -620,69 +667,6 @@
     CNT_EXIT
 }
 
-void CntNamesViewPrivate::handleDeleteContact( int aAction )
-{
-    CNT_ENTRY
-    
-    if (aAction == HbMessageBox::Delete)
-    {
-        mEngine->contactManager( SYMBIAN_BACKEND ).removeContact(mHandledContactId);
-    }
-    
-    mHandledContactId = 0;
-    
-    CNT_EXIT
-}
-
-void CntNamesViewPrivate::showContactEditorView(QContact& aContact)
-{
-    CNT_ENTRY
-    
-    CntViewParameters args;
-    args.insert(EViewId, editView);
-    
-    QVariant contact;
-    contact.setValue(aContact);
-    args.insert(ESelectedContact, contact);
-
-    mViewManager->changeView(args);
-    
-    CNT_EXIT
-}
-
-void CntNamesViewPrivate::showCollectionView()
-{
-    CNT_ENTRY
-    
-    CntViewParameters args;
-    args.insert(EViewId, collectionView);
-    mViewManager->changeView(args);
-    
-    CNT_EXIT
-}
-
-void CntNamesViewPrivate::importSim()
-{
-    CNT_ENTRY
-    
-    CntViewParameters args;        
-    args.insert(EViewId, importsView);
-    mViewManager->changeView(args);
-    
-    CNT_EXIT
-}
-
-void CntNamesViewPrivate::showSettings()
-{
-    CNT_ENTRY
-    
-    CntViewParameters args;
-    args.insert( EViewId, settingsView );
-    mViewManager->changeView( args );
-    
-    CNT_EXIT
-}
-
 void CntNamesViewPrivate::handleContactAddition(const QList<QContactLocalId>& aAddedList)
 {
     CNT_ENTRY
@@ -721,6 +705,55 @@
     CNT_EXIT
 }
 
+bool CntNamesViewPrivate::isFinderVisible()
+{
+    CNT_ENTRY
+    
+    bool isVisible = false;
+    if ( mSearchPanel )
+    {
+        isVisible = mSearchPanel->isVisible();
+    }
+    
+    CNT_EXIT
+    return isVisible;
+}
+
+void CntNamesViewPrivate::changeDeleteActionStatus()
+{
+    CNT_ENTRY
+    
+    bool multipleContactsFound = mListModel->rowCount() >= CNT_MIN_ROW_COUNT;
+    mMultipleDeleter->setEnabled(multipleContactsFound);
+    
+    CNT_EXIT
+}
+
+void CntNamesViewPrivate::focusLineEdit()
+{
+    CNT_ENTRY
+    
+    HbLineEdit *editor = static_cast<HbLineEdit*>(mSearchPanel->primitive("lineedit"));
+    if (editor)
+    {
+        editor->setObjectName("focusLineEdit");
+        editor->setInputMethodHints(Qt::ImhNoPredictiveText);
+        editor->setText("");
+        editor->setFocus();
+        
+        // This opens the VKB
+        QInputContext *ic = qApp->inputContext();
+        if (ic)
+        {
+            QEvent *event = new QEvent(QEvent::RequestSoftwareInputPanel);
+            ic->filterEvent(event);
+            delete event;
+        }
+    }
+
+    CNT_EXIT
+}
+
 void CntNamesViewPrivate::setScrollPosition(int focusedContact)
 {
     CNT_ENTRY
@@ -734,26 +767,28 @@
     CNT_EXIT
 }
 
-//// lazy accessors
 HbListView* CntNamesViewPrivate::list()
 {
     CNT_ENTRY
 
     if (!mListView) {
         mListView = static_cast<HbListView*> (mLoader->findWidget("listView"));
+        
+        mListView->grabGesture(Qt::PinchGesture);
+        
+        CntNamesViewItem *item = new CntNamesViewItem();
+        mListView->setItemPrototype(item);
 
         mListView->setFrictionEnabled(true);
         mListView->setScrollingStyle(HbScrollArea::PanWithFollowOn);
-        mListView->listItemPrototype()->setGraphicsSize(HbListViewItem::Thumbnail);
-        mListView->listItemPrototype()->setStretchingStyle(HbListViewItem::StretchLandscape);
+        item->setGraphicsSize(HbListViewItem::Thumbnail);
+        item->setStretchingStyle(HbListViewItem::StretchLandscape);
         mListView->verticalScrollBar()->setInteractive(true);
         
         HbFrameBackground frame;
         frame.setFrameGraphicsName("qtg_fr_list_normal");
         frame.setFrameType(HbFrameDrawer::NinePieces);
-        
-        HbListViewItem* prototype = mListView->listItemPrototype();
-        prototype->setDefaultFrame( frame );
+        item->setDefaultFrame( frame );
         
         mListView->setUniformItemSizes(true);
         mListView->setItemRecycling(true);
@@ -761,6 +796,9 @@
         HbIndexFeedback *indexFeedback = new HbIndexFeedback(mView);
         indexFeedback->setIndexFeedbackPolicy(HbIndexFeedback::IndexFeedbackSingleCharacter);
         indexFeedback->setItemView(mListView);
+        
+        CntPinchGrabber *grabber = new CntPinchGrabber(mListView);
+        mListView->installEventFilter(grabber);
     }
     
     CNT_EXIT
@@ -779,5 +817,4 @@
     return mLoader;
 }
 
-
 // End of File
--- a/phonebookui/cntcommonui/views/cntnamesview_p.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/views/cntnamesview_p.h	Fri Oct 15 12:24:46 2010 +0300
@@ -15,8 +15,10 @@
 *
 */
 
-#ifndef CNTABSTRACTLISTVIEW_H_
-#define CNTABSTRACTLISTVIEW_H_
+#ifndef CNTNAMESVIEWPRIVATE_H
+#define CNTNAMESVIEWPRIVATE_H
+
+#include <QObject>
 
 #include "cntnamesview.h"
 #include "cntactionlauncher.h"
@@ -24,74 +26,86 @@
 
 #include <hbaction.h>
 #include <hbabstractviewitem.h>
-#include <QObject>
-
-#include <qcontact.h>
+#include <qtcontacts.h>
 #include <cntlistmodel.h>
 
 class HbView;
 class HbListView;
-class HbLabel;
 class HbDocumentLoader;
 class HbSearchPanel;
 class HbShrinkingVkbHost;
+class HbMenu;
 class CntExtensionManager;
 class CntFetchContacts;
-class HbMenu;
+
+QTM_USE_NAMESPACE
 
 class CntNamesViewPrivate : public QObject
 {
     Q_OBJECT
     Q_DECLARE_PUBLIC(CntNamesView)
+    friend class TestCntNamesView;
     
 public:
     CntNamesViewPrivate();
     virtual ~CntNamesViewPrivate();
+    
+public:
+    void activate( const CntViewParameters aArgs );
+    void deactivate();
+    void setEngine( CntAbstractEngine& aEngine ){ mEngine = &aEngine; }
+    QString externalize(QDataStream &stream);
+    bool internalize(QDataStream &stream, CntViewParameters &viewParameters);
 
-public slots:    
+public slots:
+    // Search functions
     void showFinder();
     void hideFinder();
     void setFilter(const QString &filterString);
     
+    // Extension action (activity stream toolbar button)
     void handleExtensionAction();
     
+    // New contact creation
     void createNewContact();
+    
+    // Single and multiple contact deletion
     void deleteContact( QContact& aContact );
+    void handleDeleteContact( int aAction );
     void deleteMultipleContacts();
-    
     void handleDeleteMultipleContacts( QSet<QContactLocalId> aIds );
 
+    // View switches
     void showPreviousView();
     void showCollectionView();
+    void showContactView( const QModelIndex& aIndex );
     void showContactView( QContact& aContact );
-    void showContactView( const QModelIndex& );
     void showContactEditorView( QContact& aContact );
-    void showContextMenu(HbAbstractViewItem* aItem, QPointF aPoint);
-    void showSettings();
+    void showSettingsView();
+    void showImportsView();
     
+    // FTU import dialog
+    void handleImportContacts( HbAction *aAction );
+    
+    // Context menu actions
+    void setShowContextMenu( const QModelIndex& aIndex );
+    void showContextMenu(HbAbstractViewItem* aItem, QPointF aPoint); 
     void executeAction( QContact& aContact, QContactDetail aDetail, QString aAction );
     void actionExecuted( CntActionLauncher* aAction );
-    void handleDeleteContact( int aAction );
-    void importSim();
     
+    // Contact database notifications
     void handleContactAddition(const QList<QContactLocalId> & aAddedList);
     void handleContactRemoval(const QList<QContactLocalId> & aRemovedList);
     void handleSelfContactIdChange(const QContactLocalId & aOldId, const QContactLocalId & aNewId);
     
-private slots:
-    void switchOrientation();
-    void handleImportContacts( HbAction *aAction );
-    
 public:
     bool isFinderVisible();
-    void activate( const CntViewParameters aArgs );
-    void deactivate();
-    void setEngine( CntAbstractEngine& aEngine ){ mEngine = &aEngine; }
+
 private:
     void changeDeleteActionStatus();
     void focusLineEdit();
     void setScrollPosition(int focusedContact);
-    
+
 public:
     CntNamesView *q_ptr;
     
@@ -99,27 +113,28 @@
     HbListView *list();
     HbDocumentLoader *document();
     
+   
 private:
-    CntAbstractViewManager*     mViewManager;
-    CntListModel*               mListModel;
-    HbView*                     mView;
-    HbListView*                 mListView;
-    HbLabel*                    mEmptyList;
-    HbSearchPanel*              mSearchPanel;
-    HbDocumentLoader*           mLoader;
-    HbShrinkingVkbHost*         mVirtualKeyboard;
-    HbAction*                   mSoftkey;
-    HbAction*                   mNamesAction;
-    CntActionMenuBuilder*       mMenuBuilder;
-    HbAction*                   mImportSim;
-    HbAction*                   mNewContact;
-    QContactLocalId             mHandledContactId;
-    HbAction*                   mMultipleDeleter;
-    QActionGroup*               mActionGroup;
-	HbMenu*                     mMenu;
-	bool                        mFilterChanged;
-	CntAbstractEngine*          mEngine;
-	static bool                 mIsFirstTimeUse; // FTU flag
+    friend class T_NameListTest;
+    CntAbstractViewManager  *mViewManager;
+    CntListModel            *mListModel;
+    HbView                  *mView;
+    HbListView              *mListView;
+    HbSearchPanel           *mSearchPanel;
+    HbDocumentLoader        *mLoader;
+    HbShrinkingVkbHost      *mVirtualKeyboard;
+    HbAction                *mSoftkey;
+    HbAction                *mNamesAction;
+    HbAction                *mMultipleDeleter;
+    CntActionMenuBuilder    *mMenuBuilder;
+    QActionGroup            *mActionGroup;
+    HbMenu                  *mMenu;
+    HbMenu                  *mViewMenu;
+    CntAbstractEngine       *mEngine;
+    QContactLocalId          mHandledContactId;
+    bool                     mFilterChanged;
+
+    static bool              mIsFirstTimeUse; // FTU flag
 };
 
-#endif /* CNTABSTRACTLISTVIEW_H_ */
+#endif /* CNTNAMESVIEWPRIVATE_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/views/cntnamesviewitem.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,72 @@
+/*
+* 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 "cntnamesviewitem.h"
+#include "cntdebug.h"
+
+#include <hbeffect.h>
+#include <QTimer>
+
+/*!
+Constructor, initialize member variables.
+*/
+CntNamesViewItem::CntNamesViewItem(QGraphicsItem* parent) :
+    HbListViewItem(parent)
+{
+    CNT_ENTRY
+    
+    setProperty("animationState", CNT_NAME_LIST_LAYOUT_PROPERTY_NORMAL);
+    HbEffect::add("nameslistitem", ":/effects/item_change_layout.fxml", "changed");
+    
+    CNT_EXIT
+}
+
+
+/*!
+Factory method to the items
+*/
+HbAbstractViewItem* CntNamesViewItem::createItem()
+{
+    return new CntNamesViewItem(*this);
+}
+
+/*!
+Update the custom and standard parameters of this item identified by modelindex
+*/
+void CntNamesViewItem::updateChildItems()
+{
+    CNT_ENTRY
+    
+    if (prototype()->property("animationState") == CNT_NAME_LIST_LAYOUT_PROPERTY_ANIMATE)
+    {
+        HbEffect::start(this, "nameslistitem", "changed");
+        QTimer::singleShot(CNT_NAME_LIST_LAYOUT_CHANGED_TIMEOUT, this, SLOT(doUpdateChildItems()));
+    }
+    else
+    {
+        HbListViewItem::updateChildItems();
+    }
+
+    CNT_EXIT
+}
+
+void CntNamesViewItem::doUpdateChildItems()
+{
+    HbListViewItem::updateChildItems();
+}
+
+// EOF
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/views/cntnamesviewitem.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,44 @@
+/*
+* 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:
+*
+*/
+
+#ifndef CNTNAMESVIEWITEM_H
+#define CNTNAMESVIEWITEM_H
+
+#include <hblistviewitem.h>
+
+const int CNT_NAME_LIST_LAYOUT_CHANGED_TIMEOUT = 200;
+const qreal CNT_NAME_LIST_LAYOUT_CHANGE_PINCH_IN_TRESHOLD = 0.6;
+const qreal CNT_NAME_LIST_LAYOUT_CHANGE_PINCH_OUT_TRESHOLD = 1.4;
+const QString CNT_NAME_LIST_LAYOUT_PROPERTY_ANIMATE = "animate";
+const QString CNT_NAME_LIST_LAYOUT_PROPERTY_NORMAL = "normal";
+
+class CntNamesViewItem : public HbListViewItem
+{
+    friend class TestCntNamesView;
+    Q_OBJECT
+    
+public:
+    CntNamesViewItem(QGraphicsItem* parent = NULL);
+
+    HbAbstractViewItem* createItem();
+    void updateChildItems();
+    
+private slots:
+    void doUpdateChildItems();
+};
+
+#endif /* CNTNAMESVIEWITEM_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/views/cntpinchgrabber.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,111 @@
+/*
+* 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 "cntpinchgrabber.h"
+#include "cntnamesviewitem.h"
+
+#include <cntuids.h>
+#include <hbpinchgesture.h>
+#include <hblistview.h>
+#include <xqsettingskey.h>
+#include <QGestureEvent>
+#include <QTimer>
+
+CntPinchGrabber::CntPinchGrabber(HbListView *parent) :
+    QObject(parent),
+    mSettingsKey(NULL),
+    mListView(parent),
+    mCurrentSetting(-1),
+    mUpdated(false)
+{
+    mSettingsKey = new XQSettingsKey(XQSettingsKey::TargetCentralRepository,
+                            KCRCntSettings.iUid,
+                            KCntNameListRowSetting);
+}
+
+CntPinchGrabber::~CntPinchGrabber()
+{
+    delete mSettingsKey;
+}
+
+bool CntPinchGrabber::eventFilter(QObject *obj, QEvent *event)
+{
+    Q_UNUSED(obj)
+    
+    if (event->type() == QEvent::TouchBegin)
+    {
+        event->accept();
+        return true;
+    }
+
+    if (event->type() == QEvent::Gesture)
+    {
+        QGestureEvent *ge = static_cast<QGestureEvent*>(event);
+        
+        if (HbPinchGesture *pinch = qobject_cast<HbPinchGesture *>(ge->gesture(Qt::PinchGesture)))
+        {
+            QPinchGesture::ChangeFlags changeFlags = pinch->changeFlags();
+            
+            switch (pinch->state())
+            {
+            case Qt::GestureStarted:
+                ge->accept(pinch);
+                mCurrentSetting = mSettings.readItemValue(*mSettingsKey, XQSettingsManager::TypeInt).toInt();
+                mUpdated = false;
+                break;
+            case Qt::GestureUpdated:
+                if (changeFlags & QPinchGesture::ScaleFactorChanged && !mUpdated)
+                {
+                    if (pinch->scaleFactor() < CNT_NAME_LIST_LAYOUT_CHANGE_PINCH_IN_TRESHOLD && mCurrentSetting != CntOneRowNameOnly)
+                    {
+                        mSettings.writeItemValue(*mSettingsKey, QVariant(CntOneRowNameOnly));
+                        mUpdated = true;
+                        mListView->listItemPrototype()->setProperty("animationState", CNT_NAME_LIST_LAYOUT_PROPERTY_ANIMATE);
+                    }
+                    else if (pinch->scaleFactor() > CNT_NAME_LIST_LAYOUT_CHANGE_PINCH_OUT_TRESHOLD && mCurrentSetting != CntTwoRowsNameAndPhoneNumber)
+                    {
+                        mSettings.writeItemValue(*mSettingsKey, QVariant(CntTwoRowsNameAndPhoneNumber));
+                        mUpdated = true;
+                        mListView->listItemPrototype()->setProperty("animationState", CNT_NAME_LIST_LAYOUT_PROPERTY_ANIMATE);
+                    }
+                }
+                break;
+            case Qt::GestureFinished:
+            case Qt::GestureCanceled:
+            default:
+                mCurrentSetting = -1;
+                if (mUpdated)
+                {
+                    mListView->ungrabGesture(Qt::PinchGesture);
+                    QTimer::singleShot(CNT_NAME_LIST_LAYOUT_CHANGED_TIMEOUT, this, SLOT(timerTimeout()));
+                }
+                break;
+            }
+            
+            return true;
+        }
+    }
+    
+    return false;
+}
+
+void CntPinchGrabber::timerTimeout()
+{
+    mListView->listItemPrototype()->setProperty("animationState", CNT_NAME_LIST_LAYOUT_PROPERTY_NORMAL);
+    mListView->grabGesture(Qt::PinchGesture);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntcommonui/views/cntpinchgrabber.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,51 @@
+/*
+* 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:
+*
+*/
+
+#ifndef CNTPINCHGRABBER_H
+#define CNTPINCHGRABBER_H
+
+#include <QObject>
+
+#include <xqsettingsmanager.h>
+
+class XQSettingsKey;
+class HbListView;
+
+class CntPinchGrabber : public QObject
+{
+    friend class TestCntPinchGrabber;
+    Q_OBJECT
+
+public:
+    CntPinchGrabber(HbListView *parent = 0);
+    ~CntPinchGrabber();
+
+protected:
+    bool eventFilter(QObject *obj, QEvent *event);
+    
+private slots:
+    void timerTimeout();
+    
+private:
+    XQSettingsManager   mSettings;
+    XQSettingsKey*      mSettingsKey;
+    HbListView*         mListView;
+    int                 mCurrentSetting;
+    bool                mUpdated;
+};
+
+#endif /* CNTPINCHGRABBER_H */
--- a/phonebookui/cntcommonui/views/cntsettingsmodel.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/views/cntsettingsmodel.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -16,15 +16,21 @@
 */
 
 #include "cntsettingsmodel.h"
-#include <cntuids.h>
-#include <qstringlist.h>
-#include <xqsettingskey.h>
+
 #include "cntdebug.h"
 
+#include <cntuids.h>
+#include <xqsettingskey.h>
+
+#include <QStringList>
+
+/*!
+Constructor
+*/
 CntSettingsModel::CntSettingsModel() :
-HbDataFormModel(),
-mNameOrderkey(NULL),
-mNameListRowSettingkey(NULL)
+    HbDataFormModel(),
+    mNameOrderkey(NULL),
+    mNameListRowSettingkey(NULL)
 {
     // Create name ordering setting item
     createNameOrderSettingsItem();
@@ -35,6 +41,18 @@
     connect(this, SIGNAL(dataChanged(QModelIndex , QModelIndex)), this, SLOT(handleDataChanged(QModelIndex , QModelIndex)));
 }
 
+/*!
+Destructor
+*/
+CntSettingsModel::~CntSettingsModel()
+{
+    delete mNameOrderkey;
+    delete mNameListRowSettingkey;
+}
+
+/*!
+Creates the name order settings item
+*/
 void CntSettingsModel::createNameOrderSettingsItem()
 {
     HbDataFormModelItem* ord = new HbDataFormModelItem(HbDataFormModelItem::ComboBoxItem, hbTrId(
@@ -62,6 +80,9 @@
     }
 }
 
+/*!
+Creates the names list row settings item
+*/
 void CntSettingsModel::createNamesListRowSettingItem()
 {
     HbDataFormModelItem* rowSetting = new HbDataFormModelItem(HbDataFormModelItem::ComboBoxItem, hbTrId(
@@ -86,12 +107,9 @@
     }
 }
 
-CntSettingsModel::~CntSettingsModel()
-{
-    delete mNameOrderkey;
-    delete mNameListRowSettingkey;
-}
-
+/*!
+Handles data changes from settings items
+*/
 void CntSettingsModel::handleDataChanged(QModelIndex topLeft, QModelIndex bottomRight)
 {
     Q_UNUSED(bottomRight)
@@ -105,9 +123,8 @@
             written = mSettings.writeItemValue(*mNameOrderkey, QVariant(CntOrderLastCommaFirst));
         } else if (selected == 2) {
             written = mSettings.writeItemValue(*mNameOrderkey, QVariant(CntOrderFirstLast));
-        }
-        if (!written) {
-            CNT_LOG_ARGS(QString("failed writting cenrep key"))
+        } else {
+            written = false;
         }
     }
     else if (topLeft.row() == 1) {
@@ -116,9 +133,12 @@
             written = mSettings.writeItemValue(*mNameListRowSettingkey, QVariant(CntOneRowNameOnly));
         } else if (selected == 1) {
             written = mSettings.writeItemValue(*mNameListRowSettingkey, QVariant(CntTwoRowsNameAndPhoneNumber));
-        }
-        if (!written) {
-            CNT_LOG_ARGS(QString("failed writting cenrep key"))
+        } else {
+            written = false;
         }
     }
+    
+    if (!written) {
+        CNT_LOG_ARGS(QString("failed writting cenrep key"))
+    }
 }
--- a/phonebookui/cntcommonui/views/cntsettingsmodel.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/views/cntsettingsmodel.h	Fri Oct 15 12:24:46 2010 +0300
@@ -30,6 +30,7 @@
 class CntSettingsModel : public HbDataFormModel
 {
     Q_OBJECT
+    friend class TestCntSettingsModel;
     
 public:
     CntSettingsModel();
@@ -43,9 +44,9 @@
     void handleDataChanged(QModelIndex topLeft, QModelIndex bottomRight);
     
 private:
-    XQSettingsManager mSettings;
-    XQSettingsKey *mNameOrderkey;
-    XQSettingsKey *mNameListRowSettingkey;
+    XQSettingsManager  mSettings;
+    XQSettingsKey     *mNameOrderkey;
+    XQSettingsKey     *mNameListRowSettingkey;
 };
 
-#endif
+#endif /* CNTSETTINGSMODEL_H */
--- a/phonebookui/cntcommonui/views/cntsettingsview.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/views/cntsettingsview.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -15,28 +15,34 @@
 *
 */
 
+#include "cntsettingsview.h"
+#include "cntsettingsmodel.h"
+#include "cntdebug.h"
+
 #include <hbdocumentloader.h>
 #include <hbview.h>
 #include <hbdataform.h>
 #include <hbaction.h>
-#include "cntdebug.h"
-#include "cntsettingsview.h"
-#include "cntsettingsmodel.h"
 
 const char *CNT_SETTINGS_XML = ":/xml/contacts_settings.docml";
 
-CntSettingsView::CntSettingsView() : QObject(),
-mView( NULL ),
-mDoc( NULL ),
-mForm( NULL ),
-mViewMgr( NULL ),
-mModel( NULL )
+/*!
+Constructor
+*/
+CntSettingsView::CntSettingsView() :
+    QObject(),
+    mView( NULL ),
+    mDoc( NULL ),
+    mForm( NULL ),
+    mViewMgr( NULL ),
+    mModel( NULL )
 {
     CNT_ENTRY
     
     bool ok;
     document()->load(CNT_SETTINGS_XML, &ok);
-    if (!ok) {
+    if (!ok)
+    {
         qFatal("Unable to read %S", CNT_SETTINGS_XML);
     }
     
@@ -48,11 +54,14 @@
     mForm->setModel( mModel );
     
     mBack = new HbAction(Hb::BackNaviAction, mView);
-    connect( mBack, SIGNAL(triggered()), this, SLOT(back()) );
+    connect( mBack, SIGNAL(triggered()), this, SLOT(showPreviousView()) );
     
     CNT_EXIT
 }
 
+/*!
+Destructor
+*/
 CntSettingsView::~CntSettingsView()
 {
     CNT_ENTRY
@@ -65,6 +74,9 @@
     CNT_EXIT
 }
 
+/*!
+Called when view is activated
+*/
 void CntSettingsView::activate( const CntViewParameters aArgs )
 {
     CNT_ENTRY
@@ -72,7 +84,8 @@
     mArgs = aArgs;
     mViewMgr = &mEngine->viewManager();
         
-    if ( mView->navigationAction() != mBack) {
+    if ( mView->navigationAction() != mBack)
+    {
         mView->setNavigationAction(mBack);
     }
     
@@ -83,22 +96,10 @@
 {
 }
 
-bool CntSettingsView::isDefault() const
-{
-    return false;
-}
-
-HbView* CntSettingsView::view() const
-{
-    return mView;
-}
-
-int CntSettingsView::viewId() const
-{
-    return settingsView;
-}
-
-void CntSettingsView::back()
+/*!
+Called when user presses back
+*/
+void CntSettingsView::showPreviousView()
 {
     CNT_ENTRY
     
@@ -106,6 +107,10 @@
     
     CNT_EXIT
 }
+
+/*!
+Returns the HbDocumentLoader pointer
+*/
 HbDocumentLoader* CntSettingsView::document() 
 {
     CNT_ENTRY
--- a/phonebookui/cntcommonui/views/cntsettingsview.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/views/cntsettingsview.h	Fri Oct 15 12:24:46 2010 +0300
@@ -14,8 +14,9 @@
 * Description:  
 *
 */
-#ifndef _CNTSETTINGSVIEW_H__
-#define _CNTSETTINGSVIEW_H__
+
+#ifndef CNTSETTINGSVIEW_H
+#define CNTSETTINGSVIEW_H
 
 #include <cntabstractview.h>
 #include <QObject>
@@ -32,6 +33,7 @@
 class CntSettingsView : public QObject, public CntAbstractView
 {
     Q_OBJECT
+    friend class TestCntSettingsView;
     
 public:
     CntSettingsView();
@@ -40,29 +42,27 @@
 protected: // From CntAbstractView
     void activate( const CntViewParameters aArgs );
     void deactivate();
-    bool isDefault() const;
-    HbView* view() const;
-    int viewId() const;
+    bool isDefault() const { return false; }
+    HbView* view() const { return mView; }
+    int viewId() const { return settingsView; }
     inline void setEngine( CntAbstractEngine& aEngine ){ mEngine = &aEngine; }
     
 private slots:
-    void back();
+    void showPreviousView();
     
 private:
     HbDocumentLoader* document();
     
 private:
-    HbView* mView;
-    HbDocumentLoader* mDoc;
-    HbDataForm* mForm;
-    HbAction* mBack;
-    
-    CntAbstractViewManager* mViewMgr;
-    CntViewParameters mArgs;
-    
-    CntSettingsModel* mModel;
-    CntAbstractEngine* mEngine;
-    friend class TestCntSettings;
+    HbView                  *mView;
+    HbDocumentLoader        *mDoc;
+    HbDataForm              *mForm;
+    HbAction                *mBack;
+    CntAbstractViewManager  *mViewMgr;
+    CntViewParameters        mArgs;
+    CntSettingsModel        *mModel;
+    CntAbstractEngine       *mEngine;
+
 };
-#endif
 
+#endif /* CNTSETTINGSVIEW_H */
--- a/phonebookui/cntcommonui/widgets/cntactionpopup.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/widgets/cntactionpopup.h	Fri Oct 15 12:24:46 2010 +0300
@@ -56,6 +56,8 @@
     CntActionPopupPrivate* const d_ptr;
     Q_DECLARE_PRIVATE_D(d_ptr, CntActionPopup)
     Q_DISABLE_COPY(CntActionPopup)    
+    
+    friend class TestCntActionPopup;
 };
 
 #endif // CNTACTIONPOPUP_H
--- a/phonebookui/cntcommonui/widgets/cntactionpopup_p.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/widgets/cntactionpopup_p.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -24,10 +24,6 @@
 #include <hblistview.h>
 #include <hblistviewitem.h>
 #include <QStandardItemModel>
-#include <hblabel.h>
-//#include <QtAlgorithms.h>
-
-
 
 CntActionPopupPrivate::CntActionPopupPrivate( QContact* aContact, QGraphicsItem *parent ) :
 HbSelectionDialog(parent),
@@ -194,16 +190,15 @@
     mListView->setScrollingStyle(HbScrollArea::PanWithFollowOn);
     mListView->setFrictionEnabled(true);
     mListView->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Maximum );
+    mListView->setLongPressEnabled(false);//This is to make longpress act like shortpress when no tap menu
     
     QString contactName = mContact->displayLabel();
     if (contactName.isEmpty())
     {
         contactName = hbTrId("txt_phob_list_unnamed");
     }
-    HbLabel *label = new HbLabel();
-    label->setPlainText(contactName);
     
-    setHeadingWidget(label);
+    setHeadingText(contactName);
     setContentWidget(mListView);
     
     mCancelAction = new HbAction(hbTrId("txt_common_button_cancel"), this);
@@ -212,10 +207,8 @@
     setDismissPolicy(HbDialog::NoDismiss);
     setModal(true);
     
-    connect(mListView, SIGNAL(activated(const QModelIndex&)), this, SLOT(listItemSelected(QModelIndex)));
-    connect(mListView, SIGNAL(longPressed(HbAbstractViewItem*,const QPointF&)), 
-            this, SLOT(onLongPressed(HbAbstractViewItem*,const QPointF&)) );
-      
+    connect(mListView, SIGNAL(activated (const QModelIndex &)), 
+            this, SLOT(listItemSelected(QModelIndex)) );
     
     //launch dialog asyncronously
     open(this, SLOT(handleUserResponse(HbAction*)));
@@ -232,13 +225,6 @@
     
 }
 
-void CntActionPopupPrivate::onLongPressed(HbAbstractViewItem *item, const QPointF &coords)
-{
-    Q_UNUSED(coords);
-    QModelIndex index = item->modelIndex();
-    listItemSelected(index);
-}
-
 void CntActionPopupPrivate::listItemSelected( QModelIndex index )
 {   
     if (index.isValid())
--- a/phonebookui/cntcommonui/widgets/cntactionpopup_p.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/widgets/cntactionpopup_p.h	Fri Oct 15 12:24:46 2010 +0300
@@ -81,7 +81,6 @@
 
     void listItemSelected( QModelIndex index );
     void handleUserResponse(HbAction* action);
-    void onLongPressed (HbAbstractViewItem *item, const QPointF &coords);
     
 private:
 
@@ -110,6 +109,6 @@
     QList<QStandardItem*>  mDataItemList;
     HbAction *mCancelAction;
     
-    friend class T_CntActionPopupTest;
+    friend class TestCntActionPopup;
     };
 #endif /* CNTACTIONPOPUP_P_H_ */
--- a/phonebookui/cntcommonui/widgets/cntfetchcontactpopup.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/widgets/cntfetchcontactpopup.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -161,22 +161,32 @@
     HbListViewItem* prototype = mListView->listItemPrototype();
     prototype->setTextFormat( Qt::RichText );
     
-    qreal margin;
+    qreal screenMargin, popupMargin;
     HbStyle style;
-    style.parameter("hb-param-margin-gene-popup", margin);
+    style.parameter("hb-param-margin-gene-screen", screenMargin);
+    style.parameter("hb-param-margin-gene-popup", popupMargin);
+    
+    // screenMargin is the margin between the popup's top edge and the screen's top edge
+    qreal height = mVirtualKeyboard->activeViewRect().height() - 
+            mSearch->size().height() -
+            screenMargin;
 
-    if (mPopup->mainWindow()->orientation() == Qt::Horizontal)
-        margin /= 2;
-    
-    qreal height = mPopup->size().height() - 
-            mVirtualKeyboard->keyboardArea().height() - 
-            mSearch->size().height() +
-            margin;
-    
     // in single selection we don't have the "mark all" option
     if ( mMarkAll->isVisible() )
     {
-        height = height - mMarkAll->size().height();
+        height -= mMarkAll->size().height();
+    }
+    
+    // in landscape the headingwidget is not visible
+    if ( mPopup->headingWidget() != NULL )
+    {
+        // 3 popup margin -> on top and below heading widget and between content and heading
+        height -= (mPopup->headingWidget()->size().height() + 3*popupMargin);
+    }
+    else
+    {
+        // 1 popup margin -> between content and "edge" of the popup
+        height -= popupMargin;
     }
 
     mEmptyView->setMaximumHeight( height );
@@ -412,6 +422,11 @@
         {
             mPopup->setHeadingWidget( NULL );
             mDoc->load( CNT_FETCHLIST_XML, "find_list_landscape");
+            
+            //TODO: Remove when Wk40 is released
+            qreal popupWidth = mPopup->mainWindow()->layoutRect().width();
+            mPopup->setMinimumWidth(popupWidth);
+            
         }
         else
         {
@@ -434,6 +449,9 @@
         {
             mPopup->setHeadingWidget( NULL );
             mDoc->load( CNT_FETCHLIST_XML, "find_empty_landscape" );
+            //TODO: Remove when Wk40 is released
+            qreal popupWidth = mPopup->mainWindow()->layoutRect().width();
+            mPopup->setMinimumWidth(popupWidth);
         }
         else
         {
--- a/phonebookui/cntcommonui/widgets/cntfetchcontactpopup.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/widgets/cntfetchcontactpopup.h	Fri Oct 15 12:24:46 2010 +0300
@@ -101,6 +101,8 @@
     CntDocumentLoader* mDoc; // own
     QString mTitle;
     QList<QContactLocalId> mIds;
+    
+    friend class TestCntFetchUtility;
 };
 
 #endif /* CNTFETCHCONTACTPOPUP_H_ */
--- a/phonebookui/cntcommonui/widgets/cntfetchselectionitems.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-/*
-* 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 "cntfetchselectionitems.h"
-
-#include <QGraphicsLinearLayout>
-
-#include <hbcheckbox.h>
-#include <hblabel.h>
-
-
-CntFetchSelectionItems::CntFetchSelectionItems(QGraphicsItem *aParent)
-: HbWidget(aParent),
-  mCheckBox(NULL),
-  mCounterLabel(NULL),
-  mLayout(NULL)
-{
-    if (!mLayout) {
-        mLayout = new QGraphicsLinearLayout(Qt::Horizontal);
-    }
-
-    if (!mCheckBox) {
-        mCheckBox = new HbCheckBox(hbTrId("txt_common_list_mark_all_items"));
-        connect(mCheckBox, SIGNAL(stateChanged(int)), this, SLOT(handleStateChange(int)), Qt::UniqueConnection);
-        mLayout->addItem(mCheckBox);
-    }
-
-    if (!mCounterLabel) {
-        mCounterLabel = new HbLabel();
-        mLayout->addItem(mCounterLabel);
-    }
-    
-    setLayout(mLayout);
-}
-
-CntFetchSelectionItems::~CntFetchSelectionItems()
-{
-}
-
-HbLabel* CntFetchSelectionItems::counter() const
-{
-    return mCounterLabel;   
-}
-
-void CntFetchSelectionItems::handleStateChange(int aState)
-{
-    emit passStateChanged(aState);
-}
-
-// EOF
--- a/phonebookui/cntcommonui/widgets/cntfetchselectionitems.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-/*
-* 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:
-*
-*/
-
-#ifndef CNTFETCHSELECTIONITEM_H
-#define CNTFETCHSELECTIONITEM_H
-
-#include <QObject>
-#include <hbwidget.h>
-
-class QGraphicsLinearLayout;
-class HbCheckBox;
-class HbLabel;
-
-/**
- * Custom widget class for use with a HbPopup. 
- * This adds a "Mark All" checkbox and a selection counter.
- */
-class CntFetchSelectionItems : public HbWidget
-{
-    Q_OBJECT
-    
-public:
-    CntFetchSelectionItems(QGraphicsItem *aParent = 0);
-    ~CntFetchSelectionItems();
-    
-    HbLabel* counter() const;
-    
-signals:
-    void passStateChanged(int aState);
-    
-public slots:
-    void handleStateChange(int aState);
-
-private:    
-    friend class TestCntFetchSelectionItems;
-    
-    HbCheckBox*             mCheckBox;
-    HbLabel*                mCounterLabel;
-    QGraphicsLinearLayout*  mLayout; // Ownership transferred to this class
-};
-
-#endif // CNTFETCHSELECTIONITEM_H
--- a/phonebookui/cntcommonui/widgets/cntimagelabel.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cntcommonui/widgets/cntimagelabel.h	Fri Oct 15 12:24:46 2010 +0300
@@ -53,6 +53,9 @@
     HbIconItem*  mDefaultAvatar;
     HbIcon       mIcon;
     QPixmap      mPixmap;
+#ifdef PBK_UNIT_TEST
+    friend class TestCntImageLabel;
+#endif
     
 };
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cnthistorymodel/cnthistorymodel.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,188 @@
+/*
+* 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 "cnthistorymodel_p.h"
+#include "cnthistorymodel.h"
+#include "cntdebug.h"
+
+/*!
+ * Construct a new CntHistoryModel object to communicate 
+ * with the conversations and logs databases.
+ *
+ * \param contactId History specific to this contact is cached. 
+ * If no contact is specified all the call logs and conversation 
+ * history from all contacts will be cached.
+ */
+CntHistoryModel::CntHistoryModel(QContactLocalId contactId,
+                                 QContactManager* manager,
+                                 QObject *parent)
+    : QAbstractListModel(parent),
+      d_ptr(new CntHistoryModelPrivate(contactId, manager))
+{
+    CNT_ENTRY
+    
+    Q_D(CntHistoryModel);
+    d->q_ptr = this;
+    
+    CNT_EXIT
+}
+
+CntHistoryModel::~CntHistoryModel()
+{
+    CNT_ENTRY
+    
+    Q_D(CntHistoryModel);
+    delete d;
+    
+    CNT_EXIT
+}
+
+/*!
+ * Return the data to be used by the view or delegates for a particular
+ * item and role.
+ *
+ * \param index The index of the item to return data about.
+ * \param role The data should be relevant to this particular purpose.
+ * \return QVariant The data for the specified index and role.
+ */
+QVariant CntHistoryModel::data(const QModelIndex& index, int role) const
+{
+    Q_D(const CntHistoryModel);
+    return d->data(index, role);
+}
+
+/*!
+ * Get the number of rows (conversations) in this model.
+ *
+ * \param parent Optional parent index value.
+ * \return Number of rows in this model.
+ */
+int CntHistoryModel::rowCount(const QModelIndex& parent) const
+{
+    Q_D(const CntHistoryModel);
+    return d->rowCount(parent);
+}
+
+/*!
+ * Clear history from the database. If the history cached
+ * is specific to one contact, only that history is cleared.
+ * 
+ */
+void CntHistoryModel::clearHistory()
+{
+    CNT_ENTRY
+    
+    Q_D(CntHistoryModel);
+    d->clearHistory();
+    
+    CNT_EXIT
+}
+
+/*!
+ * Mark all the conversations in the view as seen.
+ * 
+ */
+void CntHistoryModel::markAllAsSeen()
+{
+    CNT_ENTRY
+    
+    Q_D(CntHistoryModel);
+    d->markAllAsSeen();
+    
+    CNT_EXIT
+}
+
+/*!
+ * Sort items in the model and refresh the view
+ *
+ * \param order Order to sort the list items.
+ */
+void CntHistoryModel::sortAndRefresh(Qt::SortOrder order)
+{
+    CNT_ENTRY_ARGS(order)
+    
+    Q_D(CntHistoryModel);
+    
+    doBeginResetModel();
+    d->sort(order);
+    doEndResetModel();
+    
+    CNT_EXIT
+}
+
+void CntHistoryModel::doBeginInsertRows(const QModelIndex &parent, int first, int last)
+{
+    CNT_ENTRY_ARGS(parent << first << last)
+    
+    beginInsertRows(parent, first, last);
+    
+    CNT_EXIT
+}
+
+void CntHistoryModel::doEndInsertRows()
+{
+    CNT_ENTRY
+    
+    endInsertRows();
+    
+    CNT_EXIT
+}
+
+void CntHistoryModel::doBeginRemoveRows(const QModelIndex &parent, int first, int last)
+{
+    CNT_ENTRY_ARGS(parent << first << last)
+    
+    beginRemoveRows(parent, first, last);
+    
+    CNT_EXIT
+}
+
+void CntHistoryModel::doEndRemoveRows()
+{
+    CNT_ENTRY
+    
+    endRemoveRows();
+    
+    CNT_EXIT
+}
+
+void CntHistoryModel::doBeginResetModel()
+{
+    CNT_ENTRY
+    
+    beginResetModel();
+    
+    CNT_EXIT
+}
+
+void CntHistoryModel::doEndResetModel()
+{
+    CNT_ENTRY
+    
+    endResetModel();
+    
+    CNT_EXIT
+}
+
+void CntHistoryModel::doDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
+{
+    CNT_ENTRY_ARGS(topLeft << bottomRight)
+    
+    emit dataChanged(topLeft, bottomRight);
+    
+    CNT_EXIT
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cnthistorymodel/cnthistorymodel.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,82 @@
+/*
+* 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:
+*
+*/
+#ifndef CNTHISTORYMODEL_H
+#define CNTHISTORYMODEL_H
+
+#include <QAbstractListModel>
+#include <QSharedData>
+#include <qmobilityglobal.h>
+#include <qcontactid.h>
+
+#include "cnthistorymodelconsts.h"
+#include "cnthistorymodelglobal.h"
+
+QTM_BEGIN_NAMESPACE
+class QContactManager;
+QTM_END_NAMESPACE
+
+QTM_USE_NAMESPACE
+
+class CntHistoryModelPrivate;
+
+/*!
+ * CntHistoryModel is a model used to fetch conversation history
+ * (SMS & call logs) from databases. It will 
+ * cache content from the databases to be displayed on the screen
+ * by the conversation view.
+ * 
+ * Note that that this is a prototype implementation and does
+ * not yet support more advanced features.
+ */
+class CNTHISTORYMODEL_EXPORT CntHistoryModel : public QAbstractListModel
+{    
+    Q_OBJECT
+    
+public:
+    CntHistoryModel(QContactLocalId contactId,
+                    QContactManager* manager,
+                    QObject *parent = 0);
+    ~CntHistoryModel();
+    
+public: // from QAbstractTableModel/QAbstractItemModel
+    QVariant data(const QModelIndex& index, int role) const;
+    int rowCount(const QModelIndex& parent = QModelIndex()) const;
+
+public:
+    void clearHistory();
+    void markAllAsSeen();
+    void sortAndRefresh(Qt::SortOrder order = Qt::AscendingOrder);
+
+private:
+    void doBeginInsertRows(const QModelIndex &parent, int first, int last);
+    void doEndInsertRows();
+    void doBeginRemoveRows(const QModelIndex &parent, int first, int last);
+    void doEndRemoveRows();
+    void doBeginResetModel();
+    void doEndResetModel();
+    void doDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);
+    
+private:
+	CntHistoryModelPrivate* const d_ptr;
+    Q_DECLARE_PRIVATE_D(d_ptr, CntHistoryModel)
+    Q_DISABLE_COPY(CntHistoryModel)
+    
+    // Testing related friend definitions
+    friend class TestCntHistoryModel;
+};
+
+#endif
--- a/phonebookui/cnthistorymodel/cnthistorymodel.pro	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cnthistorymodel/cnthistorymodel.pro	Fri Oct 15 12:24:46 2010 +0300
@@ -23,8 +23,8 @@
 TARGET = cnthistorymodel
 CONFIG += hb
 
-DEFINES += dll \
-    BUILD_CNTHISTORYMODEL
+DEFINES += dll
+DEFINES += BUILD_CNTHISTORYMODEL
     
 MOC_DIR = moc
 
@@ -34,17 +34,16 @@
 
 INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
 INCLUDEPATH += ../../inc
-INCLUDEPATH += inc
 
 HEADERS += \
-    inc/cnthistorymodelglobal.h \
-    inc/cnthistorymodelconsts.h \
-    inc/cnthistorymodel.h \
-    inc/cnthistorymodel_p.h 
+    cnthistorymodelglobal.h \
+    cnthistorymodelconsts.h \
+    cnthistorymodel.h \
+    cnthistorymodel_p.h 
 
 SOURCES += \
-    src/cnthistorymodel_p.cpp \
-    src/cnthistorymodel.cpp
+    cnthistorymodel_p.cpp \
+    cnthistorymodel.cpp
     
 LIBS += -llogsengine \
         -lQtContacts \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cnthistorymodel/cnthistorymodel_p.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,850 @@
+/*
+* 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 <QStringList>
+#include <QtAlgorithms>
+#include <hbglobal.h>
+#include <hbicon.h>
+#include <hbframebackground.h>
+
+#include "cnthistorymodel_p.h"
+#include "cntdebug.h"
+
+
+// Unnamed namespace for helper functions
+namespace
+{
+    bool greaterThan(const HItemPointer& t1, const HItemPointer& t2)
+    {
+        return ((*t1).timeStamp > (*t2).timeStamp);
+    }
+    
+    bool lessThan(const HItemPointer& t1, const HItemPointer& t2)
+    {
+        return ((*t1).timeStamp < (*t2).timeStamp);
+    }
+    
+#ifdef TRACES
+#define LOG_ITEM(i) logItem(i)    
+    void logItem(const HistoryItem& item)
+    {
+        QStringList l;
+        
+        l << item.message << item.number << item.timeStamp.toString() << item.title;
+        l << (item.flags & CntIncoming ? "incoming" : "outgoing");
+        l << (item.flags & CntUnseen ? "unseen" : "seen");
+        l << (item.flags & CntAttachment ? "attachment" : "");
+        l << (item.flags & CntCallLog ? "call" : "message");
+        if (item.flags & CntReceivedCall)
+            l << "recieved";
+        else if (item.flags & CntMissedCall)
+            l << "missed";
+        else if (item.flags & CntDialledCall)
+            l << "dialled";
+        
+        l.removeAll("");
+        
+        qDebug() << l;
+    }
+#else
+#define LOG_ITEM(i)
+#endif
+}
+
+Q_DECLARE_METATYPE(LogsEvent *)
+
+/*!
+ * Construct a new CntHistoryModelPrivatePrivate object to communicate 
+ * with the conversations and logs databases.
+ *
+ * \param contactId History specific to this contact is cached. 
+ * If no contact is specified all the call logs and conversation 
+ * history from all contacts will be cached.
+ */
+CntHistoryModelPrivate::CntHistoryModelPrivate(QContactLocalId contactId, QContactManager* manager)
+    : QObject(),
+      m_logsModel(NULL),
+      m_logsFilter(NULL),
+      m_AbstractLogsModel(NULL),
+      m_msgHistory(NULL),
+      m_contactId(contactId),
+      m_contactManager(manager),
+      m_isMyCard(false),
+      m_isMarkedAsSeen(false),
+      m_initLogs(false),
+      m_extendedLocale(HbExtendedLocale::system())
+{
+    CNT_ENTRY
+    
+    // Create the model structure and cache history data from the databases
+    initializeModel();
+    
+    CNT_EXIT
+}
+
+CntHistoryModelPrivate::~CntHistoryModelPrivate()
+{
+    CNT_ENTRY
+    
+    delete m_logsModel;
+    delete m_logsFilter;
+    delete m_msgHistory;
+    
+    CNT_EXIT
+}
+
+/*!
+ * Return the data to be used by the view or delegates for a particular
+ * item and role.
+ *
+ * \param index The index of the item to return data about.
+ * \param role The data should be relevant to this particular purpose.
+ * \return QVariant The data for the specified index and role.
+ */
+QVariant CntHistoryModelPrivate::data(const QModelIndex& index, int role) const
+{
+    CNT_ENTRY_ARGS(index << role)
+    // Invalid index
+    int row = index.row();
+    
+    if ( !validateRowIndex(row) )
+        return QVariant();
+    
+    HItemPointer p = m_List.at(row);
+    if ( p.isNull() )
+        return QVariant();
+        
+    switch( role )
+    {       
+        case Qt::DisplayRole:
+            return displayRoleData(*p);
+        case Qt::DecorationRole:
+            return decorationRoleData(*p);
+        case Qt::BackgroundRole:
+            return backgroundRoleData(*p);
+        case CntFlagsRole:
+            return QVariant((*p).flags);
+        case CntPhoneNumberRole:
+            return QVariant((*p).number);
+        case CntConverstaionIdRole:
+            return conversationIdRoleData(row);
+        default:
+            return QVariant();
+    }
+}
+
+/*!
+ * Return the data to be used by the view for a display role.
+ *
+ * \param item The History item to return data about.
+ *  return QVariant List of strings to be displayed on the view.
+ *  The stings can also be NULL
+ *  index 0 Title of the conversation item.
+ *  index 1 Body text
+ *  index 2 Time stamp
+ */
+QVariant CntHistoryModelPrivate::displayRoleData(const HistoryItem& item) const
+{
+    CNT_ENTRY
+    
+    QStringList list;
+    HbExtendedLocale locale = m_extendedLocale;
+    
+    if (item.timeStamp.date() == QDateTime::currentDateTime().date())
+    {
+        list << item.title << item.message << locale.format(item.timeStamp.time(), r_qtn_time_usual);
+    }
+    else
+    {
+        list << item.title << item.message << locale.format(item.timeStamp.date(), r_qtn_date_usual);
+    }
+    
+    CNT_EXIT_ARGS(list)
+    
+    return QVariant(list);
+}
+
+/*!
+ * Return the data to be used by the view for a decoration role.
+ *
+ * \param item The History item to return data about.
+ *  return QVariant String of the icon path.
+ */
+QVariant CntHistoryModelPrivate::decorationRoleData(const HistoryItem& item) const
+{
+    CNT_ENTRY
+    
+    // Messages
+    if (item.flags & CntMessage)
+        return QVariant(HbIcon(MESSAGE_ICON));
+    
+    // Call logs
+    if (item.flags & CntCallLog) {
+        if (item.flags & CntMissedCall)
+            return QVariant(HbIcon(MISSED_CALL_ICON));
+        if (item.flags & CntDialledCall)
+            return QVariant(HbIcon(DAILED_CALL_ICON));
+        if (item.flags & CntReceivedCall)
+            return QVariant(HbIcon(RECEIVED_CALL_ICON));
+    }
+    
+    return QVariant();
+}
+
+/*!
+ * Return the data to be used to draw the background of list items
+ *
+ * \param item The History item to return data about.
+ *  return QVariant HbFrameBackground of the list item.
+ */
+QVariant CntHistoryModelPrivate::backgroundRoleData(const HistoryItem& item) const
+{
+    if (item.flags & CntIncoming)
+        return QVariant(HbFrameBackground("qtg_fr_convlist_received_normal", HbFrameDrawer::NinePieces));
+    else
+        return QVariant(HbFrameBackground("qtg_fr_convlist_sent_normal", HbFrameDrawer::NinePieces));
+}
+
+/*!
+ * Return the conversation id of this row if it is a message
+ *
+ * \param item The History item to return data about.
+ *  return QVariant HbFrameBackground of the list item.
+ */
+QVariant CntHistoryModelPrivate::conversationIdRoleData(const int row) const
+{
+    HItemPointer p = m_List.at(row);
+    
+    int id(-1);
+    if ( p.data()->flags & CntMessage )
+        id = m_msgMap.key(p, -1);
+
+    if (id != -1)
+        return QVariant(id);
+    else
+        return QVariant();
+}
+
+/*!
+ * Get the number of rows (conversations) in this model.
+ *
+ * \param parent Optional parent index value.
+ * \return Number of rows in this model.
+ */
+int CntHistoryModelPrivate::rowCount(const QModelIndex& /*parent*/) const
+{
+    return m_List.size();
+}
+
+/*!
+ * Sort list items on the model.
+ *
+ * \param column Column to be sorted. It is not used.
+ * \param order Order to sort the list items.
+ */
+void CntHistoryModelPrivate::sort(int /*column*/, Qt::SortOrder order)
+{
+    CNT_ENTRY_ARGS(order)
+    
+    if ( order == Qt::AscendingOrder )
+        qStableSort(m_List.begin(), m_List.end(), lessThan);
+    else
+        qStableSort(m_List.begin(), m_List.end(), greaterThan);
+    
+    CNT_EXIT
+}
+
+/*!
+ * Clear history from the database. If the history cached
+ * is specific to one contact, only that history is cleared.
+ * 
+ */
+void CntHistoryModelPrivate::clearHistory()
+{
+    CNT_ENTRY
+    
+    Q_Q(CntHistoryModel);
+    
+    if ( m_List.isEmpty() )
+        return;
+    
+    // Clear all data from the history model.
+    int count = rowCount();
+    
+    q->doBeginRemoveRows( QModelIndex(), 0, count );
+    
+    // Call logs
+    if ( !m_isMyCard && m_logsFilter )
+        m_logsFilter->clearEvents();
+    else if ( m_logsModel )
+        m_logsModel->clearList(LogsModel::TypeLogsClearAll);
+    
+    // Messages
+    if (m_msgHistory)
+        m_msgHistory->clearMessages( (int)m_contactId );
+    
+    m_List.clear();
+    m_msgMap.clear();
+    m_logsMap.clear();
+    
+    
+    q->doEndRemoveRows();
+    
+    CNT_EXIT
+}
+
+/*!
+ * Mark all the conversations in the view as seen.
+ * 
+ */
+void CntHistoryModelPrivate::markAllAsSeen()
+{
+    CNT_ENTRY
+    
+    if ( m_isMarkedAsSeen )
+        return;
+    
+    // Messages
+    if (m_msgHistory->markRead( m_contactId ))
+        m_isMarkedAsSeen = true;
+    
+    CNT_EXIT
+}
+
+/*!
+ * Create the model structure and cache history data from
+ * conversations and call logs databases.
+ *
+ */
+void CntHistoryModelPrivate::initializeModel()
+{
+    CNT_ENTRY
+    
+    initializeLogsModel();
+    initializeMsgModel();
+    
+    CNT_EXIT
+}
+
+void CntHistoryModelPrivate::initializeMsgModel()
+{
+    CNT_ENTRY
+    
+    if( m_isMyCard )
+        return;
+    
+    // Contact centric
+    MsgHistory* m = new MsgHistory();
+    
+    m_msgHistory = m;
+    
+    // Connect to signals emitted by msg model
+    connect(m, SIGNAL(messagesReady(QList<MsgItem>& )), this, SLOT(messagesReady(QList<MsgItem>& )));
+    connect(m, SIGNAL(messageAdded(MsgItem& )), this, SLOT(messageAdded(MsgItem& )));
+    connect(m, SIGNAL(messageChanged(MsgItem& )), this, SLOT(messageChanged(MsgItem& )));
+    connect(m, SIGNAL(messageDeleted(MsgItem& )), this, SLOT(messageDeleted(MsgItem& )));
+    
+    // Subscribe to get new messages
+    // received from this contact
+    m->subscribe(m_contactId);
+    
+    // Initial fetch of all messages
+    m->getMessages(m_contactId);
+    
+    CNT_EXIT
+}
+
+void CntHistoryModelPrivate::initializeLogsModel()
+{
+    CNT_ENTRY
+    
+    //populate model with call events
+    m_logsModel = new LogsModel(LogsModel::LogsFullModel);
+    if (!m_isMyCard) {
+        //do the filtering to get call events for the target contact
+        m_logsFilter = new LogsCustomFilter;
+        m_logsFilter->setContactId(m_contactId);
+        m_logsFilter->setSourceModel(m_logsModel);
+        m_AbstractLogsModel = m_logsFilter;
+    } else {
+        //get all call events
+        m_AbstractLogsModel = m_logsModel;
+    }
+    
+    //read first call events if any and start listening for more 
+    for ( int i = 0; i < m_AbstractLogsModel->rowCount(); ++i ) {
+        LogsEvent* event = qVariantValue<LogsEvent*>(
+                m_AbstractLogsModel->data(m_AbstractLogsModel->index(i, 0), LogsModel::RoleFullEvent) );
+        
+        if ( event ) {
+            HItemPointer item = HItemPointer(new HistoryItem());
+            readLogEvent(event, *item);
+            m_logsMap.insert(i, item);
+            m_List.append( item );
+        }
+    }
+    
+    connect(m_AbstractLogsModel, SIGNAL(rowsInserted(const QModelIndex &, int, int)), 
+            this, SLOT(logsRowsInserted(const QModelIndex &, int, int)));
+    connect(m_AbstractLogsModel, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), 
+            this, SLOT(logsRowsRemoved(const QModelIndex &, int, int)));
+    connect(m_AbstractLogsModel, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)), 
+                this, SLOT(logsDataChanged(const QModelIndex &, const QModelIndex &)));
+    connect(m_AbstractLogsModel, SIGNAL(modelReset()), this, SLOT(handleLogsReset()));
+
+    CNT_EXIT
+}
+
+/*!
+ * Read call event into a history item
+ *
+ * \param event Call log event
+ * \param item Conversation history item
+ */
+void CntHistoryModelPrivate::readLogEvent(LogsEvent* event, HistoryItem& item)
+{
+    QString bodyText;
+    QString title;
+    
+    if ( m_isMyCard ) {
+        if ( event->remoteParty().length() > 0 ) {
+            title = QString(event->remoteParty());
+        }
+        else {
+            title = QString(event->number());
+        }
+    } else {
+        if ( event->direction() == LogsEvent::DirIn ) {
+            bodyText = hbTrId("txt_phob_list_received");
+            item.flags |= CntReceivedCall;
+        } else if ( event->direction() == LogsEvent::DirOut ) {
+            bodyText = hbTrId("txt_phob_list_dialled_call");
+            item.flags |= CntDialledCall;
+        } else if ( event->direction() == LogsEvent::DirMissed ) {
+            bodyText = hbTrId("txt_phob_list_missed_call");
+            item.flags |= CntMissedCall;
+        }
+    }
+
+    if ( event->direction() == LogsEvent::DirOut ) {
+        item.flags &= ~CntIncoming;
+    } else {
+        item.flags |= CntIncoming;
+    }
+    
+    item.message = bodyText;
+    item.title = title;
+    item.timeStamp = event->time().toLocalTime();
+    item.flags |= CntCallLog;
+    item.number = QString(event->number());
+    
+    LOG_ITEM(item);
+}
+
+/*!
+ * Slot used for receiving new rows from the LogsModel.
+ *
+ * \param parent Optional parent index value.
+ * \param first The first row item to be received from the model.
+ * \param last The last row item to be received from the model.
+ */
+void CntHistoryModelPrivate::logsRowsInserted(const QModelIndex& /*parent*/, int first, int last)
+{
+    CNT_ENTRY_ARGS(first << last)
+    
+    Q_Q(CntHistoryModel);
+    
+    // Check if this is the first time to receive events
+    if ( !m_initLogs ) {
+        q->doBeginResetModel();
+    }
+    else {
+        q->doBeginInsertRows( QModelIndex(), rowCount(), rowCount() + (last - first) );
+    }
+    
+    QList<HItemPointer> l;
+    
+    for ( int i = first; i < m_AbstractLogsModel->rowCount() && i <= last; ++i ) {
+        LogsEvent* event = qVariantValue<LogsEvent*>(
+                m_AbstractLogsModel->data(m_AbstractLogsModel->index(i, 0), LogsModel::RoleFullEvent) );
+        
+        if ( event ) {
+            HItemPointer item(new HistoryItem());
+            readLogEvent(event, *item);
+            m_logsMap.insert(i, item);
+            m_List.append( item );
+        }
+    }
+    
+    // Check if this is the first time to receive events
+    // and sort the entire list.
+    if ( !m_initLogs ) {
+        sort();
+        m_initLogs = true;
+        q->doEndResetModel();
+    }
+    else {
+        q->doEndInsertRows();
+    }
+    
+    CNT_EXIT
+}
+
+/*!
+ * Slot used for receiving new rows from the LogsModel.
+ *
+ * \param parent Optional parent index value.
+ * \param first The first row item to be received from the model.
+ * \param last The last row item to be received from the model.
+ */
+void CntHistoryModelPrivate::logsRowsRemoved(const QModelIndex& /*parent*/, int first, int last)
+{
+    CNT_ENTRY_ARGS(first << last)
+    
+    Q_Q(CntHistoryModel);
+    
+    QList< int > indices;
+    
+    for ( int i = first; i <= last; ++i ) {
+        HItemPointer item = m_logsMap.value( i );
+        int index = m_List.indexOf( item );
+        if ( index > -1 ) {
+            m_logsMap.remove( i );        
+            indices.append( index );
+        }
+    }
+    
+    foreach(int i, indices) {
+        m_List.removeAt( i );
+    }
+    
+    // Remove list items in batches
+    if ( !indices.isEmpty() ) {
+        QList< QList<int> > batches = findIndices(indices);
+        foreach( QList<int> l, batches ) {
+            q->doBeginRemoveRows(QModelIndex(), l.first(), l.last());
+            q->doEndRemoveRows();
+        }
+    }
+    
+    CNT_EXIT
+}
+
+/*!
+ * Update events from logs model. Events are
+ * received as a batch
+ *
+ * \param first First updated model index
+ * \param last Last updated model index
+ */
+void CntHistoryModelPrivate::logsDataChanged(const QModelIndex& first, const QModelIndex& last)
+{
+    CNT_ENTRY_ARGS(first << last)
+    
+    Q_Q(CntHistoryModel);
+    
+    int f = first.row();
+    int l = last.row();
+    QList< int > indices;
+    
+    for ( int i = f; i < m_AbstractLogsModel->rowCount() && i <= l; ++i ) {
+        
+        LogsEvent* event = qVariantValue<LogsEvent*>(
+                m_AbstractLogsModel->data(m_AbstractLogsModel->index(i, 0), LogsModel::RoleFullEvent) );
+        
+        // Fetch item from the mapped logs model items
+        HItemPointer item = m_logsMap.value( i );
+        
+        // Found item in the logs map
+        if ( !item.isNull() && event ) {
+            int index = m_List.indexOf( item );
+            readLogEvent( event, *item );
+            indices.append( index );
+        }
+    }
+    
+    // Emit dataChanged signal only if there were updates
+    if ( !indices.isEmpty() ) {
+        QList< QList<int> > batches = findIndices( indices );
+        foreach( QList<int> l, batches )
+            q->doDataChanged( q->index(l.first(), 0), q->index(l.last(), 0) );
+    }
+    
+    CNT_EXIT
+}
+
+/*
+ * Clear all call logs and refetches new call events after 
+ * receiving a reset model signal from logs model
+ */
+void CntHistoryModelPrivate::handleLogsReset()
+{
+    CNT_ENTRY
+    
+    Q_Q(CntHistoryModel);
+    
+    q->doBeginResetModel();
+    
+    // Remove all call logs
+    QList<HItemPointer> values = m_logsMap.values();
+    foreach(HItemPointer p, values) {
+        m_List.removeOne( p );
+    }
+    
+    m_logsMap.clear();
+    
+    //read first call events if any and start listening for more 
+    for ( int i = 0; i < m_AbstractLogsModel->rowCount(); ++i ) {
+        LogsEvent* event = qVariantValue<LogsEvent*>(
+                m_AbstractLogsModel->data(m_AbstractLogsModel->index(i, 0), LogsModel::RoleFullEvent) );
+        
+        if ( event ) {
+            HItemPointer item = HItemPointer(new HistoryItem());
+            readLogEvent(event, *item);
+            m_logsMap.insert(i, item);
+            m_List.append( item );
+        }
+    }
+    
+    sort();
+
+    q->doEndResetModel();
+    
+    CNT_EXIT
+}
+
+/*!
+ * Check whether an idex is out of bound of our list
+ *
+ * \param index Index to be validated
+ */
+
+bool CntHistoryModelPrivate::validateRowIndex( const int index) const
+{
+    return( index < rowCount() && index >= 0 );
+}
+
+/*!
+ * Find the sequences of indices for the given indices from the private list
+ * 
+ * \param indices List of indices
+ * \return sequences of indices
+ */
+QList< QList<int> > CntHistoryModelPrivate::findIndices( const QList< int >& indices )
+{
+    CNT_ENTRY_ARGS(indices)
+    
+    QList< QList<int> > sequences;
+    QList<int> currSequence;
+    int prevIndex = indices.at(0) - 1;
+    
+    foreach( int currIndex, indices )
+    {
+        if ( currIndex >= 0 )
+        {
+            if ( prevIndex+1 != currIndex && !currSequence.isEmpty() )
+            {
+                sequences.append( currSequence );
+                currSequence.clear();
+            } 
+            currSequence.append( currIndex );
+            prevIndex = currIndex;
+        }
+    }
+    
+    if ( !currSequence.isEmpty() )
+    {
+        // Add last sequence if such exist
+        sequences.append( currSequence );
+    }
+    
+    CNT_EXIT_ARGS(sequences)
+    
+    return sequences;
+}
+
+/*!
+ * Read message event into a history item
+ *
+ * \param event Message event
+ * \param item Conversation history item
+ */
+void CntHistoryModelPrivate::readMsgEvent(MsgItem& event, HistoryItem& item)
+{
+    CNT_ENTRY
+    
+    // Msg direction
+    if ( event.direction() == MsgItem::MsgDirectionIncoming ) {
+        item.flags |= CntIncoming;
+        // Read status
+        if ( event.isAttributeSet(MsgItem::MsgAttributeUnread) )
+            item.flags |= CntUnseen;
+        else
+            item.flags &= ~CntUnseen;
+    } else if ( event.direction() == MsgItem::MsgDirectionOutgoing )
+        item.flags &= ~CntIncoming;
+    
+    // Attachment
+    if (event.isAttributeSet(MsgItem::MsgAttributeAttachment))
+        item.flags |= CntAttachment;
+    
+    item.flags |= CntMessage;
+    item.number = event.phoneNumber();
+    
+    if (event.body().isEmpty())
+    {
+        item.message = " ";
+    }
+    else
+    {
+        item.message = event.body();
+    }
+    
+    item.timeStamp = event.timeStamp().toLocalTime();
+    
+    LOG_ITEM(item);
+    
+    CNT_EXIT
+}
+
+/*!
+ * Slot to receive new messages for the first time
+ * from the messages model
+ *
+ * \param event Message event
+ * \param item Conversation history item
+ */
+void CntHistoryModelPrivate::messagesReady(QList<MsgItem>& msgs)
+{
+    CNT_ENTRY
+    
+    Q_Q(CntHistoryModel);
+    
+    q->doBeginResetModel();
+    
+    foreach( MsgItem m, msgs ) {
+        // Create a new hst item
+        HItemPointer item(new HistoryItem());
+        
+        // Parse the MsgItem and add data into hst item
+        readMsgEvent( m, *item );
+        
+        // Map the hist item to a MsgItem in the msgModel
+        m_msgMap.insert( m.id(), item );
+        
+        // Append the hst item to our list
+        m_List.append( item );
+    }
+    
+    sort();
+    
+    q->doEndResetModel();
+    
+    CNT_EXIT
+}
+
+/*!
+ * Slot to receive new messages from the messages model
+ *
+ * \param event Message event
+ * \param item Conversation history item
+ */
+void CntHistoryModelPrivate::messageAdded(MsgItem& msg)
+{
+    CNT_ENTRY
+    
+    Q_Q(CntHistoryModel);
+    
+    q->doBeginInsertRows( QModelIndex(), rowCount(), rowCount() );
+    
+    // Create a new hst item
+    HItemPointer item(new HistoryItem());
+    
+    // Parse the MsgItem and add data into hst item
+    readMsgEvent( msg, *item );
+    
+    // Map the hist item to a MsgItem in the msgModel
+    m_msgMap.insert( msg.id(), item );
+    
+    // Append the hst item to our list
+    m_List.append( item );
+    
+    q->doEndInsertRows();
+    
+    CNT_EXIT
+}
+
+/*!
+ * Slot to update a message from the messages model
+ *
+ * \param event Message event
+ * \param item Conversation history item
+ */
+void CntHistoryModelPrivate::messageChanged(MsgItem& msg)
+{
+    CNT_ENTRY
+    
+    Q_Q(CntHistoryModel);
+    
+    // Fetch the hst item that maps to this MsgItem
+    HItemPointer p = m_msgMap.value( msg.id() );
+    
+    // No item was found.
+    if ( p.isNull() )
+        return;
+
+    // Parse the MsgItem and add data into hst item
+    readMsgEvent(msg, *p);
+    
+    // Get the index of the the hst item in the list
+    int pIndex = m_List.indexOf( p );
+    
+    q->doDataChanged(q->index(pIndex, 0), q->index(pIndex, 0));
+    
+    CNT_EXIT
+}
+
+/*!
+ * Slot to delete a message from the messages model
+ *
+ * \param event Message event
+ * \param item Conversation history item
+ */
+void CntHistoryModelPrivate::messageDeleted(MsgItem& msg)
+{
+    CNT_ENTRY
+    
+    Q_Q(CntHistoryModel);
+    
+    // Fetch the hst item that maps to this MsgItem
+    HItemPointer p = m_msgMap.value( msg.id() );
+    
+    // No item was found.
+    if ( p.isNull() )
+        return;
+    
+    // Remove the item in stored containers
+    m_msgMap.remove( msg.id() );
+    int index = m_List.indexOf( p );
+    if ( index > -1 ) {
+        q->doBeginRemoveRows(QModelIndex(), index, index);
+        m_List.removeAt( index );
+        q->doEndRemoveRows();
+    }
+    
+    CNT_EXIT
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cnthistorymodel/cnthistorymodel_p.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,138 @@
+/*
+* 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:
+*
+*/
+
+#ifndef CNTHISTORYMODELPRIVATE_H
+#define CNTHISTORYMODELPRIVATE_H
+
+#include <QSharedData>
+#include <QSharedPointer>
+#include <QMap>
+#include <QDateTime>
+#include <qtcontacts.h>
+
+#ifdef PBK_UNIT_TEST
+#include "stub_classes.h"
+#else
+#include <logsevent.h>
+#include <logsmodel.h>
+#include <logscustomfilter.h>
+#endif
+#include <msghistory.h>
+#include <msgitem.h>
+#include <hbextendedlocale.h>
+#include "cnthistorymodel.h"
+#include "cnthistorymodelconsts.h"
+
+QTM_USE_NAMESPACE
+
+class HistoryItem
+{   
+public:   
+    HistoryItem() : flags(0)
+    {};
+    
+    inline const HistoryItem& operator=(const HistoryItem& other)
+    {
+        flags = other.flags;
+        number = other.number;
+        title = other.title;
+        message = other.message;
+        timeStamp = other.timeStamp;
+        return *this;
+    }
+    
+    inline bool operator==(const HistoryItem& other) const
+    {
+         return timeStamp == other.timeStamp;
+    }
+    
+public:
+    int flags;
+    QString number;
+    QString title;
+    QString message;
+    QDateTime timeStamp;
+};
+
+typedef QSharedPointer<HistoryItem> HItemPointer;
+
+class CntHistoryModelPrivate : public QObject
+{
+    Q_OBJECT
+    Q_DECLARE_PUBLIC(CntHistoryModel)
+    
+public:
+    CntHistoryModelPrivate(QContactLocalId contactId, QContactManager* manager);
+    ~CntHistoryModelPrivate();
+
+public:
+    QVariant data(const QModelIndex& index, int role) const;
+    int rowCount(const QModelIndex& parent = QModelIndex()) const;
+    void sort(int column = 0, Qt::SortOrder order = Qt::AscendingOrder);
+    void clearHistory();
+    void markAllAsSeen();
+    
+public:
+    CntHistoryModel *q_ptr;
+    
+public:
+    void initializeModel();
+    QVariant displayRoleData(const HistoryItem& item) const;
+    QVariant decorationRoleData(const HistoryItem& item) const;
+    QVariant backgroundRoleData(const HistoryItem& item) const;
+    QVariant conversationIdRoleData(const int row) const;
+    
+    // Utility finctions
+    void readLogEvent(LogsEvent* event, HistoryItem& item);
+    void readMsgEvent(MsgItem& event, HistoryItem& item);
+    void initializeLogsModel();
+    void initializeMsgModel();
+    bool validateRowIndex(const int index) const;
+    QList< QList<int> > findIndices( const QList< int >& indices );
+    
+public slots:
+    // Logs model slots
+    void logsRowsInserted(const QModelIndex& parent, int first, int last);
+    void logsRowsRemoved(const QModelIndex& parent, int first, int last);
+    void logsDataChanged(const QModelIndex& first, const QModelIndex& last);
+    void handleLogsReset();
+    
+    // Messaging model slots
+    void messagesReady(QList<MsgItem>& msgs);
+    void messageAdded(MsgItem& msg);
+    void messageChanged(MsgItem& msg);
+    void messageDeleted(MsgItem& msg);
+    
+public:
+    LogsModel* m_logsModel;
+    LogsCustomFilter* m_logsFilter;
+    QAbstractItemModel* m_AbstractLogsModel;
+    MsgHistory* m_msgHistory;
+	QContactLocalId m_contactId;
+    QContactManager* m_contactManager;
+    bool m_isMyCard;
+    bool m_isMarkedAsSeen;
+    bool m_initLogs;
+    //this contains merged calls and messages history
+    QList<HItemPointer> m_List;
+    QMap<int, HItemPointer> m_logsMap;
+    QMap<int, HItemPointer> m_msgMap;
+    const HbExtendedLocale m_extendedLocale;
+};
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cnthistorymodel/cnthistorymodelconsts.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,53 @@
+/*
+* 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:
+*
+*/
+#ifndef CNTHISTORYMODELCONSTS_H
+#define CNTHISTORYMODELCONSTS_H
+
+enum Attributes
+    {
+    CntIncoming = 1,
+    CntUnseen = 2,
+    CntAttachment = 4
+    };
+
+enum ItemType
+    {
+    CntCallLog = 32,
+    CntMessage = 64
+    };
+
+enum Icon
+    {
+    CntMissedCall = 128,
+    CntReceivedCall = 256,
+    CntDialledCall = 512
+    };
+
+enum CustomRoles
+    {
+    CntFlagsRole = Qt::UserRole + 1,
+    CntPhoneNumberRole,
+    CntConverstaionIdRole
+    };
+
+// Constants
+#define MISSED_CALL_ICON "qtg_small_missed_call"
+#define DAILED_CALL_ICON "qtg_small_sent"
+#define RECEIVED_CALL_ICON "qtg_small_received"
+#define MESSAGE_ICON "qtg_small_message"
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cnthistorymodel/cnthistorymodelglobal.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,33 @@
+/*
+* 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:
+*
+*/
+#ifndef CNTHISTORYMODELGLOBAL_H
+#define CNTHISTORYMODELGLOBAL_H
+
+#include <QtGlobal>
+#include <QString>
+#include <QList>
+#include <qdebug.h>
+
+#ifdef CNTHISTORYMODEL_NO_EXPORT
+#define CNTHISTORYMODEL_EXPORT 
+#elif BUILD_CNTHISTORYMODEL
+#define CNTHISTORYMODEL_EXPORT Q_DECL_EXPORT
+#else
+#define CNTHISTORYMODEL_EXPORT Q_DECL_IMPORT
+#endif
+
+#endif
--- a/phonebookui/cnthistorymodel/inc/cnthistorymodel.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,83 +0,0 @@
-/*
-* 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:
-*
-*/
-#ifndef CNTHISTORYMODEL_H
-#define CNTHISTORYMODEL_H
-
-#include <QAbstractListModel>
-#include <QSharedData>
-#include <qmobilityglobal.h>
-#include <qcontactid.h>
-#include "cntglobal.h"
-
-#include "cnthistorymodelconsts.h"
-#include "cnthistorymodelglobal.h"
-
-QTM_BEGIN_NAMESPACE
-class QContactManager;
-QTM_END_NAMESPACE
-
-QTM_USE_NAMESPACE
-
-class CntHistoryModelPrivate;
-
-/*!
- * CntHistoryModel is a model used to fetch conversation history
- * (SMS & call logs) from databases. It will 
- * cache content from the databases to be displayed on the screen
- * by the conversation view.
- * 
- * Note that that this is a prototype implementation and does
- * not yet support more advanced features.
- */
-class CNTHISTORYMODEL_EXPORT CntHistoryModel : public QAbstractListModel
-{    
-    Q_OBJECT
-    
-public:
-    CntHistoryModel(QContactLocalId contactId,
-                    QContactManager* manager,
-                    QObject *parent = 0);
-    ~CntHistoryModel();
-    
-public: // from QAbstractTableModel/QAbstractItemModel
-    QVariant data(const QModelIndex& index, int role) const;
-    int rowCount(const QModelIndex& parent = QModelIndex()) const;
-
-public:
-    void clearHistory();
-    void markAllAsSeen();
-    void sortAndRefresh(Qt::SortOrder order = Qt::AscendingOrder);
-
-private:
-    void doBeginInsertRows(const QModelIndex &parent, int first, int last);
-    void doEndInsertRows();
-    void doBeginRemoveRows(const QModelIndex &parent, int first, int last);
-    void doEndRemoveRows();
-    void doBeginResetModel();
-    void doEndResetModel();
-    void doDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);
-    
-private:
-	CntHistoryModelPrivate* const d_ptr;
-    Q_DECLARE_PRIVATE_D(d_ptr, CntHistoryModel)
-    Q_DISABLE_COPY(CntHistoryModel)
-    
-    // Testing related friend definitions
-    friend class TestCntHistoryModel;
-};
-
-#endif
--- a/phonebookui/cnthistorymodel/inc/cnthistorymodel_p.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,138 +0,0 @@
-/*
-* 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:
-*
-*/
-
-#ifndef CNTHISTORYMODELPRIVATE_H
-#define CNTHISTORYMODELPRIVATE_H
-
-#include <QSharedData>
-#include <QSharedPointer>
-#include <QMap>
-#include <QDateTime>
-#include <qtcontacts.h>
-
-#ifdef PBK_UNIT_TEST
-#include "stub_classes.h"
-#else
-#include <logsevent.h>
-#include <logsmodel.h>
-#include <logscustomfilter.h>
-#endif
-#include <msghistory.h>
-#include <msgitem.h>
-#include <hbextendedlocale.h>
-#include "cnthistorymodel.h"
-#include "cnthistorymodelconsts.h"
-
-QTM_USE_NAMESPACE
-
-class HistoryItem
-{   
-public:   
-    HistoryItem() : flags(0)
-    {};
-    
-    inline const HistoryItem& operator=(const HistoryItem& other)
-    {
-        flags = other.flags;
-        number = other.number;
-        title = other.title;
-        message = other.message;
-        timeStamp = other.timeStamp;
-        return *this;
-    }
-    
-    inline bool operator==(const HistoryItem& other) const
-    {
-         return timeStamp == other.timeStamp;
-    }
-    
-public:
-    int flags;
-    QString number;
-    QString title;
-    QString message;
-    QDateTime timeStamp;
-};
-
-typedef QSharedPointer<HistoryItem> HItemPointer;
-
-class CntHistoryModelPrivate : public QObject
-{
-    Q_OBJECT
-    Q_DECLARE_PUBLIC(CntHistoryModel)
-    
-public:
-    CntHistoryModelPrivate(QContactLocalId contactId, QContactManager* manager);
-    ~CntHistoryModelPrivate();
-
-public:
-    QVariant data(const QModelIndex& index, int role) const;
-    int rowCount(const QModelIndex& parent = QModelIndex()) const;
-    void sort(int column = 0, Qt::SortOrder order = Qt::AscendingOrder);
-    void clearHistory();
-    void markAllAsSeen();
-    
-public:
-    CntHistoryModel *q_ptr;
-    
-public:
-    void initializeModel();
-    QVariant displayRoleData(const HistoryItem& item) const;
-    QVariant decorationRoleData(const HistoryItem& item) const;
-    QVariant backgroundRoleData(const HistoryItem& item) const;
-    QVariant conversationIdRoleData(const int row) const;
-    
-    // Utility finctions
-    void readLogEvent(LogsEvent* event, HistoryItem& item);
-    void readMsgEvent(MsgItem& event, HistoryItem& item);
-    void initializeLogsModel();
-    void initializeMsgModel();
-    bool validateRowIndex(const int index) const;
-    QList< QList<int> > findIndices( const QList< int >& indices );
-    
-public slots:
-    // Logs model slots
-    void logsRowsInserted(const QModelIndex& parent, int first, int last);
-    void logsRowsRemoved(const QModelIndex& parent, int first, int last);
-    void logsDataChanged(const QModelIndex& first, const QModelIndex& last);
-    void handleLogsReset();
-    
-    // Messaging model slots
-    void messagesReady(QList<MsgItem>& msgs);
-    void messageAdded(MsgItem& msg);
-    void messageChanged(MsgItem& msg);
-    void messageDeleted(MsgItem& msg);
-    
-public:
-    LogsModel* m_logsModel;
-    LogsCustomFilter* m_logsFilter;
-    QAbstractItemModel* m_AbstractLogsModel;
-    MsgHistory* m_msgHistory;
-	QContactLocalId m_contactId;
-    QContactManager* m_contactManager;
-    bool m_isMyCard;
-    bool m_isMarkedAsSeen;
-    bool m_initLogs;
-    //this contains merged calls and messages history
-    QList<HItemPointer> m_List;
-    QMap<int, HItemPointer> m_logsMap;
-    QMap<int, HItemPointer> m_msgMap;
-    const HbExtendedLocale m_extendedLocale;
-};
-
-#endif
-
--- a/phonebookui/cnthistorymodel/inc/cnthistorymodelconsts.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
-* 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:
-*
-*/
-#ifndef CNTHISTORYMODELCONSTS_H
-#define CNTHISTORYMODELCONSTS_H
-
-enum Attributes
-    {
-    CntIncoming = 1,
-    CntUnseen = 2,
-    CntAttachment = 4
-    };
-
-enum ItemType
-    {
-    CntCallLog = 32,
-    CntMessage = 64
-    };
-
-enum Icon
-    {
-    CntMissedCall = 128,
-    CntReceivedCall = 256,
-    CntDialledCall = 512
-    };
-
-enum CustomRoles
-    {
-    CntFlagsRole = Qt::UserRole + 1,
-    CntPhoneNumberRole,
-    CntConverstaionIdRole
-    };
-
-// Constants
-#define MISSED_CALL_ICON "qtg_small_missed_call"
-#define DAILED_CALL_ICON "qtg_small_sent"
-#define RECEIVED_CALL_ICON "qtg_small_received"
-#define MESSAGE_ICON "qtg_small_message"
-
-#endif
--- a/phonebookui/cnthistorymodel/inc/cnthistorymodelglobal.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-/*
-* 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:
-*
-*/
-
-#ifndef CNTHISTORYMODELGLOBAL_H
-#define CNTHISTORYMODELGLOBAL_H
-
-#include <QtGlobal>
-#include <QString>
-#include <QList>
-#include <qdebug.h>
-
-#ifdef CNTHISTORYMODEL_NO_EXPORT
-#define CNTHISTORYMODEL_EXPORT 
-#elif BUILD_CNTHISTORYMODEL
-#define CNTHISTORYMODEL_EXPORT Q_DECL_EXPORT
-#else
-#define CNTHISTORYMODEL_EXPORT Q_DECL_IMPORT
-#endif
-
-#endif
--- a/phonebookui/cnthistorymodel/src/cnthistorymodel.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,188 +0,0 @@
-/*
-* 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 "cnthistorymodel_p.h"
-#include "cnthistorymodel.h"
-#include "cntdebug.h"
-
-/*!
- * Construct a new CntHistoryModel object to communicate 
- * with the conversations and logs databases.
- *
- * \param contactId History specific to this contact is cached. 
- * If no contact is specified all the call logs and conversation 
- * history from all contacts will be cached.
- */
-CntHistoryModel::CntHistoryModel(QContactLocalId contactId,
-                                 QContactManager* manager,
-                                 QObject *parent)
-    : QAbstractListModel(parent),
-      d_ptr(new CntHistoryModelPrivate(contactId, manager))
-{
-    CNT_ENTRY
-    
-    Q_D(CntHistoryModel);
-    d->q_ptr = this;
-    
-    CNT_EXIT
-}
-
-CntHistoryModel::~CntHistoryModel()
-{
-    CNT_ENTRY
-    
-    Q_D(CntHistoryModel);
-    delete d;
-    
-    CNT_EXIT
-}
-
-/*!
- * Return the data to be used by the view or delegates for a particular
- * item and role.
- *
- * \param index The index of the item to return data about.
- * \param role The data should be relevant to this particular purpose.
- * \return QVariant The data for the specified index and role.
- */
-QVariant CntHistoryModel::data(const QModelIndex& index, int role) const
-{
-    Q_D(const CntHistoryModel);
-    return d->data(index, role);
-}
-
-/*!
- * Get the number of rows (conversations) in this model.
- *
- * \param parent Optional parent index value.
- * \return Number of rows in this model.
- */
-int CntHistoryModel::rowCount(const QModelIndex& parent) const
-{
-    Q_D(const CntHistoryModel);
-    return d->rowCount(parent);
-}
-
-/*!
- * Clear history from the database. If the history cached
- * is specific to one contact, only that history is cleared.
- * 
- */
-void CntHistoryModel::clearHistory()
-{
-    CNT_ENTRY
-    
-    Q_D(CntHistoryModel);
-    d->clearHistory();
-    
-    CNT_EXIT
-}
-
-/*!
- * Mark all the conversations in the view as seen.
- * 
- */
-void CntHistoryModel::markAllAsSeen()
-{
-    CNT_ENTRY
-    
-    Q_D(CntHistoryModel);
-    d->markAllAsSeen();
-    
-    CNT_EXIT
-}
-
-/*!
- * Sort items in the model and refresh the view
- *
- * \param order Order to sort the list items.
- */
-void CntHistoryModel::sortAndRefresh(Qt::SortOrder order)
-{
-    CNT_ENTRY_ARGS(order)
-    
-    Q_D(CntHistoryModel);
-    
-    doBeginResetModel();
-    d->sort(order);
-    doEndResetModel();
-    
-    CNT_EXIT
-}
-
-void CntHistoryModel::doBeginInsertRows(const QModelIndex &parent, int first, int last)
-{
-    CNT_ENTRY_ARGS(parent << first << last)
-    
-    beginInsertRows(parent, first, last);
-    
-    CNT_EXIT
-}
-
-void CntHistoryModel::doEndInsertRows()
-{
-    CNT_ENTRY
-    
-    endInsertRows();
-    
-    CNT_EXIT
-}
-
-void CntHistoryModel::doBeginRemoveRows(const QModelIndex &parent, int first, int last)
-{
-    CNT_ENTRY_ARGS(parent << first << last)
-    
-    beginRemoveRows(parent, first, last);
-    
-    CNT_EXIT
-}
-
-void CntHistoryModel::doEndRemoveRows()
-{
-    CNT_ENTRY
-    
-    endRemoveRows();
-    
-    CNT_EXIT
-}
-
-void CntHistoryModel::doBeginResetModel()
-{
-    CNT_ENTRY
-    
-    beginResetModel();
-    
-    CNT_EXIT
-}
-
-void CntHistoryModel::doEndResetModel()
-{
-    CNT_ENTRY
-    
-    endResetModel();
-    
-    CNT_EXIT
-}
-
-void CntHistoryModel::doDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
-{
-    CNT_ENTRY_ARGS(topLeft << bottomRight)
-    
-    emit dataChanged(topLeft, bottomRight);
-    
-    CNT_EXIT
-}
--- a/phonebookui/cnthistorymodel/src/cnthistorymodel_p.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,860 +0,0 @@
-/*
-* 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 <QStringList>
-#include <QtAlgorithms>
-#include <hbglobal.h>
-#include <hbicon.h>
-#include <hbframebackground.h>
-
-#include "cnthistorymodel_p.h"
-#include "cntdebug.h"
-
-
-// Unnamed namespace for helper functions
-namespace
-{
-    bool greaterThan(const HItemPointer& t1, const HItemPointer& t2)
-    {
-        return ((*t1).timeStamp > (*t2).timeStamp);
-    }
-    
-    bool lessThan(const HItemPointer& t1, const HItemPointer& t2)
-    {
-        return ((*t1).timeStamp < (*t2).timeStamp);
-    }
-    
-#ifdef TRACES
-#define LOG_ITEM(i) logItem(i)    
-    void logItem(const HistoryItem& item)
-    {
-        QStringList l;
-        
-        l << item.message << item.number << item.timeStamp.toString() << item.title;
-        l << (item.flags & CntIncoming ? "incoming" : "outgoing");
-        l << (item.flags & CntUnseen ? "unseen" : "seen");
-        l << (item.flags & CntAttachment ? "attachment" : "");
-        l << (item.flags & CntCallLog ? "call" : "message");
-        if (item.flags & CntReceivedCall)
-            l << "recieved";
-        else if (item.flags & CntMissedCall)
-            l << "missed";
-        else if (item.flags & CntDialledCall)
-            l << "dialled";
-        
-        l.removeAll("");
-        
-        qDebug() << l;
-    }
-#else
-#define LOG_ITEM(i)
-#endif
-}
-
-Q_DECLARE_METATYPE(LogsEvent *)
-
-/*!
- * Construct a new CntHistoryModelPrivatePrivate object to communicate 
- * with the conversations and logs databases.
- *
- * \param contactId History specific to this contact is cached. 
- * If no contact is specified all the call logs and conversation 
- * history from all contacts will be cached.
- */
-CntHistoryModelPrivate::CntHistoryModelPrivate(QContactLocalId contactId, QContactManager* manager)
-    : QObject(),
-      m_logsModel(NULL),
-      m_logsFilter(NULL),
-      m_AbstractLogsModel(NULL),
-      m_msgHistory(NULL),
-      m_contactId(contactId),
-      m_contactManager(manager),
-      m_isMyCard(false),
-      m_isMarkedAsSeen(false),
-      m_initLogs(false),
-      m_extendedLocale(HbExtendedLocale::system())
-{
-    CNT_ENTRY
-    
-    // Create the model structure and cache history data from the databases
-    initializeModel();
-    
-    CNT_EXIT
-}
-
-CntHistoryModelPrivate::~CntHistoryModelPrivate()
-{
-    CNT_ENTRY
-    
-    if (m_logsModel) {
-        delete m_logsModel;
-        m_logsModel = NULL;
-    }
-    if (m_logsFilter) {
-        delete m_logsFilter;
-        m_logsFilter = NULL;
-    }
-    if (m_msgHistory) {
-        delete m_msgHistory;
-        m_msgHistory = NULL;
-    }
-    
-    CNT_EXIT
-}
-
-/*!
- * Return the data to be used by the view or delegates for a particular
- * item and role.
- *
- * \param index The index of the item to return data about.
- * \param role The data should be relevant to this particular purpose.
- * \return QVariant The data for the specified index and role.
- */
-QVariant CntHistoryModelPrivate::data(const QModelIndex& index, int role) const
-{
-    CNT_ENTRY_ARGS(index << role)
-    // Invalid index
-    int row = index.row();
-    
-    if ( !validateRowIndex(row) )
-        return QVariant();
-    
-    HItemPointer p = m_List.at(row);
-    if ( p.isNull() )
-        return QVariant();
-        
-    switch( role )
-    {       
-        case Qt::DisplayRole:
-            return displayRoleData(*p);
-        case Qt::DecorationRole:
-            return decorationRoleData(*p);
-        case Qt::BackgroundRole:
-            return backgroundRoleData(*p);
-        case CntFlagsRole:
-            return QVariant((*p).flags);
-        case CntPhoneNumberRole:
-            return QVariant((*p).number);
-        case CntConverstaionIdRole:
-            return conversationIdRoleData(row);
-        default:
-            return QVariant();
-    }
-}
-
-/*!
- * Return the data to be used by the view for a display role.
- *
- * \param item The History item to return data about.
- *  return QVariant List of strings to be displayed on the view.
- *  The stings can also be NULL
- *  index 0 Title of the conversation item.
- *  index 1 Body text
- *  index 2 Time stamp
- */
-QVariant CntHistoryModelPrivate::displayRoleData(const HistoryItem& item) const
-{
-    CNT_ENTRY
-    
-    QStringList list;
-    HbExtendedLocale locale = m_extendedLocale;
-    
-    if (item.timeStamp.date() == QDateTime::currentDateTime().date())
-    {
-        list << item.title << item.message << locale.format(item.timeStamp.time(), r_qtn_time_usual);
-    }
-    else
-    {
-        list << item.title << item.message << locale.format(item.timeStamp.date(), r_qtn_date_usual);
-    }
-    
-    CNT_EXIT_ARGS(list)
-    
-    return QVariant(list);
-}
-
-/*!
- * Return the data to be used by the view for a decoration role.
- *
- * \param item The History item to return data about.
- *  return QVariant String of the icon path.
- */
-QVariant CntHistoryModelPrivate::decorationRoleData(const HistoryItem& item) const
-{
-    CNT_ENTRY
-    
-    // Messages
-    if (item.flags & CntMessage)
-        return QVariant(HbIcon(MESSAGE_ICON));
-    
-    // Call logs
-    if (item.flags & CntCallLog) {
-        if (item.flags & CntMissedCall)
-            return QVariant(HbIcon(MISSED_CALL_ICON));
-        if (item.flags & CntDialledCall)
-            return QVariant(HbIcon(DAILED_CALL_ICON));
-        if (item.flags & CntReceivedCall)
-            return QVariant(HbIcon(RECEIVED_CALL_ICON));
-    }
-    
-    return QVariant();
-}
-
-/*!
- * Return the data to be used to draw the background of list items
- *
- * \param item The History item to return data about.
- *  return QVariant HbFrameBackground of the list item.
- */
-QVariant CntHistoryModelPrivate::backgroundRoleData(const HistoryItem& item) const
-{
-    if (item.flags & CntIncoming)
-        return QVariant(HbFrameBackground("qtg_fr_convlist_received_normal", HbFrameDrawer::NinePieces));
-    else
-        return QVariant(HbFrameBackground("qtg_fr_convlist_sent_normal", HbFrameDrawer::NinePieces));
-}
-
-/*!
- * Return the conversation id of this row if it is a message
- *
- * \param item The History item to return data about.
- *  return QVariant HbFrameBackground of the list item.
- */
-QVariant CntHistoryModelPrivate::conversationIdRoleData(const int row) const
-{
-    HItemPointer p = m_List.at(row);
-    
-    int id(-1);
-    if ( p.data()->flags & CntMessage )
-        id = m_msgMap.key(p, -1);
-
-    if (id != -1)
-        return QVariant(id);
-    else
-        return QVariant();
-}
-
-/*!
- * Get the number of rows (conversations) in this model.
- *
- * \param parent Optional parent index value.
- * \return Number of rows in this model.
- */
-int CntHistoryModelPrivate::rowCount(const QModelIndex& /*parent*/) const
-{
-    return m_List.size();
-}
-
-/*!
- * Sort list items on the model.
- *
- * \param column Column to be sorted. It is not used.
- * \param order Order to sort the list items.
- */
-void CntHistoryModelPrivate::sort(int /*column*/, Qt::SortOrder order)
-{
-    CNT_ENTRY_ARGS(order)
-    
-    if ( order == Qt::AscendingOrder )
-        qStableSort(m_List.begin(), m_List.end(), lessThan);
-    else
-        qStableSort(m_List.begin(), m_List.end(), greaterThan);
-    
-    CNT_EXIT
-}
-
-/*!
- * Clear history from the database. If the history cached
- * is specific to one contact, only that history is cleared.
- * 
- */
-void CntHistoryModelPrivate::clearHistory()
-{
-    CNT_ENTRY
-    
-    Q_Q(CntHistoryModel);
-    
-    if ( m_List.isEmpty() )
-        return;
-    
-    // Clear all data from the history model.
-    int count = rowCount();
-    
-    q->doBeginRemoveRows( QModelIndex(), 0, count );
-    
-    // Call logs
-    if ( !m_isMyCard && m_logsFilter )
-        m_logsFilter->clearEvents();
-    else if ( m_logsModel )
-        m_logsModel->clearList(LogsModel::TypeLogsClearAll);
-    
-    // Messages
-    if (m_msgHistory)
-        m_msgHistory->clearMessages( (int)m_contactId );
-    
-    m_List.clear();
-    m_msgMap.clear();
-    m_logsMap.clear();
-    
-    
-    q->doEndRemoveRows();
-    
-    CNT_EXIT
-}
-
-/*!
- * Mark all the conversations in the view as seen.
- * 
- */
-void CntHistoryModelPrivate::markAllAsSeen()
-{
-    CNT_ENTRY
-    
-    if ( m_isMarkedAsSeen )
-        return;
-    
-    // Messages
-    if (m_msgHistory->markRead( m_contactId ))
-        m_isMarkedAsSeen = true;
-    
-    CNT_EXIT
-}
-
-/*!
- * Create the model structure and cache history data from
- * conversations and call logs databases.
- *
- */
-void CntHistoryModelPrivate::initializeModel()
-{
-    CNT_ENTRY
-    
-    initializeLogsModel();
-    initializeMsgModel();
-    
-    CNT_EXIT
-}
-
-void CntHistoryModelPrivate::initializeMsgModel()
-{
-    CNT_ENTRY
-    
-    if( m_isMyCard )
-        return;
-    
-    // Contact centric
-    MsgHistory* m = new MsgHistory();
-    
-    m_msgHistory = m;
-    
-    // Connect to signals emitted by msg model
-    connect(m, SIGNAL(messagesReady(QList<MsgItem>& )), this, SLOT(messagesReady(QList<MsgItem>& )));
-    connect(m, SIGNAL(messageAdded(MsgItem& )), this, SLOT(messageAdded(MsgItem& )));
-    connect(m, SIGNAL(messageChanged(MsgItem& )), this, SLOT(messageChanged(MsgItem& )));
-    connect(m, SIGNAL(messageDeleted(MsgItem& )), this, SLOT(messageDeleted(MsgItem& )));
-    
-    // Subscribe to get new messages
-    // received from this contact
-    m->subscribe(m_contactId);
-    
-    // Initial fetch of all messages
-    m->getMessages(m_contactId);
-    
-    CNT_EXIT
-}
-
-void CntHistoryModelPrivate::initializeLogsModel()
-{
-    CNT_ENTRY
-    
-    //populate model with call events
-    m_logsModel = new LogsModel(LogsModel::LogsFullModel);
-    if (!m_isMyCard) {
-        //do the filtering to get call events for the target contact
-        m_logsFilter = new LogsCustomFilter;
-        m_logsFilter->setContactId(m_contactId);
-        m_logsFilter->setSourceModel(m_logsModel);
-        m_AbstractLogsModel = m_logsFilter;
-    } else {
-        //get all call events
-        m_AbstractLogsModel = m_logsModel;
-    }
-    
-    //read first call events if any and start listening for more 
-    for ( int i = 0; i < m_AbstractLogsModel->rowCount(); ++i ) {
-        LogsEvent* event = qVariantValue<LogsEvent*>(
-                m_AbstractLogsModel->data(m_AbstractLogsModel->index(i, 0), LogsModel::RoleFullEvent) );
-        
-        if ( event ) {
-            HItemPointer item = HItemPointer(new HistoryItem());
-            readLogEvent(event, *item);
-            m_logsMap.insert(i, item);
-            m_List.append( item );
-        }
-    }
-    
-    connect(m_AbstractLogsModel, SIGNAL(rowsInserted(const QModelIndex &, int, int)), 
-            this, SLOT(logsRowsInserted(const QModelIndex &, int, int)));
-    connect(m_AbstractLogsModel, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), 
-            this, SLOT(logsRowsRemoved(const QModelIndex &, int, int)));
-    connect(m_AbstractLogsModel, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)), 
-                this, SLOT(logsDataChanged(const QModelIndex &, const QModelIndex &)));
-    connect(m_AbstractLogsModel, SIGNAL(modelReset()), this, SLOT(handleLogsReset()));
-
-    CNT_EXIT
-}
-
-/*!
- * Read call event into a history item
- *
- * \param event Call log event
- * \param item Conversation history item
- */
-void CntHistoryModelPrivate::readLogEvent(LogsEvent* event, HistoryItem& item)
-{
-    QString bodyText;
-    QString title;
-    
-    if ( m_isMyCard ) {
-        if ( event->remoteParty().length() > 0 ) {
-            title = QString(event->remoteParty());
-        }
-        else {
-            title = QString(event->number());
-        }
-    } else {
-        if ( event->direction() == LogsEvent::DirIn ) {
-            bodyText = hbTrId("txt_phob_list_received");
-            item.flags |= CntReceivedCall;
-        } else if ( event->direction() == LogsEvent::DirOut ) {
-            bodyText = hbTrId("txt_phob_list_dialled_call");
-            item.flags |= CntDialledCall;
-        } else if ( event->direction() == LogsEvent::DirMissed ) {
-            bodyText = hbTrId("txt_phob_list_missed_call");
-            item.flags |= CntMissedCall;
-        }
-    }
-
-    if ( event->direction() == LogsEvent::DirMissed
-        || event->direction() == LogsEvent::DirIn ) {
-        item.flags |= CntIncoming;
-    } else {
-        item.flags &= ~CntIncoming;
-    }
-    
-    item.message = bodyText;
-    item.title = title;
-    item.timeStamp = event->time().toLocalTime();
-    item.flags |= CntCallLog;
-    item.number = QString(event->number());
-    
-    LOG_ITEM(item);
-}
-
-/*!
- * Slot used for receiving new rows from the LogsModel.
- *
- * \param parent Optional parent index value.
- * \param first The first row item to be received from the model.
- * \param last The last row item to be received from the model.
- */
-void CntHistoryModelPrivate::logsRowsInserted(const QModelIndex& /*parent*/, int first, int last)
-{
-    CNT_ENTRY_ARGS(first << last)
-    
-    Q_Q(CntHistoryModel);
-    
-    // Check if this is the first time to receive events
-    if ( !m_initLogs ) {
-        q->doBeginResetModel();
-    }
-    else {
-        q->doBeginInsertRows( QModelIndex(), rowCount(), rowCount() + (last - first) );
-    }
-    
-    QList<HItemPointer> l;
-    
-    for ( int i = first; i < m_AbstractLogsModel->rowCount() && i <= last; ++i ) {
-        LogsEvent* event = qVariantValue<LogsEvent*>(
-                m_AbstractLogsModel->data(m_AbstractLogsModel->index(i, 0), LogsModel::RoleFullEvent) );
-        
-        if ( event ) {
-            HItemPointer item(new HistoryItem());
-            readLogEvent(event, *item);
-            m_logsMap.insert(i, item);
-            m_List.append( item );
-        }
-    }
-    
-    // Check if this is the first time to receive events
-    // and sort the entire list.
-    if ( !m_initLogs ) {
-        sort();
-        m_initLogs = true;
-        q->doEndResetModel();
-    }
-    else {
-        q->doEndInsertRows();
-    }
-    
-    CNT_EXIT
-}
-
-/*!
- * Slot used for receiving new rows from the LogsModel.
- *
- * \param parent Optional parent index value.
- * \param first The first row item to be received from the model.
- * \param last The last row item to be received from the model.
- */
-void CntHistoryModelPrivate::logsRowsRemoved(const QModelIndex& /*parent*/, int first, int last)
-{
-    CNT_ENTRY_ARGS(first << last)
-    
-    Q_Q(CntHistoryModel);
-    
-    QList< int > indices;
-    
-    for ( int i = first; i <= last; ++i ) {
-        HItemPointer item = m_logsMap.value( i );
-        int index = m_List.indexOf( item );
-        if ( index > -1 ) {
-            m_logsMap.remove( i );        
-            indices.append( index );
-        }
-    }
-    
-    foreach(int i, indices) {
-        m_List.removeAt( i );
-    }
-    
-    // Remove list items in batches
-    if ( !indices.isEmpty() ) {
-        QList< QList<int> > batches = findIndices(indices);
-        foreach( QList<int> l, batches ) {
-            q->doBeginRemoveRows(QModelIndex(), l.first(), l.last());
-            q->doEndRemoveRows();
-        }
-    }
-    
-    CNT_EXIT
-}
-
-/*!
- * Update events from logs model. Events are
- * received as a batch
- *
- * \param first First updated model index
- * \param last Last updated model index
- */
-void CntHistoryModelPrivate::logsDataChanged(const QModelIndex& first, const QModelIndex& last)
-{
-    CNT_ENTRY_ARGS(first << last)
-    
-    Q_Q(CntHistoryModel);
-    
-    int f = first.row();
-    int l = last.row();
-    QList< int > indices;
-    
-    for ( int i = f; i < m_AbstractLogsModel->rowCount() && i <= l; ++i ) {
-        
-        LogsEvent* event = qVariantValue<LogsEvent*>(
-                m_AbstractLogsModel->data(m_AbstractLogsModel->index(i, 0), LogsModel::RoleFullEvent) );
-        
-        // Fetch item from the mapped logs model items
-        HItemPointer item = m_logsMap.value( i );
-        
-        // Found item in the logs map
-        if ( !item.isNull() && event ) {
-            int index = m_List.indexOf( item );
-            readLogEvent( event, *item );
-            indices.append( index );
-        }
-    }
-    
-    // Emit dataChanged signal only if there were updates
-    if ( !indices.isEmpty() ) {
-        QList< QList<int> > batches = findIndices( indices );
-        foreach( QList<int> l, batches )
-            q->doDataChanged( q->index(l.first(), 0), q->index(l.last(), 0) );
-    }
-    
-    CNT_EXIT
-}
-
-/*
- * Clear all call logs and refetches new call events after 
- * receiving a reset model signal from logs model
- */
-void CntHistoryModelPrivate::handleLogsReset()
-{
-    CNT_ENTRY
-    
-    Q_Q(CntHistoryModel);
-    
-    q->doBeginResetModel();
-    
-    // Remove all call logs
-    QList<HItemPointer> values = m_logsMap.values();
-    foreach(HItemPointer p, values) {
-        m_List.removeOne( p );
-    }
-    
-    m_logsMap.clear();
-    
-    //read first call events if any and start listening for more 
-    for ( int i = 0; i < m_AbstractLogsModel->rowCount(); ++i ) {
-        LogsEvent* event = qVariantValue<LogsEvent*>(
-                m_AbstractLogsModel->data(m_AbstractLogsModel->index(i, 0), LogsModel::RoleFullEvent) );
-        
-        if ( event ) {
-            HItemPointer item = HItemPointer(new HistoryItem());
-            readLogEvent(event, *item);
-            m_logsMap.insert(i, item);
-            m_List.append( item );
-        }
-    }
-    
-    sort();
-
-    q->doEndResetModel();
-    
-    CNT_EXIT
-}
-
-/*!
- * Check whether an idex is out of bound of our list
- *
- * \param index Index to be validated
- */
-
-bool CntHistoryModelPrivate::validateRowIndex( const int index) const
-{
-    return( index < rowCount() && index >= 0 );
-}
-
-/*!
- * Find the sequences of indices for the given indices from the private list
- * 
- * \param indices List of indices
- * \return sequences of indices
- */
-QList< QList<int> > CntHistoryModelPrivate::findIndices( const QList< int >& indices )
-{
-    CNT_ENTRY_ARGS(indices)
-    
-    QList< QList<int> > sequences;
-    QList<int> currSequence;
-    int prevIndex = indices.at(0) - 1;
-    
-    foreach( int currIndex, indices )
-    {
-        if ( currIndex >= 0 )
-        {
-            if ( prevIndex+1 != currIndex && !currSequence.isEmpty() )
-            {
-                sequences.append( currSequence );
-                currSequence.clear();
-            } 
-            currSequence.append( currIndex );
-            prevIndex = currIndex;
-        }
-    }
-    
-    if ( !currSequence.isEmpty() )
-    {
-        // Add last sequence if such exist
-        sequences.append( currSequence );
-    }
-    
-    CNT_EXIT_ARGS(sequences)
-    
-    return sequences;
-}
-
-/*!
- * Read message event into a history item
- *
- * \param event Message event
- * \param item Conversation history item
- */
-void CntHistoryModelPrivate::readMsgEvent(MsgItem& event, HistoryItem& item)
-{
-    CNT_ENTRY
-    
-    // Msg direction
-    if ( event.direction() == MsgItem::MsgDirectionIncoming ) {
-        item.flags |= CntIncoming;
-        // Read status
-        if ( event.isAttributeSet(MsgItem::MsgAttributeUnread) )
-            item.flags |= CntUnseen;
-        else
-            item.flags &= ~CntUnseen;
-    } else if ( event.direction() == MsgItem::MsgDirectionOutgoing )
-        item.flags &= ~CntIncoming;
-    
-    // Attachment
-    if (event.isAttributeSet(MsgItem::MsgAttributeAttachment))
-        item.flags |= CntAttachment;
-    
-    item.flags |= CntMessage;
-    item.number = event.phoneNumber();
-    
-    if (event.body().isEmpty())
-    {
-        item.message = " ";
-    }
-    else
-    {
-        item.message = event.body();
-    }
-    
-    item.timeStamp = event.timeStamp().toLocalTime();
-    
-    LOG_ITEM(item);
-    
-    CNT_EXIT
-}
-
-/*!
- * Slot to receive new messages for the first time
- * from the messages model
- *
- * \param event Message event
- * \param item Conversation history item
- */
-void CntHistoryModelPrivate::messagesReady(QList<MsgItem>& msgs)
-{
-    CNT_ENTRY
-    
-    Q_Q(CntHistoryModel);
-    
-    q->doBeginResetModel();
-    
-    foreach( MsgItem m, msgs ) {
-        // Create a new hst item
-        HItemPointer item(new HistoryItem());
-        
-        // Parse the MsgItem and add data into hst item
-        readMsgEvent( m, *item );
-        
-        // Map the hist item to a MsgItem in the msgModel
-        m_msgMap.insert( m.id(), item );
-        
-        // Append the hst item to our list
-        m_List.append( item );
-    }
-    
-    sort();
-    
-    q->doEndResetModel();
-    
-    CNT_EXIT
-}
-
-/*!
- * Slot to receive new messages from the messages model
- *
- * \param event Message event
- * \param item Conversation history item
- */
-void CntHistoryModelPrivate::messageAdded(MsgItem& msg)
-{
-    CNT_ENTRY
-    
-    Q_Q(CntHistoryModel);
-    
-    q->doBeginInsertRows( QModelIndex(), rowCount(), rowCount() );
-    
-    // Create a new hst item
-    HItemPointer item(new HistoryItem());
-    
-    // Parse the MsgItem and add data into hst item
-    readMsgEvent( msg, *item );
-    
-    // Map the hist item to a MsgItem in the msgModel
-    m_msgMap.insert( msg.id(), item );
-    
-    // Append the hst item to our list
-    m_List.append( item );
-    
-    q->doEndInsertRows();
-    
-    CNT_EXIT
-}
-
-/*!
- * Slot to update a message from the messages model
- *
- * \param event Message event
- * \param item Conversation history item
- */
-void CntHistoryModelPrivate::messageChanged(MsgItem& msg)
-{
-    CNT_ENTRY
-    
-    Q_Q(CntHistoryModel);
-    
-    // Fetch the hst item that maps to this MsgItem
-    HItemPointer p = m_msgMap.value( msg.id() );
-    
-    // No item was found.
-    if ( p.isNull() )
-        return;
-
-    // Parse the MsgItem and add data into hst item
-    readMsgEvent(msg, *p);
-    
-    // Get the index of the the hst item in the list
-    int pIndex = m_List.indexOf( p );
-    
-    q->doDataChanged(q->index(pIndex, 0), q->index(pIndex, 0));
-    
-    CNT_EXIT
-}
-
-/*!
- * Slot to delete a message from the messages model
- *
- * \param event Message event
- * \param item Conversation history item
- */
-void CntHistoryModelPrivate::messageDeleted(MsgItem& msg)
-{
-    CNT_ENTRY
-    
-    Q_Q(CntHistoryModel);
-    
-    // Fetch the hst item that maps to this MsgItem
-    HItemPointer p = m_msgMap.value( msg.id() );
-    
-    // No item was found.
-    if ( p.isNull() )
-        return;
-    
-    // Remove the item in stored containers
-    m_msgMap.remove( msg.id() );
-    int index = m_List.indexOf( p );
-    if ( index > -1 ) {
-        q->doBeginRemoveRows(QModelIndex(), index, index);
-        m_List.removeAt( index );
-        q->doEndRemoveRows();
-    }
-    
-    CNT_EXIT
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cnthistorymodel/tsrc/branch_coverage.bat	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,13 @@
+pushd mt_cnthistorymodel
+call del MON.sym
+call del MON.dat
+call del profile.txt
+
+call qmake
+call sbs reallyclean
+call ctcwrap -i d -2comp -no-conf-check sbs.bat -c winscw_urel.test
+
+call \epoc32\release\winscw\urel\mt_cnthistorymodel.exe
+call ctcpost -p profile.txt
+call ctc2html -i profile.txt -nsb
+popd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cnthistorymodel/tsrc/functional_coverage.bat	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,13 @@
+pushd mt_cnthistorymodel
+call del MON.sym
+call del MON.dat
+call del profile.txt
+
+call qmake
+call sbs reallyclean
+call ctcwrap -i f -2comp -no-conf-check sbs.bat -c winscw_urel.test
+
+call \epoc32\release\winscw\urel\mt_cnthistorymodel.exe
+call ctcpost -p profile.txt
+call ctc2html -i profile.txt -nsb
+popd
--- a/phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/main.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/*
-* 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 "testrunner.h"
-
-#include "mt_cnthistorymodel.h"
-
-#include <QtTest/QtTest>
-
-int main(int argc, char *argv[]) 
-{
-    bool promptOnExit(true);
-    for (int i=0; i<argc; i++) {
-        if (QString(argv[i]) == "-noprompt")
-            promptOnExit = false;
-    }
-    printf("Running tests...\n");
-            
-    QApplication app(argc, argv);
-    
-    QTranslator translator;
-    QString lang = QLocale::system().name();
-    QString path = "z:/resource/qt/translations/";
-    translator.load(path + "contacts_" + lang);
-    app.installTranslator(&translator);
-    
-    TestRunner testRunner("mt_cnthistorymodel");
-
-    TestCntHistoryModel historyModelTests;
-    testRunner.runTests( historyModelTests );
-    
-    testRunner.printResults();
-
-    /*if (promptOnExit) {
-        printf("Press any key...\n");
-        getchar(); 
-    }*/
-    return 0;   
-}
-
--- a/phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/mt_cnthistorymodel.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/mt_cnthistorymodel.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -333,3 +333,5 @@
     model->markAllAsSeen();
     model->clearHistory();
 }
+
+QTEST_MAIN(TestCntHistoryModel);
--- a/phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/mt_cnthistorymodel.pro	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/mt_cnthistorymodel.pro	Fri Oct 15 12:24:46 2010 +0300
@@ -19,11 +19,11 @@
 MOC_DIR = moc
 
 QT += testlib xml core
-CONFIG  += qtestlib hb
+CONFIG  += hb symbian_test
 DEFINES += QT_NO_DEBUG_OUTPUT
 DEFINES += QT_NO_WARNING_OUTPUT
-DEFINES += PBK_UNIT_TEST
-DEFINES += CNTHISTORYMODEL_NO_EXPORT
+DEFINES += PBK_UNIT_TEST \
+           CNTHISTORYMODEL_NO_EXPORT
 
 DEPENDPATH += .
 INCLUDEPATH += .
@@ -32,16 +32,13 @@
 INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE 
 	
 # Input
-HEADERS += ../../inc/*.h
+HEADERS += ../../*.h
 HEADERS += mt_cnthistorymodel.h
 HEADERS += stub_classes.h
-HEADERS += testrunner.h
            
-SOURCES += ../../src/*.cpp
-SOURCES += main.cpp
+SOURCES += ../../*.cpp
 SOURCES += stub_classes.cpp
 SOURCES += mt_cnthistorymodel.cpp
-SOURCES += testrunner.cpp
            
 LIBS += -lQtContacts \
         -lmsghistory
--- a/phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/testrunner.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,176 +0,0 @@
-/*
-* 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 "testrunner.h"
-#include <QtTest/QtTest>
-#include <QDir>
-#include <stdio.h>
-
-const char testFunctionElement[] = "TestFunction";
-const char incidentElement[] = "Incident";
-const char descriptionElement[] = "Description";
-const char nameAttr[] = "name";
-const char typeAttr[] = "type";
-const char fileAttr[] = "file";
-const char lineAttr[] = "line";
-const char attrValueFail[] = "fail";
-
-
-TestRunner::TestRunner(const QString& name)
-: mTestCount(0),
-  mParsingIncidentElement(false),
-  mParsingDescriptionElement(false),
-  mCurrentTestFailed(false),
-  mCurrentTestFailureLine(0)
-{
-    mTestRunParams.append(name);
-    mTestRunParams.append("-xml");
-    mTestRunParams.append("-o");
-    mHomeDir = QDir::homePath();
-    mTestRunParams.append(QString()); // Initial result file name
-
-    if (!mHomeDir.endsWith(QString::fromAscii("/")))
-        mHomeDir += QString::fromAscii("/");
-}
-
-TestRunner::~TestRunner()
-{
-}
-
-int TestRunner::runTests(QObject& testObject)
-{
-    QString className(testObject.metaObject()->className());
-    printf("Running tests for %s ... ", className.toUtf8().data());
-    QString resultFileName = mHomeDir + className + ".xml";
-    mTestRunParams.replace(mTestRunParams.count()-1,resultFileName);
-    int errorsBefore = mErrors.count();
-    int error = QTest::qExec(&testObject, mTestRunParams);
-    parse(resultFileName);
-    printf("Failures: %d\n",mErrors.count()-errorsBefore);
-    fflush(stdout);
-    return error;
-}
-
-void TestRunner::printResults()
-{
-    printf("\nTests executed: %d\n",mTestCount);
-    if (mErrors.count() > 0) {
-        printf("Failures (%d):\n", mErrors.count());
-        foreach(QString error, mErrors) {
-            printf("\n%s", error.toUtf8().data());
-        }
-        printf("\n");
-    } else {
-        printf("All passed.\n\n");
-    }
-    fflush(stdout);
-    
-    //To write in file
-    QFile file("C:\\TestResult.txt");
-    if(file.open(QIODevice::WriteOnly)) 
-    {
-        QTextStream ts( &file );
-        ts << "Tests executed: " << mTestCount << "\n";
-        if (mErrors.count() > 0)
-        {
-            ts <<"Failures : " << mErrors.count() << "\n";
-            foreach(QString error, mErrors)
-                {
-                    ts << error.toUtf8().data();
-                }
-            ts << "\n";
-        }
-        else
-        {
-            ts<< "All passed.\n\n";
-        }
-        
-        ts << endl;
-        file.close();
-    } 
-}
-
-void TestRunner::parse(const QString& fileName)
-{
-    QFile file(fileName);
-    QXmlInputSource inputSource(&file);
-    QXmlSimpleReader reader;
-    reader.setContentHandler(this);
-    reader.parse(inputSource);
-}
-
-bool TestRunner::startElement(
-    const QString& /*namespaceURI*/, 
-    const QString& /*localName*/, 
-    const QString& qName, 
-    const QXmlAttributes& atts)
-{
-    if (qName == QString::fromAscii(testFunctionElement)) {
-        mTestCount++;
-        mCurrentTestName = atts.value(QString::fromAscii(nameAttr));
-        return true;
-    }
-    if (qName == QString::fromAscii(incidentElement)) {
-        mParsingIncidentElement = true;
-        if (atts.value(QString::fromAscii(typeAttr)) == QString::fromAscii(attrValueFail)) {
-            mCurrentTestFailed = true;
-            mCurrentTestFile = atts.value(QString::fromAscii(fileAttr));
-            mCurrentTestFailureLine = atts.value(QString::fromAscii(lineAttr)).toInt();
-        }
-        return true;
-    }
-    mParsingDescriptionElement =
-        (qName == QString::fromAscii(descriptionElement));
-    return true;
-}
-
-bool TestRunner::endElement(
-    const QString& /*namespaceURI*/,
-    const QString& /*localName*/,
-    const QString& qName)
-{
-    if (qName == QString::fromAscii(incidentElement)) {
-        mParsingIncidentElement = false;
-        mCurrentTestFailed = false;
-        return true;
-    }
-    if (qName == QString::fromAscii(descriptionElement)) {
-        mParsingDescriptionElement = false;
-    }    
-    return true;
-}
-
-bool TestRunner::characters(const QString& ch)
-{
-    if (mParsingIncidentElement && 
-        mParsingDescriptionElement &&
-        mCurrentTestFailed) {
-        QByteArray testResult = mCurrentTestName.toAscii() + " failed:\n";
-        testResult += "File: ";
-        testResult += mCurrentTestFile.toAscii();
-        testResult += "\n";
-        testResult += "Line: ";
-        testResult += QByteArray::number(mCurrentTestFailureLine);
-        testResult += "\n";
-        testResult += "Reason: ";
-        testResult += ch.toAscii();
-        testResult += "\n";
-        mErrors.append(QString::fromAscii(testResult.data()));
-    }
-    return true;
-}
-
--- a/phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/testrunner.h	Fri Oct 08 11:42:51 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,84 +0,0 @@
-/*
-* 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:
-*
-*/
-
-#ifndef TESTRUNNER_H
-#define TESTRUNNER_H
-
-#include <QXmlDefaultHandler>
-#include <QObject>
-#include <HbApplication>
-
-class Starter : public QObject
-{
-    Q_OBJECT
-public:
-    Starter( HbApplication& aApp );
-    ~Starter();
-    
-    bool eventFilter( QObject* aObject, QEvent* aEvent );
-        
-private:
-    HbApplication& mApp;
-    bool mTestStarted;
-};
-
-class TestRunner : public QXmlDefaultHandler
-{
-    
-public: // Constructors and destructor
-    TestRunner(const QString& name);
-    ~TestRunner();
-       
-public: // New functions
-    
-    int runTests(QObject& testObject);
-    void printResults();
-    
-protected: // From QXmlContentHandler 
-    bool startElement(
-        const QString& namespaceURI,
-        const QString& localName,
-        const QString& qName,
-        const QXmlAttributes& atts);
-    
-    bool endElement(
-        const QString& namespaceURI,
-        const QString& localName,
-        const QString& qName);
-    
-    bool characters(const QString& ch);
-
-private: // New functions
-    void parse(const QString& fileName);
-
-private: // Data
-    QStringList mTestRunParams;
-    QString mHomeDir;
-    int mTestCount;
-    QStringList mErrors;
-    bool mParsingIncidentElement;
-    bool mParsingDescriptionElement;
-    bool mCurrentTestFailed;
-    QString mCurrentTestName;
-    QString mCurrentTestFile;
-    int mCurrentTestFailureLine;
-    
-    QList<QObject> mTests;
-};
-
-
-#endif // TESTRUNNER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cnthistorymodel/tsrc/run_test.bat	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,6 @@
+pushd mt_cnthistorymodel
+call qmake
+call sbs reallyclean
+call sbs -c winscw_urel.test
+call \epoc32\release\winscw\urel\mt_cnthistorymodel.exe -o c:\mt_cnthistorymodel.txt
+popd
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cntabstractfetcher.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,225 @@
+/*
+* Copyright (c) 2010 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: Base class for cache data fetchers.
+*
+*/
+
+#include <cntabstractfetcher.h>
+#include <cntdebug.h>
+
+/*!
+    \class CntAbstractCacheItem
+    \brief Base class for cache data for one contact.
+ */
+
+/*!
+    \class CntAbstractFetcher
+    \brief CntAbstractFetcher is a base class for cache data fetchers.
+
+    CntAbstractFetcher implements a priority queue for scheduling jobs.
+    A job is added using scheduleJob() and executed using processNextJob().
+    If too many jobs are scheduled, the oldest jobs (not the ones with lowest
+    priority) are cancelled. However, the cancelled jobs will be informed
+    back to the client later so that it can reschedule them if needed.
+ */
+
+/*!
+    Constructs a CntAbstractFetcher object.
+ */
+CntAbstractFetcher::CntAbstractFetcher(int maxAmountOfJobs)
+{
+    CNT_ENTRY
+
+    // set the max amount of jobs
+    mMaxAmountOfJobs = maxAmountOfJobs;
+
+    CNT_EXIT
+}
+
+/*!
+    Cleans up and destructs the CntIconFetcher object.
+ */
+CntAbstractFetcher::~CntAbstractFetcher()
+{
+    CNT_ENTRY
+
+    disconnect(this);
+
+    for (int i = 0; i < mJobs.count(); ++i) {
+        delete mJobs.at(i).first;
+    }
+    mJobs.clear();
+
+    qDeleteAll(mCancelledJobs);
+    mCancelledJobs.clear();
+
+    CNT_EXIT
+}
+
+/*!
+    Schedules a job. A fetched() signal will be emitted when the job
+    has been successfully completed; a failed() signal is sent if the
+    job cannot be completed.
+
+    The oldest job is cancelled if there are too many scheduled jobs; in this
+    case a cancelled() signal is sent.
+
+    \param job the job; ownership is taken
+    \return true, if the job is - or already was - scheduled
+ */
+bool CntAbstractFetcher::scheduleJob(CntAbstractJob* job, int priority)
+{
+    Q_ASSERT(job != NULL);
+
+    CNT_ENTRY_ARGS("job =" << job->toString() << "prio =" << priority)
+
+    if (job->isEmpty()) {
+        CNT_EXIT_ARGS("bad job")
+        return false;
+    }
+
+    int index = jobIndex(job);
+    if (index != NoSuchJob) {
+        // if the job already exists, update the priority...
+        if (priority < mJobs.at(index).second) {
+            mJobs[index].second = priority;
+        }
+
+        // ...and notify the client that an identical job already exists
+        delete job;
+        CNT_EXIT_ARGS("job already exists")
+        return true;
+    }
+
+    if (mJobs.count() >= mMaxAmountOfJobs) {
+        // the queue of jobs is full, so remove the oldest job
+        mCancelledJobs.append(mJobs.takeFirst().first);
+    }
+
+    mJobs.append(qMakePair(job, priority));
+
+    // since this job has now been scheduled, remove it from the list of
+    // cancelled jobs in case it is there
+    index = cancelledJobIndex(job);
+    if (index != NoSuchJob) {
+        delete mCancelledJobs.takeAt(index);
+    }
+
+    CNT_EXIT
+
+    return true;
+}
+
+/*!
+    \return true if there are scheduled jobs left; otherwise returns false.
+ */
+bool CntAbstractFetcher::hasScheduledJobs()
+{
+    return (mJobs.count() > 0);
+}
+
+/*!
+    \return true if there are cancelled jobs left; otherwise returns false.
+ */
+bool CntAbstractFetcher::hasCancelledJobs()
+{
+    return (mCancelledJobs.count() > 0);
+}
+
+/*!
+    Picks the next job from the list of scheduled jobs, i.e. the job
+    with the highest priority.
+
+    \return the next job in the job list
+ */
+CntAbstractJob * CntAbstractFetcher::takeNextJob()
+{
+    CNT_ENTRY
+
+    int selectionIndex = -1;
+    int selectionPriority = -1;
+
+    int jobCount = mJobs.count();
+    if (jobCount == 0) {
+        CNT_EXIT_ARGS("no more jobs")
+        return NULL;
+    }
+
+    for (int i = 0; i < jobCount; ++i) {
+        int jobPriority = mJobs.at(i).second;
+        if (jobPriority < selectionPriority || selectionPriority == -1) {
+            selectionIndex = i;
+            selectionPriority = jobPriority;
+        }
+    }
+
+    CNT_EXIT_ARGS(mJobs.at(selectionIndex).first->toString())
+
+    return mJobs.takeAt(selectionIndex).first;
+}
+
+/*!
+    \return the next job in the list of cancelled jobs
+ */
+CntAbstractJob * CntAbstractFetcher::takeNextCancelledJob()
+{
+    CNT_ENTRY
+
+    return mCancelledJobs.takeFirst();
+}
+
+
+/*!
+    Finds out the index of a scheduled job.
+
+    \param job the kind of job to look for
+    \return index of the job, or NoSuchJob if such a job is not scheduled.
+ */
+int CntAbstractFetcher::jobIndex(CntAbstractJob *job)
+{
+    CNT_ENTRY
+
+    for (int i = 0; i < mJobs.count(); ++i) {
+        CntAbstractJob *scheduledJob = mJobs.at(i).first;
+        if (job->equals(*scheduledJob)) {
+            CNT_EXIT
+            return i;
+        }
+    }
+
+    CNT_EXIT_ARGS("no such job")
+    return NoSuchJob;
+}
+
+/*!
+    Finds out the index of a cancelled job.
+
+    \param job the kind of job to look for
+    \return index of the job, or NoSuchJob if such a job is not cancelled.
+ */
+int CntAbstractFetcher::cancelledJobIndex(CntAbstractJob *job)
+{
+    CNT_ENTRY
+
+    for (int i = 0; i < mCancelledJobs.count(); ++i) {
+        CntAbstractJob *cancelledJob = mCancelledJobs.at(i);
+        if (job->equals(*cancelledJob)) {
+            CNT_EXIT
+            return i;
+        }
+    }
+
+    CNT_EXIT_ARGS("no such cancelled job")
+    return NoSuchJob;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cntabstractfetcher.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,61 @@
+/*
+* Copyright (c) 2010 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: Base classes for fetchers and their jobs.
+*
+*/
+
+#ifndef CNTABSTRACTFETCHER_H
+#define CNTABSTRACTFETCHER_H
+
+#include <qtcontacts.h>
+
+#define NoSuchJob -1
+
+QTM_USE_NAMESPACE
+
+class CntAbstractJob
+{
+public:
+    virtual ~CntAbstractJob() {}
+    virtual bool isEmpty() = 0;
+    virtual bool equals(const CntAbstractJob &other) = 0;
+    virtual QString toString() = 0;
+};
+
+class CntAbstractFetcher : public QObject
+{
+    Q_OBJECT
+public:
+    CntAbstractFetcher(int maxAmountOfJobs);
+    virtual ~CntAbstractFetcher();
+
+    bool scheduleJob(CntAbstractJob *job, int priority = 0);
+    bool hasScheduledJobs();
+    bool hasCancelledJobs();
+    virtual bool isProcessingJob() = 0;
+    virtual void processNextJob() = 0;
+
+protected:
+    CntAbstractJob * takeNextJob();
+    CntAbstractJob * takeNextCancelledJob();
+    int jobIndex(CntAbstractJob *job);
+    int cancelledJobIndex(CntAbstractJob *job);
+
+private:
+    QList< QPair<CntAbstractJob *, int> > mJobs;          // list of all scheduled jobs and their priorities
+    QList<CntAbstractJob *> mCancelledJobs;               // list of all cancelled jobs
+    int mMaxAmountOfJobs;                                 // the maximum amount of concurrently scheduled jobs
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cntcache.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,1090 @@
+/*
+* Copyright (c) 2010 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: Asynchronously fetches and caches basic contact info
+*              and icons.
+*
+*/
+
+#include <hbapplication.h>
+#include <qtcontacts.h>
+#include <qcontactmanager.h>
+#include <QTimer>
+#include <cntcache.h>
+#include <cntcacheitems.h>
+#include <cntnamefetcher.h>
+#include <cntinfofetcher.h>
+#include <cnticonfetcher.h>
+#include <cntdebug.h>
+
+/*!
+    \class CntContactInfo
+    \brief Info about one contact, intended for list views.
+
+   This class contains info about one contact. The info is mainly intended
+   to be used in list views:
+     - name: the name of the contact, formatted for displaying
+     - text: secondary information like a phone number
+     - icon1: the main icon
+     - icon2: the smaller secondary icon
+
+    \class CntCache
+    \brief Asynchronously fetches contact info and icons.
+
+    Singleton class that acts as a proxy to get CntContactInfo objects for
+    contacts. It also implements caching for faster access. This is why the
+    fetchContactInfo() function takes a row number and the full list of
+    contact IDs rather than just a contact ID -- it allows precaching.
+
+    The usage pattern for clients is to call fetchContactInfo() to get at
+    least the name of the contact. If all the info is cached then it will be
+    provided. If not, then the uncached info is fetched asynchronously and
+    contactInfoUpdated() signals are emitted as the pieces of information
+    arrive -- up to three times per contact; once for text, once for icon1
+    and once for icon2.
+
+    Internally CntCache uses three fetchers; one for names, one for info and
+    one for icons.
+ */
+
+// set the singleton instance pointer to NULL
+CntCache* CntCache::mInstance = NULL;
+
+// the event for starting to process all outstanding jobs
+const QEvent::Type ProcessJobsEvent = QEvent::User;
+
+// different states of postponement 
+const int JobsNotPostponed = 0;
+const int JobsPostponedForDuration = 1;
+const int JobsPostponedUntilResume = 2;
+
+// number of items to read ahead into cache; this number is for one direction
+const int ItemsToCacheAhead = 24;
+
+// cache size for info items
+const int InfoCacheSize = 128;
+
+// cache size for icon items; must be larger than 2 * ItemsToCacheAhead
+const int IconCacheSize = 60;
+
+// duration of urgency mode in milliseconds
+const int UrgencyModeDuration = 100;
+
+// duration of a postponement in milliseconds
+const int PostponeJobsDuration = 300;
+
+// number of icons in a CntContactInfo object
+const int IconsInCntContactInfo = 2;
+
+// default empty text info field for a contact; it cannot be empty
+// as the listview will then ignore it, causing rendering problems
+const QString EmptyTextField = " ";
+
+/*!
+    Provides a pointer to the CntCache singleton instance.
+    
+    \param client a pointer to the client
+    \param manager  
+ */
+CntCache* CntCache::createSession(void *client, QContactManager *manager)
+{
+	CNT_STATIC_ENTRY_ARGS("client =" << client << ", mngr =" << (void*) manager)
+
+    if (!mInstance) {
+        mInstance = new CntCache(manager);
+    }
+
+    // increase reference counter for cache clients
+    mInstance->mClients.insert(client);
+
+    // whenever a client requests an instance, the client will want to get all info
+    // for the first screenful of contacts urgently
+    mInstance->startUrgencyMode();
+
+	CNT_EXIT_ARGS("instance =" << (void*) mInstance << ", refCount =" << mInstance->mClients.count())
+
+    return mInstance;
+}
+
+/*!
+    Disconnects from CntCache.
+ */
+void CntCache::closeSession(void *client)
+{
+	CNT_ENTRY
+
+    // delete singleton instance if there are no more clients
+    mInstance->mClients.remove(client);
+    if (mInstance->mClients.count() == 0) {
+    	CNT_LOG_ARGS("no more clients, so deleting singleton instance")
+        mInstance = NULL;
+        delete this;
+    }
+
+	CNT_EXIT
+}
+
+/*! 
+    Fetches visuals for a contact: name, text (e.g. phone number or social
+    status) and two icons (e.g. avatar, presence). Previously cached content,
+    at the very least the name, will be returned immediately. Availability of
+    more information will be checked asynchronously and sent to clients via
+    contactInfoUpdated() signals.
+    
+    The function takes a row and a list rather than just a contact ID because
+    of read ahead caching - contacts near the requested contacts are expected
+    to be needed soon and are therefore precached.
+    
+    \param row the row of the contact to fetch
+    \param idList a list with all the IDs in the list
+    \return a contact with some details filled in
+ */
+CntContactInfo* CntCache::fetchContactInfo(int row, const QList<QContactLocalId>& idList)
+{
+    CNT_ENTRY_ARGS(row << "/" << idList.count())
+
+    Q_ASSERT(row >= 0 && row < idList.count());
+
+    QString name;
+    QString text = EmptyTextField;
+    HbIcon icons[IconsInCntContactInfo];
+
+    QContactLocalId contactId = idList.at(row);
+
+    if (contactId != mLastEmittedContactId) {
+        // this is a new request from the UI (rather than a response to
+        // a change that the cache just emitted)
+        if (!mIsInUrgencyMode) {
+            postponeJobs(JobsPostponedForDuration, PostponeJobsDuration);
+        }
+        updateReadAheadCache(row, idList);
+    }
+
+    // fetch the contact
+    if (mInfoCache.contains(contactId)) {
+        // the contact's info is cached
+        CntInfoCacheItem* infoItem = mInfoCache.value(contactId);
+        for (int i = 0; i < IconsInCntContactInfo; ++i) {
+            QString iconName = infoItem->icons[i];
+            if (!iconName.isEmpty()) {
+                if (mIconCache.contains(iconName)) {
+                    CntIconCacheItem* iconItem = mIconCache.value(iconName);
+                    if (iconItem->requestedBy.count() > 0) {
+                    // icon is being fetched -> add this contact to list of requestors
+                        iconItem->requestedBy << contactId;
+                    }
+                    iconItem->lastRequest = QTime::currentTime();
+                    icons[i] = iconItem->icon;
+                } else {
+                    // needed icon is not in cache, so schedule it for retrieval
+                    CntIconCacheItem* iconItem = createIconCacheItem(iconName);
+                    iconItem->requestedBy << contactId;
+                    mIconFetcher->scheduleJob(new CntIconJob(iconName), row);
+                }
+            }
+        }
+
+        // set return text
+        text = infoItem->text;
+
+        // update cache order
+        infoItem->lastRequest = QTime::currentTime();
+    } else if (contactExists(contactId)) {
+        // contact exists but info is not in cache, so schedule it for retrieval
+        CntInfoCacheItem* item = createInfoCacheItem(contactId);
+        item->text = text;
+        mInfoFetcher->scheduleJob(new CntInfoJob(contactId), row);
+    } else {
+        return NULL;
+    }
+
+    name = contactName(contactId);
+
+    if (!mProcessingJobs && mJobsPostponed == JobsNotPostponed) {
+        // there might be new jobs now
+        mProcessingJobs = true;
+        HbApplication::instance()->postEvent(this, new QEvent(ProcessJobsEvent));
+    }
+
+    CNT_EXIT_ARGS("name:" << name << "text:" << text)
+
+    return new CntContactInfo(contactId, name, text, icons[0], icons[1]);
+}
+
+/*! 
+    Creates a list of contact ids sorted according the corresponding contact names.
+
+    \param idFilter the IDs to be returned; if NULL, all contact IDs are returned
+    \return the list of ids, sorted by contact name
+ */
+QList<QContactLocalId> CntCache::sortIdsByName(const QSet<QContactLocalId>* idFilter) const
+{
+    CNT_ENTRY
+
+    QList<QContactLocalId> sortedIds;
+    
+    // allocate memory in advance to avoid repeated reallocation during population
+    // an extra 16 items are allocated to leave room for a few more contacts
+    // before reallocation is needed
+    if (!idFilter) {
+        sortedIds.reserve(mSortedNames.count() + 16);
+    } else {
+        sortedIds.reserve(idFilter->count() + 16);
+    }
+
+    // the entries in mSortedNames are already sorted, so just pick
+    // out the ids from that list in the order that they appear
+    if (!idFilter) {
+        foreach (CntNameCacheItem* item, mSortedNames) {
+            sortedIds.append(item->contactId());
+        }
+    } else {
+        foreach (CntNameCacheItem* item, mSortedNames) {
+            if (idFilter->contains(item->contactId())) {
+                sortedIds.append(item->contactId());
+            }
+        }
+    }
+
+    CNT_EXIT
+
+    return sortedIds;
+}
+
+/*!
+    Overloaded version of the function for string based searching of contact
+    names. Currently for multi part names only space and dash variations are
+    used for filtering, e.g. "A B" matches "Beta, Alfa" and "Alfa, Beta",
+    but also "Gamma, Alfa-Beta" and "Gamma, Alfa Beta" and "Alfa Beta, Gamma".
+    
+    \param searchList list of strings to search for
+    \return the list of ids, sorted by contact name
+ */
+QList<QContactLocalId> CntCache::sortIdsByName(const QStringList &searchList) const
+{
+    CNT_ENTRY_ARGS("time:" << User::FastCounter());
+
+    QList<QContactLocalId> sortedIds;
+    QSet<int> checkedNames;
+    QStringList searchListSorted;
+
+    // the given search string must be ordered to descending order according to word length
+    // so the search algorithm finds the correct contacts, this prevents cases where search string
+    // is e.g. "ax axx" so names starting with "axxyyz axyz" don't cause any problems for the search
+    foreach (QString oneString, searchList) {
+        searchListSorted.append(oneString.toLower());
+    }
+    qSort(searchListSorted.begin(), searchListSorted.end(), qGreater<QString>());
+
+    for (int iter = 0; iter < mSortedNames.size(); iter++) {
+        int searchIndex;
+        QString currentName = (mSortedNames.at(iter))->name();
+        checkedNames.clear();
+
+        for (searchIndex = 0; searchIndex < searchListSorted.size(); searchIndex++) {
+            int currentPos;
+            int tempStartPos = 0;
+            for (currentPos = 0; currentPos <= currentName.length(); currentPos++) {
+                // at the moment only differentiating character is the space (" ")
+                if (currentPos == currentName.length() || currentName.at(currentPos) == ' ') {
+                    QString tempName = currentName.mid(tempStartPos, currentPos - tempStartPos);
+
+                    if (!checkedNames.contains(tempStartPos)
+                        && tempName.startsWith(searchListSorted.at(searchIndex), Qt::CaseInsensitive)) {
+                        checkedNames.insert(tempStartPos);
+                        break;
+                    }
+                    tempStartPos = ++currentPos;
+                }
+            }
+            // if the name is parsed completely through then it can't be a match
+            if (currentPos > currentName.length()) {
+                break;
+            }
+        }
+        // if the whole search parameter list is parsed, then the name must match the given search string
+        if (searchIndex == searchListSorted.size()) {
+            sortedIds.append(mSortedNames.at(iter)->contactId());
+        }
+    }
+
+    CNT_EXIT_ARGS("time:" << User::FastCounter());
+
+    return sortedIds;
+}
+
+/*!
+    Creates the CntCache singleton instance.
+ */
+CntCache::CntCache(QContactManager *manager)
+    : mContactManager(manager),
+      mNameFetcher(new CntNameFetcher()),
+      mInfoFetcher(new CntInfoFetcher(mContactManager)),
+      mIconFetcher(new CntIconFetcher()),
+      mProcessingJobs(false),
+      mJobsPostponed(JobsNotPostponed),
+      mIsInUrgencyMode(false),
+      mLastEmittedContactId(-1),
+      mHasModifiedNames(false),
+      mAllNamesFetchStarted(false)
+{
+    CNT_ENTRY
+
+    // listen to name fetcher
+    QObject::connect(mNameFetcher, SIGNAL(nameFormatChanged(CntNameOrder)),
+            this, SLOT(reformatNames(CntNameOrder)));
+    QObject::connect(mNameFetcher, SIGNAL(databaseAccessComplete()),
+            this, SLOT(resumeJobs()));
+    QObject::connect(mNameFetcher, SIGNAL(namesAvailable(QList<CntNameCacheItem *>)),
+            this, SLOT(setNameList(QList<CntNameCacheItem *>)));
+
+    // listen to info fetcher
+    QObject::connect(mInfoFetcher, SIGNAL(infoUpdated(QContactLocalId, const ContactInfoField &, const QString &)),
+            this, SLOT(updateCachedInfo(QContactLocalId, const ContactInfoField &, const QString &)));
+    QObject::connect(mInfoFetcher, SIGNAL(infoCancelled(QContactLocalId)),
+            this, SLOT(cancelInfoFetch(QContactLocalId)));
+
+    // listen to icon fetcher
+    QObject::connect(mIconFetcher, SIGNAL(iconFetched(const QString &, const HbIcon &)),
+            this, SLOT(updateCachedIcon(const QString &, const HbIcon &)));
+    QObject::connect(mIconFetcher, SIGNAL(iconCancelled(const QString &)),
+            this, SLOT(cancelIconFetch(const QString &)));
+
+    // listen to contact manager
+    QObject::connect(mContactManager, SIGNAL(contactsChanged(const QList<QContactLocalId>&)),
+            this, SLOT(updateContacts(const QList<QContactLocalId>&)));
+    QObject::connect(mContactManager, SIGNAL(contactsRemoved(const QList<QContactLocalId>&)),
+            this, SLOT(removeContacts(const QList<QContactLocalId>&)));
+    QObject::connect(mContactManager, SIGNAL(contactsAdded(const QList<QContactLocalId>&)),
+            this, SLOT(addContacts(const QList<QContactLocalId>&)));
+
+    // listen to timer events; this is for postponing and resuming jobs
+    mResumeJobsTimer.setSingleShot(true);
+    QObject::connect(&mResumeJobsTimer, SIGNAL(timeout()), this, SLOT(resumeJobs()));
+
+    // load all names to cache
+    loadNames();
+
+    CNT_EXIT
+}
+
+/*!
+    Destructs the CntCache singleton instance.
+ */
+CntCache::~CntCache()
+{
+    CNT_ENTRY
+
+    QObject::disconnect(this);
+
+    if (mHasModifiedNames) {
+        mNameFetcher->writeNamesToCache(mSortedNames);
+    }
+
+    delete mNameFetcher;
+    delete mInfoFetcher;
+    delete mIconFetcher;
+
+    qDeleteAll(mInfoCache);
+    mInfoCache.clear();
+
+    qDeleteAll(mIconCache);
+    mIconCache.clear();
+
+    qDeleteAll(mNameCache);
+    mNameCache.clear();
+
+    mSortedNames.clear();   // contains same data as mNameCache, so no qDeleteAll
+
+    CNT_EXIT
+}
+
+/*!
+    Postpones outstanding jobs until milliseconds ms has passed or resumeJobs() is called.
+    
+    \param postponement Type the type of postponement; UntilResume or ForDuration
+    \param milliseconds The duration of the delay
+ */
+void CntCache::postponeJobs(int postponementType, int duration)
+{
+    CNT_ENTRY_ARGS("ms =" << duration)
+
+    Q_ASSERT((postponementType == JobsPostponedUntilResume
+             || postponementType == JobsPostponedForDuration)
+             && duration >= 0);
+
+    mJobsPostponed = postponementType;
+    mResumeJobsTimer.stop();
+
+    if (postponementType == JobsPostponedForDuration) {
+        mResumeJobsTimer.start(duration);
+    }
+
+    CNT_EXIT_ARGS("type =" << mJobsPostponed)
+}
+
+/*!
+    Postpones outstanding jobs until resumeJobs() is called. This must always be called after
+    postponeJobs.
+ */
+void CntCache::resumeJobs()
+{
+    CNT_ENTRY
+
+    Q_ASSERT(!mProcessingJobs && mJobsPostponed != JobsNotPostponed);
+
+    mResumeJobsTimer.stop();
+    mJobsPostponed = JobsNotPostponed;
+    mProcessingJobs = true;
+    HbApplication::instance()->postEvent(this, new QEvent(ProcessJobsEvent));
+
+    CNT_EXIT
+}
+
+/*!
+    Listens for ProcessJobsEvents and calls processJobs() if there is such an event.
+ */
+bool CntCache::event(QEvent* event)
+{
+    if (event->type() == ProcessJobsEvent) {
+        processJobs();
+        return true;
+    }
+
+    return QObject::event(event);
+}
+
+/*!
+    Processes all scheduled jobs in all fetchers. The loop runs until all
+    jobs are done or postponed.
+ */
+void CntCache::processJobs()
+{
+    CNT_ENTRY
+
+    // process fetcher jobs in order of priority
+    forever {
+        // 1: has all jobs been postponed?
+        if (mJobsPostponed != JobsNotPostponed) {
+            CNT_EXIT_ARGS("jobs postponed")
+            mProcessingJobs = false;
+            return;
+
+        // 2: is there a request to fetch info?
+        } else if (mInfoFetcher->hasScheduledJobs()) {
+            mInfoFetcher->processNextJob();
+
+        // 3: is there a request to fetch an icon?
+        } else if (mIconFetcher->hasScheduledJobs()) {
+            // quit the loop; it will be started again when the icon has been fetched
+            if (!mIconFetcher->isProcessingJob()) {
+                mIconFetcher->processNextJob();
+            }
+            mProcessingJobs = false;
+            CNT_EXIT_ARGS("jobs postponed until icon fetch returns")
+            return;
+
+        // 4: are there any cancelled info jobs?
+        } else if (mInfoFetcher->hasCancelledJobs() && !mInfoFetcher->isProcessingJob()) {
+            mInfoFetcher->processNextJob();
+
+        // 5: are there any cancelled icon jobs?
+        } else if (mIconFetcher->hasCancelledJobs() && !mIconFetcher->isProcessingJob()) {
+            mIconFetcher->processNextJob();
+
+        // 6: is there an "all names" job?
+        } else if (mNameFetcher->hasScheduledJobs()) {
+            // fetch all contact names from the database so that the current
+            // list of names (from the file cache) can be synched with the
+            // database
+            if (!mNameFetcher->isProcessingJob()) {
+                mNameFetcher->processNextJob();
+            }
+            mProcessingJobs = false;
+            postponeJobs(JobsPostponedUntilResume);
+            CNT_EXIT_ARGS("jobs postponed while fetching all names")
+            return;
+
+        // 7: are there contacts left to precache?
+        } else if (mReadAheadCache.count() > 0) {
+            int contactId = mReadAheadCache.first().first;
+            int contactRow = mReadAheadCache.takeFirst().second;
+            if (!mInfoCache.contains(contactId) && contactExists(contactId)) {
+                // contact exists, but is not in cache, so schedule it for retrieval
+                CntInfoCacheItem* item = createInfoCacheItem(contactId);
+                item->text = EmptyTextField;
+                mInfoFetcher->scheduleJob(new CntInfoJob(contactId), contactRow);
+            }
+        // nothing more to do, so exit loop
+        } else {
+            mProcessingJobs = false;
+            CNT_EXIT_ARGS("no more jobs")
+            return;
+        }
+
+        // allow events to be handled before continuing with the next job
+        HbApplication::processEvents();
+    }
+}
+
+/*! 
+    Processes a new info field that has arrived from the info fetcher.
+    If the contact is in the info cache, then the info cache is updated
+    accordingly.
+    
+    A contactInfoUpdated() signal is usually also emitted. The exception is if
+    the info is the name of an icon and that icon is not in the icon cache. In
+    this case the icon is scheduled to be fetched and a signal will eventually
+    be emitted when the icon has been fetched (or cancelled).
+ */
+void CntCache::updateCachedInfo(QContactLocalId contactId, const ContactInfoField& infoField, const QString& infoValue)
+{
+    CNT_ENTRY_ARGS( "id:" << contactId   << "infotype:" << infoField   << "infovalue:" << infoValue )
+
+    Q_ASSERT(infoField == ContactInfoTextField || infoField == ContactInfoIcon1Field || infoField == ContactInfoIcon2Field);
+
+    bool hasNewInfo;
+
+    if (!mInfoCache.contains(contactId)) {
+        // contact is not in cache, so nothing needs to be done except notify
+        // clients that this contact has (possibly) been changed
+        hasNewInfo = true;
+    } else if (infoField == ContactInfoTextField) {
+        // update cache with new text for contact
+        mInfoCache.value(contactId)->text = infoValue;
+        hasNewInfo = true;
+    } else {
+        // update cache with new icon name for contact
+        int iconIndex = (infoField == ContactInfoIcon1Field ? 0 : 1);
+        CntInfoCacheItem* item = mInfoCache.value(contactId);
+        QString iconName = infoValue;
+        if (item->icons[iconIndex] != iconName) {
+            item->icons[iconIndex] = iconName;
+            if (iconName.isEmpty()) {
+                hasNewInfo = true;
+            } else if (mIconCache.contains(iconName)) {
+                hasNewInfo = true;
+            } else if (iconName.startsWith("qtg_", Qt::CaseInsensitive)) {
+                CntIconCacheItem* iconItem = createIconCacheItem(iconName);
+                iconItem->icon = HbIcon(iconName);
+                hasNewInfo = true;
+            } else {
+                CntIconCacheItem* iconItem = createIconCacheItem(iconName);
+                iconItem->requestedBy << contactId;
+                QList<CntNameCacheItem*>::iterator pos = qLowerBound(mSortedNames.begin(), mSortedNames.end(), mNameCache.value(contactId), CntNameFetcher::compareNames);
+                while (pos != mSortedNames.end() && (*pos)->contactId() != contactId) {
+                    ++pos;
+                }
+                mIconFetcher->scheduleJob(new CntIconJob(iconName), pos - mSortedNames.begin());
+                hasNewInfo = false;
+            }
+        } else {
+            hasNewInfo = false;
+        }
+    }
+
+    if (hasNewInfo) {
+        emitContactInfoUpdated(contactId);
+    }
+
+    if (!mProcessingJobs && mJobsPostponed == JobsNotPostponed) {
+        // there might be new jobs now
+        mProcessingJobs = true;
+        HbApplication::instance()->postEvent(this, new QEvent(ProcessJobsEvent));
+    }
+
+    CNT_EXIT
+}
+
+/*! 
+    Handle the case where a request for contact info is cancelled by the
+    info fetcher because of too many scheduled jobs.
+ */
+void CntCache::cancelInfoFetch(QContactLocalId contactId)
+{
+    CNT_ENTRY_ARGS( "cid =" << contactId )
+
+    if (mInfoCache.contains(contactId)) {
+        delete mInfoCache.take(contactId);
+    }
+
+    emitContactInfoUpdated(contactId);
+
+    CNT_EXIT
+}
+
+/*! 
+    Processes a new icon that has arrived from the icon fetcher.
+    The icon cache is updated and a contactInfoUpdated() signal is
+    emitted.
+ */
+void CntCache::updateCachedIcon(const QString& iconName, const HbIcon& icon)
+{
+    CNT_ENTRY_ARGS( "icon =" << iconName )
+
+    if (mIconCache.contains(iconName)) {
+        CntIconCacheItem* item = mIconCache.value(iconName);
+        item->icon = icon;
+        foreach (QContactLocalId contactId, item->requestedBy) {
+            emitContactInfoUpdated(contactId);
+        }
+        item->requestedBy.clear();
+
+        if (!mProcessingJobs && mJobsPostponed == JobsNotPostponed) {
+            // there might still be unfinished icon jobs; only one icon job is
+            // done at a time
+            mProcessingJobs = true;
+            HbApplication::instance()->postEvent(this, new QEvent(ProcessJobsEvent));
+        }
+    }
+
+    CNT_EXIT
+}
+
+/*! 
+    Handle the case where a request for an icon is cancelled by the icon
+    fetcher because of too many scheduled jobs.
+ */
+void CntCache::cancelIconFetch(const QString& iconName)
+{
+    CNT_ENTRY_ARGS(iconName)
+
+    if (mIconCache.contains(iconName)) {
+        CntIconCacheItem* item = mIconCache.take(iconName);
+        foreach (QContactLocalId contactId, item->requestedBy) {
+            emitContactInfoUpdated(contactId);
+        }
+        delete item;
+    }
+
+    CNT_EXIT
+}
+
+/*! 
+    Creates a new item in the info cache. If the cache is full,
+    then the least recently accessed item is removed from cache.
+    
+    /param contactId id of contact for which to create the new cache item
+    /return the newly created cache item
+ */
+CntInfoCacheItem * CntCache::createInfoCacheItem(QContactLocalId contactId)
+{
+    CNT_ENTRY_ARGS(contactId)
+
+    if (mInfoCache.count() >= InfoCacheSize) {
+        // cache is full, so remove the oldest contact
+        CntInfoCacheItem* oldestItem = NULL;
+        QTime oldestRequest;
+
+        foreach (CntInfoCacheItem* i, mInfoCache) {
+            if (oldestItem == NULL || i->lastRequest < oldestRequest) {
+                oldestRequest = i->lastRequest;
+                oldestItem = i;
+            }
+        }
+
+        if (oldestItem != NULL) {
+            mInfoCache.remove(oldestItem->contactId);
+            delete oldestItem;
+        }
+    }
+    
+    // create and insert the new item
+    CntInfoCacheItem* item = new CntInfoCacheItem();
+    item->contactId = contactId;
+    item->lastRequest = QTime::currentTime();
+    mInfoCache.insert(contactId, item);
+    
+    CNT_EXIT
+
+    return item;
+}
+
+/*! 
+    Creates a new item in the icon cache. If the cache is full,
+    then the least recently accessed item is removed from cache.
+    
+    /param iconName name of the icon for which to create the new cache item
+    /return the newly created cache item
+ */
+CntIconCacheItem* CntCache::createIconCacheItem(const QString& iconName)
+{
+    CNT_ENTRY_ARGS(iconName)
+
+    if (mIconCache.count() >= IconCacheSize) {
+        // cache is full, so remove the oldest icon
+        CntIconCacheItem* oldestItem = NULL;
+        QTime oldestRequest;
+
+        foreach (CntIconCacheItem* i, mIconCache) {
+            if (oldestItem == NULL || i->lastRequest < oldestRequest) {
+                oldestRequest = i->lastRequest;
+                oldestItem = i;
+            }
+        }
+
+        if (oldestItem) {
+            mIconCache.remove(oldestItem->iconName);
+            delete oldestItem;
+        }
+    }
+
+    // create and insert the new item
+    CntIconCacheItem* item = new CntIconCacheItem();
+    item->iconName = iconName;
+    item->lastRequest = QTime::currentTime();
+    mIconCache.insert(iconName, item);
+
+    CNT_EXIT
+
+    return item;
+}
+
+/*!
+    Notifies clients that a contact might have changed.
+    Clients can then request the info via fetchContactInfo() 
+    if they are interested.
+ */
+void CntCache::emitContactInfoUpdated(QContactLocalId contactId)
+{
+	CNT_ENTRY_ARGS(contactId)
+
+    mLastEmittedContactId = contactId;
+    emit contactInfoUpdated(contactId);
+    mLastEmittedContactId = -1;
+
+	CNT_EXIT
+}
+
+/*! 
+    Collects all contact IDs near the latest fetch from the UI. These will be fetched and
+    precached when UI activity slows down.
+
+    \param mostRecentRow the row of the contact that was most recently fetched
+    \param idList a list with all the IDs in the list
+ */
+void CntCache::updateReadAheadCache(int mostRecentRow, const QList<QContactLocalId>& idList)
+{
+    CNT_ENTRY_ARGS(mostRecentRow)
+
+    int row;
+
+    mReadAheadCache.clear();
+
+    // step through the area near to last fetch item and make sure all
+    // contacts in it are also in cache or in the read ahead list
+    for (int i = 1; i <= ItemsToCacheAhead; ++i) {
+        for (int j = 0; j < 2; ++j) {
+            if (j == 0) {
+                row = mostRecentRow - i;
+                if (row < 0) {
+                    continue;
+                }
+            } else {
+                row = mostRecentRow + i;
+                if (row >= idList.count()) {
+                    continue;
+                }
+            }
+            
+            int contactId = idList.at(row);
+            if (!mInfoCache.contains(contactId)) {
+                // contact is not in cache, so put the id to items to read into cache
+                mReadAheadCache.append(QPair<QContactLocalId, int>(contactId, row));
+            } else {
+                // contact is in cache; update lastRequest as we want to keep this item in cache
+                mInfoCache.value(contactId)->lastRequest = QTime::currentTime();
+            }
+        }
+    }
+
+    CNT_EXIT
+}
+
+/*!
+    Starts the urgency mode, where all contact info is fetched immediately,
+    regardless of whether there is activity in the UI or not.
+ */
+void CntCache::startUrgencyMode()
+{
+    CNT_ENTRY
+
+    mIsInUrgencyMode = true;
+    QTimer::singleShot(UrgencyModeDuration, this, SLOT(stopUrgencyMode()));
+
+    CNT_EXIT
+}
+
+/*!
+    Starts the urgency mode, where all contact info is fetched immediately,
+    regardless of whether there is activity in the UI or not.
+ */
+void CntCache::stopUrgencyMode()
+{
+    CNT_ENTRY
+
+    mIsInUrgencyMode = false;
+
+    CNT_EXIT
+}
+
+/*!
+    Fetch the names of all contacts.
+ */
+void CntCache::loadNames()
+{
+    CNT_ENTRY
+    
+    // read names from file cache
+    mNameFetcher->readNamesFromCache(mSortedNames);
+
+    // insert the names into the id-to-name map
+    foreach (CntNameCacheItem* item, mSortedNames) {
+        mNameCache.insert(item->contactId(), item);
+    }
+
+    // schedule the job for reading all names from the database; it will be processed once
+    // info and icons for the first screenful of contacts have been read
+    mNameFetcher->scheduleJob(new CntAllNamesJob());
+    mProcessingJobs = true;
+    HbApplication::instance()->postEvent(this, new QEvent(ProcessJobsEvent));
+
+    CNT_EXIT
+}
+
+/*!
+    Checks whether a contact exists.
+ */
+bool CntCache::contactExists(QContactLocalId contactId) const
+{
+    CNT_ENTRY_ARGS(contactId)
+    CNT_EXIT_ARGS(mNameCache.contains(contactId))
+
+    return mNameCache.contains(contactId);
+}
+
+/*!
+    Fetch the name of one contact.
+ */
+QString CntCache::contactName(QContactLocalId contactId) const
+{
+    CNT_ENTRY_ARGS(contactId)
+
+    QString name;
+
+    QHash<QContactLocalId, CntNameCacheItem*>::const_iterator i = mNameCache.find(contactId);
+    if (i != mNameCache.end()) {
+        name = i.value()->name();
+    }
+
+    CNT_EXIT_ARGS(name)
+
+    return name;
+}
+
+/*! 
+    Updates the names in cache according to newFormat.
+
+    \param newFormat the new name format, e.g. "Lastname, Firstname"
+ */
+void CntCache::reformatNames(CntNameOrder newFormat)
+{
+	CNT_ENTRY
+
+    foreach (CntNameCacheItem* item, mSortedNames) {
+        item->setNameFormat(newFormat);
+    }
+
+    mNameFetcher->sortNames(mSortedNames);
+    mNameFetcher->writeNamesToCache(mSortedNames);
+    mHasModifiedNames = false;
+
+    emit dataChanged();
+
+	CNT_EXIT
+}
+
+/*! 
+    Replaces the names in cache with the ones in this list.
+    
+    \param newSortedNames the sorted list with names; this list will be cleared and
+                          ownership will be taken of the items in the list
+ */
+void CntCache::setNameList(QList<CntNameCacheItem *> newSortedNames)
+{
+    CNT_ENTRY
+    
+    bool hasModifiedContacts = false;
+    int count = newSortedNames.count();
+
+    CNT_LOG_ARGS("curr_count=" << mSortedNames.count() << "db_count=" << count);
+
+    // check if there have been any changes
+    if (mSortedNames.count() != count) {
+        hasModifiedContacts = true;
+    } else {
+        for (int i = 0; i < count; ++i) {
+            CntNameCacheItem *oldItem = mSortedNames.at(i);
+            CntNameCacheItem *newItem = newSortedNames.at(i);
+            CNT_LOG_ARGS("name=" << oldItem->name());
+            if (oldItem->contactId() != newItem->contactId() || oldItem->name() != newItem->name()) {
+                hasModifiedContacts = true;
+                break;
+            }
+        }
+    }
+
+    // the list has changed, so use the new list instead
+    if (hasModifiedContacts) {
+    	CNT_LOG_ARGS("has modified contacts -> use new list")
+        qDeleteAll(mSortedNames);
+        mNameCache.clear();
+        mSortedNames.clear();
+        
+        foreach (CntNameCacheItem* item, newSortedNames) {
+            mSortedNames.append(item);
+            mNameCache.insert(item->contactId(), item);
+        }
+        
+        // write names to file cache
+        mNameFetcher->writeNamesToCache(mSortedNames);
+        
+        // notify clients that the list of names has changed
+        emit dataChanged();
+    } else {
+        qDeleteAll(newSortedNames);
+    }
+    
+    CNT_EXIT
+}
+
+/*! 
+    Updates data in response to some contacts having changed and
+    then notifies observers that these contacts have changed.
+ */
+void CntCache::updateContacts(const QList<QContactLocalId> &changedContacts)
+{
+	CNT_ENTRY
+
+    QString name;
+    QList<CntNameCacheItem*> items;
+
+    // reloads the names of the changed contacts and updates the
+    // list of sorted names accordingly
+    foreach (QContactLocalId contactId, changedContacts) {
+        CntNameCacheItem *newItem = mNameFetcher->fetchOneName(contactId);
+        if (newItem != NULL) {
+            CntNameCacheItem *oldItem = mNameCache.value(contactId);
+            if (oldItem->name() != newItem->name()) {
+                QList<CntNameCacheItem*>::iterator oldPos = qLowerBound(mSortedNames.begin(), mSortedNames.end(), oldItem, CntNameFetcher::compareNames);
+                while (oldPos != mSortedNames.end() && *oldPos != oldItem) {
+                     ++oldPos;
+                }
+                QList<CntNameCacheItem*>::iterator newPos = qUpperBound(mSortedNames.begin(), mSortedNames.end(), newItem, CntNameFetcher::compareNames);
+                if (oldPos < newPos) {
+                    mSortedNames.move(oldPos - mSortedNames.begin(), (newPos - mSortedNames.begin()) - 1);
+                } else {
+                    mSortedNames.move(oldPos - mSortedNames.begin(), newPos - mSortedNames.begin());
+                }
+                *oldItem = *newItem;
+                mHasModifiedNames = true;
+            }
+        }
+    }
+
+    // if any of the changed items have cached info, the info
+    // is scheduled for refreshing
+    foreach (QContactLocalId contactId, changedContacts) {
+        if (mInfoCache.contains(contactId)) {
+            QList<CntNameCacheItem*>::iterator pos = qLowerBound(mSortedNames.begin(), mSortedNames.end(), mNameCache.value(contactId), CntNameFetcher::compareNames);
+            while (pos != mSortedNames.end() && (*pos)->contactId() != contactId) {
+                ++pos;
+            }
+            mInfoFetcher->scheduleJob(new CntInfoJob(contactId), pos - mSortedNames.begin());
+        }
+    }
+
+    // inform clients about these changes
+    emit contactsChanged(changedContacts);
+
+    if (!mProcessingJobs && mJobsPostponed == JobsNotPostponed) {
+        // there might be new jobs now
+        mProcessingJobs = true;
+        HbApplication::instance()->postEvent(this, new QEvent(ProcessJobsEvent));
+    }
+
+	CNT_EXIT
+}
+
+/*! 
+    Updates data in response to some contacts having been removed
+    and then notifies observers that the contacts have been removed.
+ */
+void CntCache::removeContacts(const QList<QContactLocalId> &removedContacts)
+{
+	CNT_ENTRY
+
+    // removed the deleted contacts from the name cache and from the
+    // list of sorted names
+    foreach (QContactLocalId contactId, removedContacts) {
+        if (mNameCache.contains(contactId)) {
+            CntNameCacheItem *item = mNameCache.take(contactId);
+            QList<CntNameCacheItem*>::iterator pos = qLowerBound(mSortedNames.begin(), mSortedNames.end(), item, CntNameFetcher::compareNames);
+            while (*pos != item && pos != mSortedNames.end()) {
+                ++pos;
+            }
+            mSortedNames.erase(pos);
+            delete item;
+            mHasModifiedNames = true;
+        }
+    }
+
+    // info for these deleted items should be removed from cache
+    foreach (QContactLocalId contactId, removedContacts) {
+        if (mInfoCache.contains(contactId)) {
+            CntInfoCacheItem* item = mInfoCache.take(contactId);
+            delete item;
+        }
+    }
+
+    // inform clients about these deleted contacts
+    emit contactsRemoved(removedContacts);
+
+	CNT_EXIT
+}
+
+/*! 
+    Updates data in response to some contacts having been added
+    and then notifies observers that the contacts have been added.
+ */
+void CntCache::addContacts(const QList<QContactLocalId> &addedContacts)
+{
+	CNT_ENTRY
+
+    // add the new contacts to the name cache and to the
+    // list of sorted names
+    foreach (QContactLocalId contactId, addedContacts) {
+        CntNameCacheItem *item = mNameFetcher->fetchOneName(contactId);
+        if (item != NULL) {
+            mNameCache.insert(contactId, item);
+            QList<CntNameCacheItem*>::iterator i = qUpperBound(mSortedNames.begin(), mSortedNames.end(), item, CntNameFetcher::compareNames);
+            mSortedNames.insert(i, item);
+            mHasModifiedNames = true;
+        }
+    }
+
+    // inform clients about the new contacts
+    emit contactsAdded(addedContacts);
+
+	CNT_EXIT
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cntcache.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,147 @@
+/*
+* Copyright (c) 2010 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: Asynchronously fetches and caches visual contact info for
+*              e.g. list views.
+*
+*/
+
+#ifndef CNTCACHE_H
+#define CNTCACHE_H
+
+#include <QObject>
+#include <QTimer>
+#include <QSet>
+#include <HbIcon>
+#include <cntuids.h>
+#include <qcontactmanager.h>
+#include <cntinfoprovider.h>
+
+class CntNameFetcher;
+class CntInfoFetcher;
+class CntIconFetcher;
+class CntNameCacheItem;
+class CntInfoCacheItem;
+class CntIconCacheItem;
+
+QTM_USE_NAMESPACE
+
+class CntContactInfo : public QObject
+{
+    Q_OBJECT
+public:
+    CntContactInfo(QContactLocalId id,
+                   const QString& name,
+                   const QString& text,
+                   const HbIcon& icon1,
+                   const HbIcon& icon2)
+    {
+        mId = id;
+        mName = name;
+        mText = text;
+        mIcon1 = icon1;
+        mIcon2 = icon2;
+    }
+    ~CntContactInfo() {}
+
+    int id() const { return mId; }
+    QString name() const { return mName; }
+    QString text() const { return mText; }
+    HbIcon icon1() const { return mIcon1; }
+    HbIcon icon2() const { return mIcon2; }
+
+private:
+    QContactLocalId mId;
+    QString mName;
+    QString mText;
+    HbIcon mIcon1;
+    HbIcon mIcon2;
+};
+
+class CntCache : public QObject
+{
+    Q_OBJECT
+public:
+    static CntCache* createSession(void *client, QContactManager *manager);
+    void closeSession(void *client);
+
+    CntContactInfo* fetchContactInfo(int row, const QList<QContactLocalId>& idList);
+    QList<QContactLocalId> sortIdsByName(const QSet<QContactLocalId>* idFilter = NULL) const;
+    QList<QContactLocalId> sortIdsByName(const QStringList &searchList) const;
+
+    bool event(QEvent *event);
+
+signals:
+    void contactInfoUpdated(QContactLocalId contactId);
+    void contactsChanged(const QList<QContactLocalId> &changedContacts);
+    void contactsRemoved(const QList<QContactLocalId> &removedContacts);
+    void contactsAdded(const QList<QContactLocalId> &addedContacts);
+    void dataChanged();
+
+private slots:
+    void startUrgencyMode();
+    void stopUrgencyMode();
+    void processJobs();
+    void postponeJobs(int postponementType, int duration = 0);
+    void resumeJobs();
+
+    void updateCachedInfo(QContactLocalId contactId, const ContactInfoField &infoField, const QString &infoValue);
+    void cancelInfoFetch(QContactLocalId contactId);
+    void updateCachedIcon(const QString &iconName, const HbIcon &icon);
+    void cancelIconFetch(const QString &iconName);
+
+    void updateContacts(const QList<QContactLocalId> &changedContacts);
+    void removeContacts(const QList<QContactLocalId> &removedContacts);
+    void addContacts(const QList<QContactLocalId> &addedContacts);
+
+    void reformatNames(CntNameOrder newFormat);
+    void setNameList(QList<CntNameCacheItem *> newSortedNames);
+
+private:
+    CntCache(QContactManager *manager);
+    ~CntCache();
+    void loadNames();
+    bool contactExists(QContactLocalId contactId) const;
+    QString contactName(QContactLocalId contactId) const;
+    CntInfoCacheItem* createInfoCacheItem(QContactLocalId contactId);
+    CntIconCacheItem* createIconCacheItem(const QString &iconName);
+    void updateReadAheadCache(int mostRecentRow, const QList<QContactLocalId> &idList);
+    void emitContactInfoUpdated(QContactLocalId contactId);
+
+private:
+    static CntCache *mInstance;                 // the one and only instance of CntCache
+    QSet<void*> mClients;                       // the current clients of cache
+
+    QContactManager *mContactManager;           // for getting notifications about changes to contacts
+    CntNameFetcher *mNameFetcher;               // fetches contact names
+    CntInfoFetcher *mInfoFetcher;               // fetches secondary text and icon paths
+    CntIconFetcher *mIconFetcher;               // fetches icons
+
+    QList<CntNameCacheItem *> mSortedNames;                                 // list of all contact names, in sorted order
+    QHash<QContactLocalId, CntNameCacheItem *> mNameCache;                  // cache with all contact names, indexed by contact id
+    QHash<QContactLocalId, CntInfoCacheItem *> mInfoCache;                  // cache with recent contact info, indexed by contact id
+    QHash<QString, CntIconCacheItem *> mIconCache;                          // cache with recent icons, indexed by contact id and icon name
+    QList<QPair<QContactLocalId, int> > mReadAheadCache;                    // cache with contacts to prefetch (they are likely to be needed soon)
+
+    QTimer mResumeJobsTimer;                    // timer used to resume postponed jobs
+    bool mProcessingJobs;                       // true from when job loop event has been posted until job loop exits
+    int mJobsPostponed;                         // are jobs postponed (no / for some time / until further notice)
+    bool mIsInUrgencyMode;                      // true if cache is in urgency mode; secondary info is fetched immediately
+    int mLastEmittedContactId;                  // id of the last contact emitted to UI
+    bool mHasModifiedNames;                     // monitors whether any names have changed since file cache was last updated
+    bool mAllNamesFetchStarted;                 // false until the asynch fetching of all names from the DB has started;
+                                                // this operation is done only once
+    friend class TestCntCache;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cntcacheitems.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,145 @@
+/*
+* Copyright (c) 2010 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: Classes for each of the items (name, info and icon) in cache.
+*
+*/
+
+#include <cntcacheitems.h>
+
+/*!
+    \class CntNameCacheItem
+    \brief Represents one name entry in cache.
+    
+    CntNameCacheItem wraps functionality for efficiently storing, serializing
+    and changing the display format of one name in cache.
+
+    \class CntInfoCacheItem
+    \brief Holds data for info entry in cache.
+
+    \class CntIconCacheItem
+    \brief Holds data for icon entry in cache.
+ */
+
+/*!
+    Creates a CntNameCacheItem object.
+ */
+CntNameCacheItem::CntNameCacheItem(QContactLocalId id, const QString& firstName, const QString& lastName, CntNameOrder nameFormat)
+{
+    mContactId = id;
+    setFormattedName(firstName, lastName, nameFormat);
+}
+
+/*!
+    Destroys the CntNameCacheItem object.
+ */
+CntNameCacheItem::~CntNameCacheItem()
+{
+}
+
+/*!
+    Changes the format used to present the name.
+ */
+void CntNameCacheItem::setNameFormat(CntNameOrder newFormat)
+{
+    QString firstName = mName.mid(mFirstNamePosition&0xffff, mFirstNamePosition>>16);
+    QString lastName = mName.mid(mLastNamePosition&0xffff, mLastNamePosition>>16);
+    setFormattedName(firstName, lastName, newFormat);
+}
+
+/*!
+    Copies the contents of the other cache item to this one.
+ */
+void CntNameCacheItem::operator=(const CntNameCacheItem &other)
+{
+    mContactId = other.mContactId;
+    mFirstNamePosition = other.mFirstNamePosition;
+    mLastNamePosition = other.mLastNamePosition;
+    mName = other.mName;
+}
+
+/*!
+    Externalizes a CntNameCacheItem object.
+ */
+void CntNameCacheItem::externalize(QDataStream &stream)
+{
+    stream << mContactId;
+    stream << mFirstNamePosition;
+    stream << mLastNamePosition;
+    stream << mName;
+}
+
+/*!
+    Internalizes a CntNameCacheItem object.
+ */
+CntNameCacheItem* CntNameCacheItem::internalize(QDataStream &stream, CntNameOrder nameFormat)
+{
+    quint32 id;
+    quint32 firstNamePosition;
+    quint32 lastNamePosition;
+    QString name;
+    
+    stream >> id;
+    stream >> firstNamePosition;
+    stream >> lastNamePosition;
+    stream >> name;
+    
+    QString firstName = name.mid(firstNamePosition&0xffff, firstNamePosition>>16);
+    QString lastName = name.mid(lastNamePosition&0xffff, lastNamePosition>>16);
+
+    return new CntNameCacheItem(id, firstName, lastName, nameFormat);
+}
+
+/*!
+    Sets the formatted name and positions of the first name and last name,
+    according to the name format in the parameter.
+ */
+void CntNameCacheItem::setFormattedName(const QString& firstName, const QString& lastName, CntNameOrder nameFormat)
+{
+    int firstNameLength = firstName.length();
+    int lastNameLength = lastName.length();
+
+    if (lastNameLength == 0) {
+        mName = firstName;
+        mFirstNamePosition = firstNameLength << 16;
+        mLastNamePosition = 0;
+    } else if (firstNameLength == 0) {
+        mName = lastName;
+        mFirstNamePosition = 0;
+        mLastNamePosition = lastNameLength << 16;
+    } else {
+        if (nameFormat == CntOrderLastFirst) {
+            mName = lastName + " " + firstName;
+            mFirstNamePosition = (firstNameLength << 16) | (lastNameLength + 1);
+            mLastNamePosition = (lastNameLength << 16);
+        } else if (nameFormat == CntOrderLastCommaFirst) {
+            mName = lastName + ", " + firstName;
+            mFirstNamePosition = (firstNameLength << 16) | (lastNameLength + 2);
+            mLastNamePosition = (lastNameLength << 16);
+        } else {
+            mName = firstName + " " + lastName;
+            mFirstNamePosition = (firstNameLength << 16);
+            mLastNamePosition = (lastNameLength << 16) | (firstNameLength + 1);
+        }
+    }
+}
+
+QString CntNameCacheItem::firstName() const
+{
+    return mName.mid(mFirstNamePosition&0xffff, mFirstNamePosition>>16);
+}
+
+QString CntNameCacheItem::lastName() const
+{
+    return mName.mid(mLastNamePosition&0xffff, mLastNamePosition>>16);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cntcacheitems.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,69 @@
+/*
+* Copyright (c) 2010 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: Classes for each of the items (name, info and icon) in cache.
+*
+*/
+
+#ifndef CNTCACHEITEMS_H
+#define CNTCACHEITEMS_H
+
+#include <HbIcon>
+#include <qtcontacts.h>
+#include <cntuids.h>
+
+QTM_USE_NAMESPACE
+
+class CntNameCacheItem
+{
+public:
+    CntNameCacheItem(QContactLocalId id, const QString &firstName, const QString &lastName, CntNameOrder nameFormat);
+    ~CntNameCacheItem();
+    QContactLocalId contactId() const { return mContactId; }
+    QString name() const { return mName; }
+    QString firstName() const;
+    QString lastName() const;
+    void setNameFormat(CntNameOrder newFormat);
+    void operator=(const CntNameCacheItem &other);
+    void externalize(QDataStream &stream);
+    static CntNameCacheItem* internalize(QDataStream &stream, CntNameOrder nameFormat);
+
+private:
+    void setFormattedName(const QString &firstName, const QString &lastName, CntNameOrder nameFormat);
+
+private:
+    QContactLocalId mContactId; // database contact id for this name
+    int mFirstNamePosition;     // length << 16 | offset
+    int mLastNamePosition;      // length << 16 | offset
+    QString mName;              // formatted name
+};
+
+class CntInfoCacheItem
+{
+public:
+    QContactLocalId contactId;
+    QString text;
+    QString icons[2];
+    QTime lastRequest;
+};
+
+class CntIconCacheItem
+{
+public:
+    QString iconName;
+    HbIcon icon;
+    QList<QContactLocalId> requestedBy;
+    QTime lastRequest;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cntdefaultinfoprovider.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2010 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: Default info provider plugin for CntListModel. It can provide
+*              the phone number and the image url of a contact (text and
+*              icon1 field respectively).
+*
+*/
+
+#include <qtcontacts.h>
+#include "cntdefaultinfoprovider.h"
+#include <hbglobal.h>
+
+/*!
+    /return the info fields supported by this provider
+ */
+ContactInfoFields CntDefaultInfoProvider::supportedFields() const
+{
+    // this provider does not have any info for the icon2 field
+    return ContactInfoIcon1Field | ContactInfoTextField;
+}
+
+/*!
+    The contact contains all the info this provider needs, so signals with the requested info
+    fields are emitted immediately.
+
+    /param contact the contact for which info is requested
+    /param requestedInfo one or more of the flags in ContactInfoFields
+ */
+void CntDefaultInfoProvider::requestInfo(const QContact& contact, ContactInfoFields requestedInfo)
+{
+    if (requestedInfo & ContactInfoTextField) {
+        QContactDetail detail = contact.preferredDetail("call");
+        QString number;
+        
+        if (!detail.isEmpty())
+        {
+            number = static_cast<QContactPhoneNumber>(detail).number();
+        }
+        else
+        {
+            QList<QContactPhoneNumber> numbers = contact.details<QContactPhoneNumber>();
+            if (numbers.count() > 1)
+                number = hbTrId("txt_phob_dblist_val_ln_numbers", numbers.count());
+            else if (numbers.count() == 1)
+                number = numbers.at(0).number();
+        }
+
+        emit infoFieldReady(this, contact.localId(), ContactInfoTextField, number);
+    }
+
+    if (requestedInfo & ContactInfoIcon1Field) {
+        QString imageUrl = contact.detail<QContactAvatar>().imageUrl().toString();
+        emit infoFieldReady(this, contact.localId(), ContactInfoIcon1Field, imageUrl);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cntdefaultinfoprovider.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,46 @@
+/*
+* Copyright (c) 2010 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: Default info provider plugin for CntListModel. It can provide
+*              the phone number and the image url of a contact (text and
+*              icon1 field respectively).
+*
+*/
+
+#ifndef CNTDEFAULTPROVIDER_H
+#define CNTDEFAULTPROVIDER_H
+
+#include <cntinfoprovider.h>
+#include <qcontact.h>
+
+QTM_USE_NAMESPACE
+
+/*
+   The default info provider plugin. It can provide the phone number and the
+   image url of a contact (text and icon1 field respectively).
+ */
+class CntDefaultInfoProvider : public CntInfoProvider
+{
+    friend class TestCntDefaultInfoProvider;
+    Q_OBJECT
+    
+public:
+    QString id() const { return "default"; };
+    ContactInfoFields supportedFields() const;
+    void requestInfo(const QContact& contact, ContactInfoFields requestedInfo);
+    
+signals:
+    void infoFieldReady(CntInfoProvider* sender, int contactId, ContactInfoField field, const QString& value);
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cntdisplaytextformatter.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,100 @@
+/*
+* 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 "cntdisplaytextformatter.h"
+#include <qcontactdetailfilter.h>
+#include <qcontactdisplaylabel.h>
+#include <hbcolorscheme.h>
+#include <cntdebug.h>
+#include <QStringList>
+
+CntHTMLDisplayTextFormatter::CntHTMLDisplayTextFormatter()
+{
+}
+
+CntHTMLDisplayTextFormatter::~CntHTMLDisplayTextFormatter()
+{
+}
+   
+QString CntHTMLDisplayTextFormatter::formattedText( const QString aText, const QContactFilter& aCriteria )
+{
+    CNT_LOG_ARGS( "filter:" << aText )
+    
+    QString foundPattern;
+    QString pattern;
+    QString tempDash;
+    QString tempSpace;
+    const QChar dash = '-';
+    const QChar space = ' ';
+    
+    if ( aCriteria.type() == QContactFilter::ContactDetailFilter ) 
+    {
+        const QContactDetailFilter& filter = static_cast<const QContactDetailFilter&>( aCriteria );
+        if ( filter.detailDefinitionName() == QContactDisplayLabel::DefinitionName && 
+             filter.matchFlags() & QContactFilter::MatchStartsWith )
+        {
+            QString formattedText;
+            // go through the words (e.g. Lastname, Firstname) and apply list of pattern to them.
+            foreach ( QString text, aText.split(QRegExp("\\s+"), QString::SkipEmptyParts) )
+            {
+                foundPattern = "";
+                bool match( false );
+                // go through every search criteria word
+                foreach (pattern, filter.value().toStringList())
+                {
+                    tempDash = pattern;
+                    tempSpace = pattern;
+                    tempDash.insert(0, dash);
+                    tempSpace.insert(0, space);
+                    
+                    if ( text.startsWith(pattern, Qt::CaseInsensitive) )
+                    {
+                        match = true;
+                        if (pattern.length() > foundPattern.length())
+                            foundPattern = pattern;
+                    }
+                }
+                
+                // if no match found, original text is returned
+                if ( !match )
+                    formattedText.append( text );
+                // if match is found then the longest variation of the pattern is high lighted, e.g. "a ab" 
+                else
+                {
+                    insertTag( text, foundPattern.length() );
+                    formattedText.append( text );
+                }
+                
+                // put spaces back between words (split() looses them)
+                formattedText.append( " " );
+            }
+            return formattedText.trimmed();
+        }
+    }
+    return aText;
+}
+
+void CntHTMLDisplayTextFormatter::insertTag( QString& aText, int aChars )
+{
+    QColor highlight = HbColorScheme::color("qtc_lineedit_marker_normal");
+    QColor color = HbColorScheme::color("qtc_lineedit_selected");
+    
+    QString start = QString(TAG_START).arg( highlight.name().toUpper() ).arg(color.name().toUpper());
+    aText.prepend( start );
+    aText.insert( start.length() + aChars, TAG_END );
+}
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cntdisplaytextformatter.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,79 @@
+/*
+* 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:  
+*
+*/
+
+#ifndef CNTDISPLAYTEXTFORMATTER_H_
+#define CNTDISPLAYTEXTFORMATTER_H_
+
+#include <QObject>
+#include <qcontactfilter.h>
+QTM_USE_NAMESPACE
+
+#define TAG_START "<span style=\"background-color:%1;color:%2\">"
+#define TAG_END   "</span>"
+    
+class CntDisplayTextFormatter
+{
+public:
+    virtual ~CntDisplayTextFormatter(){}
+    virtual QString formattedText( const QString aText, const QContactFilter& aCriteria ) = 0;
+};
+
+class CntDummyDisplayTextFormatter : public QObject, public CntDisplayTextFormatter
+{
+    Q_OBJECT
+public:
+    CntDummyDisplayTextFormatter(){}
+    ~CntDummyDisplayTextFormatter(){}
+    
+    inline QString formattedText( const QString aText, const QContactFilter& aCriteria )
+    {
+        Q_UNUSED( aCriteria );
+        return aText;
+    }
+};
+
+class CntHTMLDisplayTextFormatter : public QObject, public CntDisplayTextFormatter
+{
+    Q_OBJECT
+
+public:
+    CntHTMLDisplayTextFormatter();
+    virtual ~CntHTMLDisplayTextFormatter();
+    
+    /*!
+     * Format given text with applied filter. Not that only following filter is supported:
+     * 
+     * QContactDetailFilter filter;
+     * filter.setDetailDefinitionName( QContactDisplayLabel::DefinitionName );
+     * filter.setMatchFlags( QContactDetailFilter::MatchStartsWith );
+     * 
+     * \param aText Buffer where to format
+     * \param aCriteria Applied filter
+     */
+    QString formattedText( const QString aText, const QContactFilter& aCriteria );
+    
+    /*!
+     * Insert tag to given text leaving given number
+     * of characters between start and end tag. 
+     * By default highlight is inserted.
+     * 
+     * \param aText Buffer where to insert tags
+     * \param aNumOfCharacters Number of characters to highlight
+     */
+    virtual void insertTag( QString& aText, int aNumOfCharacters );
+};
+#endif /* CNTDISPLAYTEXTFORMATTER_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cnticonfetcher.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,139 @@
+/*
+* Copyright (c) 2010 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: Fetches icons for contacts.
+*
+*/
+
+#include <thumbnailmanager_qt.h>
+#include <cnticonfetcher.h>
+#include <cntdebug.h>
+
+// maximum amount of scheduled jobs; if there are more jobs, the least
+// important job is cancelled
+const int MaxIconJobs = 20;
+
+// the id that states that no icon is currently pending from thumbnail manager
+const int NoIconRequest = -1;
+
+/*!
+    \class CntIconJob
+    \brief Holds info about one icon job.
+ */
+
+/*!
+    \class CntIconFetcher
+    \brief CntIconFetcher asynchronously fetches contact icons.
+
+    CntIconFetcher queues requests for contact icons that are to be cached.
+    It fetches the icons later, when asked by the client to do so.
+
+    Internally CntIconFetcher uses thumbnail manager to fetch the icons.
+ */
+
+/*!
+    Creates a CntIconFetcher object.
+ */
+CntIconFetcher::CntIconFetcher()
+    : CntAbstractFetcher(MaxIconJobs),
+      mThumbnailManager(NULL),
+      mIconRequestId(NoIconRequest)
+{
+    CNT_ENTRY
+
+    // create & connect the thumbnail manager
+    mThumbnailManager = new ThumbnailManager(this);
+    mThumbnailManager->setMode(ThumbnailManager::Default);
+    mThumbnailManager->setQualityPreference(ThumbnailManager::OptimizeForPerformance);
+    mThumbnailManager->setThumbnailSize(ThumbnailManager::ThumbnailSmall);
+    connect(mThumbnailManager, SIGNAL(thumbnailReady(QPixmap, void *, int, int)),
+            this, SLOT(forwardIconToClient(QPixmap, void *, int, int)));
+
+    CNT_EXIT
+}
+
+/*!
+    Cleans up and destructs the CntIconFetcher object.
+ */
+CntIconFetcher::~CntIconFetcher()
+{
+    CNT_ENTRY
+
+    if (mIconRequestId != NoIconRequest) {
+        mThumbnailManager->cancelRequest(mIconRequestId);
+    }
+
+    delete mThumbnailManager;
+    mThumbnailManager = NULL;
+
+    CNT_EXIT
+}
+
+/*!
+    Processes the next scheduled job. This function must not be
+    called until the previous job has completed.
+ */
+void CntIconFetcher::processNextJob()
+{
+    CNT_ENTRY
+
+    Q_ASSERT(mIconRequestId == NoIconRequest);
+
+    if (hasScheduledJobs()) {
+        // request icon from thumbnail manager
+        CntIconJob *job = static_cast<CntIconJob *>(takeNextJob());
+        mIconRequestName = job->iconName;
+        mIconRequestId = mThumbnailManager->getThumbnail(mIconRequestName, NULL, 0);
+        delete job;
+    } else if (hasCancelledJobs()) {
+        CntIconJob *job = static_cast<CntIconJob *>(takeNextCancelledJob());
+        emit iconCancelled(job->iconName);
+        delete job;
+    }
+
+    CNT_EXIT
+}
+
+/*!
+    \return true if a job is currently being processed; otherwise returns false.
+ */
+bool CntIconFetcher::isProcessingJob()
+{
+    return (mIconRequestId != NoIconRequest);
+}
+
+/*!
+    Forwards an icon from thumbnail manager to the client.
+ */
+void CntIconFetcher::forwardIconToClient(const QPixmap &pixmap, void *data, int id, int error)
+{
+    CNT_ENTRY
+
+    Q_UNUSED(data);
+
+    if (id != mIconRequestId) {
+        // this pixmap was requested by someone else sharing the same thumbnail manager instance
+        CNT_EXIT_ARGS("not our pixmap")
+        return;
+    }
+
+    mIconRequestId = NoIconRequest;
+
+    if (error == 0) {
+        emit iconFetched(mIconRequestName, HbIcon(pixmap));
+    } else {
+        emit iconFetched(mIconRequestName, HbIcon());
+    }
+
+    CNT_EXIT
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cnticonfetcher.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2010 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: Private data and helper classes used by class CntCache.
+*
+*/
+
+#ifndef CNTICONFETCHER_H
+#define CNTICONFETCHER_H
+
+#include <HbIcon>
+#include <cntabstractfetcher.h>
+
+class ThumbnailManager;
+
+QTM_USE_NAMESPACE
+
+class CntIconJob : public CntAbstractJob
+{
+public:
+    CntIconJob(QString iconName) { this->iconName = iconName; }
+    bool isEmpty() { return iconName.isEmpty(); }
+    bool equals(const CntAbstractJob &other) { const CntIconJob *o = static_cast<const CntIconJob *>(&other); return (iconName == o->iconName); }
+    QString toString() { return QString("iconName = '%1'").arg(iconName); }
+
+public:
+    QString iconName;               // set by requester
+    HbIcon icon;                    // set by icon fetcher
+};
+
+class CntIconFetcher : public CntAbstractFetcher
+{
+    Q_OBJECT
+public:
+    CntIconFetcher();
+    ~CntIconFetcher();
+
+    bool isProcessingJob();
+    void processNextJob();
+
+signals:
+    void iconFetched(const QString &iconName, const HbIcon &icon);
+    void iconCancelled(const QString &iconName);
+
+private slots:
+    void forwardIconToClient(const QPixmap &pixmap, void *data, int id, int error);
+
+private:
+    ThumbnailManager *mThumbnailManager;                    // manager that fetches the icons; owned
+    int mIconRequestId;                                     // the id of the last request to thumbnail manager
+    QString mIconRequestName;                               // the name of the icon last requested from thumbnail manager
+
+    friend class TestIconFetcher;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cntinfofetcher.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,171 @@
+/*
+* Copyright (c) 2010 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: Fetches visual info about contacts.
+*
+*/
+
+#include <QPluginLoader>
+#include <QDir>
+#include <qtcontacts.h>
+#include <cntinfofetcher.h>
+#include <cntinfoproviderfactory.h>
+#include <cntinfoprovider.h>
+#include <cntdefaultinfoprovider.h>
+#include <cntpresenceinfoprovider.h>
+#include <cntdebug.h>
+
+/*!
+    \class CntInfoCacheItem
+    \brief Cache item that holds some visual info about a contact.
+ */
+
+/*!
+    \class CntInfoFetcher
+    \brief CntInfoFetcher asynchronously fetches visual info about contacts.
+
+    CntInfoFetcher queues requests for contact info that is to be cached.
+    It fetches the info later, when asked by the client to do so.
+
+    There are three pieces of info that is fetched:
+      - secondary text, e.g. phone number
+      - primary icon, e.g. avatar for contact
+      - secondary icon, e.g. presence status
+
+    Internally CntInfoFetcher uses plugins (info providers) to fetch the data.
+ */
+
+// maximum amount of scheduled jobs; if there are more jobs, the least
+// important job is cancelled
+const int MaxInfoJobs = 20;
+
+// directory of info providers
+const char *CNT_INFO_PROVIDER_EXTENSION_PLUGIN_DIRECTORY = "/resource/qt/plugins/contacts/infoproviders/";
+
+/*!
+    Creates a CntIconFetcher object.
+ */
+CntInfoFetcher::CntInfoFetcher(QContactManager *contactManager)
+    : CntAbstractFetcher(MaxInfoJobs),
+      mContactManager(contactManager)
+{
+    CNT_ENTRY
+
+    // create static info provider plugins
+    mInfoProviders.insert(new CntDefaultInfoProvider(), ContactInfoAllFields);
+    mInfoProviders.insert(new CntPresenceInfoProvider(), ContactInfoIcon2Field);
+
+    // load dynamic info provider plugins
+    QDir pluginsDir(CNT_INFO_PROVIDER_EXTENSION_PLUGIN_DIRECTORY);
+    foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
+        // create plugin loader
+        QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
+        if (pluginLoader.load()) {
+            CntInfoProviderFactory *factory = qobject_cast<CntInfoProviderFactory*>(pluginLoader.instance());
+            if (factory) {
+                CntInfoProvider *provider = factory->infoProvider();
+                mInfoProviders.insert(provider, provider->supportedFields());
+            }
+        }
+    }
+
+    // connect the providers
+    QMapIterator<CntInfoProvider*, ContactInfoFields> i(mInfoProviders);
+    while (i.hasNext()) {
+        i.next();
+        connect(static_cast<CntInfoProvider*>(i.key()),
+                SIGNAL(infoFieldReady(CntInfoProvider*, int, ContactInfoField, const QString&)),
+                this,
+                SLOT(forwardInfoToClient(CntInfoProvider*, int, ContactInfoField, const QString&)));
+    }
+
+    CNT_EXIT
+}
+
+/*!
+    Cleans up and destructs the CntIconFetcher object.
+ */
+CntInfoFetcher::~CntInfoFetcher()
+{
+    CNT_ENTRY
+
+    qDeleteAll(mInfoProviders.keys());
+    mInfoProviders.clear();
+
+    CNT_EXIT
+}
+
+/*!
+    Processes the next scheduled job. This function must not be
+    called until the previous job has completed.
+ */
+void CntInfoFetcher::processNextJob()
+{
+    CNT_ENTRY
+
+    if (hasScheduledJobs()) {
+        // get the next job
+        CntInfoJob *job = static_cast<CntInfoJob *>(takeNextJob());
+
+        // fetch a QContact object
+        QContactFetchHint restrictions;
+        restrictions.setOptimizationHints(QContactFetchHint::NoRelationships);
+        QContact contact = mContactManager->contact(job->contactId, restrictions);
+        
+        // request contact info from providers
+        QMapIterator<CntInfoProvider*, ContactInfoFields> i(mInfoProviders);
+        while (i.hasNext()) {
+            i.next();
+            if (i.value() != 0) {
+                i.key()->requestInfo(contact, i.value());
+            }
+        }
+        
+        delete job;
+    } else if (hasCancelledJobs()) {
+        CntInfoJob *cancelledJob = static_cast<CntInfoJob *>(takeNextCancelledJob());
+        emit infoCancelled(cancelledJob->contactId);
+        delete cancelledJob;
+    }
+
+    CNT_EXIT
+}
+
+/*!
+    \return true if a job is currently being processed; otherwise returns false.
+ */
+bool CntInfoFetcher::isProcessingJob()
+{
+    return false;
+}
+
+/*!
+    Forward info from a provider to the client.
+ */
+void CntInfoFetcher::forwardInfoToClient(CntInfoProvider *sender,
+                                         int contactId,
+                                         ContactInfoField field,
+                                         const QString &text)
+{
+    CNT_ENTRY
+
+    // there can be 3rd party info providers, so we cannot blindly trust them;
+    // info is emitted iff:
+    if (mInfoProviders.contains(sender)
+        && ((field & (field - 1)) == 0)                         // 1) exactly one field bit is set in parameter 'field'
+        && ((field & mInfoProviders.value(sender)) != 0)) {     // 2) the field bit has been assigned to this provider
+        emit infoUpdated(contactId, field, text);
+    }
+
+    CNT_EXIT
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cntinfofetcher.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,65 @@
+/*
+* Copyright (c) 2010 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: Fetches visual info about contacts.
+*
+*/
+
+#ifndef CNTINFOFETCHER_H
+#define CNTINFOFETCHER_H
+
+#include <qcontactmanager.h>
+#include <qcontactid.h>
+#include <cntinfoprovider.h>
+#include <cntabstractfetcher.h>
+
+QTM_USE_NAMESPACE
+
+class CntInfoJob : public CntAbstractJob
+{
+public:
+    CntInfoJob(QContactLocalId contactId) { this->contactId = contactId; }
+    virtual bool isEmpty() { return (contactId == 0); }
+    virtual bool equals(const CntAbstractJob &other) { return (contactId == static_cast<const CntInfoJob *>(&other)->contactId); }
+    QString toString() { return QString("cid = %1").arg(contactId); }
+
+public:
+    QContactLocalId contactId;
+};
+
+class CntInfoFetcher : public CntAbstractFetcher
+{
+    Q_OBJECT
+public:
+    CntInfoFetcher(QContactManager *contactManager);
+    ~CntInfoFetcher();
+
+    bool isProcessingJob();
+    void processNextJob();
+
+signals:
+    void infoUpdated(QContactLocalId contactId, ContactInfoField field, const QString &text);
+    void infoCancelled(QContactLocalId contactId);
+
+private slots:
+    void forwardInfoToClient(CntInfoProvider* sender, int contactId,
+                             ContactInfoField field, const QString& text);
+
+private:
+    QContactManager *mContactManager;                           // manager that fetches QContact objects; not owned
+    QMap<CntInfoProvider *, ContactInfoFields> mInfoProviders;   // maps info providers to their responsibilities
+
+    friend class TestInfoFetcher;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cntlistmodel.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,777 @@
+/*
+* 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 <QSet>
+#include <qtcontacts.h>
+#include <hbindexfeedback.h>
+#include <hbframebackground.h>
+#include <hbframedrawer.h>
+#include <xqsettingsmanager.h>
+#include <xqsettingskey.h>
+#include <cntlistmodel.h>
+#include <cntlistmodel_p.h>
+#include <cntcache.h>
+#include <cntdisplaytextformatter.h>
+#include <cntdebug.h>
+
+/*!
+    \class CntListModel
+    \brief List model for list with contacts.
+
+    CntListModel is a list model view for contacts database content. It uses
+    CntCache to fetch and cache entries displayed on the screen.
+ */
+
+const uint dummyMyCardId = 0;
+
+/*!
+    Construct a new CntListModel object using manager as the QContactManager
+    instance to communicate with the contacts database.
+ 
+    \param manager      a QContactManager instance to be used for communications
+                        with the contacts persistant store
+    \param filter       a filter that selects the contacts to show in the list
+    \param showMyCard   true if my card entry should be shown at the top of
+                        the list, otherwise false
+    \param parent       parent of this QObject
+ */
+CntListModel::CntListModel(QContactManager* manager,
+                           const QContactFilter& filter,
+                           bool showMyCard,
+                           QObject *parent)
+    : QAbstractListModel(parent)
+{
+    CNT_ENTRY
+
+    // set up data
+    d = new CntListModelData(manager, filter, showMyCard);
+
+    // fetch IDs
+    updateContactIdsArray();
+
+    // get current setting how to show an item in the name list and subscribe for changes
+    d->mSettings = new XQSettingsManager;
+    d->mNameListRowSettingkey = new XQSettingsKey(XQSettingsKey::TargetCentralRepository,
+        KCRCntSettings.iUid,
+        KCntNameListRowSetting);
+    d->mCurrentRowSetting = d->mSettings->readItemValue(*d->mNameListRowSettingkey,
+        XQSettingsManager::TypeInt).toInt();
+    d->mSettings->startMonitoring(*d->mNameListRowSettingkey, XQSettingsManager::TypeInt);
+    connect(d->mSettings, SIGNAL(valueChanged(const XQSettingsKey&, const QVariant&)),
+            this, SLOT(handleRowSettingChanged(const XQSettingsKey&, const QVariant&)));
+
+    // listen to cache for changes in contacts
+    connect(d->mCache, SIGNAL(contactInfoUpdated(QContactLocalId)),
+            this, SLOT(handleContactInfoUpdated(QContactLocalId)));
+    connect(d->mCache, SIGNAL(contactsAdded(const QList<QContactLocalId>&)),
+            this, SLOT(handleAdded(const QList<QContactLocalId>&)));
+    connect(d->mCache, SIGNAL(contactsChanged(const QList<QContactLocalId>&)),
+            this, SLOT(handleChanged(const QList<QContactLocalId>&)));
+    connect(d->mCache, SIGNAL(contactsRemoved(const QList<QContactLocalId>&)),
+            this, SLOT(handleRemoved(const QList<QContactLocalId>&)));
+    connect(d->mCache, SIGNAL(dataChanged()),
+            this, SLOT(refreshModel()));
+
+    // listen to contactmanager for changes in relationships or mycard
+    connect(d->mContactManager, SIGNAL(selfContactIdChanged(const QContactLocalId&, const QContactLocalId&)),
+            this, SLOT(handleMyCardChanged(const QContactLocalId&, const QContactLocalId&)));
+    connect(d->mContactManager, SIGNAL(relationshipsAdded(const QList<QContactLocalId>&)),
+            this, SLOT(handleAddedRelationship(const QList<QContactLocalId>&)));
+    connect(d->mContactManager, SIGNAL(relationshipsRemoved(const QList<QContactLocalId>&)),
+            this, SLOT(handleRemovedRelationship(const QList<QContactLocalId>&)));
+
+    CNT_EXIT
+}
+
+CntListModel::~CntListModel()
+{
+}
+
+/*!
+    Return the data to be used by the view or delegates for a particular
+    item and role.
+
+    \param index The index of the item to return data about.
+    \param role The data should be relevant for this particular purpose.
+    \return QVariant The data for the specified index and role.
+*/
+QVariant CntListModel::data(const QModelIndex &index, int role) const
+{
+    CNT_ENTRY
+
+    QVariant returnData;
+    int row = index.row();
+
+    // check that row is ok
+    if (!isValidRow(row)) {
+        // invalid row
+        return QVariant();
+    }
+    
+    // update current contact if needed
+    if (row != d->mCurrentRow) {
+        delete d->mCurrentContact;
+        if (d->mContactIds[row] == dummyMyCardId) {
+            // row contains dummy MyCard, so create dummy CntContactInfo
+            d->mCurrentContact = NULL;
+        } else {
+            d->mCurrentContact = d->mCache->fetchContactInfo(row, d->mContactIds);
+        }
+        d->mCurrentRow = row;
+    }
+
+    if (role == Qt::DisplayRole) {
+        returnData = dataForRole(row, role);
+    } else if (role == Hb::IndexFeedbackRole) {
+        if (row > 0 || (d->mMyCardId != d->mContactIds[0] && dummyMyCardId != d->mContactIds[0])) {
+            returnData = dataForRole(row, role).toStringList().at(0).toUpper();
+        }
+    } else if (role == Qt::BackgroundRole) {
+        if (d->mMyCardId == d->mContactIds[row] || dummyMyCardId == d->mContactIds[row]) {
+            returnData = HbFrameBackground("qtg_fr_list_parent_normal", HbFrameDrawer::NinePieces);
+        }
+    } else if (role == Qt::DecorationRole) {
+        if (d->mCurrentRowSetting == CntTwoRowsNameAndPhoneNumber) {
+            //icon fits only if user selected 2 rows in each name list item
+            QList<QVariant> icons;
+
+            if (d->mCurrentContact != NULL && !d->mCurrentContact->icon1().isNull()) {
+                icons.append(d->mCurrentContact->icon1());
+            } else if (d->mMyCardId == d->mContactIds[row] || dummyMyCardId == d->mContactIds[row]) {
+                icons.append(d->mDefaultMyCardIcon);
+            } else {
+                icons.append(d->mDefaultIcon);
+            }
+
+            if (d->mCurrentContact != NULL && !d->mCurrentContact->icon2().isNull()) {
+                icons.append(d->mCurrentContact->icon2());
+            }
+
+            returnData = icons;
+        }
+    }
+    
+    CNT_EXIT
+    return returnData;
+}
+
+/*!
+    Get the number of rows (contacts) in this model.
+
+    \param parent Optional parent index value.
+    \return Number of contacts in this model.
+ */
+int CntListModel::rowCount(const QModelIndex& /*parent*/) const
+{
+    return d->mContactIds.count();
+}
+
+/*!
+    Read a full contact entry from the database for the given model
+    index value. Only the row part of the index information will be
+    read. This is just an overload of CntListModel::contact() that
+    supports old behaviour and calls:
+         CntListModel::contact(int row);
+
+    The entry at the requested row will have its full contact information
+    (all fields) read from the database and returned as a QContact instance.
+
+    \param index Index for the sought contact entry in this model.
+    \return A newly constructed QContact instance for this entry - ownership
+     is transferred to the caller.
+ */
+QContact CntListModel::contact(const QModelIndex &index) const
+{
+    return contact(index.row());
+}
+
+/*!
+    Returns the id for the contact at the requested row.
+
+    \param index Index for the sought contact entry in this model.
+    \return The id for the contact, 0 if invalid index.
+ */
+QContactLocalId CntListModel::contactId(const QModelIndex &index) const
+{
+    CNT_ENTRY
+
+    if (!isValidRow(index.row())) {
+        return 0;
+    }
+
+    CNT_EXIT
+    return d->mContactIds[index.row()];
+}
+
+/*!
+    Return an index that points to the row relating to the supplied contact.
+     E.g. if the contact is at row 7, the index with the following properties
+     is returned:
+         index.row() == 7
+ 
+    \param contact The contact for whose row an index is required
+    \return a QModelIndex with the row set to match that of the contact.
+ */
+QModelIndex CntListModel::indexOfContact(const QContact &contact) const
+{
+    return createIndex(row(contact.localId()), 0);
+}
+
+/*!
+    Return an index that points to the row relating to the supplied contact id.
+     E.g. if the contact with this id is at row 7, the index with the following
+     properties is returned:
+         index.row() == 7
+ 
+    \param contactId The id of the contact for whose row an index is required
+    \return a QModelIndex with the row set to match that of the contact id.
+ */
+QModelIndex CntListModel::indexOfContactId(const QContactLocalId &contactId) const
+{
+    return createIndex(row(contactId), 0);
+}
+
+/*!
+    Set new filter and sort order for the model.
+
+    \param contactFilter New contact filter.
+ */
+void CntListModel::setFilter(const QContactFilter& contactFilter)
+{
+    CNT_ENTRY
+
+    d->setFilter(contactFilter);
+
+    //refresh model
+    updateContactIdsArray();
+
+    beginResetModel();
+    endResetModel();
+
+    CNT_EXIT
+}
+
+/*!
+    Enable/disable MyCard appearance in the model.
+
+    \param enabled Status of MyCard appearance in the model.
+ */
+void CntListModel::showMyCard(bool enabled)
+{
+    CNT_ENTRY
+
+    if (d->mShowMyCard == enabled) {
+        return;
+    }
+    
+    QContactLocalId myCardId = d->mMyCardId;
+    if (enabled) {
+        //add MyCard to the list
+        if (myCardId <= 0) {
+            // create a placeholder for MyCard
+            d->mContactIds.insert(0, dummyMyCardId);
+        } else {
+            d->mContactIds.insert(0, myCardId);
+        }
+    } else {
+        // remove MyCard from the list
+        if (myCardId <= 0) {
+            d->mContactIds.removeOne(dummyMyCardId);
+        } else {
+            d->mContactIds.removeOne(myCardId);
+        }
+    }
+    d->mShowMyCard = enabled;
+    d->mCurrentRow = -1;
+
+    beginResetModel();
+    reset();
+    endResetModel();
+    
+    CNT_EXIT
+}
+
+/*!
+    \return true if MyCard is shown, false otherwise.
+ */
+bool CntListModel::isMyCardShown() const
+{
+    return d->mShowMyCard;
+}
+
+/*!
+    \return the id of the MyCard contact.
+ */
+QContactLocalId CntListModel::myCardId() const
+{
+    return d->mMyCardId;
+}
+
+/*!
+    Gets the filtered list of the contact Ids in a sorted order  
+    
+    \return Error status
+ */
+void CntListModel::updateContactIdsArray()
+{
+    CNT_ENTRY
+
+    QContactDetailFilter* detailFilter = NULL;
+
+    if (d->mFilter.type() == QContactFilter::ContactDetailFilter) {
+        detailFilter = static_cast<QContactDetailFilter*>(&d->mFilter);
+    }
+
+    // special handling for all-contacts filter
+    if (detailFilter
+        && detailFilter->detailDefinitionName() == QContactType::DefinitionName
+        && detailFilter->detailFieldName() == QContactType::FieldType
+        && detailFilter->value() == QContactType::TypeContact) {
+        d->mContactIds = d->mCache->sortIdsByName(NULL);
+    } else if (detailFilter
+        && detailFilter->detailDefinitionName() == QContactDisplayLabel::DefinitionName
+        && detailFilter->detailFieldName() == QContactDisplayLabel::FieldLabel
+        && detailFilter->matchFlags() == Qt::MatchStartsWith) {
+        QStringList searchList = detailFilter->value().toStringList();
+        d->mContactIds = d->mCache->sortIdsByName(searchList);
+    } else {
+        QSet<QContactLocalId> filterIds = d->mContactManager->contactIds(d->mFilter).toSet();
+        d->mContactIds = d->mCache->sortIdsByName(&filterIds);
+    }
+    
+    //find MyCard contact and move it to the first position
+    QContactLocalId myCardId = d->mMyCardId;
+    if (myCardId > 0) {
+        // MyCard exists
+        d->mContactIds.removeOne(myCardId);
+        if (d->mShowMyCard) {
+            d->mContactIds.insert(0, myCardId);
+        }
+    } else if (d->mShowMyCard) {
+        // create a placeholder for MyCard
+        d->mContactIds.insert(0, dummyMyCardId);
+    }
+    
+    CNT_EXIT
+}
+
+/*!
+    Read a full contact entry from the database for the row number.
+
+    The entry at the requested row will have its full contact information
+    (all fields) read from the database and returned as a QContact instance.
+
+    \param row Row at which the sought contact entry is in this model.
+    \return A newly constructed QContact instance for this entry - ownership
+     is transferred to the caller.
+ */
+QContact CntListModel::contact(int row) const
+{
+    CNT_ENTRY
+
+    if (!isValidRow(row) || d->mContactIds[row] == dummyMyCardId) {
+        return QContact();
+    }
+
+    CNT_EXIT
+    return d->mContactManager->contact(d->mContactIds[row]);
+}
+
+/*!
+    Verify specified row id is valid.
+
+    \param row A row number
+    \return bool indicating validity of row id
+ */
+bool CntListModel::isValidRow(int row) const
+{
+	return (row >= 0 && row < rowCount());
+}
+
+/*!
+    Fetch the row containing the contact with the specified id.
+
+    \param contactId The id of the contact
+    \return the row of the contact or -1 if no item matched.
+ */
+int CntListModel::row(const QContactLocalId &contactId) const
+{
+    return d->mContactIds.indexOf(contactId);
+}
+
+/*!
+    Return the data to be used by the view for a display role.
+
+    \param row The row of the item to return data about.
+    \param column The column of the item to return data about.
+    \return QVariant The data for the specified index.
+ */
+QVariant CntListModel::dataForRole(int row, int role) const
+{
+    CNT_ENTRY
+
+    QStringList list;
+    QString name;
+    QString infoText;
+    bool isSelfContact = false;
+    bool isNonEmptySelfContact = false;
+    
+    QContactLocalId id = d->mContactIds[row];
+    if (d->mMyCardId == id || dummyMyCardId == id) {
+        isSelfContact = true;
+        if (d->mCurrentContact == NULL) {
+            // empty card
+            name = hbTrId("txt_phob_dblist_mycard");
+            infoText = hbTrId("txt_phob_dblist_mycard_val_create_my_identity");
+        } else {
+            isNonEmptySelfContact = true;
+        }
+    }
+
+    if (!isSelfContact || isNonEmptySelfContact) {
+        name = d->mCurrentContact->name();
+        if (name.isEmpty()) {
+            name = hbTrId("txt_phob_list_unnamed");
+        }
+        infoText = d->mCurrentContact->text();
+    }
+    
+    if (role == Qt::DisplayRole) {
+        list << d->mFormat->formattedText(name, d->mFilter);
+    } else {
+        list << name;
+    }
+    
+    if (!isNonEmptySelfContact) {
+        if (d->mCurrentRowSetting == CntTwoRowsNameAndPhoneNumber) {
+            //add additional text only if user wants 2 rows in each name list item
+            list << infoText;
+        }
+    }
+
+    CNT_EXIT
+    return list;
+}
+
+/*!
+    Handle adding of contacts. 
+
+    \param contactIds Ids of contacts added.
+ */
+void CntListModel::handleAdded(const QList<QContactLocalId>& contactIds)
+{
+    CNT_ENTRY
+    
+    // if contacts are added already, no need to do anything
+    bool newContacts = false;
+    for (int k = 0; k < contactIds.count() && !newContacts; k++) { 
+        if (!d->mContactIds.contains(contactIds.at(k))) {
+            newContacts = true;
+        }
+    }
+    if (!newContacts) {
+        return;
+    }
+
+    // invalidate cached contact
+    d->mCurrentRow = -1;
+    
+    QList<QContactLocalId> oldIdList = d->mContactIds;
+    updateContactIdsArray();
+
+    QList<int> newRows;
+    for (int i = 0; i < d->mContactIds.count(); i++) {
+        if (!oldIdList.contains(d->mContactIds.at(i))) {
+            newRows.append(i);
+        }
+    }
+
+    if (newRows.size() == 1) {
+        beginInsertRows(QModelIndex(), newRows.at(0), newRows.at(0));
+        endInsertRows();
+    } else {
+        beginResetModel();
+        reset();
+        endResetModel();
+    }
+
+    CNT_EXIT
+}
+
+/*!
+    Handle changes in contacts. 
+
+    \param contactIds Ids of contacts changed.
+ */
+void CntListModel::handleChanged(const QList<QContactLocalId>& contactIds)
+{
+    CNT_ENTRY
+    
+    if (contactIds.count() == 0) {
+        return;
+    }
+
+    //invalidate cached contact
+    d->mCurrentRow = -1; 
+
+    int firstChangedContactPosBefore = row(contactIds.at(0));  
+    updateContactIdsArray();
+    int firstChangedContactPosAfter = row(contactIds.at(0)); 
+
+    // if only one contact was updated and its position didn't change,
+    // refresh the corresponding row
+    if (contactIds.count() == 1 &&
+        firstChangedContactPosBefore == firstChangedContactPosAfter &&
+        firstChangedContactPosBefore >= 0) {
+        QModelIndex top = index(firstChangedContactPosBefore);
+        QModelIndex bottom = index(firstChangedContactPosBefore);
+        emit dataChanged(top, bottom);
+    } else {
+        beginResetModel();
+        reset();
+        endResetModel();
+    }
+    
+    CNT_EXIT
+}
+
+/*!
+    Handle removing of contacts. 
+
+    \param contactIds Ids of contacts removed.
+ */
+void CntListModel::handleRemoved(const QList<QContactLocalId>& contactIds)
+{
+    CNT_ENTRY
+    
+    bool removeContacts = false;
+    QList<QContactLocalId> idList = d->mContactIds;
+    for (int k = 0; k < contactIds.count() && !removeContacts; k++) {
+        if(idList.contains(contactIds.at(k))) {
+            removeContacts = true;
+        }
+    }
+    if (!removeContacts) {
+        return;
+    }
+    
+    //Find contacts to remove (=rows)
+    QList<int> removeRows;
+    for(int i = 0; i < contactIds.count(); i++) {
+        if (idList.contains(contactIds.at(i))) {
+            removeRows.append(row(contactIds.at(i)));
+        }
+    }
+    
+    // invalidate cached contact
+    d->mCurrentRow = -1;
+    
+    int myCardRow = -1;
+    if (contactIds.contains(d->mMyCardId)) {
+        myCardRow = row(d->mMyCardId);
+        d->mMyCardId = 0;
+    }
+
+    // remove rows starting from the bottom
+    qSort(removeRows.begin(), removeRows.end(), qGreater<int>());
+    foreach (int row, removeRows) {
+        if (row != myCardRow || !d->mShowMyCard) {
+            beginRemoveRows(QModelIndex(), row, row);
+            endRemoveRows();
+        }
+    }
+
+    foreach (QContactLocalId id, contactIds) {
+        d->mContactIds.removeOne(id);
+    }
+
+    if (myCardRow != -1 && d->mShowMyCard) {
+        d->mContactIds.insert(0, dummyMyCardId);
+        QModelIndex index = createIndex(0, 0);
+        emit dataChanged(index, index);
+    }
+
+    CNT_EXIT
+}
+
+/*!
+    Handle my card change. 
+
+    \param oldId Id of the old MyCard.
+    \param newId Id of the new MyCard.
+ */
+void CntListModel::handleMyCardChanged(const QContactLocalId& /*oldId*/, const QContactLocalId& newId)
+{
+    CNT_ENTRY
+    
+    //invalidate cached contact
+    d->mCurrentRow = -1;
+    d->mMyCardId = newId;
+
+    updateContactIdsArray();
+    
+    beginResetModel();
+    reset();
+    endResetModel();
+    
+    CNT_EXIT
+}
+
+/*!
+    Handle added relationships. 
+
+    \param contactIds Ids of contacts added (group id and contact ids).
+ */
+void CntListModel::handleAddedRelationship(const QList<QContactLocalId>& contactIds)
+{
+    CNT_ENTRY
+
+    if (contactIds.contains(d->mGroupId)) {
+        foreach (QContactLocalId id, contactIds) {
+            if (id != d->mGroupId && !d->mContactIds.contains(id)) {
+                // at least one new contact id has been added to this group,
+                // so update the model
+                updateRelationships();
+                break;
+            }
+        }
+    }
+
+    CNT_EXIT
+}
+
+/*!
+    Handle removed relationships. 
+
+    \param contactIds Ids of contacts removed from a relationship (group id and contact ids).
+ */
+void CntListModel::handleRemovedRelationship(const QList<QContactLocalId>& contactIds)
+{
+    CNT_ENTRY
+
+    if (contactIds.contains(d->mGroupId)) {
+        foreach (QContactLocalId id, contactIds) {
+            if (d->mContactIds.contains(id)) {
+                // at least one new contact id has been removed from this group,
+                // so update the model
+                updateRelationships();
+                break;
+            }
+        }
+    }
+
+    CNT_EXIT
+}
+
+/*!
+    Updates the model to reflect changes in the relationships.
+ */
+void CntListModel::updateRelationships()
+{
+    CNT_ENTRY
+
+    //invalidate cached contact
+    d->mCurrentRow = -1;
+    
+    QList<QContactLocalId> oldIdList = d->mContactIds;
+    updateContactIdsArray();
+    
+    // find all changed rows
+    QList<int> newRows, removedRows;
+    for (int i = 0; i < d->mContactIds.count(); i++) {
+        if (!oldIdList.contains(d->mContactIds.at(i))) {
+            newRows.append(i);
+        }
+    }
+    for (int i = 0; i < oldIdList.count(); i++) {
+        if (!d->mContactIds.contains(oldIdList.at(i))) {
+            removedRows.append(i);
+        }
+    }
+
+    // currently only one-row-changes are handled with beginInsertRows/beginRemoveRows
+    // if there are more than one change, the whole model is reset
+    if (removedRows.count() == 1 && newRows.count() == 0) {
+        beginRemoveRows(QModelIndex(), removedRows.at(0), removedRows.at(0));
+        endRemoveRows();
+    } else if (newRows.count() == 1 && removedRows.count() == 0) {
+        beginInsertRows(QModelIndex(), newRows.at(0), newRows.at(0));
+        endInsertRows();
+    } else {
+        beginResetModel();
+        endResetModel();
+    }
+
+    CNT_EXIT
+}
+
+/*!
+    Notify views that info for a contact has become
+    available or has changed.
+
+    \param contactId the id of the contact
+ */
+void CntListModel::handleContactInfoUpdated(QContactLocalId contactId)
+{
+    CNT_ENTRY
+
+    QModelIndex index = createIndex(row(contactId), 0);
+    if (index.row() == d->mCurrentRow) {
+        d->mCurrentRow = -1;
+    }
+
+    if (isValidRow(index.row())) {
+        emit dataChanged(index, index);
+    }
+
+    CNT_EXIT
+}
+
+/*!
+    Handle a change in how name list item should be represented.
+
+    \param key Central repository key
+    \param value New value in the key
+ */
+void CntListModel::handleRowSettingChanged(const XQSettingsKey& /*key*/, const QVariant& value)
+{
+    bool ok = false;
+    int newSetting = value.toInt(&ok);
+    if (ok) {
+        d->mCurrentRowSetting = newSetting;
+
+        if (rowCount() > 0) {
+            QModelIndex first = createIndex(0, 0);
+            QModelIndex last = createIndex(rowCount() - 1, 0);
+            emit dataChanged(first, last);
+        }
+    }
+}
+
+/*!
+    Handle a change in data.
+ */
+void CntListModel::refreshModel()
+{
+    d->mCurrentRow = -1;
+
+    updateContactIdsArray();
+
+    beginResetModel();
+    reset();
+    endResetModel();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cntlistmodel.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,84 @@
+/*
+* 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:
+*
+*/
+
+#ifndef CNTLISTMODEL_H
+#define CNTLISTMODEL_H
+
+#include <QAbstractListModel>
+#include <QSharedData>
+#include <cntlistmodelglobal.h>
+#include <qcontactmanager.h>
+#include <qcontact.h>
+#include <qcontactid.h>
+#include <qcontactfilter.h>
+
+QTM_USE_NAMESPACE
+
+class CntListModelData;
+class XQSettingsKey;
+class CntDisplayTextFormatter;
+
+class CNTLISTMODEL_EXPORT CntListModel : public QAbstractListModel
+{
+    Q_OBJECT
+public:
+    CntListModel(QContactManager *manager,
+                 const QContactFilter &contactFilter = QContactFilter(),
+                 bool showMyCard = true,
+                 QObject *parent = 0);
+    ~CntListModel();
+
+public: // from QAbstractTableModel/QAbstractItemModel
+    QVariant data(const QModelIndex &index, int role) const;
+    int rowCount(const QModelIndex &parent = QModelIndex()) const;
+
+public:
+	QContact contact(const QModelIndex &index) const;
+    QContactLocalId contactId(const QModelIndex &index) const;
+	QModelIndex indexOfContact(const QContact &contact) const;
+	QModelIndex indexOfContactId(const QContactLocalId &contactId) const;
+	void setFilter(const QContactFilter& contactFilter = QContactFilter());
+	void showMyCard(bool enabled);
+	bool isMyCardShown() const;
+	QContactLocalId myCardId() const;
+
+private:
+    void updateContactIdsArray();
+    QContact contact(int row) const;
+    bool isValidRow(int row) const;
+    int row(const QContactLocalId &contactId) const;
+    QVariant dataForRole(int row, int role) const;
+    void updateRelationships();
+
+private slots:
+    void handleAdded(const QList<QContactLocalId> &contactIds);
+    void handleChanged(const QList<QContactLocalId> &contactIds);
+    void handleRemoved(const QList<QContactLocalId> &contactIds);
+    void handleMyCardChanged(const QContactLocalId &oldId, const QContactLocalId &newId);
+    void handleContactInfoUpdated(QContactLocalId contactId);
+    void handleAddedRelationship(const QList<QContactLocalId> &contactIds);
+    void handleRemovedRelationship(const QList<QContactLocalId> &contactIds);
+    void handleRowSettingChanged(const XQSettingsKey &key, const QVariant &value);
+    void refreshModel();
+
+private:
+    QSharedDataPointer<CntListModelData> d;
+
+    friend class TestCntListModel;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cntlistmodel.pro	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,74 @@
+# 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:
+TEMPLATE = lib
+TARGET = cntlistmodel
+DEFINES += dll \
+    BUILD_CNTLISTMODEL
+
+MOC_DIR = moc
+
+CONFIG += hb
+
+TARGET.CAPABILITY = CAP_GENERAL_DLL
+TARGET.EPOCALLOWDLLDATA = 1
+TARGET.UID3 = 0x20026FC3
+
+INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
+INCLUDEPATH += .
+INCLUDEPATH += ../../inc
+
+HEADERS += cntlistmodelglobal.h \
+    cntlistmodel.h \
+    cntlistmodel_p.h \
+    cntcache.h \
+    cntcacheitems.h \
+    cntabstractfetcher.h \
+    cntnamefetcher.h \
+    cntinfofetcher.h \
+    cnticonfetcher.h \
+    cntdefaultinfoprovider.h \
+    cntpresenceinfoprovider.h \
+    cntdisplaytextformatter.h \
+    ../../inc/cntdebug.h
+
+SOURCES += cntlistmodel.cpp \
+    cntlistmodel_p.cpp \
+    cntcache.cpp \
+    cntcacheitems.cpp \
+    cntabstractfetcher.cpp \
+    cntnamefetcher.cpp \
+    cntinfofetcher.cpp \
+    cnticonfetcher.cpp \
+    cntdefaultinfoprovider.cpp \
+    cntpresenceinfoprovider.cpp \
+    cntdisplaytextformatter.cpp
+
+LIBS += -lQtContacts \
+    -lhbcore \
+    -lthumbnailmanagerqt \
+    -lpresencecacheqt \
+    -lxqsettingsmanager \
+    -lestor \
+    -lefsrv \
+    -lxqutils
+
+DEPLOYMENT += exportheaders
+
+:BLD_INF_RULES.prj_exports += "../../contacts_plat/contacts_ui_extensions_api/inc/cntinfoproviderfactory.h APP_LAYER_PLATFORM_EXPORT_PATH(cntinfoproviderfactory.h)"
+:BLD_INF_RULES.prj_exports += "../../contacts_plat/contacts_ui_extensions_api/inc/cntinfoprovider.h APP_LAYER_PLATFORM_EXPORT_PATH(cntinfoprovider.h)"
+
+defBlock = "$${LITERAL_HASH}if defined(EABI)" \
+    "DEFFILE ../eabi/cntlistmodel.def" \
+    "$${LITERAL_HASH}else" \
+    "DEFFILE ../bwins/cntlistmodel.def" \
+    "$${LITERAL_HASH}endif"
+MMP_RULES += defBlock
+symbian:MMP_RULES += SMPSAFE
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cntlistmodel_p.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,110 @@
+/*
+* 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: Private data for CntListModel.
+*
+*/
+
+#include <xqsettingsmanager.h>
+#include <xqsettingskey.h>
+#include <qtcontacts.h>
+#include <cntlistmodel_p.h>
+#include <cntcache.h>
+#include <cntdisplaytextformatter.h>
+#include <cntdebug.h>
+
+/*!
+    \class CntListModel
+    \brief Private data for CntListModel.
+ */
+
+/*!
+    Initializes all data.
+ */
+CntListModelData::CntListModelData(QContactManager *manager, const QContactFilter &filter, bool showMyCard)
+    : mContactManager(manager),
+      mCache(CntCache::createSession(this, manager)),
+      mGroupId(0),
+      mCurrentContact(NULL),
+      mCurrentRow(-1),
+      mShowMyCard(showMyCard),
+      mMyCardId(manager->selfContactId()),
+      mSettings(NULL),
+      mNameListRowSettingkey(NULL),
+      mCurrentRowSetting(0),
+      mFormat(new CntDummyDisplayTextFormatter),
+      mDefaultIcon(HbIcon("qtg_large_avatar")),
+      mDefaultMyCardIcon(HbIcon("qtg_large_avatar_mycard"))
+{
+    CNT_ENTRY
+
+    setFilter(filter);
+
+    CNT_EXIT
+}
+
+/*!
+    Cleans up all data.
+ */
+CntListModelData::~CntListModelData()
+{
+    CNT_ENTRY
+
+    mCache->closeSession(this);
+
+    delete mSettings;
+    delete mNameListRowSettingkey;
+    delete mFormat;
+    delete mCurrentContact;
+
+    CNT_EXIT
+}
+
+/*!
+    Sets the filter for selecting contacts in the list.
+ */
+void CntListModelData::setFilter(const QContactFilter& contactFilter)
+{
+    CNT_ENTRY_ARGS(contactFilter.type())
+
+    mFilter = contactFilter;
+    mCurrentRow = -1;
+    if (contactFilter.type() == QContactFilter::RelationshipFilter) {
+        QContactRelationshipFilter* relationshipFilter = static_cast<QContactRelationshipFilter*>(&mFilter);
+        if (relationshipFilter->relationshipType() == QContactRelationship::HasMember &&
+            relationshipFilter->relatedContactRole() == QContactRelationship::First) {
+            mGroupId = relationshipFilter->relatedContactId().localId();
+        }
+    } else {
+        mGroupId = 0;
+
+        // set proper text formatter for the display name. 
+        if (contactFilter.type() == QContactFilter::ContactDetailFilter) {
+            delete mFormat;
+            mFormat = NULL;
+
+            QContactDetailFilter *detailFilter = static_cast<QContactDetailFilter*>(&mFilter);
+            QStringList filter = detailFilter->value().toStringList();
+
+            if (detailFilter->detailDefinitionName() == QContactDisplayLabel::DefinitionName
+                && detailFilter->matchFlags() & QContactFilter::MatchStartsWith
+                && !filter.isEmpty()) {
+                mFormat = new CntHTMLDisplayTextFormatter();
+            } else {
+                mFormat = new CntDummyDisplayTextFormatter();
+            }
+        }
+    }
+
+    CNT_EXIT_ARGS(mGroupId)
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cntlistmodel_p.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,65 @@
+/*
+* 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: Private data for CntListModel.
+*
+*/
+
+#ifndef CNTLISTMODEL_P_H
+#define CNTLISTMODEL_P_H
+
+#include <QSharedData>
+#include <HbIcon>
+#include <qcontactmanager.h>
+#include <qcontactfilter.h>
+#include <qcontactid.h>
+
+QTM_USE_NAMESPACE
+
+class CntCache;
+class CntContactInfo;
+class XQSettingsManager;
+class XQSettingsKey;
+class CntDisplayTextFormatter;
+
+class CntListModelData : public QSharedData
+{
+public:
+    CntListModelData(QContactManager *manager, const QContactFilter &filter, bool showMyCard);
+    ~CntListModelData();
+    void setFilter(const QContactFilter &contactFilter);
+
+public:
+    QContactManager *mContactManager;           // contact manager, not owned
+    CntCache *mCache;                           // cache instance, not owned
+
+    QContactFilter mFilter;                     // filter for selecting contacts to display in the list
+    QList<QContactLocalId> mContactIds;         // the IDs of the selected contacts
+    QContactLocalId mGroupId;                   // the ID of the group if the filter is a group filter, otherwise 0
+
+    mutable CntContactInfo *mCurrentContact;    // info about last requested contact, owned
+    mutable int mCurrentRow;                    // row of last requested contact
+    bool mShowMyCard;
+	QContactLocalId mMyCardId;                  // id of the my card contact
+
+    XQSettingsManager *mSettings;               // settings manager, owned
+    XQSettingsKey *mNameListRowSettingkey;      // settings key, owned
+    int mCurrentRowSetting;                     // current setting for how a list item should be displayed; name only or name + info
+
+    CntDisplayTextFormatter *mFormat;           // text formatter used for highlighting search strings in list items, owned
+
+    HbIcon mDefaultIcon;                        // default icon for contacts
+    HbIcon mDefaultMyCardIcon;                  // default icon for my card
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cntlistmodelglobal.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,33 @@
+/*
+* 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:
+*
+*/
+
+#ifndef CNTLISTMODELGLOBAL_H
+#define CNTLISTMODELGLOBAL_H
+
+#include <QtGlobal>
+#include <QString>
+#include <QList>
+
+#ifdef CNTLISTMODEL_NO_EXPORT
+#define CNTLISTMODEL_EXPORT 
+#elif BUILD_CNTLISTMODEL
+#define CNTLISTMODEL_EXPORT Q_DECL_EXPORT
+#else
+#define CNTLISTMODEL_EXPORT Q_DECL_IMPORT
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cntnamefetcher.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,563 @@
+/*
+* Copyright (c) 2010 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: Private data and helper classes used by class CntCache.
+*
+*/
+
+#include <QEvent>
+#include <QFile>
+#include <QDir>
+#include <hbapplication.h>
+#include <hbstringutil.h>
+#include <xqutils.h>
+#include <xqsettingsmanager.h>
+#include <xqsettingskey.h>
+#include <e32base.h>
+#include <s32mem.h>
+#include <e32std.h>
+#include <cntdb.h>
+#include <cntuids.h>
+#include <cntcacheitems.h>
+#include <cntnamefetcher.h>
+#include <cntdebug.h>
+
+/*!
+    \class CntAllNamesJob
+    \brief Holds info about one job that fetches all names from the database.
+
+    \class CntSrvConnection
+    \brief Issues requests to CntSrv.
+
+    \class CntNameFetcher
+    \brief CntNameFetcher asynchronously fetches all contact names.
+
+    CntNameFetcher can only do one asynchronous job: fetch all contact names.
+    In addition, the class provides a number of synchronous functions:
+    - fetch one name
+    - read/write all names to/from a cache file
+    - compare two names; sort a list of names
+
+    Fetching from file cache is about 10 times faster than fetching from the
+    database, but the file cache may be out-of-date. The intended use is to
+    first fetch from the file cache and later synchronize with the database.
+ */
+
+// constants used when fetching names from CntSrv
+#define KCntSearchResultList 99
+#define KCntOpenDataBase 100
+_LIT(KCntServerExe, "CNTSRV.EXE");
+_LIT(KCntServerName, "CNTSRV");
+const TInt KAsyncMessageSlots = 6;
+const TInt KCntServerMajorVersionNumber=1;
+const TInt KCntServerMinorVersionNumber=1;
+const TInt KCntServerBuildVersionNumber=1;
+static const QEvent::Type CntAsynchOperation = QEvent::User;
+
+// constants used for file cache
+const QString cacheFolder = "20022EF9";
+const QString cacheFilename = "contactcache.dat";
+
+// maximum number of scheduled jobs for name fetcher
+const int MaxNameJobs = 1;
+
+/*!
+     Internal class used by CntSrvConnection to issues requests to CntSrv.
+  */
+class CntSrvSession : public RSessionBase
+{
+public:
+    CntSrvSession() { mConnected = false; }
+    ~CntSrvSession() { RHandleBase::Close(); }
+    void executeSqlQueryL(const TDesC &sqlQuery, QList<CntNameCacheItem *> &names, CntNameOrder nameFormat, int sizeHintKB);
+
+private:
+    void connectCntSrvL();
+
+private:
+    bool mConnected;
+};
+
+CntSrvConnection::CntSrvConnection()
+    : mSession(NULL),
+      mIsAsynchronous(false)
+{
+}
+
+CntSrvConnection::~CntSrvConnection()
+{
+    disconnect();
+
+    if (mThread.isRunning()) {
+        mThread.quit();
+        mThread.wait();
+    }
+
+    delete mSession;
+
+    mNames.clear();
+}
+
+void CntSrvConnection::setAsynchronous()
+{
+    mIsAsynchronous = true;
+    mThread.start();
+    moveToThread(&mThread);
+}
+
+bool CntSrvConnection::executeSqlQuery(const QString &sqlQuery, CntNameOrder nameFormat, int sizeHintKB)
+{
+    CNT_ENTRY
+
+    if (!mSession) {
+        mSession = new CntSrvSession();
+    }
+
+    if (mIsAsynchronous) {
+        mSqlQuery = sqlQuery;
+        mNameFormat = nameFormat;
+        mSizeHintKB = sizeHintKB;
+        HbApplication::instance()->postEvent(this, new QEvent(CntAsynchOperation));
+    } else {
+        mNames.clear();
+        TPtrC queryPtr(sqlQuery.utf16(), sqlQuery.length());
+        TRAPD(err, mSession->executeSqlQueryL(queryPtr, mNames, nameFormat, sizeHintKB));
+        if (err != KErrNone) {
+            qDeleteAll(mNames);
+            mNames.clear();
+            CNT_EXIT
+            return false;
+        }
+    }
+
+    CNT_EXIT
+    
+    return true;
+}
+
+bool CntSrvConnection::event(QEvent *event)
+{
+    if (event->type() == CntAsynchOperation) {
+        CNT_ENTRY
+
+        mNames.clear();
+        TPtrC ptr(mSqlQuery.utf16(), mSqlQuery.length());
+        TRAPD(err, mSession->executeSqlQueryL(ptr, mNames, mNameFormat, mSizeHintKB));
+        if (err != KErrNone) {
+            qDeleteAll(mNames);
+            mNames.clear();
+        }
+        emit namesRead();
+        qStableSort(mNames.begin(), mNames.end(), CntNameFetcher::compareNames);
+        delete mSession;
+        mSession = NULL;
+        emit namesSorted();
+
+        CNT_EXIT
+
+        return true;
+    }
+    
+    return QObject::event(event);
+}
+
+/*!
+    Executes a special SQL query: the first column must be the contact id and
+    the subsequent columns must be varchar fields.
+    
+    \param sqlQuery the SQL to execute
+    \param names the list where the results will be stored
+    \param nameFormat the format the names should be stored in 
+    \param sizeHintKB the expected size of the buffer needed to fit the results; a too
+                      small value will effectively double the fetch time, since the
+                      buffer is then resized and the data refetched a second time
+ */
+void CntSrvSession::executeSqlQueryL(const TDesC& sqlQuery, QList<CntNameCacheItem*> &names, CntNameOrder nameFormat, int sizeHintKB)
+{
+    int listSize = 0;
+
+    // read the ids and names from the database
+    if (!mConnected) {
+        connectCntSrvL();
+    }
+
+    // allocate tmeporary buffer
+    TInt bufferSize = sizeHintKB * 1024;
+    CBufFlat* buffer = CBufFlat::NewL(256);
+    CleanupStack::PushL(buffer);
+
+    // try to fetch the results, if the fetch fails with
+    // a positive value, it means the buffer was too small
+    // in this case the buffer is resized and the results
+    // are fetched again
+    for (TInt tries = 0; tries < 2 && bufferSize > 0; ++tries) {
+        buffer->ResizeL(bufferSize);
+        TPtr8 bufferPtr = buffer->Ptr(0);
+        TIpcArgs args;
+        args.Set(0, &bufferPtr);
+        args.Set(1, &sqlQuery);
+        bufferSize = SendReceive(KCntSearchResultList, args);
+        CNT_LOG_ARGS("buffer size =" << bufferSize)
+        User::LeaveIfError(bufferSize);
+    } 
+
+    // store the formatted names into the list
+    RBufReadStream readStream;
+    TInt id;
+    TBuf<256> firstName;
+    TBuf<256> lastName;
+
+    readStream.Open(*buffer);
+    for (int i = 0; (id = readStream.ReadInt32L()) != 0; ++i) {
+        readStream >> firstName;
+        readStream >> lastName;
+        CntNameCacheItem* item = new (ELeave) CntNameCacheItem(
+            id,
+            QString::fromUtf16(firstName.Ptr(), firstName.Length()),
+            QString::fromUtf16(lastName.Ptr(), lastName.Length()),
+            nameFormat);
+        if (i >= listSize - 1) {
+            // if the list is runnning out of space, resize it;
+            // initial size is 1000 and after that it doubles
+            // every time it runs out of space
+            if (listSize == 0) {
+                listSize = 1000;
+            } else {
+                listSize *= 2;
+            }
+            QT_TRY {
+                names.reserve(listSize);
+            } QT_CATCH (...) {
+                // clean up and return
+                CleanupStack::PopAndDestroy(buffer);
+                qDeleteAll(names);
+                names.clear();
+                return;
+            }
+        }
+        names.append(item);
+    }
+
+    CleanupStack::PopAndDestroy(buffer);
+}
+
+/*!
+    Connect to / create a contacts server session.
+ */
+void CntSrvSession::connectCntSrvL()
+{
+    // Assume the server is already running and attempt to create a session
+    // with a maximum of KAsyncMessageSlots message slots.
+    TInt err = CreateSession(KCntServerName,
+                             TVersion(KCntServerMajorVersionNumber, KCntServerMinorVersionNumber, KCntServerBuildVersionNumber),
+                             KAsyncMessageSlots);
+    
+    // Server is not running
+    if (err == KErrNotFound) {
+        // Use the RProcess API to start the server.
+        RProcess server;
+        User::LeaveIfError(server.Create(KCntServerExe, KNullDesC));
+        
+        // Enforce server to be at system default priority EPriorityForeground
+        server.SetPriority(EPriorityForeground);
+        
+        // Synchronize with the server.
+        TRequestStatus reqStatus;
+        server.Rendezvous(reqStatus);
+        server.Resume();
+        
+        // Server will call the reciprocal static synchronization call.
+        User::WaitForRequest(reqStatus);
+        server.Close();
+        User::LeaveIfError(reqStatus.Int());
+        
+        // Create the server session.
+        User::LeaveIfError(CreateSession(KCntServerName,
+                                         TVersion(KCntServerMajorVersionNumber, KCntServerMinorVersionNumber, KCntServerBuildVersionNumber),
+                                         KAsyncMessageSlots));
+    } else {
+        User::LeaveIfError(err);
+    }
+    
+    TIpcArgs args;
+    args.Set(0, &KNullDesC);
+    User::LeaveIfError(SendReceive(KCntOpenDataBase, args));
+
+    mConnected = true;
+}
+
+/*!
+    Creates a CntNameFetcher object.
+ */
+CntNameFetcher::CntNameFetcher()
+    : CntAbstractFetcher(MaxNameJobs),
+      mDbConnection(NULL),
+      mAsynchDbConnection(NULL),
+      mSettingsManager(NULL),
+      mNameFormatSetting(NULL),
+      mBufferSizeEstimate(0)
+{
+    CNT_ENTRY
+
+    // get name format setting and listen to changes
+    mSettingsManager = new XQSettingsManager();
+    mNameFormatSetting = new XQSettingsKey(XQSettingsKey::TargetCentralRepository, KCRCntSettings.iUid, KCntNameOrdering);
+    mNameFormat = static_cast<CntNameOrder>(mSettingsManager->readItemValue(*mNameFormatSetting, XQSettingsManager::TypeInt).toInt());
+    mSettingsManager->startMonitoring(*mNameFormatSetting, XQSettingsManager::TypeInt);
+    connect(mSettingsManager, SIGNAL(valueChanged(const XQSettingsKey&, const QVariant&)), this, SLOT(setNameFormat(const XQSettingsKey&, const QVariant&)));
+
+    // connect to contacts server
+    mDbConnection = new CntSrvConnection();
+
+    CNT_EXIT
+}
+
+/*!
+    Destroys a CntNameFetcher object.
+ */
+CntNameFetcher::~CntNameFetcher()
+{
+    CNT_ENTRY
+
+    delete mSettingsManager;
+    delete mNameFormatSetting;
+    delete mDbConnection;
+    delete mAsynchDbConnection;
+
+    CNT_EXIT
+}
+
+/*!
+    Reads names from the file cache.
+
+    \return true if the names were read successfully from the cache file
+
+ */
+bool CntNameFetcher::readNamesFromCache(QList<CntNameCacheItem*> &names)
+{
+    CNT_ENTRY
+
+    bool success = true;
+    quint32 itemCount;
+    quint32 nameFormat;
+
+    QFile cacheFile(XQUtils::phoneMemoryRootPath() + cacheFolder + "\\" + cacheFilename);
+    if (!cacheFile.open(QIODevice::ReadOnly)) {
+        return false;
+    }
+
+    QDataStream in(&cacheFile);
+
+    mBufferSizeEstimate = 0;
+    QT_TRY {
+        // read header: nr of items, name format
+        in >> itemCount;
+        in >> nameFormat;
+        names.reserve(itemCount);
+
+        // populate list with names
+        while (itemCount-- > 0) {
+            CntNameCacheItem *item = CntNameCacheItem::internalize(in, (CntNameOrder) nameFormat);
+            names.append(item);
+            mBufferSizeEstimate += 4 + 2 * item->name().length();
+        }
+    } QT_CATCH (...) {
+        qDeleteAll(names);
+        names.clear();
+        success = false;
+    }
+    
+    cacheFile.close();
+    
+    CNT_EXIT
+    
+    return success;
+}
+
+/*!
+    Write names to the file cache.
+ */
+bool CntNameFetcher::writeNamesToCache(const QList<CntNameCacheItem*> &names) const
+{
+    CNT_ENTRY
+
+    bool success = true;
+
+    // create folder for cache file if it does not already exist
+    QString path = XQUtils::phoneMemoryRootPath() + cacheFolder;
+    if (!QDir(path).exists()) {
+        QDir dir(XQUtils::phoneMemoryRootPath());
+        if (!dir.mkdir(cacheFolder)) {
+            CNT_EXIT_ARGS("failed to create folder: " << path)
+            return false;
+        }
+
+        // have to use native Symbian code to make the dir hidden
+        RFs fs;
+        fs.Connect();
+        TPtrC pathPtr(path.utf16(), path.length());
+        if (fs.SetAtt(pathPtr, KEntryAttHidden, 0) != KErrNone) {
+            fs.Close();
+            return false;
+        }
+        fs.Close();
+    }    
+
+    // open cache file for writing
+    QFile cacheFile(XQUtils::phoneMemoryRootPath() + cacheFolder + "\\" + cacheFilename);
+    if (!cacheFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
+        CNT_EXIT_ARGS("failed to create file")
+        return false;
+    }
+    QDataStream out(&cacheFile);
+
+    // write the names to the cache file
+    QT_TRY {
+        // write header
+        out << names.size();
+        out << (quint32) mNameFormat;
+
+        // write list with names
+        foreach (CntNameCacheItem* name, names) {
+            name->externalize(out);
+        }
+    } QT_CATCH (...) {
+        success = false;
+    }
+
+    cacheFile.close();
+
+    CNT_EXIT
+
+    return success;
+}
+
+/*!
+    Reads the name of one contact from the contact database synchronously.
+    
+    \param contactId the id of the contact
+ */
+CntNameCacheItem* CntNameFetcher::fetchOneName(QContactLocalId contactId) const
+{
+    CNT_ENTRY
+
+    QString sqlQuery = QString("SELECT contact_id, first_name, last_name FROM contact WHERE (type_flags>>24)<=1 AND contact_id=%1").arg(contactId);
+    mDbConnection->executeSqlQuery(sqlQuery, mNameFormat, 2);
+    
+    if (mDbConnection->names().size() == 0) {
+        return NULL;
+    }
+
+    CNT_EXIT
+    
+    return mDbConnection->names().at(0);
+}
+
+/*!
+    Reads the names of all contacts from the contact database asynchronously.
+ */
+void CntNameFetcher::processNextJob()
+{
+    CNT_ENTRY
+
+    if (isProcessingJob() || !hasScheduledJobs()) {
+        return;
+    }
+    
+    // there is only one type of job, so we can delete it without inspection
+    delete takeNextJob();
+    
+    if (mBufferSizeEstimate == 0) {
+        mBufferSizeEstimate = 240 * 1024;
+    }
+    
+    CNT_LOG_ARGS("buffer size =" << mBufferSizeEstimate)
+    
+    mAsynchDbConnection = new CntSrvConnection();
+    mAsynchDbConnection->setAsynchronous();
+    connect(mAsynchDbConnection, SIGNAL(namesRead()), this, SIGNAL(databaseAccessComplete()));
+    connect(mAsynchDbConnection, SIGNAL(namesSorted()), this, SLOT(sendCompletionSignal()));
+    mAsynchDbConnection->executeSqlQuery("SELECT contact_id, first_name, last_name FROM contact WHERE (type_flags>>24)<=1", mNameFormat, 16 + mBufferSizeEstimate / 1024);
+    
+    CNT_EXIT
+}
+
+bool CntNameFetcher::isProcessingJob()
+{
+    return (mAsynchDbConnection != NULL);
+}
+
+/*!
+    Sorts the names quickly and in a locale aware manner.
+ */
+void CntNameFetcher::sortNames(QList<CntNameCacheItem *> &names) const
+{
+    CNT_ENTRY
+
+    qStableSort(names.begin(), names.end(), CntNameFetcher::compareNames);
+
+    CNT_EXIT
+}
+
+/*! 
+    Compares a pair of contact names and returns true if the first
+    one should be presented before the second one in a list. This
+    static function is used e.g. when sorting lists of names.
+ */
+bool CntNameFetcher::compareNames(const CntNameCacheItem* a, const CntNameCacheItem* b)
+{
+    QString aName = a->name();
+    QString bName = b->name();
+
+    if (aName.isEmpty()) {
+        return false;
+    } else if (bName.isEmpty()) {
+        return true;
+    }
+
+    return (HbStringUtil::compareC(aName, bName) < 0);
+}
+
+/*!
+    Notifies clients that the name format has changed. This function is called by the framework
+    if the name format settings is changed, see the constructor.
+ */
+void CntNameFetcher::setNameFormat(const XQSettingsKey &/*key*/, const QVariant &value)
+{
+    CNT_ENTRY
+
+    bool ok = false;
+    CntNameOrder newNameFormat = static_cast<CntNameOrder>(value.toInt(&ok));
+    if (ok && newNameFormat != mNameFormat) {
+        mNameFormat = newNameFormat;
+        emit nameFormatChanged(mNameFormat);
+    }
+
+    CNT_EXIT
+}
+
+/*!
+    Emits the results of a completed asynch database operation.
+ */
+void CntNameFetcher::sendCompletionSignal()
+{
+    CNT_ENTRY
+
+    emit namesAvailable(mAsynchDbConnection->names());
+
+    delete mAsynchDbConnection;
+    mAsynchDbConnection = NULL;
+
+    CNT_EXIT
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cntnamefetcher.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,109 @@
+/*
+* Copyright (c) 2010 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: Private data and helper classes used by class CntCache.
+*
+*/
+
+#ifndef CNTNAMEFETCHER_H
+#define CNTNAMEFETCHER_H
+
+#include <QObject>
+#include <QThread>
+#include <QDataStream>
+#include <QEvent>
+#include <qcontactid.h>
+#include <cntuids.h>
+#include <cntabstractfetcher.h>
+
+QTM_USE_NAMESPACE
+
+class CntSrvSession;
+class CntNameCacheItem;
+class XQSettingsManager;
+class XQSettingsKey;
+
+class CntSrvConnection : public QObject
+{
+    Q_OBJECT
+public:
+    CntSrvConnection();
+    ~CntSrvConnection();
+    void setAsynchronous();
+    bool executeSqlQuery(const QString &sqlQuery, CntNameOrder nameFormat, int sizeHintKB);
+    QList<CntNameCacheItem *> names() { return mNames; }
+
+protected:
+    bool event(QEvent *event);
+
+signals:
+    void namesRead();
+    void namesSorted();
+
+private:
+    QThread mThread;
+    QList<CntNameCacheItem *> mNames;
+    CntSrvSession *mSession;
+    QString mSqlQuery;
+    CntNameOrder mNameFormat;
+    int mSizeHintKB;
+    bool mIsAsynchronous;
+};
+
+class CntAllNamesJob : public CntAbstractJob
+{
+public:
+    virtual bool isEmpty() { return false; }
+    virtual bool equals(const CntAbstractJob &/*other*/) { return true; }
+    QString toString() { return QString(); }
+};
+
+class CntNameFetcher : public CntAbstractFetcher
+{
+    Q_OBJECT
+public:
+    CntNameFetcher();
+    ~CntNameFetcher();
+
+    // functions for the asynchronous fetching of all names
+    bool isProcessingJob();
+    void processNextJob();
+
+    // synchronous functions
+    CntNameCacheItem * fetchOneName(QContactLocalId contactId) const;
+    bool readNamesFromCache(QList<CntNameCacheItem *> &names);
+    bool writeNamesToCache(const QList<CntNameCacheItem *> &names) const;
+    void sortNames(QList<CntNameCacheItem *> &names) const;
+    static bool compareNames(const CntNameCacheItem *a, const CntNameCacheItem *b);
+
+signals:
+    void nameFormatChanged(CntNameOrder nameFormat);
+    void databaseAccessComplete();
+    void namesAvailable(QList<CntNameCacheItem *> contactNames);
+
+private slots:
+    void setNameFormat(const XQSettingsKey &key, const QVariant &value);
+    void sendCompletionSignal();
+
+private:
+    CntSrvConnection *mDbConnection;
+    CntSrvConnection *mAsynchDbConnection;
+    XQSettingsManager *mSettingsManager;
+    XQSettingsKey *mNameFormatSetting;
+    CntNameOrder mNameFormat;
+    int mBufferSizeEstimate;
+
+    friend class TestNameFetcher;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cntpresenceinfoprovider.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,172 @@
+/*
+* Copyright (c) 2010 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: Presence info provider plugin for CntListModel. It can provide
+*              the presence information of a contact (icon2 field).
+*
+*/
+
+#include <qtcontacts.h>
+#include "cntpresenceinfoprovider.h"
+
+#include <prcpresencebuddyinfo_qt.h>
+#include <prcpresencereader_qt.h>
+
+CntPresenceInfoProvider::CntPresenceInfoProvider() :
+    iReader(NULL),
+    mManager(NULL)
+{
+    iReader = PrcPresenceReader::createReader();
+    connect(iReader, SIGNAL(signalPresenceNotification(bool , PrcPresenceBuddyInfoQt*)), 
+                           this, SLOT(handlePresenceUpdate(bool , PrcPresenceBuddyInfoQt*)));
+    
+    mManager = new QContactManager("symbian");
+}
+
+CntPresenceInfoProvider::~CntPresenceInfoProvider()
+{
+    delete iReader;
+    delete mManager;
+}
+
+/*!
+    /return the info fields supported by this provider
+ */
+ContactInfoFields CntPresenceInfoProvider::supportedFields() const
+{
+    // this provider has only info for the icon2 field
+    return ContactInfoIcon2Field;
+}
+
+/*!
+    The contact contains all the info this provider needs, so signals with the requested info
+    fields are emitted immediately.
+
+    /param contact the contact for which info is requested
+    /param requestedInfo one or more of the flags in ContactInfoFields
+ */
+void CntPresenceInfoProvider::requestInfo(const QContact& contact, ContactInfoFields requestedInfo)
+{
+    if (requestedInfo & ContactInfoIcon2Field)
+    {
+        QList<QContactOnlineAccount> accounts = contact.details<QContactOnlineAccount>();
+        
+        QList<PrcPresenceBuddyInfoQt*> buddies;
+        
+        foreach (QContactOnlineAccount account, accounts)
+        {
+            QString fullAccount = account.serviceProvider() + ':' + account.accountUri();
+            PrcPresenceBuddyInfoQt* buddy = iReader->presenceInfo(fullAccount);
+            
+            if (buddy)
+            {
+                buddies.append(buddy);
+                if (!mBuddyMap.contains(buddy->buddyId()))
+                {
+                    mBuddyMap.insert(buddy->buddyId(), contact.localId());
+                    iReader->subscribePresenceBuddyChange(buddy->buddyId());
+                }
+            }
+        }
+        
+        if (buddies.count())
+        {
+            QString icon = parsePresence(buddies);
+            
+            if (!icon.isEmpty())
+            {
+                emit infoFieldReady(this, contact.localId(), ContactInfoIcon2Field, icon);
+            }
+            
+            qDeleteAll(buddies);
+        }
+    }
+}
+
+/*!
+    Update presence icon for contact if needed. Stop listening to presence changes for buddy
+    if online account detail was deleted.
+
+    /param aErrorCode error (if any)
+    /param aPresenceBuddyInfo presence buddy that was updated
+ */
+void CntPresenceInfoProvider::handlePresenceUpdate(bool aSuccess, PrcPresenceBuddyInfoQt* aPresenceBuddyInfo)
+{
+    if (aSuccess && aPresenceBuddyInfo != NULL)
+    {
+        QContactLocalId id = mBuddyMap.value(aPresenceBuddyInfo->buddyId());
+        QContact contact = mManager->contact(id);
+        
+        QList<QContactOnlineAccount> accounts = contact.details<QContactOnlineAccount>();
+        
+        QList<PrcPresenceBuddyInfoQt*> buddies;
+        bool accountFound = false;
+        
+        foreach (QContactOnlineAccount account, accounts)
+        {
+            QString fullAccount = account.serviceProvider() + ':' + account.accountUri();
+            PrcPresenceBuddyInfoQt* buddy = iReader->presenceInfo(fullAccount);
+            
+            if (buddy)
+            {
+                buddies.append(buddy);
+                
+                if (fullAccount == aPresenceBuddyInfo->buddyId())
+                {
+                    accountFound = true;
+                }
+                
+                if (!mBuddyMap.contains(buddy->buddyId()))
+                {
+                    mBuddyMap.insert(buddy->buddyId(), contact.localId());
+                    iReader->subscribePresenceBuddyChange(buddy->buddyId());
+                }
+            }
+        }
+        
+        // Account was removed, no need to listen to presence changes anymore
+        if (accounts.isEmpty() || !accountFound)
+        {
+            mBuddyMap.remove(aPresenceBuddyInfo->buddyId());
+            iReader->unSubscribePresenceBuddyChange(aPresenceBuddyInfo->buddyId());
+        }
+
+        if (id > 0)
+        {
+            QString icon = parsePresence(buddies);
+            emit infoFieldReady(this, id, ContactInfoIcon2Field, icon);
+        }
+
+        qDeleteAll(buddies);
+    }
+}
+
+/*!
+    Parse the required presence icon from multiple accounts.
+
+    /param buddyList list of buddies
+ */
+QString CntPresenceInfoProvider::parsePresence(const QList<PrcPresenceBuddyInfoQt*>& buddyList)
+{
+    foreach (PrcPresenceBuddyInfoQt* buddy, buddyList)
+    {
+        PrcPresenceBuddyInfoQt::AvailabilityValues availability = buddy->availability();
+        
+        if (availability == PrcPresenceBuddyInfoQt::PrcAvailable)
+        {
+            return QString("qtg_small_online");
+        }
+    }
+    
+    return QString();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/cntpresenceinfoprovider.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,67 @@
+/*
+* Copyright (c) 2010 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: Presence info provider plugin for CntListModel. It can provide
+*              the presence information of a contact (icon2 field).
+*
+*/
+
+#ifndef CNTPRESENCEINFOPROVIDER_H
+#define CNTPRESENCEINFOPROVIDER_H
+
+#include <cntinfoprovider.h>
+#include <qcontact.h>
+
+class PrcPresenceReader;
+class PrcPresenceBuddyInfoQt;
+
+QTM_BEGIN_NAMESPACE
+class QContactManager;
+QTM_END_NAMESPACE
+
+QTM_USE_NAMESPACE
+
+/**
+    Presence info provider plugin for CntListModel. It can provide
+    the presence information of a contact (icon2 field).
+ */
+class CntPresenceInfoProvider : public CntInfoProvider
+{
+    friend class TestCntPresenceInfoProvider;
+    Q_OBJECT
+    
+public:
+    CntPresenceInfoProvider();
+    ~CntPresenceInfoProvider();
+    
+	// From CntInfoProvider
+    QString id() const { return "presence"; };
+    ContactInfoFields supportedFields() const;
+    void requestInfo(const QContact& contact, ContactInfoFields requestedInfo);
+    
+private slots:
+    void handlePresenceUpdate(bool aSuccess, PrcPresenceBuddyInfoQt* aPresenceBuddyInfo);
+    
+private:
+    QString parsePresence(const QList<PrcPresenceBuddyInfoQt*>& buddyList);
+
+signals:
+    void infoFieldReady(CntInfoProvider* sender, int contactId, ContactInfoField field, const QString& value);
+    
+private:
+    PrcPresenceReader*              iReader; // owned
+    QContactManager*                mManager; // owned
+    QMap<QString, QContactLocalId>  mBuddyMap;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/tsrc/runperftests.bat	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,23 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description: 
+@rem
+
+echo OFF
+
+del \epoc32\winscw\c\private\e84eae91\mt_performance.log
+\epoc32\release\winscw\urel\mt_performance.exe -o mt_performance.log
+type \epoc32\winscw\c\private\e84eae91\mt_performance.log
+
+
Binary file phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/image1.png has changed
Binary file phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/image2.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/inc/testrunner.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,67 @@
+/*
+* 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:
+*
+*/
+
+#ifndef TESTRUNNER_H
+#define TESTRUNNER_H
+
+#include <QXmlDefaultHandler>
+
+
+class TestRunner : public QXmlDefaultHandler
+{
+public: // Constructors and destructor
+    TestRunner(const QString& name);
+    ~TestRunner();
+       
+public: // New functions
+    
+    int runTests(QObject& testObject);
+    void printResults();
+    
+protected: // From QXmlContentHandler 
+    bool startElement(
+        const QString& namespaceURI,
+        const QString& localName,
+        const QString& qName,
+        const QXmlAttributes& atts);
+    
+    bool endElement(
+        const QString& namespaceURI,
+        const QString& localName,
+        const QString& qName);
+    
+    bool characters(const QString& ch);
+
+private: // New functions
+
+    void parse(const QString& fileName);
+
+private: // Data
+    QStringList mTestRunParams;
+    QString mHomeDir;
+    int mTestCount;
+    QStringList mErrors;
+    bool mParsingIncidentElement;
+    bool mParsingDescriptionElement;
+    bool mCurrentTestFailed;
+    QString mCurrentTestName;
+    QString mCurrentTestFile;
+    int mCurrentTestFailureLine;
+};
+
+
+#endif // TESTRUNNER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/inc/ut_cntcache.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,46 @@
+/*
+* 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 <QtTest/QtTest>
+#include <QObject>
+#include <qtcontacts.h>
+
+QTM_USE_NAMESPACE
+
+static const int CntTestContacts = 6;
+
+class TestCntCache : public QObject
+{
+    Q_OBJECT
+
+private:
+    void cleanDatabase();
+    QContact createContact(QString firstName, QString lastName, QString phoneNumber, QString imageName);
+
+private slots:
+	void initTestCase();
+	void cleanupTestCase();
+    
+    void construction();
+    void fetchContactInfo();
+    void clearCache();
+	
+private:
+    QContactManager *mContactManager;
+    QContact mContacts[CntTestContacts];
+    QList<int> mContactOrder;
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/inc/ut_cntdefaultinfoprovider.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,42 @@
+/*
+* 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 <QtTest/QtTest>
+#include <QObject>
+#include <qtcontacts.h>
+
+class CntDefaultInfoProvider;
+
+QTM_USE_NAMESPACE
+
+class TestCntDefaultInfoProvider : public QObject
+{
+    Q_OBJECT
+
+private slots:
+    void initTestCase();
+    void create();
+    
+    void testSupportedFields();
+    void testRequestInfo();
+    
+    void cleanupTestCase();
+    
+private:
+    CntDefaultInfoProvider    *mCntDefaultInfoProvider;
+
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/inc/ut_cntdisplaytextformatter.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,34 @@
+/*
+* 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 <QtTest/QtTest>
+#include <QObject>
+#include <qtcontacts.h>
+
+QTM_BEGIN_NAMESPACE
+class QContactDetailFilter;
+QTM_END_NAMESPACE
+
+QTM_USE_NAMESPACE
+
+class TestCntDisplayTextFormatter : public QObject
+{
+    Q_OBJECT
+
+private slots:
+	void testFormatter();
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/inc/ut_cntlistmodel.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,88 @@
+/*
+* 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 <QtTest/QtTest>
+#include <QObject>
+#include <qtcontacts.h>
+
+QTM_BEGIN_NAMESPACE
+class QContactManager;
+QTM_END_NAMESPACE
+
+QTM_USE_NAMESPACE
+
+class CntListModel;
+class ModelListener;
+
+class TestCntListModel : public QObject
+{
+    Q_OBJECT
+
+private:
+    void contactReady(int start, int end);
+    QContact createContact(const QString& firstName, const QString& lastName);
+    void addGroupMember(const QContact& group, const QContact& contact);
+    void removeGroupMember(const QContact& group, const QContact& contact);
+
+private slots:
+	void initTestCase();
+	void create();
+	
+	void data();
+	void rowCount();
+	
+	void contact();
+	void contactId();
+	void indexOfContact();
+	void indexOfContactId();
+	void contactManager();
+	void setFilter();
+	void myCard();
+
+	void rowId();
+	void dataForDisplayRole();
+
+    void handleAdded();
+    void handleChanged();
+    void handleRemoved();
+	void handleMyCardChanged();
+    void handleRelationships();
+	
+	void cleanupTestCase();
+	
+private:
+    QContactManager *mManager;
+    CntListModel    *mCntModel;
+    ModelListener   *mModelListener;
+    bool             mDataReady;
+
+friend class ModelListener;
+};
+
+class ModelListener : public QObject
+{
+    Q_OBJECT
+
+public:
+    ModelListener(TestCntListModel* parent);
+
+private slots:
+    void onDataChanged(QModelIndex start, QModelIndex end);
+
+private:
+    TestCntListModel* mParent;
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/inc/ut_cntpresenceinfoprovider.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,46 @@
+/*
+* 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 <QtTest/QtTest>
+#include <QObject>
+#include <qtcontacts.h>
+
+class CntPresenceInfoProvider;
+
+QTM_USE_NAMESPACE
+
+class TestCntPresenceInfoProvider : public QObject
+{
+    Q_OBJECT
+
+private slots:
+    void initTestCase();
+    void create();
+    
+    void testSupportedFields();
+    void testRequestInfo();
+
+    void testHandlePresenceUpdate();
+
+    void testParsePresence();
+    
+    void cleanupTestCase();
+    
+private:
+    CntPresenceInfoProvider    *mCntPresenceInfoProvider;
+
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/runtest.cmd	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,32 @@
+@echo off
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description:
+rem
+@echo on
+
+call del MON.sym
+call del MON.dat
+call del profile.txt
+
+call qmake
+call sbs reallyclean
+call sbs -c winscw_udeb
+call sbs -c winscw_udeb
+call qmake
+call ctcwrap -i d -C "EXCLUDE+moc_*.cpp" -C "EXCLUDE+ut_*.*" sbs -c winscw_udeb
+
+call \epoc32\release\winscw\udeb\ut_cntlistmodel.exe -noprompt
+call ctcpost MON.sym MON.dat -p profile.txt
+call ctc2html -i profile.txt -nsb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/src/main.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,71 @@
+/*
+* 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 "testrunner.h"
+
+#include "ut_cntlistmodel.h"
+#include "ut_cntcache.h"
+#include "ut_cntpresenceinfoprovider.h"
+#include "ut_cntdefaultinfoprovider.h"
+#include "ut_cntdisplaytextformatter.h"
+
+#include <QtTest/QtTest>
+
+int main(int argc, char *argv[]) 
+{
+    bool promptOnExit(true);
+    for (int i=0; i<argc; i++) {
+        if (QString(argv[i]) == "-noprompt")
+            promptOnExit = false;
+    }
+    printf("Running tests...\n");
+            
+    QApplication app(argc, argv);
+    
+    QTranslator translator;
+    QString lang = QLocale::system().name();
+    QString path = "z:/resource/qt/translations/";
+    translator.load(path + "contacts_" + lang);
+    app.installTranslator(&translator);
+
+    TestRunner testRunner("ut_cntlistmodel");
+    
+    TestCntDisplayTextFormatter ut_CntDisplayTextFormatter;
+    testRunner.runTests( ut_CntDisplayTextFormatter );
+    
+    TestCntListModel ut_CntListModel;
+    testRunner.runTests(ut_CntListModel);
+    
+    TestCntCache ut_CntCache;
+    testRunner.runTests(ut_CntCache);
+    
+    TestCntPresenceInfoProvider ut_CntPresenceInfoProvider;
+    testRunner.runTests(ut_CntPresenceInfoProvider);
+    
+    TestCntDefaultInfoProvider ut_CntDefaultInfoProvider;
+    testRunner.runTests(ut_CntDefaultInfoProvider);
+
+    testRunner.printResults();
+
+    if (promptOnExit) {
+        printf("Press any key...\n");
+        getchar(); 
+    }
+
+    return 0;   
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/src/testrunner.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,152 @@
+/*
+* 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 "testrunner.h"
+#include <QtTest/QtTest>
+#include <QDir>
+#include <stdio.h>
+
+const char testFunctionElement[] = "TestFunction";
+const char incidentElement[] = "Incident";
+const char descriptionElement[] = "Description";
+const char nameAttr[] = "name";
+const char typeAttr[] = "type";
+const char fileAttr[] = "file";
+const char lineAttr[] = "line";
+const char attrValueFail[] = "fail";
+
+
+TestRunner::TestRunner(const QString& name)
+: mTestCount(0),
+  mParsingIncidentElement(false),
+  mParsingDescriptionElement(false),
+  mCurrentTestFailed(false),
+  mCurrentTestFailureLine(0)
+{
+    mTestRunParams.append(name);
+    mTestRunParams.append("-xml");
+    mTestRunParams.append("-o");
+    mHomeDir = QDir::homePath();
+    mTestRunParams.append(QString()); // Initial result file name
+
+    if (!mHomeDir.endsWith(QString::fromAscii("/")))
+        mHomeDir += QString::fromAscii("/");
+}
+
+TestRunner::~TestRunner()
+{
+}
+
+int TestRunner::runTests(QObject& testObject)
+{
+    QString className(testObject.metaObject()->className());
+    printf("Running tests for %s ... ", className.toUtf8().data());
+    QString resultFileName = mHomeDir + className + ".xml";
+    mTestRunParams.replace(mTestRunParams.count()-1,resultFileName);
+    int errorsBefore = mErrors.count();
+    int error = QTest::qExec(&testObject, mTestRunParams);
+    parse(resultFileName);
+    printf("Failures: %d\n",mErrors.count()-errorsBefore);
+    fflush(stdout);
+    return error;
+}
+
+void TestRunner::printResults()
+{
+    printf("\nTests executed: %d\n",mTestCount);
+    if (mErrors.count() > 0) {
+        printf("Failures (%d):\n", mErrors.count());
+        foreach(QString error, mErrors) {
+            printf("\n%s", error.toUtf8().data());
+        }
+        printf("\n");
+    } else {
+        printf("All passed.\n\n");
+    }
+    fflush(stdout);
+}
+
+void TestRunner::parse(const QString& fileName)
+{
+    QFile file(fileName);
+    QXmlInputSource inputSource(&file);
+    QXmlSimpleReader reader;
+    reader.setContentHandler(this);
+    reader.parse(inputSource);
+}
+
+bool TestRunner::startElement(
+    const QString& /*namespaceURI*/, 
+    const QString& /*localName*/, 
+    const QString& qName, 
+    const QXmlAttributes& atts)
+{
+    if (qName == QString::fromAscii(testFunctionElement)) {
+        mTestCount++;
+        mCurrentTestName = atts.value(QString::fromAscii(nameAttr));
+        return true;
+    }
+    if (qName == QString::fromAscii(incidentElement)) {
+        mParsingIncidentElement = true;
+        if (atts.value(QString::fromAscii(typeAttr)) == QString::fromAscii(attrValueFail)) {
+            mCurrentTestFailed = true;
+            mCurrentTestFile = atts.value(QString::fromAscii(fileAttr));
+            mCurrentTestFailureLine = atts.value(QString::fromAscii(lineAttr)).toInt();
+        }
+        return true;
+    }
+    mParsingDescriptionElement =
+        (qName == QString::fromAscii(descriptionElement));
+    return true;
+}
+
+bool TestRunner::endElement(
+    const QString& /*namespaceURI*/,
+    const QString& /*localName*/,
+    const QString& qName)
+{
+    if (qName == QString::fromAscii(incidentElement)) {
+        mParsingIncidentElement = false;
+        mCurrentTestFailed = false;
+        return true;
+    }
+    if (qName == QString::fromAscii(descriptionElement)) {
+        mParsingDescriptionElement = false;
+    }    
+    return true;
+}
+
+bool TestRunner::characters(const QString& ch)
+{
+    if (mParsingIncidentElement && 
+        mParsingDescriptionElement &&
+        mCurrentTestFailed) {
+        QByteArray testResult = mCurrentTestName.toAscii() + " failed:\n";
+        testResult += "File: ";
+        testResult += mCurrentTestFile.toAscii();
+        testResult += "\n";
+        testResult += "Line: ";
+        testResult += QByteArray::number(mCurrentTestFailureLine);
+        testResult += "\n";
+        testResult += "Reason: ";
+        testResult += ch.toAscii();
+        testResult += "\n";
+        mErrors.append(QString::fromAscii(testResult.data()));
+    }
+    return true;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/src/ut_cntcache.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,231 @@
+/*
+* 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 "ut_cntcache.h"
+#include "cntcache.h"
+#include "cntcache_p.h"
+
+void TestCntCache::initTestCase()
+{
+    // get contact manager
+    mContactManager = new QContactManager("symbian");
+
+    // start with a clean database
+    cleanDatabase();
+
+    // TODO: This test needs to be run with the default provider, so when there is a mechanism
+    //       to variate the info provider, use that mechanism here to select the default provider.
+
+    // create contacts; twins with same image at indexes 0,5 and 2,3 (good for increasing branch coverage)
+    mContacts[0] = createContact("Joe", "Doe", "1234567", "c:/data/images/image1.png");
+    mContacts[1] = createContact("Marja", "Meikalainen", "7654321", "");
+    mContacts[2] = createContact("Sven", "Dufva", "12121212", "c:/data/images/image2.png");
+    mContacts[3] = createContact("Twin", "Dufva", "12121212", "c:/data/images/image2.png");
+    mContacts[4] = createContact("", "", "123123", "");
+    mContacts[5] = createContact("Twin", "Doe", "1234568", "c:/data/images/image1.png");
+}
+
+void TestCntCache::cleanupTestCase()
+{
+    // end with a clean database
+    cleanDatabase();
+
+    delete mContactManager;
+    mContactManager = NULL;
+}
+
+/*
+    Test case: Constructing and deleting the cache.
+ */
+void TestCntCache::construction()
+{
+    // test creation
+    QPointer<CntCache> cache = CntCache::instance();
+    QVERIFY(cache != NULL);
+    QPointer<CntCacheThread> worker = cache->mWorker;
+    QVERIFY(worker != NULL);
+
+    // test singleton property
+    QVERIFY(cache == CntCache::instance());
+
+    // test data members
+    QVERIFY(cache->mContactManager != NULL);
+    QVERIFY(worker->mContactManager != NULL);
+    QVERIFY(worker->mThumbnailManager != NULL);
+    QVERIFY(worker->mInfoProviders.count() >= 1);
+
+    // test deletion
+    cache->onShutdown();
+    QVERIFY(CntCache::mInstance == NULL);
+}
+
+/*
+    Test case: Fetch contact info.
+
+    Fetches all six contacts in two batches of four and two contacts. The contacts are
+    divided up so that one pair of twins is in the same batch and the other pair of twins
+    has one twin in each batch. This maximizes branch coverage.
+ */
+void TestCntCache::fetchContactInfo()
+{
+    CntContactInfo info[CntTestContacts];    // info for each of the contacts
+
+    // create cache and attach a signal spy to it
+    CntCache* cache = CntCache::instance();
+    QSignalSpy spy(cache, SIGNAL(contactInfoUpdated(QContactLocalId)));
+
+    // create list of ids
+    QList<QContactLocalId> idList;
+    for (int i = 0; i < CntTestContacts; ++i) {
+        idList << mContacts[i].localId();
+    }
+
+    // fetch three of the contacts in rapid succession, one of them twice
+    info[1] = cache->fetchContactInfo(1, idList);
+    info[0] = cache->fetchContactInfo(0, idList);
+    info[4] = cache->fetchContactInfo(4, idList);
+    info[0] = cache->fetchContactInfo(0, idList);
+    info[5] = cache->fetchContactInfo(5, idList);
+
+    // check that names are ok
+    QVERIFY(info[1].name() == mContacts[1].displayLabel());
+    QVERIFY(info[0].name() == mContacts[0].displayLabel());
+    QVERIFY(info[4].name() == mContacts[4].displayLabel());
+    QVERIFY(info[5].name() == mContacts[5].displayLabel());
+
+    // wait for possible signals to arrive (in the future, all info could be returned immediately)
+    QTest::qWait(4000);
+    spy.clear();
+
+    // fetch all contacts -- they should be cached now by the read-ahead mechanism
+    for (int i = 0; i < CntTestContacts; ++i) {
+        info[i] = cache->fetchContactInfo(i, idList);
+    }
+
+    // confirm that no further signals from cache (i.e. they were all really cached)
+    QTest::qWait(2000);
+    QVERIFY(spy.count() == 0);
+
+    // confirm that returned data equals created data 
+    for (int i = 0; i < CntTestContacts; ++i) {
+        QVERIFY(info[i].name() == mContacts[i].displayLabel());
+        QVERIFY(info[i].text() == mContacts[i].detail<QContactPhoneNumber>().number());
+    }
+
+    // confirm that info cache contains correct data
+    int cacheItemCount = 0;
+    foreach (CntInfoCacheItem* item, cache->mInfoCache) {
+        // find corresponding contact
+        for (int i = 0; i < CntTestContacts; ++i) {
+            if (mContacts[i].localId() == item->contactId) {
+                QVERIFY(item->name == mContacts[i].displayLabel());
+                QVERIFY(item->text == mContacts[i].detail<QContactPhoneNumber>().number());
+                QVERIFY(item->icons[0].replace('\\', '/') == mContacts[i].detail<QContactAvatar>().imageUrl().toString().replace('\\', '/'));
+                ++cacheItemCount;
+            }
+        }
+    }
+    QVERIFY(cacheItemCount == CntTestContacts);
+
+    // confirm that icon cache contains correct data
+    cacheItemCount = 0;
+    foreach (CntIconCacheItem* item, cache->mIconCache) {
+        // find corresponding contact
+        for (int i = 0; i < CntTestContacts; ++i) {
+            if (mContacts[i].detail<QContactAvatar>().imageUrl().toString().replace('\\','/') == item->iconName.replace('\\','/')) {
+                QVERIFY(item->isFetched);
+                QVERIFY(!item->icon.isNull());
+                ++cacheItemCount;
+            }
+        }
+    }
+    QVERIFY(cacheItemCount == 2*2); // two images, both used by two contacts
+
+    cache->onShutdown();
+}
+
+/*
+    Test case: Clear cache.
+ */
+void TestCntCache::clearCache()
+{
+    CntCache* cache = CntCache::instance();
+
+    QList<QContactLocalId> idList;
+    for (int i = 0; i < CntTestContacts; ++i) {
+        idList << mContacts[i].localId();
+    }
+
+    cache->fetchContactInfo(1, idList);
+    cache->fetchContactInfo(3, idList);
+
+    QVERIFY(cache->mInfoCache.count() == 2);
+    QTest::qWait(3000);
+    QVERIFY(cache->mIconCache.count() == 2);
+
+    cache->clearCache();
+    QVERIFY(cache->mInfoCache.count() == 0);    // icon cache needn't be cleared
+    
+    delete cache;
+}
+
+/* TODO: Test cases for overflowing info and icon requests (>30) -- IDs need not be real, just confirm
+         that cancellation notifications eventually arrive */
+
+/*  
+    Helper function for cleaning the database.
+ */
+void TestCntCache::cleanDatabase()
+{
+    QList<QContactLocalId> ids = mContactManager->contactIds();
+    QMap<int, QContactManager::Error> errorMapInit;
+    mContactManager->removeContacts(ids, &errorMapInit);
+    mContactManager->removeContact(mContactManager->selfContactId());
+}
+
+/*  
+    Helper function for creating contacts.
+ */
+QContact TestCntCache::createContact(QString firstName, QString lastName, QString phoneNumber, QString imageName)
+{
+    QContact contact;
+
+    if (!firstName.isEmpty() && !lastName.isEmpty()) {
+        QContactName name;
+        name.setFirstName(firstName);
+        name.setLastName(lastName);
+        contact.saveDetail(&name);
+    }
+
+    if (!phoneNumber.isEmpty()) {
+        QContactPhoneNumber number;
+        number.setNumber(phoneNumber);
+        number.setContexts(QContactDetail::ContextHome);
+        number.setSubTypes(QContactPhoneNumber::SubTypeMobile);
+        contact.saveDetail(&number);
+    }
+
+    if (!imageName.isEmpty()) {
+        QContactAvatar avatar;
+        avatar.setImageUrl(imageName);
+        contact.saveDetail(&avatar);
+    }
+
+    mContactManager->saveContact(&contact);
+
+    return contact;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/src/ut_cntdefaultinfoprovider.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,99 @@
+/*
+* 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 "ut_cntdefaultinfoprovider.h"
+#include "cntdefaultinfoprovider.h"
+
+void TestCntDefaultInfoProvider::initTestCase()
+{
+    mCntDefaultInfoProvider = NULL;
+}
+
+void TestCntDefaultInfoProvider::create()
+{
+    mCntDefaultInfoProvider = new CntDefaultInfoProvider();
+}
+
+void TestCntDefaultInfoProvider::testSupportedFields()
+{
+    QVERIFY(mCntDefaultInfoProvider->supportedFields() == ContactInfoIcon1Field | ContactInfoTextField);
+}
+
+void TestCntDefaultInfoProvider::testRequestInfo()
+{
+    QSignalSpy spy(mCntDefaultInfoProvider, SIGNAL(infoFieldReady(CntInfoProvider*, int, ContactInfoField, const QString&)));
+    
+    QContact c;
+    QContactName name;
+    name.setFirstName("firstname");
+    name.setLastName("lastname");
+    c.saveDetail(&name);
+    
+    ContactInfoFields fields;
+    fields = ContactInfoIcon2Field;
+    
+    mCntDefaultInfoProvider->requestInfo(c, fields);
+    QCOMPARE(spy.count(), 0);
+    
+    fields = ContactInfoIcon1Field | ContactInfoTextField;
+    
+    mCntDefaultInfoProvider->requestInfo(c, fields);
+    QCOMPARE(spy.count(), 2);
+    spy.clear();
+    
+    QContactPhoneNumber number;
+    number.setNumber("1234567");
+    number.setContexts(QContactDetail::ContextHome);
+    number.setSubTypes(QContactPhoneNumber::SubTypeMobile);
+    c.saveDetail(&number);
+    
+    mCntDefaultInfoProvider->requestInfo(c, fields);
+    QCOMPARE(spy.count(), 2);
+    spy.clear();
+    
+    c.setPreferredDetail("call", number);
+
+    QContactPhoneNumber number2;
+    number2.setNumber("7654321");
+    number2.setContexts(QContactDetail::ContextWork);
+    number2.setSubTypes(QContactPhoneNumber::SubTypeMobile);
+    c.saveDetail(&number2);
+    
+    mCntDefaultInfoProvider->requestInfo(c, fields);
+    QCOMPARE(spy.count(), 2);
+    spy.clear();
+    
+    QContactAvatar avatar;
+    c.saveDetail(&avatar);
+    
+    mCntDefaultInfoProvider->requestInfo(c, fields);
+    QCOMPARE(spy.count(), 2);
+    spy.clear();
+    
+    avatar.setImageUrl(QUrl("dummyavatar"));
+    c.saveDetail(&avatar);
+    
+    mCntDefaultInfoProvider->requestInfo(c, fields);
+    QCOMPARE(spy.count(), 2);
+}
+
+void TestCntDefaultInfoProvider::cleanupTestCase()
+{
+    delete mCntDefaultInfoProvider;
+    mCntDefaultInfoProvider = NULL;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/src/ut_cntdisplaytextformatter.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,47 @@
+/*
+* 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 "ut_cntdisplaytextformatter.h"
+#include "cntdisplaytextformatter.h"
+#include <hbcolorscheme.h>
+
+void TestCntDisplayTextFormatter::testFormatter()
+{
+    QColor color = HbColorScheme::color("qtc_lineedit_selected");
+    QColor bg = HbColorScheme::color("qtc_lineedit_marker_normal");
+    QString foo = QString("<span style=\"background-color:%1;color:%2\">f</span>oo").arg(bg.name().toUpper()).arg(color.name().toUpper());
+    
+    QContactDetailFilter filter;
+    filter.setDetailDefinitionName( QContactDisplayLabel::DefinitionName );
+    filter.setMatchFlags( QContactFilter::MatchStartsWith );
+    filter.setValue( "f" );
+    
+    CntDisplayTextFormatter* format = new CntHTMLDisplayTextFormatter;
+    QString result = format->formattedText("foo", filter );
+    QVERIFY( foo == result );
+    QVERIFY( "" == format->formattedText("", filter) );
+    // invalid filter
+    QContactRelationshipFilter invalidFilter;
+    QVERIFY( "foo" == format->formattedText("foo", invalidFilter) );
+    QVERIFY( "" == format->formattedText("", invalidFilter) );
+    
+    // dummy returns always the given text, dispite of the filter
+    CntDisplayTextFormatter* dummy = new CntDummyDisplayTextFormatter;
+    QVERIFY( "foo" == dummy->formattedText("foo", filter) );
+    QVERIFY( "foo" == dummy->formattedText("foo", invalidFilter) );
+    QVERIFY( "" == dummy->formattedText("", filter) );
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/src/ut_cntlistmodel.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,601 @@
+/*
+* 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 "ut_cntlistmodel.h"
+#include "cntlistmodel.h"
+#include "cntlistmodel_p.h"
+
+#include <hbnamespace.h>
+#include <qtcontacts.h>
+#include <QUrl>
+
+void TestCntListModel::initTestCase()
+{
+    //let's have clean database before running tests 
+    mManager = new QContactManager("symbian");
+    QList<QContactLocalId> ids = mManager->contactIds();
+    QMap<int, QContactManager::Error> errorMapInit;
+    mManager->removeContacts(ids, &errorMapInit);
+    mManager->removeContact(mManager->selfContactId());
+}
+
+void TestCntListModel::contactReady(int startRow, int endRow)
+{
+    QVERIFY(startRow == endRow);
+    mDataReady = true;
+}
+
+void TestCntListModel::create()
+{
+    mCntModel = new CntListModel();
+    QVERIFY(mCntModel != NULL);
+    QVERIFY(mCntModel->rowCount() == 1);
+    QVERIFY(mCntModel->d->m_cache);
+    QVERIFY(mCntModel->d->m_ownedContactManager);
+    QVERIFY(mCntModel->d->m_contactManager != NULL);
+    
+    delete mCntModel;
+    mCntModel = NULL;
+    
+    mCntModel = new CntListModel(mManager);
+    QVERIFY(mCntModel != NULL);
+    QCOMPARE(mCntModel->rowCount(), 1);
+    QVERIFY(mCntModel->rowCount() == 1);
+    QVERIFY(mCntModel->d->m_cache);
+    QVERIFY(!mCntModel->d->m_ownedContactManager);
+    QVERIFY(mCntModel->d->m_contactManager != NULL);
+}
+
+void TestCntListModel::data()
+{
+    mModelListener = new ModelListener(this);
+    mDataReady = false;
+
+    //create and save contact
+    QContact c;
+    QContactName name;
+    name.setFirstName("firstname");
+    name.setLastName("lastname");
+    c.saveDetail(&name);
+    QContactPhoneNumber number;
+    number.setNumber("1234567");
+    number.setContexts(QContactDetail::ContextHome);
+    number.setSubTypes(QContactPhoneNumber::SubTypeMobile);
+    c.saveDetail(&number);
+    QContactEmailAddress email;
+    email.setEmailAddress("dummyemail");
+    c.saveDetail(&email);
+    QVERIFY(mManager->saveContact(&c));
+    QTest::qWait(1000);
+    
+    //check invalid row and column
+    QVariant ret;
+    ret = mCntModel->data(QModelIndex(), Qt::UserRole);
+    QVERIFY(ret.isNull());
+    
+    //check the saved contact's info
+    QModelIndex modelIndex = mCntModel->indexOfContact(c);
+    int row = modelIndex.row();
+    QContact contactFromModel = mCntModel->contact(modelIndex);
+    QVERIFY(c == contactFromModel);
+    
+    ret = mCntModel->data(modelIndex, Qt::UserRole); 
+    QVERIFY(ret.isNull());
+    
+    ret = mCntModel->data(modelIndex, Qt::DisplayRole); 
+    QVERIFY(ret.type() == QVariant::StringList);
+    QStringList displayContent;
+    displayContent = ret.toStringList();
+    QVERIFY(displayContent.count() == 2);
+    QVERIFY(displayContent.at(0) == "firstname lastname");
+    // second string is only an empty placeholder, e.g. " ", until cache has fetched the value
+
+    // wait for cache to signal that all contact info is ready
+    while (!mDataReady) { QTest::qWait(200); QApplication::processEvents(); }
+    mDataReady = false;
+    ret = mCntModel->data(modelIndex, Qt::DisplayRole); 
+
+    QVERIFY(ret.type() == QVariant::StringList);
+    displayContent = ret.toStringList();
+    QVERIFY(displayContent.count() == 2);
+    QVERIFY(displayContent.at(0) == "firstname lastname");
+    QVERIFY(displayContent.at(1) == "1234567");
+   
+    // check backgroundrole
+    ret = mCntModel->data(modelIndex, Qt::BackgroundRole); 
+    QVERIFY(ret.isNull());
+    
+    //check decoration role
+    ret = mCntModel->data(modelIndex, Qt::DecorationRole); 
+    QVERIFY(ret.type() == QVariant::List);
+    
+    ret = mCntModel->data(modelIndex, Hb::IndexFeedbackRole); 
+    QVERIFY(ret.type() == QVariant::String);
+
+    // add empty avatar and check decoration
+    QContactAvatar avatar;
+    c.saveDetail(&avatar);
+    QVERIFY(mManager->saveContact(&c));
+    QTest::qWait(1000);
+    ret = mCntModel->data(modelIndex, Qt::DecorationRole); 
+    QVERIFY(ret.type() == QVariant::List);
+    
+    // add data to the avatar and check decoration
+    avatar.setImageUrl(QUrl("dummyimagepath"));
+    c.saveDetail(&avatar);
+    QVERIFY(mManager->saveContact(&c));
+    QTest::qWait(1000);
+    modelIndex = mCntModel->indexOfContact(c);
+    ret = mCntModel->data(modelIndex, Qt::DecorationRole); 
+
+    // wait for cache to signal that all contact info is ready
+    while (!mDataReady) { QTest::qWait(200); QApplication::processEvents(); }
+    mDataReady = false;
+    ret = mCntModel->data(modelIndex, Qt::DecorationRole); 
+    QVERIFY(ret.type() == QVariant::List);
+    
+    // check MyCard info from the model
+    modelIndex = mCntModel->index(0, 0);
+    ret = mCntModel->data(modelIndex, Qt::BackgroundRole);
+    QVERIFY(!ret.isNull());
+    
+    // create and assign empty MyCard
+    QContact myCard;
+    QVERIFY(mManager->saveContact(&myCard));
+    QTest::qWait(1000);
+    mManager->setSelfContactId(myCard.localId());
+    QTest::qWait(1000);
+    
+    // check that MyCard was really saved
+    QCOMPARE(mCntModel->myCardId(), myCard.localId());
+    
+    // check MyCard info from the model
+    myCard = mManager->contact(mManager->selfContactId());
+    modelIndex = mCntModel->indexOfContact(myCard);
+    ret = mCntModel->data(modelIndex, Qt::BackgroundRole);
+    QVERIFY(!ret.isNull());
+    
+    ret = mCntModel->data(modelIndex, Qt::DisplayRole);
+    QVERIFY(ret.type() == QVariant::StringList);
+    displayContent = ret.toStringList();
+    QVERIFY(displayContent.count() == 1); // "Unnamed"
+    
+    // add some content to MyCard
+    myCard.saveDetail(&number);
+    QVERIFY(mManager->saveContact(&myCard));
+    QTest::qWait(1000);
+    ret = mCntModel->data(modelIndex, Qt::DisplayRole);
+    // wait for cache
+    QTest::qWait(1000);
+    ret = mCntModel->data(modelIndex, Qt::DisplayRole);
+    QVERIFY(ret.type() == QVariant::StringList);
+    displayContent = ret.toStringList();
+    QVERIFY(displayContent.contains(hbTrId("txt_phob_list_unnamed")));
+    
+    ret = mCntModel->data(modelIndex, Hb::IndexFeedbackRole); 
+    QVERIFY(ret.isNull());
+}
+
+void TestCntListModel::rowCount()
+{
+    // we should have 2 contacts in the model saved from the last test case
+    QTest::qWait(5000);
+    QCOMPARE(mCntModel->rowCount(), 2);
+}
+
+void TestCntListModel::contact()
+{
+    QList<QContactLocalId> ids = mManager->contactIds();
+    QMap<int, QContactManager::Error> errorMapContact;
+    mManager->removeContacts(ids,&errorMapContact);
+    QTest::qWait(1000);
+    
+    QModelIndex modelIndex = mCntModel->index(0, 0);
+    QContact empty = mCntModel->contact(modelIndex);
+    //QVERIFY(empty.isEmpty());
+    
+    //create and save contact
+    QContact c;
+    QContactName name;
+    name.setFirstName("firstname");
+    name.setLastName("lastname");
+    c.saveDetail(&name);
+    QContactPhoneNumber number;
+    number.setNumber("1234567");
+    number.setContexts(QContactDetail::ContextHome);
+    number.setSubTypes(QContactPhoneNumber::SubTypeMobile);
+    c.saveDetail(&number);
+    QContactEmailAddress email;
+    email.setEmailAddress("dummyemail");
+    c.saveDetail(&email);
+    QVERIFY(mManager->saveContact(&c));
+    QTest::qWait(1000);
+    
+    modelIndex = mCntModel->index(10, 0);
+    c = mCntModel->contact(modelIndex);
+    QVERIFY(c.isEmpty());
+    
+    modelIndex = mCntModel->index(1, 0);
+    c = mCntModel->contact(modelIndex);
+    QVERIFY(!c.isEmpty());
+}
+
+void TestCntListModel::contactId()
+{
+    QModelIndex modelIndex = mCntModel->index(1, 0);
+    QContact c = mCntModel->contact(modelIndex);
+    
+    QVERIFY(mCntModel->contactId(modelIndex) == c.localId());
+}
+
+void TestCntListModel::indexOfContact()
+{
+    QModelIndex modelIndex = mCntModel->index(1, 0);
+    QContact c = mCntModel->contact(modelIndex);
+    
+    QVERIFY(mCntModel->indexOfContact(c) == modelIndex);
+}
+
+void TestCntListModel::indexOfContactId()
+{
+    QModelIndex modelIndex = mCntModel->index(1, 0);
+    QContact c = mCntModel->contact(modelIndex);
+    
+    QVERIFY(mCntModel->indexOfContactId(c.localId()) == modelIndex);
+}
+
+void TestCntListModel::contactManager()
+{
+    QVERIFY(mManager == &(mCntModel->contactManager()));
+}
+
+void TestCntListModel::setFilter()
+{
+    QList<QContactLocalId> ids = mManager->contactIds();
+    QMap<int, QContactManager::Error> errorMap;
+    mManager->removeContacts(ids,&errorMap);
+    QTest::qWait(1000);
+    
+    QContact c;
+    QContactName name;
+    name.setFirstName("firstname");
+    name.setLastName("lastname");
+    c.saveDetail(&name);
+    QVERIFY(mManager->saveContact(&c));
+    
+    QContactUnionFilter unionFilter;
+
+    QContactDetailFilter landlineFilter;
+    landlineFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); 
+    landlineFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeLandline));
+    unionFilter << landlineFilter;
+
+    QContactDetailFilter mobileFilter;
+    mobileFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); 
+    mobileFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeMobile));
+    unionFilter << mobileFilter;
+    
+    mCntModel->setFilter(unionFilter);
+    
+    QModelIndex modelIndex = mCntModel->indexOfContact(c);
+    QVERIFY(modelIndex.row() < 0);
+    QVERIFY(mCntModel->d->m_filter == unionFilter);
+    QVERIFY(mCntModel->d->m_sortOrders.count() == 2);
+}
+
+void TestCntListModel::myCard()
+{
+    delete mCntModel;
+    mCntModel = 0;
+    
+    mCntModel = new CntListModel(mManager);
+    
+    QList<QContactLocalId> ids = mManager->contactIds();
+    QMap<int, QContactManager::Error> errorMap;
+    mManager->removeContacts(ids,&errorMap);
+    QTest::qWait(1000);
+    
+    QContact c;
+    QContactName name;
+    name.setFirstName("firstname");
+    name.setLastName("lastname");
+    c.saveDetail(&name);
+    QVERIFY(mManager->saveContact(&c));
+    
+    QSignalSpy spy(mCntModel, SIGNAL(modelReset()));
+    
+    QVERIFY(mCntModel->myCardStatus());
+    
+    mCntModel->showMyCard(false);
+    QVERIFY(!mCntModel->myCardStatus());
+    QCOMPARE(spy.count(), 2);
+    
+    mCntModel->showMyCard(true);
+    QVERIFY(mCntModel->myCardStatus());
+    QCOMPARE(spy.count(), 4);
+    
+    mManager->setSelfContactId(c.localId());
+    QTest::qWait(1000);
+    spy.clear();
+    
+    mCntModel->showMyCard(false);
+    QVERIFY(!mCntModel->myCardStatus());
+    QCOMPARE(spy.count(), 2);
+    
+    mCntModel->showMyCard(true);
+    QVERIFY(mCntModel->myCardStatus());
+    QCOMPARE(spy.count(), 4);
+    mCntModel->showMyCard(true);
+    QVERIFY(mCntModel->myCardStatus());
+    QCOMPARE(spy.count(), 4);
+}
+
+void TestCntListModel::rowId()
+{
+    QList<QContactLocalId> ids = mManager->contactIds();
+    QMap<int, QContactManager::Error> errorMap;
+    mManager->removeContacts(ids,&errorMap);
+    QTest::qWait(1000);
+    
+    QContact c;
+    QContactName name;
+    name.setFirstName("firstname");
+    name.setLastName("lastname");
+    c.saveDetail(&name);
+    QVERIFY(mManager->saveContact(&c));
+    
+    int row = mCntModel->rowId(c.localId());
+    QVERIFY(row > 0);
+    QVERIFY(mCntModel->validRowId(row));
+    QVERIFY(!mCntModel->validRowId(-100));
+    QVERIFY(!mCntModel->validRowId(100));
+}
+
+void TestCntListModel::dataForDisplayRole()
+{
+    QList<QContactLocalId> ids = mManager->contactIds();
+    QMap<int, QContactManager::Error> errorMap;
+    mManager->removeContacts(ids,&errorMap);
+    QTest::qWait(1000);
+    
+    QContact c;
+    QContactName name;
+    name.setFirstName("firstname");
+    name.setLastName("lastname");
+    c.saveDetail(&name);
+    QVERIFY(mManager->saveContact(&c));
+    
+    int row = mCntModel->rowId(c.localId());
+    QVariant var = mCntModel->dataForRole(row, Qt::DisplayRole);
+    QVERIFY(var.type() == QVariant::StringList);
+    
+    var = mCntModel->dataForRole(0, Qt::DisplayRole);
+    QVERIFY(var.type() == QVariant::StringList);
+}
+
+void TestCntListModel::handleAdded()
+{
+    QList<QContactLocalId> ids = mManager->contactIds();
+    QMap<int, QContactManager::Error> errorMap;
+    mManager->removeContacts(ids,&errorMap);
+    QTest::qWait(1000);
+
+    QSignalSpy spy(mCntModel, SIGNAL(rowsAboutToBeInserted(const QModelIndex&, int, int)));
+    
+    QContact c;
+    QContactName name;
+    name.setFirstName("firstname");
+    name.setLastName("lastname");
+    c.saveDetail(&name);
+    QVERIFY(mManager->saveContact(&c));
+
+    QCOMPARE(spy.count(), 1);
+    
+    QList<QContactLocalId> emptyList;
+    mCntModel->handleAdded(emptyList);
+    QCOMPARE(spy.count(), 1);
+}
+
+void TestCntListModel::handleChanged()
+{
+    QList<QContactLocalId> ids = mManager->contactIds();
+    QMap<int, QContactManager::Error> errorMap;
+    mManager->removeContacts(ids,&errorMap);
+    QTest::qWait(1000);
+    
+    QContact c;
+    QContactName name;
+    name.setFirstName("firstname");
+    name.setLastName("lastname");
+    c.saveDetail(&name);
+    QVERIFY(mManager->saveContact(&c));
+    
+    QSignalSpy spy(mCntModel, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex&)));
+
+    name.setMiddleName("mid");
+    c.saveDetail(&name);
+    QVERIFY(mManager->saveContact(&c));
+
+    QCOMPARE(spy.count(), 1);
+    
+    QList<QContactLocalId> emptyList;
+    mCntModel->handleChanged(emptyList);
+    QCOMPARE(spy.count(), 1);
+}
+
+void TestCntListModel::handleRemoved()
+{
+    QSignalSpy spy(mCntModel, SIGNAL(rowsAboutToBeRemoved(const QModelIndex&, int, int)));
+    
+    QList<QContactLocalId> ids = mManager->contactIds();
+    QMap<int, QContactManager::Error> errorMap;
+    mManager->removeContacts(ids,&errorMap);
+    QTest::qWait(1000);
+    
+    QCOMPARE(spy.count(), 1);
+    
+    QList<QContactLocalId> emptyList;
+    mCntModel->handleRemoved(emptyList);
+    QCOMPARE(spy.count(), 1);
+}
+
+void TestCntListModel::handleMyCardChanged()
+{
+    QList<QContactLocalId> ids = mManager->contactIds();
+    QMap<int, QContactManager::Error> errorMap;
+    mManager->removeContacts(ids,&errorMap);
+    QTest::qWait(1000);
+    
+    QContact c;
+    QContactName name;
+    name.setFirstName("firstname");
+    name.setLastName("lastname");
+    c.saveDetail(&name);
+    QVERIFY(mManager->saveContact(&c));
+    
+    mCntModel->handleMyCardChanged(0, c.localId());
+    QVERIFY(mCntModel->d->m_myCardId == c.localId());
+}
+
+void TestCntListModel::handleRelationships()
+{
+    // remove all contacts
+    QList<QContactLocalId> ids = mManager->contactIds();
+    QMap<int, QContactManager::Error> errorMap;
+    mManager->removeContacts(ids,&errorMap);
+    QTest::qWait(1000);
+
+    // create group "myGroup"
+    QContact group;
+    group.setType(QContactType::TypeGroup);
+    QContactName groupName;
+    groupName.setCustomLabel("myGroup");
+    group.saveDetail(&groupName);
+    mManager->saveContact(&group);
+
+    // create a relationship filter
+    QContactRelationshipFilter groupFilter;
+    groupFilter.setRelationshipType(QContactRelationship::HasMember);
+    groupFilter.setRelatedContactRole(QContactRelationship::First);
+    groupFilter.setRelatedContactId(group.id()); 
+
+    // create new listmodel
+    CntListModel* groupListModel = new CntListModel(mManager, groupFilter, false);
+    QVERIFY(groupListModel != NULL);
+
+    QCOMPARE(groupListModel->rowCount(), 0);
+
+    // create contacts
+    QList<QContact> contacts;
+    contacts << createContact("Alfa", "One");
+    contacts << createContact("Beta", "Two");
+    contacts << createContact("Gamma", "Three");
+    QTest::qWait(1000);
+    QCOMPARE(groupListModel->rowCount(), 0);
+
+    // add contacts to group
+    foreach (QContact contact, contacts) {
+        addGroupMember(group, contact);
+    }
+    QTest::qWait(1000);
+    QCOMPARE(groupListModel->rowCount(), 3);
+
+    // remove contact from group
+    removeGroupMember(group, contacts.at(1));
+    QTest::qWait(1000);
+    QCOMPARE(groupListModel->rowCount(), 2);
+
+    // add and remove empty list
+    QList<QContactLocalId> emptyList;
+    emptyList << group.localId();
+    mCntModel->handleAddedRelationship(emptyList);
+    QCOMPARE(groupListModel->rowCount(), 2);
+    mCntModel->handleRemovedRelationship(emptyList);
+    QCOMPARE(groupListModel->rowCount(), 2);
+
+    // verify that contact on second row is "Gamma Three" (comes after "Alfa One"
+    // regardless of sorting type and Beta Two was removed)
+    QVERIFY(groupListModel->indexOfContact(contacts.at(0)).row() == 0);
+    QVERIFY(groupListModel->indexOfContact(contacts.at(1)).row() == -1);
+    QVERIFY(groupListModel->indexOfContact(contacts.at(2)).row() == 1);
+
+    // create a contact and make sure list model count does not change
+    createContact("Delta", "Four");
+    QTest::qWait(1000);
+    QCOMPARE(groupListModel->rowCount(), 2);
+    
+    delete groupListModel;
+}
+
+QContact TestCntListModel::createContact(const QString& firstName, const QString& lastName)
+{
+    QContact contact;
+    QContactName name;
+    name.setFirstName(firstName);
+    name.setLastName(lastName);
+    contact.saveDetail(&name);
+    mManager->saveContact(&contact);
+
+    return contact;
+}
+
+void TestCntListModel::addGroupMember(const QContact& group, const QContact& contact)
+{
+    QContactRelationship relationship;
+    relationship.setRelationshipType(QContactRelationship::HasMember);
+    relationship.setFirst(group.id());
+    relationship.setSecond(contact.id());
+    mManager->saveRelationship(&relationship);
+}
+
+void TestCntListModel::removeGroupMember(const QContact& group, const QContact& contact)
+{
+    QContactRelationship relationship;
+    relationship.setRelationshipType(QContactRelationship::HasMember);
+    relationship.setFirst(group.id());
+    relationship.setSecond(contact.id());
+    mManager->removeRelationship(relationship);
+}
+
+void TestCntListModel::cleanupTestCase()
+{
+    mCntModel->d->m_cache->onShutdown();
+    delete mCntModel;
+    mCntModel = 0;
+    
+    //let's have clean database after running tests
+    QList<QContactLocalId> ids = mManager->contactIds();
+    QMap<int, QContactManager::Error> errorMap;
+    mManager->removeContacts(ids, &errorMap);
+    delete mManager;
+    mManager = 0;
+    delete mModelListener;
+    mModelListener = 0;
+}
+
+
+ModelListener::ModelListener(TestCntListModel* parent)
+    : mParent(parent)
+{
+    connect(mParent->mCntModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(onDataChanged(QModelIndex,QModelIndex)));
+}
+
+void ModelListener::onDataChanged(QModelIndex start, QModelIndex end)
+{
+    mParent->contactReady(start.row(), end.row());
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/src/ut_cntpresenceinfoprovider.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,190 @@
+/*
+* 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 "ut_cntpresenceinfoprovider.h"
+#include "cntpresenceinfoprovider.h"
+
+#include <prcpresencebuddyinfo_qt.h>
+#include <prcpresencereader_qt.h>
+#include <prcpresencewriter_qt.h>
+
+void TestCntPresenceInfoProvider::initTestCase()
+{
+    mCntPresenceInfoProvider = NULL;
+}
+
+void TestCntPresenceInfoProvider::create()
+{
+    mCntPresenceInfoProvider = new CntPresenceInfoProvider();
+}
+
+void TestCntPresenceInfoProvider::testSupportedFields()
+{
+    QVERIFY(mCntPresenceInfoProvider->supportedFields() == ContactInfoIcon2Field);
+}
+
+void TestCntPresenceInfoProvider::testRequestInfo()
+{
+    PrcPresenceWriter *writer = PrcPresenceWriter::createWriter();
+    
+    PrcPresenceBuddyInfoQt *buddy = PrcPresenceBuddyInfoQt::createInstance();
+    buddy->setIdentity("sip:test@test.com");
+    buddy->setAvailability(PrcPresenceBuddyInfoQt::PrcNotAvailable, "meh");
+    writer->writePresence(*buddy);
+    
+    QContactManager manager("symbian");
+    
+    QContact c;
+    QContactName name;
+    name.setFirstName("firstname");
+    name.setLastName("lastname");
+    c.saveDetail(&name);
+    QContactPhoneNumber number;
+    number.setNumber("1234567");
+    number.setContexts(QContactDetail::ContextHome);
+    number.setSubTypes(QContactPhoneNumber::SubTypeMobile);
+    c.saveDetail(&number);
+    manager.saveContact(&c);
+    
+    ContactInfoFields fields;
+    fields = ContactInfoTextField;
+    
+    QSignalSpy spy(mCntPresenceInfoProvider, SIGNAL(infoFieldReady(CntInfoProvider*, int, ContactInfoField, const QString&)));
+    
+    mCntPresenceInfoProvider->requestInfo(c, fields);
+    QCOMPARE(spy.count(), 0);
+    QVERIFY(mCntPresenceInfoProvider->mBuddyMap.isEmpty());
+    
+    fields = ContactInfoIcon2Field;
+    
+    mCntPresenceInfoProvider->requestInfo(c, fields);
+    QCOMPARE(spy.count(), 0);
+    QVERIFY(mCntPresenceInfoProvider->mBuddyMap.isEmpty());
+    
+    QContactOnlineAccount account;
+    account.setSubTypes(QStringList() << QContactOnlineAccount::SubTypeSip);
+    account.setServiceProvider("sip");
+    account.setAccountUri("test@test.com");
+    c.saveDetail(&account);
+    QContactOnlineAccount account2;
+    account2.setSubTypes(QStringList() << QContactOnlineAccount::SubTypeSipVoip);
+    account.setServiceProvider("sip");
+    account2.setAccountUri("test@test.com");
+    c.saveDetail(&account2);
+    QContactOnlineAccount account3;
+    account3.setSubTypes(QStringList() << QContactOnlineAccount::SubTypeSip);
+    account3.setAccountUri("malformatted");
+    c.saveDetail(&account3);
+    manager.saveContact(&c);
+    
+    mCntPresenceInfoProvider->requestInfo(c, fields);
+    QCOMPARE(spy.count(), 0);
+    QCOMPARE(mCntPresenceInfoProvider->mBuddyMap.count(), 1);
+    
+    delete mCntPresenceInfoProvider;
+    mCntPresenceInfoProvider = NULL;
+    
+    buddy->setAvailability(PrcPresenceBuddyInfoQt::PrcAvailable, "meh");
+    writer->writePresence(*buddy);
+    
+    mCntPresenceInfoProvider = new CntPresenceInfoProvider();
+    
+    QSignalSpy spy2(mCntPresenceInfoProvider, SIGNAL(infoFieldReady(CntInfoProvider*, int, ContactInfoField, const QString&)));
+    mCntPresenceInfoProvider->requestInfo(c, fields);
+    QCOMPARE(spy2.count(), 1);
+    QCOMPARE(mCntPresenceInfoProvider->mBuddyMap.count(), 1);
+    
+    delete buddy;
+    delete writer;
+}
+
+void TestCntPresenceInfoProvider::testHandlePresenceUpdate()
+{
+    QSignalSpy spy(mCntPresenceInfoProvider, SIGNAL(infoFieldReady(CntInfoProvider*, int, ContactInfoField, const QString&)));
+    
+    PrcPresenceWriter *writer = PrcPresenceWriter::createWriter();
+    PrcPresenceReader *reader = PrcPresenceReader::createReader();
+    
+    PrcPresenceBuddyInfoQt *dummyBuddy = PrcPresenceBuddyInfoQt::createInstance();
+    dummyBuddy->setIdentity("sip:dummy@dummy.com");
+    dummyBuddy->setAvailability(PrcPresenceBuddyInfoQt::PrcAvailable, "meh");
+    writer->writePresence(*dummyBuddy);
+    
+    mCntPresenceInfoProvider->handlePresenceUpdate(true, dummyBuddy);
+    QCOMPARE(spy.count(), 0);
+
+    mCntPresenceInfoProvider->handlePresenceUpdate(false, dummyBuddy);
+    QCOMPARE(spy.count(), 0);
+
+    mCntPresenceInfoProvider->handlePresenceUpdate(true, NULL);
+    QCOMPARE(spy.count(), 0);
+    
+    PrcPresenceBuddyInfoQt *buddy = reader->presenceInfo("sip:test@test.com");
+    buddy->setAvailability(PrcPresenceBuddyInfoQt::PrcNotAvailable, "meh");
+    writer->writePresence(*buddy);
+    QTest::qWait(5000);
+    QCOMPARE(spy.count(), 1);
+    
+    QContactManager manager("symbian");
+    QContact c = manager.contact(mCntPresenceInfoProvider->mBuddyMap.value("sip:test@test.com"));
+    
+    QList<QContactOnlineAccount> accounts = c.details<QContactOnlineAccount>();
+    foreach (QContactOnlineAccount account, accounts)
+    {
+        c.removeDetail(&account);
+    }
+    manager.saveContact(&c);
+    
+    buddy->setAvailability(PrcPresenceBuddyInfoQt::PrcAvailable, "meh");
+    writer->writePresence(*buddy);
+    QTest::qWait(5000);
+    QCOMPARE(spy.count(), 2);
+    
+    delete writer;
+    delete reader;
+    delete dummyBuddy;
+    delete buddy;
+}
+
+void TestCntPresenceInfoProvider::testParsePresence()
+{
+    PrcPresenceBuddyInfoQt *buddy = PrcPresenceBuddyInfoQt::createInstance();
+    buddy->setAvailability(PrcPresenceBuddyInfoQt::PrcNotAvailable, "meh");
+
+    QList<PrcPresenceBuddyInfoQt*> buddies;
+    buddies.append(buddy);
+
+    QVERIFY(mCntPresenceInfoProvider->parsePresence(buddies).isEmpty());
+
+    buddy->setAvailability(PrcPresenceBuddyInfoQt::PrcAvailable, "meh");
+
+    QVERIFY(mCntPresenceInfoProvider->parsePresence(buddies) == "qtg_small_online");
+    
+    delete buddy;
+}
+
+void TestCntPresenceInfoProvider::cleanupTestCase()
+{
+    delete mCntPresenceInfoProvider;
+    mCntPresenceInfoProvider = NULL;
+    
+    QContactManager manager("symbian");
+    QList<QContactLocalId> ids = manager.contactIds();
+    QMap<int, QContactManager::Error> errorMap;
+    manager.removeContacts(ids, &errorMap);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/ut_cntlistmodel.pro	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,79 @@
+#                                                                    
+# 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:                                                        
+#                                                                     
+#
+
+
+TEMPLATE = app
+TARGET =
+
+DEFINES += QT_NO_DEBUG_OUTPUT
+DEFINES += QT_NO_WARNING_OUTPUT
+DEFINES += CNTLISTMODEL_NO_EXPORT
+    
+MOC_DIR = moc
+
+QT += testlib xml
+
+CONFIG += hb
+
+TARGET.CAPABILITY = ALL \
+    -TCB
+
+INCLUDEPATH += .
+INCLUDEPATH += ../../inc
+INCLUDEPATH += ../../../../inc
+INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
+    
+HEADERS += inc/testrunner.h \
+           inc/ut_cntlistmodel.h \
+           inc/ut_cntcache.h \
+           inc/ut_cntpresenceinfoprovider.h \
+           inc/ut_cntdefaultinfoprovider.h \
+           inc/ut_cntdisplaytextformatter.h \
+           ../../inc/cntlistmodelglobal.h \
+           ../../inc/cntlistmodel.h \
+           ../../inc/cntlistmodel_p.h \
+           ../../inc/cntcache.h \
+           ../../inc/cntcache_p.h \
+           ../../inc/cntdefaultinfoprovider.h \
+           ../../inc/cntpresenceinfoprovider.h \
+           ../../inc/cntdisplaytextformatter.h \
+           ../../../../inc/cntdebug.h
+
+SOURCES += src/testrunner.cpp \
+           src/main.cpp \
+           src/ut_cntlistmodel.cpp \
+           src/ut_cntcache.cpp \
+           src/ut_cntpresenceinfoprovider.cpp \
+           src/ut_cntdefaultinfoprovider.cpp \
+           src/ut_cntdisplaytextformatter.cpp \
+           ../../src/cntlistmodel.cpp \
+           ../../src/cntcache.cpp \
+           ../../src/cntcache_p.cpp \
+           ../../src/cntdefaultinfoprovider.cpp \
+           ../../src/cntpresenceinfoprovider.cpp \
+           ../../src/cntdisplaytextformatter.cpp
+
+BLD_INF_RULES.prj_exports += "image1.png /epoc32/winscw/c/data/images/"
+BLD_INF_RULES.prj_exports += "image2.png /epoc32/winscw/c/data/images/"
+    
+LIBS += -lQtContacts \
+        -lhbcore \
+        -lthumbnailmanagerqt \
+        -lpresencecacheqt \
+        -lxqsettingsmanager
+
+symbian:MMP_RULES += SMPSAFE
\ No newline at end of file
--- a/phonebookui/eabi/cntcommonuiu.def	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/eabi/cntcommonuiu.def	Fri Oct 15 12:24:46 2010 +0300
@@ -1,207 +1,217 @@
 EXPORTS
 	_ZN11CntEditView10deactivateEv @ 1 NONAME
-	_ZN11CntEditView11qt_metacallEN11QMetaObject4CallEiPPv @ 2 NONAME
-	_ZN11CntEditView11qt_metacastEPKc @ 3 NONAME
-	_ZN11CntEditView14contactRemovedEb @ 4 NONAME
-	_ZN11CntEditView14contactUpdatedEi @ 5 NONAME
-	_ZN11CntEditView16changesDiscardedEv @ 6 NONAME
-	_ZN11CntEditView16staticMetaObjectE @ 7 NONAME DATA 16
-	_ZN11CntEditView19getStaticMetaObjectEv @ 8 NONAME
-	_ZN11CntEditView8activateE4QMapIi8QVariantE @ 9 NONAME
-	_ZN11CntEditView9setEngineER17CntAbstractEngine @ 10 NONAME
-	_ZN11CntEditViewC1Ev @ 11 NONAME
-	_ZN11CntEditViewC2Ev @ 12 NONAME
-	_ZN11CntEditViewD0Ev @ 13 NONAME
-	_ZN11CntEditViewD1Ev @ 14 NONAME
-	_ZN11CntEditViewD2Ev @ 15 NONAME
-	_ZN13CntKeyGrabber11eventFilterEP7QObjectP6QEvent @ 16 NONAME
-	_ZN13CntKeyGrabber11qt_metacallEN11QMetaObject4CallEiPPv @ 17 NONAME
-	_ZN13CntKeyGrabber11qt_metacastEPKc @ 18 NONAME
-	_ZN13CntKeyGrabber16staticMetaObjectE @ 19 NONAME DATA 16
-	_ZN13CntKeyGrabber19getStaticMetaObjectEv @ 20 NONAME
-	_ZN13CntKeyGrabberC1EP12HbMainWindowP7QObject @ 21 NONAME
-	_ZN13CntKeyGrabberC2EP12HbMainWindowP7QObject @ 22 NONAME
-	_ZN13CntKeyGrabberD0Ev @ 23 NONAME
-	_ZN13CntKeyGrabberD1Ev @ 24 NONAME
-	_ZN13CntKeyGrabberD2Ev @ 25 NONAME
-	_ZN13CntMainWindow11qt_metacallEN11QMetaObject4CallEiPPv @ 26 NONAME
-	_ZN13CntMainWindow11qt_metacastEPKc @ 27 NONAME
-	_ZN13CntMainWindow16staticMetaObjectE @ 28 NONAME DATA 16
-	_ZN13CntMainWindow19getStaticMetaObjectEv @ 29 NONAME
-	_ZN13CntMainWindowC1EP7QWidgeti @ 30 NONAME
-	_ZN13CntMainWindowC2EP7QWidgeti @ 31 NONAME
-	_ZN13CntMainWindowD0Ev @ 32 NONAME
-	_ZN13CntMainWindowD1Ev @ 33 NONAME
-	_ZN13CntMainWindowD2Ev @ 34 NONAME
-	_ZN14CntActionPopup11qt_metacallEN11QMetaObject4CallEiPPv @ 35 NONAME
-	_ZN14CntActionPopup11qt_metacastEPKc @ 36 NONAME
-	_ZN14CntActionPopup15showActionPopupE7QString @ 37 NONAME
-	_ZN14CntActionPopup16staticMetaObjectE @ 38 NONAME DATA 16
-	_ZN14CntActionPopup19getStaticMetaObjectEv @ 39 NONAME
-	_ZN14CntActionPopup20executeContactActionERN10QtMobility8QContactENS0_14QContactDetailE7QString @ 40 NONAME
-	_ZN14CntActionPopup24actionPopupCancelPressedEv @ 41 NONAME
-	_ZN14CntActionPopupC1EPN10QtMobility8QContactE @ 42 NONAME
-	_ZN14CntActionPopupC2EPN10QtMobility8QContactE @ 43 NONAME
-	_ZN14CntActionPopupD0Ev @ 44 NONAME
-	_ZN14CntActionPopupD1Ev @ 45 NONAME
-	_ZN14CntActionPopupD2Ev @ 46 NONAME
-	_ZN16CntViewNavigator11qt_metacallEN11QMetaObject4CallEiPPv @ 47 NONAME
-	_ZN16CntViewNavigator11qt_metacastEPKc @ 48 NONAME
-	_ZN16CntViewNavigator12addExceptionERKiS1_ @ 49 NONAME
-	_ZN16CntViewNavigator12removeEffectERKi @ 50 NONAME
-	_ZN16CntViewNavigator15removeExceptionERKi @ 51 NONAME
-	_ZN16CntViewNavigator16staticMetaObjectE @ 52 NONAME DATA 16
-	_ZN16CntViewNavigator19getStaticMetaObjectEv @ 53 NONAME
-	_ZN16CntViewNavigator4backER6QFlagsIN2Hb14ViewSwitchFlagEEb @ 54 NONAME
-	_ZN16CntViewNavigator4nextERKiR6QFlagsIN2Hb14ViewSwitchFlagEE @ 55 NONAME
-	_ZN16CntViewNavigator7addRootERKi @ 56 NONAME
-	_ZN16CntViewNavigator9addEffectERKiS1_ @ 57 NONAME
-	_ZN16CntViewNavigatorC1EP7QObject @ 58 NONAME
-	_ZN16CntViewNavigatorC2EP7QObject @ 59 NONAME
-	_ZN16CntViewNavigatorD0Ev @ 60 NONAME
-	_ZN16CntViewNavigatorD1Ev @ 61 NONAME
-	_ZN16CntViewNavigatorD2Ev @ 62 NONAME
-	_ZN18CntContactCardView10deactivateEv @ 63 NONAME
-	_ZN18CntContactCardView11backPressedEi @ 64 NONAME
-	_ZN18CntContactCardView11qt_metacallEN11QMetaObject4CallEiPPv @ 65 NONAME
-	_ZN18CntContactCardView11qt_metacastEPKc @ 66 NONAME
-	_ZN18CntContactCardView13addToContactsEv @ 67 NONAME
-	_ZN18CntContactCardView13viewActivatedEP22CntAbstractViewManager4QMapIi8QVariantE @ 68 NONAME
-	_ZN18CntContactCardView16staticMetaObjectE @ 69 NONAME DATA 16
-	_ZN18CntContactCardView19getStaticMetaObjectEv @ 70 NONAME
-	_ZN18CntContactCardView8activateE4QMapIi8QVariantE @ 71 NONAME
-	_ZN18CntContactCardView9setEngineER17CntAbstractEngine @ 72 NONAME
-	_ZN18CntContactCardViewC1Eb @ 73 NONAME
-	_ZN18CntContactCardViewC2Eb @ 74 NONAME
-	_ZN18CntContactCardViewD0Ev @ 75 NONAME
-	_ZN18CntContactCardViewD1Ev @ 76 NONAME
-	_ZN18CntContactCardViewD2Ev @ 77 NONAME
-	_ZN18CntGroupMemberView10deactivateEv @ 78 NONAME
-	_ZN18CntGroupMemberView11backPressedEv @ 79 NONAME
-	_ZN18CntGroupMemberView11qt_metacallEN11QMetaObject4CallEiPPv @ 80 NONAME
-	_ZN18CntGroupMemberView11qt_metacastEPKc @ 81 NONAME
-	_ZN18CntGroupMemberView16staticMetaObjectE @ 82 NONAME DATA 16
-	_ZN18CntGroupMemberView19getStaticMetaObjectEv @ 83 NONAME
-	_ZN18CntGroupMemberView8activateE4QMapIi8QVariantE @ 84 NONAME
-	_ZN18CntGroupMemberView9setEngineER17CntAbstractEngine @ 85 NONAME
-	_ZN18CntGroupMemberViewC1Ev @ 86 NONAME
-	_ZN18CntGroupMemberViewC2Ev @ 87 NONAME
-	_ZN18CntGroupMemberViewD0Ev @ 88 NONAME
-	_ZN18CntGroupMemberViewD1Ev @ 89 NONAME
-	_ZN18CntGroupMemberViewD2Ev @ 90 NONAME
-	_ZN20CntBaseSelectionView10deactivateEv @ 91 NONAME
-	_ZN20CntBaseSelectionView10viewClosedEv @ 92 NONAME
-	_ZN20CntBaseSelectionView10viewOpenedEP22CntAbstractViewManager4QMapIi8QVariantE @ 93 NONAME
-	_ZN20CntBaseSelectionView11qt_metacallEN11QMetaObject4CallEiPPv @ 94 NONAME
-	_ZN20CntBaseSelectionView11qt_metacastEPKc @ 95 NONAME
-	_ZN20CntBaseSelectionView16staticMetaObjectE @ 96 NONAME DATA 16
-	_ZN20CntBaseSelectionView19getStaticMetaObjectEv @ 97 NONAME
-	_ZN20CntBaseSelectionView8activateE4QMapIi8QVariantE @ 98 NONAME
-	_ZN20CntBaseSelectionViewC2Ev @ 99 NONAME
-	_ZN20CntBaseSelectionViewD0Ev @ 100 NONAME
-	_ZN20CntBaseSelectionViewD1Ev @ 101 NONAME
-	_ZN20CntBaseSelectionViewD2Ev @ 102 NONAME
-	_ZN21CntDefaultViewFactory10createViewEi @ 103 NONAME
-	_ZN21CntDefaultViewFactory16createPluginViewEi @ 104 NONAME
-	_ZN21CntDefaultViewFactoryC1ER19CntExtensionManager @ 105 NONAME
-	_ZN21CntDefaultViewFactoryC2ER19CntExtensionManager @ 106 NONAME
-	_ZN21CntDefaultViewFactoryD0Ev @ 107 NONAME
-	_ZN21CntDefaultViewFactoryD1Ev @ 108 NONAME
-	_ZN21CntDefaultViewFactoryD2Ev @ 109 NONAME
-	_ZN21CntDefaultViewManager10changeViewE4QMapIi8QVariantE @ 110 NONAME
-	_ZN21CntDefaultViewManager10switchViewE4QMapIi8QVariantE6QFlagsIN2Hb14ViewSwitchFlagEE @ 111 NONAME
-	_ZN21CntDefaultViewManager11qt_metacallEN11QMetaObject4CallEiPPv @ 112 NONAME
-	_ZN21CntDefaultViewManager11qt_metacastEPKc @ 113 NONAME
-	_ZN21CntDefaultViewManager13currentViewIdEv @ 114 NONAME
-	_ZN21CntDefaultViewManager13deleteOldViewEv @ 115 NONAME
-	_ZN21CntDefaultViewManager14setViewFactoryEP22CntAbstractViewFactory @ 116 NONAME
-	_ZN21CntDefaultViewManager16setViewNavigatorEP16CntViewNavigator @ 117 NONAME
-	_ZN21CntDefaultViewManager16staticMetaObjectE @ 118 NONAME DATA 16
-	_ZN21CntDefaultViewManager17removeCurrentViewEv @ 119 NONAME
-	_ZN21CntDefaultViewManager19getStaticMetaObjectEv @ 120 NONAME
-	_ZN21CntDefaultViewManager4backE4QMapIi8QVariantEb @ 121 NONAME
-	_ZN21CntDefaultViewManager6engineEv @ 122 NONAME
-	_ZN21CntDefaultViewManager7cleanupEv @ 123 NONAME
-	_ZN21CntDefaultViewManager8closeAppEv @ 124 NONAME
-	_ZN21CntDefaultViewManagerC1EP12HbMainWindow @ 125 NONAME
-	_ZN21CntDefaultViewManagerC2EP12HbMainWindow @ 126 NONAME
-	_ZN21CntDefaultViewManagerD0Ev @ 127 NONAME
-	_ZN21CntDefaultViewManagerD1Ev @ 128 NONAME
-	_ZN21CntDefaultViewManagerD2Ev @ 129 NONAME
-	_ZNK11CntEditView10metaObjectEv @ 130 NONAME
-	_ZNK11CntEditView4viewEv @ 131 NONAME
-	_ZNK11CntEditView6viewIdEv @ 132 NONAME
-	_ZNK11CntEditView9isDefaultEv @ 133 NONAME
-	_ZNK13CntKeyGrabber10metaObjectEv @ 134 NONAME
-	_ZNK13CntMainWindow10metaObjectEv @ 135 NONAME
-	_ZNK14CntActionPopup10metaObjectEv @ 136 NONAME
-	_ZNK16CntViewNavigator10metaObjectEv @ 137 NONAME
-	_ZNK18CntContactCardView10metaObjectEv @ 138 NONAME
-	_ZNK18CntContactCardView4viewEv @ 139 NONAME
-	_ZNK18CntContactCardView6viewIdEv @ 140 NONAME
-	_ZNK18CntContactCardView9isDefaultEv @ 141 NONAME
-	_ZNK18CntGroupMemberView10metaObjectEv @ 142 NONAME
-	_ZNK18CntGroupMemberView4viewEv @ 143 NONAME
-	_ZNK18CntGroupMemberView6viewIdEv @ 144 NONAME
-	_ZNK18CntGroupMemberView9isDefaultEv @ 145 NONAME
-	_ZNK20CntBaseSelectionView10metaObjectEv @ 146 NONAME
-	_ZNK20CntBaseSelectionView4viewEv @ 147 NONAME
-	_ZNK20CntBaseSelectionView9isDefaultEv @ 148 NONAME
-	_ZNK21CntDefaultViewManager10metaObjectEv @ 149 NONAME
-	_ZTI11CntEditView @ 150 NONAME
-	_ZTI13CntKeyGrabber @ 151 NONAME
-	_ZTI13CntMainWindow @ 152 NONAME
-	_ZTI14CntActionPopup @ 153 NONAME
-	_ZTI16CntViewNavigator @ 154 NONAME
-	_ZTI18CntContactCardView @ 155 NONAME
-	_ZTI18CntGroupMemberView @ 156 NONAME
-	_ZTI20CntBaseSelectionView @ 157 NONAME
-	_ZTI21CntDefaultViewFactory @ 158 NONAME
-	_ZTI21CntDefaultViewManager @ 159 NONAME
-	_ZTV11CntEditView @ 160 NONAME
-	_ZTV13CntKeyGrabber @ 161 NONAME
-	_ZTV13CntMainWindow @ 162 NONAME
-	_ZTV14CntActionPopup @ 163 NONAME
-	_ZTV16CntViewNavigator @ 164 NONAME
-	_ZTV18CntContactCardView @ 165 NONAME
-	_ZTV18CntGroupMemberView @ 166 NONAME
-	_ZTV20CntBaseSelectionView @ 167 NONAME
-	_ZTV21CntDefaultViewFactory @ 168 NONAME
-	_ZTV21CntDefaultViewManager @ 169 NONAME
-	_ZThn8_N11CntEditView10deactivateEv @ 170 NONAME
-	_ZThn8_N11CntEditView8activateE4QMapIi8QVariantE @ 171 NONAME
-	_ZThn8_N11CntEditView9setEngineER17CntAbstractEngine @ 172 NONAME
-	_ZThn8_N11CntEditViewD0Ev @ 173 NONAME
-	_ZThn8_N11CntEditViewD1Ev @ 174 NONAME
-	_ZThn8_N13CntMainWindowD0Ev @ 175 NONAME
-	_ZThn8_N13CntMainWindowD1Ev @ 176 NONAME
-	_ZThn8_N18CntContactCardView10deactivateEv @ 177 NONAME
-	_ZThn8_N18CntContactCardView8activateE4QMapIi8QVariantE @ 178 NONAME
-	_ZThn8_N18CntContactCardView9setEngineER17CntAbstractEngine @ 179 NONAME
-	_ZThn8_N18CntContactCardViewD0Ev @ 180 NONAME
-	_ZThn8_N18CntContactCardViewD1Ev @ 181 NONAME
-	_ZThn8_N18CntGroupMemberView10deactivateEv @ 182 NONAME
-	_ZThn8_N18CntGroupMemberView8activateE4QMapIi8QVariantE @ 183 NONAME
-	_ZThn8_N18CntGroupMemberView9setEngineER17CntAbstractEngine @ 184 NONAME
-	_ZThn8_N18CntGroupMemberViewD0Ev @ 185 NONAME
-	_ZThn8_N18CntGroupMemberViewD1Ev @ 186 NONAME
-	_ZThn8_N20CntBaseSelectionView10deactivateEv @ 187 NONAME
-	_ZThn8_N20CntBaseSelectionView8activateE4QMapIi8QVariantE @ 188 NONAME
-	_ZThn8_N20CntBaseSelectionViewD0Ev @ 189 NONAME
-	_ZThn8_N20CntBaseSelectionViewD1Ev @ 190 NONAME
-	_ZThn8_N21CntDefaultViewManager10changeViewE4QMapIi8QVariantE @ 191 NONAME
-	_ZThn8_N21CntDefaultViewManager4backE4QMapIi8QVariantEb @ 192 NONAME
-	_ZThn8_N21CntDefaultViewManagerD0Ev @ 193 NONAME
-	_ZThn8_N21CntDefaultViewManagerD1Ev @ 194 NONAME
-	_ZThn8_NK11CntEditView4viewEv @ 195 NONAME
-	_ZThn8_NK11CntEditView6viewIdEv @ 196 NONAME
-	_ZThn8_NK11CntEditView9isDefaultEv @ 197 NONAME
-	_ZThn8_NK18CntContactCardView4viewEv @ 198 NONAME
-	_ZThn8_NK18CntContactCardView6viewIdEv @ 199 NONAME
-	_ZThn8_NK18CntContactCardView9isDefaultEv @ 200 NONAME
-	_ZThn8_NK18CntGroupMemberView4viewEv @ 201 NONAME
-	_ZThn8_NK18CntGroupMemberView6viewIdEv @ 202 NONAME
-	_ZThn8_NK18CntGroupMemberView9isDefaultEv @ 203 NONAME
-	_ZThn8_NK20CntBaseSelectionView4viewEv @ 204 NONAME
-	_ZThn8_NK20CntBaseSelectionView9isDefaultEv @ 205 NONAME
+	_ZN11CntEditView11externalizeER11QDataStream @ 2 NONAME
+	_ZN11CntEditView11internalizeER11QDataStreamR4QMapIi8QVariantE @ 3 NONAME
+	_ZN11CntEditView11qt_metacallEN11QMetaObject4CallEiPPv @ 4 NONAME
+	_ZN11CntEditView11qt_metacastEPKc @ 5 NONAME
+	_ZN11CntEditView14contactRemovedEb @ 6 NONAME
+	_ZN11CntEditView14contactUpdatedEi @ 7 NONAME
+	_ZN11CntEditView16changesDiscardedEv @ 8 NONAME
+	_ZN11CntEditView16staticMetaObjectE @ 9 NONAME DATA 16
+	_ZN11CntEditView19getStaticMetaObjectEv @ 10 NONAME
+	_ZN11CntEditView8activateE4QMapIi8QVariantE @ 11 NONAME
+	_ZN11CntEditView9setEngineER17CntAbstractEngine @ 12 NONAME
+	_ZN11CntEditViewC1Ev @ 13 NONAME
+	_ZN11CntEditViewC2Ev @ 14 NONAME
+	_ZN11CntEditViewD0Ev @ 15 NONAME
+	_ZN11CntEditViewD1Ev @ 16 NONAME
+	_ZN11CntEditViewD2Ev @ 17 NONAME
+	_ZN13CntKeyGrabber11eventFilterEP7QObjectP6QEvent @ 18 NONAME
+	_ZN13CntKeyGrabber11qt_metacallEN11QMetaObject4CallEiPPv @ 19 NONAME
+	_ZN13CntKeyGrabber11qt_metacastEPKc @ 20 NONAME
+	_ZN13CntKeyGrabber16staticMetaObjectE @ 21 NONAME DATA 16
+	_ZN13CntKeyGrabber19getStaticMetaObjectEv @ 22 NONAME
+	_ZN13CntKeyGrabberC1EP12HbMainWindowP7QObject @ 23 NONAME
+	_ZN13CntKeyGrabberC2EP12HbMainWindowP7QObject @ 24 NONAME
+	_ZN13CntKeyGrabberD0Ev @ 25 NONAME
+	_ZN13CntKeyGrabberD1Ev @ 26 NONAME
+	_ZN13CntKeyGrabberD2Ev @ 27 NONAME
+	_ZN13CntMainWindow11qt_metacallEN11QMetaObject4CallEiPPv @ 28 NONAME
+	_ZN13CntMainWindow11qt_metacastEPKc @ 29 NONAME
+	_ZN13CntMainWindow12saveActivityEv @ 30 NONAME
+	_ZN13CntMainWindow16staticMetaObjectE @ 31 NONAME DATA 16
+	_ZN13CntMainWindow19getStaticMetaObjectEv @ 32 NONAME
+	_ZN13CntMainWindowC1EP7QWidgeti @ 33 NONAME
+	_ZN13CntMainWindowC2EP7QWidgeti @ 34 NONAME
+	_ZN13CntMainWindowD0Ev @ 35 NONAME
+	_ZN13CntMainWindowD1Ev @ 36 NONAME
+	_ZN13CntMainWindowD2Ev @ 37 NONAME
+	_ZN14CntActionPopup11qt_metacallEN11QMetaObject4CallEiPPv @ 38 NONAME
+	_ZN14CntActionPopup11qt_metacastEPKc @ 39 NONAME
+	_ZN14CntActionPopup15showActionPopupE7QString @ 40 NONAME
+	_ZN14CntActionPopup16staticMetaObjectE @ 41 NONAME DATA 16
+	_ZN14CntActionPopup19getStaticMetaObjectEv @ 42 NONAME
+	_ZN14CntActionPopup20executeContactActionERN10QtMobility8QContactENS0_14QContactDetailE7QString @ 43 NONAME
+	_ZN14CntActionPopup24actionPopupCancelPressedEv @ 44 NONAME
+	_ZN14CntActionPopupC1EPN10QtMobility8QContactE @ 45 NONAME
+	_ZN14CntActionPopupC2EPN10QtMobility8QContactE @ 46 NONAME
+	_ZN14CntActionPopupD0Ev @ 47 NONAME
+	_ZN14CntActionPopupD1Ev @ 48 NONAME
+	_ZN14CntActionPopupD2Ev @ 49 NONAME
+	_ZN16CntViewNavigator11externalizeER11QDataStream @ 50 NONAME
+	_ZN16CntViewNavigator11internalizeER11QDataStream @ 51 NONAME
+	_ZN16CntViewNavigator11qt_metacallEN11QMetaObject4CallEiPPv @ 52 NONAME
+	_ZN16CntViewNavigator11qt_metacastEPKc @ 53 NONAME
+	_ZN16CntViewNavigator12addExceptionERKiS1_ @ 54 NONAME
+	_ZN16CntViewNavigator12removeEffectERKi @ 55 NONAME
+	_ZN16CntViewNavigator14clearViewStackEv @ 56 NONAME
+	_ZN16CntViewNavigator15removeExceptionERKi @ 57 NONAME
+	_ZN16CntViewNavigator16staticMetaObjectE @ 58 NONAME DATA 16
+	_ZN16CntViewNavigator19getStaticMetaObjectEv @ 59 NONAME
+	_ZN16CntViewNavigator4backER6QFlagsIN2Hb14ViewSwitchFlagEEb @ 60 NONAME
+	_ZN16CntViewNavigator4nextERKiR6QFlagsIN2Hb14ViewSwitchFlagEE @ 61 NONAME
+	_ZN16CntViewNavigator7addRootERKi @ 62 NONAME
+	_ZN16CntViewNavigator9addEffectERKiS1_ @ 63 NONAME
+	_ZN16CntViewNavigatorC1EP7QObject @ 64 NONAME
+	_ZN16CntViewNavigatorC2EP7QObject @ 65 NONAME
+	_ZN16CntViewNavigatorD0Ev @ 66 NONAME
+	_ZN16CntViewNavigatorD1Ev @ 67 NONAME
+	_ZN16CntViewNavigatorD2Ev @ 68 NONAME
+	_ZN18CntContactCardView10deactivateEv @ 69 NONAME
+	_ZN18CntContactCardView11backPressedEi @ 70 NONAME
+	_ZN18CntContactCardView11externalizeER11QDataStream @ 71 NONAME
+	_ZN18CntContactCardView11internalizeER11QDataStreamR4QMapIi8QVariantE @ 72 NONAME
+	_ZN18CntContactCardView11qt_metacallEN11QMetaObject4CallEiPPv @ 73 NONAME
+	_ZN18CntContactCardView11qt_metacastEPKc @ 74 NONAME
+	_ZN18CntContactCardView13addToContactsEv @ 75 NONAME
+	_ZN18CntContactCardView13viewActivatedEP22CntAbstractViewManager4QMapIi8QVariantE @ 76 NONAME
+	_ZN18CntContactCardView16staticMetaObjectE @ 77 NONAME DATA 16
+	_ZN18CntContactCardView19getStaticMetaObjectEv @ 78 NONAME
+	_ZN18CntContactCardView8activateE4QMapIi8QVariantE @ 79 NONAME
+	_ZN18CntContactCardView9setEngineER17CntAbstractEngine @ 80 NONAME
+	_ZN18CntContactCardViewC1Eb @ 81 NONAME
+	_ZN18CntContactCardViewC2Eb @ 82 NONAME
+	_ZN18CntContactCardViewD0Ev @ 83 NONAME
+	_ZN18CntContactCardViewD1Ev @ 84 NONAME
+	_ZN18CntContactCardViewD2Ev @ 85 NONAME
+	_ZN18CntGroupMemberView10deactivateEv @ 86 NONAME
+	_ZN18CntGroupMemberView11backPressedEv @ 87 NONAME
+	_ZN18CntGroupMemberView11qt_metacallEN11QMetaObject4CallEiPPv @ 88 NONAME
+	_ZN18CntGroupMemberView11qt_metacastEPKc @ 89 NONAME
+	_ZN18CntGroupMemberView16staticMetaObjectE @ 90 NONAME DATA 16
+	_ZN18CntGroupMemberView19getStaticMetaObjectEv @ 91 NONAME
+	_ZN18CntGroupMemberView8activateE4QMapIi8QVariantE @ 92 NONAME
+	_ZN18CntGroupMemberView9setEngineER17CntAbstractEngine @ 93 NONAME
+	_ZN18CntGroupMemberViewC1Ev @ 94 NONAME
+	_ZN18CntGroupMemberViewC2Ev @ 95 NONAME
+	_ZN18CntGroupMemberViewD0Ev @ 96 NONAME
+	_ZN18CntGroupMemberViewD1Ev @ 97 NONAME
+	_ZN18CntGroupMemberViewD2Ev @ 98 NONAME
+	_ZN20CntBaseSelectionView10deactivateEv @ 99 NONAME
+	_ZN20CntBaseSelectionView10viewClosedEv @ 100 NONAME
+	_ZN20CntBaseSelectionView10viewOpenedEP22CntAbstractViewManager4QMapIi8QVariantE @ 101 NONAME
+	_ZN20CntBaseSelectionView11qt_metacallEN11QMetaObject4CallEiPPv @ 102 NONAME
+	_ZN20CntBaseSelectionView11qt_metacastEPKc @ 103 NONAME
+	_ZN20CntBaseSelectionView16staticMetaObjectE @ 104 NONAME DATA 16
+	_ZN20CntBaseSelectionView19getStaticMetaObjectEv @ 105 NONAME
+	_ZN20CntBaseSelectionView8activateE4QMapIi8QVariantE @ 106 NONAME
+	_ZN20CntBaseSelectionViewC2Ev @ 107 NONAME
+	_ZN20CntBaseSelectionViewD0Ev @ 108 NONAME
+	_ZN20CntBaseSelectionViewD1Ev @ 109 NONAME
+	_ZN20CntBaseSelectionViewD2Ev @ 110 NONAME
+	_ZN21CntDefaultViewFactory10createViewEi @ 111 NONAME
+	_ZN21CntDefaultViewFactory16createPluginViewEi @ 112 NONAME
+	_ZN21CntDefaultViewFactoryC1ER19CntExtensionManager @ 113 NONAME
+	_ZN21CntDefaultViewFactoryC2ER19CntExtensionManager @ 114 NONAME
+	_ZN21CntDefaultViewFactoryD0Ev @ 115 NONAME
+	_ZN21CntDefaultViewFactoryD1Ev @ 116 NONAME
+	_ZN21CntDefaultViewFactoryD2Ev @ 117 NONAME
+	_ZN21CntDefaultViewManager10changeViewE4QMapIi8QVariantE @ 118 NONAME
+	_ZN21CntDefaultViewManager10switchViewE4QMapIi8QVariantE6QFlagsIN2Hb14ViewSwitchFlagEE @ 119 NONAME
+	_ZN21CntDefaultViewManager11internalizeER11QDataStream @ 120 NONAME
+	_ZN21CntDefaultViewManager11qt_metacallEN11QMetaObject4CallEiPPv @ 121 NONAME
+	_ZN21CntDefaultViewManager11qt_metacastEPKc @ 122 NONAME
+	_ZN21CntDefaultViewManager12activateViewEP15CntAbstractView4QMapIi8QVariantE6QFlagsIN2Hb14ViewSwitchFlagEE @ 123 NONAME
+	_ZN21CntDefaultViewManager13deleteOldViewEv @ 124 NONAME
+	_ZN21CntDefaultViewManager14setViewFactoryEP22CntAbstractViewFactory @ 125 NONAME
+	_ZN21CntDefaultViewManager16setViewNavigatorEP16CntViewNavigator @ 126 NONAME
+	_ZN21CntDefaultViewManager16staticMetaObjectE @ 127 NONAME DATA 16
+	_ZN21CntDefaultViewManager17removeCurrentViewEv @ 128 NONAME
+	_ZN21CntDefaultViewManager19getStaticMetaObjectEv @ 129 NONAME
+	_ZN21CntDefaultViewManager4backE4QMapIi8QVariantEb @ 130 NONAME
+	_ZN21CntDefaultViewManager6engineEv @ 131 NONAME
+	_ZN21CntDefaultViewManager7cleanupEv @ 132 NONAME
+	_ZN21CntDefaultViewManager8closeAppEv @ 133 NONAME
+	_ZN21CntDefaultViewManagerC1EP12HbMainWindow @ 134 NONAME
+	_ZN21CntDefaultViewManagerC2EP12HbMainWindow @ 135 NONAME
+	_ZN21CntDefaultViewManagerD0Ev @ 136 NONAME
+	_ZN21CntDefaultViewManagerD1Ev @ 137 NONAME
+	_ZN21CntDefaultViewManagerD2Ev @ 138 NONAME
+	_ZNK11CntEditView10metaObjectEv @ 139 NONAME
+	_ZNK11CntEditView4viewEv @ 140 NONAME
+	_ZNK11CntEditView6viewIdEv @ 141 NONAME
+	_ZNK11CntEditView9isDefaultEv @ 142 NONAME
+	_ZNK13CntKeyGrabber10metaObjectEv @ 143 NONAME
+	_ZNK13CntMainWindow10metaObjectEv @ 144 NONAME
+	_ZNK14CntActionPopup10metaObjectEv @ 145 NONAME
+	_ZNK16CntViewNavigator10metaObjectEv @ 146 NONAME
+	_ZNK18CntContactCardView10metaObjectEv @ 147 NONAME
+	_ZNK18CntContactCardView4viewEv @ 148 NONAME
+	_ZNK18CntContactCardView6viewIdEv @ 149 NONAME
+	_ZNK18CntContactCardView9isDefaultEv @ 150 NONAME
+	_ZNK18CntGroupMemberView10metaObjectEv @ 151 NONAME
+	_ZNK18CntGroupMemberView4viewEv @ 152 NONAME
+	_ZNK18CntGroupMemberView6viewIdEv @ 153 NONAME
+	_ZNK18CntGroupMemberView9isDefaultEv @ 154 NONAME
+	_ZNK20CntBaseSelectionView10metaObjectEv @ 155 NONAME
+	_ZNK21CntDefaultViewManager10metaObjectEv @ 156 NONAME
+	_ZNK21CntDefaultViewManager11externalizeER11QDataStream @ 157 NONAME
+	_ZTI11CntEditView @ 158 NONAME
+	_ZTI13CntKeyGrabber @ 159 NONAME
+	_ZTI13CntMainWindow @ 160 NONAME
+	_ZTI14CntActionPopup @ 161 NONAME
+	_ZTI16CntViewNavigator @ 162 NONAME
+	_ZTI18CntContactCardView @ 163 NONAME
+	_ZTI18CntGroupMemberView @ 164 NONAME
+	_ZTI20CntBaseSelectionView @ 165 NONAME
+	_ZTI21CntDefaultViewFactory @ 166 NONAME
+	_ZTI21CntDefaultViewManager @ 167 NONAME
+	_ZTV11CntEditView @ 168 NONAME
+	_ZTV13CntKeyGrabber @ 169 NONAME
+	_ZTV13CntMainWindow @ 170 NONAME
+	_ZTV14CntActionPopup @ 171 NONAME
+	_ZTV16CntViewNavigator @ 172 NONAME
+	_ZTV18CntContactCardView @ 173 NONAME
+	_ZTV18CntGroupMemberView @ 174 NONAME
+	_ZTV20CntBaseSelectionView @ 175 NONAME
+	_ZTV21CntDefaultViewFactory @ 176 NONAME
+	_ZTV21CntDefaultViewManager @ 177 NONAME
+	_ZThn8_N11CntEditView10deactivateEv @ 178 NONAME
+	_ZThn8_N11CntEditView11externalizeER11QDataStream @ 179 NONAME
+	_ZThn8_N11CntEditView11internalizeER11QDataStreamR4QMapIi8QVariantE @ 180 NONAME
+	_ZThn8_N11CntEditView8activateE4QMapIi8QVariantE @ 181 NONAME
+	_ZThn8_N11CntEditView9setEngineER17CntAbstractEngine @ 182 NONAME
+	_ZThn8_N11CntEditViewD0Ev @ 183 NONAME
+	_ZThn8_N11CntEditViewD1Ev @ 184 NONAME
+	_ZThn8_N13CntMainWindowD0Ev @ 185 NONAME
+	_ZThn8_N13CntMainWindowD1Ev @ 186 NONAME
+	_ZThn8_N18CntContactCardView10deactivateEv @ 187 NONAME
+	_ZThn8_N18CntContactCardView11externalizeER11QDataStream @ 188 NONAME
+	_ZThn8_N18CntContactCardView11internalizeER11QDataStreamR4QMapIi8QVariantE @ 189 NONAME
+	_ZThn8_N18CntContactCardView8activateE4QMapIi8QVariantE @ 190 NONAME
+	_ZThn8_N18CntContactCardView9setEngineER17CntAbstractEngine @ 191 NONAME
+	_ZThn8_N18CntContactCardViewD0Ev @ 192 NONAME
+	_ZThn8_N18CntContactCardViewD1Ev @ 193 NONAME
+	_ZThn8_N18CntGroupMemberView10deactivateEv @ 194 NONAME
+	_ZThn8_N18CntGroupMemberView8activateE4QMapIi8QVariantE @ 195 NONAME
+	_ZThn8_N18CntGroupMemberView9setEngineER17CntAbstractEngine @ 196 NONAME
+	_ZThn8_N18CntGroupMemberViewD0Ev @ 197 NONAME
+	_ZThn8_N18CntGroupMemberViewD1Ev @ 198 NONAME
+	_ZThn8_N20CntBaseSelectionView10deactivateEv @ 199 NONAME
+	_ZThn8_N20CntBaseSelectionView8activateE4QMapIi8QVariantE @ 200 NONAME
+	_ZThn8_N20CntBaseSelectionViewD0Ev @ 201 NONAME
+	_ZThn8_N20CntBaseSelectionViewD1Ev @ 202 NONAME
+	_ZThn8_N21CntDefaultViewManager10changeViewE4QMapIi8QVariantE @ 203 NONAME
+	_ZThn8_N21CntDefaultViewManager4backE4QMapIi8QVariantEb @ 204 NONAME
+	_ZThn8_N21CntDefaultViewManagerD0Ev @ 205 NONAME
+	_ZThn8_N21CntDefaultViewManagerD1Ev @ 206 NONAME
+	_ZThn8_NK11CntEditView4viewEv @ 207 NONAME
+	_ZThn8_NK11CntEditView6viewIdEv @ 208 NONAME
+	_ZThn8_NK11CntEditView9isDefaultEv @ 209 NONAME
+	_ZThn8_NK18CntContactCardView4viewEv @ 210 NONAME
+	_ZThn8_NK18CntContactCardView6viewIdEv @ 211 NONAME
+	_ZThn8_NK18CntContactCardView9isDefaultEv @ 212 NONAME
+	_ZThn8_NK18CntGroupMemberView4viewEv @ 213 NONAME
+	_ZThn8_NK18CntGroupMemberView6viewIdEv @ 214 NONAME
+	_ZThn8_NK18CntGroupMemberView9isDefaultEv @ 215 NONAME
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/eabi/cntlistmodelu.def	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,39 @@
+EXPORTS
+	_ZN12CntListModel10showMyCardEb @ 1 NONAME
+	_ZN12CntListModel11handleAddedERK5QListIjE @ 2 NONAME
+	_ZN12CntListModel11qt_metacallEN11QMetaObject4CallEiPPv @ 3 NONAME
+	_ZN12CntListModel11qt_metacastEPKc @ 4 NONAME
+	_ZN12CntListModel12refreshModelEv @ 5 NONAME
+	_ZN12CntListModel13handleChangedERK5QListIjE @ 6 NONAME
+	_ZN12CntListModel13handleRemovedERK5QListIjE @ 7 NONAME
+	_ZN12CntListModel16staticMetaObjectE @ 8 NONAME DATA 16
+	_ZN12CntListModel19getStaticMetaObjectEv @ 9 NONAME
+	_ZN12CntListModel19handleMyCardChangedERKjS1_ @ 10 NONAME
+	_ZN12CntListModel19updateRelationshipsEv @ 11 NONAME
+	_ZN12CntListModel21updateContactIdsArrayEv @ 12 NONAME
+	_ZN12CntListModel23handleAddedRelationshipERK5QListIjE @ 13 NONAME
+	_ZN12CntListModel23handleRowSettingChangedERK13XQSettingsKeyRK8QVariant @ 14 NONAME
+	_ZN12CntListModel24handleContactInfoUpdatedEj @ 15 NONAME
+	_ZN12CntListModel25handleRemovedRelationshipERK5QListIjE @ 16 NONAME
+	_ZN12CntListModel9setFilterERKN10QtMobility14QContactFilterE @ 17 NONAME
+	_ZN12CntListModelC1EPN10QtMobility15QContactManagerERKNS0_14QContactFilterEbP7QObject @ 18 NONAME
+	_ZN12CntListModelC2EPN10QtMobility15QContactManagerERKNS0_14QContactFilterEbP7QObject @ 19 NONAME
+	_ZN12CntListModelD0Ev @ 20 NONAME
+	_ZN12CntListModelD1Ev @ 21 NONAME
+	_ZN12CntListModelD2Ev @ 22 NONAME
+	_ZNK12CntListModel10isValidRowEi @ 23 NONAME
+	_ZNK12CntListModel10metaObjectEv @ 24 NONAME
+	_ZNK12CntListModel11dataForRoleEii @ 25 NONAME
+	_ZNK12CntListModel13isMyCardShownEv @ 26 NONAME
+	_ZNK12CntListModel14indexOfContactERKN10QtMobility8QContactE @ 27 NONAME
+	_ZNK12CntListModel16indexOfContactIdERKj @ 28 NONAME
+	_ZNK12CntListModel3rowERKj @ 29 NONAME
+	_ZNK12CntListModel4dataERK11QModelIndexi @ 30 NONAME
+	_ZNK12CntListModel7contactERK11QModelIndex @ 31 NONAME
+	_ZNK12CntListModel7contactEi @ 32 NONAME
+	_ZNK12CntListModel8myCardIdEv @ 33 NONAME
+	_ZNK12CntListModel8rowCountERK11QModelIndex @ 34 NONAME
+	_ZNK12CntListModel9contactIdERK11QModelIndex @ 35 NONAME
+	_ZTI12CntListModel @ 36 NONAME
+	_ZTV12CntListModel @ 37 NONAME
+
--- a/phonebookui/phonebookapp/phonebookapp.pro	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/phonebookapp/phonebookapp.pro	Fri Oct 15 12:24:46 2010 +0300
@@ -52,7 +52,7 @@
 SOURCES += src/cntappservicehandler.cpp
 
 # capability
-TARGET.CAPABILITY = CAP_APPLICATION NetworkControl
+TARGET.CAPABILITY = CAP_APPLICATION NetworkControl TrustedUI
 
 TRANSLATIONS = contacts.ts
     
@@ -60,7 +60,7 @@
         # Skip the UID2/3 thing
         TARGET.UID3 = 0x20022EF9
         TARGET.EPOCSTACKSIZE = 0x14000
-        TARGET.EPOCHEAPSIZE = 0x1000 0xA00000
+        TARGET.EPOCHEAPSIZE = 0x1000 0x1000000
         
         SKINICON = qtg_large_phonebook 
 
--- a/phonebookui/phonebookservices/inc/cntserviceassigncontactcardview.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/phonebookservices/inc/cntserviceassigncontactcardview.h	Fri Oct 15 12:24:46 2010 +0300
@@ -26,6 +26,7 @@
 class CntServiceHandler;
 class CntAbstractViewManager;
 class CntAbstractServiceProvider;
+class HbPushButton;
 
 QTM_BEGIN_NAMESPACE
 class QContact;
@@ -57,7 +58,8 @@
     CntAbstractViewManager  *mViewManager;
     QContact                mContact;
     QContactDetail          mDetail;
-   
+    HbPushButton*           mAddButton;
+    HbPushButton*           mUpdateButton;
 };
 
 #endif // CNTSERVICEASSIGNCONTACTCARDVIEW_H
--- a/phonebookui/phonebookservices/inc/cntservices.h	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/phonebookservices/inc/cntservices.h	Fri Oct 15 12:24:46 2010 +0300
@@ -169,14 +169,6 @@
     void fillOnlineAccount( QContactOnlineAccount& account, const QString& value, const QString& subType, bool defaultForOnlineAccountIsImpp);
     QContactManager* contactManager();
     
-    /**
-     * Checks if we already have the given contact global uid in database. If so,
-     * updates the local id and managerUri accordingly.
-     * 
-     * If given contact has already a local id, method does nothing.
-     */
-    void updateLocalId( QContact& aContact );
-    
 private: // from CntAbstractServiceProvider
     void CompleteServiceAndCloseApp(const QVariant& retValue);
     void overrideReturnValue(const QVariant& retValue);
@@ -186,6 +178,7 @@
     CntAbstractEngine* mEngine;
     QStringList m_definitionNames;
     CntAbstractServiceProvider* mCurrentProvider; // not owned
+    friend class UT_CntServices;
 };
 
 #endif /* CNTSERVICES_H */
--- a/phonebookui/phonebookservices/phonebookservices.pro	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/phonebookservices/phonebookservices.pro	Fri Oct 15 12:24:46 2010 +0300
@@ -26,7 +26,7 @@
                 ../cntcommonui/widgets \
                 ../../inc
                 
-INCLUDEPATH += ../../phonebookengines/cntlistmodel/inc \
+INCLUDEPATH += ../cntlistmodel \
                ../../phonebookengines/cntimageutility/inc \
 
 INCLUDEPATH += . \
@@ -74,7 +74,7 @@
            src/cntservicesubeditview.cpp
 
 # capability
-TARGET.CAPABILITY = CAP_APPLICATION NetworkControl
+TARGET.CAPABILITY = CAP_APPLICATION NetworkControl TrustedUI
 
 TRANSLATIONS = contacts.ts
 
--- a/phonebookui/phonebookservices/src/cntserviceassigncontactcardview.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/phonebookservices/src/cntserviceassigncontactcardview.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -72,28 +72,23 @@
     HbWidget* buttonWidget = new HbWidget(popup);
     QGraphicsLinearLayout* layout = new QGraphicsLinearLayout(Qt::Vertical);
     
-    HbPushButton* addButton = new HbPushButton(buttonWidget);
-    addButton->setStretched(true);
-    addButton->setText(hbTrId("txt_phob_button_save_as_a_new_contact"));
+    mAddButton = new HbPushButton(buttonWidget);
+    mAddButton->setStretched(true);
+    mAddButton->setText(hbTrId("txt_phob_button_save_as_a_new_contact"));
     HbIcon plusIcon("qtg_mono_plus");
-    addButton->setIcon(plusIcon);
-    connect(addButton, SIGNAL(clicked()), popup, SLOT(close()));
-    connect(addButton, SIGNAL(clicked()), this, SLOT(saveNew()));
-    connect(addButton, SIGNAL(longPress(QPointF)), popup, SLOT(close()));
-    connect(addButton, SIGNAL(longPress(QPointF)), this, SLOT(saveNew()));
+    mAddButton->setIcon(plusIcon);
+    connect(mAddButton, SIGNAL(released()), popup, SLOT(close()));
+    connect(mAddButton, SIGNAL(released()), this, SLOT(saveNew()));
     
-    HbPushButton* updateButton = new HbPushButton(buttonWidget);
-    updateButton->setStretched(true);
-    updateButton->setText(hbTrId("txt_phob_button_update_existing_contact"));
-    updateButton->setIcon(plusIcon);
-    connect(updateButton, SIGNAL(clicked()), popup, SLOT(close()));
-    connect(updateButton, SIGNAL(clicked()), this, SLOT(updateExisting()));
-    connect(updateButton, SIGNAL(longPress(QPointF)), popup, SLOT(close()));
-    connect(updateButton, SIGNAL(longPress(QPointF)), this, SLOT(updateExisting()));
+    mUpdateButton = new HbPushButton(buttonWidget);
+    mUpdateButton->setStretched(true);
+    mUpdateButton->setText(hbTrId("txt_phob_button_update_existing_contact"));
+    mUpdateButton->setIcon(plusIcon);
+    connect(mUpdateButton, SIGNAL(released()), popup, SLOT(close()));
+    connect(mUpdateButton, SIGNAL(released()), this, SLOT(updateExisting()));    
     
-    
-    layout->addItem(addButton);
-    layout->addItem(updateButton);
+    layout->addItem(mAddButton);
+    layout->addItem(mUpdateButton);
     
     buttonWidget->setLayout(layout);
     popup->setContentWidget(buttonWidget);
@@ -109,14 +104,17 @@
 void CntServiceAssignContactCardView::saveNew()
 {
     CNT_ENTRY
-    CntViewParameters viewParameters;
-    viewParameters.insert(EViewId, serviceEditView);
-    QContactName contactName = mContact.detail<QContactName>();
-    mContact.removeDetail(&contactName);
-    QVariant var;
-    var.setValue(mContact);
-    viewParameters.insert(ESelectedContact, var);
-    mViewManager->changeView(viewParameters);
+    if(mAddButton->isUnderMouse())
+    {
+        CntViewParameters viewParameters;
+        viewParameters.insert(EViewId, serviceEditView);
+        QContactName contactName = mContact.detail<QContactName>();
+        mContact.removeDetail(&contactName);
+        QVariant var;
+        var.setValue(mContact);
+        viewParameters.insert(ESelectedContact, var);
+        mViewManager->changeView(viewParameters);
+    }
     CNT_EXIT
 }
 
@@ -126,12 +124,15 @@
 void CntServiceAssignContactCardView::updateExisting()
 {
     CNT_ENTRY
-    CntViewParameters viewParameters;
-    viewParameters.insert(EViewId, serviceContactSelectionView);
-    QVariant var;
-    var.setValue(mDetail);
-    viewParameters.insert(ESelectedDetail, var);
-    mViewManager->changeView(viewParameters);
+    if(mUpdateButton->isUnderMouse())
+    {
+        CntViewParameters viewParameters;
+        viewParameters.insert(EViewId, serviceContactSelectionView);
+        QVariant var;
+        var.setValue(mDetail);
+        viewParameters.insert(ESelectedDetail, var);
+        mViewManager->changeView(viewParameters);
+    }
     CNT_EXIT
 }
 
--- a/phonebookui/phonebookservices/src/cntservicecontactfetchview.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/phonebookservices/src/cntservicecontactfetchview.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -301,7 +301,7 @@
            mIndex--;
        }
     
-    if (aContact.preferredDetail(aAction).isEmpty() && (aAction == "call" || aAction == "message" || aAction == "email"))
+    if (aContact.preferredDetail(aAction).isEmpty() && (aAction == "call"))
     {
         aContact.setPreferredDetail(aAction, contactDetail);
         //return value will be ignored because we cannot do anything if it fails.
--- a/phonebookui/phonebookservices/src/cntservices.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/phonebookservices/src/cntservices.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -36,9 +36,6 @@
 #include <QPixmap>
 #include <QFile>
 #include <QUrl>
-#include <QTextCodec>
-
-const int Latin1CharSetMIB = 4;
 
 CntServices::CntServices() :
 mViewManager(NULL),
@@ -183,22 +180,6 @@
     CntImageUtility imageUtility;
     QContact contact;
     QVersitReader reader;
-    QFile inputFile(fileName);
-    if (!inputFile.open(QIODevice::ReadOnly))
-        return;
-    
-    // Versit parser default codec is UTF-8
-    // Check if decoding text to unicode is possible, else use Latin-1 text codec
-    QByteArray ba = inputFile.readAll();
-    if(!ba.isEmpty())
-        {
-        QTextCodec *c = QTextCodec::codecForUtfText(ba);
-        // Text codec returned is Latin-1, set default to Latin-1
-        if(c->mibEnum()==Latin1CharSetMIB)
-            reader.setDefaultCodec(QTextCodec::codecForName("ISO 8859-1"));
-        }
-    inputFile.close();
-    
     QFile vCardFile(fileName);
     if (!vCardFile.open(QIODevice::ReadOnly))
         return;
@@ -217,9 +198,6 @@
         }
     vCardFile.close();
     
-    // check if the contact is in db already.
-    updateLocalId( contact );
-    
     // Save thumbnail images
     QList<QContactThumbnail> details = contact.details<QContactThumbnail>();
     for (int i = 0;i < details.count();i++)
@@ -499,66 +477,39 @@
 
 void CntServices::fillOnlineAccount( QContactOnlineAccount& account, const QString& value,
     const QString& subType, bool defaultForOnlineAccountIsImpp )
+{
+    // The value should normally consist of two parts:
+    //    <service provider>:<user ID>
+    // for eg. "serviceprovider:jack@serviceprovider.com"
+    QStringList accountDetails = value.split(":");
+    if (accountDetails.count() == 1)
     {
-        // The value should normally consist of two parts:
-        //    <service provider>:<user ID>
-        // for eg. "serviceprovider:jack@serviceprovider.com"
-        QStringList accountDetails = value.split(":");
-        if (accountDetails.count() == 1)
+        // For some reason it only had one part, so we're assuming it's the user ID.
+        account.setAccountUri(accountDetails.at(0));
+    }
+    else if (accountDetails.count() >= 2)
+    {
+        account.setServiceProvider(accountDetails.at(0));        
+        account.setAccountUri(accountDetails.at(1)); // the user ID
+    }
+
+    if (!subType.isEmpty())
+    {        
+        account.setSubTypes(subType);
+    }
+    else
+    {
+        if (defaultForOnlineAccountIsImpp)
         {
-            // For some reason it only had one part, so we're assuming it's the user ID.
-            account.setAccountUri(accountDetails.at(0));
-        }
-        else if (accountDetails.count() >= 2)
-        {
-            account.setServiceProvider(accountDetails.at(0));        
-            account.setAccountUri(accountDetails.at(1)); // the user ID
-        }
-
-        if (!subType.isEmpty())
-        {        
-            account.setSubTypes(subType);
+            account.setSubTypes( QContactOnlineAccount::SubTypeImpp );
         }
         else
         {
-            if (defaultForOnlineAccountIsImpp)
-            {
-                account.setSubTypes( QContactOnlineAccount::SubTypeImpp );
-            }
-            else
-            {
-                account.setSubTypes( QContactOnlineAccount::SubTypeSipVoip );
-            }
+            account.setSubTypes( QContactOnlineAccount::SubTypeSipVoip );
         }
     }
+}
 
-void CntServices::updateLocalId( QContact& aContact )
-{
-    CNT_ENTRY
-    if ( aContact.localId() == 0 )
-        {
-        QContactGuid guid = aContact.detail<QContactGuid>();
-        QString guidString = guid.guid();
-            
-        QContactDetailFilter filter;
-        filter.setDetailDefinitionName( QContactGuid::DefinitionName, QContactGuid::FieldGuid );
-        filter.setValue( guid.guid() );
-            
-        QContactManager& cm = mEngine->contactManager( SYMBIAN_BACKEND );
-        QList<QContactLocalId> idList = cm.contactIds( filter, QList<QContactSortOrder>() );
-        int count = idList.count();
-        
-        if ( !idList.isEmpty() )
-            {
-            QContactId id;
-            id.setLocalId( idList.first() );
-            id.setManagerUri( cm.managerUri() );
-            
-            aContact.setId( id );
-            }
-        }
-    CNT_EXIT
-}
 // This method is inherited from CntAbstractServiceProvider
 void CntServices::CompleteServiceAndCloseApp(const QVariant& retValue)
 {
--- a/phonebookui/phonebookservices/src/main.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/phonebookservices/src/main.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -17,6 +17,7 @@
 
 #include <hbapplication.h>
 #include <hbmainwindow.h>
+#include <xqserviceutil.h>
 #include <QTranslator>
 #include <QLocale>
 #include <QScopedPointer>
@@ -38,18 +39,26 @@
 #if defined (TRACES) || defined (TRACE2FILE)
     qInstallMsgHandler(MSG_HANDLER);
 #endif
+    qDebug() << "Enter";
+    bool embedded = XQServiceUtil::isEmbedded( argc, argv );
+    qDebug() << "Embedded: " << embedded;
     
-    HbApplication a( argc, argv );
-
+    HbApplication a( argc, argv, embedded ? Hb::NoSplash : Hb::DefaultApplicationFlags );
+    qDebug() << "HbApplication ready";
+    
     QTranslator translator;
     QString lang = QLocale::system().name();
     QString path = "z:/resource/qt/translations/";
     translator.load(path + "contacts_" + lang);
     a.installTranslator(&translator);
-
+    qDebug() << "Translator installed";
+    
     HbMainWindow mainWindow;
+    qDebug() << "MainWindow ready";
+    
     CntKeyGrabber *keyGrabber = new CntKeyGrabber(&mainWindow, &mainWindow);
-
+    qDebug() << "KeyGrabber ready";
+    
     CntViewNavigator* navigator = new CntViewNavigator( &mainWindow );
     navigator->addException( serviceEditView, noView );
     navigator->addEffect( serviceContactCardView, historyView );
@@ -57,16 +66,20 @@
     navigator->addEffect( serviceGroupMemberView, groupActionsView );
     navigator->addEffect( groupActionsView, serviceGroupMemberView );
     navigator->addRoot( serviceGroupMemberView );
-
+    qDebug() << "Navigator ready";
+    
     // This object actually executes the services
     CntServices* services = new CntServices();
     services->setParent( &mainWindow ); // for ownership
-
+    qDebug() << "CntServices ready";
+    
     QScopedPointer<CntServiceViewManager> viewManager(new CntServiceViewManager(
         &mainWindow,
         *services )); // as CntAbstractServiceProvider
+    qDebug() << "Service ViewManager ready";
+    
     viewManager->setViewNavigator( navigator );
-
+    
     services->setEngine( viewManager->engine() );
 
     // These objects talk with QT Highway (send/receive)
@@ -75,9 +88,11 @@
     CntServiceProviderFetch* serviceProviderFetch = new CntServiceProviderFetch( *services, &mainWindow ); // phonebookservices.com.nokia.symbian.IContactFetch
     CntServiceProviderViewing* serviceProviderViewing = new CntServiceProviderViewing( *services, &mainWindow ); // phonebookservices.com.nokia.symbian.IContactView
     CntServiceProviderEdit* serviceProviderEdit = new CntServiceProviderEdit( *services, &mainWindow ); // phonebookservices.com.nokia.symbian.IContactEdit
-
+    
+    qDebug() << "Service MainWindow about to show";
     mainWindow.show();
-
+    qDebug() << "Service MainWindow show ready";
+    
     return a.exec();
 }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/phonebookservices/tsrc/ut_cntservices/main.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,82 @@
+/*
+* 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 "testrunner.h"
+
+#include "ut_cntservices.h"
+
+#include <QtTest/QtTest>
+
+int main(int argc, char *argv[]) 
+{
+    bool promptOnExit(true);
+    for (int i=0; i<argc; i++) {
+        if (QString(argv[i]) == "-noprompt")
+            promptOnExit = false;
+    }
+    printf("Running tests...\n");
+    
+    QTranslator translator;
+    QString lang = QLocale::system().name();
+    QString path = "z:/resource/qt/translations/";
+    translator.load(path + "contacts_" + lang);
+    
+    Starter* starter = new Starter( argc, argv );
+    starter->installTranslator(&translator); 
+    starter->exec();
+    
+    if (promptOnExit) {
+        printf("Press any key...\n");
+        getchar(); 
+    }
+    return 0;   
+}
+
+Starter::Starter(int &argc, char **argv)
+     : HbApplication(argc, argv)
+{
+    mTestStarted = false;
+}
+
+Starter::~Starter()
+{
+}
+
+bool Starter::event( QEvent* aEvent )
+{
+    if (!mTestStarted) {
+        mTestStarted = true;
+        postEvent(this, new QEvent(QEvent::User));
+    }
+    else if (aEvent->type() == QEvent::User) {
+        TestRunner testRunner("ut_phonebookservices");
+                              
+            UT_CntServices cntServicesTest;
+            testRunner.runTests( cntServicesTest );
+
+        testRunner.printResults();
+        postEvent(this, new QEvent(static_cast<QEvent::Type>(QEvent::User + 1)) );
+        return true;
+    }
+   else if (aEvent->type() == QEvent::User + 1) {
+       quit();
+       return true;
+    }
+
+    return QObject::event( aEvent );
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/phonebookservices/tsrc/ut_cntservices/ut_cntservices.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,180 @@
+/*
+* 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 "ut_cntservices.h"
+#include "cntservices.h"
+#include "testviewmanager.h"
+#include <QtTest/QtTest>
+#include "testengine.h"
+#include <hbmainwindow.h>
+#include "cntserviceviewparams.h"
+
+
+void UT_CntServices::initTestCase()
+{
+    mTestViewManager = new TestViewManager();
+    connect( mTestViewManager, SIGNAL(changeView( const CntViewParameters aArgs )), this, SLOT( onViewChanged( const CntViewParameters aArgs ) ) );
+    mEngine = new TestEngine( *mTestViewManager );
+}
+
+void UT_CntServices::cleanupTestCase()
+{
+    delete mCntServices;
+    mCntServices = NULL;
+    delete mEngine;
+    mEngine = NULL;
+    delete mTestViewManager;
+    mTestViewManager = NULL;
+}
+
+void UT_CntServices::testCreating()
+{
+    mCntServices = new CntServices();
+    QVERIFY( mCntServices );
+}
+
+void UT_CntServices::test_setEngine()
+{
+    mCntServices = new CntServices();
+    QVERIFY( mCntServices );
+    mCntServices->setEngine( *mEngine );
+}
+
+
+void UT_CntServices::test_singleFetch()
+{
+    mCntServices = new CntServices();
+    // with empty action string
+    mCntServices->singleFetch( "someTitle", "someAction", *this );
+    // a signal is sent to slot onViewChanged(). The view params are stored by the slot.
+    QString title = mViewParams.value(KCntServiceViewParamTitle).toString();
+    QVERIFY( title == "someTitle" );
+}
+
+void UT_CntServices::test_multiFetch()
+{
+    mCntServices = new CntServices();
+    // with empty action string
+    mCntServices->multiFetch( "someTitle", "someAction", *this );
+    // a signal is sent to slot onViewChanged(). The view params are stored by the slot.
+    QString title = mViewParams.value(KCntServiceViewParamTitle).toString();
+    QVERIFY( title == "someTitle" );
+}
+
+void UT_CntServices::test_editCreateNew()
+{
+    mCntServices = new CntServices();
+    // with empty action string
+    mCntServices->editCreateNew(  QContactPhoneNumber::DefinitionName, "123456", *this );
+    // a signal is sent to slot onViewChanged(). The view params are stored by the slot.
+    QVariant contact = mViewParams.value( ESelectedContact );
+    //QVERIFY( contact. );
+}
+
+void UT_CntServices::test_editCreateNew2()
+{
+
+}
+
+void UT_CntServices::test_editCreateNewFromVCard()
+{
+
+}
+
+void UT_CntServices::test_editUpdateExisting()
+{
+
+}
+
+void UT_CntServices::test_editUpdateExisting2()
+{
+
+}
+
+void UT_CntServices::test_editExisting()
+{
+
+}
+
+void UT_CntServices::test_launchContactCard()
+{
+
+}
+
+void UT_CntServices::test_launchGroupMemberView()
+{
+
+}
+
+void UT_CntServices::test_launchTemporaryContactCard()
+{
+
+}
+
+
+void UT_CntServices::test_terminateService()
+{
+}
+
+
+void UT_CntServices::test_removeNotSupportedFields()
+{
+}
+
+
+void UT_CntServices::removeNotSupportedDetails()
+{
+}
+
+
+void UT_CntServices::test_fillOnlineAccount()
+{
+}
+
+
+void UT_CntServices::test_updateLocalId()
+{
+}
+
+
+void UT_CntServices::test_CompleteServiceAndCloseApp()
+{
+}
+
+
+void UT_CntServices::test_overrideReturnValue()
+{
+}
+
+
+void UT_CntServices::test_allowSubViewsExit()
+{
+}
+
+// receives signal from testviewmanager
+void UT_CntServices::onViewChanged( const CntViewParameters aArgs )
+{
+    mViewParams = aArgs;
+}
+
+
+// from CntAbstractServiceProvider
+void UT_CntServices::CompleteServiceAndCloseApp(const QVariant& /*retValue*/)
+{
+}
+
+// EOF
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/phonebookservices/tsrc/ut_cntservices/ut_cntservices.h	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,103 @@
+/*
+* 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 <QObject>
+#include <qmobilityglobal.h>
+#include <qtcontacts.h>
+#include <cntabstractserviceprovider.h>
+#include <cntviewparams.h>
+
+class CntServices;
+class TestViewManager;
+class HbMainWindow;
+class TestEngine;
+
+/**
+ * A class for testing CntServices.
+ */
+class UT_CntServices : public QObject, public CntAbstractServiceProvider
+{
+    Q_OBJECT
+
+private slots:
+    void initTestCase();
+    void cleanupTestCase();
+    
+    void testCreating();
+
+    void test_setEngine();
+
+    
+    void test_singleFetch();
+    
+    void test_multiFetch();
+    
+    void test_editCreateNew();
+    
+    void test_editCreateNew2();
+    
+    void test_editCreateNewFromVCard();
+    
+    void test_editUpdateExisting();
+    
+    void test_editUpdateExisting2();
+    
+    void test_editExisting();
+    
+    void test_launchContactCard();
+    
+    void test_launchGroupMemberView();
+    
+    void test_launchTemporaryContactCard();
+
+    void test_terminateService();
+    
+    void test_removeNotSupportedFields();
+
+    void removeNotSupportedDetails();
+
+    void test_fillOnlineAccount();
+
+    void test_updateLocalId();    
+
+    void test_CompleteServiceAndCloseApp();
+
+    void test_overrideReturnValue();
+
+    void test_allowSubViewsExit();
+
+    //Pointless now: void test_quitApp();
+    //Pointless now: void test_contactManager();    
+
+public slots:
+    void onViewChanged( const CntViewParameters aArgs );
+        
+private:
+    virtual void CompleteServiceAndCloseApp(const QVariant& retValue);
+    //virtual void overrideReturnValue(const QVariant& retValue) { Q_UNUSED(retValue) };
+    //virtual bool allowSubViewsExit() { return true; };
+
+    
+private:
+    CntServices*   mCntServices;
+    TestViewManager* mTestViewManager;
+    TestEngine* mEngine;
+    CntViewParameters mViewParams;
+};
+
+// EOF
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/phonebookservices/tsrc/ut_cntservices/ut_cntservices.pro	Fri Oct 15 12:24:46 2010 +0300
@@ -0,0 +1,100 @@
+#                                                                    
+# 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:                                                        
+#                                                                     
+#
+
+TEMPLATE = app
+TARGET = 
+
+QT += testlib sql xml core
+CONFIG += hb symbian_test
+HB += hbfeedback
+DEFINES += QT_NO_DEBUG_OUTPUT
+DEFINES += QT_NO_WARNING_OUTPUT
+DEFINES += PBK_UNIT_TEST
+
+MOC_DIR = moc
+
+INCLUDEPATH += ../../../../../inc
+INCLUDEPATH += ../../../../../phonebookui/phonebookapp/inc
+INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE 
+
+INCLUDEPATH +=  ../../../cntcommonui/core \
+                ../../../cntcommonui/engine_inc \
+                ../../../inc
+INCLUDEPATH +=  ../../../../phonebookengines/cntimageutility/inc
+
+
+# contacts/inc/
+HEADERS += ../../../../inc
+
+#=======================================================================
+# phonebookservices being unit tested
+
+HEADERS += ../../inc/cntabstractserviceprovider.h
+HEADERS += ../../inc/cntservices.h
+SOURCES += ../../src/cntservices.cpp
+
+
+#=======================================================================
+# test utilities
+
+HEADERS += ../../../cntcommonui/tsrc/testutility/testrunner.h
+SOURCES += ../../../cntcommonui/tsrc/testutility/testrunner.cpp
+
+HEADERS += ../../../cntcommonui/tsrc/testutility/testengine.h
+SOURCES += ../../../cntcommonui/tsrc/testutility/testengine.cpp    
+
+HEADERS += ../../../cntcommonui/tsrc/testutility/testviewmanager.h
+SOURCES += ../../../cntcommonui/tsrc/testutility/testviewmanager.cpp
+
+#HEADERS += ../../../cntcommonui/tsrc/testutility/hbstubs_helper.h
+#SOURCES += ../../../cntcommonui/tsrc/testutility/hbstubs.cpp
+
+#SOURCES += ../../../cntcommonui/tsrc/testutility/qthighway_stub.cpp
+#qthighway_stub_helper.h
+
+#=======================================================================
+# Dependencies from cntcommonui which are needed
+
+HEADERS += ../../../cntcommonui/core/cntextensionmanager.h
+SOURCES += ../../../cntcommonui/core/cntextensionmanager.cpp
+
+HEADERS += ../../../cntcommonui/core/cntthumbnailmanager.h
+SOURCES += ../../../cntcommonui/core/cntthumbnailmanager.cpp
+
+#=======================================================================
+
+# Tester sources
+HEADERS += ./*.h
+SOURCES += ./*.cpp
+
+
+
+# capability
+TARGET.CAPABILITY = ALL -TCB
+    
+TRANSLATIONS = contacts.ts
+
+LIBS += -lhbcore \
+        -lqtcontacts \
+        -lcntlistmodel \
+        -lcntcommonui \
+        -lqtversit \
+        -lcntimageutility \
+	    -lxqkeycapture \
+        -lxqservice \
+        -lxqserviceutil
+symbian:MMP_RULES += SMPSAFE
\ No newline at end of file
--- a/phonebookui/phonebookui.pro	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/phonebookui.pro	Fri Oct 15 12:24:46 2010 +0300
@@ -19,7 +19,7 @@
 
 
 TEMPLATE = subdirs
-SUBDIRS = cnthistorymodel cntcommonui phonebookapp phonebookservices
+SUBDIRS = cntlistmodel cnthistorymodel cntcommonui phonebookapp phonebookservices
 CONFIG += ordered
 
 deploy.path = /epoc32/rom/include/core/app/
--- a/phonebookui/rom/phonebook.iby	Fri Oct 08 11:42:51 2010 +0300
+++ b/phonebookui/rom/phonebook.iby	Fri Oct 15 12:24:46 2010 +0300
@@ -24,14 +24,14 @@
 #define UPGRADABLE_APP_REG_RSC(NAME) data=DATAZ_\PRIVATE\10003A3F\IMPORT\APPS\ ## NAME ## _reg.rsc        Private\10003a3f\import\apps\ ## NAME ## _reg.rsc
 
 // Engine
-file=ABI_DIR\BUILD_DIR\cntlistmodel.dll             SHARED_LIB_DIR\cntlistmodel.dll UNPAGED
-file=ABI_DIR\BUILD_DIR\cnthistorymodel.dll               SHARED_LIB_DIR\cnthistorymodel.dll UNPAGED
-file=ABI_DIR\BUILD_DIR\cntactionsplugin.dll          	   SHARED_LIB_DIR\cntactionsplugin.dll UNPAGED
-file=ABI_DIR\BUILD_DIR\cntsimutility.dll            		SHARED_LIB_DIR\cntsimutility.dll UNPAGED
-file=ABI_DIR\BUILD_DIR\cntimageutility.dll            	SHARED_LIB_DIR\cntimageutility.dll UNPAGED
+file=ABI_DIR\BUILD_DIR\cntlistmodel.dll             SHARED_LIB_DIR\cntlistmodel.dll
+file=ABI_DIR\BUILD_DIR\cnthistorymodel.dll               SHARED_LIB_DIR\cnthistorymodel.dll
+file=ABI_DIR\BUILD_DIR\cntactionsplugin.dll          	   SHARED_LIB_DIR\cntactionsplugin.dll
+file=ABI_DIR\BUILD_DIR\cntsimutility.dll            		SHARED_LIB_DIR\cntsimutility.dll
+file=ABI_DIR\BUILD_DIR\cntimageutility.dll            	SHARED_LIB_DIR\cntimageutility.dll
 
 // UI
-file=ABI_DIR\BUILD_DIR\cntcommonui.dll                	SHARED_LIB_DIR\cntcommonui.dll UNPAGED
+file=ABI_DIR\BUILD_DIR\cntcommonui.dll                	SHARED_LIB_DIR\cntcommonui.dll
 file=ABI_DIR\BUILD_DIR\phonebook.exe                  	SHARED_LIB_DIR\phonebook.exe
 
 UPGRADABLE_APP_REG_RSC(phonebook)
--- a/pimprotocols/phonebooksync/Server/SyncEngineServer.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/pimprotocols/phonebooksync/Server/SyncEngineServer.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -500,7 +500,7 @@
 			CContactGroup*  group = static_cast<CContactGroup*> (iDb->ReadContactLC((*idList)[index]));
 			CContactIdArray*  itemList = group->ItemsContainedLC();
 
-			if (itemList->Count() > 0)
+			if ( itemList && itemList->Count() > 0)
 				{
 				CContactItem*  groupItem = iDb->ReadContactLC((*itemList)[0]);
 				TContactItemId templateId = groupItem->TemplateRefId();
--- a/pimprotocols/phonebooksync/group/bld.inf	Fri Oct 08 11:42:51 2010 +0300
+++ b/pimprotocols/phonebooksync/group/bld.inf	Fri Oct 15 12:24:46 2010 +0300
@@ -52,3 +52,4 @@
 ../Test/TE_Sync/TE_Sync.mmp
 ../Test/TE_PhBkSync/TE_PhBkSync.mmp
 ../Test/TE_cntsync/te_cntsync.mmp
+
--- a/presencecache/presencecacheqt/tsrc/presencefeeddemo_qt/presencefeeddemo_qt.pro	Fri Oct 08 11:42:51 2010 +0300
+++ b/presencecache/presencecacheqt/tsrc/presencefeeddemo_qt/presencefeeddemo_qt.pro	Fri Oct 15 12:24:46 2010 +0300
@@ -44,4 +44,5 @@
 symbian: {
         TARGET.EPOCSTACKSIZE = 0x14000
         TARGET.EPOCHEAPSIZE = 0x1000 0xA00000 
-}
\ No newline at end of file
+}
+symbian:MMP_RULES += SMPSAFE
\ No newline at end of file
--- a/presencecache/presencecachesymbian/presencecacheclient2/group/presencecacheclient2.mmp	Fri Oct 08 11:42:51 2010 +0300
+++ b/presencecache/presencecachesymbian/presencecacheclient2/group/presencecacheclient2.mmp	Fri Oct 15 12:24:46 2010 +0300
@@ -53,5 +53,6 @@
 deffile ../bwins/ 
 #endif
 
+SMPSAFE
 // End of file
 
--- a/presencecache/presencecachesymbian/presencecacheclient2/src/presencecacheclient.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/presencecache/presencecachesymbian/presencecacheclient2/src/presencecacheclient.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -103,54 +103,65 @@
     
 // -----------------------------------------------------------------------------
 // CPresenceCacheClient::Connect()
-// Connects to the server and create a session.
+// Connect to the server, attempting to start it if necessary
 // -----------------------------------------------------------------------------
 //
 TInt CPresenceCacheClient::Connect()
     {
-    TInt error = StartServer();
-
-    if ( KErrNone == error )
+    TInt retry=2;
+    for (;;)
         {
-        error = CreateSession( NName::KSymbianServer,
-                               Version(),
-                               NRequest::KMsgSlotCount );
-        }
-    return error;
+        TInt r = CreateSession( NName::KSymbianServer,
+                                Version(),
+                                NRequest::KMsgSlotCount );      
+        // Continue if there was error but caused from server not being 
+        // started yet, in which case server start will be tried later in the loop.
+        // Otherwise return KErrNone or one of the system wide error codes.
+        if (r!=KErrNotFound && r!=KErrServerTerminated)    
+            return r;
+        //
+        // Decreace retry counter and abort if too many retries already
+        if (--retry==0)    
+            return r;
+        //
+        // Try to start server. If no error or the error was caused  
+        // from server already started, continue to next iteration when 
+        // the session creation will be tried again.
+        r=StartServer();
+        if (r!=KErrNone && r!=KErrAlreadyExists)      
+            return r;
+            
+        }  
     }
           
 // ----------------------------------------------------
 // CPresenceCacheClient::StartServer
-//
 // ----------------------------------------------------
 //
 TInt CPresenceCacheClient::StartServer()
-    {
-    TInt result;
-    TRequestStatus status = KRequestPending; 
-
-    TFindServer findCacheServer( NName::KSymbianServer );
-    TFullName name;
-
-    result = findCacheServer.Next( name );
-    if ( result == KErrNone )
-        {
-        // Server already running
-        return KErrNone;
-        }
-
+    {  
+    // Start the server process. Simultaneous launching
+    // of two such processes should be detected when the second one attempts to
+    // create the server object, failing with KErrAlreadyExists.
+    //
     RProcess server;
-    result = server.Create( NName::KExecutable, KNullDesC );       
-    if( result != KErrNone )
-        return result;     
-    server.Rendezvous( status );    	
-    status != KRequestPending ? server.Kill( 0 ) : server.Resume();
-    //Wait for start or death 
-    User::WaitForRequest( status );	
-    result = server.ExitType() == EExitPanic ? KErrGeneral : status.Int();
-    server.Close();
-    
-    return result;	    
+    TInt r=server.Create( NName::KExecutable, KNullDesC );  
+    if (r!=KErrNone) 
+        return r;
+    TRequestStatus stat;
+    server.Rendezvous(stat);
+    if (stat!=KRequestPending) 
+        server.Kill(0);     // abort startup  
+    else 
+        server.Resume();    // logon OK - start the server
+    User::WaitForRequest(stat);     // wait for start or death
+    // we can't use the 'exit reason' if the server panicked as this
+    // is the panic 'reason' and may be '0' which cannot be distinguished
+    // from KErrNone
+    r=(server.ExitType()==EExitPanic) ? KErrGeneral : stat.Int();
+    // here it may return KErrAlreadyExists or KErrNone
+    server.Close();    
+    return r;
     }
     
 // -----------------------------------------------------------------------------
--- a/presencecache/presencecachesymbian/presencecacheserver2/group/presencecacheserver2.mmp	Fri Oct 08 11:42:51 2010 +0300
+++ b/presencecache/presencecachesymbian/presencecacheserver2/group/presencecacheserver2.mmp	Fri Oct 15 12:24:46 2010 +0300
@@ -52,6 +52,6 @@
 LIBRARY                 ecom.lib
 
 LIBRARY                 presencecacheutils.lib
-
+SMPSAFE
 // End of file
 
--- a/presencecache/presencecachesymbian/presencecacheserver2/src/presencecacheexpiry.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/presencecache/presencecachesymbian/presencecacheserver2/src/presencecacheexpiry.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -100,6 +100,7 @@
             iServer.iPresenceCache;
     
     RPointerArray<CPresenceCacheBuddyStore> buddyStores;
+    CleanupClosePushL(buddyStores);
     
     const TInt serviceCount(presenceCache.Count());
     for( TInt i = 0 ; i < serviceCount ; ++i )
@@ -112,6 +113,11 @@
         {
         NotifySubscribersL( *( buddyStores[i] ) );
         }
+    
+    // Close the buddyStores array and free all memory allocated to it.
+    // Doesn't delete the contained CPresenceCacheBuddyStor objects.
+    // Ownership of those remain in CPresenceCacheServiceStore.
+    CleanupStack::PopAndDestroy();   // calls buddyStores.Close()
     }
 
 //  End of File
--- a/presencecache/presencecachesymbian/presencecacheserver2/src/presencecacheserver.cpp	Fri Oct 08 11:42:51 2010 +0300
+++ b/presencecache/presencecachesymbian/presencecacheserver2/src/presencecacheserver.cpp	Fri Oct 15 12:24:46 2010 +0300
@@ -52,7 +52,7 @@
 CPresenceCacheServer::~CPresenceCacheServer()
     {
     delete iExpiryCheck;
-    DoCancel();
+    Cancel();  
     TInt count = iPresenceCache.Count();
     for (TInt i=0;i<count;i++)
         {
@@ -140,6 +140,7 @@
 //
 void CPresenceCacheServer::ConstructL()
     {
+    StartL( NName::KSymbianServer );
     iShutdown.ConstructL();
 	// ensure that the server still exits even if the 1st client fails to connect
 	iShutdown.Start();
@@ -186,7 +187,6 @@
 
     // create server
     CPresenceCacheServer* server = CPresenceCacheServer::NewLC();
-    server->StartL( NName::KSymbianServer );
 
     //Signal client that we are started
     RProcess().Rendezvous( KErrNone );
--- a/presencecache/presencecachesymbian/presencecachesymbian.pro	Fri Oct 08 11:42:51 2010 +0300
+++ b/presencecache/presencecachesymbian/presencecachesymbian.pro	Fri Oct 15 12:24:46 2010 +0300
@@ -21,9 +21,12 @@
 
 TEMPLATE = subdirs
 BLD_INF_RULES.prj_mmpfiles = "./presencecacheutils/group/presencecacheutils.mmp" \
-														 "./presencecacheclient2/group/presencecacheclient2.mmp" \
+							 "./presencecacheclient2/group/presencecacheclient2.mmp" \
                              "./presencecacheserver2/group/presencecacheserver2.mmp"  
  															
 BLD_INF_RULES.prj_exports += \
      "$${LITERAL_HASH}include <platform_paths.hrh>" \
-     "./rom/presencecache.iby                CORE_APP_LAYER_IBY_EXPORT_PATH(presencecache.iby)" 
\ No newline at end of file
+     "./rom/presencecache.iby                CORE_APP_LAYER_IBY_EXPORT_PATH(presencecache.iby)" 
+
+symbian:MMP_RULES += SMPSAFE
+ 
\ No newline at end of file
--- a/presencecache/presencecachesymbian/presencecacheutils/group/presencecacheutils.mmp	Fri Oct 08 11:42:51 2010 +0300
+++ b/presencecache/presencecachesymbian/presencecacheutils/group/presencecacheutils.mmp	Fri Oct 15 12:24:46 2010 +0300
@@ -52,3 +52,4 @@
 // DEBUG
 LIBRARY         flogger.lib //todo: remove to DEBUGLIBRARY when ready.
 
+SMPSAFE
\ No newline at end of file
--- a/sis/contacts.pkg	Fri Oct 08 11:42:51 2010 +0300
+++ b/sis/contacts.pkg	Fri Oct 15 12:24:46 2010 +0300
@@ -14,11 +14,9 @@
 ; Description: pkg file  of Contacts Application for IAD.
 ;
 
-
 ; Language
 &EN
 
-
 ; SIS header: name, uid, version
 #{"Contacts"},(0x20022EF9),1,1,0, TYPE=SA, RU
 
@@ -28,31 +26,35 @@
 ; Unique Vendor name
 :"Nokia"
 
+; Contacts app dlls
 "/epoc32/release/armv5/urel/cntlistmodel.dll"                                - "!:/sys/bin/cntlistmodel.dll"
-"/epoc32/release/armv5/urel/cnthistorymodel.dll"                                - "!:/sys/bin/cnthistorymodel.dll"
-"/epoc32/release/armv5/urel/cntactionsplugin.dll"                                - "!:/sys/bin/cntactionsplugin.dll"
-"/epoc32/release/armv5/urel/cntsimutility.dll"                                - "!:/sys/bin/cntsimutility.dll"
-"/epoc32/release/armv5/urel/cntimageutility.dll"                                - "!:/sys/bin/cntimageutility.dll"
+"/epoc32/release/armv5/urel/cnthistorymodel.dll"                             - "!:/sys/bin/cnthistorymodel.dll"
+"/epoc32/release/armv5/urel/cntsimutility.dll"                               - "!:/sys/bin/cntsimutility.dll"
+"/epoc32/release/armv5/urel/cntimageutility.dll"                             - "!:/sys/bin/cntimageutility.dll"
+"/epoc32/release/armv5/urel/cntcommonui.dll"                                 - "!:/sys/bin/cntcommonui.dll"
+"/epoc32/release/armv5/urel/phonebook.exe"                                   - "!:/sys/bin/phonebook.exe"
 
-"/epoc32/release/armv5/urel/cntcommonui.dll"                                - "!:/sys/bin/cntcommonui.dll"
-"/epoc32/release/armv5/urel/phonebook.exe"                                - "!:/sys/bin/phonebook.exe"
+; Qt plugins & dlls
+"/epoc32/data/z/resource/qt/plugins/contacts\cntactionsplugin.qtplugin"        - "!:/resource/qt/plugins/contacts\cntactionsplugin.qtplugin"
+"/epoc32/data/z/resource/qt/plugins/contacts\qtcontacts_symbian.qtplugin"      - "!:/resource/qt/plugins/contacts\qtcontacts_symbian.qtplugin"
+"/epoc32/data/z/resource/qt/plugins/contacts\qtcontacts_symbiansim.qtplugin"   - "!:/resource/qt/plugins/contacts\qtcontacts_symbiansim.qtplugin"
+"/epoc32/release/armv5/urel/cntactionsplugin.dll"                              - "!:/sys/bin/cntactionsplugin.dll"
+"/epoc32/release/armv5/urel/qtcontacts_symbian.dll"                            - "!:/sys/bin/qtcontacts_symbian.dll"
+"/epoc32/release/armv5/urel/qtcontacts_symbiansim.dll"                         - "!:/sys/bin/qtcontacts_symbiansim.dll"
 
-
-"/epoc32/data/z/resource/qt/plugins/contacts\cntactionsplugin.qtplugin"    -   "!:/resource/qt/plugins/contacts\cntactionsplugin.qtplugin"
-
+; Splash screen resource files
 "/epoc32/data/z/resource/hb/splashml/phonebook.splashml"  - "!:\resource\hb\splashml\phonebook.splashml"
 "/epoc32/data/z/resource/hb/splashml/phonebook.splashml"  - "!:\resource\hb\splashml\phonebook.splashml"
 
 ; Phonebook services
-"/epoc32/release/armv5/urel/phonebookservices.exe"                                - "!:/sys/bin/phonebookservices.exe"
-"/epoc32/data/z/resource/apps/phonebookservices.rsc"                         - "!:/resource/apps/phonebookservices.rsc"
-"/epoc32/data/Z/private/10003a3f/import/apps/phonebookservices_reg.rsc"		- "!:/private/10003a3f/import/apps/phonebookservices_reg.rsc"
+"/epoc32/release/armv5/urel/phonebookservices.exe"                            - "!:/sys/bin/phonebookservices.exe"
+"/epoc32/data/z/resource/apps/phonebookservices.rsc"                          - "!:/resource/apps/phonebookservices.rsc"
+"/epoc32/data/Z/private/10003a3f/import/apps/phonebookservices_reg.rsc"		  - "!:/private/10003a3f/import/apps/phonebookservices_reg.rsc"
 
-
-;Phonebook resources
-"/epoc32/data/z/resource/apps/phonebook.rsc"                         - "!:/resource/apps/phonebook.rsc"
+; Phonebook resources
+"/epoc32/data/z/resource/apps/phonebook.rsc"                        - "!:/resource/apps/phonebook.rsc"
 "/epoc32/data/z/resource/qt/translations/contacts_en.qm"            - "!:/resource/qt/translations/contacts_en.qm"
 
-;Cenrep settings
-"/epoc32/data/z/private/10202be9/2002FF54.txt" - "!:/system/data/10202BE9/2002FF54.txt"
-"/epoc32/data/z/private/10202be9/200315A8.txt" - "!:/system/data/10202BE9/200315A8.txt"
\ No newline at end of file
+; Cenrep files
+"/epoc32/data/z/private/10202be9/2002FF54.txt"  - "!:/system/data/10202BE9/2002FF54.txt"
+"/epoc32/data/z/private/10202be9/200315A8.txt"  - "!:/system/data/10202BE9/200315A8.txt"
--- a/sis/contacts_stub.pkg	Fri Oct 08 11:42:51 2010 +0300
+++ b/sis/contacts_stub.pkg	Fri Oct 15 12:24:46 2010 +0300
@@ -17,7 +17,6 @@
 ; Language
 &EN
 
-
 ; SIS header: name, uid, version
 #{"Contacts"},(0x20022EF9),1,0,0, TYPE=SA
 
@@ -27,33 +26,35 @@
 ; Unique Vendor name
 :"Nokia"
 
-
-; Phonebook.iby contents 
- 
+; Contacts app dlls 
 "" - "z:\sys\bin\cntlistmodel.dll"
 "" - "z:\sys\bin\cnthistorymodel.dll"
-"" - "z:\sys\bin\cntactionsplugin.dll"
 "" - "z:\sys\bin\cntsimutility.dll"
 "" - "z:\sys\bin\cntimageutility.dll"
 "" - "z:\sys\bin\cntcommonui.dll"
 "" - "z:\sys\bin\phonebook.exe"
 
+; Qt plugins & dlls
 "" - "z:\resource\qt\plugins\contacts\cntactionsplugin.qtplugin"
+"" - "z:\resource\qt\plugins\contacts\qtcontacts_symbian.qtplugin"
+"" - "z:\resource\qt\plugins\contacts\qtcontacts_symbiansim.qtplugin"
+"" - "z:\sys\bin\cntactionsplugin.dll"
+"" - "z:\sys\bin\qtcontacts_symbian.dll"
+"" - "z:\sys\bin\qtcontacts_symbiansim.dll"
 
+; Splash screen resource files
 "" - "z:\resource\hb\splashml\phonebook.splashml"
 "" - "z:\resource\hb\splashml\phonebook.docml"
 
-; Phonebookservices.iby contents 
+; Phonebook services
 "" - "z:\sys\bin\phonebookservices.exe"
 "" - "z:\resource\apps\phonebookservices.r*"
 "" - "z:\private\10003a3f\import\apps\phonebookservices_reg.rsc"
 
-
-
-;Phonebookresources.iby contents
+; Phonebook resources
 "" - "z:\resource\qt\translations\contacts*.qm"
 "" - "z:\resource\apps\phonebook.r*"
 
-;Cenrep settings
+; Cenrep files
 "" - "z:\system\data\10202BE9\2002FF54.txt"
 "" - "z:\system\data\10202BE9\200315A8.txt"
Binary file sis/contacts_stub.sis has changed