rtp/rtpstack/inc/rtpcommsend.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:03:15 +0200
changeset 0 307788aac0a8
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 2004-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:   
*
*/




#ifndef RtpCommSend_H
#define RtpCommSend_H

#include <es_sock.h>
#include <rtpdef.h>

#include "rtpsenditem.h"
#include "rtpcommdef.h"
#include "rtputil.h"

/**
*  Class definition for sending
*
*  @lib RtpService.dll
*/
class CRtpCommSend : public CActive
    {
    #if defined( _DEBUG ) && defined( RTP_UNIT_TEST )
    // Friend class used for testing
        friend class CRtpUtRtpCommSend;
    #endif 
    public:
        static CRtpCommSend* NewL( RSocket& aSocket, MRtpErrNotify& aErrNotify, 
                                   /*TInt aBufSize,*/ TInetAddr& aAddr ); 

        ~CRtpCommSend();

        TInt Send( const TDesC8& aPacket );
        void Send( const TDesC8& aPacket, TRequestStatus& aStatus );
        void CancelAsyncSend();
        void SetToAddress(TInetAddr& aAddr);

    protected: // from CActive

        /**
        * Cancel any outstanding operation
        */
        void DoCancel();

        /**
        * Called when operation complete
        */
        void RunL();

    private:
        CRtpCommSend( RSocket& aSocket, MRtpErrNotify& aErrNotify, TInetAddr& aAddr );
        void ConstructL( /*TInt aBufSize*/ );

        /**
        * Handle a 'write buffer empty' situation.
        */
        void SendNextPacket();
        
        /**
        * Remove Item From Queue
        */
        void RemoveFromQueue();
        
        /**
         * Complete and remove queue items.
         * @since S60 3.2.3
         * @param aError completion code
         */
        void CompleteAndRemoveRequests( TInt aError );
        
        /**
         * Complete client's request.
         * @since S60 3.2.3
         * @param aItem send item
         * @param aReason completion code
         */
        void CompleteClientRequest( CRtpSendItem& aItem, TInt aReason ) const;

    private: // Member data
        
        enum TWriteState 
            {
            ESending, EWaiting, ECommsFailed
            };

   
        RSocket&        iSocket;
        TInetAddr       iToAddr;
        TWriteState     iWriteStatus;
        TPtrC8          iBufPtr;  // As a data memeber to hold the packet point for
                                  // Asyn sending in case the sending packet is out of scope.
        MRtpErrNotify&  iRtpErrNotify; 
	    TSglQue <CRtpSendItem> iSendQue;
        /** List iterator - needed to delete all the items */
		TSglQueIter<CRtpSendItem> iQueueIter;
		#ifdef EUNIT_TESTING
	  	friend class UT_CRtpAPI;
	  	friend class UT_CRtpSession;
	  	friend class UT_CRtpSessionSrtp;
	  	friend class UT_CRtpComm;
		#endif     	    
           };

#endif	// RtpCommSend_H