ncdengine/engine/transport/src/catalogshttpdownload.cpp
branchRCL_3
changeset 65 7333d7932ef7
parent 18 3ba40be8e484
child 66 8b7f4e561641
--- a/ncdengine/engine/transport/src/catalogshttpdownload.cpp	Thu Aug 19 10:02:49 2010 +0300
+++ b/ncdengine/engine/transport/src/catalogshttpdownload.cpp	Tue Aug 31 15:21:33 2010 +0300
@@ -23,6 +23,13 @@
 #include <DocumentHandler.h>
 #include <apmstd.h> // TDataType
 #include <escapeutils.h>
+#include <downloadmanager.h>
+#include <cmmanager.h>
+#include <cmdestination.h>
+#include <uri8.h> 
+#include <QtGlobal>
+#include <QStringList>
+#include <xqconversions.h>
 
 #include "catalogshttpdownloadmanagerimpl.h"
 #include "catalogshttpobserver.h"
@@ -95,7 +102,7 @@
 //	
 CCatalogsHttpDownload* CCatalogsHttpDownload::NewLC( 
     CCatalogsHttpDownloadManager& aOwner, 
-    RHttpDownload* aDownload,
+    Download* aDownload,
     const CCatalogsHttpConfig& aConfig )
     {
     CCatalogsHttpDownload* self = new( ELeave ) CCatalogsHttpDownload( 
@@ -140,7 +147,7 @@
         else 
             {
             DLTRACE(( "Deleting download" ));
-            iDownload->Delete();                        
+             iOwner.GetDownloadManager()->removeOne(iDownload);                      
             
             if ( iState.iOperationState != ECatalogsHttpOpCompleted ) 
                 {
@@ -244,8 +251,8 @@
         {
         iObserver = NULL;
         TInt32 state = 0;
-        iDownload->GetIntAttribute( EDlAttrState, state );
-        
+
+         state = (Download::State)iDownload->attribute(State).toInt();
         if ( IsOneOf( 
                 static_cast<THttpDownloadState>( state ), 
                 EHttpDlCreated,
@@ -473,7 +480,14 @@
         TInt err = KErrNone;
         if ( iDownload ) 
             {
-            err = iDownload->Pause();
+					    try
+							{
+							iDownload->pause();
+							}
+			        catch(const std::exception& exception)
+			        	{
+							 err = qt_symbian_exception2Error(exception);
+			        	}
             }
         
         DLTRACE(("Pause err: %d", err ));
@@ -680,7 +694,7 @@
     // client-server communication with the Download manager server
     if ( iDownload && iContentSize <= 0 ) 
         {                
-        iDownload->GetIntAttribute( EDlAttrLength, iContentSize );    
+        iContentSize = iDownload->attribute(TotalSize).toInt();
         DLTRACE(("Content size from download: %i", iContentSize ));
         }
     return iContentSize;
@@ -706,7 +720,8 @@
     TBool pausable = ETrue;
     if ( iDownload ) 
         {        
-        iDownload->GetBoolAttribute( EDlAttrPausable, pausable );
+
+        pausable=iDownload->attribute(Pausable).toBool();
         }
     return pausable;
     }
@@ -799,7 +814,8 @@
     iConfig->InternalizeL( aStream );
     HBufC8* contentType = NULL;
     InternalizeDesL( contentType, aStream );
-    if ( contentType->Length() > KMaxContentTypeLength ) 
+    // HLa if ( contentType->Length() > KMaxContentTypeLength ) 
+    if ( contentType->Length() > 256 )
         {
         DeletePtr( contentType );
         DLERROR(("Content type was too long, leaving with KErrCorrupt"));
@@ -839,7 +855,152 @@
     return KErrNone;
     }
 
+void CCatalogsHttpDownload::HandledownloadEventL(DownloadEvent& aEvent)
+{
+	
+	switch(aEvent.type())
+	{
+		
+		case DownloadEvent::Started:
+		
+			break;
+		
+		case DownloadEvent::Error:	
+		case DownloadEvent::Failed:
+		case DownloadEvent::NetworkLoss:    
+		case DownloadEvent::ConnectionNeeded:  
+		case DownloadEvent::ConnectionDisconnected:    
+			{
+		    TInt32 errorId = -1;
+		    if ( aEvent.type() == DownloadEvent::NetworkLoss  || 
+		         aEvent.type() == DownloadEvent::ConnectionNeeded ||
+		         aEvent.type() == DownloadEvent::ConnectionDisconnected )
+		        {
+		        errorId = WRT::ConnectionFailed;
+		        }
+            SetTransferring( EFalse );
+            errorId = iDownload->attribute(LastError).toInt();
+            if ( errorId > 0 )
+                {
+                // Symbian error codes are always negative numbers 
+                errorId =  -1 * errorId;
+                }
+                                    
+            /*if ( ( errorId == ConnectionFailed || 
+                   errorId == TransactionFailed )) 
+                {
+                DLTRACE(("Try to reconnect"));
+                iReconnectWhenFail = EFalse;
+                iDownload->start();
+                break;
+                }
+            else if ( errorId == ContentExpired ||
+                      errorId == PartialContentModified )
+                {
+                DLTRACE(("Content has changed, reset and restart"));
+                iReconnectWhenFail = EFalse;
+                iDownload->cancel();
+                iDownload->start();
+                break;
+                }*/
+            iState.iOperationState = ECatalogsHttpOpFailed;
+            
+            TBool deleted = EFalse;
+            if ( iObserver ) 
+                {
+                // Determine whether failure was due to a HTTP error or some
+                // other error. 
+                //if ( errorId >= 400 ) 
+                //    {
+               //     deleted = iObserver->HandleHttpError( 
+               //     *this, TCatalogsHttpError(
+              //      ECatalogsHttpErrorHttp, 
+              //      errorId ) );
+              //      }
+              //  else 
+                    {
+                    AddRef();
+                    //iOwner.ConnectionManager().ReportConnectionError( 
+                    //               TCatalogsConnectionMethod(), errorId );
+                                
+                    if ( iRefCount > 1 )
+                        {                       
+                        deleted = iObserver->HandleHttpError( 
+                        *this, TCatalogsHttpError( 
+                        ECatalogsHttpErrorGeneral, errorId ) );
+                        }
+                    else 
+                        {
+                        deleted = ETrue;
+                        }
+                    Release();
+                    }
+                }
+            if ( !deleted )
+                {                
+                iOwner.CompleteOperation( this );
+                iState.iProgressState = ECatalogsHttpDone;
+                }
+			}
+			break;
+		
+		case DownloadEvent::Cancelled:
+		
+			break;
+		case DownloadEvent::ContentTypeChanged:
+			
+			break;
+		case DownloadEvent::HeadersReceived:
+			{
+					// Read the response headers from platform DL manager
+			UpdateResponseHeadersL();		
+			UpdateContentType();
+		  }
+			break;
+	
+	  
+		case DownloadEvent::Completed:
+			  {            
+            // move/rename temp file as the target file
+            TRAPD( err, MoveFileL() );
+            
+            // DLMAIN-546, delete DL manager's download before starting
+            // the next one so that downloads don't jam, again
+            if ( iDownload ) 
+                {   
+                	iTransferredSize = iDownload->attribute(DownloadedSize).toInt();             
+         
+                    
+                DLTRACE(("Deleting download"));                
+                DeletePlatformDownload();                
+                }
+            iState.iProgressState = ECatalogsHttpDone;
+            iOwner.CompleteOperation( this );
+            iState.iOperationState = ECatalogsHttpOpCompleted;
+            
+            if ( iObserver ) 
+                {                
+                iObserver->HandleHttpEventL( *this, iState );
+                }
 
+	     }
+			break;
+			
+		case DownloadEvent::InProgress:
+		    {
+		    iTransferredSize  =  iDownload->attribute(DownloadedSize).toInt();
+		    if ( iObserver ) 
+		        {                
+		        iObserver->HandleHttpEventL( *this, iState );
+		        }
+		    }
+		    break;
+		  
+	  default:
+            {
+            }		  
+	};
+}
 // ---------------------------------------------------------------------------
 // Handles events from the transaction
 // ---------------------------------------------------------------------------
@@ -991,6 +1152,8 @@
 // Handles events from the download manager
 // ---------------------------------------------------------------------------
 //	
+
+/* HLa
 void CCatalogsHttpDownload::HandleEventL( THttpDownloadEvent aEvent )
     {
     DLTRACEIN((""));
@@ -1025,20 +1188,20 @@
     
 	TInt32 statusCode = -1;
 	
-	iDownload->GetIntAttribute( EDlAttrStatusCode, statusCode );
-	DLINFO( ("Response status: %i", statusCode ) );
+	 statusCode  = (Download::State)iDownload->attribute(WRT::State).toInt(); 
+	 DLINFO( ("Response status: %i", statusCode ) );
 
 #ifdef CATALOGS_BUILD_CONFIG_DEBUG    
     TInt32 errorId = 0;
+		errorId=iDownload->attribute(LastError).toInt();
 
-	iDownload->GetIntAttribute( EDlAttrErrorId, errorId );
 	DLINFO( ("Error id: %i", errorId ) );
 	    
 #endif
 
     TInt32 globalErrorId = 0;    
-	iDownload->GetIntAttribute( 
-	    EDlAttrGlobalErrorId, globalErrorId );
+   globalErrorId= iDownload->attribute(LastError).toInt();
+
 	DLINFO( ("Global error id: %i", globalErrorId ) );
 	
 
@@ -1085,7 +1248,7 @@
                 {
                 DLTRACE(("Try to reconnect"));
                 iReconnectWhenFail = EFalse;
-                iDownload->Start();                
+                iDownload->start();                
                 break;
                 }
             
@@ -1143,9 +1306,9 @@
             // DLMAIN-546, delete DL manager's download before starting
             // the next one so that downloads don't jam, again
             if ( iDownload ) 
-                {                
-                iDownload->GetIntAttribute( 
-                    EDlAttrDownloadedSize, iTransferredSize );   
+                {   
+                	iTransferredSize = iDownload->attribute(DownloadedSize).toInt();             
+         
                     
                 DLTRACE(("Deleting download"));                
                 DeletePlatformDownload();                
@@ -1179,7 +1342,8 @@
             DLTRACE(( "Download failed" ));
             TInt32 errorId = -1;
             SetTransferring( EFalse );
-        	iDownload->GetIntAttribute( EDlAttrErrorId, errorId );
+            errorId = iDownload->attribute(LastError).toInt();
+        
         	DLINFO( ("Error id: %i", errorId ) );
 
         	DLINFO( ("Global error id: %i", globalErrorId ) );
@@ -1190,7 +1354,7 @@
                 {
                 DLTRACE(("Try to reconnect"));
                 iReconnectWhenFail = EFalse;
-                iDownload->Start();
+                iDownload->start();
                 break;
                 }
             else if ( errorId == EContentExpired ||
@@ -1198,8 +1362,8 @@
                 {
                 DLTRACE(("Content has changed, reset and restart"));
                 iReconnectWhenFail = EFalse;
-                iDownload->Reset();
-                iDownload->Start();
+                iDownload->cancel();
+                iDownload->start();
                 break;
                 }
             
@@ -1282,6 +1446,7 @@
         * Download process can be paused again. This event only occurs after
         * EHttpDlNonPausable. 
         */	
+/* HLa
         case EHttpDlPausable:
             {
             DLTRACE(( "Pausable" ));
@@ -1317,13 +1482,14 @@
             }	
         }
     }
-
+*/
 
 
 // ---------------------------------------------------------------------------
 // 
 // ---------------------------------------------------------------------------
 //	
+/*
 void CCatalogsHttpDownload::HandleEventProgressL( const 
     THttpDownloadEvent& aEvent )
     {
@@ -1388,8 +1554,7 @@
 		    if ( !iPaused ) 
 		        {		  
                 TInt32 globalErrorId = 0;
-            	iDownload->GetIntAttribute( 
-            	    EDlAttrGlobalErrorId, globalErrorId );
+            	    globalErrorId = iDownload->attribute(LastError).toInt();
             	DLINFO( ("Global error id: %i", globalErrorId ) );
 
                 if ( globalErrorId == KErrCancel ) 
@@ -1495,7 +1660,8 @@
 		    iReconnectCount = KReconnectAttempts;
 
 		    TInt32 size = 0;
-	        iDownload->GetIntAttribute( EDlAttrDownloadedSize, size );   
+		     size = iDownload->attribute(DownloadedSize).toInt();
+
 	        DLTRACE(("Transferred size from download: %i", size));
 
 	        if ( size != iTransferredSize ) 
@@ -1597,7 +1763,7 @@
 			break;
 		}
     }
-    
+ */   
 
 
 // ---------------------------------------------------------------------------
@@ -1636,7 +1802,7 @@
 //	
 CCatalogsHttpDownload::CCatalogsHttpDownload( 
     CCatalogsHttpDownloadManager& aOwner, 
-    RHttpDownload* aDownload ) :
+    Download* aDownload ) :
     iOwner( aOwner ), 
     iDownload( aDownload ), 
     iState( ECatalogsHttpOpCreated, ECatalogsHttpNone ),
@@ -1659,7 +1825,8 @@
         {        
         // id part will be updated from disk
         iId = TCatalogsTransportOperationId( iOwner.SessionId(), KErrNotFound );
-
+				iQTDownload = new CCatalogsHttpQTDownload(this,iDownload);
+				 
         UpdateSecondaryIdL();
         
         User::LeaveIfError( SetDeleteState( EDownloadCanBeDeleted ) );
@@ -1700,8 +1867,12 @@
         {
         // Download always exists when this is called so no need to check
         DLTRACE(("Updating the content type"));
-        iDownload->GetStringAttribute( EDlAttrContentType,
-            iContentType );
+        QString contentType;
+        contentType= iDownload->attribute(WRT::ContentType).toString();
+        // HLa TBuf<KMaxContentTypeLength>  ContentType(contentType.utf16());
+        TBuf<256>  ContentType(contentType.utf16());
+        	iContentType.Copy(ContentType);
+   
         }
     DLTRACEOUT(("Content-type: %S", &iContentType ));
     }
@@ -1820,10 +1991,18 @@
     // Get the current url of the download
     RBuf8 buf;
     CleanupClosePushL( buf );
+    const TInt KMaxUrlLength = 2048;
     buf.CreateL( KMaxUrlLength );
-    
-    User::LeaveIfError( iDownload->GetStringAttribute( EDlAttrCurrentUrl,
-        buf ) );
+    QString string;
+	try
+	{
+    string = iDownload->attribute(SourceUrl).toString();
+	}
+    catch(const std::exception& exception)
+    	{
+			 qt_symbian_exception2LeaveL(exception);
+    	}
+
     
     // DL manager has the encoded URI
     AssignDesL( iEncodedUri, buf );
@@ -1867,8 +2046,8 @@
             }
         else 
             {
-            User::LeaveIfError( iDownload->SetStringAttribute(
-                predefined, headers[i]->Value() ) );
+/*            User::LeaveIfError( iDownload->SetStringAttribute(
+                predefined, headers[i]->Value() ) );*/
             }
         }
 
@@ -1877,8 +2056,8 @@
     if ( iAddedRequestHeaders ) 
         {
         DLTRACE(( "added request headers: %S", iAddedRequestHeaders ));
-        User::LeaveIfError( iDownload->SetStringAttribute(
-            EDlAttrRequestHeaderAddon, *iAddedRequestHeaders ) );
+     /*   User::LeaveIfError( iDownload->SetStringAttribute(
+            EDlAttrRequestHeaderAddon, *iAddedRequestHeaders ) );*/
         delete iAddedRequestHeaders;
         iAddedRequestHeaders = NULL;
         }    
@@ -2043,6 +2222,7 @@
 TUint CCatalogsHttpDownload::MatchWithPredefinedRequestHeader( 
     const TDesC8& aHeader ) const
     {
+    /* HLa
     if ( aHeader.CompareF( KHttpRequestAcceptHeader ) == 0 ) 
         {
         return EDlAttrRequestAccept;
@@ -2087,7 +2267,7 @@
         {
         return EDlAttrRequestVary;
         }
-    
+    */
     return 0;
     }
     
@@ -2100,6 +2280,7 @@
 TUint CCatalogsHttpDownload::MatchWithPredefinedGeneralHeader( 
     const TDesC8& aHeader ) const
     {
+    /* HLa
     if ( aHeader.CompareF( KHttpGeneralCacheControlHeader ) == 0 ) 
         {
         return EDlAttrGeneralCacheControl;
@@ -2119,7 +2300,8 @@
     else if ( aHeader.CompareF( KHttpGeneralWarningHeader ) == 0 ) 
         {
         return EDlAttrGeneralWarning;
-        }    
+        }
+        */    
     return 0;
     }
     
@@ -2132,6 +2314,7 @@
 TUint CCatalogsHttpDownload::MatchWithPredefinedEntityHeader( 
     const TDesC8& aHeader ) const
     {
+    /*
     if ( aHeader.CompareF( KHttpEntityAllowHeader ) == 0 ) 
         {
         return EDlAttrEntityAllow;
@@ -2156,6 +2339,7 @@
         {
         return EDlAttrEntityLastModified;
         }
+        */
     return 0;
     }
         
@@ -2195,6 +2379,9 @@
 
     TPtr8 ptr( aTarget->Des() );
     
+    _LIT8( KHttpFieldSeparator, "\n"); // HLa
+    const TInt KColon( ':' ); // HLa
+    
     if( newSize ) 
         {
         DLTRACE( ("Appending to existing headers") );
@@ -2245,7 +2432,25 @@
     
     TRAPD( err, 
         {
-        iOwner.SetConnectionL( *iConnection );
+        if ( Config().ConnectionMethod().iType == ECatalogsConnectionMethodTypeDestination )
+            {
+            RCmManager cmManager;
+            CleanupClosePushL( cmManager );
+            cmManager.OpenL();
+            RCmDestination dest = cmManager.DestinationL( Config().ConnectionMethod().iId );
+            CleanupClosePushL( dest );
+            HBufC* temp = dest.NameLC();    
+            QString destname;
+            destname = XQConversions::s60DescToQString( *temp );
+            CleanupStack::PopAndDestroy( temp );
+            CleanupStack::PopAndDestroy( &dest ); 
+            CleanupStack::PopAndDestroy( &cmManager ); 
+            if ( iOwner.GetDownloadManager() )
+                {
+                iOwner.GetDownloadManager()->attribute(AccessPoints).toStringList();
+                iOwner.GetDownloadManager()->setAttribute(AccessPoint, destname);
+                }
+            }
             
         // Update the configuration 
         if ( iState.iProgressState == ECatalogsHttpNone ) 
@@ -2254,10 +2459,17 @@
             InitializeDownloadL();
             }
         });
-    
+   
     if ( err == KErrNone ) 
         {
-        err = iDownload->Start();
+						 try
+							{
+							iDownload->start();
+							}
+			        catch(const std::exception& exception)
+			        	{
+							 qt_symbian_exception2LeaveL(exception);
+			        	}
         }
     return err;
     }
@@ -2471,13 +2683,17 @@
     TInt err = KErrNone;
     if ( iDownload ) 
         {    
-        err = iDownload->SetIntAttribute( EDlAttrUserData, aStatus );
+
+        iStatus = aStatus;
         }
     
     return err;
     }
 
-
+CCatalogsHttpDownload::TDownloadDeleteState CCatalogsHttpDownload::GetStatusState()
+	{
+		return iStatus;
+	}
 // ---------------------------------------------------------------------------
 // Gets delete status and download id from the platform download
 // ---------------------------------------------------------------------------
@@ -2491,7 +2707,8 @@
     TInt err = KErrNotReady;
     if ( iDownload ) 
         {
-        err = iDownload->GetIntAttribute( EDlAttrUserData, data );
+
+        err = iStatus;
         DLTRACE(("Data: %d", data));
         aStatus = static_cast<TDownloadDeleteState>( data );
         }
@@ -2570,10 +2787,18 @@
             UpdateRequestHeadersL();                    
             }
                 
