uifw/AknGlobalUI/OldStyleNotif/Src/aknsystemmsgpopup.cpp
changeset 0 2f259fa3e83a
child 6 9f56a4e1b8ab
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AknGlobalUI/OldStyleNotif/Src/aknsystemmsgpopup.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,473 @@
+/*
+* Copyright (c) 2002-2008 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:  Plugin implementation of global message query.
+*
+*/
+
+#include <AknNotifyStd.h>
+#include <avkon.rsg>
+#include <eikbtgpc.h>
+#include <eikenv.h>
+#include <avkon.hrh>
+#include <bautils.h>
+#include <aknnotpi.rsg>
+#include <AknQueryDialog.h>
+#include <aknmessagequerydialog.h>
+#include <aknmessagequerycontrol.h>
+#include "aknsystemmsgpopup.h"
+#include <s32mem.h>
+#include <uikon/eiksrvui.h>
+#include <AknNotifySignature.h>
+#include <AknsUtils.h>
+#include <aknconsts.h>
+#include <aknSDData.h>
+#include <AknMediatorFacade.h>
+#include <aknnoteattributes.h>
+#include <SecondaryDisplay/AknSecondaryDisplayDefs.h>
+#include "AknAppsKeyCleanup.inl"
+
+const TInt KCharsInTInt = 4; // TInt32 takes 4 chars.
+
+// =============================================================================
+// Message query dialog.
+// =============================================================================
+
+CAknMsgQueryNotificationDialog::CAknMsgQueryNotificationDialog(                    
+    MAknQueryNotificationCallback* aCallBack,
+    CAknMsgQueryNotificationDialog** aSelfPtr,
+    HBufC* aMessage,
+    TInt aSoftkeys,
+    HBufC* aHeader,
+    CEikImage* aHeaderImage,
+    const TTone aTone) 
+: CAknMessageQueryDialog(aTone),
+    iSoftkeys(aSoftkeys),
+    iCallBack(aCallBack),
+    iSelfPtr(aSelfPtr),
+    // Maintain these even the base class should do that.
+    iMessage(aMessage),
+    iHeader(aHeader),
+    iHeaderImage(aHeaderImage)
+    {
+    }
+
+void CAknMsgQueryNotificationDialog::PreLayoutDynInitL()
+    {
+    // Base call first.      
+    CAknMessageQueryDialog::PreLayoutDynInitL();
+
+    if (iMessage)
+        {
+        STATIC_CAST(CAknMessageQueryControl*, 
+            Control(EAknMessageQueryContentId))->SetMessageTextL(iMessage);
+            
+        STATIC_CAST(CAknMessageQueryControl*, 
+            Control(EAknMessageQueryContentId))->SetMopParent(this);
+            
+        delete iMessage;
+        iMessage = NULL;
+        }
+
+    CAknPopupHeadingPane* headingPane = STATIC_CAST(CAknPopupHeadingPane*, 
+        Control(EAknMessageQueryHeaderId));
+        
+    if (!headingPane)
+        {
+        return;
+        }
+ 
+    if (iHeader)
+        {
+        headingPane->SetTextL(*iHeader);
+        delete iHeader;
+        iHeader = NULL;
+        }
+
+    if (iHeaderImage)
+        {
+        headingPane->SetHeaderImageOwnedL(iHeaderImage);
+        iHeaderImage = NULL;
+        }
+    }
+
+void CAknMsgQueryNotificationDialog::PostLayoutDynInitL()
+    {
+    if (iSoftkeys)
+        {
+        // If softkeys are given, the resource id must point to a valid resource.
+        // Trying to use invalid softkeys can cause panic.
+        if (!(iCoeEnv->IsResourceAvailableL(iSoftkeys)))
+            {
+            User::Leave(KErrArgument);
+            }
+        
+        ButtonGroupContainer().SetCommandSetL(iSoftkeys);
+        }
+    
+    CAknMessageQueryDialog::PostLayoutDynInitL();
+    }
+
+
+CAknMsgQueryNotificationDialog::~CAknMsgQueryNotificationDialog()
+    {
+    if (iSelfPtr) 
+        {
+        *iSelfPtr = NULL;
+        }
+
+    if (iTimer)
+        {
+        iTimer->Cancel();
+        delete iTimer;
+        }
+
+    delete iMessage;
+    delete iHeader;
+    delete iHeaderImage;
+    }
+
+TKeyResponse CAknMsgQueryNotificationDialog::OfferKeyEventL(
+    const TKeyEvent& aKeyEvent,
+    TEventCode aType)
+    {
+
+    if (aKeyEvent.iScanCode == EStdKeyYes)
+        {
+        return EKeyWasConsumed;
+        }
+    
+    if (aType != EEventKey)
+        {
+        return EKeyWasNotConsumed;
+        }
+
+    return CAknMessageQueryDialog::OfferKeyEventL(aKeyEvent, aType);
+    }
+
+
+TBool CAknMsgQueryNotificationDialog::OkToExitL(TInt aButtonId)
+    {
+    TInt ret = -1;
+    if (aButtonId != EAknSoftkeyCancel)
+        {
+        ret = aButtonId;
+        }
+    iCallBack->QueryDismissedL(ret);
+
+    if (ret == -1 || !iDelay)
+        {
+        return ETrue;
+        }
+    
+    else if (!iTimer) 
+        {
+        iTimer = CPeriodic::NewL(CActive::EPriorityUserInput);
+        iTimer->Start(iDelay,iDelay,TCallBack(DeleteMe, this));
+        }
+    return EFalse;
+    }
+
+TInt CAknMsgQueryNotificationDialog::DeleteMe(TAny* aThis)
+    {
+    CAknMsgQueryNotificationDialog* me = (CAknMsgQueryNotificationDialog*)aThis;
+    delete me;
+    return 0;  
+    }
+
+void CAknMsgQueryNotificationDialog::CEikDialog_Reserved_1()
+    {
+    }
+
+void CAknMsgQueryNotificationDialog::CEikDialog_Reserved_2()
+    {
+    }
+
+void CAknMsgQueryNotificationDialog::CAknDialog_Reserved()
+    {
+    }
+
+void CAknMsgQueryNotificationDialog::CAknQueryDialog_Reserved()
+    {
+    }
+
+// =============================================================================
+// Message query subject.
+// =============================================================================
+
+CAknGlobalMsgQuerySubject* CAknGlobalMsgQuerySubject::NewL()
+    {
+    CAknGlobalMsgQuerySubject* self = new (ELeave) CAknGlobalMsgQuerySubject(); 
+    CleanupStack::PushL(self);
+    self->ConstructL(); 
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CAknGlobalMsgQuerySubject::CAknGlobalMsgQuerySubject()
+: iPending(EFalse)
+    {
+    iStoredEikonEnv = CEikonEnv::Static();
+    }
+
+void CAknGlobalMsgQuerySubject::ConstructL()
+    {
+    }
+
+CAknGlobalMsgQuerySubject::~CAknGlobalMsgQuerySubject()
+    {
+    //delete iDlg;
+    delete iBitmap;
+    Cancel();
+    
+    // Complete the RMessage if we need to.
+    if (iPending)
+        {
+        iMessage.Complete(KErrDied);
+        }
+    }
+
+void CAknGlobalMsgQuerySubject::Release()
+    {
+    delete this;
+    }
+
+CAknGlobalMsgQuerySubject::TNotifierInfo CAknGlobalMsgQuerySubject::RegisterL()
+    {
+    iInfo.iUid = KAknGlobalMsgQueryUid;
+    iInfo.iChannel = EAknNotifierChannelMsgQuery;
+    iInfo.iPriority = ENotifierPriorityHigh;
+    return iInfo;
+    }
+
+CAknGlobalMsgQuerySubject::TNotifierInfo CAknGlobalMsgQuerySubject::Info() const
+    {
+    return iInfo;
+    }
+
+TPtrC8 CAknGlobalMsgQuerySubject::StartL(const TDesC8& /*aBuffer*/)
+    {
+    return KNullDesC8();
+    }
+
+void CAknGlobalMsgQuerySubject::StartL(const TDesC8& aBuffer, TInt /*aReplySlot*/, 
+    const RMessagePtr2& aMessage)
+    {
+    if (iPending)
+        {
+        aMessage.Complete(KErrInUse);
+        return;
+        }
+
+    RDesReadStream readStream(aBuffer);
+    if (aBuffer.Length() < KCharsInTInt || readStream.ReadInt32L() != KAKNNOTIFIERSIGNATURE)
+        {
+        User::Leave(KErrArgument);
+        }
+
+    iMessage = aMessage;
+    TInt softkeys = readStream.ReadInt32L();
+    TInt imageId = readStream.ReadInt16L();
+    TInt imageMaskId = readStream.ReadInt16L();
+    TInt tone = readStream.ReadInt16L();
+
+    TInt textLength = readStream.ReadInt16L();
+    HBufC* text = HBufC::NewLC(textLength);
+    TPtr textPtr = text->Des();
+    readStream >> textPtr;
+
+    TInt headerLength = readStream.ReadInt16L();
+    HBufC* header = HBufC::NewLC(headerLength);
+    TPtr headerPtr = header->Des();
+    readStream >> headerPtr;
+
+    TInt imageFileLength = readStream.ReadInt16L();
+    TFileName imageFile;
+    if (imageFileLength)
+        {
+        readStream >> imageFile;
+        }
+
+    TInt delay = readStream.ReadInt32L();
+
+    TInt skinsMajor = readStream.ReadInt32L();
+    TInt skinsMinor = readStream.ReadInt32L();
+
+    CAknSDData* sddata = 0;
+    if (readStream.ReadInt8L())
+        {
+        sddata = new (ELeave) CAknSDData();
+        CleanupStack::PushL(sddata);
+        readStream >> *sddata;
+        }
+
+    CEikImage* image = new (ELeave) CEikImage;
+    CleanupStack::PushL(image);
+
+    TAknsItemID id;
+    id.Set(skinsMajor, skinsMinor);
+ 
+    CFbsBitmap* bitmap = NULL;
+    CFbsBitmap* mask = NULL;
+    
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+   
+    TRAPD(err, AknsUtils::CreateIconL(skin, id, bitmap, mask, imageFile, imageId, imageMaskId));
+    if (!err)
+        {
+        image->SetPicture(bitmap, mask);        
+        }
+    else
+        {
+        CleanupStack::PopAndDestroy(image);
+        image = 0;    
+        }
+    
+    delete iDlg;
+    iDlg = NULL;
+
+    // iDlg takes ownership of text buffers.
+    iDlg = new (ELeave) CAknMsgQueryNotificationDialog(this, &iDlg, text, softkeys, header, 
+        image, (CAknQueryDialog::TTone)tone);
+
+    iDlg->SetExitDelay(delay);
+
+    if (image)
+        {
+        CleanupStack::Pop(image); 
+        }
+   
+    if (sddata)
+        {
+        iDlg->PublishDialogL(sddata->iDialogIdx, sddata->iCategory);
+        if (sddata->iAdditionalData)
+            {
+            CAknMediatorFacade* cover_info = AknMediatorFacade(iDlg);
+            if (cover_info)
+                {
+                cover_info->BufStream() << *(sddata->iAdditionalData);
+                cover_info->BufStream().CommitL();
+                }
+            }
+        CleanupStack::PopAndDestroy(sddata);
+        }
+    else
+        {
+        // If secondary display data hasn't been defined, then the unidentified
+        // message query identifier is published to the secondary display.
+        iDlg->PublishDialogL(EAknUnidentifiedMsgQuery, KAknSecondaryDisplayCategory);
+        }        
+        
+    CleanupStack::Pop(2, text);
+    if (!iAppsKeySuppressed) 
+        {
+        ((CAknNotifierAppServerAppUi*)(iStoredEikonEnv->EikAppUi()))->SuppressAppSwitching(ETrue);
+        }
+
+    CleanupStack::PushL(TCleanupItem(ReleaseAppsKey, 0));
+
+#ifdef RD_SCALABLE_UI_V2
+    iDlg->SetGloballyCapturing(ETrue); 
+#endif
+
+    iDlg->ExecuteLD(R_GLOBAL_MESSAGE_QUERY);
+    CleanupStack::Pop(); // Apps key cleanup.
+
+    iAppsKeySuppressed = ETrue;
+    iPending = ETrue;
+    }
+
+void CAknGlobalMsgQuerySubject::Cancel()
+    {
+    delete iDlg;
+    iDlg = NULL;
+    TRAP_IGNORE(QueryDismissedL(EAknSoftkeyCancel));
+    }
+
+TPtrC8 CAknGlobalMsgQuerySubject::UpdateL(const TDesC8& aBuffer)
+    {
+    if (!iDlg)
+        {
+        return KNullDesC8();
+        }
+        
+    // Get parameters.
+    SAknNotifierPackage<SAknGlobalMsgQueryParams>* params 
+        = (SAknNotifierPackage<SAknGlobalMsgQueryParams>*)aBuffer.Ptr();
+
+    if (aBuffer.Length() < 0 
+        || (TUint)aBuffer.Length() < sizeof(SAknNotifierPackage<SAknGlobalMsgQueryParams>)
+        || params->iSignature != KAKNNOTIFIERSIGNATURE)
+        {
+        User::Leave(KErrArgument);
+        }
+
+    if (params->iParamData.iCmd == EAknCancelGlobalQuery)
+        {
+        delete iDlg;
+        iDlg = NULL;
+        QueryDismissedL(EAknSoftkeyCancel);
+        }
+    else
+        {
+        // Update softkeys, but only if the resource id points to a valid resource.
+        // Trying to use invalid softkeys can cause panic.
+        if (iStoredEikonEnv->IsResourceAvailableL(params->iParamData.iSoftkeys))
+            {
+            iDlg->ButtonGroupContainer().SetCommandSetL(params->iParamData.iSoftkeys);
+            iDlg->ButtonGroupContainer().DrawNow();
+        
+            CAknMediatorFacade* coverData = AknMediatorFacade(iDlg);
+            if (coverData)
+                {
+                SAknIntegerUpdate s = 
+                    {
+                    EAknGlobalNotifierUpdateSoftkeys,
+                    params->iParamData.iSoftkeys
+                    };
+            
+                TPckg<SAknIntegerUpdate> pck(s);
+                coverData->ResetBuffer();
+                coverData->BufStream() << pck;
+                coverData->BufStream().CommitL();
+                coverData->PostUpdatedDataL();
+                }
+            }
+        else
+            {
+            // Invalid softkeys, dismiss query with error code.
+            QueryDismissedL(KErrArgument);
+            }        
+         }
+
+    return KNullDesC8();
+    }
+
+void CAknGlobalMsgQuerySubject::QueryDismissedL(TInt aResult)
+    {
+    if (iPending)
+        {
+        iMessage.Complete(aResult);
+        }
+        
+    iPending = EFalse;
+    iReturnVal = NULL;
+    
+    if (iAppsKeySuppressed)
+        {
+        ((CAknNotifierAppServerAppUi*)(iStoredEikonEnv->EikAppUi()))->SuppressAppSwitching(EFalse);
+        }
+    iAppsKeySuppressed = EFalse;
+    }
+
+// End of file