cpsecplugins/cpadvancedsecplugin/src/cpcertview.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 04 Oct 2010 01:41:57 +0300
changeset 61 1cc4c46c2963
parent 37 7bad16cccaca
permissions -rw-r--r--
Revision: 201037 Kit: 201039

/*
* 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 <QStringList>
#include <QGraphicsLinearLayout>
#include <QModelIndex>

#include <hblineedit.h>
#include <hbdataform.h>
#include <hbdataformmodel.h>
#include <hbdataformmodelitem.h>
#include <hblabel.h>
#include <hbpushbutton.h>
#include <hbmenu.h>
#include <hbaction.h>
#include <HbListWidget>
#include <HbListWidgetItem>
#include <HbGroupBox>
#include <hbpushbutton.h>
#include <hbdataform.h>
#include <hbdataformmodel.h>
#include <hbdataformmodelitem.h>
#include <hbabstractviewitem.h>
#include <hbtextitem.h>
#include <hbmainwindow.h>
#include <hblistview.h>
#include <QStandardItemModel>
#include <QModelIndexList>
#include <hbmessagebox.h>
#include <memory>
#include <../../inc/cpsecplugins.h>
#include "cpcertdetailview.h"
#include "cpcertview.h"
#include "cpcertdatacontainer.h"
#include "cpcerttrustview.h"
#include "cpcertmanuisyncwrapper.h"


CpCertView::CpCertView(const QModelIndex& modelIndex, QGraphicsItem *parent /*= 0*/)
	: CpBaseSettingView(0,parent),
	  mPopup(NULL), mOkAction(NULL),
	  mPrevView(NULL),
	  mCurrentView(NULL),
	  mRefreshedView(NULL),
	  mListView(NULL),
	  mSelectAllView(NULL),
	  mOriginalView(NULL),
	  mNote(NULL)
	{
	RDEBUG("0", 0);
	mOriginalView = mainWindow()->currentView();

	HbMenu* menu = this->menu();
	std::auto_ptr<HbAction> deleteAction(new HbAction(hbTrId("txt_common_menu_delete")));
	connect(deleteAction.get(), SIGNAL(triggered()), this, SLOT(deleteList()));
	menu->addAction(deleteAction.get());
	deleteAction.release();

	std::auto_ptr<QGraphicsLinearLayout> layout(new QGraphicsLinearLayout(Qt::Vertical));

	HbDataForm *form = q_check_ptr(new HbDataForm(this));
	std::auto_ptr<HbDataFormModel> formModel(q_check_ptr(new HbDataFormModel()));
	form->setModel(formModel.get());
	formModel.release();

	HbListWidget* certificateList = q_check_ptr(new HbListWidget(this));

	CpCertView::TCertificateViews currentView = (CpCertView::TCertificateViews)modelIndex.row();
	QString title;
	if(currentView == EPersonalView)
		{
		title = "Move to Device";
		}
	else if(currentView == EDeviceView)
		{
		title = "Move to Personal";
		}
	RDEBUG("0", 0);
	if(currentView == EPersonalView || currentView == EDeviceView)
		{
		std::auto_ptr<HbAction> moveToDeviceAction(q_check_ptr(new HbAction(title)));
		connect(moveToDeviceAction.get(), SIGNAL(triggered()), this, SLOT(moveCert()));
		menu->addAction(moveToDeviceAction.get());
		moveToDeviceAction.release();
		}

	setDetails(currentView);
	TInt count = 0;
	try
		{
		QT_TRAP_THROWING(mCertDataContainer = CpCertDataContainer::NewL());
		QT_TRAP_THROWING(count = refreshListL());
		}
	catch(const std::exception& exception)
		{
		HbMessageBox::information(exception.what());
		throw(exception);
		}
	RDEBUG("0", 0);
	for(int index = 0; index< count; index++)
		{
		QString certificateLabel = certLabel(index);
		std::auto_ptr<HbListWidgetItem> singleCert(q_check_ptr(new HbListWidgetItem()));
		singleCert->setText(certificateLabel);
		certificateList->addItem(singleCert.get());
		singleCert.release();
		}  // End of FOR loop

	connect(certificateList, SIGNAL(activated(QModelIndex)), this, SLOT(openCertFromList(QModelIndex)));
	connect(certificateList, SIGNAL(longPressed(HbAbstractViewItem*, QPointF )), this, SLOT(indicateLongPress(HbAbstractViewItem*, QPointF)));

	layout->addItem(certificateList);
	setLayout(layout.get());
	layout.release();

	mPopup = q_check_ptr(new HbDialog());
	mContextMenu = q_check_ptr(new HbMenu());

	RDEBUG("0", 0);
	}

