--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/upnp/upnpstack/upnphttptransfer/inc/httpuploadworker.h Tue Feb 02 01:12:20 2010 +0200
@@ -0,0 +1,312 @@
+/** @file
+* Copyright (c) 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: Handles upload of single file
+*
+*/
+
+
+#ifndef C_HTTPUPLOADWORKER_H
+#define C_HTTPUPLOADWORKER_H
+
+// system includes
+#include <escapeutils.h>
+#include <http/mhttpdatasupplier.h>
+
+// user includes
+#include "httptransferworker.h"
+
+// forward declarations
+class MHttpWorkerObserver;
+
+/**
+ * Handles upload of single file. Used by CHttpUploader.
+ *
+ * @lib httptransfer.lib
+ * @since S60 v3.2
+ */
+NONSHARABLE_CLASS ( CHttpUploadWorker ) : public CHttpTransferWorker,
+ public MHTTPDataSupplier,
+ MHttpNotifyTimerObserver
+ {
+public:
+
+ /**
+ * Constructor
+ *
+ * @since S60 v3.2
+ * @param aObserver Transfer observer
+ * @param aIAPId IAP id
+ * @param aBufferSize Size of the buffer
+ * @param aCallback Call back to workerobserver
+ */
+ static CHttpUploadWorker* NewL( MHttpTransferObserver& aObserver,
+ TUint aIAPId,
+ TUint aBufferSize,
+ MHttpWorkerObserver& aCallback );
+
+ /**
+ * Constructor
+ *
+ * @since S60 v3.2
+ * @param aObserver Transfer observer
+ * @param aIAPId IAP id
+ * @param aBufferSize Size of the buffer
+ * @param aCallback Call back to workerobserver
+ */
+ static CHttpUploadWorker* NewLC( MHttpTransferObserver& aObserver,
+ TUint aIAPId,
+ TUint aBufferSize,
+ MHttpWorkerObserver& aCallback );
+
+ /**
+ * Destructor
+ *
+ * @since S60 v3.2
+ */
+ virtual ~CHttpUploadWorker();
+
+// New functions
+
+ /**
+ * Sends a file to some URI through HTTP channel.
+ * The POST HTTP method is used.
+ *
+ * @since S60 v.3.2
+ */
+ void SendL();
+
+ /**
+ * Invokes the http method.
+ * This actually creates the transaction, sets the headers and body
+ * and then starts the transaction.
+ *
+ * @since S60 v3.2
+ */
+ void InvokeHttpMethodL();
+
+// from base class CHttpTransferWorker
+
+ /**
+ * Stops the transfer of the file
+ *
+ * @since S60 v3.2
+ */
+ void CancelTransfer();
+
+ /**
+ * Starts the processing of a file. Asynchronous.
+ *
+ * @since S60 v3.2
+ */
+ virtual void StartProcessL();
+
+// from base class MHTTPTransactionCallback
+
+ /**
+ * Called by framework to notify about transaction events.
+ *
+ * @since S60 v3.2
+ * @param aTransaction Transaction, where the event occured.
+ * @param aEvent Occured event.
+ */
+ virtual void MHFRunL( RHTTPTransaction aTransaction,
+ const THTTPEvent& aEvent );
+
+ /**
+ * Called by framework when leave occurs in handling of
+ * transaction event.
+ *
+ * @since S60 v3.2
+ * @param aError The leave code that occured.
+ * @param aTransaction The transaction that was being processed
+ * @param aEvent The event that was being processed
+ * @return Error code
+ */
+ virtual TInt MHFRunError( TInt aError,
+ RHTTPTransaction aTransaction,
+ const THTTPEvent& aEvent );
+
+// from base class MHttpDataSupplier
+
+ /**
+ * Obtain a data part from the supplier. The data is guaranteed
+ * to survive until a call is made to ReleaseData()
+ *
+ * @since S60 v3.2
+ * @param aDataPart - the data part
+ * @return ETrue if this is the last part. EFalse otherwise
+ */
+ TBool GetNextDataPart( TPtrC8& aDataPart );
+
+ /**
+ * Release the current data part being held at the data
+ * supplier. This call indicates to the supplier that the part
+ * is no longer needed, and another one can be supplied, if
+ * appropriate.
+ *
+ * @since S60 v3.2.
+ */
+ void ReleaseData();
+
+ /**
+ * Obtain the overall size of the data being supplied, if known
+ * to the supplier. Where a body of data is supplied in several
+ * parts this size will be the sum of all the part sizes. If
+ * the size is not known, KErrNotFound is returned; in this case
+ * the client must use the return code of GetNextDataPart to find
+ * out when the data is complete.
+ *
+ * @since S60 v3.2
+ * @return Return code
+ */
+ TInt OverallDataSize();
+
+ /**
+ * Reset the data supplier. This indicates to the data supplier that
+ * it should return to the first part of the data. This could be used
+ * in a situation where the data consumer has encountered an error
+ * and needs the data to be supplied afresh. Even if the last part
+ * has been supplied (i.e. GetNextDataPart has returned ETrue), the
+ * data supplier should reset to the first part.
+ *
+ * If the supplier cannot reset it should return an error code;
+ * otherwise it should return KErrNone, where the reset will be assumed
+ * to have succeeded
+ *
+ * @since S60 v3.2
+ * @return Error code
+ */
+ TInt Reset();
+
+
+private:
+
+ /**
+ * Default constructor
+ *
+ * @since S60 v3.2
+ * @param aObserver Transfer observer
+ * @param aIAPId IAP id
+ * @param aBufferSize Size of the buffer
+ * @param aCallback Call back to workerobserver
+ */
+ CHttpUploadWorker( MHttpTransferObserver& aObserver,
+ TUint aIAPId,
+ TUint aBufferSize,
+ MHttpWorkerObserver& aCallback );
+
+ /**
+ * Second phase constructor
+ *
+ * @since S60 v3.2
+ */
+ void ConstructL();
+
+ /**
+ * Map HTTP transaction error to Symbian error (POST request)
+ *
+ * @since S60 v3.2
+ * @param aError HTTP transaction error
+ * @return symbian error code
+ */
+ TInt MapPostTransactionError( TInt aError ) const;
+
+ /**
+ * Complete the transaction and notify the client
+ *
+ * @since S60 v3.2
+ * @param aError HTTP transaction error
+ */
+ void CompleteAndNotify( TInt aError );
+
+ /**
+ * Callback function for timer expirations.
+ * @since Series60 5.0 HN
+ * @param aTimer Timer that has expired.
+ **/
+ void TimerEventL( CHttpNotifyTimer* aTimer );
+
+ /**
+ * Cancels and destroys the 100-continue response wait timer if it exists.
+ *
+ * @since S60 v3.2.3
+ */
+ void Destroy100ContinueTimer();
+
+ /**
+ * Callback method for 100 continue timer. Cancels waiting for
+ * 100-continue response and proceeds with sending the body.
+ *
+ * @param TAny* the object who generated the event
+ * (TAny pointer to this object)
+ * @since S60 v3.2.3
+ */
+ static TInt Cancel100ContinueWaitL( TAny* aParam );
+
+private:
+
+ /**
+ * For performance reasons,
+ * read data from the file in chunks of 640K
+ * Own.
+ */
+ HBufC8* iRequestBodyBuffer;
+
+ /**
+ * How much body data has been sent to the HTTP stack
+ */
+ TUint iSendDataCount;
+
+ /**
+ * How much data will be sent
+ */
+ TInt iOverallDataSize;
+
+ /**
+ * Is there still data left
+ */
+ TBool iMoreToCome;
+
+ /**
+ * Was the process of the request already done
+ * to avoid the repeated the process of the same part of the request
+ */
+ TBool iAlreadyDone;
+
+ /**
+ * Here in file to start to read, currently always 0
+ * (the beginning of the file)
+ */
+ TUint iBodyFileOffset;
+
+ /**
+ * Http status
+ */
+ TInt iHttpStatus;
+
+ /**
+ * Timer to wait for 100-continue response. If no response is received
+ * in the given time, we will continue with sending the body.
+ * Owned.
+ */
+ CPeriodic* i100ContinueTimer;
+
+ /**
+ * Timeout timer for current session
+ */
+ CHttpNotifyTimer* iSessionTimer;
+
+ };
+
+#endif // C_HTTPUPLOADWORKER_H
\ No newline at end of file