mmappcomponents/harvester/metadataextractor/src/mpxfileinfoutility.cpp
changeset 0 a2952bb97e68
child 12 51035f0751c2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmappcomponents/harvester/metadataextractor/src/mpxfileinfoutility.cpp	Thu Dec 17 08:55:47 2009 +0200
@@ -0,0 +1,386 @@
+/*
+* Copyright (c) 2005 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:  This class is responsible for reading file info
+*  Version     : %version: da1mmcf#5.1.3.1.6 % << Don't touch! Updated by Synergy at check-out.
+*
+*  Copyright © 2005 Nokia. All rights reserved.
+*/
+
+
+// INCLUDE FILES
+#include <mmf/common/mmfstandardcustomcommands.h>
+#include <mmf/server/mmffile.h>
+#include <mmf/common/mmcaf.h>
+#include <mpxlog.h>
+#include "mpxfileinfoutility.h"
+using namespace ContentAccess;
+
+// CONSTANTS
+const TInt KMCExpandSize = 100;
+
+// ============================ MEMBER FUNCTIONS ==============================
+
+// ----------------------------------------------------------------------------
+// Two-phased constructor.
+// ----------------------------------------------------------------------------
+//
+CMPXFileInfoUtility* CMPXFileInfoUtility::NewL()
+    {
+    CMPXFileInfoUtility* self = NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// Two-phased constructor, leave object pointer in the cleanup stack
+// ----------------------------------------------------------------------------
+//
+CMPXFileInfoUtility* CMPXFileInfoUtility::NewLC()
+    {
+    CMPXFileInfoUtility* self = new (ELeave) CMPXFileInfoUtility();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// C++ default constructor can NOT contain any code, that might leave
+// ----------------------------------------------------------------------------
+//
+CMPXFileInfoUtility::CMPXFileInfoUtility(): iCurrentControllerUid(NULL)
+    {
+    }
+
+// Destructor
+CMPXFileInfoUtility::~CMPXFileInfoUtility()
+    {
+    iAudioControllers.ResetAndDestroy();
+    //Reset();
+    // Close all MMF controllers in the cache
+    TPtrHashMapIter<TUint32, RMMFController> iter(iMMFControllers);
+    RMMFController* controller;
+    
+    while((controller = const_cast<RMMFController*>(iter.NextValue())) != NULL)
+    	{
+    	controller->Close();
+    	}
+    
+    iMMFControllers.ResetAndDestroy();
+    iMMFControllers.Close();
+    
+    // delete non cached controller
+    if(iController)
+        {
+        iController->Close();
+        delete iController;
+        iController = NULL;
+        }
+    
+    REComSession::FinalClose();
+    }
+
+// ----------------------------------------------------------------------------
+// Symbian 2nd phase constructor can leave.
+// ----------------------------------------------------------------------------
+//
+void CMPXFileInfoUtility::ConstructL()
+    {
+    CreateAudioFormatsArrayL();
+    }
+
+// ----------------------------------------------------------------------------
+// Open a file using audio controller
+// ----------------------------------------------------------------------------
+//
+void CMPXFileInfoUtility::OpenFileL(RFile& aFile,
+                                    const TDesC& aMimeType /*= KNullDesC*/)
+    {
+    MPX_DEBUG1("CMPXFileInfoUtility::OpenFileL()");
+    Reset();
+
+    HBufC* fileNameBuf = HBufC::NewLC(KMaxFileName);
+    TPtr fileName = fileNameBuf->Des();
+    aFile.FullName(fileName);
+
+    TUid pluginUid;
+    FindController(fileName, aMimeType, pluginUid);
+    CleanupStack::PopAndDestroy(fileNameBuf);
+
+    // Open a new controller
+    OpenControllerL(pluginUid);
+    TMMFMessageDestination dataSource;
+
+    TPtrC defaultID(KDefaultContentObject);
+    TBool enableUI = EFalse;
+
+    //Code taken from TMMFileHandleSource
+
+
+    //{//build custom mmf message packet
+     //based on CMMFileSourceSink::DoCreateFileHandleSourceConfigDataL()
+    CBufFlat* buf = CBufFlat::NewL(KMCExpandSize);
+    CleanupStack::PushL(buf);
+    RBufWriteStream stream;
+    stream.Open(*buf);
+    CleanupClosePushL(stream);
+
+    TPckgBuf<RFile*> fileptr(&aFile);
+    stream.WriteInt32L(KMMFileHandleSourceUid.iUid);
+    stream.WriteL(fileptr);
+
+    //Code taken from TMMFileHandleSource
+
+    TInt length = 0;
+    //if (defaultID != NULL)
+    length = defaultID.Length();
+    stream.WriteInt32L(length);
+    //if (length>0)
+    stream.WriteL(defaultID);
+
+    stream.WriteInt32L(enableUI);
+
+    stream.CommitL();
+    CleanupStack::PopAndDestroy(&stream);
+    //iSourceSinkData = buf->Ptr(0).AllocL();
+
+    //CleanupStack::PopAndDestroy(buf);
+    //}
+
+    // User::LeaveIfError(iController->Reset());
+    
+   
+   // Add new data source
+    User::LeaveIfError(iController->AddDataSource(KUidMmfFileSource,
+                                                 buf->Ptr(0),
+                                                 dataSource));
+    
+    User::LeaveIfError(iController->AddDataSink(KUidMmfAudioOutput,
+                                               KNullDesC8));
+    CleanupStack::PopAndDestroy(buf);
+    }
+
+// ----------------------------------------------------------------------------
+// Reset file info utility
+// ----------------------------------------------------------------------------
+//
+void CMPXFileInfoUtility::Reset()
+    {
+    // Reset the controller
+    if(iController)
+        {
+        if(iCurrentControllerUid == 0x101FAFB1 || iCurrentControllerUid == 0x10283351
+            || iCurrentControllerUid == 0x10207B65 )
+            {
+            iController->Close();
+            delete iController;
+            iController = NULL;
+            }
+        else
+            {
+           	iController->Reset();
+            }
+    	}
+    
+    }
+
+// ----------------------------------------------------------------------------
+// Get the duration of a song
+// ----------------------------------------------------------------------------
+//
+TTimeIntervalMicroSeconds CMPXFileInfoUtility::Duration()
+    {
+    MPX_DEBUG1("CMPXFileInfoUtility::Duration()");
+    TTimeIntervalMicroSeconds duration;
+    TInt err = iController->GetDuration(duration);
+    if(err != KErrNone)
+        {
+        duration = TInt64(0);
+        }
+    return duration;
+    }
+
+// ----------------------------------------------------------------------------
+// Get the bit rate of a song
+// ----------------------------------------------------------------------------
+//
+TUint CMPXFileInfoUtility::BitRate()
+    {
+    RMMFAudioControllerCustomCommands customCommands(*iController);
+
+    TUint bitRate(0);
+    //Ignore return value, bitRate remain 0 if error
+    customCommands.GetSourceBitRate(bitRate);
+    return bitRate;
+    }
+
+// ----------------------------------------------------------------------------
+// Get the sample rate of a song
+// ----------------------------------------------------------------------------
+//
+TUint CMPXFileInfoUtility::SampleRate()
+    {
+    RMMFAudioControllerCustomCommands  customCommands(*iController);
+
+    TUint sampleRate(0) ;
+    //Ignore return value, sampleRate remain 0 if error
+    customCommands.GetSourceSampleRate(sampleRate);
+    return sampleRate;
+    }
+
+// ----------------------------------------------------------------------------
+// Find a controller based on mime type, then file name
+// ----------------------------------------------------------------------------
+void CMPXFileInfoUtility::FindController(const TDesC& aFileName,
+                                         const TDesC& aMimeType,
+                                         TUid& aUid)
+    {
+    MPX_DEBUG1("CMPXFileInfoUtility::FindControllerL()");
+    TBool found(EFalse);
+    TInt i(0);
+    TInt j(0);
+    TInt count = iAudioControllers.Count();
+
+    // try with MIME type
+    if (aMimeType.Length() > 0)
+        {
+        TBuf8<KMaxDataTypeLength> mimeType;
+        mimeType.Copy(aMimeType);
+        for (i = 0 ; !found && i < count; i++)
+            {
+            RMMFFormatImplInfoArray formats =
+                        iAudioControllers[i]->PlayFormats();
+                for (j = 0; j < formats.Count() ; j++)
+                    {
+                    if (formats[j]->SupportsMimeType(mimeType))
+                        {
+                        aUid = iAudioControllers[i]->Uid();
+                        found = ETrue;
+                        break;
+                        }
+                    }
+            }
+        }
+    // try file extension
+    if (!found)
+        {
+        TParsePtrC parser(aFileName);
+        TBuf8<KMaxFileName> fileExtension;
+        fileExtension.Copy(parser.Ext());
+        for (i = 0 ; !found && i < count; i++)
+            {
+            RMMFFormatImplInfoArray formats =
+                    iAudioControllers[i]->PlayFormats();
+            for (j = 0; j < formats.Count() ; j++)
+                {
+                if (formats[j]->SupportsFileExtension(fileExtension))
+                    {
+                    aUid = iAudioControllers[i]->Uid();
+                    found = ETrue;
+                    break;
+                    }
+                }
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// Open a controller based on file name
+// The Controller Framework APIs are made of three distinct areas: choosing a
+// controller plugin, loading and controlling a controller plugin, and custom
+// commands.
+// ----------------------------------------------------------------------------
+void CMPXFileInfoUtility::OpenControllerL(const TUid& aUid)
+    {
+    MPX_DEBUG1("CMPXFileInfoUtility::OpenControllerL()");
+    
+    // 3gp and helix (wma) do not allow controller caching
+    if(aUid.iUid == 0x101FAFB1 || aUid.iUid == 0x10283351
+        || aUid.iUid == 0x10207B65 )
+        {
+         iCurrentControllerUid = aUid.iUid;
+         TMMFPrioritySettings prioritySettings;
+         prioritySettings.iPriority = EMdaPriorityNormal;
+         prioritySettings.iPref = EMdaPriorityPreferenceTimeAndQuality;
+
+         iController = new (ELeave) RMMFController;
+
+         // Controller loading
+         User::LeaveIfError(iController->Open(aUid, prioritySettings));  
+
+         iCurrentControllerUid = aUid.iUid;
+         return;
+        }
+    
+    // check if we already have controller open for this UID in the cache
+     RMMFController* controller = const_cast<RMMFController*>(iMMFControllers.Find(aUid.iUid));
+
+    if(!controller)
+	    {
+	    // Controller not found from the cache
+	   	
+    	// Allocate and open new controller for this UID
+    	controller = new (ELeave) RMMFController;
+    	CleanupStack::PushL(controller);
+    	
+    	TUint32* key = new (ELeave) TUint32(aUid.iUid);
+    	CleanupStack::PushL(key);
+    // Now instantiate the first controller in the array
+    TMMFPrioritySettings prioritySettings;
+    prioritySettings.iPriority = EMdaPriorityNormal;
+    prioritySettings.iPref = EMdaPriorityPreferenceTimeAndQuality;
+
+	    // Try to open controller
+	    User::LeaveIfError(controller->Open(aUid,
+	                       prioritySettings));
+	    
+	    iMMFControllers.InsertL(key, controller);
+	    
+	    // iMMFController owns the objects now
+	    CleanupStack::Pop(2);
+	    
+	    }
+	
+	iController = controller;
+	iCurrentControllerUid = aUid.iUid;
+                       
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXFileInfoUtility::CreateAudioFormatsArrayL
+// -----------------------------------------------------------------------------
+//
+void CMPXFileInfoUtility::CreateAudioFormatsArrayL()
+    {
+    CMMFControllerPluginSelectionParameters* cSelect =
+            CMMFControllerPluginSelectionParameters::NewLC();
+    CMMFFormatSelectionParameters* fSelect =
+            CMMFFormatSelectionParameters::NewLC();
+    // Set the play and record format selection parameters to be blank.
+    // - format support is only retrieved if requested.
+    cSelect->SetRequiredPlayFormatSupportL(*fSelect);
+    // Set the media ids
+    RArray<TUid> mediaIds;
+    CleanupClosePushL(mediaIds);
+    User::LeaveIfError(mediaIds.Append(KUidMediaTypeAudio));
+    // Get plugins that supports audio only
+    cSelect->SetMediaIdsL( mediaIds,
+            CMMFPluginSelectionParameters::EAllowOnlySuppliedMediaIds );
+    // iAudioControllers contains now all audio plugins that
+    // support at least audio.
+    cSelect->ListImplementationsL(iAudioControllers);
+    // Clean up
+    CleanupStack::PopAndDestroy(3); //fSelect, cSelect, mediaIds
+    }
+
+// End of File