CpCertView::~CpCertView()
	{
	delete mCertDataContainer;
	mCertDataContainer = NULL;
	RDEBUG("0", 0);
	if(mPrevView)
		{
		mPrevView->deleteLater();
		mPrevView= NULL;
		}
	if(mCurrentView)
		{
		mCurrentView->deleteLater();
		mCurrentView= NULL;
		}
	if(mRefreshedView)
		{
		mRefreshedView->deleteLater();
		mRefreshedView= NULL;
		}
	if(mListView)
		{
		mListView->deleteLater();
		mListView= NULL;
		}

	if(mSelectAllView)
	{
	mSelectAllView->deleteLater();
	mSelectAllView = NULL;
	}

	mSelectionIndex.Close();

	mIndexList.Close();

	delete mPopup;

	delete mNote;
	mNote = NULL;

	delete mContextMenu;

	}

void CpCertView::setDetails(CpCertView::TCertificateViews currentView)
	{
	RDEBUG("0", 0);
	switch(currentView)
		{
		case EAuthorityView:
		setTitle(hbTrId("txt_certificate_manager_list_authority_certificate"));
		mCertView = EAuthorityView;
		break;

		case ETrustedView:
		setTitle(hbTrId("txt_certificate_manager_list_trusted_site_certific"));
		mCertView = ETrustedView;
		break;

		case EPersonalView:
		setTitle(hbTrId("txt_certificate_manager_list_personal_certificates"));
		mCertView = EPersonalView;
		break;

		case EDeviceView:
		setTitle(hbTrId("txt_certificate_manager_list_device_certificates"));
		mCertView = EDeviceView;
		break;
		}
	}

void CpCertView::indicateLongPress(HbAbstractViewItem *item,QPointF coords)
	{
	RDEBUG("0", 0);
	mPos = item->modelIndex().row();   // Pos will tell you what is the certificate clicked in particular view.

	mContextMenu->clearActions();
	std::auto_ptr<HbAction> open(q_check_ptr(new HbAction(hbTrId("txt_common_menu_open"))));
	connect(open.get(), SIGNAL(triggered()), this, SLOT( openCertificate()));
	mContextMenu->addAction(open.get());
	open.release();

	QString moveTitle;

	if(mCertView == EAuthorityView)
		{
		std::auto_ptr<HbAction> trustSettings(q_check_ptr(new HbAction(hbTrId("txt_certificate_manager_menu_trust_settings"))));
		connect(trustSettings.get(), SIGNAL(triggered()), this, SLOT(showTrustSettings()));
		mContextMenu->addAction(trustSettings.get());
		trustSettings.release();
		}
	else if(mCertView == EPersonalView)
		{
		moveTitle = hbTrId("txt_certificate_manager_menu_move_to_device_certif");
		}
	else if(mCertView == EDeviceView)
		{
		moveTitle = hbTrId("txt_certificate_manager_menu_move_to_personal_cert");
		}

	if(mCertView == EPersonalView || mCertView == EDeviceView )
		{
		std::auto_ptr<HbAction> moveCert(q_check_ptr(new HbAction(moveTitle)));
		connect(moveCert.get(), SIGNAL(triggered()), this, SLOT(moveSelectedCert()));
		mContextMenu->addAction(moveCert.get());
		moveCert.release();
		}

	RDEBUG("0", 0);
	if( certAt(mPos)->IsDeletable() )
		{
		std::auto_ptr<HbAction> menuDelete(q_check_ptr(new HbAction(hbTrId("txt_common_menu_delete"))));
		connect(menuDelete.get(), SIGNAL(triggered()), this, SLOT(deleteCertificate()));
		mContextMenu->addAction(menuDelete.get());
		menuDelete.release();
		}
	mContextMenu->setPreferredPos(coords);
	mContextMenu->open();
	}

