--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/internetradio2.0/streamsourceinc/iricyflowreader.h Mon Apr 19 14:01:53 2010 +0300
@@ -0,0 +1,342 @@
+/*
+* Copyright (c) 2006-2007 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: Reads data from opened ICY session
+*
+*/
+
+
+/* ---------------------------------------------------------------------------
+* Version history:
+* Template version:
+* <ccm_history>
+*
+* Version: 2, Tue Feb 28 18:00:00 2008 by Rohit/Kranthi
+* Ref:
+* Added NetworkController instance for Byte Counter Impl
+*
+* </ccm_history>
+* ============================================================================
+*/
+
+#ifndef IR_IRICYFLOWREADER
+#define IR_IRICYFLOWREADER
+
+
+#include <e32base.h>
+#include <es_sock.h>
+
+class CIRMetaData;
+class CIRNetworkBuffer;
+class CIRStationConnection;
+class MIRStationDataObserver;
+class RSocket;
+class TChannelInfo;
+class CIRNetworkController;
+
+/**
+* This class handles reading audio and metadata from a connected
+* ICY session. It assumes that the socket is connected, the
+* ICY session has been requested and initial ICY headers have been
+* processed.
+*
+*/
+NONSHARABLE_CLASS( CIRIcyFlowReader ) : public CActive
+ {
+public: // Constructors and destructors
+
+ /**
+ * Standard Symbian two-phase construction
+ *
+ * @param aSocket Socket to be read.
+ * @param aOwner The owner of this CIRIcyFlowReader
+ * @param aDataObserver The observer wishing to receive audio/metadata.
+ * @param aChannelInfo Information describing the ICY session
+ * @return Instance of CIRIcyFlowReader
+ */
+ static CIRIcyFlowReader* NewL( RSocket& aSocket, CIRStationConnection& aOwner,
+ MIRStationDataObserver& aDataObserver,
+ TChannelInfo& aChannelInfo );
+
+ /**
+ * Destructor
+ */
+ ~CIRIcyFlowReader();
+
+public:
+
+ /**
+ * Starts the reading from the socket
+ */
+ void Start();
+
+ /**
+ * Fills the buffer with the streamed data
+ *
+ * @param aInputBuffer Buffer into which audio data is to be copied
+ */
+ void FillBuffer(TDes8& aInputBuffer);
+
+private: // Functions from base classes
+
+ /**
+ * From CActive
+ */
+ void RunL();
+
+ /**
+ * From CActive
+ */
+ void DoCancel();
+
+private:
+ /**
+ * Copies the buffer to the mediaengine sink queue
+ *
+ * @param aData Data to copy.
+ */
+ void AddToSinkQueue( const TDesC8& aData );
+
+ /**
+ * Fills the media engine buffer with audio data upon request
+ * by the media engine
+ *
+ * @param aInputBuffer Buffer into which audio data is to be copied
+ */
+ void FillMediaEngineBuffer(const TDes8& aInputBuffer);
+
+ /**
+ * Fills the unfilled media engine buffers with the remaining audio data
+ */
+ void FillRemainingBuffers();
+
+ /**
+ * C++ default constructor
+ */
+ CIRIcyFlowReader( RSocket& aSocket, CIRStationConnection& aOwner,
+ MIRStationDataObserver& aDataObserver, TChannelInfo& aChannelInfo );
+
+ /**
+ * Second phase construction
+ */
+ void ConstructL();
+
+private:
+
+ /**
+ * The parsing states
+ */
+ enum TIRParsingState
+ {
+ EIRReadingAudioData, /**< Reading raw audio data. */
+ EIRReadingMetaDataLength, /**< Reading the length of the meta data. */
+ EIRReadingMetaData /**< Reading meta data. */
+ };
+
+ /**
+ * Initiates a read from socket.
+ */
+ void IssueRead();
+
+ /**
+ * Initializes the buffers that will be used for streaming
+ */
+ void InitializeBuffersL();
+
+ /**
+ * Extracts the meta data from the stream
+ */
+ void ExtractMetadataL();
+
+ /**
+ * Handles received data.
+ *
+ * Can contain any amount of audio and/or meta data mixed in with it.
+ *
+ * @param aData Data received.
+ */
+ void HandleReceivedDataL( const TDesC8& aData );
+
+ /**
+ * Handles received audio data.
+ *
+ * Can only contain raw audio data.
+ *
+ * @param aData Data received.
+ */
+ void HandleReceivedAudioData( const TDesC8& aData );
+
+ /**
+ * Handles received meta data.
+ *
+ * Can only contain meta data.
+ *
+ * @param aData Data received.
+ */
+ void HandleReceivedMetaData( const TDesC8& aData );
+ /**
+ * Recognizes if the string is UTF-8 encoded and decodes it,
+ * if required.
+ *
+ * @param aString The string to be decoded.
+ * @return The string in Unicode/ISO-8859-1 format.
+ */
+ HBufC* DecodeMetadataStringLC( const TDesC8& aString ) const;
+
+ /**
+ * Tests whether the string is UTF-8 encoded.
+ *
+ * @param aString The string to be examined
+ * @return ETrue, if the string is UTF-8 encoded, EFalse otherwise.
+ */
+ TBool IsUtf8Encoded( const TDesC8& aString ) const;
+
+private:
+
+ /**
+ * The pointer to buffer which holds the audio data.
+ * Owned.
+ */
+ TUint8* iSongBuffer;
+
+ /**
+ * Buffer that holds the data received over the network.
+ * Owned.
+ */
+ HBufC8* iSocketBuffer;
+
+ /**
+ * Buffer to contain unfinished song data.
+ * Owned.
+ */
+ HBufC8* iTempSongBuffer;
+
+ /**
+ * Buffer to contain unfinished meta data.
+ * Owned.
+ */
+ HBufC8* iTempMetaBuffer;
+
+ /**
+ * Current meta data information.
+ * Owned.
+ */
+ CIRMetaData* iMetaData;
+
+ /**
+ * The socket that read.
+ */
+ RSocket& iSocket;
+
+ /**
+ * The owner of this object in the whole-part relation.
+ */
+ CIRStationConnection& iOwner;
+
+ /**
+ * The observer wishing to receive audio/metadata
+ */
+ MIRStationDataObserver& iDataObserver;
+
+ /**
+ * Queue of buffer which is filled
+ */
+ TSglQue<CIRNetworkBuffer> iSourceQ;
+
+ /**
+ * Queue of buffer which is empty
+ */
+ TSglQue<CIRNetworkBuffer> iSinkQ;
+
+ /**
+ * Temporary holder for network buffer.
+ * Not owned.
+ */
+ CIRNetworkBuffer* iTempBufferHolder;
+
+ /**
+ * Pointer descriptor to the network data buffer.
+ */
+ TPtr8 iSocketBufferPtr;
+
+ /**
+ * Indicates the no. of bytes read from the socket
+ */
+ TSockXfrLength iSocketBytesRead;
+
+ /**
+ * Indicates that stream source ( network side ) buffering is happening.
+ */
+ TBool iInitialBuffering;
+
+ /**
+ * Indicates rebuffering is occurring
+ */
+ TBool iReBuffering;
+
+ /**
+ * Indicates no of chunks of buffers to be copied
+ */
+ TInt iNoOfChunks;
+
+ /**
+ * Indicates the number of chunks are remaining
+ */
+ TInt iChunksRemaining;
+
+ /**
+ * Length of the current meta data block in bytes.
+ */
+ TInt iMetaDataLength;
+
+ /**
+ * Pointer to buffer to be filled.
+ * Not owned.
+ */
+ TUint8* iBufferFillPointer;
+
+ /**
+ * Used to give buffer fill value to progress bar
+ */
+ TInt iBufferCounter;
+
+ /**
+ * Used to determine the metadata position
+ */
+ TInt iAudioDataOffset;
+
+ /**
+ * Indicates the data parsing state.
+ */
+ TIRParsingState iParsingState;
+
+ /**
+ * Holds the channel information
+ */
+ TChannelInfo& iChannelInfo;
+
+ /**
+ * Indicates if the channel info should be published or not
+ */
+ TBool iPublishStationInfo;
+
+ /**
+ * NetworkController singleton instance
+ */
+ CIRNetworkController* iNetworkControllerHandle;
+ };
+
+#endif // IR_IRICYFLOWREADER
+
+
+