usbuis/usbuinotif/src/usbuinqueriesnotifiermdrv.cpp
branchRCL_3
changeset 24 e02eb84a14d2
parent 23 25fce757be94
--- a/usbuis/usbuinotif/src/usbuinqueriesnotifiermdrv.cpp	Tue Aug 31 16:13:57 2010 +0300
+++ b/usbuis/usbuinotif/src/usbuinqueriesnotifiermdrv.cpp	Wed Sep 01 12:20:49 2010 +0100
@@ -16,10 +16,17 @@
  */
 
 // INCLUDE FILES
+#include <eikenv.h>          // Eikon environment
+#include <bautils.h>         // BAFL utils (for language file)
+#include <utf.h>             // Unicode character conversion utilities
+#include <StringLoader.h>    // Localisation stringloader
+#include <AknQueryDialog.h> 
+#include <aknnotewrappers.h>
 
-#include <hb/hbwidgets/hbdevicemessageboxsymbian.h>
-#include <hb/hbcore/hbtextresolversymbian.h>
 #include <usbuinotif.h>                     // pck
+#include <usbuinotif.rsg>                   // Own resources
+#include <secondarydisplay/usbuinotifsecondarydisplay.h>     // Dialog index for cover UI
+
 #include "usbuinqueriesnotifiermdrv.h"      // Own class definition
 #include "usbuinotifdebug.h"                // Debugging macros
 
@@ -78,21 +85,49 @@
     return iInfo;
     }
 
+// ----------------------------------------------------------------------------
+// CUSBUIQueriesNotifier::StartL
+// Synchronic notifier launch. 
+// ----------------------------------------------------------------------------
+//
+TPtrC8 CUSBUIQueriesNotifier::StartL(const TDesC8& aBuffer)
+    {
+    FLOG(_L("[USBUINOTIF]\t CUSBUIQueriesNotifier::StartL()"));
+
+    TUSBQueriesNotiferParams params; //stores parameters from aBuffef
+    TPckgC<TUSBQueriesNotiferParams> pckg( params );
+    pckg.Set( aBuffer );
+    // Save the type of the query for later use (dialog selection)
+    //
+
+    if (pckg().iQuery == EUSBNoMemoryCard)
+        {
+        TRAPD( err, GetParamsL( aBuffer, 0, iMessage ));
+        if (err)
+            {
+            iNeedToCompleteMessage = EFalse;
+            User::Leave( err );
+            }
+        }
+
+    TPtrC8 ret( KNullDesC8 );
+    FLOG(_L("[USBUINOTIF]\t CUSBUIQueriesNotifier::StartL() completed"));
+    return (ret);
+    }
 
 // ----------------------------------------------------------------------------
 // CUSBUIQueriesNotifier::GetParamsL
+//  Jump to RunL as soon as possible.
 // ----------------------------------------------------------------------------
 //