void CpCertView::openCertFromList(const QModelIndex& modelIndex)
	{
	RDEBUG("0", 0);
	// Pos will tell you what is the certificate clicked in particular view.
	mPos = modelIndex.row();
	openCertificate();
	}

void CpCertView::openCertificate()
	{
	RDEBUG("0", 0);
	mCurrentView = q_check_ptr(new CpCertDetailView(mCertView,mPos,*mCertDataContainer));
	connect(mCurrentView, SIGNAL(aboutToClose()), this, SLOT(displayPreviousView()));
	mPrevView = mainWindow()->currentView();
	mainWindow()->addView(mCurrentView);
	mainWindow()->setCurrentView(mCurrentView);
	}

void CpCertView::displayPreviousView()
	{
	RDEBUG("0", 0);
	mainWindow()->removeView(mCurrentView);
	mCurrentView->deleteLater();
	mCurrentView= NULL;
	mainWindow()->setCurrentView(mPrevView);
	}

void CpCertView::deleteCertificate()
	{
	RDEBUG("0", 0);
	RArray<TInt> pos;
	pos.Append(mPos);
	QT_TRAP_THROWING(deleteCertsL(pos));
	}

void CpCertView::deleteList()
	{
	RDEBUG("0", 0);
	mSelectAll = EFalse;
	mPopup->setDismissPolicy(HbDialog::NoDismiss);
	// Set the label as heading widget
	mPopup->setHeadingWidget(q_check_ptr(new HbLabel(hbTrId("txt_certificate_manager_setlabel_certificates"))));

	std::auto_ptr<QGraphicsLinearLayout> layout(q_check_ptr(new QGraphicsLinearLayout(Qt::Vertical)));

	mSelectAllView = q_check_ptr(new HbListView(this));
	QStandardItemModel* selectAllModel = q_check_ptr(new QStandardItemModel(this));
	// Populate the model with content
	std::auto_ptr<QStandardItem> selectAllItem(q_check_ptr(new QStandardItem()));
	selectAllItem->setData(QString("Select All"),Qt::DisplayRole);
	selectAllModel->appendRow(selectAllItem.get());
	selectAllItem.release();

	connect(mSelectAllView, SIGNAL(activated(QModelIndex)), this, SLOT(selectAll()));
	mSelectAllView->setModel(selectAllModel);
	mSelectAllView->setSelectionMode(HbListView::MultiSelection);
	layout->addItem(mSelectAllView);

	mListView = q_check_ptr(new HbListView(this));
	// Connect to "activated" signal
	connect(mListView, SIGNAL(activated(QModelIndex)), this, SLOT(itemActivated(QModelIndex)));

	// Create a model
	QStandardItemModel* model = q_check_ptr(new QStandardItemModel(this));
	TInt count=0;
	QT_TRAP_THROWING( count = refreshListL());
	RDEBUG("0", 0);
	for(TInt index = 0; index < count ; ++index)
		{
		const CCTCertInfo* cert = certAt(index);
		if( cert->IsDeletable() )
			{
			// Populate the model with content
			std::auto_ptr<QStandardItem> certItem(q_check_ptr(new QStandardItem()));
			QString certificateLabel = certLabel(index);
			certItem->setData( certificateLabel, Qt::DisplayRole);
			model->appendRow(certItem.get());
			mSelectionIndex.Append(index);
			certItem.release();
			}
		}
	// Set the model to the list view
	mListView->setModel(model);
	mListView->setSelectionMode(HbListView::MultiSelection);
	layout->addItem(mListView);

	std::auto_ptr<HbWidget> widget( q_check_ptr(new HbWidget()));
	widget->setLayout(layout.get());
	layout.release();
	mPopup->setContentWidget(widget.get());
	widget.release();

    mPopup->clearActions();
	mOkAction = q_check_ptr(new HbAction(hbTrId("txt_common_opt_delete")));
	mPopup->addAction(mOkAction);
	HbAction *cancelAction = q_check_ptr(new HbAction(hbTrId("txt_common_button_cancel")));
	mPopup->addAction(cancelAction);
	mPopup->setTimeout(HbPopup::NoTimeout);
	RDEBUG("0", 0);
	// Launch popup syncronously
	mPopup->open(this, SLOT(handleMultipleDelete(HbAction*)));

}

