skins/AknSkins/wppsrc/aknswallpaperplugin.cpp
changeset 0 05e9090e2422
--- /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 <eikmenup.h>
+#include <f32file.h>
+#include <AknsWallpaperUtils.h>
+#include <AiwMenu.h>
+#include <AiwCommon.h>
+#include <AiwCommon.hrh>
+#include <barsread.h>
+#include <eikenv.h>
+#include <ecom/implementationproxy.h>
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
+#include <data_caging_path_literals.hrh>
+#include <aknswallpaperplugin.rsg>
+#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<MAiwNotifyCallback*> (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;
+    }