browserutilities/downloadmgr/DownloadMgrUiLib/Src/CDownloadUtils.cpp
changeset 0 dd21522fd290
child 36 0ed94ceaa377
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/downloadmgr/DownloadMgrUiLib/Src/CDownloadUtils.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,502 @@
+/*
+* 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 the License "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:  Supports download related utility functions
+*
+*/
+
+
+
+// INCLUDE FILES
+#include    "CDownloadUtils.h" 
+#include    "UiLibLogger.h"
+#include    <DownloadMgrClient.h>
+#include    <DocumentHandler.h>
+#include    <Oma2Agent.h>
+#include    <DRMCommon.h>
+#include	<apgcli.h>
+#include    <caf/caf.h>
+#include    <utf.h>
+#include    <Browser_Platform_Variant.hrh>
+// LOCAL CONSTANTS AND MACROS
+
+#ifdef BRDO_WML_DISABLED_FF
+_LIT8( KWmlType1, "text/vnd.wap.wml");
+_LIT8( KWmlType2, "text/vnd.wap.wmlc");
+_LIT8( KWmlType3, "application/vnd.wap.wmlscriptc");
+_LIT8( KWmlType4, "application/vnd.wap.wmlc");
+#endif 
+
+
+_LIT8(KAudio, "audio/");
+_LIT8(KVideo, "video/");
+_LIT8(KImage, "image/");
+_LIT8(KFlash, "application/x-shockwave-flash");
+_LIT8(Ksdp, "application/sdp");
+_LIT8(Krng, "application/vnd.nokia.ringing-tone");
+_LIT8(Krn, "application/vnd.rn-realmedia");
+_LIT8(Kpn, "application/x-pn-realmedia");
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CDownloadUtils::CDownloadUtils
+// -----------------------------------------------------------------------------
+//
+CDownloadUtils::CDownloadUtils() 
+    {
+    }
+    
+// -----------------------------------------------------------------------------
+// CDownloadUtils::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CDownloadUtils::ConstructL()
+    {
+    CLOG_ENTERFN("CDownloadUtils::ConstructL()");
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadUtils::NewL
+// -----------------------------------------------------------------------------
+//
+CDownloadUtils* CDownloadUtils::NewL()
+    {
+    CDownloadUtils* self = new ( ELeave ) CDownloadUtils();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+// Destructor
+CDownloadUtils::~CDownloadUtils()
+    {
+    delete iMimeType;
+    CLOG_WRITE(" iMimeType OK");
+    delete iContentURI;
+    CLOG_WRITE(" iContentURI OK");
+    }
+    
+
+// -----------------------------------------------------------------------------
+// CDownloadUtils::DrmDownloadL
+// -----------------------------------------------------------------------------
+//
+TBool CDownloadUtils::DrmDownloadL( RHttpDownload& aDownload )
+    {
+    CLOG_ENTERFN("CDownloadUtils::DrmDownloadL");
+
+    TBool isDrmDownload( EFalse );
+    HBufC8* contentType = HBufC8::NewLC( KMaxContentTypeLength );
+    TPtr8 temp( contentType->Des() );
+    User::LeaveIfError( aDownload.GetStringAttribute( EDlAttrContentType, temp ) );
+    CLOG_WRITE(" EDlAttrContentType got");
+    if( !contentType->Compare(KOma1DrmMessageContentType) ||
+        !contentType->Compare(KOma1DcfContentType) ||
+        !contentType->Compare(KOma2DcfContentType) )
+        {
+        isDrmDownload = ETrue;
+        }
+    CleanupStack::PopAndDestroy( contentType );
+    
+    CLOG_WRITE_FORMAT(" ret: %d",isDrmDownload);
+    CLOG_LEAVEFN("CDownloadUtils::DrmDownloadL");
+    return isDrmDownload;
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadUtils::DrmRightsOnThePhoneL
+// -----------------------------------------------------------------------------
+//
+TBool CDownloadUtils::DrmRightsOnThePhoneL
+    ( RHttpDownload& aDownload, TBool& aPreviewRights ) const
+    {
+    CLOG_ENTERFN("CDownloadUtils::DrmRightsOnThePhoneL");
+
+    TBool drmRightsOnThePhone( EFalse );
+    
+    DRMCommon* drmCommon = DRMCommon::NewL();
+    CLOG_WRITE(" DRMCommon::NewL OK");
+    CleanupStack::PushL( drmCommon );
+    User::LeaveIfError( drmCommon->Connect() );
+    CLOG_WRITE(" Connect OK");
+
+    HBufC* fileName = HBufC::NewLC( KMaxPath );
+    TPtr fileNamePtr = fileName->Des();
+    User::LeaveIfError
+        ( aDownload.GetStringAttribute( EDlAttrDestFilename, fileNamePtr ) );
+    CLOG_WRITE_FORMAT(" EDlAttrDestFilename: %S",&fileNamePtr);
+
+    RPointerArray<CDRMRights>* rightsList(0);
+    drmCommon->GetDetailedFileRights( *fileName, rightsList ); // Return val. ignored.
+    // We are interested in if there is at least one right:
+    if ( rightsList )
+        {
+        // BEGIN LEAVE safety: No LEAVE allowed!
+        TInt rightsCnt = rightsList->Count();
+        CLOG_WRITE_FORMAT(" rightsCnt: %d",rightsCnt);
+        for ( TInt i=0; i<rightsCnt; ++i )
+            {
+            // Check: at least one right must be valid
+            CDRMRights* r = (*rightsList)[i];
+            TUint32 constraintSpec( 0 );
+            CDRMRights::TRestriction restriction;
+            CDRMRights::TExpiration expiration;
+            TUint32 constType;
+            TInt infoPri = r->GetRightsInfo( constraintSpec, restriction, expiration, constType );
+            CLOG_WRITE_FORMAT(" infoPri: %d",infoPri);
+            if ( infoPri != CDRMRights::ENoRights )
+                {
+                // Right must be valid
+                if ( expiration == CDRMRights::EValidRights )
+                    {
+                    drmRightsOnThePhone = ETrue;
+                    // Set output parameter
+                    aPreviewRights = ( restriction == CDRMRights::EPreviewRights );
+                    // We found the first, we are not interested in others
+                    break;
+                    }
+                }
+            }
+        // END LEAVE safety: No LEAVE allowed!
+            
+        rightsList->Close();
+        delete rightsList;
+        rightsList = 0;
+        }
+    
+    CleanupStack::PopAndDestroy( fileName );
+    CleanupStack::PopAndDestroy( drmCommon );
+    
+    CLOG_WRITE_FORMAT(" ret: %d",drmRightsOnThePhone);
+    CLOG_WRITE_FORMAT(" aPreviewRights: %d",aPreviewRights);
+    CLOG_LEAVEFN("CDownloadUtils::DrmRightsOnThePhoneL");
+    return drmRightsOnThePhone;
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadUtils::IsContentTypeSupportedL
+// -----------------------------------------------------------------------------
+//
+TBool CDownloadUtils::IsContentTypeSupportedL( RHttpDownload& aDownload )
+    {
+    TBool supported = EFalse;
+    
+    HBufC8* contentType = ContentTypeL( aDownload, ETrue );
+    CleanupStack::PushL( contentType );
+
+    // if we get content-type that appears to be SIS (not SISx) type, may be due to
+    // misconfigured server: change content-type to octet-stream to allow
+    // app installer to make decision if supported or not
+    if( contentType->Find( KSisFileMimeType ) != KErrNotFound )
+        {
+        contentType->Des().Copy( KOctetStreamMimeType );
+        }
+
+    supported = IsContentTypeSupportedL( aDownload, *contentType );
+
+    CleanupStack::PopAndDestroy( contentType );
+
+    return supported;
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadUtils::IsContentTypeSupportedL
+// -----------------------------------------------------------------------------
+//
+TBool CDownloadUtils::IsContentTypeSupportedL( const TDesC8& aContentType )
+    {
+    if ( aContentType.Length() == 0 )
+        {
+        return EFalse;
+        }
+#ifdef BRDO_WML_DISABLED_FF
+    else if ( !aContentType.Compare( KWmlType1() ) || !aContentType.Compare( KWmlType2() )
+           || aContentType.Compare( KWmlType3() ) || !aContentType.Compare( KWmlType4() ) )
+        {
+    	return EFalse; 
+        }
+#endif 
+    else
+        {
+        TBool canOpen( EFalse );
+        CDocumentHandler* docHandler = CDocumentHandler::NewLC();
+        TRAPD( err, canOpen = docHandler->CanOpenL( TDataType( aContentType ) ) );
+        CleanupStack::PopAndDestroy( docHandler ); // docHandler
+
+        if ( !(aContentType.Compare(KOma2RoContentType)) || !(aContentType.Compare(KOma2ProtectedRoType))
+            || !(aContentType.Compare(KOma2TriggerContentType)) )
+            {
+            canOpen = EFalse;
+            }
+            
+        if ( err != KErrNone ) 
+            {
+            if ( err == KMimeNotSupported ) 
+                {
+                canOpen = EFalse; 
+                }
+            else 
+                {
+                User::Leave( err ); 
+                }
+            }
+        return canOpen;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadUtils::IsContentTypeSupportedL
+// -----------------------------------------------------------------------------
+//
+TBool CDownloadUtils::IsContentTypeSupportedL( RHttpDownload& aDownload, const TDesC8& aContentType )
+    {
+    if ( aContentType.Length() == 0 )
+        {
+        return EFalse;
+        }
+#ifdef BRDO_WML_DISABLED_FF
+    else if ( !aContentType.Compare(KWmlType1()) || !aContentType.Compare(KWmlType2())
+           || !aContentType.Compare(KWmlType3()) || !aContentType.Compare(KWmlType4()) )
+        {
+    	return EFalse; 
+        }
+#endif         
+    else
+        {
+        TBool canOpen( EFalse );
+        CDocumentHandler* docHandler = CDocumentHandler::NewLC();
+        TRAPD( err, canOpen = docHandler->CanOpenL( TDataType( aContentType ) ) );
+        if ( err == KMimeNotSupported )
+            {
+			      TUint8* contentTypeString = NULL;
+			      FindContentTypeFromFileL(aDownload, contentTypeString);
+			      if (contentTypeString != NULL)
+				        {
+                TRAPD( err1, canOpen = docHandler->CanOpenL( TDataType( TPtrC8(contentTypeString) ) ) );
+
+				        if ( err1 == KMimeNotSupported )
+                    {
+					          canOpen = EFalse;
+                    delete contentTypeString;
+					          }
+				        else if (err1 == KErrNone)
+                    {
+                    // Setting Download Content type to a recognized one
+                    aDownload.SetStringAttribute( EDlAttrContentType, TPtrC8(contentTypeString) );
+                    delete contentTypeString;
+					          canOpen = ETrue;
+					          }
+				       else
+					         {
+                   delete contentTypeString;
+					         User::Leave( err );
+					          }
+				       }
+            }
+        else
+            {
+            if (err != KErrNone )
+                {
+                User::Leave( err ); 
+                }
+            }
+
+		    CleanupStack::PopAndDestroy(docHandler ); // docHandler
+        return canOpen;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CDownloadUtils::ContentTypeL
+// -----------------------------------------------------------------------------
+//
+HBufC8* CDownloadUtils::ContentTypeL
+    ( RHttpDownload& aDownload, TBool aDrmResolve, TInt mediaObjectIndex )
+    {
+    CLOG_ENTERFN("CDownloadUtils::ContentTypeL");
+    
+    HBufC8* retContentType = NULL;
+    TInt32 numMediaObjects = 0;
+    User::LeaveIfError( aDownload.GetIntAttribute( EDlAttrNumMediaObjects, numMediaObjects ) );
+    
+     if ( aDrmResolve && DrmDownloadL( aDownload ) )
+        {
+        HBufC* fileName = HBufC::NewLC( KMaxPath );
+        TPtr fileNamePtr = fileName->Des();
+        // Check if this is album
+        if ((numMediaObjects > KFirstMoIndex) && mediaObjectIndex)
+            {
+            User::LeaveIfError
+                ( aDownload.GetStringAttribute( EDlAttrDestFilename, mediaObjectIndex, fileNamePtr ) );
+            }
+           else
+            {
+            User::LeaveIfError
+                ( aDownload.GetStringAttribute( EDlAttrDestFilename, fileNamePtr ) );
+            }
+        CLOG_WRITE_FORMAT(" EDlAttrDestFilename: %S",&fileNamePtr);
+
+		if(fileNamePtr.Compare(KNullDesC))
+            {
+		    using namespace ContentAccess;
+
+		    CContent* content(NULL);
+		    TRAPD( err, content = CContent::NewL(fileNamePtr,EContentShareReadWrite) );
+            CleanupStack::PushL(content);
+
+            /*
+            If file not present CContent::NewL() leaves with KErrNotFound.
+            Need to ignore this error because in case of DRM paused downloads the partial downloaded file will be deleted.
+            */
+
+		    if(err != KErrNotFound)
+    		    {
+                User::LeaveIfError( err );
+
+				HBufC* mimeType = HBufC::NewL(256);
+                TPtr ptr = mimeType->Des();
+				TInt fileInfoErr = content->GetStringAttribute(EMimeType,ptr);
+				TBuf8<256> buf8;
+				CnvUtfConverter::ConvertFromUnicodeToUtf8(buf8,ptr);
+				iMimeType = buf8.Alloc();
+				
+				if ( !fileInfoErr )
+					{
+					retContentType = iMimeType;
+					iMimeType = NULL;
+					}
+                
+				// Free temp storage
+				delete iMimeType;
+				iMimeType = NULL;
+				delete iContentURI;
+				iContentURI = NULL;
+    		    }
+            CleanupStack::PopAndDestroy(content);
+		    }
+		CleanupStack::PopAndDestroy( fileName );    
+        }        
+
+    // If it's not DRM or it is, but the content type could not been got
+    if ( retContentType == NULL )
+        {
+        HBufC8* contentType = HBufC8::NewLC( KMaxContentTypeLength );
+        TPtr8 temp( contentType->Des() );
+
+        TInt err = 0;
+        // Check if this is album
+        if ((numMediaObjects > KFirstMoIndex) && mediaObjectIndex)
+            {
+            err = aDownload.GetStringAttribute( EDlAttrContentType, mediaObjectIndex, temp );
+            }
+        else
+            {
+            err = aDownload.GetStringAttribute( EDlAttrContentType, temp );
+            }
+        CLOG_WRITE_FORMAT(" err: %d",err);
+        if ( err != KErrNone && err != KErrNotFound )
+            {
+            User::LeaveIfError( err );
+            }
+        if ( err == KErrNotFound )
+            {
+            contentType->Des().Copy( KNullDesC );
+            }
+
+        CleanupStack::Pop( contentType );
+        retContentType = contentType;
+        contentType = NULL;
+        }
+    
+    CLOG_LEAVEFN("CDownloadUtils::ContentTypeL");
+    return retContentType;
+    }
+    
+    
+// -----------------------------------------------------------------------------
+// CDownloadUtils::FindContentTypeFromFileL
+// -----------------------------------------------------------------------------
+//
+void CDownloadUtils::FindContentTypeFromFileL( RHttpDownload& aDownload, TUint8*& aContentTypeString)
+{
+    TDataRecognitionResult dataType;
+    RApaLsSession apaSession;
+    TInt ret;
+
+    User::LeaveIfError(apaSession.Connect());
+
+    // Create a buffer to hold data from the file
+	  TInt bufferSize = 0;
+    TInt seekPosition = 0;
+	  apaSession.GetMaxDataBufSize(bufferSize);
+	  HBufC8* buffer = HBufC8::NewLC(bufferSize);
+	  TPtr8 buf = buffer->Des();
+
+	  RFile file;
+    HBufC* fileName = HBufC::NewLC( KMaxPath );
+    TPtr fileNamePtr = fileName->Des();
+    User::LeaveIfError
+        ( aDownload.GetStringAttribute( EDlAttrDestFilename, fileNamePtr ) );
+
+    RFs fs;
+    User::LeaveIfError( fs.Connect() );
+    CleanupClosePushL( fs );
+
+    User::LeaveIfError( file.Open( fs, fileNamePtr, 
+										EFileShareAny |
+										EFileRead ) );
+
+
+	  // Find current file pointer position
+    file.Seek(ESeekStart, seekPosition);
+	  // Read from file
+	  file.Read(buf);
+	  // return file pointer to original position
+    file.Seek(ESeekStart, seekPosition);
+    // Ask the application architecture to find the file type
+    ret = apaSession.RecognizeData(fileNamePtr, buf, dataType);
+    apaSession.Close();
+
+	  CleanupStack::PopAndDestroy(3); //fs, fileName, buffer
+    
+    if (ret == KErrNone &&
+        (dataType.iConfidence == CApaDataRecognizerType::ECertain) ||
+        (dataType.iConfidence == CApaDataRecognizerType::EProbable))
+        {
+        // If the file type was found, try to match it to a known file type
+        TPtrC8 mimeTypePtr = dataType.iDataType.Des8();
+        TInt len = mimeTypePtr.Length() + 1;
+        aContentTypeString = new(ELeave) TUint8 [len];
+
+        TPtr8 contentTypeStringPtr(aContentTypeString, len);
+        contentTypeStringPtr.Copy(mimeTypePtr);
+        contentTypeStringPtr.ZeroTerminate();
+        return;
+        }
+}
+
+// -----------------------------------------------------------------------------
+// CDownloadUtils::IsGallerySupported
+// -----------------------------------------------------------------------------
+//
+
+TBool  CDownloadUtils::IsGallerySupported(const TDesC8& aContentType)
+{
+	
+	TBool found (aContentType.Find(KAudio)==0 || aContentType.Find(KVideo)==0 || aContentType.Find(KImage)==0 || aContentType.Find(KFlash)==0 ||
+	            aContentType.Find(Ksdp)==0 || aContentType.Find(Krng)==0 || aContentType.Find(Krn)==0 || aContentType.Find(Kpn)==0);
+
+	return found;
+}