void CpCertView::handleMultipleDelete(HbAction* action)
{
	RDEBUG("0", 0);
	if(action == mOkAction)
		{
		QItemSelectionModel *selectionModel = mListView->selectionModel();
		QModelIndexList mWidgetItemsToRemove = selectionModel->selectedIndexes();
		TInt deleteCount = mWidgetItemsToRemove.count();
		// start deleting from end of array so that the indexes do not changes of the ones
		// at the front.
		RArray<TInt> actualIndex;
		QT_TRAP_THROWING
			(
			CleanupClosePushL(actualIndex);
			for (TInt index = deleteCount-1; index>= 0 ; --index)
				{
				TInt selectedItemIndex = mWidgetItemsToRemove[index].row();
				actualIndex.Append( mSelectionIndex[selectedItemIndex] );
				}
			deleteCertsL(actualIndex);
			CleanupStack::PopAndDestroy(&actualIndex);
			) // QT_TRAP_THROWING
		}
	RDEBUG("0", 0);
	mListView->deleteLater();
	mListView = NULL;
	mSelectAllView->deleteLater();
	mSelectAllView = NULL;
	}

void CpCertView::moveCert()
	{
	RDEBUG("0", 0);
	mSelectAll = EFalse;
	mPopup->setDismissPolicy(HbDialog::NoDismiss);
	// Set the label as heading widget
	if(mCertView == EPersonalView)
		{
		mPopup->setHeadingWidget(q_check_ptr(new HbLabel(tr("Move To Device"))));
		}
	else if(mCertView == EDeviceView)
		{
		mPopup->setHeadingWidget(q_check_ptr(new HbLabel(tr("Move To Personal"))));
		}

	std::auto_ptr<QGraphicsLinearLayout> layout(q_check_ptr(new QGraphicsLinearLayout(Qt::Vertical)));

	mSelectAllView = q_check_ptr(new HbListView(this));
	QStandardItemModel* selectAllModel = q_check_ptr(new QStandardItemModel(this));
	// Populate the model with content
	std::auto_ptr<QStandardItem> selectAllItem(q_check_ptr(new QStandardItem()));
	selectAllItem->setData(QString("Select All"),Qt::DisplayRole);
	selectAllModel->appendRow(selectAllItem.get());
	selectAllItem.release();
	connect(mSelectAllView, SIGNAL(activated(QModelIndex)), this, SLOT(selectAll()));
	mSelectAllView->setModel(selectAllModel);
	mSelectAllView->setSelectionMode(HbListView::MultiSelection);
	layout->addItem(mSelectAllView);

	mListView = q_check_ptr(new HbListView(this));
	// Connect to "activated" signal
	connect(mListView, SIGNAL(activated(QModelIndex)), this, SLOT(itemActivated(QModelIndex)));

	// Create a model
	QStandardItemModel* model = q_check_ptr(new QStandardItemModel(this));
	TInt count =0;
	RDEBUG("0", 0);
	QT_TRAP_THROWING(count = refreshListL());
	for(TInt index = 0; index < count ; ++index)
		{
		// Populate the model with content
		std::auto_ptr<QStandardItem> certItem(q_check_ptr(new QStandardItem()));
		QString certificateLabel = certLabel(index);
		certItem->setData( certificateLabel, Qt::DisplayRole);
		model->appendRow(certItem.get());
		mSelectionIndex.Append(index);
		certItem.release();
		}

	// Set the model to the list view
	mListView->setModel(model);
	mListView->setSelectionMode(HbListView::MultiSelection);
	layout->addItem(mListView);

	std::auto_ptr<HbWidget> widget(q_check_ptr(new HbWidget()));
	widget->setLayout(layout.get());
	layout.release();
	mPopup->setContentWidget(widget.get());
	widget.release();
	RDEBUG("0", 0);
    mPopup->clearActions();
	mOkAction = q_check_ptr(new HbAction(tr("Yes")));
	mPopup->addAction(mOkAction);
	HbAction *noAction = q_check_ptr(new HbAction(tr("No")));
	mPopup->addAction(noAction);
	mPopup->setTimeout(HbPopup::NoTimeout);

	// Launch popup syncronously
	 mPopup->open(this, SLOT(handleMoveCertDialog(HbAction*)));
	 RDEBUG("0", 0);
}

