diff -r e5b3a2155e1a -r d2c4c66342f3 messagingfw/senduiservices/datautils/src/SendUiFileRightsEngine.cpp --- a/messagingfw/senduiservices/datautils/src/SendUiFileRightsEngine.cpp Thu Aug 19 10:24:00 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,763 +0,0 @@ -/* -* Copyright (c) 2002-2004 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: Provides functionality for DRM file protection analyzing -* and content MMS compatibility resolving. -* -*/ - - - -// INCLUDE FILES -#include "SendUiFileRightsEngine.h" -#include -#include "SendUiDataUtils.h" - -#include -#include // Msg Media Resolver -#include // MMS Conformance - -#include -#include // Query dialog -#include // Note dialog -#include // String Resource Reader -#include // Stringloader -#include -#include -#include -#include -#include -#include "CSendUiAttachment.h" -// CONSTANTS -const TInt KFREKiloByte = 1024; - - -// ============================ MEMBER FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// CSendUiFileRightsEngine::CSendUiFileRightsEngine -// C++ default constructor can NOT contain any code, that -// might leave. -// ----------------------------------------------------------------------------- -// -CSendUiFileRightsEngine::CSendUiFileRightsEngine( RFs& aFS ) - : iFileSession( aFS ) - { - } - -// ----------------------------------------------------------------------------- -// CSendUiFileRightsEngine::ConstructL -// Symbian 2nd phase constructor can leave. -// ----------------------------------------------------------------------------- -// -void CSendUiFileRightsEngine::ConstructL() - { - iProtectionResolver = CFileProtectionResolver::NewL( iFileSession ); - iMediaResolver = CMsgMediaResolver::NewL(); - iMmsConformance = CMmsConformance::NewL(); - } - -// ----------------------------------------------------------------------------- -// CSendUiFileRightsEngine::NewL -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -EXPORT_C CSendUiFileRightsEngine* CSendUiFileRightsEngine::NewL( RFs& aFs) - { - CSendUiFileRightsEngine* self = NewLC( aFs ); - CleanupStack::Pop( self ); - - return self; - } - -// ----------------------------------------------------------------------------- -// CSendUiFileRightsEngine::NewLC -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -EXPORT_C CSendUiFileRightsEngine* CSendUiFileRightsEngine::NewLC( RFs& aFs ) - { - CSendUiFileRightsEngine* self = - new( ELeave ) CSendUiFileRightsEngine( aFs ); - - CleanupStack::PushL( self ); - self->ConstructL(); - - return self; - } - -// Destructor -CSendUiFileRightsEngine::~CSendUiFileRightsEngine() - { - delete iProtectionResolver; - delete iMediaResolver; - delete iMmsConformance; - } - -// ----------------------------------------------------------------------------- -// CSendUiFileRightsEngine::ConfirmDrmFileRightsL - -// Closed content list checking is also done here. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -EXPORT_C void CSendUiFileRightsEngine::ConfirmDrmFileRightsL( - CArrayPtrFlat* aAttachments ) - { - if ( !aAttachments ) - { - return; - } - TInt fileCount = aAttachments->Count(); - if ( fileCount ) - { - TInt index = 0; - TInt protection = 0; - TDataType mimeType; - - CSendUiDataUtils* dataUtils = CSendUiDataUtils::NewL( iFileSession ); - CleanupStack::PushL( dataUtils ); - - while ( index < fileCount) - { - iValidationResults[ESenduiIndexTotalCount]++; - CSendUiAttachment& attachment = *(aAttachments->At(index)); - RFile file = *(attachment.Handle()); - dataUtils->ResolveFileMimeTypeL( file, mimeType ); - protection = iProtectionResolver->ProtectionStatusL( file, mimeType ); - attachment.SetMimeType( mimeType ); - - if ( protection & EFileProtSuperDistributable ) - { - iValidationResults[ESenduiIndexDrmSD]++; - } - else if ( ( protection & EFileProtForwardLocked ) || - ( protection & EFileProtClosedContent ) ) - { - iInvalidationReason[ESenduiIndexDrmFLOrCCL]++; - iValidationResults[ESenduiIndexDeleted]++; - delete aAttachments->At(index); - aAttachments->Delete( index ); - - fileCount--; - index--; - } - index++; - } - - CleanupStack::PopAndDestroy( dataUtils ); - } - } - -// ----------------------------------------------------------------------------- -// CSendUiFileRightsEngine::ConfirmMmsValidityL -// ----------------------------------------------------------------------------- -// -EXPORT_C void CSendUiFileRightsEngine::ConfirmMmsValidityL( - CArrayPtrFlat* aAttachments, - TUid aServiceId ) - { - if ( !aAttachments ) - { - return; - } - TBool removeFilePath = EFalse; - TInt index = 0; - TInt fileCount = aAttachments->Count(); - TInt attachmentsSize = 0; - // MMS image size is set to original for MMS upload service, - // otherwise oversize images are not filtered away from array - if( aServiceId == KMmsDirectUpload || aServiceId == KMmsIndirectUpload ) - { - // Image size setting not used since only MIME type conformance is checked. - iMmsConformance->SetCreationMode( ETrue ); - } - if ( fileCount ) - { - while ( index < fileCount) - { - - // Validate file for MMS - CSendUiAttachment& attachment = *(aAttachments->At(index)); - removeFilePath = AnalyzeMmsValidationResultL( *(aAttachments->At(index) ), attachmentsSize ); - - if ( removeFilePath ) - { - delete aAttachments->At(index); - aAttachments->Delete( index ); - iValidationResults[ESenduiIndexDeleted]++; - fileCount--; - index--; - } - - index++; - } - } - } - -// ----------------------------------------------------------------------------- -// CSendUiFileRightsEngine::ShowDrmAndMmsInfoL -// Shows DRM confirmation query and/or error note, if needed. -// Returns EFalse if user cancels sending. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -EXPORT_C TBool CSendUiFileRightsEngine::ShowDrmAndMmsInfoL( TUid aServiceId ) - { - TBool showDrmQuery = EFalse; - TBool showErrorNotification = EFalse; - TUint drmQueryTextId = 0; - TUint noteTextId = 0; - TUint valueForNote = 0; - TFREErrorNoteType noteType = EInformationNote; - - // Information query and/or error note is shown if needed - if ( iValidationResults[ESenduiIndexDeleted] ) - { - ResolveErrorNoteL( aServiceId, noteTextId, noteType, valueForNote ); - showErrorNotification = ETrue; - } - - // Possible DRM query is shown only if all files are not deleted. - if ( iValidationResults[ESenduiIndexDeleted] < - iValidationResults[ESenduiIndexTotalCount] ) - { - if ( iValidationResults[ESenduiIndexDrmSD] ) - { - ResolveDrmQuery( aServiceId, drmQueryTextId ); - showDrmQuery = ETrue; - } - } - - // Show error note if needed - if ( showErrorNotification ) - { - ShowErrorNotificationL( noteTextId, noteType, valueForNote ); - } - - // Show query if needed - if ( showDrmQuery ) - { - return ShowConfirmationQueryL( - drmQueryTextId, R_SENDUI_DRM_FORWARDLOCKED_CONTENT_QUERY ); - } - - return ETrue; - } - -// ----------------------------------------------------------------------------- -// CSendUiFileRightsEngine::CalculateTotalSizeOfFiles -// ----------------------------------------------------------------------------- -// -EXPORT_C TInt CSendUiFileRightsEngine::CalculateTotalSizeOfFiles( - CArrayPtrFlat* aAttachments, - TBool aLinksSupported ) -{ - if ( !aAttachments ) - { - return 0; - } - TUint totalSize = 0; - - TInt index = 0; - for ( index = 0; index < aAttachments->Count(); index++ ) - { - CSendUiAttachment& attachment = *(aAttachments->At(index)); - - if ( attachment.Type() == CSendUiAttachment::EAttachmentHandle ) - { - totalSize += attachment.Size(); - } - else - { - if ( !aLinksSupported ) - { - totalSize += attachment.Size(); - } - } - - } - return totalSize; -} - -// ----------------------------------------------------------------------------- -// CSendUiFileRightsEngine::ClearValidationCounters -// ----------------------------------------------------------------------------- -// -EXPORT_C void CSendUiFileRightsEngine::ClearValidationCounters() - { - TInt index = 0; - // Go through the lists - for( index = 0; index < ESenduiIndexLastResult; index++ ) - { - iValidationResults[index] = 0; - } - - for( index = 0; index < ESenduiIndexLastInvalid; index++ ) - { - iInvalidationReason[index] = 0; - } - } - -// ----------------------------------------------------------------------------- -// CSendUiFileRightsEngine::AnalyzeMmsValidationResult -// ----------------------------------------------------------------------------- -// -TBool CSendUiFileRightsEngine::AnalyzeMmsValidationResultL( CSendUiAttachment& aAttachment, TInt& aAttachmentsSize ) - { - TBool attachmentInvalid = ETrue; - - RImplInfoPtrArray implArray; - CleanupStack::PushL( TCleanupItem( CleanupImplArray, &implArray ) ); - CVideoConversionPlugin::ListImplementationsL( implArray ); - - if ( aAttachment.MimeType() == KMsgMimeVideoMp4 && implArray.Count() != 0 ) - { - attachmentInvalid = EFalse; - } - else if ( !iMmsConformance->CreationMode() && - !iMmsConformance->IsConformantMime( aAttachment.MimeType() ) ) - { - // Restricted mode and non-conformant MIME - iInvalidationReason[ESenduiIndexMmsNotSupported]++; - } - else if ( aAttachmentsSize + aAttachment.Size() > iMmsConformance->MaxSendSize() && - iMediaResolver->MediaType( aAttachment.MimeType() ) != EMsgMediaImage ) - { - iInvalidationReason[ESenduiIndexMmsTooBig]++; - } - else - { - attachmentInvalid = EFalse; - } - - if ( !attachmentInvalid - && iMediaResolver->MediaType( aAttachment.MimeType() ) != EMsgMediaImage ) - { - aAttachmentsSize += aAttachment.Size(); - } - - CleanupStack::PopAndDestroy( ); //implArray - return attachmentInvalid; - } - -// ----------------------------------------------------------------------------- -// CSendUiFileRightsEngine::ResolveErrorNoteL -// ----------------------------------------------------------------------------- -// -void CSendUiFileRightsEngine::ResolveErrorNoteL( - TUid aServiceId, - TUint& aResourceId, - TFREErrorNoteType& aNoteType, - TUint& aValueForNote ) - { - TInt i = 0; - TInt errorTypeCount = 0; - TUint errorType = 0; - TUint totalFileCount = iValidationResults[ESenduiIndexTotalCount]; - TUint deletedFiles = iValidationResults[ESenduiIndexDeleted]; - - // Own notes for MMS direct upload - if ( aServiceId == KMmsDirectUpload ) - { - ResolveMmsUploadErrorNoteL( - aResourceId, aNoteType, aValueForNote ); - return; - } - - // Count amount of different error types, if different errors exists - // general error note is shown. - for( i = 0; i < ESenduiIndexLastInvalid; i++ ) - { - if ( iInvalidationReason[i] > 0 ) - { - errorType = i; - errorTypeCount++; - } - } - - if ( errorTypeCount == 0 ) - { // Should never end up here. - aResourceId = R_SENDUI_MME_NONE_CANNOT_INS; - return; - } - else if ( errorTypeCount == 1 ) - { - switch ( errorType ) - { - case ESenduiIndexDrmFLOrCCL: - { - TUint protectedFiles = iInvalidationReason[ ESenduiIndexDrmFLOrCCL ]; - - if ( deletedFiles < totalFileCount ) - { // Some files are protected - aResourceId = R_SENDUI_DRM_SEND_FORBID_SOME; - } - else - { // All files are protected - if ( protectedFiles == 1 ) - { // One protected file - aResourceId = R_SENDUI_DRM_SEND_FORBID_ONE; - } - else - { // Many protected files - aResourceId = R_SENDUI_DRM_ALL_FILES_DELETED; - } - } - } - break; - case ESenduiIndexAlreadyInUse: - { - if ( deletedFiles == totalFileCount ) - { // All files are in use - User::Leave( KErrInUse ); - } - else - { // Some files are in use - aResourceId = R_SENDUI_MME_SOME_INSERTED; - } - } - break; - case ESenduiIndexMmsTooBig: - { - if ( deletedFiles == totalFileCount ) - { // All files are too big - aResourceId = R_SENDUI_MME_ONE_TOO_BIG; - } - else - { // Some files are too big - aResourceId = R_SENDUI_MME_MANY_TOO_BIG; - } - - aNoteType = EConfirmationQuery; - aValueForNote = iMmsConformance->MaxSendSize(); - aValueForNote /= KFREKiloByte ; - } - break; - case ESenduiIndexMmsNotSupported: - { - // Different notes when creation mode is locked - if ( iMmsConformance->CreationModeUserChangeable() && - !iMmsConformance->CreationMode() ) - { - if ( deletedFiles == totalFileCount ) - { // All files are not supported - aResourceId = deletedFiles > 1 ? - R_SENDUI_MME_RMODE_FILES_NOT_SUPPORTED : - R_SENDUI_MME_RMODE_FILE_NOT_SUPPORTED; - } - else - { // Some files are not supported - aResourceId = R_SENDUI_MME_RMODE_SOME_NOT_SUPPORTED; - } - } - else - { - if ( deletedFiles == totalFileCount ) - { // All files are not supported - aResourceId = deletedFiles > 1 ? - R_SENDUI_MME_FILES_NOT_SUPPORTED : - R_SENDUI_MME_FILE_NOT_SUPPORTED; - } - else - { // Some files are not supported - aResourceId = R_SENDUI_MME_SOME_FILES_DELETED; - } - } - } - break; - case ESenduiIndexBadHandle: - default: - { - aResourceId = R_SENDUI_MME_NONE_CANNOT_INS; - } - break; - } - } - else // Different kind of errors exist, show general error note - { - if ( totalFileCount == deletedFiles ) - { // Can't send any file - aResourceId = R_SENDUI_MME_NONE_CANNOT_INS; - } - else - { // Some files can be send - aResourceId = R_SENDUI_MME_SOME_INSERTED; - } - } - } - -// ----------------------------------------------------------------------------- -// CSendUiFileRightsEngine::ResolveMmsUploadErrorNoteL -// ----------------------------------------------------------------------------- -// -void CSendUiFileRightsEngine::ResolveMmsUploadErrorNoteL( - TUint& aResourceId, - TFREErrorNoteType& aNoteType, - TUint& aValueForNote ) - { - TInt i = 0; - TInt errorTypeCount = 0; - TUint errorType = 0; - TUint totalFileCount = iValidationResults[ESenduiIndexTotalCount]; - TUint deletedFiles = iValidationResults[ESenduiIndexDeleted]; - - // Count amount of different error types, if different errors exists - // general error note is shown. - for( i = 0; i < ESenduiIndexLastInvalid; i++ ) - { - if ( iInvalidationReason[i] > 0 ) - { - errorType = i; - errorTypeCount++; - } - } - - if ( errorTypeCount == 0 ) - { // Should never end up here. - return; - } - else if ( errorTypeCount == 1 ) - { - switch ( errorType ) - { - case ESenduiIndexDrmFLOrCCL: - { - TUint protectedFiles = iInvalidationReason[ ESenduiIndexDrmFLOrCCL ]; - - if ( deletedFiles < totalFileCount ) - { // Some files are protected - aResourceId = R_SENDUI_DRM_SEND_FORBID_SOME; - } - else - { // All files are protected - if ( protectedFiles == 1 ) - { // One protected file - aResourceId = R_SENDUI_DRM_SEND_FORBID_ONE; - } - else - { // Many protected files - aResourceId = R_SENDUI_DRM_ALL_FILES_DELETED; - } - } - } - break; - case ESenduiIndexAlreadyInUse: - { - if ( deletedFiles == totalFileCount ) - { // All files are in use - User::Leave( KErrInUse ); - } - else - { // Some files are in use - aResourceId = R_SENDUI_MMS_UPLOAD_SOME_FILES_DELETED; - } - } - break; - case ESenduiIndexMmsTooBig: - { - aResourceId = deletedFiles > 1 ? - R_SENDUI_MMS_UPLOAD_MANY_TOO_BIG : - R_SENDUI_MMS_UPLOAD_ONE_TOO_BIG; - - aNoteType = EConfirmationQuery; - aValueForNote = iMmsConformance->MaxSendSize(); - aValueForNote /= KFREKiloByte ; - } - break; - case ESenduiIndexMmsNotSupported: - default: - { - if ( deletedFiles == totalFileCount ) - { // All files are not supported - aResourceId = deletedFiles > 1 ? - R_SENDUI_MMS_UPLOAD_FILES_NOT_SUPPORTED : - R_SENDUI_MMS_UPLOAD_FILE_NOT_SUPPORTED; - } - else - { // Some files are not supported - aResourceId = R_SENDUI_MMS_UPLOAD_SOME_FILES_DELETED; - } - } - break; - } - } - else // Different kind of errors exist, show general error note - { - if ( totalFileCount == deletedFiles ) - { // Can't send any file - aResourceId = R_SENDUI_MMS_UPLOAD_NONE_CANNOT_INS; - } - else - { // Some files can be send - aResourceId = R_SENDUI_MMS_UPLOAD_SOME_INSERTED; - } - } - } - -// ----------------------------------------------------------------------------- -// CSendUiFileRightsEngine::ResolveDrmQuery -// ----------------------------------------------------------------------------- -// -void CSendUiFileRightsEngine::ResolveDrmQuery( - TUid aServiceId, - TUint& aResourceId ) - { - TUint totalFileCount = iValidationResults[ESenduiIndexTotalCount]; - TUint drmProtectedFiles = iInvalidationReason[ ESenduiIndexDrmFLOrCCL ]; - TUint drmSdFiles = iValidationResults[ ESenduiIndexDrmSD ]; - TUint unprotectedFiles = totalFileCount - drmProtectedFiles - drmSdFiles; - - if ( unprotectedFiles > 0 ) - { // Some DRM SD protected files and unprotected files - // Different query for direct MMS upload service - if ( aServiceId == KMmsDirectUpload ) - { - aResourceId = R_SENDUI_MMS_UPLOAD_DRM_SOME_SD; - } - else - { - aResourceId = R_SENDUI_DRM_SEVERAL_DISTRUTABLE; - } - } - else - { // Only DRM protected files - // Different query for direct MMS upload service - if ( aServiceId == KMmsDirectUpload || - aServiceId == KMmsIndirectUpload ) - { - aResourceId = drmSdFiles > 1 ? - R_SENDUI_MMS_UPLOAD_DRM_MANY_SD : - R_SENDUI_MMS_UPLOAD_DRM_ONE_SD; - } - else - { - aResourceId = drmSdFiles > 1 ? - R_SENDUI_DRM_MANY_SD_ITEMS : - R_SENDUI_DRM_SINGLE_DISTRUTABLE; - } - } - } - -// ----------------------------------------------------------------------------- -// CSendUiFileRightsEngine::ShowErrorNotificationL -// ----------------------------------------------------------------------------- -// -void CSendUiFileRightsEngine::ShowErrorNotificationL( - TUint aResourceId, - TFREErrorNoteType aErrorNoteType, - TUint aValueForNote ) const - { - switch ( aErrorNoteType ) - { - case EErrorNote: - { - ShowErrorNoteL( aResourceId ); - break; - } - case EInformationNote: - { - ShowInformationNoteL( aResourceId ); - break; - } - case EConfirmationQuery: - { - ShowConfirmationQueryL( - aResourceId, - R_SENDUI_CONFIRMABLE_INFO, - aValueForNote ); - break; - } - default: // Shouldn't end up here - break; - } - } - -// ----------------------------------------------------------------------------- -// CSendUiFileRightsEngine::ShowErrorNoteL -// ----------------------------------------------------------------------------- -// -void CSendUiFileRightsEngine::ShowErrorNoteL( TUint aTextResourceId ) const - { - // Get text to be shown - HBufC* text = StringLoader::LoadLC( aTextResourceId ); - - // Create the note and show it - CAknErrorNote* note = new (ELeave) CAknErrorNote(ETrue); - note->ExecuteLD( text->Des() ); - - CleanupStack::PopAndDestroy( text ); // text - } - -// ----------------------------------------------------------------------------- -// CSendUiFileRightsEngine::ShowConfirmationQueryL -// ----------------------------------------------------------------------------- -// -TBool CSendUiFileRightsEngine::ShowConfirmationQueryL( - TUint aTextResourceId, - TUint aNoteResourceId, - TUint aValueForNote ) const - { - HBufC* text = NULL; - - if ( aValueForNote == 0 ) - { - text = StringLoader::LoadLC( aTextResourceId ); - } - else - { - text = StringLoader::LoadLC( aTextResourceId, aValueForNote ); - } - - CAknQueryDialog* dlg = CAknQueryDialog::NewL(); - - TInt result = dlg->ExecuteLD( aNoteResourceId, *text ); - - CleanupStack::PopAndDestroy( text ); - - // ETrue, if Yes or Selection key were pressed - // Otherwise EFalse - return result; - } - -// ----------------------------------------------------------------------------- -// CSendUiFileRightsEngine::ShowInformationNoteL -// ----------------------------------------------------------------------------- -// -EXPORT_C void CSendUiFileRightsEngine::ShowInformationNoteL( - TUint aTextResourceId ) const - { - // Get text to be shown - HBufC* text = StringLoader::LoadLC( aTextResourceId ); - - // Create the note and show it - CAknInformationNote* note = new (ELeave) CAknInformationNote( ETrue ); - note->ExecuteLD( text->Des() ); - - CleanupStack::PopAndDestroy( text ); // text - } - -// ----------------------------------------------------------------------------- -// CSendUiFileRightsEngine::CleanupImplArray -// ----------------------------------------------------------------------------- -// -void CSendUiFileRightsEngine::CleanupImplArray( TAny* aAny ) - { - RImplInfoPtrArray* implArray = - reinterpret_cast( aAny ); - implArray->ResetAndDestroy(); - implArray->Close(); - } - - -// End of File