diff -r 000000000000 -r 2f259fa3e83a uifw/AknGlobalUI/OldStyleNotif/Src/aknsystemprogresspopup.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AknGlobalUI/OldStyleNotif/Src/aknsystemprogresspopup.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,464 @@ +/* +* 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 progress dialog. +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "aknsystemprogresspopup.h" +#include "AknNotifyPlugin.hrh" +#include +#include +#include "aknnoteattributes.h" +#include +#include +#include +#include +#include +#include +#include "AknAppsKeyCleanup.inl" + +const TInt KCharsInTInt = 4; // TInt32 takes 4 chars. + +// ============================================================================= +// Progress dialog subject. +// ============================================================================= + +CAknGlobalProgressDialogSubject* CAknGlobalProgressDialogSubject::NewL() + { + CAknGlobalProgressDialogSubject* self = new (ELeave) CAknGlobalProgressDialogSubject(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CAknGlobalProgressDialogSubject::CAknGlobalProgressDialogSubject() +:iPending(EFalse) + { + iStoredEikonEnv = CEikonEnv::Static(); + } + +void CAknGlobalProgressDialogSubject::ConstructL() + { + } + +CAknGlobalProgressDialogSubject::~CAknGlobalProgressDialogSubject() + { + //delete iDlg; + delete iPrompt; + + Cancel(); + + // Complete the RMessage if we need to. + if (iPending) + { + iMessage.Complete(KErrDied); + } + } + +void CAknGlobalProgressDialogSubject::Release() + { + delete this; + } + +CAknGlobalProgressDialogSubject::TNotifierInfo CAknGlobalProgressDialogSubject::RegisterL() + { + iInfo.iUid = KAknGlobalProgressDialogUid; + iInfo.iChannel = EAknNotifierChannelProgressDialog; + iInfo.iPriority = ENotifierPriorityHigh; + return iInfo; + } +CAknGlobalProgressDialogSubject::TNotifierInfo CAknGlobalProgressDialogSubject::Info() const + { + return iInfo; + } + +TPtrC8 CAknGlobalProgressDialogSubject::StartL(const TDesC8& /*aBuffer*/) + { + return KNullDesC8(); + } + +void CAknGlobalProgressDialogSubject::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 iconId = readStream.ReadInt16L(); + TInt iconMaskId = readStream.ReadInt16L(); + TInt finalValue = readStream.ReadInt32L(); + TInt tone = readStream.ReadInt16L(); + + // Get prompt text + TInt promptLength = readStream.ReadInt16L(); + + delete iPrompt; + iPrompt = NULL; + + iPrompt = HBufC::NewL(promptLength + KAknBidiExtraSpacePerLine); + TPtr promptPtr = iPrompt->Des(); + readStream >> promptPtr; + + // Get image file name. + TInt imageFileLength = readStream.ReadInt16L(); + TFileName imageFile; + if (imageFileLength) + { + readStream >> imageFile; + } + + // Get icon file name. + TInt iconFileLength = readStream.ReadInt16L(); + TFileName iconFile; + if (iconFileLength) + { + readStream >> iconFile; + } + + // Get icon text. + TInt iconTextLength = readStream.ReadInt16L(); + + HBufC* iconText = NULL; + if (iconTextLength) + { + iconText = HBufC::NewLC(iconTextLength + KAknBidiExtraSpacePerLine); + TPtr iconTextPtr = iconText->Des(); + readStream >> iconTextPtr; + + // Clip strings to fit in one line each. + // We also convert them to visual order. + const CFont* font = iStoredEikonEnv->NormalFont(); + + TAknLayoutRect layRect; + TAknLayoutText textLay; + AknLayoutUtils::TAknCbaLocation cbaLocation(AknLayoutUtils::CbaLocation()); + TInt variety(0); + if (cbaLocation == AknLayoutUtils::EAknCbaLocationRight) + { + variety = 4; + } + else if (cbaLocation == AknLayoutUtils::EAknCbaLocationLeft) + { + variety = 7; + } + else + { + variety = 1; + } + + layRect.LayoutRect(iAvkonAppUi->ApplicationRect(), + AknLayoutScalable_Avkon::popup_note_window(variety)); + + TAknTextLineLayout layLine = AKN_LAYOUT_TEXT_Note_pop_up_window_texts_Line_1(1); + textLay.LayoutText(layRect.Rect(), layLine); + TInt clipWidth = textLay.TextRect().Width(); + + AknBidiTextUtils::ConvertToVisualAndClipL(iconTextPtr, *font, clipWidth, clipWidth); + + layLine = AKN_LAYOUT_TEXT_Note_pop_up_window_texts_Line_1(4); + textLay.LayoutText(layRect.Rect(), layLine); + + clipWidth = textLay.TextRect().Width(); + + AknBidiTextUtils::ConvertToVisualAndClipL(promptPtr, *font, clipWidth, clipWidth); + + // +1 for '\n' + iPrompt = iPrompt->ReAllocL(iPrompt->Length() + iconText->Length() + 1); + + promptPtr.Set(iPrompt->Des()); + promptPtr.Append('\n'); + promptPtr.Append(*iconText); + CleanupStack::PopAndDestroy(iconText); + } + + TInt skinsMajorImage = readStream.ReadInt32L(); + TInt skinsMinorImage = readStream.ReadInt32L(); + TInt skinsMajorIcon = readStream.ReadInt32L(); + TInt skinsMinorIcon = readStream.ReadInt32L(); + + CAknSDData* sddata = 0; + if (readStream.ReadInt8L()) + { + sddata = new (ELeave) CAknSDData(); + CleanupStack::PushL(sddata); + readStream >> *sddata; + } + + // Initialize dialog, done before image loading as eases up cleanupstack handling. + delete iDlg; + iDlg = NULL; + iDlg = new (ELeave) CAknProgressDialog(REINTERPRET_CAST(CEikDialog**, &iDlg), ETrue); + iDlg->SetCallback(this); + + 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 + // progress note identifier is published to the secondary display. + iDlg->PublishDialogL(EAknUnidentifiedProgressNote, KAknSecondaryDisplayCategory); + } + + if (!iAppsKeySuppressed) + { + ((CAknNotifierAppServerAppUi*)(iStoredEikonEnv->EikAppUi()))->SuppressAppSwitching(ETrue); + } + CleanupStack::PushL(TCleanupItem(ReleaseAppsKey, 0)); + + iDlg->PrepareLC(R_GLOBAL_PROGRESS_DIALOG); + + // Load image. + CEikImage* image = new (ELeave) CEikImage; + CleanupStack::PushL(image); + + TAknsItemID id = {0,0}; + + if (skinsMajorImage||skinsMinorImage||imageFile.CompareF(KAvkonBitmapFile) == 0) + { + if (skinsMajorImage||skinsMinorImage) + { + id.Set(skinsMajorImage,skinsMinorImage); + } + else + { + id = CAknNoteAttributes::GetSkinnedBitmapID(imageId); + } + } + 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; + } + + // Load icon. + CEikImage* icon = new (ELeave) CEikImage; + CleanupStack::PushL(icon); + id.Set(0,0); + + bitmap = NULL; + mask = NULL; + + if (skinsMajorIcon || skinsMinorIcon || iconFile.CompareF(KAvkonBitmapFile) == 0) + { + if (skinsMajorIcon || skinsMinorIcon) + { + id.Set(skinsMajorIcon,skinsMinorIcon); + } + else + { + id = CAknNoteAttributes::GetSkinnedBitmapID(iconId); + } + } + + TRAP(err, AknsUtils::CreateIconL( + skin,id, + bitmap, mask, + iconFile, + iconId, iconMaskId )); + + if (!err) + { + icon->SetPicture(bitmap,mask); + } + else + { + CleanupStack::PopAndDestroy(icon); + icon = 0; + } + + // Set icon. + if (icon) + { + iDlg->SetIconL(icon); + CleanupStack::Pop(icon); + } + + // Set image. + if (image) + { + iDlg->SetImageL(image); + CleanupStack::Pop(image); + } + + // Set progress info. + iProgressInfo = iDlg->GetProgressInfoL(); + iProgressInfo->SetFinalValue(finalValue); + + // Set softkeys. + if (softkeys) + { + // If softkeys are given, the resource id must point to a valid resource. + // Trying to use invalid softkeys can cause panic. + if (!(iStoredEikonEnv->IsResourceAvailableL(softkeys))) + { + User::Leave(KErrArgument); + } + + iDlg->ButtonGroupContainer().SetCommandSetL(softkeys); + } + + // If icon text was present, we processed the text ourselves. + // (Wrapped, truncated, converted from logical to visual.) + if (iconTextLength) + { + iDlg->SetTextProcessing(EFalse); + } + + // Set label and tone. + iDlg->SetTextL(*iPrompt); + iDlg->SetTone((CAknNoteDialog::TTone)tone); + + // Execute dialog. + iDlg->RunLD(); + + CleanupStack::Pop(); // Apps key cleanup. + iAppsKeySuppressed = ETrue; + + delete iPrompt; + iPrompt = NULL; + + iPending = ETrue; + } + +void CAknGlobalProgressDialogSubject::Cancel() + { + delete iDlg; + iDlg = NULL; + TRAP_IGNORE(DialogDismissedL(EAknSoftkeyCancel)); + } + +TPtrC8 CAknGlobalProgressDialogSubject::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; + DialogDismissedL(EAknSoftkeyCancel); + } + else if (params->iParamData.iCmd == EAknUpdateGlobalQuery) + { + // Update current and final value. + if (params->iParamData.iValue >= 0) + { + iProgressInfo->SetFinalValue(params->iParamData.iFinalValue); + } + + iProgressInfo->SetAndDraw(params->iParamData.iValue); + + CAknMediatorFacade* coverData = AknMediatorFacade(iDlg); + if (coverData) + { + coverData->ResetBuffer(); + coverData->BufStream().WriteInt32L(EAknGlobalPDialogValuesUpdate); + coverData->BufStream().WriteInt32L(params->iParamData.iValue); + coverData->BufStream().WriteInt32L(params->iParamData.iFinalValue); + coverData->BufStream().CommitL(); + coverData->PostUpdatedDataL(); + } + } + else if (params->iParamData.iCmd == EAknFinishGlobalProgressDialog) + { + iDlg->ProcessFinishedL(); + } + + return KNullDesC8(); + } + +void CAknGlobalProgressDialogSubject::DialogDismissedL(TInt aButtonId) + { + if (iPending) + { + iMessage.Complete(aButtonId); + } + iPending = EFalse; + iReturnVal = NULL; + + if (iAppsKeySuppressed) + { + ((CAknNotifierAppServerAppUi*)(iStoredEikonEnv->EikAppUi()))->SuppressAppSwitching(EFalse); + } + iAppsKeySuppressed = EFalse; + } + +// End of file