void CpCertView::handleMoveCertDialog(HbAction* action)
{
	RDEBUG("0", 0);
	if(action == mOkAction)
		{
		QItemSelectionModel *selectionModel = mListView->selectionModel();
		QModelIndexList mWidgetItemsToRemove = selectionModel->selectedIndexes();
		TInt deleteCount = mWidgetItemsToRemove.count();
		// start deleting from end of array so that the indexes do not changes of the ones
		// at the front.
		RArray<TInt> actualIndex;
		RDEBUG("0", 0);
		QT_TRAP_THROWING
			(
			CleanupClosePushL(actualIndex);
			 for (TInt index = deleteCount-1; index>= 0 ; --index)
				 {
				 TInt selectedItemIndex = mWidgetItemsToRemove[index].row();
				 actualIndex.Append(mSelectionIndex[selectedItemIndex]);
				 }
			 moveCertList(actualIndex);
			 CleanupStack::PopAndDestroy(&actualIndex);
			 )
		}
	mListView->deleteLater();
	mListView = NULL;
	mSelectAllView->deleteLater();
	mSelectAllView = NULL;
	RDEBUG("0", 0);
	}

void CpCertView::selectAll()
	{
	RDEBUG("0", 0);
	if(mSelectAll == EFalse)
		{
		mListView->selectAll();
		mSelectAll= ETrue;
		}
	else
		{
		mListView->clearSelection();
		mSelectAll= EFalse;
		}
	}

void CpCertView::deleteCertsL( RArray<TInt>& indexList )
    {
    RDEBUG("0", 0);
    TInt count = indexList.Count();
    for(int index = 0;index <count;++index )
    	{
		mIndexList.Append(indexList[index]);
    	}

  	mNote = new HbMessageBox(HbMessageBox::MessageTypeQuestion);
	QString deleteMsg;
	QString sCount;
	if(count == 1)
		{
		deleteMsg = "Delete %1?";
		const CCTCertInfo* entry = certAt(indexList[0]);
		sCount = QString((QChar*)entry->Label().Ptr(),entry->Label().Length());
		}
	else
		{
		deleteMsg = "Delete %1 items?";
		sCount.setNum(count);
		}
	RDEBUG("0", 0);
	deleteMsg = deleteMsg.arg(sCount);
	mNote->setText(deleteMsg);
	mNote->setTimeout(HbPopup::NoTimeout);
	mNote->open(this,SLOT(handleDeleteDialog(HbAction*)));

}

void CpCertView::handleDeleteDialog(HbAction* action)
{
	RDEBUG("0", 0);
	TInt count = mIndexList.Count();

	if (action != mNote->primaryAction() || count == 0 )
		{
		return;
		}

    RPointerArray<CCTCertInfo> errCerts;
    QT_TRAP_THROWING(
    		CleanupClosePushL(errCerts);

		for(TInt index = 0; index < count; ++index)
			{
			const CCTCertInfo* entry = certAt(mIndexList[index]);

			if( mCertView == EPersonalView || mCertView == EAuthorityView )
				{
				mCertDataContainer->iWrapper->DeleteCertL(
							mCertDataContainer->CertManager(), *entry );
				}
			else if( mCertView == ETrustedView )
				{
				mCertDataContainer->iWrapper->DeleteCertL(
							mCertDataContainer->CertManager(),*entry, KCMTrustedServerTokenUid );
				}
			else if( mCertView == EDeviceView )
				{
				mCertDataContainer->iWrapper->DeleteCertL(
							mCertDataContainer->CertManager(), *entry, KCMDeviceCertStoreTokenUid );
				}
			errCerts.AppendL(entry);
			}
		RDEBUG("0", 0);
		if(errCerts.Count() > 0)
			{
			QString message("Unable to delete the following certificate: \n");
			TInt count = errCerts.Count();
			for(TInt index=0;index<count;++index)
				{
				const TDesC& certLabel = errCerts[index]->Label();
				QString certName = QString((QChar*)certLabel.Ptr(),certLabel.Length());
				message.append(certName).append("\n");
				}
			HbMessageBox::warning(message);
			}
		count = refreshListL();
		refreshView(count);

		CleanupStack::PopAndDestroy(&errCerts);
		) // QT_TRAP_THROWING

	delete mNote;
	mNote = NULL;
	RDEBUG("0", 0);
    }

