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