cpsecplugins/cpadvancedsecplugin/src/cpmoduleview.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 16:04:40 +0300
branchRCL_3
changeset 21 09b1ac925e3f
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
* 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 <mctauthobject.h>
#include <mctkeystore.h>

#include <qstringlist.h>
#include <qgraphicslinearlayout.h>

#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 <hbmessagebox.h>
#include <hblistwidget.h>
#include <hblistwidgetitem.h>
#include <hbgroupbox.h>
#include <hbpushbutton.h>
#include <hbdataform.h>
#include <hbdataformmodel.h>
#include <hbdataformmodelitem.h>
#include <hbmainwindow.h>
#include <hbabstractviewitem.h>

#include <memory>
#include <../../inc/cpsecplugins.h>
#include "cpmoduleview.h"
#include "cpsecmodmodel.h"
#include "cpsecmodview.h"

CpModuleView::CpModuleView( CpSecModView::TSecModViews currentView, 
							CSecModUIModel& secModUIModel,
							QGraphicsItem *parent /*= 0*/ )
: CpBaseSettingView(0,parent),
  mCurrentView(currentView),
  mSecModUIModel(secModUIModel)
	{
	RDEBUG("0", 0);
	QString title = mSecModUIModel.TokenLabelForTitle();
	setTitle(title);
	
	mContextMenu = (q_check_ptr(new HbMenu()));
	
	if(currentView == CpSecModView::EAccessView)
		{	
		showAccessView();
		}
	else if(currentView == CpSecModView::ESignatureView)
		{
		showSignatureView(ETrue);
		}
	}

CpModuleView::~CpModuleView()
	{}

void CpModuleView::showAccessView()
	{
	RDEBUG("0", 0);
	HbMenu* menu = this->menu();   
	std::auto_ptr<HbAction> endAction(q_check_ptr(new HbAction("Module Info")));     
	connect(endAction.get(), SIGNAL(triggered()), this, SLOT(saveProv()));    

	menu->addAction(endAction.get());
	endAction.release();
	
	std::auto_ptr<QGraphicsLinearLayout> layout(q_check_ptr(new QGraphicsLinearLayout(Qt::Vertical)));
	
	std::auto_ptr<HbDataForm> form(q_check_ptr(new HbDataForm()));
	std::auto_ptr<HbDataFormModel> formModel(q_check_ptr(new HbDataFormModel()));
	form->setModel(formModel.get());
	formModel.release();
	
	QString titleName;
	if (mSecModUIModel.KeyStoreUID() == KTokenTypeFileKeystore)
		{
		titleName = "Phone key store code";
		}
	else
		{
		const TDesC& label = mSecModUIModel.AuthObj(KPinGSettIndex).Label();
		titleName = QString((QChar*)label.Ptr(), label.Length());
		}
	RDEBUG("0", 0);
	HbListWidget* accessDetails = q_check_ptr(new HbListWidget(this)); 
	
	std::auto_ptr<HbListWidgetItem> codeLabel(q_check_ptr(new HbListWidgetItem()));
	codeLabel->setText(titleName);
	accessDetails->addItem(codeLabel.get());
	codeLabel.release();

	std::auto_ptr<HbListWidgetItem> codeText(q_check_ptr(new HbListWidgetItem()));
	codeText->setText("****");
	accessDetails->addItem(codeText.get());
	codeText.release();

	std::auto_ptr<HbListWidgetItem> requestLabel(q_check_ptr(new HbListWidgetItem()));
	requestLabel->setText("Access Code Request");
	accessDetails->addItem(requestLabel.get());
	requestLabel.release();

	TUint32 status = mSecModUIModel.AuthStatus(KPinGSettIndex);
	std::auto_ptr<HbListWidgetItem> requestText(q_check_ptr(new HbListWidgetItem()));
	requestText->setText("Off");
	if (status & EEnabled)
		{
		requestText->setText("On");
		}	
	accessDetails->addItem(requestText.get());
	requestText.release();
	RDEBUG("0", 0);
	std::auto_ptr<HbListWidgetItem> statusLabel(q_check_ptr(new HbListWidgetItem()));
	statusLabel->setText("Status");
	accessDetails->addItem(statusLabel.get());
	statusLabel.release();
	
	std::auto_ptr<HbListWidgetItem> statusText(q_check_ptr(new HbListWidgetItem()));
	QString pinStatus = mSecModUIModel.PINStatus(KPinGSettIndex, ETrue);
	statusText->setText(pinStatus);
	accessDetails->addItem(statusText.get());
	statusText.release();

	connect(accessDetails, SIGNAL(longPressed(HbAbstractViewItem*, QPointF )), this, SLOT(indicateLongPress(HbAbstractViewItem*, QPointF)));
	connect(formModel.get(), SIGNAL(activated(QModelIndex)), this, SLOT(handleAccessView(QModelIndex)));
	
	layout->addItem(accessDetails);	
	layout->addItem(form.get());
	form.release();
	setLayout(layout.get());
	layout.release();
	RDEBUG("0", 0);
	}

