--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/msgcommonutils/src/fileprotectionresolver.cpp Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,271 @@
+/*
+* Copyright (c) 2005, 2006 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:
+* Resolves the protection status for a file.
+* Protection checks include:
+* - CommonContenPolicy
+* - OMA DRM
+* - Java SuperD
+*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <e32std.h>
+#include <e32base.h> // CBase
+#include <apmstd.h> // TDataType
+#include <f32file.h> // RFs, RFile, CFileMan
+#include <CommonContentPolicy.h>
+
+#include <Oma2Agent.h> // EFileType
+#include <caf/caf.h>
+
+#include <bldvariant.hrh> // Feature IDs
+
+#include "fileprotectionresolver.h"
+#include "javaprotectionresolver.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+_LIT8( KFileProtMimeJar, "application/java-archive");
+//_LIT8( KFileProtEpocApp, "x-epoc/x-app*" );
+_LIT8( KFileProtWrongSis, "x-epoc/x-app268436505" );
+// CCommonContentPolicy uses 16-bit MIME types
+_LIT16( KFileProtMimeSis, "application/vnd.symbian.install" );
+
+const TInt KMaxContentUriLength = 256;
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+
+// -----------------------------------------------------------------------------
+// Factory
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CFileProtectionResolver* CFileProtectionResolver::NewLC( RFs& aFs )
+ {
+ CFileProtectionResolver* self = new ( ELeave ) CFileProtectionResolver( aFs );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// Factory
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CFileProtectionResolver* CFileProtectionResolver::NewL( RFs& aFs )
+ {
+ CFileProtectionResolver* self = NewLC( aFs );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// C++ constructor
+// -----------------------------------------------------------------------------
+//
+CFileProtectionResolver::CFileProtectionResolver( RFs& aFs ) :
+ iFs( aFs )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CFileProtectionResolver::~CFileProtectionResolver()
+ {
+ delete iClosedContent;
+ }
+
+// -----------------------------------------------------------------------------
+// 2nd phase constructor
+// -----------------------------------------------------------------------------
+//
+void CFileProtectionResolver::ConstructL()
+ {
+ iClosedContent = CCommonContentPolicy::NewL();
+ }
+
+// -----------------------------------------------------------------------------
+// CFileProtectionResolver::CheckDRMStatus
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CFileProtectionResolver::ProtectionStatusL( const TDesC& aFilePath,
+ TDataType& aMimeType )
+ {
+ RFile file;
+ User::LeaveIfError( file.Open( iFs, aFilePath, EFileRead | EFileShareReadersOnly ) );
+ CleanupClosePushL( file );
+ TInt ret = ProtectionStatusL( file, aMimeType );
+ CleanupStack::PopAndDestroy( &file );
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CFileProtectionResolver::CheckDRMStatus
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CFileProtectionResolver::ProtectionStatusL( RFile& aFile,
+ TDataType& aMimeType )
+ {
+ TInt ret( EFileProtNoProtection );
+ HBufC8* contentUri = NULL;
+ TRAPD( err,
+ {
+ ret = ProtectionStatusL( aFile, aMimeType, contentUri );
+ } );
+ delete contentUri;
+ User::LeaveIfError( err );
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CFileProtectionResolver::CheckDRMStatus
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CFileProtectionResolver::ProtectionStatusL( const TDesC& aFilePath,
+ TDataType& aMimeType,
+ HBufC8*& aContentUri )
+ {
+ RFile file;
+ User::LeaveIfError( file.Open( iFs, aFilePath, EFileRead | EFileShareReadersOnly ) );
+ CleanupClosePushL( file );
+ TInt ret = ProtectionStatusL( file, aMimeType, aContentUri );
+ CleanupStack::PopAndDestroy( &file );
+ return ret;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CFileProtectionResolver::CheckDRMStatus
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CFileProtectionResolver::ProtectionStatusL( RFile& aFile,
+ TDataType& aMimeType,
+ HBufC8*& aContentUri )
+ {
+ TInt protection( EFileProtNoProtection );
+ TBuf<KMaxDataTypeLength> temp;
+ temp.Zero();
+ //if ( aMimeType.Des8().MatchF( KFileProtEpocApp ) != KErrNotFound )
+ if ( aMimeType.Des8().CompareF( KFileProtWrongSis ) == 0 )
+ {
+ // Symbian code has not been corrected.
+ // For some sis files it works, for some it returns "x-epoc/x-app268436505"
+ // So we must redefine all "x-epoc/x-app268436505" as "application/vnd.symbian.install"
+ temp.Copy( KFileProtMimeSis );
+ }
+ else
+ {
+ temp.Copy( aMimeType.Des8() );
+ }
+
+ TFileName name;
+ User::LeaveIfError( aFile.Name( name ) );
+ TParsePtrC parse( name );
+
+ if ( iClosedContent->IsClosedType( temp ) ||
+ iClosedContent->IsClosedExtension( parse.Ext() ) )
+ {
+ protection |= EFileProtClosedContent;
+ }
+
+ delete aContentUri; // just in case
+ aContentUri = NULL;
+
+ ContentAccess::CContent* content = ContentAccess::CContent::NewLC( aFile );
+
+ TInt isProtected( 0 );
+ TInt err = content->GetAttribute( ContentAccess::EIsProtected, isProtected );
+ if ( !err && isProtected )
+ {
+ TInt isForwardable( 0 );
+ err = content->GetAttribute( ContentAccess::EIsForwardable, isForwardable );
+ if ( !err && isForwardable )
+ {
+ protection |= EFileProtSuperDistributable;
+ }
+ else
+ {
+ protection |= EFileProtForwardLocked;
+ }
+
+ // Is DRM2
+ TInt drmType( 0 );
+ content->GetAttribute( ContentAccess::EFileType, drmType );
+ if ( drmType == ContentAccess::EOma2Dcf )
+ {
+ protection |= EFileProtDrm2;
+ }
+ else
+ {
+ protection &= (~EFileProtDrm2);
+ }
+
+ HBufC* contentUri = HBufC::NewLC( KMaxContentUriLength );
+ TPtr tempPtr = contentUri->Des();
+ // "EContentID" has the "content uri" we want. Not "EContentURI"!
+ err = content->GetStringAttribute( ContentAccess::EContentID, tempPtr );
+ if ( !err && contentUri->Length() > 0 )
+ {
+ // Convert to 8-bit string
+ aContentUri = HBufC8::NewL( contentUri->Length() );
+ aContentUri->Des().Copy( *contentUri );
+ }
+ else
+ {
+ // If content id cannot be retrieved or is invalid
+ // then the file is treated as an DRM 2 file.
+ protection |= EFileProtDrm2;
+ }
+
+ CleanupStack::PopAndDestroy( contentUri );
+ }
+ else
+ {
+ if ( aMimeType.Des8().CompareF( KFileProtMimeJar ) == 0 )
+ {
+ CJavaProtectionResolver* javaResolver = CJavaProtectionResolver::NewLC( iFs );
+ if ( javaResolver->IsSuperDistributionPackageL( aFile ) )
+ {
+ protection |= EFileProtSuperDistributable;
+ }
+ CleanupStack::PopAndDestroy( javaResolver );
+ }
+ }
+
+ CleanupStack::PopAndDestroy( content );
+ return protection;
+ }
+
+// End of File