-        // Check if the download has been set progressive
-        TBool progressive = EFalse;
-        User::LeaveIfError( iDownload->GetBoolAttribute( 
-            EDlAttrProgressive, progressive ) );
+        // Check if the 
+        //download has been set progressive
+        /* MTA
+         * TBool progressive = EFalse;
+		try
+		{
+		         progressive =iDownload->attribute(Progressive).toBool(); 
+		}
+        catch(const std::exception& exception)
+        	{
+				 qt_symbian_exception2LeaveL(exception);
+        	}  
 
         
         // We want to have progressive downloads because then DL manager uses
@@ -2591,18 +2816,34 @@
              !iFileIsSet ) 
             {
             DLTRACE(("Setting download as progressive"));
-            User::LeaveIfError( iDownload->SetBoolAttribute( 
-                EDlAttrProgressive, ETrue ) );
-            }
+						try
+						{
+						   iDownload->setAttribute(Progressive,ETrue);
+						}
+						catch(const std::exception& exception)
+						{
+							qt_symbian_exception2LeaveL(exception);
+						}  
+						}
         
         // Doesn't pause the download after content type has been received
-        User::LeaveIfError( iDownload->SetBoolAttribute( 
-            EDlAttrNoContentTypeCheck, ETrue ) );
-
+					try
+					{
+						iDownload->setAttribute(Progressive,ETrue);
+					}
+					catch(const std::exception& exception)
+					{
+						qt_symbian_exception2LeaveL(exception);
+					}  
+**/
         if ( !iFileIsSet )
             {
             DLTRACE(("Setting filehandle to download"));
-            User::LeaveIfError( iDownload->SetFileHandleAttribute( file ) );
+           // User::LeaveIfError( iDownload->SetFileHandleAttribute( file ) );
+            file.Close();
+            TInt ret = BaflUtils::DeleteFile( iFs, *iTempFilename );
+            iDownload->setAttribute(DestinationPath,XQConversions::s60DescToQString(iConfig->Directory()));
+            iDownload->setAttribute(FileName, XQConversions::s60DescToQString(*iTempFilename));
             iFileIsSet = ETrue;                        
             }
 
