--- /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