diff -r 000000000000 -r 7f85d04be362 upnpsharing/upnpdlnaprofiler/src/upnpdlnaprofiler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnpsharing/upnpdlnaprofiler/src/upnpdlnaprofiler.cpp Thu Dec 17 08:52:00 2009 +0200 @@ -0,0 +1,305 @@ +/* +* Copyright (c) 2006-2007 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: Implementation file of CUpnpDlnaProfiler class that is used +* for resolving a DLNA profile of a given file. +* +*/ + + + + + + +// system includes +#include // RFile +#include // RApaLsSession + +// user includes +#include "upnpdlnaprofiler.h" +#include "upnpprofiler.h" +#include "upnpaudiosolverbase.h" +#include "upnpavsolverbase.h" +#include "upnpimagesolverbase.h" +#include "upnpresparameters.h" + +_LIT( KComponentLogfile, "dlnaprofiler.txt"); +#include "upnplog.h" + +// constants +// NONE + +// ======== LOCAL FUNCTIONS ======== +// NONE + +// ======== MEMBER FUNCTIONS ======== + +// -------------------------------------------------------------------------- +// CUpnpDlnaProfiler C++ constructor +// -------------------------------------------------------------------------- +// +CUpnpDlnaProfiler::CUpnpDlnaProfiler() + { + __LOG( "[UPnPDlnaProfiler] Constructor" ); + } + + +// -------------------------------------------------------------------------- +// CUpnpDlnaProfiler::ConstructL +// -------------------------------------------------------------------------- +// +void CUpnpDlnaProfiler::ConstructL() + { + __LOG( "[UPnPDlnaProfiler] ConstructL" ); + CUpnpAudioSolverBase* baseAudioSolver = CUpnpAudioSolverBase::NewL(); + iAudioSolvers.AppendL( baseAudioSolver ); + + CUpnpAvSolverBase* baseAvSolver = CUpnpAvSolverBase::NewL(); + iAvSolvers.AppendL( baseAvSolver ); + + CUpnpImageSolverBase* baseImageSolver = CUpnpImageSolverBase::NewL(); + iImageSolvers.AppendL( baseImageSolver ); + } + + +// -------------------------------------------------------------------------- +// CUpnpDlnaProfiler::NewL +// -------------------------------------------------------------------------- +// +EXPORT_C CUpnpDlnaProfiler* CUpnpDlnaProfiler::NewL() + { + __LOG( "[UPnPDlnaProfiler] NewL" ); + CUpnpDlnaProfiler* self = CUpnpDlnaProfiler::NewLC(); + CleanupStack::Pop( self ); + return self; + } + + +// -------------------------------------------------------------------------- +// CUpnpDlnaProfiler::NewLC +// -------------------------------------------------------------------------- +// +EXPORT_C CUpnpDlnaProfiler* CUpnpDlnaProfiler::NewLC() + { + __LOG( "[UPnPDlnaProfiler] NewLC" ); + CUpnpDlnaProfiler* self = new( ELeave ) CUpnpDlnaProfiler; + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + + +// -------------------------------------------------------------------------- +// CUpnpDlnaProfiler destructor +// -------------------------------------------------------------------------- +// +CUpnpDlnaProfiler::~CUpnpDlnaProfiler() + { + __LOG( "[UPnPDlnaProfiler] Destructor" ); + iAudioSolvers.ResetAndDestroy(); + iAudioSolvers.Close(); + + iAvSolvers.ResetAndDestroy(); + iAvSolvers.Close(); + + iImageSolvers.ResetAndDestroy(); + iImageSolvers.Close(); + } + +// -------------------------------------------------------------------------- +// CUpnpDlnaProfiler::SupportedProfilesL +// Returns DlnaProfiles that are supported with currently loaded solver +// plugins. +// -------------------------------------------------------------------------- +// +EXPORT_C TInt CUpnpDlnaProfiler::SupportedProfilesL( + CDesC16ArrayFlat* aProfiles ) const + { + __LOG( "[UPnPDlnaProfiler] SupportedProfilesL" ); + TInt retval = KErrNone; + + if ( !aProfiles ) + { + // Invalid parameter + retval = KErrArgument; + } + else + { + // append all audio profiles recognized + for ( TInt i( iAudioSolvers.Count() - 1 ); i >= 0 ; i-- ) + { + MUpnpProfiler* currentProfiler = iAudioSolvers[i]; + currentProfiler->SupportedProfilesL( aProfiles ); + } + // append all av profiles recognized + for ( TInt i( iAvSolvers.Count() - 1 ); i >= 0 ; i-- ) + { + MUpnpProfiler* currentProfiler = iAvSolvers[i]; + currentProfiler->SupportedProfilesL( aProfiles ); + } + // append all image profiles recognized + for ( TInt i( iImageSolvers.Count() - 1 ); i >= 0 ; i-- ) + { + MUpnpProfiler* currentProfiler = iImageSolvers[i]; + currentProfiler->SupportedProfilesL( aProfiles ); + } + } + + return retval; + } + +// -------------------------------------------------------------------------- +// CUpnpDlnaProfiler::ProfileForFileL +// Resolves the DLNA profile for a file given in aFileName parameter. +// Returns NULL if DLNA profile could not be recognized with currently loaded +// solver plugins. +// -------------------------------------------------------------------------- +// +EXPORT_C HBufC* CUpnpDlnaProfiler::ProfileForFileL( const TDesC& aFilename ) + { + __LOG( "[UPnPDlnaProfiler] ProfileForFileL" ); + // check that aFileName is reasonable + if ( aFilename.Length() <= 0 ) + { + User::Leave( KErrArgument ); + } + + HBufC* retval = NULL; + + // try to open file specified by aFileName + RFs fsSession; + User::LeaveIfError( fsSession.Connect() ); // connect session + CleanupClosePushL( fsSession ); + // without calling ShareProtected() RApaLsSession::RecognizeData + // does not work (leaves with KErrBadHandle). + fsSession.ShareProtected(); + + RFile file; + User::LeaveIfError( file.Open( fsSession, + aFilename, + EFileShareReadersOrWriters|EFileRead ) ); + CleanupClosePushL( file ); + + // Create an AppArc server session for mime type recognition + RApaLsSession sess; + User::LeaveIfError( sess.Connect() ); + CleanupClosePushL( sess ); + + // Try to get mime type from AppArc server + TDataRecognitionResult mimeResult; + User::LeaveIfError( sess.RecognizeData( file, mimeResult ) ); + + // close session handle + CleanupStack::PopAndDestroy( &sess ); + + // Data recognition done. Check results. + HBufC8* mimetype = HBufC8::NewL( mimeResult.iDataType.Des8().Length() ); + mimetype->Des().Append( mimeResult.iDataType.Des8() ); + + if ( mimetype && mimetype->Length() > 0 ) + { + CleanupStack::PushL( mimetype ); + retval = DlnaProfileFromSolversL( aFilename, *mimetype, file ); + CleanupStack::PopAndDestroy( mimetype ); + } + + // close file and filesession handles + CleanupStack::PopAndDestroy( &file ); + CleanupStack::PopAndDestroy( &fsSession ); + + return retval; + } + +// -------------------------------------------------------------------------- +// CUpnpDlnaProfiler::ProfileForFileL +// Resolves the DLNA profile for a file given in aFileName parameter. +// Returns NULL if DLNA profile could not be recognized with currently loaded +// solver plugins. Takes RFile and CUpnpResParameters parameters in order to +// minimize the amount of file opening. +// -------------------------------------------------------------------------- +// +EXPORT_C HBufC* CUpnpDlnaProfiler::ProfileForFileL( + const TDesC& aFilename, + RFile& aFile, + CUpnpResParameters& aParameters ) + { + __LOG( "[UPnPDlnaProfiler] ProfileForFileL" ); + // check that aFileName is reasonable + if ( aFilename.Length() <= 0 || aParameters.MimeType().Length() <= 0 ) + { + User::Leave( KErrArgument ); + } + + HBufC* retval = NULL; + + retval = DlnaProfileFromSolversL( aFilename, + aParameters.MimeType(), + aFile ); + + return retval; + } + +// -------------------------------------------------------------------------- +// CUpnpDlnaProfiler::DlnaProfileFromSolversL +// Checks the mime type given as parameter and forwards the recognition task +// to solver plugins corresponding the mimetype. +// -------------------------------------------------------------------------- +// +HBufC* CUpnpDlnaProfiler::DlnaProfileFromSolversL( + const TDesC& aFilename, + const TDesC8& aMimetype, + RFile& aFile ) + { + __LOG( "[UPnPDlnaProfiler] DlnaProfileFromSolversL" ); + HBufC* retval = NULL; + + TPtrC8 mediatype = aMimetype.Left( KMimeStartLength ); + if ( mediatype.Compare( KAudio() ) == 0 ) + { + for ( TInt i( iAudioSolvers.Count() - 1 ); i >= 0 && !retval ; i-- ) + { + MUpnpProfiler* currentProfiler = iAudioSolvers[i]; + retval = currentProfiler->ProfileForFileL( aFilename, + aMimetype, + aFile ); + } + } + else if ( mediatype.Compare( KVideo() ) == 0 ) + { + for ( TInt i( iAvSolvers.Count() - 1 ); i >= 0 && !retval ; i-- ) + { + MUpnpProfiler* currentProfiler = iAvSolvers[i]; + retval = currentProfiler->ProfileForFileL( aFilename, + aMimetype, + aFile ); + } + } + else if ( mediatype.Compare( KImage() ) == 0 ) + { + for ( TInt i( iImageSolvers.Count() - 1 ); i >= 0 && !retval ; i-- ) + { + MUpnpProfiler* currentProfiler = iImageSolvers[i]; + retval = currentProfiler->ProfileForFileL( aFilename, + aMimetype, + aFile ); + } + } + else + { + retval = NULL; + } + + return retval; + } + +// end of file