void CpModuleView::showSignatureView(TBool showBlockedNote)
	{
	RDEBUG("0", 0);
	mCurrentView = CpSecModView::ESignatureView;
	std::auto_ptr<QGraphicsLinearLayout> layout(q_check_ptr(new QGraphicsLinearLayout(Qt::Vertical)));
	std::auto_ptr<HbDataForm> form(q_check_ptr(new HbDataForm()));
	std::auto_ptr<HbDataFormModel> formModel(q_check_ptr(new HbDataFormModel()));
		
	QVector< QPair<QString, TUint32> > authDetails = mSecModUIModel.AuthDetails();
	QVectorIterator< QPair<QString, TUint32> > authDetailsIter(authDetails);
	
	HbListWidget* accessDetails = q_check_ptr(new HbListWidget(this)); 
		
	while(authDetailsIter.hasNext())
		{
		QPair<QString, TUint32> pair = authDetailsIter.next();
		QString label = pair.first;
		TUint32 status = pair.second;
		QString blockedDetails = NULL;
		if ( status & EAuthObjectBlocked)
			{
			if (showBlockedNote)
				{
				QString totalBlocked(" is blocked. PUK code is needed to unblock the code");
				if (status & EUnblockDisabled)
					{
					totalBlocked =  " totalblocked, contact your module vendor.";
					}
				totalBlocked.prepend(label);
				HbMessageBox::information(totalBlocked);
				}
			blockedDetails = label.append(" Blocked");
		RDEBUG("0", 0);
		std::auto_ptr<HbListWidgetItem> statusLabel(q_check_ptr(new HbListWidgetItem()));
		statusLabel->setText(tr("Status"));
		accessDetails->addItem(statusLabel.get());
		statusLabel.release();

		std::auto_ptr<HbListWidgetItem> statusText(q_check_ptr(new HbListWidgetItem()));
		QString pinStatus = mSecModUIModel.PINStatus(KPinNrSettIndex, ETrue);
		statusText->setText(pinStatus);
		accessDetails->addItem(statusText.get());
		statusText.release();
		}
		else
			{
			std::auto_ptr<HbListWidgetItem> unblockedLabel(q_check_ptr(new HbListWidgetItem()));
			unblockedLabel->setText(label);
			accessDetails->addItem(unblockedLabel.get());
			unblockedLabel.release();
			
			std::auto_ptr<HbListWidgetItem> unblockedText(q_check_ptr(new HbListWidgetItem()));
			unblockedText->setText("****");
			accessDetails->addItem(unblockedText.get());
			unblockedText.release();
			}
		}
	form->setModel(formModel.get());
	formModel.release();
	layout->addItem(accessDetails);
	
	connect(accessDetails, SIGNAL(longPressed(HbAbstractViewItem*, QPointF )), this, SLOT(indicateLongPress(HbAbstractViewItem*, QPointF)));
	connect(formModel.get(), SIGNAL(activated(QModelIndex)), this, SLOT(handleSigView()));
		
	layout->addItem(form.get());
	form.release();
	setLayout(layout.get());
	layout.release();
	RDEBUG("0", 0);
	}

