diff -r 00f9ee97d895 -r f05641c183ff cbsatplugin/atmisccmdplugin/src/cpincommandhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/src/cpincommandhandler.cpp Mon May 03 12:40:50 2010 +0300 @@ -0,0 +1,216 @@ +// 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: +// This file contains the implementation of the AT+CPIN command +// +// + +#include "cpincommandhandler.h" + +#include // define AO wrapper +#include // Additional RMobilePhone error code + +#include "debug.h" + +CCPINCommandHandler* CCPINCommandHandler::NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) + { + TRACE_FUNC_ENTRY + CCPINCommandHandler* self = new (ELeave) CCPINCommandHandler(aCallback, aATCmdParser, aPhone); + TRACE_FUNC_EXIT + return self; + } + +CCPINCommandHandler::CCPINCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) : + CATCmdAsyncBase(aCallback, aATCmdParser, aPhone), + iLockInfoPckg(iLockInfo) + { + TRACE_FUNC_ENTRY + TRACE_FUNC_EXIT + } + +CCPINCommandHandler::~CCPINCommandHandler() + { + TRACE_FUNC_ENTRY + Cancel(); + TRACE_FUNC_EXIT + } + +void CCPINCommandHandler::HandleCommand(const TDesC8& /*aCmd*/, + RBuf8& /*aReply*/, + TBool /*aReplyNeeded*/) + { + TRACE_FUNC_ENTRY + + switch (iATCmdParser.CommandHandlerType()) + { + case (TAtCommandParser::ECmdHandlerTypeTest): + // AT+CPIN=? - simply return OK. + { + iCallback->CreateReplyAndComplete( EReplyTypeOk); + break; + } + + case(TAtCommandParser::ECmdHandlerTypeRead): + // AT+CPIN? - Get PIN require status. return +CPIN: READY/SIM PUK + case (TAtCommandParser::ECmdHandlerTypeSet): + // AT+CPIN="puk","pin" - Change password when PUK is required. + { + // call GetLockInfo to check if PUK is required + iPhone.GetLockInfo(iStatus, RMobilePhone::ELockICC, iLockInfoPckg); + iPendingEvent = EMobilePhoneGetLockInfo; + SetActive(); + break; + } + default: + { + // unsupported command + iCallback->CreateReplyAndComplete(EReplyTypeError); + break; + } + } + + TRACE_FUNC_EXIT + } + +void CCPINCommandHandler::HandleCommandCancel() + { + TRACE_FUNC_ENTRY + Cancel(); + TRACE_FUNC_EXIT + } + +void CCPINCommandHandler::ChangePassword() + { + TRACE_FUNC_ENTRY + TRequestStatus status; + + // Get parameters from AT command + TInt ret1; + TInt ret2; + TPtrC8 pukCode8 = iATCmdParser.NextTextParam(ret1); + TPtrC8 pinCode8 = iATCmdParser.NextTextParam(ret2); + if(ret1 != KErrNone || ret2 != KErrNone + || iATCmdParser.NextParam().Compare(KNullDesC8) != 0) + { + iCallback->CreateReplyAndComplete( EReplyTypeError); + TRACE_FUNC_EXIT + return; + } + + RMobilePhone::TMobilePassword pukCode; + RMobilePhone::TMobilePassword pinCode; + pukCode.Copy(pukCode8); + pinCode.Copy(pinCode8); + iPhone.VerifySecurityCode(iStatus, RMobilePhone::ESecurityCodePuk1, pinCode, pukCode); + // re-use the AO for VerifySecurityCode + iPendingEvent = EMobilePhoneVerifySecurityCode; + SetActive(); + + TRACE_FUNC_EXIT + return; + } + +void CCPINCommandHandler::RunL() + { + TRACE_FUNC_ENTRY + + if( iPendingEvent == EMobilePhoneGetLockInfo) + { // after calling GetLockInfo + HandleGetLockInfo(); + } + else + { // after calling VerifySecurityCode + ASSERT(iPendingEvent == EMobilePhoneVerifySecurityCode); + HandleVerifySecurityCode(); + } + TRACE_FUNC_EXIT + } + +void CCPINCommandHandler::HandleGetLockInfo() + { + TRACE_FUNC_ENTRY + TAtCommandParser::TCommandHandlerType handleType = iATCmdParser.CommandHandlerType(); + + switch(iStatus.Int()) + { + case KErrNone: + { + // log lock info + _LIT8(KDbgPhoneLockInfo, "GetLockInfo: Status %d, Lock %d, Setting %d"); + Trace(KDbgPhoneLockInfo, iStatus.Int(), iLockInfo.iStatus, iLockInfo.iSetting); + + if(handleType == TAtCommandParser::ECmdHandlerTypeRead ) + { + // complete without error + _LIT8(KCPINReady, "\r\n+CPIN: READY\r\n\r\nOK\r\n"); + iCallback->CreateReplyAndComplete( EReplyTypeOther, KCPINReady); + } + else + { + ASSERT( handleType== TAtCommandParser::ECmdHandlerTypeSet ); + // PUK/PIN is not required + iCallback->CreateCMEReplyAndComplete(KErrGsm0707OperationNotAllowed); + } + break; + } + case KErrAccessDenied: + { + if(handleType == TAtCommandParser::ECmdHandlerTypeRead ) + { + // reply PUK is required + _LIT8(KCPINSimPuk, "\r\n+CPIN: SIM PUK\r\n\r\nOK\r\n"); + iCallback->CreateReplyAndComplete( EReplyTypeOther, KCPINSimPuk); + } + else + + { + // change PIN with a PUK code + ChangePassword(); + } + break; + } + default: + { + // any other errors, such as KErrGeneral when SIM card is not available + Trace(KDebugPrintD, "Complete CPIN with error ", iStatus.Int()); + iCallback->CreateReplyAndComplete( EReplyTypeError ); + break; + } + } + TRACE_FUNC_EXIT + } + +void CCPINCommandHandler::HandleVerifySecurityCode() + { + TRACE_FUNC_ENTRY + + // check error after change PUK + if (iStatus.Int() == KErrNone) + { // complete without error + iCallback->CreateReplyAndComplete( EReplyTypeOk ); + } + else + { // if there is an error + iCallback->CreateCMEReplyAndComplete(iStatus.Int()); + } + + TRACE_FUNC_EXIT + } + +void CCPINCommandHandler::DoCancel() + { + TRACE_FUNC_ENTRY + iPhone.CancelAsyncRequest(iPendingEvent); + TRACE_FUNC_EXIT + } +