diff -r 000000000000 -r 5f000ab63145 phonesettings/aiwcallimageplugin/src/aiwcallimageplugin.cpp --- /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 // AIW classes and definitions. +#include // AIW constants. +#include // AIW Menu pane. +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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