phonesettings/aiwcallimageplugin/src/aiwcallimageplugin.cpp
changeset 0 5f000ab63145
child 69 8baf28733c3d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonesettings/aiwcallimageplugin/src/aiwcallimageplugin.cpp	Mon Jan 18 20:18:27 2010 +0200
@@ -0,0 +1,408 @@
+/*
+* Copyright (c) 2004-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:  Implementation of Call Image plugin.
+*
+*/
+
+    
+
+// INCLUDE FILES
+#include <AiwCommon.h>              // AIW classes and definitions.
+#include <AiwCommon.hrh>            // AIW constants.
+#include <AiwMenu.h>                // AIW Menu pane.
+#include <aiwcallimageplugin.rsg>
+#include <pslninternalcrkeys.h>
+#include <centralrepository.h>
+#include <data_caging_path_literals.hrh>
+#include <aknnotedialog.h>
+#include <DRMHelper.h>
+#include <bautils.h>
+#include <drmutility.h>
+#include <AknsSrvClient.h>
+
+#include "aiwcallimageplugin.h"     // This class interface.
+#include "aiwcallimageplugin.hrh"   // AiwCallImagePlugin constants.
+
+
+
+// CONSTANTS
+
+// Drive letter.
+_LIT( KResourceDrive, "z:" );
+
+// Path to compiled resource file.
+_LIT( KCallImageResFile, "aiwcallimageplugin.rsc" );
+
+// Call Image mime types.
+_LIT( KCallImagePluginMimeTypeImage, "IMAGE" );
+_LIT( KCallImagePluginMimeTypeOTABitmap, "IMAGE/X-OTA-BITMAP" );
+_LIT( KCallImagePluginSeparator, "/" );
+// Extension for scalable vector graphics file.
+_LIT( KAknsSkinSrvSvgFileExt, ".svg" );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CAiwCallImagePlugin::CAiwCallImagePlugin
+// 
+// C++ constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CAiwCallImagePlugin::CAiwCallImagePlugin()
+    {
+    }
+    
+// -----------------------------------------------------------------------------
+// CAiwCallImagePlugin::NewL
+// 
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CAiwCallImagePlugin* CAiwCallImagePlugin::NewL()
+    {
+    CAiwCallImagePlugin* self = new( ELeave ) CAiwCallImagePlugin;
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CAiwCallImagePlugin::~CAiwCallImagePlugin
+// 
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CAiwCallImagePlugin::~CAiwCallImagePlugin()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CAiwCallImagePlugin::InitialiseL
+// 
+// 
+// -----------------------------------------------------------------------------
+//
+void CAiwCallImagePlugin::InitialiseL(
+    MAiwNotifyCallback& /*aFrameworkCallback*/,
+    const RCriteriaArray& /*aInterest*/)
+    {
+    // Stub. Not used.
+    }
+
+// -----------------------------------------------------------------------------
+// CAiwCallImagePlugin::HandleServiceCmdL
+// 
+// 
+// -----------------------------------------------------------------------------
+//
+void CAiwCallImagePlugin::HandleServiceCmdL(
+    const TInt& aCmdId,
+    const CAiwGenericParamList& aInParamList,
+    CAiwGenericParamList& /*aOutParamList*/,
+    TUint aCmdOptions,
+    const MAiwNotifyCallback* /*aCallback*/ )
+    {
+    
+    // Cancel bit must always be checked. Support can be implemented if necessary.
+    if( aCmdOptions & KAiwOptCancel )
+        {
+        return;
+        }
+        
+    // Handle only call command.
+    if ( aCmdId == KAiwCmdAssign )
+        {
+        // Check if there is call image path parameter.
+        TInt index = 0;
+        const TAiwGenericParam* genericParam = NULL; 
+            
+        genericParam = aInParamList.FindFirst( 
+            index,
+            EGenericParamFile,
+            EVariantTypeDesC );
+            
+        if ( index >= 0 && genericParam )
+            {
+             User::LeaveIfError( SetCallImagePathL( genericParam ) );
+            }
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// CAiwCallImagePlugin::SetCallImagePathL
+// 
+// 
+// -----------------------------------------------------------------------------
+//
+TInt CAiwCallImagePlugin::SetCallImagePathL( const TAiwGenericParam* aPathParam )
+    {
+    TInt error( KErrNone );
+    TBool drm( EFalse );
+    TBool iDrmProtected( EFalse ); 
+    RFile fileHandle;
+    TUint fileMode = EFileShareReadersOrWriters | EFileStream | EFileRead;
+    RFs fs = CCoeEnv::Static()->FsSession();
+     
+    User::LeaveIfError(fileHandle.Open(fs, aPathParam->Value().AsDes(), fileMode));
+    CleanupClosePushL(fileHandle);
+     
+    DRM::CDrmUtility* drmUtil = DRM::CDrmUtility::NewLC();
+    iDrmProtected = drmUtil->IsProtectedL(fileHandle);
+     
+    CleanupStack::PopAndDestroy(2); // fileHandle, drmUtil
+    
+    if( !iDrmProtected )
+        {
+        CDRMHelper* drmHelper = CDRMHelper::NewL( *CCoeEnv::Static() );
+        drmHelper->CanSetAutomated( aPathParam->Value().AsDes(), drm );
+        delete drmHelper;
+        }
+
+	//Before setting image, check is the image corruputed
+	RAknsSrvSession skinsrv;
+	User::LeaveIfError( skinsrv.Connect() );
+	CleanupClosePushL( skinsrv );
+	CFbsBitmap* bmp = NULL;
+	CFbsBitmap* mask = NULL;
+     // no way currently of checking corrupted svg:s
+     if ( ( aPathParam->Value().AsDes().Right( 4 ) ).CompareF( KAknsSkinSrvSvgFileExt ) )
+    	{
+		 // (-1, -1) means that image is just decoded, not used    	
+   	 	TRAP( error, skinsrv.DecodeWallpaperImageL( aPathParam->Value().AsDes(), TSize(-1,-1), bmp, mask ) );
+   	 	if( error )
+   	 		{
+   	 		//File is corrupted
+   	 		ShowNoteL( error );
+    		CleanupStack::PopAndDestroy( &skinsrv );
+    		//Need to return KErrNone because there would happen a Leave upper in callstack. This how
+    		//AIW plugin can show more accurate error note.   	 		
+   	 		return KErrNone;
+	  	 	}
+    	}
+    CleanupStack::PopAndDestroy( &skinsrv );
+
+    CRepository* pathCen = CRepository::NewL ( KCRUidThemes ); 
+    CleanupStack::PushL( pathCen );
+    if ( drm )
+        {
+        error = pathCen->Set( KThemesCallImagePath, aPathParam->Value().AsDes() );
+        // If path setting fails do not set image support on.
+        if ( error == KErrNone )
+            {
+            error = pathCen->Set( KThemesCallImageSetting, ETrue );    
+            }
+        ShowNoteL( error );
+        }
+    else // drm check failed show error note
+        {
+        ShowDRMErrorNoteL();
+        }
+    
+    CleanupStack::PopAndDestroy(); // pathCen
+    
+    return error;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAiwCallImagePlugin::ShowDRMErrorNoteL
+// 
+// 
+// -----------------------------------------------------------------------------
+//
+void CAiwCallImagePlugin::ShowDRMErrorNoteL()
+    {
+    // Resource file definition.   
+    TFileName callImageRsc( KResourceDrive );
+    callImageRsc.Append( KDC_RESOURCE_FILES_DIR );
+    callImageRsc.Append( KCallImageResFile );
+
+    CCoeEnv* env = CCoeEnv::Static();
+    BaflUtils::NearestLanguageFile( env->FsSession(), callImageRsc );
+    TInt resourceOffSet = env->AddResourceFileL( callImageRsc );
+    
+    CAknNoteDialog* dlg = new(ELeave) CAknNoteDialog;
+    CAknNoteDialog::TTimeout timeout = CAknNoteDialog::ELongTimeout;
+    dlg->SetTone( CAknNoteDialog::EErrorTone );       
+    dlg->PrepareLC( R_CALL_IMAGE_DRM_NOTE );
+    dlg->SetTimeout( timeout );
+    dlg->RunDlgLD();
+    // Free resource.
+    env->DeleteResourceFile( resourceOffSet );
+    }
+    
+// -----------------------------------------------------------------------------
+// CAiwCallImagePlugin::ShowNoteL
+// 
+// 
+// -----------------------------------------------------------------------------
+//
+void CAiwCallImagePlugin::ShowNoteL( TInt aError )
+    {
+    TInt resourceId = R_CALL_IMAGE_OK_NOTE;
+    // Resource file definition.   
+    TFileName callImageRsc( KResourceDrive );
+    callImageRsc.Append( KDC_RESOURCE_FILES_DIR );
+    callImageRsc.Append( KCallImageResFile );
+
+    CCoeEnv* env = CCoeEnv::Static();
+    BaflUtils::NearestLanguageFile( env->FsSession(), callImageRsc );
+    TInt resourceOffSet = env->AddResourceFileL( callImageRsc );
+    
+    CAknNoteDialog* dlg = new(ELeave) CAknNoteDialog;
+    CAknNoteDialog::TTimeout timeout = CAknNoteDialog::ELongTimeout;
+    
+    if ( aError != KErrNone )
+        {
+        resourceId = R_CALL_IMAGE_ERROR_NOTE;
+        dlg->SetTone( CAknNoteDialog::EErrorTone );
+        }         
+    dlg->PrepareLC( resourceId );
+    dlg->SetTimeout( timeout );
+    dlg->RunDlgLD();
+    // Free resource.
+    env->DeleteResourceFile( resourceOffSet );
+    }
+
+// -----------------------------------------------------------------------------
+// CAiwCallImagePlugin::InitializeMenuPaneL
+// 
+// 
+// -----------------------------------------------------------------------------
+//
+void CAiwCallImagePlugin::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) ) )   
+        {
+        // Resource file definition.   
+        TFileName resFile( KResourceDrive );
+        resFile.Append( KDC_RESOURCE_FILES_DIR );
+        resFile.Append( KCallImageResFile );
+                
+        aMenuPane.AddMenuItemsL( 
+            resFile, 
+            R_CALL_IMAGE_MENU, 
+            KAiwCmdAssign, 
+            aIndex);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CAiwCallImagePlugin::HandleMenuCmdL
+// 
+// 
+// -----------------------------------------------------------------------------
+//
+void CAiwCallImagePlugin::HandleMenuCmdL(
+    TInt aMenuCmdId, 
+    const CAiwGenericParamList& aInParamList,
+    CAiwGenericParamList& aOutParamList,
+    TUint aCmdOptions,
+    const MAiwNotifyCallback* aCallback )
+    {
+    // Cancel bit must always be checked. Support can be implemented if necessary.
+    if( aCmdOptions & KAiwOptCancel )
+        {
+        return;
+        }
+        
+    // Handle only call image command.
+    if ( aMenuCmdId == ECallImage )
+        {
+        // Menu commands are handled as service commands.
+        HandleServiceCmdL(
+            KAiwCmdAssign,
+            aInParamList,
+            aOutParamList,
+            aCmdOptions,
+            aCallback );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Implements getting a AIW parameter as descriptor.
+// 
+// 
+// -----------------------------------------------------------------------------
+//    
+TPtrC CAiwCallImagePlugin::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();
+    	}
+	}  
+
+// -----------------------------------------------------------------------------
+// Implements checking if a given MIME type is supported or not.
+// 
+// 
+// -----------------------------------------------------------------------------
+//
+TBool CAiwCallImagePlugin::IsMimeTypeSupportedL( const TDesC& aMimeTypeString )
+    {   
+    // Check for a type separator in the string
+    TInt pos = aMimeTypeString.Find( KCallImagePluginSeparator );
+
+    // 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 ) );
+
+    TBool ret(EFalse);
+    
+    // Perform the comparison
+    // Mime type case:  IMAGE/* except IMAGE/X-OTA-BITMAP
+    if ( compareString.CompareF( KCallImagePluginMimeTypeImage ) == 0 &&
+        !( fullString.CompareF( KCallImagePluginMimeTypeOTABitmap ) == 0 ) )
+        {
+        ret = ETrue;
+        }
+        
+	CleanupStack::PopAndDestroy( fullBuf );
+    
+	return ret;    
+    }
+    
+// End of file