webservices/wshttpchanneltransportplugin/src/senrfiletxnstate.cpp
changeset 0 62f9d29f7211
child 1 272b002df977
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webservices/wshttpchanneltransportplugin/src/senrfiletxnstate.cpp	Thu Jan 07 16:19:19 2010 +0200
@@ -0,0 +1,220 @@
+/*
+* Copyright (c) 2002-2005 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:    
+*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <http.h>
+#include "senrfiletxnstate.h"
+#include "senhttpchannel.h"
+#include "sendebug.h"
+#include "senlogger.h"
+#include "senasynctimeout.h"
+
+
+// MACROS
+const TInt KDataPartLength = 1024;
+// =========================== MEMBER FUNCTIONS ===============================
+
+// ----------------------------------------------------------------------------
+// CSenRfileTxnState::CSenRfileTxnState
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// ----------------------------------------------------------------------------
+//
+
+CSenRfileTxnState::CSenRfileTxnState(MSenResponseObserver& aObserver)//,
+                           //RFileLogger* aLog)
+    : CSenTxnState (aObserver/*, iLog(aLog)*/)
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CSenRfileTxnState::NewLC
+// ----------------------------------------------------------------------------
+//
+
+CSenRfileTxnState* CSenRfileTxnState::NewLC(MSenResponseObserver& aObserver,
+                                  //RFileLogger* aLog,
+                                  const TDesC8* aUri,
+                                  CSenHttpChannelImpl* aHttpClient,
+                                  const TDesC8& aContentType,
+                                  const RFile& aContent)
+    {
+    CSenRfileTxnState* pNew = new (ELeave) CSenRfileTxnState(aObserver);//, aLog);
+    CleanupStack::PushL(pNew);
+    pNew->ConstructL(aUri, aHttpClient,aContentType, aContent);
+    return pNew;
+    }
+
+// ----------------------------------------------------------------------------
+// CSenRfileTxnState::NewL
+// ----------------------------------------------------------------------------
+//
+
+CSenRfileTxnState* CSenRfileTxnState::NewL(MSenResponseObserver& aObserver,
+                                 //RFileLogger* aLog,
+                                 const TDesC8* aUri,
+                                 CSenHttpChannelImpl* aHttpClient,
+                                 const TDesC8& aContentType,
+                                 const RFile& aContent)
+    {
+    CSenRfileTxnState* pNew = NewLC( aObserver, /*aLog,*/ aUri,
+                                aHttpClient,aContentType, aContent );
+    CleanupStack::Pop(pNew);
+    return pNew;
+    }
+
+// ----------------------------------------------------------------------------
+// CSenRfileTxnState::ConstructL
+// ----------------------------------------------------------------------------
+//
+
+void CSenRfileTxnState::ConstructL(const TDesC8* aUri,
+                              CSenHttpChannelImpl* aHttpClient,
+                              const TDesC8& aContentType,
+                              const RFile& aContent)
+    {
+    __ASSERT_ALWAYS(aUri != NULL,
+                    User::Panic(KRequestUriNullPanicText,
+                                CSenHttpChannel::ERequestUriNull));
+    iRequestUri = aUri->AllocL();
+    iFile = aContent;
+    iHttpClient = aHttpClient ;
+    iSize = 0 ;
+    TInt err = iFile.Size(iSize) ;
+    if(iSize >0)
+        {
+            iHasRequestBody = ETrue;
+            iPostContentType = aContentType.AllocL();
+        }    
+    }
+
+// ----------------------------------------------------------------------------
+// CSenRfileTxnState::~CSenRfileTxnState
+// ----------------------------------------------------------------------------
+//
+CSenRfileTxnState::~CSenRfileTxnState()
+    {
+    iFile.Close();
+    }
+
+
+// ----------------------------------------------------------------------------
+// CSenRfileTxnState::GetNextDataPart
+// Implementation of the pure virtual method from MHTTPDataSupplier
+// ----------------------------------------------------------------------------
+//
+TBool CSenRfileTxnState::GetNextDataPart(TPtrC8& aDataPart)
+    {
+    TLSLOG(KSenHttpChannelLogChannelBase , KMinLogLevel,(_L("CSenRfileTxnState::GetNextDataPart")));
+    TBool noMoreData = ETrue;   // No more data
+    
+    if ( iFile.SubSessionHandle() )    // Send in a chunked mode from file
+        {        
+        if ( !iReadData )
+            {
+            TRAPD(retVal,
+		            iReadData = HBufC8::NewL( KDataPartLength );  
+		            TPtr8 ptr = iReadData->Des();
+		            User::LeaveIfError( iFile.Read( ptr, KDataPartLength ) );
+            		);
+            
+            // More content remains if buffer is full
+            // If buffer is not full (!EOF) => no more data
+            if (iReadData->Length() == KDataPartLength)
+	            {
+	            iMoreContent = ETrue ;	
+	            }
+	            else
+	            {
+	            iMoreContent = EFalse ;
+	            }
+            }
+        
+        // Check if more content to be send (false = more data)  
+        noMoreData = !MoreBody();        
+        }
+    
+    aDataPart.Set( *iReadData );
+    return noMoreData;
+    }
+
+// ----------------------------------------------------------------------------
+// CSenRfileTxnState::ReleaseData
+// Implementation of the pure virtual method from MHTTPDataSupplier
+// ----------------------------------------------------------------------------
+//
+void CSenRfileTxnState::ReleaseData()
+    {
+    TLSLOG(KSenHttpChannelLogChannelBase , KMinLogLevel,(_L("CSenRfileTxnState::ReleaseData")));
+    if ( MoreBody() )    // More data
+        {
+        TRAP_IGNORE( iHttpClient->NotifyMoreBodyL() );
+        }
+    
+    delete iReadData;
+    iReadData = NULL;   
+    }
+
+// ----------------------------------------------------------------------------
+// CSenRfileTxnState::OverallDataSize
+// Implementation of the pure virtual method from MHTTPDataSupplier
+// ----------------------------------------------------------------------------
+//
+TInt CSenRfileTxnState::OverallDataSize()
+    {
+	// File is uploaded in chunked mode.
+    TLSLOG_FORMAT((KSenHttpChannelLogChannelBase , KNormalLogLevel, _L8("CSenRfileTxnState::OverallDataSize() [%d]"), iSize));	
+	    if(iFile.SubSessionHandle())
+		    {
+		    return iSize;	
+		    }
+	    else
+			{
+			return KErrNotFound;	
+			}
+    }
+
+// ----------------------------------------------------------------------------
+// CSenRfileTxnState::Reset
+// Implementation of the pure virtual method from MHTTPDataSupplier
+// ----------------------------------------------------------------------------
+//
+TInt CSenRfileTxnState::Reset()
+    {
+    TLSLOG(KSenHttpChannelLogChannelBase , KMinLogLevel,(_L("CSenRfileTxnState::Reset")));
+    if ( iFile.SubSessionHandle() )
+        {
+        TInt pos;
+        return iFile.Seek( ESeekStart, pos );   // Go to
+        }
+    
+    return KErrNone;     // KErrNone if reset succeeded
+    }
+
+// ---------------------------------------------------------------------------
+// Return flag if more body exist to be send in chunked mode.
+// ---------------------------------------------------------------------------
+//
+TBool CSenRfileTxnState::MoreBody() const
+    {
+    // File == chunked mode
+    return ( iFile.SubSessionHandle() && iMoreContent );
+    }
+//  End of File