diff -r 000000000000 -r 2f259fa3e83a uifw/AknGlobalUI/OldStyleNotif/Src/AknSystemListPopup.cpp --- /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 + +#include +#include +#include +#include +#include +#include "AknListQueryNotificationDialog.h" +#include +#include +#include +#include +#include + +#include +#include +#include + +#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 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* 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(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* params + = (SAknNotifierPackage*)aBuffer.Ptr(); + + if (aBuffer.Length() < 0 + || (TUint)aBuffer.Length() < sizeof(SAknNotifierPackage) + || 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