/** Copyright (c) 2008 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: class for containing and obtaining music track-specific* data from media server**/#ifndef C_UPNPTRACK_H#define C_UPNPTRACK_H// INCLUDES#include <e32base.h>#include "upnpitemresolverobserver.h"#include "upnpresourceselector.h"// FORWARD DECLARATIONSclass TMPXAttribute;class TMPXAttributeData;class MUPnPAVController;class MUPnPAVBrowsingSession;class MUPnPTrackObserver;class MMPXPlaybackPluginObserver;class CUpnpItem;class MUPnPItemResolver;// CONSTANTSconst TInt KMaxElementSize = 256;/** * A helper class for containing and obtaining music track-specific data * from media server * * @lib upnpmusicplugins.lib * @since S60 v3.1 */class CUPnPTrack : public CBase , public MUPnPItemResolverObserver {public: // datatypes /** * Defines direction of playback * * EDirectionRemote - Used in local to remote and remote to remote * playback cases * EDirectionLocal - Used only in remote to local case. * */ enum TPlaybackDirection { EDirectionRemote = 0, EDirectionLocal };public: /** * static constructor * * @param aAvController AVController * @return a new CUPnPTrack instance * @since Series 60 3.1 */ static CUPnPTrack* NewL( MUPnPAVController& aAvController ); /** * Destructor * * @since Series 60 3.1 */ virtual ~CUPnPTrack(); /** * Parse and saves the song path from given descriptor * * @param aCodedTrackUri track URI that may be coded * @param atrackObserver observer to notify when resolve is complete * @param aPlaybackDirection direction of playback * @since Series 60 3.1 */ void ResolveURIL( const TDesC& aCodedTrackUri, MUPnPTrackObserver& aTrackObserver, TPlaybackDirection aPlaybackDirection ); /** * Returns the original URI given in initialisation * * @return TDesC URI * @since Series 60 3.1 */ const TDesC& URI() const; /** * Returns the true UPNP URI of a remote track * * @return TDesC8 URI * @since Series 60 3.1 */ const TDesC8& UpnpURI() const; /** * Returns the remote upnp item that represents the track * * @return CUpnpItem the item reference * @since Series 60 3.1 */ const CUpnpItem& UpnpItem() const; /** * Returns the file path of local item * * @return TDesC file path * @since Series 60 3.1 */ const TDesC& FilePath() const; /** * Return location of track. ETrue = remote. EFalse = local * * @return TBool location of track * @since Series 60 3.1 */ TBool IsRemote() const; /** * Get metadata information for track from media server * * @param aAttrs list of wanted media propeties * @param aObs the plugin observer that will receive the metadata * @since Series 60 3.1 */ void GetMetaDataL( const TArray<TMPXAttribute>& aAttrs, MMPXPlaybackPluginObserver& aObs ); /** * Delivers media changed event to playback framework * @param aObs the plugin observer */ void SendMediaChangedEventL( MMPXPlaybackPluginObserver& aObs ); /** * current track duration * @return track duration in milliseconds */ TInt TrackDuration(); /** * overrides current track duration. Normally a track can provide * duration information for current remote track. However sometimes * the data is missing. In this case it can be set using this method. * @param aMilliseconds the duration in milliseconds */ void SetTrackDuration( TInt aMilliseconds ); /** * */ void Delete();protected: // MUPnPItemResolverObserver /** * See MUPnPItemResolverObserver */ void ResolveComplete( const MUPnPItemResolver& aResolver, TInt aError );private: /** * Default constructor * * @param aAvController AVController * @since Series 60 3.1 */ CUPnPTrack( MUPnPAVController& aAvController ); /** * 2nd phase constructor * * @since Series 60 3.1 */ void ConstructL(); /** * Parse and save HttpURI, media server id and object id from * given descriptor * * @since Series 60 3.1 * @param aSong descriptor to be parsed */ void ParsePiecesL( const TDesC& aSong ); /** * See MUPnPAVBrowsingSessionObserver * * @since Series 60 3.1 */ void BrowseResponseL( const TDesC8& aBrowseResponse, TInt aError ); /** * Starts a browsing session within the object */ void StartBrowsingSessionL(); /** * Stops a browsing session within the object */ void StopBrowsingSession(); /** * Delivers metadata to observer * @param aAttrs list of wanted media propeties * @param aObs the plugin observer that will receive the metadata * @param aError error code to be delivered to client */ void DeliverMedataL( const TArray<TMPXAttribute>& aAttrs, MMPXPlaybackPluginObserver& aObs, TInt aError = KErrNone ); /** * Fills item metadata into given MediaL object * @param aMedia the MPX media object to fill metadata into * @param aAttrs list of metadata elements to fill */ void FillMediaFromItemL( CMPXMedia& aMedia, const TArray<TMPXAttribute>& aAttrs ); /** * Tests if given attribute exists in the attribute array * returns true if it is found. * @param aAttrs the attribute array * @param aAttrData the attribute to look for * @return ETrue if it was found, EFalse otherwise */ TBool Exists( const TArray<TMPXAttribute>& aAttrs, const TMPXAttributeData& aAttrData ) const; /** * A helper method that converts text from 8-bit to 16-bit. * Note that a member buffer is used that has static length. */ const HBufC16* To16LC( const TDesC8& aText );private: // data /** * Defines location of track * * @since Series 60 3.1 */ enum TTrackLocation { ETrackLocationLocal = 0, ETrackLocationRemote }; /** * Defines track state * * @since Series 60 3.2 */ enum TTrackState { EStateIdle, EStateResolving, EStateSelfDestruct, EStateReady }; /** * Location of track */ TTrackLocation iTrackLocation; /** * URI for local track */ HBufC* iOriginalURI; /** * Media server name */ HBufC8* iMediaServer; /** * Object id */ HBufC8* iObjectId; /** * The AV Controller resource */ MUPnPAVController& iAvController; /** * The rendering session */ MUPnPAVBrowsingSession* iBrowsingSession; /** * Track observer during resolving phase */ MUPnPTrackObserver* iTrackObserver; /** * Observer for metadata queries * Stored in case metadata is not ready yet when queried */ MMPXPlaybackPluginObserver* iMetadataObserver; /** * Attributes in metadata query */ RArray<TMPXAttribute> iQueriedAttributes; /** * temp buffer used in 8->16 -bit conversion */ TBuf16<KMaxElementSize> iTempBuf; /** * track duration in milliseconds (from some other source) */ TInt iTrackDuration; /** * Resolver for remote or local item (Owned). */ MUPnPItemResolver* iItemResolver; /** * Selectors for remote item. */ TUPnPSelectDefaultResource iDefaultSelector; /** * Selectors for local item. */ TUPnPSelectFirstResource iFirstSelector; /** * Tells is resolve item completed. */ TBool iIsItemSolved; /** * Current track state */ TTrackState iState; };#endif // C_UPNPTRACK_H