diff -r c84cf270c54f -r 92ab7f8d0eab phoneapp/phoneringingtoneplayer/src/cphoneringingtone.cpp --- /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 +#include +#include +#include +#include +#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