--- 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 <SendUiConsts.h>
-#include "SendUiDataUtils.h"
-
-#include <MsgMedia.hrh>
-#include <MsgMediaResolver.h> // Msg Media Resolver
-#include <MmsConformance.h> // MMS Conformance
-
-#include <Sendnorm.rsg>
-#include <AknQueryDialog.h> // Query dialog
-#include <aknnotewrappers.h> // Note dialog
-#include <stringresourcereader.h> // String Resource Reader
-#include <StringLoader.h> // Stringloader
-#include <data_caging_path_literals.hrh>
-#include <mmsconst.h>
-#include <fileprotectionresolver.h>
-#include <VideoConversionApi.h>
-#include <MsgMimeTypes.h>
-#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<CSendUiAttachment>* 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<CSendUiAttachment>* 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<CSendUiAttachment>* 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<RImplInfoPtrArray*>( aAny );
- implArray->ResetAndDestroy();
- implArray->Close();
- }
-
-
-// End of File