const CCTCertInfo* CpCertView::certAt(TInt index) const
	{
	RDEBUG("0", 0);
	CCTCertInfo* currentCert = NULL;
	switch(mCertView)
		{
		case EAuthorityView:
			{
			currentCert = mCertDataContainer->iCALabelEntries[ index ]->iCAEntry;
			break;
			}
		case ETrustedView:
			{
			currentCert = mCertDataContainer->iPeerLabelEntries[ index ]->iPeerEntry;
			break;
			}
		case EDeviceView:
			{
			currentCert = mCertDataContainer->iDeviceLabelEntries[ index ]->iDeviceEntry;
			break;
			}
		case EPersonalView:
			{
			currentCert = mCertDataContainer->iUserLabelEntries[ index ]->iUserEntry;
			break;
			}
		};
	return currentCert;
	}

QString CpCertView::certLabel(TInt index) const
	{
	RDEBUG("0", 0);
	CpCertManUICertData* certData = NULL;
	HBufC* label = NULL;
	TInt length = 0;
	switch(mCertView)
		{
		case EAuthorityView:
			{
			certData = mCertDataContainer->iCALabelEntries[index];
			label = certData->iCAEntryLabel;
			length = certData->iCAEntryLabel->Length();
			break;
			}
		case ETrustedView:
			{
			certData = mCertDataContainer->iPeerLabelEntries[index];
			label = certData->iPeerEntryLabel;
			length = certData->iPeerEntryLabel->Length();
			break;
			}
		case EPersonalView:
			{
			certData = mCertDataContainer->iUserLabelEntries[index];
			label = certData->iUserEntryLabel;
			length = certData->iUserEntryLabel->Length();
			break;
			}
		case EDeviceView:
			{
			certData = mCertDataContainer->iDeviceLabelEntries[index];
			label = certData->iDeviceEntryLabel;
			length = certData->iDeviceEntryLabel->Length();
			break;
			}
		}
	return QString((QChar*)label->Des().Ptr(), length);
	}

TInt CpCertView::refreshListL()
	{
	RDEBUG("0", 0);
	TInt count = 0;
	switch(mCertView)
		{
		case EAuthorityView:
			mCertDataContainer->RefreshCAEntriesL();
			count = mCertDataContainer->iCALabelEntries.Count();
			break;
		case ETrustedView:
			mCertDataContainer->RefreshPeerCertEntriesL();
			count = mCertDataContainer->iPeerLabelEntries.Count();
			break;
		case EPersonalView:
			mCertDataContainer->RefreshUserCertEntriesL();
			count = mCertDataContainer->iUserLabelEntries.Count();
			break;
		case EDeviceView:
			mCertDataContainer->RefreshDeviceCertEntriesL();
			count = mCertDataContainer->iDeviceLabelEntries.Count();
			break;
		};
	return count;
	}


