upnpsharing/upnpdlnaprofiler/src/upnpdlnaprofiler.cpp
changeset 0 7f85d04be362
--- /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 <f32file.h>     // RFile
+#include <apgcli.h>      // 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