diff -r 000000000000 -r 05e9090e2422 skins/AknSkins/wppsrc/aknswallpaperplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/skins/AknSkins/wppsrc/aknswallpaperplugin.cpp Thu Dec 17 09:14:12 2009 +0200 @@ -0,0 +1,301 @@ +/* +* Copyright (c) 2005-2007 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: Project definition file for project aknswallpaperplugin +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "aknswallpaperplugin.h" +#include "aknswallpaperplugin.rh" + +_LIT(KResourceFileName, "AknsWallpaperPlugin.rsc"); +_LIT(KDriveZ, "z:"); + +_LIT(KAknsWallpaperPluginMimeTypeImage, "IMAGE"); +_LIT(KAknsWallpaperPluginMimeTypeOTABitmap, "IMAGE/X-OTA-BITMAP"); +_LIT(KAknsWallpaperPluginSeparator, "/"); + +// ======== MEMBER FUNCTIONS ======== + +CAknsWallpaperPlugin* CAknsWallpaperPlugin::NewL() + { + CAknsWallpaperPlugin* self = new( ELeave ) CAknsWallpaperPlugin; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CAknsWallpaperPlugin::CAknsWallpaperPlugin(): + iConeResLoader(*CCoeEnv::Static()) + { + } + +// ----------------------------------------------------------------------------- +// CAknsWallpaperPlugin::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CAknsWallpaperPlugin::ConstructL() + { + TParse parse; + parse.Set(KResourceFileName, &KDC_RESOURCE_FILES_DIR, &KDriveZ); + TFileName resourceFileName; + resourceFileName.Append(parse.FullName()); + iConeResLoader.OpenL(resourceFileName); + } + +CAknsWallpaperPlugin::~CAknsWallpaperPlugin() + { + iConeResLoader.Close(); + } + +// --------------------------------------------------------------------------- +// From class CAiwServiceIfMenu. +// --------------------------------------------------------------------------- +// +void CAknsWallpaperPlugin::InitialiseL(MAiwNotifyCallback& /*aFrameworkCallback*/, + const RCriteriaArray& /*aInterest*/) + { + // Not needed. + } + +// --------------------------------------------------------------------------- +// From class CAiwServiceIfMenu. +// +// Implements setting the main wallpaper for the device using +// AknsWallpaperUtils. +// --------------------------------------------------------------------------- +// +void CAknsWallpaperPlugin::HandleServiceCmdL(const TInt& aCmdId, + const CAiwGenericParamList& aInParamList, + CAiwGenericParamList& /*aOutParamList*/, + TUint /*aCmdOptions*/, + const MAiwNotifyCallback* aCallback) + { + // Handle only assign command. + if ( aCmdId == KAiwCmdAssign ) + { + // Retrieve filename and file MIME type from AIW param list + TPtrC fileName = GetAiwParamAsDescriptor(aInParamList, EGenericParamFile); + + TPtrC mimeTypeString = GetAiwParamAsDescriptor(aInParamList, EGenericParamMIMEType); + + // Leave, if there were not given all the required parameters + if ((fileName == KNullDesC) || + (mimeTypeString == KNullDesC) || !IsMimeTypeSupportedL(mimeTypeString) ) + { + User::Leave(KErrArgument); + } + TInt err = AknsWallpaperUtils::SetIdleWallpaper( + fileName, + CCoeEnv::Static(), + R_AKNS_WALLPAPER_TEXT_LOADING_IMAGE, + R_AKNS_WALLPAPER_GENERAL_WAIT_NOTE ); + + if (err == KAknsWpuErrorPreviewOnly) + { + DisplayInfoNoteL(R_AKNS_WALLPAPER_TEXT_DRM_PREVIEW); + } + else if ( err == KErrNoMemory || err == KErrDiskFull || err == KErrTooBig ) + { + DisplayInfoNoteL( R_AKNS_WALLPAPER_TEXT_IMAGE_TOO_LARGE ); + } + else if (err == KErrCancel || err == KErrCouldNotConnect ) + { + // Skip, this is not a real error or the error is not propagated + // to upper level. + } + else if ( err == KLeaveExit ) + { + // Exit leaves should always allowed to leave. + User::Leave( KLeaveExit ); + } + else if ( err != KErrNone ) + { + DisplayInfoNoteL( R_AKNS_WALLPAPER_TEXT_IMAGE_CORRUPTED ); + } + + // If aCallback defined inform consumers that we have done with + // the operation. + if (aCallback) + { + // Cope with the design problems of AIW framework + MAiwNotifyCallback* nonConstCallback = + const_cast (aCallback); + CAiwGenericParamList* eventParamList = CAiwGenericParamList::NewL(); + CleanupStack::PushL(eventParamList); + nonConstCallback->HandleNotifyL( + KAiwCmdAssign, + KAiwEventCompleted, + *eventParamList, + aInParamList); + CleanupStack::PopAndDestroy(eventParamList); + } + } + } + +// --------------------------------------------------------------------------- +// From class CAiwServiceIfMenu. +// +// Inserts plugin's menu items to aMenuPane. +// --------------------------------------------------------------------------- +// +void CAknsWallpaperPlugin::InitializeMenuPaneL(CAiwMenuPane& aMenuPane, + TInt aIndex, + TInt /*aCascadeId*/, + const CAiwGenericParamList& aInParamList) + { + TPtrC mimeTypeString = GetAiwParamAsDescriptor(aInParamList, EGenericParamMIMEType); + + // Insert menu only if supported MIME type is given + if ((mimeTypeString != KNullDesC) && IsMimeTypeSupportedL(mimeTypeString) ) + { + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC(reader, R_AKNS_WALLPAPER_PLUGIN_MENU); + aMenuPane.AddMenuItemsL(reader, KAiwCmdAssign, aIndex); + CleanupStack::PopAndDestroy(); // reader + } + } + +// --------------------------------------------------------------------------- +// From class CAiwServiceIfMenu. +// +// Implements menu command handling for EAknsWallpaperPluginCmdSetWallPaper. +// --------------------------------------------------------------------------- +// +void CAknsWallpaperPlugin::HandleMenuCmdL( + TInt aMenuCmdId, + const CAiwGenericParamList& aInParamList, + CAiwGenericParamList& aOutParamList, + TUint aCmdOptions, + const MAiwNotifyCallback* aCallback) + { + if (aMenuCmdId == EAknsWallpaperPluginCmdSetWallPaper) + { + // Menu commands are handled as service commands. + HandleServiceCmdL( + KAiwCmdAssign, + aInParamList, + aOutParamList, + aCmdOptions, + aCallback ); + } + } + +// ----------------------------------------------------------------------------- +// Implements showing information note +// ----------------------------------------------------------------------------- +// +void CAknsWallpaperPlugin::DisplayInfoNoteL(TInt aTextResourceId) + { + HBufC* text = StringLoader::LoadLC(aTextResourceId); + CAknInformationNote* dlg = new (ELeave) CAknInformationNote(EFalse); + dlg->ExecuteLD(*text); + CleanupStack::PopAndDestroy(text); + } + +// ----------------------------------------------------------------------------- +// Implements checking if a given MIME type is supported or not +// ----------------------------------------------------------------------------- +// +TBool CAknsWallpaperPlugin::IsMimeTypeSupportedL(const TDesC& aMimeTypeString) + { + // Check for a type separator in the string + TInt pos = aMimeTypeString.Find(KAknsWallpaperPluginSeparator); + + // Leave if no separator was found.. the MIME + // standard requires it + if (pos == KErrNotFound) + { + User::Leave(KErrArgument); + } + + // Copy the full Mime type string (needed for uppercase) + HBufC* fullBuf = aMimeTypeString.AllocLC(); + TPtr fullString = fullBuf->Des(); + fullString.UpperCase(); + + // Construct the compare string + TPtrC compareString(aMimeTypeString.Left(pos)); + + // Perform the comparison + TBool ret = EFalse; + + // Mime type case: IMAGE/* except IMAGE/X-OTA-BITMAP + if (compareString.CompareF(KAknsWallpaperPluginMimeTypeImage) == 0 && + !(fullString.CompareF(KAknsWallpaperPluginMimeTypeOTABitmap) == 0)) + { + ret = ETrue; + } + CleanupStack::PopAndDestroy(fullBuf); + + return ret; + } + +// ----------------------------------------------------------------------------- +// Implements getting a AIW parameter as descriptor +// ----------------------------------------------------------------------------- +// +TPtrC CAknsWallpaperPlugin::GetAiwParamAsDescriptor( + const CAiwGenericParamList& aParamList, + TGenericParamId aParamType) + { + TInt index = 0; + const TAiwGenericParam* genericParam = NULL; + genericParam = aParamList.FindFirst( + index, + aParamType, + EVariantTypeDesC); + + if (index >= 0 && genericParam) + { + // Get the data + return genericParam->Value().AsDes(); + } + else + { + return KNullDesC(); + } + } + +// ======== ECOM INITIALIZATION ======== + +// Map the interface UIDs to implementation factory functions +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY(KAknsWallpaperPluginImplementationUid, CAknsWallpaperPlugin::NewL) + }; + +// --------------------------------------------------------- +// Exported proxy for instantiation method resolution +// --------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount) + { + aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy); + return ImplementationTable; + }