williamr@2: // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
williamr@2: // All rights reserved.
williamr@2: // This component and the accompanying materials are made available
williamr@4: // under the terms of "Eclipse Public License v1.0"
williamr@2: // which accompanies this distribution, and is available
williamr@4: // at the URL "http://www.eclipse.org/legal/epl-v10.html".
williamr@2: //
williamr@2: // Initial Contributors:
williamr@2: // Nokia Corporation - initial contribution.
williamr@2: //
williamr@2: // Contributors:
williamr@2: //
williamr@2: // Description:
williamr@2: //
williamr@2: 
williamr@2: /**
williamr@2:  @file
williamr@2:  @publishedAll
williamr@2:  @released
williamr@2: */
williamr@2: 
williamr@2: #ifndef REMCONMEDIAINFORMATIONTARGET_H
williamr@2: #define REMCONMEDIAINFORMATIONTARGET_H
williamr@2: 
williamr@2: #include <e32base.h>
williamr@2: #include <remcon/remconinterfacebase.h>
williamr@2: #include <remcon/remconinterfaceif.h>
williamr@2: #include <remconmediainformationtargetobserver.h>
williamr@2: 
williamr@2: class CRemConInterfaceSelector;
williamr@4: class RRemConGetElementAttributesResponse;
williamr@2: 
williamr@2: NONSHARABLE_CLASS(CRemConMediaInformationQueuedMessage): public CBase
williamr@2: 	{
williamr@2: public:
williamr@2: 	static CRemConMediaInformationQueuedMessage* NewL(const TDesC8& aData);
williamr@2: 	~CRemConMediaInformationQueuedMessage();
williamr@2: 	
williamr@2: 	const TDesC8& Data();
williamr@2: private:
williamr@2: 	CRemConMediaInformationQueuedMessage();
williamr@2: 	void ConstructL(const TDesC8& aData);
williamr@2: public:
williamr@2: 	TSglQueLink iLink;
williamr@2: private:
williamr@2: 	RBuf8 iData;
williamr@2: 	};
williamr@2: 
williamr@2: /**
williamr@2: Client-instantiable type supporting sending media information.
williamr@2: */
williamr@2: NONSHARABLE_CLASS(CRemConMediaInformationTarget) : public CRemConInterfaceBase, 
williamr@2: 								          		public MRemConInterfaceIf
williamr@2: 	{
williamr@2: public:
williamr@2: 
williamr@2: 	/**
williamr@2: 	Factory function.
williamr@2: 	@param aInterfaceSelector The interface selector. The client must have 
williamr@2: 	created one of these first.
williamr@2: 	@param aObserver The observer of this interface.
williamr@2: 	@return A new CRemConMediaInformationTarget, owned by the interface selector.
williamr@2: 	*/
williamr@2: 	IMPORT_C static CRemConMediaInformationTarget* NewL(CRemConInterfaceSelector& aInterfaceSelector, 
williamr@2: 		MRemConMediaInformationTargetObserver& aObserver);
williamr@2: 	
williamr@2: 	/** Destructor */
williamr@2: 	IMPORT_C ~CRemConMediaInformationTarget();
williamr@2: 
williamr@2: public:
williamr@2: 	/** Called by the client in response to a MrcmitoGetCurrentlyPlayingMetadata() call.
williamr@2: 	Each call provides one of the attribute values requested.
williamr@2: 	This is repeatedly called until all attributes requested have been supplied and then followed by Completed().
williamr@2: 	@param aAttribute The ID of the attribute supplied.
williamr@2: 	@param aValue A reference to a descriptor containing the attribute data.  
williamr@2: 	This must be valid until Completed() has been called. 
williamr@2: 	@see MRemConMediaInformationTargetObserver::MrcmitoGetCurrentlyPlayingMetadata()
williamr@2: 	@see CRemConMediaInformationTarget::Completed()
williamr@2: 	*/
williamr@2: 	IMPORT_C TInt AttributeValue( TMediaAttributeId aAttributeId, TDesC8& aAttributeData);
williamr@2: 	
williamr@2: 	/** Signal that all attributes requested by MrcmitoGetCurrentlyPlayingMetadata() have been supplied
williamr@2: 	using the AttributeValue() method.
williamr@2: 	@see MRemConMediaInformationTargetObserver::MrcmitoGetCurrentlyPlayingMetadata()
williamr@2: 	@see CRemConMediaInformationTarget::AttributeValue()
williamr@2: 	*/
williamr@2: 	IMPORT_C void Completed();
williamr@2: 	
williamr@2: private:
williamr@2: 	/** 
williamr@2: 	Constructor.
williamr@2: 	@param aInterfaceSelector The interface selector.
williamr@2: 	@param aObserver The observer of this interface.
williamr@2: 	*/
williamr@2: 	CRemConMediaInformationTarget(CRemConInterfaceSelector& aInterfaceSelector, 
williamr@2: 		MRemConMediaInformationTargetObserver& aObserver);
williamr@2: 
williamr@2: 	void ConstructL();
williamr@2: 
williamr@2: private: // from CRemConInterfaceBase
williamr@2: 	TAny* GetInterfaceIf(TUid aUid);
williamr@2: 
williamr@2: private: // from MRemConInterfaceIf
williamr@2: 	void MrcibNewMessage(TUint aOperationId, const TDesC8& aData);
williamr@2: 
williamr@2: private: // utility
williamr@2: 	void SendError(TInt aError);
williamr@2: 	void ProcessMessage(const TDesC8& aData);
williamr@2: 	
williamr@2: 	static int NextMessageCb(TAny* aThis);
williamr@2: 	void DoNextMessage();
williamr@2: private: // unowned
williamr@2: 	MRemConMediaInformationTargetObserver& iObserver;
williamr@2: 
williamr@2: private: // owned
williamr@4: 	RRemConGetElementAttributesResponse* iResponse;
williamr@2: 
williamr@2: 	RArray<TMediaAttributeId>  	iMediaAttributeIDs;
williamr@2: 	TMediaAttributeIter 		iAttributeIterator;
williamr@2: 	TBool						iInProgress;
williamr@2: 	TSglQue<CRemConMediaInformationQueuedMessage> iMsgQueue;
williamr@2: 	
williamr@2: 	CAsyncCallBack* iNextMessageCallBack;
williamr@2: 	};
williamr@2: 
williamr@2: #endif // REMCONMEDIAINFORMATIONTARGET_H