--- /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 <e32base.h>
+#include <in_sock.h>
+#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<CUpnpTcpWriteRequest> 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