uifw/AknGlobalUI/OldStyleNotif/Src/AknSystemListPopup.cpp
changeset 0 2f259fa3e83a
child 6 9f56a4e1b8ab
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AknGlobalUI/OldStyleNotif/Src/AknSystemListPopup.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,319 @@
+/*
+* 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 list query.
+*
+*/
+
+#include "AknSystemListPopup.h"
+#include <AknNotifyStd.h>
+
+#include <avkon.rsg>
+#include <eikbtgpc.h>
+#include <eikenv.h>
+#include <avkon.hrh>
+#include <bautils.h>
+#include "AknListQueryNotificationDialog.h"
+#include <aknnotpi.rsg>
+#include <AknGlobalListQuery.h>
+#include <s32mem.h>
+#include <uikon/eiksrvui.h>
+#include <AknNotifySignature.h>
+
+#include <AknMediatorFacade.h>
+#include <aknSDData.h>
+#include <SecondaryDisplay/AknSecondaryDisplayDefs.h>
+ 
+#include "AknAppsKeyCleanup.inl"
+
+const TInt KListQueryItemLength = 64;
+const TInt KCharsInTInt = 4; // TInt32 takes 4 chars.
+const TInt KArrayGranularity = 3;
+
+CAknGlobalListQuerySubject* CAknGlobalListQuerySubject::NewL()
+    {
+    CAknGlobalListQuerySubject* self = new (ELeave) CAknGlobalListQuerySubject(); 
+    CleanupStack::PushL(self);
+    self->ConstructL(); 
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CAknGlobalListQuerySubject::CAknGlobalListQuerySubject()
+: iPending(EFalse)
+    {
+    iStoredEikonEnv = CEikonEnv::Static();
+    }
+
+void CAknGlobalListQuerySubject::ConstructL()
+    {
+    }
+
+CAknGlobalListQuerySubject::~CAknGlobalListQuerySubject()
+    {
+    //delete iDlg;
+    Cancel();
+    
+    // Complete the RMessage if we need to.
+    if (iPending)
+        {
+        iMessage.Complete(KErrDied);
+        }
+
+    delete iArray;
+    delete iHeading;
+    }
+
+void CAknGlobalListQuerySubject::Release()
+    {
+    delete this;
+    }
+
+CAknGlobalListQuerySubject::TNotifierInfo CAknGlobalListQuerySubject::RegisterL()
+    {
+    iInfo.iUid = KAknGlobalListQueryUid;
+    iInfo.iChannel = EAknNotifierChannelList;
+    iInfo.iPriority = ENotifierPriorityHigh;
+    return iInfo;
+    }
+    
+CAknGlobalListQuerySubject::TNotifierInfo CAknGlobalListQuerySubject::Info() const
+    {
+    return iInfo;
+    }
+
+TPtrC8 CAknGlobalListQuerySubject::StartL(const TDesC8& /*aBuffer*/)
+    {
+    return KNullDesC8();
+    }
+
+void CAknGlobalListQuerySubject::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;
+    iSelectFirst = readStream.ReadInt16L();
+    TInt count = readStream.ReadInt16L();
+
+    // Create array
+    delete iArray;
+    iArray = 0;
+    iArray = new (ELeave) CDesCArrayFlat(KArrayGranularity);
+    
+    TBuf<KListQueryItemLength> arrayItem;
+
+    for (TInt ii = 0; ii < count; ii++)
+        {
+        readStream >> arrayItem;
+        iArray->AppendL(arrayItem);
+        }
+        
+    TInt headingLength = readStream.ReadInt16L();
+    delete iHeading;
+    iHeading = 0;
+    
+    if (headingLength != KErrNotFound)
+        {
+        iHeading = HBufC::NewL(headingLength);
+        TPtr ptr = iHeading->Des();
+        readStream >> ptr;
+        }
+
+    CAknSDData* sddata = 0;
+    if (readStream.ReadInt8L())
+        {
+        sddata = new (ELeave) CAknSDData();
+        CleanupStack::PushL(sddata);
+        readStream >> *sddata;
+        }
+
+    delete iDlg;
+    iDlg = NULL;
+        
+    iDlg = new (ELeave) CAknListQueryNotificationDialog(&iListIndex, this, &iDlg);
+    if (sddata)
+        {
+        CArrayFixFlat<TInt>* array = 0;
+        CleanupStack::PushL(array); // even as null
+        if (sddata->iAdditionalData && 
+            sddata->iAdditionalData->Length() > 2*sizeof(TInt32)) // command id and count
+            {
+            RDesReadStream strm(*sddata->iAdditionalData);
+            CleanupClosePushL(strm);
+            TInt count = strm.ReadInt32L(); // recycling...
+            if (count == EAknListQueryItemsInfo)
+                {
+                count = strm.ReadInt32L();
+                array = new (ELeave) CArrayFixFlat<TInt>(1);
+                for (TInt i = 0; i < count; i++)
+                    {
+                    array->AppendL(strm.ReadInt32L());
+                    }
+                }   
+            CleanupStack::PopAndDestroy();
+        
+            // Tidy additional data so that there will not be two item arrays.
+            TInt bytesToRemove = (count + 2) * 4;
+            HBufC8* newDes = 0;
+            if (bytesToRemove != sddata->iAdditionalData->Length())
+                {
+                newDes = sddata->iAdditionalData->Mid(bytesToRemove).AllocL();                
+                }           
+            delete sddata->iAdditionalData;
+            sddata->iAdditionalData = newDes;
+            }
+            
+        iDlg->PublishDialogL(sddata->iDialogIdx, sddata->iCategory, array);
+        CleanupStack::Pop(); // Ownership transferred to dialog successfully. 
+        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
+        // list query identifier is published to the secondary display.
+        iDlg->PublishDialogL(EAknUnidentifiedListQuery, KAknSecondaryDisplayCategory);
+        }        
+
+    if (!iAppsKeySuppressed)
+        {
+        ((CAknNotifierAppServerAppUi*)(iStoredEikonEnv->EikAppUi()))->SuppressAppSwitching(ETrue);
+        }
+    CleanupStack::PushL(TCleanupItem(ReleaseAppsKey, 0));    
+    
+    if (!iHeading) 
+        {
+        iDlg->PrepareLC(R_GLOBAL_LIST_QUERY);
+        }
+    else
+        {
+        iDlg->PrepareLC(R_GLOBAL_LIST_QUERY_WITH_HEADING);
+        iDlg->QueryHeading()->SetTextL(iHeading->Des());
+        }
+        
+    iDlg->SetOwnershipType(ELbmOwnsItemArray);
+    iDlg->SetItemTextArray(iArray);
+    TInt itemCount = iArray->Count();
+    iArray = 0;
+
+    // If the list is not empty, the selection index must point to an existing item. 
+    // Otherwise a panic will occur.
+    if (itemCount && (iSelectFirst < 0 || iSelectFirst > itemCount - 1))
+        {
+        User::Leave(KErrArgument);
+        }    
+    
+    CEikListBox* listBox = iDlg->ListBox();
+    if (itemCount)
+        {
+        listBox->SetCurrentItemIndex(iSelectFirst);
+        }
+    listBox->UpdateScrollBarsL();
+   
+    iDlg->RunLD();
+    
+    CleanupStack::Pop(); // Apps key cleanup.
+    iAppsKeySuppressed = ETrue;
+    iPending = ETrue;
+    }
+
+void CAknGlobalListQuerySubject::Cancel()
+    {
+    delete iDlg;
+    iDlg = NULL;
+    TRAP_IGNORE(QueryDismissedL(EAknSoftkeyCancel));
+    }
+
+TPtrC8 CAknGlobalListQuerySubject::UpdateL(const TDesC8& aBuffer)
+    {
+    if (!iDlg)
+        {
+        return KNullDesC8();
+        }
+
+    // Get parameters.
+    SAknNotifierPackage<SAknGlobalListQueryParams>* params 
+        = (SAknNotifierPackage<SAknGlobalListQueryParams>*)aBuffer.Ptr();
+
+    if (aBuffer.Length() < 0 
+        || (TUint)aBuffer.Length() < sizeof(SAknNotifierPackage<SAknGlobalListQueryParams>)
+        || params->iSignature != KAKNNOTIFIERSIGNATURE)
+        {
+        User::Leave(KErrArgument);
+        }
+
+    TInt cmd = params->iParamData.iCmd;
+    TKeyEvent keyEvent;
+    keyEvent.iRepeats = 0;
+    TEventCode eventType = EEventKey;
+    switch (cmd)
+        {
+        case EAknCancelGlobalQuery:
+            delete iDlg;
+            iDlg = NULL;
+            QueryDismissedL(EAknSoftkeyCancel);
+            return KNullDesC8();
+        case EAknMoveDownGlobalListQuery:
+            keyEvent.iCode = EKeyDownArrow;
+            break;
+        case EAknMoveUpGlobalListQuery:
+            keyEvent.iCode = EKeyUpArrow;
+            break;
+        case EAknSelectGlobalListQuery:
+            keyEvent.iCode = EKeyOK;
+            break;
+        default:
+            return KNullDesC8();
+        }
+    iDlg->OfferKeyEventL(keyEvent, eventType);
+
+    return KNullDesC8();
+    }
+
+void CAknGlobalListQuerySubject::QueryDismissedL(TInt aResult)
+    {
+    if (iPending)
+        {
+        iMessage.Complete(aResult);
+        }
+        
+    iPending = EFalse;
+    iReturnVal = NULL;
+    
+    if (iAppsKeySuppressed)
+        {
+        ((CAknNotifierAppServerAppUi*)(iStoredEikonEnv->EikAppUi()))->SuppressAppSwitching(EFalse);
+        }
+    iAppsKeySuppressed = EFalse;
+    }
+
+// End of file