engine/src/ShowEngine.cpp
branchsymbian1
changeset 145 cc0182a5da39
parent 67 9c24c921ec35
child 147 2e626f5a52c8
--- a/engine/src/ShowEngine.cpp	Sat May 15 11:13:19 2010 +0100
+++ b/engine/src/ShowEngine.cpp	Fri May 28 17:43:08 2010 +0100
@@ -1025,6 +1025,52 @@
 		}
 	}
 
+void CShowEngine::DBSwapDownloadsL(TDownload aFirstDL, TDownload aSecondDL)
+	{
+	DP("CShowEngine::DBSwapDownloadsL");
+	_LIT(KSqlStatement, "update downloads set uid=%d where dl_index=%d");
+	
+	iSqlBuffer.Format(KSqlStatement, aFirstDL.iUid, aSecondDL.iIndex);
+	sqlite3_stmt *st;
+	int rc = sqlite3_prepare16_v2(&iDB, (const void*) iSqlBuffer.PtrZ(), -1,
+			&st, (const void**) NULL);
+	
+	if (rc == SQLITE_OK)
+		{
+		Cleanup_sqlite3_finalize_PushL(st);
+		rc = sqlite3_step(st);
+		if (rc != SQLITE_DONE)
+			{
+			User::Leave(KErrUnknown);
+			}
+		CleanupStack::PopAndDestroy(); // st
+		}
+	else
+		{
+		User::Leave(KErrCorrupt);
+		}
+	
+	iSqlBuffer.Format(KSqlStatement, aSecondDL.iUid, aFirstDL.iIndex);
+	
+	rc = sqlite3_prepare16_v2(&iDB, (const void*) iSqlBuffer.PtrZ(), -1,
+			&st, (const void**) NULL);
+	
+	if (rc == SQLITE_OK)
+		{
+		Cleanup_sqlite3_finalize_PushL(st);
+		rc = sqlite3_step(st);
+		if (rc != SQLITE_DONE)
+			{
+			User::Leave(KErrUnknown);
+			}
+		CleanupStack::PopAndDestroy(); // st
+		}
+	else
+		{
+		User::Leave(KErrCorrupt);
+		}
+	}
+
 EXPORT_C CShowInfo* CShowEngine::GetNextShowByTrackL(CShowInfo* aShowInfo)
 	{
 	CShowInfo* nextShow = NULL;
@@ -1387,3 +1433,129 @@
 		}
 	}
 
+EXPORT_C void CShowEngine::MoveDownloadUpL(TUint aUid)
+	{
+	DP("CShowEngine::MoveDownLoadUpL");
+	_LIT(KSqlStatement, "select * from downloads");
+	iSqlBuffer.Format(KSqlStatement);
+
+	sqlite3_stmt *st;
+
+	int rc = sqlite3_prepare16_v2(&iDB, (const void*) iSqlBuffer.PtrZ(), -1,
+			&st, (const void**) NULL);
+
+	if (rc == SQLITE_OK)
+		{
+		RArray<TDownload> downloads;
+		CleanupClosePushL(downloads);
+	
+		rc = sqlite3_step(st);
+		Cleanup_sqlite3_finalize_PushL(st);
+		
+		TInt selectedIdx = -1;
+		while (rc == SQLITE_ROW && selectedIdx == -1)
+			{
+			TDownload download;
+			
+			download.iIndex = sqlite3_column_int(st, 0);
+			download.iUid = sqlite3_column_int(st, 1);
+			
+			downloads.Append(download);
+			
+			if (download.iUid == aUid)
+				{
+				selectedIdx = downloads.Count()-1;
+				}
+			
+			rc = sqlite3_step(st);
+			}
+		CleanupStack::PopAndDestroy();//st, downloads
+		
+		// If the selected download was found in the database
+		if (selectedIdx != -1)
+			{
+			// Swap the specified download with the one above it
+			TDownload selectedDownload = downloads[selectedIdx];
+			TDownload previousDownload = downloads[selectedIdx - 1];
+			
+			// SQL - Update index (with index of selected download) where uid is of previous download
+			// and update index (with index of previous download) where uid if of selected download
+			DBSwapDownloadsL(selectedDownload, previousDownload);
+			}
+		else
+			{
+			User::Leave(KErrNotFound);
+			}
+		
+		CleanupStack::PopAndDestroy(); // downloads
+		}
+	else
+		{
+		User::Leave(KErrCorrupt);
+		}
+	}
+
+EXPORT_C void CShowEngine::MoveDownloadDownL(TUint aUid)
+	{
+	DP("CShowEngine::MoveDownLoadDownL");
+	
+	// An upside-down list will result in the download moving down
+	_LIT(KSqlStatement, "select * from downloads order by dl_index desc");
+	iSqlBuffer.Format(KSqlStatement);
+
+	sqlite3_stmt *st;
+
+	int rc = sqlite3_prepare16_v2(&iDB, (const void*) iSqlBuffer.PtrZ(), -1,
+			&st, (const void**) NULL);
+
+	if (rc == SQLITE_OK)
+		{
+		RArray<TDownload> downloads;
+		CleanupClosePushL(downloads);
+	
+		rc = sqlite3_step(st);
+		Cleanup_sqlite3_finalize_PushL(st);
+		
+		TInt selectedIdx = -1;
+		while (rc == SQLITE_ROW && selectedIdx == -1)
+			{
+			TDownload download;
+			
+			download.iIndex = sqlite3_column_int(st, 0);
+			download.iUid = sqlite3_column_int(st, 1);
+			
+			downloads.Append(download);
+			
+			if (download.iUid == aUid)
+				{
+				selectedIdx = downloads.Count()-1;
+				}
+			
+			rc = sqlite3_step(st);
+			}
+		CleanupStack::PopAndDestroy();//st, downloads
+		
+		// If the selected download was found in the database
+		if (selectedIdx != -1)
+			{
+			// Swap the specified download with the one above it
+			TDownload selectedDownload = downloads[selectedIdx];
+			TDownload previousDownload = downloads[selectedIdx - 1];
+			
+			// SQL - Update index (with index of selected download) where uid is of previous download
+			// and update index (with index of previous download) where uid if of selected download
+			DBSwapDownloadsL(selectedDownload, previousDownload);
+			}
+		else
+			{
+			User::Leave(KErrNotFound);
+			}
+		
+		CleanupStack::PopAndDestroy(); // downloads
+		}
+	else
+		{
+		User::Leave(KErrCorrupt);
+		}
+	}
+