phoneapp/phoneringingtoneplayer/src/cphoneringingtone.cpp
changeset 21 92ab7f8d0eab
child 22 6bb1b21d2484
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneapp/phoneringingtoneplayer/src/cphoneringingtone.cpp	Fri Mar 19 09:28:42 2010 +0200
@@ -0,0 +1,457 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+
+// INCLUDE FILES
+#include <apgcli.h>
+#include <DRMHelper.h>
+#include <bldvariant.hrh>
+#include <pathinfo.h>
+#include <ProfileEngineDomainCRKeys.h>
+#include "cphoneringingtone.h"
+#include "cphonecenrepproxy.h"
+#include "phonelogger.h"
+#include "phoneconstants.h"
+#include "phonelogger.h"
+
+// CONSTANTS
+// Rich audio file MIME types
+_LIT(KAac, "audio/aac");
+_LIT(KMp3, "audio/mp3");
+_LIT(KMpeg, "audio/mpeg");
+_LIT(K3gpp, "audio/3gpp");
+_LIT(KMp4, "audio/mp4");
+_LIT(KAmrWb, "audio/amr-wb");
+_LIT(KWavX, "audio/x-wav");
+_LIT(KWav, "audio/wav");
+
+// Rich video file MIME types
+_LIT(KV3gpp, "video/3gpp");
+_LIT(KVMp4, "video/mp4");
+_LIT(KV3gpp2, "video/3gpp2");
+
+// MACROS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingTone::CPhoneRingingTone
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CPhoneRingingTone::CPhoneRingingTone( TBool aDrmInPlayback ) :
+    iDrmInPlayback( aDrmInPlayback )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingTone::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CPhoneRingingTone::ConstructL( const TDesC& aFileName )
+    {
+    iFileName = aFileName.AllocL();
+    
+    GetMaxToneFileSize();
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingTone::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CPhoneRingingTone* CPhoneRingingTone::NewL( 
+    const TDesC& aFileName,
+    TBool aDrmInPlayback )
+    {
+    CPhoneRingingTone* self = new( ELeave ) CPhoneRingingTone(
+        aDrmInPlayback );
+
+    CleanupStack::PushL( self );
+    self->ConstructL( aFileName );
+    CleanupStack::Pop( self );
+    
+    return self;
+    }
+    
+// Destructor
+CPhoneRingingTone::~CPhoneRingingTone()
+    {
+    delete iFileName;
+    delete iMimeType;    
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingTone::SetFileName
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CPhoneRingingTone::SetFileName( const TDesC& aFileName )
+    {
+    delete iFileName;
+    iFileName = NULL;
+    iFileName = aFileName.Alloc();
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingTone::SetVolume
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CPhoneRingingTone::SetVolume( const TInt aVolume )
+    {
+    iVolume = aVolume;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingTone::SetRingingType
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CPhoneRingingTone::SetRingingType( TProfileRingingType aRingingType)
+    {
+    iRingingType = aRingingType;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingTone::Volume
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CPhoneRingingTone::Volume() const
+    {
+    return iVolume;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingTone::RingingType
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TProfileRingingType CPhoneRingingTone::RingingType() const
+    {
+    return iRingingType; 
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingTone::FileName
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+const TDesC& CPhoneRingingTone::FileName() const
+    {
+    // iFileName is never NULL
+    return *iFileName;            
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingTone::SetTtsToneToBePlayed
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CPhoneRingingTone::SetTtsToneToBePlayed( TBool aTtsToneToBePlayed ) 
+    {
+    iTtsToneToBePlayed = aTtsToneToBePlayed;          
+    }
+// -----------------------------------------------------------------------------
+// CPhoneRingingTone::TtsToneToBePlayed
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CPhoneRingingTone::TtsToneToBePlayed() const
+    {
+    
+    return iTtsToneToBePlayed;    
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingTone::MimeType
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+const TDesC& CPhoneRingingTone::MimeType() const
+    {
+    if ( iMimeType )
+        {
+        return *iMimeType;        
+        }
+    else
+        {
+        return KNullDesC;    
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingTone::IsVideoRingingTone
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//    
+TBool CPhoneRingingTone::IsVideoRingingTone()
+    {
+#ifdef RD_VIDEO_AS_RINGING_TONE
+    if ( RefreshMime() != KErrNone  )
+        {
+        // try to handle as audio
+        return EFalse;                
+        }
+
+    TBool isVideo( EFalse );    
+        
+    if ( iMimeType && iMimeType->MatchF( KPhoneRingingToneVideoMime ) != 
+         KErrNotFound )
+        {
+        isVideo = ETrue;
+        }
+    else if ( iMimeType && iMimeType->MatchF( KPhoneRingingToneRealVideoMime ) != 
+              KErrNotFound )
+        {
+        isVideo = ETrue;    
+        }
+    
+    if ( isVideo )
+        {
+        if ( IsFileInRom() && !IsFileInVideoDirectory() )
+            {
+            // For ROM files check also location, because
+            // MIME check is not fully reliable.
+            isVideo = EFalse;        
+            }            
+        }
+    
+    return isVideo;
+#else
+    // if extended security -> refresh MIME
+    if ( iDrmInPlayback )
+        {
+        RefreshMime();            
+        }
+    
+    return EFalse;
+#endif    
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingTone::IsFileDrmProtected
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//    
+TBool CPhoneRingingTone::IsFileDrmProtected() const
+    {
+    const TDesC& type = MimeType();
+        
+    if ( type == KAac  || type == KMp3 || type == KMpeg ||
+         type == K3gpp || type == KMp4 || type == KAmrWb ||
+         type == KWavX || type == KWav || type == KV3gpp || 
+         type == KVMp4 || type == KV3gpp2 )
+        {
+        ContentAccess::CContent* content = NULL;
+        TRAPD( err, content = ContentAccess::CContent::NewL( *iFileName ) );
+        if ( err == KErrNone && content )
+            {
+            TInt drmProtected( 0 );
+            content->GetAttribute( ContentAccess::EIsProtected, drmProtected );
+            delete content;
+            return drmProtected;        
+            }
+        }
+    
+    return ETrue; // Other MIMEs can be played without DRM check.    
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingTone::IsFileInRom
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//    
+TBool CPhoneRingingTone::IsFileInRom() const
+    {
+    TParsePtrC parsedName( *iFileName );
+    
+    // Files on rom are not DRM checked
+    if ( parsedName.Drive().CompareF( KPhoneRingingToneDriveZ ) == 0 )
+        {
+        return ETrue;
+        }
+    else
+        {
+        return EFalse;    
+        }        
+    }    
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingTone::IsFileInVideoDirectory
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CPhoneRingingTone::IsFileInVideoDirectory() const
+    {
+    TParsePtrC parsedName( *iFileName );
+    
+    if ( PathInfo::PathType( parsedName.DriveAndPath() ) == 
+         PathInfo::EVideosPath )
+        {
+        return ETrue;
+        }
+    else
+        {
+        return EFalse;    
+        }    
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingTone::RefreshMime
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CPhoneRingingTone::RefreshMime()
+    {
+    TRAPD( err, RefreshMimeL() );
+    return err;        
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneRingingTone::RefreshMimeL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//    
+void CPhoneRingingTone::RefreshMimeL()
+    {
+    RApaLsSession apaLsSession;
+    User::LeaveIfError( apaLsSession.Connect() );
+    CleanupClosePushL( apaLsSession );
+
+    TUid dummyUid = { 0 };
+    TDataType dataType( dummyUid );
+    
+    User::LeaveIfError(
+        apaLsSession.AppForDocument( *iFileName, dummyUid, dataType ) );
+        
+    CleanupStack::PopAndDestroy(); // CleanupClosePushL
+    
+    delete iMimeType;
+    iMimeType = NULL;
+    iMimeType = dataType.Des().AllocL();
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+TBool CPhoneRingingTone::CheckAndHandleToneSizeLimit()
+    {
+    __LOGMETHODSTARTEND( EPhoneControl, "CPhoneRingingtone::CheckAndHandleToneSizeLimit()" );
+    
+    TBool bValidSize = ETrue;
+ 
+    // If user has somehow managed to get a too large file as ringing tone,
+    // play default tone instead.
+    if ( iToneFileSizeLimitKB )
+        {
+        if ( CheckToneFileSize( FileName(), iToneFileSizeLimitKB) != KErrNone )
+            {
+            bValidSize = EFalse;
+            }            
+        }
+    __PHONELOG1( 
+        EBasic,
+        EPhoneControl, 
+        "CPhoneRingingtone::CheckAndHandleToneSizeLimit - bValidSize(%d)",
+        bValidSize);
+        
+    return bValidSize;
+    }
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+TInt CPhoneRingingTone::CheckToneFileSize( const TDesC& aFile, 
+                                           TInt aSizeLimitKB )
+    {
+    __LOGMETHODSTARTEND( EPhoneControl, "CPhoneRingingtone::CheckToneFileSize()" );
+    //return KErrNone;
+    
+    // Get file size
+    TInt size = 0;
+
+// <-- QT PHONE START -->    
+    RFs fs;   
+    TInt error = fs.Connect();
+    TEntry entry;
+    if ( KErrNone == error )
+        {
+        if (KErrNone == fs.Entry( aFile, entry ))
+            {
+            size = entry.iSize;
+            }    
+            
+        // Check
+        aSizeLimitKB *= Kkilo;
+        if ( aSizeLimitKB  &&  size > aSizeLimitKB )
+            {
+            error = KErrTooBig;
+            }
+        }
+// <-- QT PHONE END -->
+
+    fs.Close();
+    __PHONELOG1( 
+        EBasic,
+        EPhoneControl, 
+        "CPhoneRingingtonePlayer::CheckToneFileSize - size (%d)",
+        size );    
+    return error;
+   
+    }
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void CPhoneRingingTone::GetMaxToneFileSize()
+    {
+    __LOGMETHODSTARTEND( EPhoneControl, "CPhoneRingingtone::GetMaxToneFileSize()" );
+
+// <-- QT PHONE START -->     
+    /*const TInt error = CPhoneCenRepProxy::Instance()->GetInt( 
+            KCRUidProfileEngine,
+            KProEngRingingToneMaxSize,
+            iToneFileSizeLimitKB );*/
+    TInt error(KErrNone);           
+    iToneFileSizeLimitKB = 5000;
+// <-- QT PHONE END -->     
+   
+    if ( error != KErrNone )
+        {
+        iToneFileSizeLimitKB = 0;
+        }
+    if ( iToneFileSizeLimitKB < 0 )
+        {
+        iToneFileSizeLimitKB = 0;
+        }
+  
+    __PHONELOG2( 
+        EBasic,
+        EPhoneControl, 
+        "CPhoneRingingtonePlayer::GetMaxToneFileSize - error (%d), aMaxSizeKB(%d)",
+        error,
+        iToneFileSizeLimitKB );       
+    }
+
+//  End of File