void CpCertView::refreshView( TInt count )
	{
	RDEBUG("0", 0);
	if(mRefreshedView)
		{
		mRefreshedView->deleteLater();
		mRefreshedView = NULL;
		}

	mRefreshedView = q_check_ptr(new CpBaseSettingView());
	switch(mCertView)
		{
		case EAuthorityView:
			{
			mRefreshedView->setTitle(hbTrId("txt_certificate_manager_list_authority_certificate"));
			break;
			}
		case ETrustedView:
			{
			mRefreshedView->setTitle(hbTrId("txt_certificate_manager_list_trusted_site_certific"));
			break;
			}
		case EPersonalView:
			{
			mRefreshedView->setTitle(hbTrId("txt_certificate_manager_list_personal_certificates"));
			break;
			}
		case EDeviceView:
			{
			mRefreshedView->setTitle(hbTrId("txt_certificate_manager_list_device_certificates"));
			break;
			}
		}

	HbMenu* menu = mRefreshedView->menu();
	RDEBUG("0", 0);
	std::auto_ptr<HbAction> endAction( q_check_ptr(new HbAction(hbTrId("txt_common_opt_delete"))) );
	connect(endAction.get(), SIGNAL(triggered()), this, SLOT(deleteList()));
	menu->addAction(endAction.get());
	endAction.release();

	QString title;
	if(mCertView == EPersonalView)
		{
		title = "Move to Device";
		}
	else if(mCertView == EDeviceView)
		{
		title = "Move to Personal";
		}
	std::auto_ptr<HbAction> moveAction(q_check_ptr(new HbAction(title)));
	connect(moveAction.get(), SIGNAL(triggered()), this, SLOT(moveCert()));
	menu->addAction(moveAction.get());
	moveAction.release();
	RDEBUG("0", 0);
	std::auto_ptr<QGraphicsLinearLayout> layout(q_check_ptr(new QGraphicsLinearLayout(Qt::Vertical)));

	HbListWidget* mCertificateList = q_check_ptr(new HbListWidget(this));

	for(int index = 0; index< count; index++)
		{
		QString certificateLabel = certLabel(index);
		std::auto_ptr<HbListWidgetItem> singleCert(q_check_ptr(new HbListWidgetItem()));
		singleCert->setText(certificateLabel);
		mCertificateList->addItem(singleCert.get());
		singleCert.release();
		}  // end of for loop

	connect(mCertificateList, SIGNAL(activated(QModelIndex)), this, SLOT(openCertFromList(QModelIndex)));
	connect(mCertificateList, SIGNAL(longPressed(HbAbstractViewItem*, QPointF )), this, SLOT(indicateLongPress(HbAbstractViewItem*, QPointF)));

	layout->addItem(mCertificateList);
	RDEBUG("0", 0);
	// Refresh current view
	QObject::connect(mRefreshedView , SIGNAL(aboutToClose()), this, SLOT(viewDone()));
	mPrevView = mainWindow()->currentView();
	mainWindow()->addView(mRefreshedView);
	mainWindow()->setCurrentView(mRefreshedView);
	mRefreshedView->setLayout(layout.get());
	layout.release();
	RDEBUG("0", 0);
	}


void CpCertView::viewDone()
	{
	RDEBUG("0", 0);
	mCurrentView = mainWindow()->currentView();
	mCurrentView->deleteLater();
	mCurrentView= NULL;
	mainWindow()->setCurrentView(mOriginalView);
	}
void CpCertView::showTrustSettings()
	{
	RDEBUG("0", 0);
	mCurrentView = q_check_ptr(new CpCertTrustView(mPos, *mCertDataContainer));
	connect(mCurrentView , SIGNAL(aboutToClose()), this, SLOT(saveTrustSettings()));
	mPrevView = mainWindow()->currentView();
	mainWindow()->addView(mCurrentView);
	mainWindow()->setCurrentView(mCurrentView);
	}

void CpCertView::saveTrustSettings()
	{
	((CpCertTrustView*)mCurrentView)->saveTrustSettings();
	displayPreviousView();
	}

void CpCertView::moveSelectedCert()
	{
	RDEBUG("0", 0);
	RArray<TInt> pos;
	pos.Append(mPos);
	moveCertList(pos);
	}

