messagingfw/msgcommonutils/src/fileprotectionresolver.cpp
changeset 0 8e480a14352b
--- /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