diff -r 000000000000 -r 2f259fa3e83a uifw/AknGlobalUI/AknCapServer/src/AknMemoryCardDialogImpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AknGlobalUI/AknCapServer/src/AknMemoryCardDialogImpl.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,276 @@ +/* +* Copyright (c) 2002-2007 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 +#include +#include +#include +#include +#include "AknCapServerEntry.h" +#include "AknCapServerDefs.h" +#include "AknMemoryCardDialogImpl.h" + +class CAknCodeQuery: public CAknTextQueryDialog + { +public: + CAknCodeQuery( + TDes& aDataText, + const CAknTextQueryDialog::TTone& aTone = CAknTextQueryDialog::ENoTone); + + TBool OkToExitL(TInt aButtonId); + void TryExit(TInt aButtonId); + void SetObserver(CAknCodeQuery** aSelf, CAknMMCPasswordRequester* aObserver ); + ~CAknCodeQuery(){}; + +private: + CAknMMCPasswordRequester* iObserver; + CAknCodeQuery** iSelf; + }; + +CAknMMCPasswordRequester::CAknMMCPasswordRequester() + { + } + +CAknMMCPasswordRequester* CAknMMCPasswordRequester::NewL() + { + CAknMMCPasswordRequester* self = new (ELeave) CAknMMCPasswordRequester(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); //self + return self; + } + +void CAknMMCPasswordRequester::ConstructL() + { + iResFileLdr.AddResourceFileL(); + } + +CAknMMCPasswordRequester::~CAknMMCPasswordRequester() + { + if (iQuery) + { + delete iQuery; + CompleteAllMessages(KErrDied); + } + + iResFileLdr.DeleteResourceFile(); + + delete iPrompt; + iPrompt = NULL; + + iMessages.Close(); + } + +void CAknMMCPasswordRequester::ClientExit( TInt aClientID, TBool aCompleteWithCancel ) + { + for(TInt i = iMessages.Count()-1; i >= 0; i--) + { + if (iMessages[i].iClientId == aClientID) + { + if (aCompleteWithCancel) + { + iMessages[i].iMessage.Complete(KErrCancel); + } + iMessages.Remove(i); + break; + } + } + } + +void CAknMMCPasswordRequester::CompleteAllMessages(TInt aReason) + { + for(TInt i = iMessages.Count()-1; i >= 0; i--) + { + iMessages[i].iMessage.Complete(aReason); + iMessages.Remove(i); + } + } + +void CAknMMCPasswordRequester::AppendQueueItemL(const RMessagePtr2& aMessage, TInt aClientID) + { + if (!aClientID) + { + // recursive call for start (there must be active message before this can occur) + __ASSERT_ALWAYS(iMessages.Count(), User::Invariant()); + return; + } + for(TInt i = iMessages.Count()-1; i >= 0; i--) + { + if (iMessages[i].iClientId == aClientID) + { + User::Leave(KErrAlreadyExists); + } + } + User::LeaveIfError(iMessages.Append(TMessageWithClientId(aMessage, aClientID))); + } + +void CAknMMCPasswordRequester::StartL(TInt aDrive, TBool aStore, const RMessagePtr2& aMessage, + TInt aClientID) + { + // Will leave if same client tries to activate new request while old pending, basically should + // panic the client. + AppendQueueItemL(aMessage, aClientID); + + if (iQuery) + { + return; + } + + iStore = aStore; + iDriveNumber = aDrive; + + SetPromptL(); + + iPassWd.FillZ(); // this is safe as we are derived from + // CBase and this is done for every unlock operation + iPassWd.Zero(); + + iQuery = new (ELeave) CAknCodeQuery(iPassWd); + iQuery->PrepareLC(R_MMC_PASSWORD_QUERY); + iQuery->SetObserver(&iQuery,this); + + if (iPrompt) + { + iQuery->SetPromptL(*iPrompt); + } + + CAknKeySoundSystem* sounds = iAvkonAppUi->KeySounds(); + // we are assuming that there is no need to bring sounds forwards more than once per operation + if (iNumberOfAttempts == 0 && sounds ) + { + sounds->BringToForeground(); + } + + iQuery->PublishDialogL(EAknMemoryCardQuery); + iQuery->RunLD(); + // block apps key after it is sure that OkToExitL will be called for query + ((CAknCapAppServerAppUi*)iAvkonAppUi)->SuppressAppSwitchingL(EAknAppsKeyBlockAddCount, 0); + } + +void CAknMMCPasswordRequester::Cancel(TInt aClientID) + { + if ( iQuery ) + { + if (iMessages.Count() == 1) + { + iQuery->TryExit( EEikBidCancel ); // completes the message + } + else + { + ClientExit(aClientID, ETrue ); + } + } + } + +void CAknMMCPasswordRequester::SetPromptL() + { + delete iPrompt; + iPrompt = NULL; + + if ( iNumberOfAttempts > 0 ) + { + iPrompt = StringLoader::LoadL(R_QTN_MEM_CARD_UNLOCK_ERROR); + } + else + { + iPrompt = StringLoader::LoadL(R_QTN_MEM_CARD_UNLOCK_PROMPT); + } + } + +void CAknMMCPasswordRequester::UnlockCard(TBool aAccept) + { + if ( aAccept ) + { + TMediaPassword p; + p.FillZ(KMaxMediaPassword); // not sure if fileserver uses buffer length correctly + p.Zero(); + + const TUint8 *pt8Src = reinterpret_cast(iPassWd.Ptr()); + // We use this to check whether there is something else than zeros in ttext8 array left + const TUint16 *pt16Src = iPassWd.Ptr(); + + for (TInt j = 0; j < KMaxMediaPassword / 2 && pt16Src[j]; ++j) + { + p.Append(pt8Src[j << 1]); + p.Append(pt8Src[(j << 1) + 1]); + } + + iNumberOfAttempts++; + TInt err = CCoeEnv::Static()->FsSession().UnlockDrive(iDriveNumber,p,ETrue); +#ifdef _DEBUG + RDebug::Print(_L("CAknMMCPasswordRequester::Ulock ret: %D"),err); +#endif + if (err == KErrNone || err == KErrAlreadyExists) + { + CompleteAllMessages(KErrNone); + iNumberOfAttempts = 0; + } + else + { + // borrow top most message, it is not used anyway + TRAPD (err, StartL(iDriveNumber,iStore,iMessages[0].iMessage)); + if (err) + { + CompleteAllMessages(err); // To ensure that old instance of query will be deleted. + } + iNumberOfAttempts = 0; + return; + } + } + else // user or system cancel + { + CompleteAllMessages(KErrCancel); + iNumberOfAttempts = 0; + } + } + +CAknCodeQuery::CAknCodeQuery(TDes& aDataText, const CAknTextQueryDialog::TTone& aTone) + :CAknTextQueryDialog(aDataText, aTone) + { + } + +TBool CAknCodeQuery::OkToExitL(TInt aButtonId) + { + TBool result = (aButtonId == EAknSoftkeyOk||aButtonId == EEikBidOk); + + if ( result ) + { + CAknQueryControl* control = QueryControl(); + if (control) + { + control->GetText(iDataText); + } + } + (*iSelf) = 0; + + iObserver->UnlockCard( result ); // synch, ie. query will be deleted after this returns ! + ((CAknCapAppServerAppUi*)iAvkonAppUi)->SuppressAppSwitchingL(EAknAppsKeyBlockDecreaseCount, 0); + return ETrue; + } + +void CAknCodeQuery::SetObserver(CAknCodeQuery** aSelf, CAknMMCPasswordRequester* aObserver ) + { + iObserver = aObserver; + iSelf = aSelf; + } + +void CAknCodeQuery::TryExit(TInt aButtonId) + { + TRAP_IGNORE( TryExitL(aButtonId)); + } + +// End of file