multimediacommscontroller/mmccrtpsourcesink/inc/mccrtpsender.h
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommscontroller/mmccrtpsourcesink/inc/mccrtpsender.h	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,211 @@
+/*
+* Copyright (c) 2002-2004 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:    RTP sender
+*
+*/
+
+
+
+
+
+#ifndef MCCRTPSENDER_H
+#define MCCRTPSENDER_H
+
+// INCLUDES
+#include <e32base.h>
+#include "rtpapi.h"
+#include "rtpheader.h"
+#include "mccexpirationhandler.h"
+
+
+// FORWARD DECLARATIONS
+class CMccRtpSendItem;
+class CMccTimerManager;
+ 
+// CLASS DECLARATION
+//   
+
+class MMccRtpSenderObserver
+    {
+public:
+    virtual void SendErrorOccured( TInt aError ) = 0;
+    };
+    
+class CMccRtpSender : public CActive, public MMccExpirationHandler
+    {
+public:
+
+    /**
+    * Create asynchronous rtp sender.
+    *
+    * @param aObserver
+    * @param aRtpApi
+    * @param aSessionId
+    * @param aDoMarkerBasedCleanup
+    */  
+    static CMccRtpSender* NewL( MMccRtpSenderObserver& aObserver, 
+                                CRtpAPI& aRtpApi, 
+                                TRtpId aSessionId,
+                                TBool aDoMarkerBasedCleanup );
+    
+    ~CMccRtpSender();
+    
+    /**
+    * Send rtp packet asynchronously. If previous send is pending, packet
+    * is queued unless the queue is full. In that case the packet is discarded. 
+    *
+    * @param aRtpStreamId
+    * @param aRtpHeader
+    * @param aData
+    */  
+    void SendRtpPacketL( TRtpId aRtpStreamId,
+                         const TRtpSendHeader& aRtpHeader, 
+                         const TDesC8& aData );
+    
+    /**
+    * Send a non-RTP (control) data packet.
+    * @param aSessionId     RTP Session ID
+    * @param aUseRtpSocket  Whether to use RTP or RTCP socket
+    * @param aData          Non-RTP data packet to send
+    */
+    void SendDataL( TRtpId aSessionId, TBool aUseRtpSocket, 
+        const TDesC8& aData );
+    
+    /**
+    * Cancels pending send operation and empties the queue.
+    */                     
+    void Clear();
+
+protected: // From CActive
+
+    void RunL();
+    
+    void DoCancel();
+    
+    TInt RunError( TInt aError );
+
+protected: // From MMccExpirationHandler
+    
+    void TimerExpiredL( TMccTimerId aTimerId, TAny* aTimerParam );
+                             
+private:
+
+    void ConstructL();
+
+    CMccRtpSender( MMccRtpSenderObserver& aObserver,
+                   CRtpAPI& aRtpApi, 
+                   TRtpId aSessionId,
+                   TBool aDoMarkerBasedCleanup );
+    
+    void SendPacketL();
+    
+    void RemovePacket( TBool aDoQueueCleanup = EFalse );
+    
+    TBool ErrorReport( TInt aError );
+    
+    TBool CheckDiscarding( const TRtpSendHeader& aRtpHeader );
+    
+    /**
+    * If packet for which aRtpHeader belongs was zero marker frame,
+    * that packet and everything related to that frame is removed from
+    * queue. If full frame couldn't yet be removed, upcoming parts
+    * of the frame are discarded once they are tried to be sent.  
+    *
+    * @param aItemIndex
+    * @param aRtpHeader
+    * @return ETrue if queue item in aItemIndex was deleted, otherwise
+    *         return EFalse
+    */ 
+    TBool DoQueueCleanup( TInt aItemIndex, const TRtpSendHeader& aRtpHeader );
+    
+private:
+    
+    MMccRtpSenderObserver& iObserver;
+
+    CRtpAPI& iRtpApi;
+    
+    TRtpId iSessionId;
+    
+    CMccTimerManager* iTimeoutTimer;
+    
+    RPointerArray<CMccRtpSendItem> iSendQueue;
+    
+    TBool iDoMarkerBasedCleanup;
+    
+    TBool iDiscarding;
+    
+    TUint32 iTimeoutTimeMilliseconds;
+    
+    TMccTimerId iTimerId;
+
+#ifdef TEST_EUNIT
+public:
+    friend class UT_CMccRtpSender;
+#endif
+    
+    };
+
+class CMccRtpSendItem : public CBase
+    {
+public:
+
+    static CMccRtpSendItem* NewLC( TRtpId aRtpStreamId, 
+                                   const TRtpSendHeader& aRtpHeader,
+                                   const TDesC8& aData );
+    
+    static CMccRtpSendItem* NewLC( TRtpId aSessionId, 
+        TBool aUseRtpSocket, const TDesC8& aData );
+    
+    ~CMccRtpSendItem();
+    
+    const TDesC8& DataPtr() const;
+    
+    TRtpId RtpStreamId() const;
+    
+    const TRtpSendHeader& RtpHeader() const;
+    
+    TRtpId SessionId() const;
+    
+    TBool UseRtpSocket() const;
+    
+private:
+
+    void ConstructL( const TDesC8& aData );
+    
+    CMccRtpSendItem( TRtpId aRtpStreamId, const TRtpSendHeader& aRtpHeader );
+    
+    CMccRtpSendItem( TRtpId aSessionId, TBool aUseRtpSocket );
+    
+private:
+
+    HBufC8* iData;
+    
+    TRtpId iRtpStreamId;
+    TRtpSendHeader iRtpHeader; 
+    
+    TPtrC8 iDataPtr;
+
+    TRtpId iSessionId;
+    TBool iUseRtpSocket;
+
+private:    // Friend classes
+
+    #ifdef TEST_EUNIT
+        friend class UT_CMccRtpSender;
+    #endif    
+    };
+    
+#endif // MCCRTPSENDER_H
+
+// End of File