--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpframework/upnpmusicadapter/src/upnpplaylistfiller.cpp Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,312 @@
+/*
+* Copyright (c) 2006 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: Base class for filling an MPX playlist
+*
+*/
+
+
+// INCLUDES
+// System
+#include <escapeutils.h> // for unicode conversion
+
+// upnp utility
+#include "upnpitemutility.h"
+
+// upnp stack api
+#include <upnpobject.h>
+
+// XML framework api
+#include <mpxcollectionplaylist.h>
+#include <mpxmediaarray.h>
+#include <mpxmediageneraldefs.h>
+
+// upnpframework / avcontroller api
+#include "upnpavdevice.h" // for the device
+
+// upnpframeowrk / avcotnroller helper api
+#include "upnpconstantdefs.h" // for KClassAudio
+
+// musicadapter internal
+#include "upnpmusicadapter.h" // for Complete(this)
+#include "upnpplaylistfiller.h"
+
+// debug
+_LIT16( KComponentLogfile, "musicadapter.txt" );
+#include "upnplog.h"
+
+// CONSTANTS
+_LIT16( KUPnPPrefix, "upnp:" );
+_LIT16( KSeparator, "*" );
+const TInt KMaxElementSize = 256; // from UPNP/DLNA
+const TInt KItemListGranularity = 20;
+
+// ======== MEMBER FUNCTIONS ========
+
+// --------------------------------------------------------------------------
+// CUPnPPlayListFiller::NewL
+// 1st phase constructor.
+// --------------------------------------------------------------------------
+//
+EXPORT_C CUPnPPlayListFiller* CUPnPPlayListFiller::NewL()
+ {
+ CUPnPPlayListFiller* self = new(ELeave)
+ CUPnPPlayListFiller();
+ return self;
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPPlayListFiller::CUPnPPlayListFiller
+// Default constructor.
+// --------------------------------------------------------------------------
+//
+CUPnPPlayListFiller::CUPnPPlayListFiller()
+ : iItemList( KItemListGranularity )
+ {
+ iSelectedIndex = 0;
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPPlayListFiller::~CUPnPPlayListFiller
+// Destructor.
+// --------------------------------------------------------------------------
+//
+EXPORT_C CUPnPPlayListFiller::~CUPnPPlayListFiller()
+ {
+ __LOG( "CUPnPPlayListFiller::~CUPnPPlayListFiller" );
+
+ iItemList.Reset();
+ delete iDeviceUid;
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPPlayListFiller::InsertObjectL
+// Fill track data into the playlist
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CUPnPPlayListFiller::InsertObjectL(
+ const CUpnpAVDevice& aMediaServer,
+ const CUpnpObject& aObject )
+ {
+ if ( !iSourceDevice )
+ {
+ iSourceDevice = &aMediaServer;
+ iDeviceUid = HBufC::NewL( aMediaServer.Uuid().Length() );
+ iDeviceUid->Des().Copy( aMediaServer.Uuid() );
+ }
+ else
+ {
+ // we only support playlists from a single device.
+ __ASSERTD( &aMediaServer == iSourceDevice , __FILE__, __LINE__ );
+ }
+
+ iItemList.AppendL( &aObject );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPPlayListFiller::SetSelectedIndex
+// Sets the index of pre-selected item
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CUPnPPlayListFiller::SetSelectedIndex(
+ TInt aSelectedIndex )
+ {
+ __ASSERTD( aSelectedIndex >= 0, __FILE__, __LINE__ );
+ __ASSERTD( aSelectedIndex < iItemList.Count(), __FILE__, __LINE__ );
+ iSelectedIndex = aSelectedIndex;
+ }
+
+
+// --------------------------------------------------------------------------
+// CUPnPPlayListFiller::FillL
+// Fill track data into the playlist
+// --------------------------------------------------------------------------
+//
+void CUPnPPlayListFiller::FillL(
+ CUPnPMusicAdapter& aHost,
+ CMPXMediaArray& aPlaylist )
+ {
+ __LOG( "CUPnPPlayListFiller::FillL" );
+ SetHost( aHost );
+ DoFillL( aPlaylist, iItemList );
+ DoComplete();
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPPlayListFiller::CancelFill
+// --------------------------------------------------------------------------
+//
+void CUPnPPlayListFiller::CancelFill()
+ {
+ // no implementation required
+ // - this class does not have async nature
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPPlayListFiller::PlaylistSize
+// Returns the total playlist size
+// --------------------------------------------------------------------------
+//
+TInt CUPnPPlayListFiller::PlaylistSize()
+ {
+ return iItemList.Count();
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPPlayListFiller::ObjectArray
+// returns a non-modifiable reference of the object list
+// --------------------------------------------------------------------------
+//
+const RPointerArray<CUpnpObject>& CUPnPPlayListFiller::ObjectArray()
+ {
+ return iItemList;
+ }
+
+
+// --------------------------------------------------------------------------
+// CUPnPPlayListFiller::SourceDevice
+// returnsthe media server the playlist is located
+// --------------------------------------------------------------------------
+//
+const CUpnpAVDevice& CUPnPPlayListFiller::SourceDevice()
+ {
+ return *iSourceDevice;
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPPlayListFiller::SetHost
+// Assigns the host music adapter
+// --------------------------------------------------------------------------
+//
+void CUPnPPlayListFiller::SetHost( CUPnPMusicAdapter& aHost )
+ {
+ iHost = &aHost;
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPPlayListFiller::Host
+// returns the host music adapter
+// --------------------------------------------------------------------------
+//
+CUPnPMusicAdapter& CUPnPPlayListFiller::Host() const
+ {
+ __ASSERTD( iHost != 0 , __FILE__, __LINE__ );
+ return *iHost;
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPPlayListFiller::SelectedIndex
+// Index of selected item
+// --------------------------------------------------------------------------
+//
+TInt CUPnPPlayListFiller::SelectedIndex() const
+ {
+ return iSelectedIndex;
+ }
+
+
+// --------------------------------------------------------------------------
+// CUPnPPlayListFiller::DoFillL
+// Fill track data into the playlist - base class implementation
+// --------------------------------------------------------------------------
+//
+TInt CUPnPPlayListFiller::DoFillL( CMPXMediaArray& aPlaylist,
+ const RPointerArray<CUpnpObject>& aSource, TInt /*aStartIndex*/ )
+ {
+ __LOG( "CUPnPPlayListFiller::DoFillL" );
+
+ // Add currently cached items to the playlist
+
+ TInt i = 0;
+ for( ; i < aSource.Count() ; ++i )
+ {
+ DoFillObjectL( aPlaylist, *aSource[i], i );
+ }
+
+ __LOG( "CUPnPPlayListFiller::DoFillL - end" );
+
+ return i;
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPPlayListFiller::DoFillObjectL
+// Fills a ingle object to a playlist
+// --------------------------------------------------------------------------
+//
+void CUPnPPlayListFiller::DoFillObjectL( CMPXMediaArray& aPlaylist,
+ const CUpnpObject& aObject, TInt /*aIndex*/ )
+ {
+ // Create new media object for track
+ CMPXMedia* media = CMPXMedia::NewL();
+ CleanupStack::PushL( media );
+ // Set type
+ media->SetTObjectValueL<TMPXGeneralType>(
+ KMPXMediaGeneralType, EMPXItem );
+ // Set gategory
+ media->SetTObjectValueL<TMPXGeneralCategory>(
+ KMPXMediaGeneralCategory, EMPXSong );
+ // URI
+ if( UPnPItemUtility::BelongsToClass( aObject , KClassAudio ) )
+ {
+ ConvertToURI( *iDeviceUid, aObject, iTempBuf );
+ }
+ else // item is non audio set uri to KUPnPPrefix
+ {
+ iTempBuf.Copy( KUPnPPrefix );
+ }
+
+ media->SetTextValueL(
+ KMPXMediaGeneralUri, iTempBuf );
+ // Title
+ HBufC16* buf =
+ EscapeUtils::ConvertToUnicodeFromUtf8L( aObject.Title() );
+ CleanupStack::PushL( buf );
+ media->SetTextValueL(
+ KMPXMediaGeneralTitle, *buf );
+ CleanupStack::PopAndDestroy( buf );
+ // Add track to the object list
+ aPlaylist.AppendL( media );
+ CleanupStack::Pop( media );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPPlayListFiller::DoComplete
+// Completes the object, causing it to be destroyed.
+// --------------------------------------------------------------------------
+//
+void CUPnPPlayListFiller::DoComplete()
+ {
+ Host().Complete( this );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPPlayListFiller::ConvertToURI
+// Convert UPnP item to playlist item URI string
+// --------------------------------------------------------------------------
+//
+void CUPnPPlayListFiller::ConvertToURI( const TDesC& aDeviceUid,
+ const CUpnpObject& aItem, TDes& aBuffer )
+ {
+ // Start with upnp prefix
+ aBuffer.Copy( KUPnPPrefix );
+ aBuffer.Append( aDeviceUid );
+
+ aBuffer.Append( KSeparator );
+ // add object id (converting 8->16 bit)
+ TBuf<KMaxElementSize> id16;
+ id16.Copy( aItem.Id() );
+ aBuffer.Append( id16 );
+ }
+
+
+