void CpModuleView::indicateLongPress(HbAbstractViewItem *item,QPointF coords)
	{
	RDEBUG("0", 0);
	try
		{
		mContextMenu->clearActions();
		mPos = item->modelIndex().row();   
		
		if(mCurrentView == CpSecModView::EAccessView)
			{
			if( mPos == EIndexCodeLabel && mSecModUIModel.PinChangeable(KPinGSettIndex)
				|| mPos == EIndexCodeRequest && mSecModUIModel.PinRequestChangeable(KPinGSettIndex)
				|| mPos == EIndexCodeStatus )
				{
				std::auto_ptr<HbAction> changePIN(q_check_ptr(new HbAction("Change")));     
				connect(changePIN.get(), SIGNAL(triggered()), this, SLOT( handleAccessView()));    
				mContextMenu->addAction(changePIN.get());
				changePIN.release();
				}
			if( mSecModUIModel.PinUnblockable(KPinGSettIndex) )
				{
				std::auto_ptr<HbAction> unblockPIN(q_check_ptr(new HbAction("Unblock")));     
				connect(unblockPIN.get(), SIGNAL(triggered()), this, SLOT( handleAccessView()));    
				mContextMenu->addAction(unblockPIN.get());
				unblockPIN.release();
				}
			if( mSecModUIModel.PinOpen(KPinGSettIndex) )
				{
				std::auto_ptr<HbAction> closePIN(q_check_ptr(new HbAction("Close")));     
				connect(closePIN.get(), SIGNAL(triggered()), this, SLOT( handleAccessView()));    
				mContextMenu->addAction(closePIN.get());
				closePIN.release();
				}
			}
		else if(mCurrentView == CpSecModView::ESignatureView)
			{
			if (mSecModUIModel.PinChangeable(KPinNrSettIndex))
				{
				std::auto_ptr<HbAction> changePIN(q_check_ptr(new HbAction("Change")));     
				connect(changePIN.get(), SIGNAL(triggered()), this, SLOT( handleSigViewCommand()));    
				mContextMenu->addAction(changePIN.get());
				changePIN.release();
				}
			if (mSecModUIModel.PinUnblockable(KPinNrSettIndex))
				{
				std::auto_ptr<HbAction> unblockPIN(q_check_ptr(new HbAction("Unblock")));     
				connect(unblockPIN.get(), SIGNAL(triggered()), this, SLOT( handleSigViewCommand()));    
				mContextMenu->addAction(unblockPIN.get());
				unblockPIN.release();
				}
			}
				
		mContextMenu->setPreferredPos(coords);
		mContextMenu->open();
		}
	catch(const std::exception& exception)
		{
		HbMessageBox::information(exception.what());
		}
	RDEBUG("0", 0);
	}

void CpModuleView::handleAccessView( const QModelIndex& modelIndex )
	{
	RDEBUG("0", 0);
	try
		{
		mPos = modelIndex.row();
		handleAccessView();
		}
	catch(const std::exception& exception)
		{
		HbMessageBox::information(exception.what());
		}
	}

void CpModuleView::handleAccessView()
	{
	RDEBUG("0", 0);
	try
		{
		if(mPos == EIndexCodeLabel)
			{
			QT_TRAP_THROWING(mSecModUIModel.ChangeOrUnblockPinL(KPinGSettIndex));        
			}
		else if(mPos == EIndexCodeRequest)
			{
			if (KErrCancel == mSecModUIModel.ChangeCodeRequest(KPinGSettIndex))
				{
				return;
				}
			}
		else if ( mPos == EIndexCodeStatus)
			{
			QT_TRAP_THROWING(mSecModUIModel.CloseAuthObjL(KPinGSettIndex)); 
			}
		showAccessView();
		}
	catch(const std::exception& exception)
		{
		HbMessageBox::information(exception.what());
		}
	}

void CpModuleView::handleSigView()
	{
	RDEBUG("0", 0);
	try
		{
		QT_TRAP_THROWING(mSecModUIModel.ChangeOrUnblockPinL(KPinNrSettIndex));
		showSignatureView(EFalse);
		}
	catch(const std::exception& exception)
		{
		HbMessageBox::information(exception.what());
		}
	}

void CpModuleView::handleSigViewCommand()
	{
	RDEBUG("0", 0);
	try
		{
		switch(mPos)
			{
			case ESecModUICmdChange:
				QT_TRAP_THROWING(mSecModUIModel.ChangePinNrL(mPos));
				showSignatureView(EFalse);
				break;
			case ESecModUICmdUnblock:
				QT_TRAP_THROWING(mSecModUIModel.UnblockPinNrL(mPos));
				showSignatureView(EFalse);
				break;
			};
		}
	catch(const std::exception& exception)
		{
		HbMessageBox::information(exception.what());
		}
	}