void CpCertView::moveCertList(RArray<TInt>& indexList)
	{
	RDEBUG("0", 0);
	mIndexList = indexList;
	mNote = new HbMessageBox(HbMessageBox::MessageTypeQuestion);
	mNote->setHeadingWidget(q_check_ptr(new HbLabel(hbTrId("txt_certificate_manager_info_move"))));
	if( mCertView == EPersonalView )
		{
		mNote->setText(hbTrId("txt_certificate_manager_info_device_certificates_c"));
		}
	else if( mCertView == EDeviceView )
		{
		mNote->setText("Use of Personal certificates may require user confirmation. Proceed?");
		}

	mNote->setTimeout(HbPopup::NoTimeout);
	mNote->setIconVisible (EFalse);
	mNote->open(this,SLOT(handleMoveDialog(HbAction*)));
	RDEBUG("0", 0);
}

void CpCertView::handleMoveDialog(HbAction* action)
{
	RDEBUG("0", 0);
	if (action != mNote->primaryAction())
	    {
		return;
	    }

	TInt count = mIndexList.Count();

	for(TInt index = 0 ; index < count; ++index)
		{
		CCTCertInfo* entry = NULL;
		if(mCertView == EPersonalView)
			{
			entry = mCertDataContainer->iUserLabelEntries[ mIndexList[index] ]->iUserEntry;
			}
		else if(mCertView == EDeviceView)
			{
			entry = mCertDataContainer->iDeviceLabelEntries[ mIndexList[index] ]->iDeviceEntry;
			}

		// Move key first
		TCTKeyAttributeFilter keyFilter;
		keyFilter.iKeyId = entry->SubjectKeyId();
		keyFilter.iPolicyFilter =  TCTKeyAttributeFilter::EAllKeys;
		RDEBUG("0", 0);
		TUid sourceCertStoreUid = TUid::Uid(0);
		TUid targetCertStoreUid = TUid::Uid(0);
		TUid sourceKeyStoreUid = TUid::Uid(0);
		TUid targetKeyStoreUid = TUid::Uid(0);

		if(mCertView == EPersonalView)
			{
			sourceKeyStoreUid = KCMFileKeyStoreTokenUid;
			targetKeyStoreUid = KCMDeviceKeyStoreTokenUid;
			sourceCertStoreUid = KCMFileCertStoreTokenUid;
			targetCertStoreUid = KCMDeviceCertStoreTokenUid;
			}
		else if(mCertView == EDeviceView)
			{
			sourceKeyStoreUid = KCMDeviceKeyStoreTokenUid;
			targetKeyStoreUid = KCMFileKeyStoreTokenUid;
			sourceCertStoreUid = KCMDeviceCertStoreTokenUid;
			targetCertStoreUid = KCMFileCertStoreTokenUid;
			}
		RDEBUG("0", 0);
		try
			{

			QT_TRAP_THROWING( mCertDataContainer->iWrapper->MoveKeyL(
					mCertDataContainer->KeyManager(), keyFilter, sourceKeyStoreUid, targetKeyStoreUid ));

			// Move certificate
			QT_TRAP_THROWING( mCertDataContainer->iWrapper->MoveCertL(
					mCertDataContainer->CertManager(), *entry, sourceCertStoreUid, targetCertStoreUid ) );

			}
		catch(const std::exception& exception)
			{
			QString error(exception.what());
			QT_TRAP_THROWING(mCertDataContainer->ShowErrorNoteL( error.toInt() ));
			User::Exit( KErrNone );
			}
		RDEBUG("0", 0);
		try
			{
			if(mCertView == EPersonalView)
				{
				QT_TRAP_THROWING( mCertDataContainer->RefreshUserCertEntriesL() );
				}
			else if(mCertView == EDeviceView)
				{
				QT_TRAP_THROWING( mCertDataContainer->RefreshDeviceCertEntriesL() );
				}
			}
		catch(const std::exception& exception)
			{
			QString error(exception.what());
			if (  error.toInt() == KErrCorrupt )
				{
				QT_TRAP_THROWING(mCertDataContainer->ShowErrorNoteL( error.toInt()) );
				User::Exit( KErrNone );
				}
			// have to call straight away the Exit
			// showing any error notes would corrupt the display
			User::Exit( error.toInt() );
			}
		} // for
	// Refresh current view
	QT_TRAP_THROWING(refreshView(refreshListL()));
	delete mNote;
	mNote = NULL;
	RDEBUG("0", 0);
	}