@@ -2610,7 +2851,10 @@
         }        
     }
 
-
+Download* CCatalogsHttpDownload::GetDownload()
+{
+	return iDownload;
+}
 // ---------------------------------------------------------------------------
 // Delete platform download and reset secondary id
 // ---------------------------------------------------------------------------
@@ -2619,7 +2863,7 @@
     {
     if ( iDownload )
         {
-        iDownload->Delete();
+        iOwner.GetDownloadManager()->removeOne(iDownload);
         iDownload = NULL;
         iId.SetSecondaryId( KErrNotFound );
         }
@@ -2633,8 +2877,7 @@
 void CCatalogsHttpDownload::UpdateSecondaryIdL()
     {
     TInt32 secondaryId = KErrNotFound;
-    User::LeaveIfError( 
-        iDownload->GetIntAttribute( EDlAttrId, secondaryId ) );
+    secondaryId = iDownload->id();
     iId.SetSecondaryId( secondaryId );    
     }
 
@@ -2675,3 +2918,22 @@
        aName.Append( aExt );
        }
     }
+    
+CCatalogsHttpQTDownload::CCatalogsHttpQTDownload(CCatalogsHttpDownload* aHttpDownload,Download* aDownload)
+	{
+		iCatalogsHttpDownload = aHttpDownload;
+		iDownload = aDownload;
+		connect(iDownload, SIGNAL(downloadEvent(DownloadEvent*)), this,SLOT(downloadEventHandler(DownloadEvent*)));
+        connect(iDownload, SIGNAL(downloadError(Error)), this,SLOT(downloadErrorHandler(Error)));
+	}
+	
+void CCatalogsHttpQTDownload::downloadEventHandler(DownloadEvent* aEvent)
+	{
+		iCatalogsHttpDownload->HandledownloadEventL(*aEvent);
+	}
+void CCatalogsHttpQTDownload::downloadErrorHandler(Error)
+	{
+		//iCatalogsHttpDownload->HandledownloadEventL(*aEvent);
+	}
+
+