diff -r 000000000000 -r f5a58ecadc66 upnp/upnpstack/dlnawebserver/inc/upnptcpsessionwriter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnp/upnpstack/dlnawebserver/inc/upnptcpsessionwriter.h Tue Feb 02 01:12:20 2010 +0200 @@ -0,0 +1,241 @@ +/** @file +* Copyright (c) 2005-2006 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: CUpnpTcpSessionWriter is a class responsible for +* asynchronous writing to a socket owned by CUpnpTcpSession. +* +*/ + + + +#ifndef C_UPNPTCPSESSIONWRITER_H +#define C_UPNPTCPSESSIONWRITER_H + + +#include +#include +#include "upnpretrywrite.h" + +class CUpnpTcpSession; +class CUpnpTcpWriteRequest; + + +/** + * CUpnpTcpSessionWriter is responsible for asynchronous writing. + * Writer class is owned by CUpnpTcpSession which request asynchronous + * writing from it and is notified by writer when the write request + * is completed or an error occured. + * When writer receives data to send it checks if it can be sent to the socket + * right away and if session is not yet connected or writer already sends data + * then it queues incoming data. When writing to the socket ends, writer checks + * if there is data in queue waiting for sending. If thereis then it issues writing it + * until the queue is empty. After writing all data, the writer notifies session about + * completion of the writing taska and switches to waiting state until it receives + * another write request. + * @lib DLNAWebServer.lib + * @since Series60 2.6 + */ +NONSHARABLE_CLASS (CUpnpTcpSessionWriter) : public CActive, MUpnpRetryWriteObserver + { +public: + + /** + * CUpnpTcpSessionWriter factory method. + * @since Series60 2.6 + * @param aSession session that runs and supervises reader. + * @param aSocket socket from which data will be read. + * @param aPriority priority with which the reader will be working. + * @return ?description + */ + static CUpnpTcpSessionWriter* NewL( CUpnpTcpSession& aSession, + RSocket& aSocket, + TThreadPriority aPriority ); + + /** + * Virtual destructor. + * @since Series60 2.6 + */ + virtual ~CUpnpTcpSessionWriter(); + +public: // New functions + + /** + * Issues writing in asynchronous mode. + * @since Series60 2.6 + * @param aData buffer with data to write. + */ + void IssueWriteL( const TDesC8& aData ); + + + /** + * Function used by CUpnpTcpSession that owns the writer + * to notify if socket is connected and if writer can write data. + * @since Series60 2.6 + * @param aConnected + */ + void SessionConnected( TBool aConnected ); + + /** + * Returnes true if there are some write request queued and + * false if all data has been sent already. + * @since Series60 2.6 + * @return true if there are some write request queued and + * false if all data has been sent already. + */ + TBool HasWriteRequestsToSend(); + + /** + * Returns if retrying of writng occurs + * @since series60 3.2 + * @return ETrue/EFalse + */ + TBool IsRetrying(); + + /** + * Returns if writer is writing some data at the moment. + * @since series60 2.6 + * @return true if writer writes data at the moment. + */ + TBool IsWriting(); + +protected: // Functions from base CActive + + /** + * Cancels issued writing request. + * Standard active object function + * @since Series60 2.6 + */ + void DoCancel(); + + /** + * Function called when the write request is finished. + * Standard active object function + * @since Series60 2.6 + */ + void RunL(); + + /** + * Trap RunL leaves + * Standard active object function + * @since Series60 2.0 + */ + TInt RunError( TInt aError ); + +private: // Constructors and destructors + + /** + * CUpnpTcpSessionWriter constructor. + * @since Series60 2.6 + * @param aSession session that runs and supervises reader. + * @param aSocket socket from which data will be read. + * @param aPriority priority with which the reader will be working. + */ + CUpnpTcpSessionWriter( CUpnpTcpSession& aSession, + RSocket& aSocket, + TThreadPriority aPriority ); + + /** + * By default Symbian 2nd phase constructor is private. + * @since Series60 2.6 + */ + void ConstructL(); + + +private: // New functions + + /** + * Sends next queued write request if such exists. + * @since Series60 2.6 + */ + void SendNextWriteRequestL(); + +private: // from MUpnpRetryWriteObserver + + /** + * Called when retrying of writing was succesed. + * @since Series60 3.2 + */ + void RetryWriteSucceed(); + + /** + * Called when retrying of writing fail. + * @since Series60 3.2 + */ + void RetryWriteFailL( TInt aError ); + +private: // Enumerations + + /** + * TWriteState, records whether a write request is pending. + * - EnotConnected Socket is not yet connected so writer cannot write. + * - EWriting A write request is pending with the socket server. + * - EWaiting The idle state for this object. Socket is connected + * and the writer waits for write requests form session. + * - EDisconnected Session is already disconnected so don't write and don't + * queue requests. + */ + enum TWriterState + { + ENotConnected, + EWriting, + EWaiting, + EDisconnected + }; + +private: + + /** + * Socket used for writing data, not owned. + */ + RSocket& iSocket; + + /** + * Reference to session that owns the writer. + * Session is request writing and is notified when it's finished or + * errors occure, not owned. + */ + CUpnpTcpSession& iSession; + + /** + * State of the writer. + */ + TWriterState iState; + + /** + * Buffer that is used to send data to session. + * Own. + */ + RBuf8 iSendBuffer; + + /** + * List of write requests. If session is unable to send data to session, + * it is put into write request list. + * Own. + */ + RPointerArray iWriteRequestList; + + /** + * Initial priority of the active object. + */ + TThreadPriority iInitialPriority; + + /** + * Implementation of retrying write to the socket + */ + CUpnpRetryWrite* iRetryWrite; + + }; + +#endif // C_UPNPTCPSESSIONWRITER_H + +// End Of File