bluetoothengine/btsac/btrcc/src/btrccBrowsingAdapter.cpp
changeset 0 f63038272f30
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/btsac/btrcc/src/btrccBrowsingAdapter.cpp	Mon Jan 18 20:28:57 2010 +0200
@@ -0,0 +1,548 @@
+/*
+* 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:  Browsing adapter between RemCon an MPX Framework. 
+*
+*/
+
+// INCLUDE FILES
+#include <remconinterfaceselector.h>
+#include <mpxcollectionmessagedefs.h>
+#include <mpxmessagegeneraldefs.h>
+#include <mpxmediageneraldefs.h>
+#include <mpxsubscription.h>
+#include <mpxcommandgeneraldefs.h>
+#include <mpxcollectioncommanddefs.h>
+#include <mpxmediacontainerdefs.h>
+#include <e32cmn.h>
+#include <remconmediaerror.h>
+
+#include "btrccBrowsingAdapter.h"
+#include "debug.h"
+
+#ifdef BTRCCTEST_MPXCOLLECTIONSTUB
+#include <stubsrv/mpxcollectionstub.h>
+#endif
+
+
+// MODULE DATA STRUCTURES
+
+// ================= MEMBER FUNCTIONS =======================
+
+// -----------------------------------------------------------------------------
+// CBTRCCBrowsingAdapter::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CBTRCCBrowsingAdapter* CBTRCCBrowsingAdapter::NewL(CRemConInterfaceSelector& aInterfaceSelector)
+    {
+    CBTRCCBrowsingAdapter* self = new (ELeave) CBTRCCBrowsingAdapter();
+    CleanupStack::PushL(self);
+    self->ConstructL(aInterfaceSelector);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CBTRCCBrowsingAdapter::CBTRCCBrowsingAdapter
+// C++ constructor.
+// -----------------------------------------------------------------------------
+//
+CBTRCCBrowsingAdapter::CBTRCCBrowsingAdapter()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CBTRCCBrowsingAdapter::ConstructL
+// Symbian 2nd phase constructor.
+// -----------------------------------------------------------------------------
+//
+void CBTRCCBrowsingAdapter::ConstructL(CRemConInterfaceSelector& aInterfaceSelector)
+    {
+    TRACE_FUNC
+    iMediaBrowseTarget = CRemConDatabaseAwareMediaBrowseTarget::NewL(
+                             aInterfaceSelector, *this, *this, EFalse,
+                             iMlInterface, iNpInterface, iCookie);
+
+#ifdef BTRCCTEST_MPXCOLLECTIONSTUB
+    iCollectionUtility = CMPXCollectionUtilityStubImpl::NewL(this, KMcModeDefault);    
+#else
+    iCollectionUtility = MMPXCollectionUtility::NewL(this, KMcModeDefault);
+#endif
+
+    iCurrentOpenLOp = EOpenLOpOpen;
+    iCollectionUtility->Collection().OpenL(EMPXOpenDefault);
+    }
+
+// -----------------------------------------------------------------------------
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CBTRCCBrowsingAdapter::~CBTRCCBrowsingAdapter()
+    {
+    TRACE_FUNC
+    delete iMediaBrowseTarget;
+    delete iCollectionUtility; 
+    }
+
+// -----------------------------------------------------------------------------
+// CBTRCCBrowsingAdapter::MrcdamlboGetFolderListing
+// -----------------------------------------------------------------------------
+//
+void CBTRCCBrowsingAdapter::MrcdamlboGetFolderListing(TRemConFolderScope aScope,
+        TUint /*aStartItem*/, TUint /*aEndItem*/)
+    {
+    TRACE_FUNC
+
+    // Check that the aScope is in filesystem scope. 
+    if (aScope != EBrowseFolder)
+        {
+        // Not supported. 
+        return; 
+        }
+
+    // ToDo: Check that we don't have any other operation ongoing. 
+    // If we do, put the new operation in queue  
+
+    TInt err = KErrNone;
+    CMPXCollectionPath* path = NULL;
+    TRAP(err, path = iCollectionUtility->Collection().PathL())
+    
+    if(!err)
+        {
+        TRAP(err, path->SelectAllL())
+        }
+    if(!err)
+        {
+        RArray<TMPXAttribute> attrs;
+        attrs.Append( KMPXMediaGeneralId );
+        attrs.Append( KMPXMediaGeneralTitle );
+        TRAP(err, iCollectionUtility->Collection().MediaL(*path, attrs.Array()))        
+        }
+    if(!err)
+        {
+        iCurrentMediaLOp = EMediaLOpFolderListing;
+        }
+    TRACE_INFO((_L("Get folder listing %d"), err))
+
+
+/*    CMPXCollectionPath* path = iCollectionUtility->Collection().PathL();
+    CleanupStack::PushL( path );
+    if ( path->Levels() == KVcxMpxLevelVideos 
+            && path->Count() > aIndex
+            && aIndex >= 0 )
+        {
+        // Marks the item that will be handled
+        path->SelectL( aIndex );
+
+        RArray<TMPXAttribute> dummy; // No need to set this parameter
+        CleanupClosePushL( dummy );
+        iCollectionUtility->Collection().MediaL( *path, dummy.Array() );
+        CleanupStack::PopAndDestroy( &dummy );
+        }
+    CleanupStack::PopAndDestroy( path ); */
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CBTRCCBrowsingAdapter::MrcdamlboGetItem
+// This function is called to request for indicidual item's properties.  
+// -----------------------------------------------------------------------------
+//
+TInt CBTRCCBrowsingAdapter::MrcdamlboGetItem(TRemConFolderScope /*aScope*/,
+        const TRemConItemUid& /*aItemId*/, 
+        TMediaAttributeIter& /*aIter*/, 
+        TUint16 /*aMediaLibraryStateCookie*/)
+    {
+    TRACE_FUNC
+    
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CBTRCCBrowsingAdapter::MrcdamlboFolderUp
+// -----------------------------------------------------------------------------
+//
+void CBTRCCBrowsingAdapter::MrcdamlboFolderUp(TUint16 aMediaLibraryStateCookie)
+    {   
+    TRACE_FUNC
+    if(aMediaLibraryStateCookie == iCookie)
+        {
+        TRAPD( err, iCollectionUtility->Collection().BackL() );
+        if(err)
+            {
+            }
+        // --> HandleOpenL will called
+        }
+    else
+        {
+        
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CBTRCCBrowsingAdapter::MrcdamlboFolderDown
+// -----------------------------------------------------------------------------
+//
+void CBTRCCBrowsingAdapter::MrcdamlboFolderDown(const TRemConItemUid& aFolder,
+        TUint16 aMediaLibraryStateCookie)
+    {
+    TRACE_FUNC
+    if(aMediaLibraryStateCookie == iCookie)
+        {
+        TInt err = KErrNone;
+        CMPXCollectionPath* path = NULL;
+        TRAP( err, path = iCollectionUtility->Collection().PathL() );
+        if(!err)
+            {
+            TMPXItemId index = path->IdOfIndex((TInt)aFolder);
+            if(index != KMPXInvalidItemId)
+                {
+                TRAP( err, iCollectionUtility->Collection().OpenL(index) );
+                // --> HandleOpenL will called.
+                }
+            }
+        }
+    else
+        {
+        
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CBTRCCBrowsingAdapter::MrcdamlboGetPath
+// -----------------------------------------------------------------------------
+//
+void CBTRCCBrowsingAdapter::MrcdamlboGetPath(RPointerArray<HBufC8>& /*aPath*/)
+    {
+    TRACE_FUNC   
+    TInt err = KErrNone;
+    CMPXCollectionPath* browsePath = NULL;
+    CMPXCollectionPath* container = NULL;
+    
+    TRAP( err, browsePath = iCollectionUtility->Collection().PathL() );
+    
+    // Split path into levels until root level is reached.
+    TRAP( err, container = browsePath->ContainerPathL() ); 
+    
+    // Store the path information into received refToPath.
+    // --> do something
+    
+    // Path information stored, inform RemCon
+    //iMlInterface->MrcdamlbGetPathResult(TUint aItemCount, TUint16 aMediaLibraryStateCookie, TInt aResult);
+    
+    delete browsePath;
+    delete container;
+    }
+
+// -----------------------------------------------------------------------------
+// CBTRCCBrowsingAdapter::MrcdanpboGetFolderListing
+// -----------------------------------------------------------------------------
+//
+void CBTRCCBrowsingAdapter::MrcdanpboGetFolderListing(TUint /*aStartItem*/, TUint /*aEndItem*/)
+    {
+    TRACE_FUNC
+    // Use the current path to 
+//    iCollectionUtility->Collection().MediaL(path, aAttrs, )
+    }
+
+// -----------------------------------------------------------------------------
+// CBTRCCBrowsingAdapter::MrcdanpboGetItem
+// -----------------------------------------------------------------------------
+//
+TInt CBTRCCBrowsingAdapter::MrcdanpboGetItem(const TRemConItemUid& /*aItemId*/, TMediaAttributeIter& /*aIter*/, TUint16 /*aMediaLibraryStateCookie*/)
+    {
+    TRACE_FUNC
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CBTRCCBrowsingAdapter::MrcdamlboSearch
+// -----------------------------------------------------------------------------
+//
+void CBTRCCBrowsingAdapter::MrcdamlboSearch(const TDesC8& /*aSearch*/)
+    {
+    TRACE_FUNC
+    }
+
+// -----------------------------------------------------------------------------
+// CBTRCCBrowsingAdapter::HandleCollectionMessage
+// -----------------------------------------------------------------------------
+//
+void CBTRCCBrowsingAdapter::HandleCollectionMessage(CMPXMessage* aMsg, TInt /*aErr*/)
+    {
+    TRACE_FUNC
+    if(iMlInterface && aMsg)
+        {
+        if( aMsg->IsSupported(KMPXMessageMediaGeneralCategory) &&
+            aMsg->IsSupported(KMPXMessageChangeEventType) )
+            {
+            TInt event( aMsg->ValueTObjectL<TInt>( KMPXMessageMediaGeneralCategory ) );
+            TInt op( aMsg->ValueTObjectL<TInt>( KMPXMessageChangeEventType ) );
+
+            if( event == EMPXCollection )
+                {
+                if( op == EMPXItemDeleted ||
+                    op == EMPXItemInserted ||
+                    op == EMPXItemModified )
+                    {
+                    // how cookie is really composed??
+                    iCookie = op;
+                    iMlInterface->MrcdamlbMediaLibraryStateChange(iCookie);
+                    }
+                }
+            }
+        }
+    
+    /* Example from mpxdeletehelper.cpp
+    if( aMessage &&
+        aMessage->IsSupported(KMPXMessageGeneralEvent) &&
+        aMessage->IsSupported(KMPXMessageGeneralType) )
+        {
+        TInt event( aMessage->ValueTObjectL<TInt>( KMPXMessageGeneralEvent ) );
+        TInt op( aMessage->ValueTObjectL<TInt>( KMPXMessageGeneralType ) );
+
+        MPX_DEBUG3( "CMPXDeleteHelper::HandleCollectionMessageL event = %d, type = %d",
+                    event, op );
+
+        if( event == TMPXCollectionMessage::EBroadcastEvent )
+            {
+            if( op == EMcMsgFormatStart ||
+                op == EMcMsgDiskRemoved ||
+                op == EMcMsgUSBMassStorageStart ||
+                op == EMcMsgUSBMTPStart )
+                {
+                iCancelled = ETrue;
+                Cancel();
+                }
+            }
+
+        }*/
+    }
+
+// -----------------------------------------------------------------------------
+// CBTRCCBrowsingAdapter::HandleOpenL
+// -----------------------------------------------------------------------------
+//
+void CBTRCCBrowsingAdapter::HandleOpenL(const CMPXMedia& /*aEntries*/, TInt /*aIndex*/, TBool /*aComplete*/, TInt aError)
+    {
+    // This is called when a folder has been opened. We could store a path here. 
+    TRACE_FUNC
+    if(!aError)
+        {
+        switch(iCurrentOpenLOp)
+            {
+            case EOpenLOpOpen:
+                break;
+            default:
+                break;
+            }
+        }    
+    iCurrentOpenLOp = EOpenLOpIdle;
+    }
+
+// -----------------------------------------------------------------------------
+// CBTRCCBrowsingAdapter::HandleOpenL
+// -----------------------------------------------------------------------------
+//
+void CBTRCCBrowsingAdapter::HandleOpenL(const CMPXCollectionPlaylist& /*aPlaylist*/,TInt /*aError*/)
+    {
+    TRACE_FUNC
+    }
+
+// -----------------------------------------------------------------------------
+// CBTRCCBrowsingAdapter::HandleCommandComplete
+// -----------------------------------------------------------------------------
+//
+void CBTRCCBrowsingAdapter::HandleCommandComplete(CMPXCommand* /*aCommandResult*/, TInt /*aError*/)
+    {
+    TRACE_FUNC
+    }
+
+// -----------------------------------------------------------------------------
+// CBTRCCBrowsingAdapter::HandleCollectionMediaL
+// -----------------------------------------------------------------------------
+//
+void CBTRCCBrowsingAdapter::HandleCollectionMediaL(const CMPXMedia& aMedia, TInt aError)
+    {
+    TRACE_FUNC 
+    RArray<TRemConItem> folderListing; 
+    TInt cookie = 0; 
+    if(!aError)
+        {
+        switch(iCurrentMediaLOp)
+            {
+            case EMediaLOpFolderListing:
+                {
+                TRACE_INFO((_L("CBTRCCBrowsingAdapter::HandleCollectionMediaL, EMediaLOpFolderListing")))
+                
+                TMPXAttribute mediaArrayAttr( KMPXMediaIdContainer, EMPXMediaArrayContents );
+                // Check if there is more than one item in aMedia
+                if( aMedia.IsSupported( mediaArrayAttr ) )
+                    {
+                    TRACE_INFO((_L("CBTRCCBrowsingAdapter::HandleCollectionMediaL, media array is supported.")))
+                    const CMPXMediaArray* mediaArray = aMedia.ValueCObjectL<CMPXMediaArray>( mediaArrayAttr ); 
+                    //User::LeaveIfNull( const_cast<CMPXMediaArray*>( mediaArray ));
+                    
+                    TInt error = KErrNone;
+                    if(mediaArray)
+                        {
+                        for(TInt i = 0; i < mediaArray->Count() ; ++i)
+                            {
+                            CMPXMedia* ptrToElement = mediaArray->AtL(i); 
+                            TMPXAttribute uidAttr(KMPXMediaIdGeneral, EMPXMediaGeneralId);
+                            TMPXAttribute typeAttr(KMPXMediaIdGeneral, EMPXMediaGeneralType);
+                            if( ptrToElement->IsSupported(uidAttr) && ptrToElement->IsSupported(typeAttr) ) 
+                                {
+                                TRemConItem item;  
+                                const TUid& id = ptrToElement->ValueTObjectL<TUid>(uidAttr);
+                                item.iUid = id.iUid;  
+                                const TMPXGeneralType& type = ptrToElement->ValueTObjectL<TMPXGeneralType>(typeAttr);                               
+                                
+                                TRACE_INFO((_L("CBTRCCBrowsingAdapter::HandleCollectionMediaL, id %d"), id))
+                                TRACE_INFO((_L("CBTRCCBrowsingAdapter::HandleCollectionMediaL, type %d"), type))                                
+                                
+                                if(type == EMPXGroup)
+                                    {
+                                    item.iType = ERemConFolderItem;
+                                    }
+                                else if(type == EMPXItem)
+                                    {
+                                    item.iType = ERemConMediaItem; 
+                                    }
+                                else
+                                    {
+                                    continue; // skip appending if the type wasn't folder or item.  
+                                    }
+                                TRACE_INFO((_L("CBTRCCBrowsingAdapter::HandleCollectionMediaL, Append data")))
+                                folderListing.Append(item); 
+                                }
+                            else
+                                {
+                                TRACE_INFO((_L("CBTRCCBrowsingAdapter::HandleCollectionMediaL, Not supported, item index %d."), i))
+                                }
+                            }
+                        TRACE_INFO((_L("CBTRCCBrowsingAdapter::HandleCollectionMediaL, pass media to RemCon")))
+                        
+                        }
+                    else
+                        {
+                        TRACE_INFO((_L("CBTRCCBrowsingAdapter::HandleCollectionMediaL, No media!")))
+                        error = KErrMediaBrowseInvalidOffset;
+                        }
+                    iMlInterface->MrcdamlbFolderListing(folderListing.Array(), cookie, error);
+                    }
+                else
+                    {
+                    TRACE_INFO((_L("CBTRCCBrowsingAdapter::HandleCollectionMediaL, Array Content Not Supported.")))
+                    // "Single" elements should handled separately ??
+                    }                
+                }
+                break;
+            }
+        }
+    else
+        {
+        TRACE_INFO((_L("CBTRCCBrowsingAdapter::HandleCollectionMediaL, error %d"), aError))
+        iMlInterface->MrcdamlbFolderListing(folderListing.Array(), cookie, aError);
+        //HandleErrorL(aError);
+        }
+    folderListing.Close(); 
+    iCurrentMediaLOp = EMediaLOpIdle;
+    }
+
+// -----------------------------------------------------------------------------
+// CBTRCCBrowsingAdapter::SubscribeL
+// -----------------------------------------------------------------------------
+//
+void CBTRCCBrowsingAdapter::SubscribeL()
+    {
+    TRACE_FUNC
+    // Create subscription items
+    CMPXSubscription* subscription( CMPXSubscription::NewL() );
+    CleanupStack::PushL( subscription );
+
+    CMPXSubscriptionItem* subItem1( CMPXSubscriptionItem::NewL() );
+    CleanupStack::PushL( subItem1 );   
+    
+    subItem1->SetTObjectValueL( KMPXMessageCollectionId, KMPXMessageGeneral );
+    subItem1->SetTObjectValueL( KMPXMessageMediaGeneralCategory, EMPXCollection );
+    subItem1->SetTObjectValueL( KMPXMessageChangeEventType, EMPXItemDeleted );
+    subscription->AddItemL( *subItem1 );
+    
+    CMPXSubscriptionItem* subItem2( CMPXSubscriptionItem::CopyL( *subItem1 ));
+    CleanupStack::PushL( subItem2 );
+    subItem2->SetTObjectValueL( KMPXMessageChangeEventType, EMPXItemInserted );
+    subscription->AddItemL( *subItem2 );
+    
+    CMPXSubscriptionItem* subItem3( CMPXSubscriptionItem::CopyL( *subItem1 ));
+    CleanupStack::PushL( subItem3 );
+    subItem3->SetTObjectValueL( KMPXMessageChangeEventType, EMPXItemModified );
+    subscription->AddItemL( *subItem3 );
+    
+    iCollectionUtility->Collection().AddSubscriptionL( *subscription );
+    
+    CleanupStack::PopAndDestroy( subItem3 );
+    CleanupStack::PopAndDestroy( subItem2 );
+    CleanupStack::PopAndDestroy( subItem1 );
+    CleanupStack::PopAndDestroy( subscription );
+    
+    /* Example
+    // Subscribe to only a few messages from collection utility
+    subItem1->SetTObjectValueL( KMPXMessageGeneralId, KMPXMessageGeneral );
+    subItem1->SetTObjectValueL( KMPXMessageGeneralEvent, TMPXCollectionMessage::EBroadcastEvent );
+    subItem1->SetTObjectValueL( KMPXMessageGeneralType, EMcMsgDiskRemoved );
+    subscription->AddItemL( *subItem1 );
+
+    CMPXSubscriptionItem* subItem2( CMPXSubscriptionItem::CopyL( *subItem1 ));
+    CleanupStack::PushL( subItem2 );
+    subItem2->SetTObjectValueL( KMPXMessageGeneralType, EMcMsgUSBMassStorageStart );
+    subscription->AddItemL( *subItem2 );
+    CMPXSubscriptionItem* subItem3( CMPXSubscriptionItem::CopyL( *subItem1 ));
+    CleanupStack::PushL( subItem3 );
+    subItem3->SetTObjectValueL( KMPXMessageGeneralType, EMcMsgUSBMTPStart );
+    subscription->AddItemL( *subItem3 );
+    CMPXSubscriptionItem* subItem4( CMPXSubscriptionItem::CopyL( *subItem1 ));
+    CleanupStack::PushL( subItem4 );
+    subItem4->SetTObjectValueL( KMPXMessageGeneralType, EMcMsgFormatStart );
+    subscription->AddItemL( *subItem4 );
+    CMPXSubscriptionItem* subItem5( CMPXSubscriptionItem::CopyL( *subItem1 ));
+    CleanupStack::PushL( subItem5 );
+    subItem5->SetTObjectValueL( KMPXMessageGeneralType, EMcMsgUSBMassStorageEnd );
+    subscription->AddItemL( *subItem5 );
+    CMPXSubscriptionItem* subItem6( CMPXSubscriptionItem::CopyL( *subItem1 ));
+    CleanupStack::PushL( subItem6 );
+    subItem6->SetTObjectValueL( KMPXMessageGeneralType, EMcMsgUSBMTPEnd );
+    subscription->AddItemL( *subItem6 );
+    CMPXSubscriptionItem* subItem7( CMPXSubscriptionItem::CopyL( *subItem1 ));
+    CleanupStack::PushL( subItem7 );
+    subItem7->SetTObjectValueL( KMPXMessageGeneralType, EMcMsgFormatEnd );
+    subscription->AddItemL( *subItem7 );
+    CMPXSubscriptionItem* subItem8( CMPXSubscriptionItem::NewL() );
+    CleanupStack::PushL( subItem8 );
+    subItem8->SetTObjectValueL( KMPXMessageGeneralId, KMPXMessageGeneral );
+    subItem8->SetTObjectValueL( KMPXMessageGeneralEvent, TMPXCollectionMessage::EPathChanged );
+    subItem8->SetTObjectValueL( KMPXMessageGeneralType, EMcPathChangedByOpen );
+    subItem8->SetTObjectValueL( KMPXMessageGeneralData, EMcItemOpened );
+    subscription->AddItemL( *subItem8 );
+    iCollectionUtility->Collection().AddSubscriptionL( *subscription );
+    CleanupStack::PopAndDestroy( subItem8 );
+    CleanupStack::PopAndDestroy( subItem7 );
+    CleanupStack::PopAndDestroy( subItem6 );
+    CleanupStack::PopAndDestroy( subItem5 );
+    CleanupStack::PopAndDestroy( subItem4 );
+    CleanupStack::PopAndDestroy( subItem3 );
+    CleanupStack::PopAndDestroy( subItem2 );
+    CleanupStack::PopAndDestroy( subItem1 );
+    CleanupStack::PopAndDestroy( subscription ); */    
+    }