-void CUSBUIQueriesNotifier::StartDialogL(const TDesC8& aBuffer,
+void CUSBUIQueriesNotifier::GetParamsL(const TDesC8& aBuffer,
         TInt aReplySlot, const RMessagePtr2& aMessage)
     {
-    FLOG(_L("[USBUINOTIF]\t  CUSBUIQueriesNotifier::StartDialogL"));
-    if ( iReplySlot != 0 || iNeedToCompleteMessage)
+    FLOG(_L("[USBUINOTIF]\t CUSBUIQueriesNotifier::GetParamsL"));
+    if (iUSBQueryDlg || iReplySlot != 0 || iNeedToCompleteMessage)
         {
         User::Leave( KErrInUse );
         }
-        
-    InitializeTextResolver();
 
     iMessage = aMessage;
     iNeedToCompleteMessage = ETrue;
@@ -106,54 +141,59 @@
     // Save the type of the query for later use (dialog selection)
     //
     iQueryType = pckg().iQuery;
-         
-    if (iUSBQueryDlg)
+    if (iQueryType == EUSBNoMemoryCard)
         {
-        delete iUSBQueryDlg;
-        iUSBQueryDlg = NULL;
+        iNeedToCompleteMessage = EFalse;
         }
-    iUSBQueryDlg = CHbDeviceMessageBoxSymbian::NewL(
-                       CHbDeviceMessageBoxSymbian::EWarning, this);
-    iUSBQueryDlg->SetTimeout(0);
-    HBufC* stringHolder = NULL;
-    switch (iQueryType)
-            {
-            case EUSBStorageMediaFailure:
-                {
-                _LIT(KMassStorageFail, "txt_usb_info_unable_to_show_a_memory_to_other_devi");
-                stringHolder = HbTextResolverSymbian::LoadLC( KMassStorageFail );
-                 break;
-                }
-            case EUSBDiskFull:
-                {
-                _LIT(KDiskFull, "txt_usb_info_disk_full_remove_some_files_and_try");
-                stringHolder = HbTextResolverSymbian::LoadLC( KDiskFull );
-		         break;
-                }
-            case EUSBNotEnoughRam:
-                {
-                _LIT(KNotEnoughMemory, "txt_usb_info_memory_full_close_some_applications");
-                 stringHolder = HbTextResolverSymbian::LoadLC( KNotEnoughMemory );
-                 break;
-                }
-            default:
-                {
-                FTRACE( FPrint( _L( "[USBUINOTIF]\t CUSBUIQueriesNotifier::ERROR! Unknown query type: %d" ),iQueryType ) );
-                }
-            }
-   
-    if (stringHolder)
+    // Call SetActive() so RunL() will be called by the active scheduler
+    //
+    SetActive();
+    iStatus = KRequestPending;
+    TRequestStatus* stat = &iStatus;
+    User::RequestComplete( stat, KErrNone );
+    FLOG(_L("[USBUINOTIF]\t CUSBUIQueriesNotifier::GetParamsL() completed"));
+    }
+
+// ----------------------------------------------------------------------------
+// CUSBUIQueriesNotifier::RunL
+// Ask user response and return it to caller.
+// ----------------------------------------------------------------------------
+//
+void CUSBUIQueriesNotifier::RunL()
+    {
+    FLOG(_L("[USBUINOTIF]\t CUSBUIQueriesNotifier::RunL"));
+
+    TBool isCancelKey = EFalse;
+    TBool isErrorQuery = EFalse;
+    TInt returnValue = KErrNone;
+    // for cover display support
+    TInt coverDialogId = EUSBCoverInvalidDialogId;
+
+    // Choose text and other query attributes
+    //
+    HBufC* stringHolder = GetQueryAttributesLC( coverDialogId, isCancelKey, isErrorQuery );
+
+    //check if query text string loading was successful
+    if (NULL != stringHolder)
         {
-        iUSBQueryDlg->SetTextL(*stringHolder);
+        DisableKeylock();
+        SuppressAppSwitching( ETrue );
+        returnValue = QueryUserResponseL( *stringHolder, coverDialogId,
+                isCancelKey, isErrorQuery );
+        SuppressAppSwitching( EFalse );
+        RestoreKeylock();
+        CleanupStack::PopAndDestroy( stringHolder );
         }
-        
-    iUSBQueryDlg->ShowL();
-    FLOG(_L("[USBUINOTIF]\t CUSBUIQueriesNotifier::StartDialogL() ShowL returned"));     
-    
-    CleanupStack::PopAndDestroy( stringHolder );
-    
-    
-    FLOG(_L("[USBUINOTIF]\t CUSBUIQueriesNotifier::StartDialogL completed"));
+    else
+        {
+        returnValue = KErrUnknown;
+        }
+
+    CompleteMessage( returnValue );
+    // cancelling the notifier so that next one on the queue can be displayed.
+    // it may be that the client calls cancel too, but it is ok
+    iManager->CancelNotifier( iInfo.iUid );
+    FLOG(_L("[USBUINOTIF]\t CUSBUIQueriesNotifier::RunL() completed"));
     }
 
 // ----------------------------------------------------------------------------
@@ -166,40 +206,134 @@
     FLOG(_L("[USBUINOTIF]\t CUSBUIQueriesNotifier::Cancel"));
     if (iUSBQueryDlg)
         {
-        iUSBQueryDlg->Close();
         delete iUSBQueryDlg;
         iUSBQueryDlg = NULL;
         }
- 
+    CompleteMessage( KErrCancel );
+
     CUSBUINotifierBase::Cancel();
     FLOG(_L("[USBUINOTIF]\t CUSBUIQueriesNotifier::Cancel() completed"));
     }
 
-
-void CUSBUIQueriesNotifier::MessageBoxClosed(
-        const CHbDeviceMessageBoxSymbian* /*aMessageBox*/,
-        CHbDeviceMessageBoxSymbian::TButtonId aButton)
+// ----------------------------------------------------------------------------
+// CUSBUIQueriesNotifier::QueryUserResponseL
+// Show query dialog. 
+// ----------------------------------------------------------------------------
+//
+TInt CUSBUIQueriesNotifier::QueryUserResponseL(const TDesC& aStringHolder,
+        TInt aCoverDialogId, TBool aIsCancelKey, TBool aIsErrorQuery)
     {
-    FLOG(_L("[USBUINOTIF]\t CUsbUiNotifMSMMError::MessageBoxClosed"));
-    int returnValue = KErrNone;
-    
-    //iQuery will be deleted in Cancel. If Cancel is not called, it will be
-    //deleted next time the query is shown. 
+    FLOG(_L("[USBUINOTIF]\t CUSBUIQueriesNotifier::QueryUserResponseL"));
+    TInt returnValue = KErrNone;
+
+    iUSBQueryDlg = CAknQueryDialog::NewL( CAknQueryDialog::EConfirmationTone );
 
-    if (aButton == CHbDeviceMessageBoxSymbian::EAcceptButton) 
+    // Show dialog with or without the Cancel
+    //
+    if (aIsErrorQuery) 
+        {
+        // aIsErrorQuery flag is set in GetQueryAttributesLC()
+        // there is no defined QueryDialogError in resources so QueryOTGerror is used (contains Stop icon)
+        iUSBQueryDlg->PrepareLC( R_USB_QUERY_OTG_ERROR );
+        }
+    else if (aIsCancelKey)
+        {
+        iUSBQueryDlg->PrepareLC( R_USB_QUERY_WITH_CANCEL );
+        }
+    else
+        {
+        iUSBQueryDlg->PrepareLC( R_USB_QUERY_WITHOUT_CANCEL );
+        }
+
+    if (iCoverDisplaySupported)
+        {
+        iUSBQueryDlg->PublishDialogL( aCoverDialogId, KUSBUINotifCategory );
+        }
+
+    iUSBQueryDlg->SetPromptL( aStringHolder );
+    iUSBQueryDlg->SetFocus( ETrue );
+        FLOG(_L("[USBUINOTIF]\t CUSBUIQueriesNotifier::QueryUserResponseL calling RunLD"));
+    TInt keypress = iUSBQueryDlg->RunLD();
+
+    iUSBQueryDlg = NULL;
+
+    if (keypress) // User has accepted the dialog
         {
         returnValue = KErrNone;
-        } 
-    else 
+            FLOG(_L("[USBUINOTIF]\t CUSBUIQueriesNotifier::QueryUserResponseL keypress"));
+        }
+    else
         {
         returnValue = KErrCancel;
+            FLOG(_L("[USBUINOTIF]\t CUSBUIQueriesNotifier::QueryUserResponseL NO keypress"));
         }
 
