uifw/AknGlobalUI/AknCapServer/src/AknMemoryCardDialogImpl.cpp
changeset 0 2f259fa3e83a
child 6 9f56a4e1b8ab
--- /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 <AknQueryDialog.h>
+#include <aknmemorycardui.rsg>
+#include <StringLoader.h>
+#include <aknsoundsystem.h>
+#include <SecondaryDisplay/AknSecondaryDisplayDefs.h>
+#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<const TUint8 *>(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