-    CompleteMessage( returnValue );
-    
-    FLOG(_L("[USBUINOTIF]\t CUsbUiNotifMSMMError::MessageBoxClosed completed"));    
+        FLOG(_L("[USBUINOTIF]\t CUSBUIQueriesNotifier::QueryUserResponseL completed"));
+    return returnValue;
     }
 
-
+// ----------------------------------------------------------------------------
+// CUSBUIQueriesNotifier::GetQueryAttributesLC
+// Get query text and the other attributes for the query dialog. 
+// ----------------------------------------------------------------------------
+//
+HBufC* CUSBUIQueriesNotifier::GetQueryAttributesLC(TInt& aCoverDialogId,
+        TBool& aIsCancelKey, TBool& aIsErrorQuery)
+    {
+    FLOG(_L("[USBUINOTIF]\t CUSBUIQueriesNotifier::GetQueryAttributesLC"));
+    HBufC* stringHolder = NULL; // The text for the query
+    aIsCancelKey = EFalse;
+    aIsErrorQuery = EFalse;
+    switch (iQueryType)
+        {
+        case EUSBStorageMediaFailure:
+            {
+            FLOG(_L("[USBUINOTIF]\t CUSBUIQueriesNotifier::EUSBStorageMediaFailure"));
+            stringHolder = StringLoader::LoadLC( R_USB_STORAGE_MEDIA_FAILURE );
+            aCoverDialogId = EUSBCoverStorageMediaFailure;
+            break;
+            }
+        case EUSBChangeFromMassStorage:
+            {
+            FLOG(_L("[USBUINOTIF]\t CUSBUIQueriesNotifier::EUSBChangeFromMassStorage"));
+            stringHolder = StringLoader::LoadLC( R_USB_CHANGE_FROM_MASS_STORAGE );
+            aIsCancelKey = ETrue;
+            aCoverDialogId = EUSBCoverChangeFromMassStorage;
+            break;
+            }
+        case EUSBNoMemoryCard:
+            {
+            FLOG(_L("[USBUINOTIF]\t CUSBUIQueriesNotifier::EUSBNoMemoryCard"));
+            stringHolder = StringLoader::LoadLC( R_USB_NO_MEMORY_CARD );
+            aCoverDialogId = EUSBCoverNoMemoryCard;
+            break;
+            } 
+        case EUSBNotEnoughRam:
+          	{
+            FLOG(_L("[USBUINOTIF]\t CUSBUIQueriesNotifier::EUSBNotEnoughRam"));
+            stringHolder = StringLoader::LoadLC( R_USB_ERROR_MEMORY_NOT_ENOUGH );
+            aCoverDialogId = EUSBCoverNoMemoryCard;
+            //set flag to change the icon of querydialog (see QueryUserResponseL())
+            aIsErrorQuery = ETrue;
+            break;
+            }
+        case EUSBDiskFull:
+          	{
+            FLOG(_L("[USBUINOTIF]\t CUSBUIQueriesNotifier::EUSBDiskFull"));
+            stringHolder = StringLoader::LoadLC( R_USB_ERROR_DISK_FULL );
+            aCoverDialogId = EUSBCoverNoMemoryCard;
+            //set flag to change the icon of querydialog (see QueryUserResponseL())
+            aIsErrorQuery = ETrue;
+            break;
+            }
+        default:
+            {
+            FTRACE( FPrint( _L( "[USBUINOTIF]\t CUSBUIQueriesNotifier::ERROR! Unknown query type: %d" ),
+                            iQueryType ) );
+            }
+        }
+    FLOG(_L("[USBUINOTIF]\t CUSBUIQueriesNotifier::GetQueryAttributesLC completed"));
+    return stringHolder;
+    }
 
 // End of File