We always build the static version of sqlite for now. Further improvements for signaling when icons has been generated so these can be used in the feedview
authorLars Persson <lars.persson@embeddev.se>
Wed, 31 Mar 2010 14:50:33 +0200
changeset 93 bbf5c5204844
parent 92 dc142c8740eb
child 94 8d36b7608232
We always build the static version of sqlite for now. Further improvements for signaling when icons has been generated so these can be used in the feedview
application/inc/PodcastFeedView.h
application/inc/PodcastShowsView.h
application/src/PodcastFeedView.cpp
application/src/PodcastShowsView.cpp
engine/BWINS/podcastengineu.def
engine/inc/FeedEngine.h
engine/inc/FeedInfo.h
engine/inc/ImageHandler.h
engine/inc/PodcastModel.h
engine/src/FeedEngine.cpp
engine/src/FeedInfo.cpp
engine/src/ImageHandler.cpp
engine/src/PodcastModel.cpp
group/bld.inf
--- a/application/inc/PodcastFeedView.h	Wed Mar 31 08:41:07 2010 +0200
+++ b/application/inc/PodcastFeedView.h	Wed Mar 31 14:50:33 2010 +0200
@@ -95,7 +95,7 @@
 		void DialogDismissedL(TInt aButtonId); 
 
 		// from MImageHandlerCallback
-		void ImageOperationCompleteL(TInt aError, TUint aHandle);
+		void ImageOperationCompleteL(TInt aError, TUint aHandle, CPodcastModel& aPodcastModel);
 		
 		void HandleLongTapEventL( const TPoint& aPenEventLocation, const TPoint& aPenEventScreenLocation);
 
--- a/application/inc/PodcastShowsView.h	Wed Mar 31 08:41:07 2010 +0200
+++ b/application/inc/PodcastShowsView.h	Wed Mar 31 14:50:33 2010 +0200
@@ -109,7 +109,7 @@
 	 * @param aError Error code given by the CImageHandler or 0 (zero) if the
 	 *   image was loaded successfully.
 	 */
-	virtual void ImageOperationCompleteL(TInt aError, TUint aHandle);
+	virtual void ImageOperationCompleteL(TInt aError, TUint aHandle, CPodcastModel& aPodcastModel);
 	void HandleSetShowPlayed(TBool aPlayed);
 	void HandleDeleteShow();
 	void UpdateViewTitleL();
--- a/application/src/PodcastFeedView.cpp	Wed Mar 31 08:41:07 2010 +0200
+++ b/application/src/PodcastFeedView.cpp	Wed Mar 31 14:50:33 2010 +0200
@@ -378,28 +378,26 @@
 			}
 		}
 	CArrayPtr<CGulIcon>* icons = iListContainer->Listbox()->ItemDrawer()->FormattedCellData()->IconArray();
-	
-	/*if (aFeedInfo.FeedIconIndex() != -1) {
-		iconIndex = aFeedInfo.FeedIconIndex();
-	} else*/ {
-		if(aFeedInfo.FeedIcon() != NULL && 
-				aFeedInfo.FeedIcon()->SizeInPixels().iHeight > 0 &&
-				aFeedInfo.FeedIcon()->SizeInPixels().iWidth > 0)
-			{
-			// Hopefully temporary haxx to prevent double delete. I would prefer if
-			// this could be solved with a little better design.
-			CFbsBitmap* bmpCopy = new (ELeave) CFbsBitmap;
-			CleanupStack::PushL(bmpCopy);
-			bmpCopy->Duplicate(aFeedInfo.FeedIcon()->Handle());
-			icons->AppendL( CGulIcon::NewL(bmpCopy, NULL));
-			CleanupStack::Pop(bmpCopy);						
-			}
-		else {
-		
+
+	if(aFeedInfo.FeedIcon() != NULL && 
+			aFeedInfo.FeedIcon()->SizeInPixels().iHeight > 0 &&
+			aFeedInfo.FeedIcon()->SizeInPixels().iWidth > 0)
+		{
+		// Hopefully temporary haxx to prevent double delete. I would prefer if
+		// this could be solved with a little better design.
+		CFbsBitmap* bmpCopy = new (ELeave) CFbsBitmap;
+		CleanupStack::PushL(bmpCopy);
+		bmpCopy->Duplicate(aFeedInfo.FeedIcon()->Handle());
+		icons->AppendL( CGulIcon::NewL(bmpCopy, NULL));
+		CleanupStack::Pop(bmpCopy);			
+		iconIndex = icons->Count()-1;
+		}
+	else 
+		{
 		iconIndex = 0;
 		}
-	}
-	
+
+
 	if (unplayedShows.Length() > 0) {
 		unplayedShows.Insert(0,_L(", "));
 	}
@@ -407,11 +405,11 @@
 	iListboxFormatbuffer.Format(KFeedFormat(), iconIndex, &(aFeedInfo.Title()), &updatedDate,  &unplayedShows);
 	}
 
-void CPodcastFeedView::ImageOperationCompleteL(TInt aError, TUint aHandle)
+void CPodcastFeedView::ImageOperationCompleteL(TInt aError, TUint aHandle, CPodcastModel& /*aPodcastModel*/)
 	{
 	if (aError == KErrNone) {
-	UpdateFeedInfoStatusL(aHandle, EFalse);
-	}
+		UpdateFeedInfoStatusL(aHandle, EFalse);
+		}
 	}
 
 void CPodcastFeedView::UpdateFeedInfoDataL(CFeedInfo* aFeedInfo, TInt aIndex, TBool aIsUpdating )
--- a/application/src/PodcastShowsView.cpp	Wed Mar 31 08:41:07 2010 +0200
+++ b/application/src/PodcastShowsView.cpp	Wed Mar 31 14:50:33 2010 +0200
@@ -628,7 +628,7 @@
 		}
 }
 	
-void CPodcastShowsView::ImageOperationCompleteL(TInt aError, TUint /*aHandle*/)
+void CPodcastShowsView::ImageOperationCompleteL(TInt aError, TUint /*aHandle*/, CPodcastModel& /*aPodcastModel*/)
 	{
 	iLastImageHandlerError = aError;
 	if(iSetTitlebarImage)
--- a/engine/BWINS/podcastengineu.def	Wed Mar 31 08:41:07 2010 +0200
+++ b/engine/BWINS/podcastengineu.def	Wed Mar 31 14:50:33 2010 +0200
@@ -76,12 +76,12 @@
 	?MarkSelectionPlayed@CPodcastModel@@QAEXXZ @ 75 NONAME ; void CPodcastModel::MarkSelectionPlayed(void)
 	?MetaDataReader@CShowEngine@@QAEAAVCMetaDataReader@@XZ @ 76 NONAME ; class CMetaDataReader & CShowEngine::MetaDataReader(void)
 	?NewL@CFeedInfo@@SAPAV1@XZ @ 77 NONAME ; class CFeedInfo * CFeedInfo::NewL(void)
-	?NewL@CImageHandler@@SAPAV1@AAVRFs@@@Z @ 78 NONAME ; class CImageHandler * CImageHandler::NewL(class RFs &)
+	?Url@CShowInfo@@QBEABVTDesC16@@XZ @ 78 NONAME ; class TDesC16 const & CShowInfo::Url(void) const	
 	?NewL@CPodcastModel@@SAPAV1@XZ @ 79 NONAME ; class CPodcastModel * CPodcastModel::NewL(void)
 	?NewL@CShowEngine@@SAPAV1@AAVCPodcastModel@@@Z @ 80 NONAME ; class CShowEngine * CShowEngine::NewL(class CPodcastModel &)
 	?NewL@CShowInfo@@SAPAV1@I@Z @ 81 NONAME ; class CShowInfo * CShowInfo::NewL(unsigned int)
 	?NewLC@CFeedInfo@@SAPAV1@XZ @ 82 NONAME ; class CFeedInfo * CFeedInfo::NewLC(void)
-	?NewLC@CImageHandler@@SAPAV1@AAVRFs@@@Z @ 83 NONAME ; class CImageHandler * CImageHandler::NewLC(class RFs &)
+	?XMLEncode@PodcastUtils@@SAXAAVTDes16@@@Z @ 83 NONAME ; void PodcastUtils::XMLEncode(class TDes16 &)
 	?NewLC@CShowInfo@@SAPAV1@I@Z @ 84 NONAME ; class CShowInfo * CShowInfo::NewLC(unsigned int)
 	?NotifyShowListUpdatedL@CShowEngine@@QAEXXZ @ 85 NONAME ; void CShowEngine::NotifyShowListUpdatedL(void)
 	?OpmlParsingComplete@CFeedEngine@@QAEXHI@Z @ 86 NONAME ; void CFeedEngine::OpmlParsingComplete(int, unsigned int)
@@ -170,6 +170,147 @@
 	?UpdateSNAPListL@CPodcastModel@@QAEXXZ @ 169 NONAME ; void CPodcastModel::UpdateSNAPListL(void)
 	?UpdateShow@CShowEngine@@QAEXAAVCShowInfo@@@Z @ 170 NONAME ; void CShowEngine::UpdateShow(class CShowInfo &)
 	?Url@CFeedInfo@@QBEABVTDesC16@@XZ @ 171 NONAME ; class TDesC16 const & CFeedInfo::Url(void) const
-	?Url@CShowInfo@@QBEABVTDesC16@@XZ @ 172 NONAME ; class TDesC16 const & CShowInfo::Url(void) const
-	?XMLEncode@PodcastUtils@@SAXAAVTDes16@@@Z @ 173 NONAME ; void PodcastUtils::XMLEncode(class TDes16 &)
+	?NewL@CImageHandler@@SAPAV1@AAVRFs@@AAVCPodcastModel@@@Z @ 172 NONAME ; class CImageHandler * CImageHandler::NewL(class RFs &, class CPodcastModel &)
+	?NewLC@CImageHandler@@SAPAV1@AAVRFs@@AAVCPodcastModel@@@Z @ 173 NONAME ; class CImageHandler * CImageHandler::NewLC(class RFs &, class CPodcastModel &)
+	sqlite3_aggregate_context @ 174 NONAME
+	sqlite3_aggregate_count @ 175 NONAME
+	sqlite3_auto_extension @ 176 NONAME
+	sqlite3_bind_blob @ 177 NONAME
+	sqlite3_bind_double @ 178 NONAME
+	sqlite3_bind_int @ 179 NONAME
+	sqlite3_bind_int64 @ 180 NONAME
+	sqlite3_bind_null @ 181 NONAME
+	sqlite3_bind_parameter_count @ 182 NONAME
+	sqlite3_bind_parameter_index @ 183 NONAME
+	sqlite3_bind_parameter_name @ 184 NONAME
+	sqlite3_bind_text @ 185 NONAME
+	sqlite3_bind_text16 @ 186 NONAME
+	sqlite3_bind_value @ 187 NONAME
+	sqlite3_bind_zeroblob @ 188 NONAME
+	sqlite3_blob_bytes @ 189 NONAME
+	sqlite3_blob_close @ 190 NONAME
+	sqlite3_blob_open @ 191 NONAME
+	sqlite3_blob_read @ 192 NONAME
+	sqlite3_blob_write @ 193 NONAME
+	sqlite3_busy_handler @ 194 NONAME
+	sqlite3_busy_timeout @ 195 NONAME
+	sqlite3_changes @ 196 NONAME
+	sqlite3_clear_bindings @ 197 NONAME
+	sqlite3_close @ 198 NONAME
+	sqlite3_collation_needed @ 199 NONAME
+	sqlite3_collation_needed16 @ 200 NONAME
+	sqlite3_column_blob @ 201 NONAME
+	sqlite3_column_bytes @ 202 NONAME
+	sqlite3_column_bytes16 @ 203 NONAME
+	sqlite3_column_count @ 204 NONAME
+	sqlite3_column_decltype @ 205 NONAME
+	sqlite3_column_decltype16 @ 206 NONAME
+	sqlite3_column_double @ 207 NONAME
+	sqlite3_column_int @ 208 NONAME
+	sqlite3_column_int64 @ 209 NONAME
+	sqlite3_column_name @ 210 NONAME
+	sqlite3_column_name16 @ 211 NONAME
+	sqlite3_column_text @ 212 NONAME
+	sqlite3_column_text16 @ 213 NONAME
+	sqlite3_column_type @ 214 NONAME
+	sqlite3_column_value @ 215 NONAME
+	sqlite3_commit_hook @ 216 NONAME
+	sqlite3_complete @ 217 NONAME
+	sqlite3_complete16 @ 218 NONAME
+	sqlite3_create_collation @ 219 NONAME
+	sqlite3_create_collation16 @ 220 NONAME
+	sqlite3_create_collation_v2 @ 221 NONAME
+	sqlite3_create_function @ 222 NONAME
+	sqlite3_create_function16 @ 223 NONAME
+	sqlite3_create_module @ 224 NONAME
+	sqlite3_create_module_v2 @ 225 NONAME
+	sqlite3_data_count @ 226 NONAME
+	sqlite3_db_handle @ 227 NONAME
+	sqlite3_declare_vtab @ 228 NONAME
+	sqlite3_enable_load_extension @ 229 NONAME
+	sqlite3_enable_shared_cache @ 230 NONAME
+	sqlite3_errcode @ 231 NONAME
+	sqlite3_errmsg @ 232 NONAME
+	sqlite3_errmsg16 @ 233 NONAME
+	sqlite3_exec @ 234 NONAME
+	sqlite3_expired @ 235 NONAME
+	sqlite3_extended_result_codes @ 236 NONAME
+	sqlite3_file_control @ 237 NONAME
+	sqlite3_finalize @ 238 NONAME
+	sqlite3_free @ 239 NONAME
+	sqlite3_free_table @ 240 NONAME
+	sqlite3_get_autocommit @ 241 NONAME
+	sqlite3_get_auxdata @ 242 NONAME
+	sqlite3_get_table @ 243 NONAME
+	sqlite3_global_recover @ 244 NONAME
+	sqlite3_interrupt @ 245 NONAME
+	sqlite3_last_insert_rowid @ 246 NONAME
+	sqlite3_libversion @ 247 NONAME
+	sqlite3_libversion_number @ 248 NONAME
+	sqlite3_load_extension @ 249 NONAME
+	sqlite3_malloc @ 250 NONAME
+	sqlite3_memory_alarm @ 251 NONAME
+	sqlite3_memory_highwater @ 252 NONAME
+	sqlite3_memory_used @ 253 NONAME
+	sqlite3_mprintf @ 254 NONAME
+	sqlite3_open @ 255 NONAME
+	sqlite3_open16 @ 256 NONAME
+	sqlite3_open_v2 @ 257 NONAME
+	sqlite3_overload_function @ 258 NONAME
+	sqlite3_prepare @ 259 NONAME
+	sqlite3_prepare16 @ 260 NONAME
+	sqlite3_prepare16_v2 @ 261 NONAME
+	sqlite3_prepare_v2 @ 262 NONAME
+	sqlite3_profile @ 263 NONAME
+	sqlite3_progress_handler @ 264 NONAME
+	sqlite3_realloc @ 265 NONAME
+	sqlite3_release_memory @ 266 NONAME
+	sqlite3_reset @ 267 NONAME
+	sqlite3_reset_auto_extension @ 268 NONAME
+	sqlite3_result_blob @ 269 NONAME
+	sqlite3_result_double @ 270 NONAME
+	sqlite3_result_error @ 271 NONAME
+	sqlite3_result_error16 @ 272 NONAME
+	sqlite3_result_error_nomem @ 273 NONAME
+	sqlite3_result_error_toobig @ 274 NONAME
+	sqlite3_result_int @ 275 NONAME
+	sqlite3_result_int64 @ 276 NONAME
+	sqlite3_result_null @ 277 NONAME
+	sqlite3_result_text @ 278 NONAME
+	sqlite3_result_text16 @ 279 NONAME
+	sqlite3_result_text16be @ 280 NONAME
+	sqlite3_result_text16le @ 281 NONAME
+	sqlite3_result_value @ 282 NONAME
+	sqlite3_result_zeroblob @ 283 NONAME
+	sqlite3_rollback_hook @ 284 NONAME
+	sqlite3_set_authorizer @ 285 NONAME
+	sqlite3_set_auxdata @ 286 NONAME
+	sqlite3_sleep @ 287 NONAME
+	sqlite3_snprintf @ 288 NONAME
+	sqlite3_soft_heap_limit @ 289 NONAME
+	sqlite3_sql @ 290 NONAME
+	sqlite3_step @ 291 NONAME
+	sqlite3_thread_cleanup @ 292 NONAME
+	sqlite3_threadsafe @ 293 NONAME
+	sqlite3_total_changes @ 294 NONAME
+	sqlite3_trace @ 295 NONAME
+	sqlite3_transfer_bindings @ 296 NONAME
+	sqlite3_update_hook @ 297 NONAME
+	sqlite3_user_data @ 298 NONAME
+	sqlite3_value_blob @ 299 NONAME
+	sqlite3_value_bytes @ 300 NONAME
+	sqlite3_value_bytes16 @ 301 NONAME
+	sqlite3_value_double @ 302 NONAME
+	sqlite3_value_int @ 303 NONAME
+	sqlite3_value_int64 @ 304 NONAME
+	sqlite3_value_numeric_type @ 305 NONAME
+	sqlite3_value_text @ 306 NONAME
+	sqlite3_value_text16 @ 307 NONAME
+	sqlite3_value_text16be @ 308 NONAME
+	sqlite3_value_text16le @ 309 NONAME
+	sqlite3_value_type @ 310 NONAME
+	sqlite3_vfs_find @ 311 NONAME
+	sqlite3_vfs_register @ 312 NONAME
+	sqlite3_vfs_unregister @ 313 NONAME
+	sqlite3_vmprintf @ 314 NONAME
 
--- a/engine/inc/FeedEngine.h	Wed Mar 31 08:41:07 2010 +0200
+++ b/engine/inc/FeedEngine.h	Wed Mar 31 14:50:33 2010 +0200
@@ -95,6 +95,7 @@
 	IMPORT_C const RFeedInfoArray& GetSearchResults();
 
 	IMPORT_C void OpmlParsingComplete(TInt aError, TUint aNumFeedsAdded);
+	void NotifyFeedUpdateComplete(TInt aFeedUid, TInt aError);
 protected:
 	
 	static TInt CompareFeedsByTitle(const CFeedInfo &a, const CFeedInfo &b);
@@ -117,7 +118,7 @@
 	void GetFeedImageL(CFeedInfo *aFeedInfo);
 	
 	void UpdateNextFeedL();
-	void NotifyFeedUpdateComplete(TInt aError);
+	void NotifyFeedUpdateComplete(TInt aError);	
 	void NotifyOpmlParsingComplete(TInt aError, TUint aNumFeedsAdded);
 
 	
--- a/engine/inc/FeedInfo.h	Wed Mar 31 08:41:07 2010 +0200
+++ b/engine/inc/FeedInfo.h	Wed Mar 31 14:50:33 2010 +0200
@@ -76,7 +76,7 @@
 	private:
 		CFeedInfo();
 		void ConstructL();
-		void ImageOperationCompleteL(TInt aError, TUint aHandle);
+		void ImageOperationCompleteL(TInt aError, TUint aHandle, CPodcastModel& aPodcastModel);
 	private:
 		HBufC* iUrl;
 		HBufC* iTitle;
--- a/engine/inc/ImageHandler.h	Wed Mar 31 08:41:07 2010 +0200
+++ b/engine/inc/ImageHandler.h	Wed Mar 31 14:50:33 2010 +0200
@@ -22,6 +22,7 @@
 #include <f32file.h>
 #include <ImageConversion.h>
 #include <BitmapTransforms.h>
+class CPodcastModel;
 
 /**
  * Listener interface that can be used to listen for image loading operation
@@ -42,8 +43,10 @@
     * Called by CImageHandler when an image has been loaded.
     * @param aError Error code given by the CImageHandler or 0 (zero) if the
     *   image was loaded successfully.
+    * @param image handle
+    * @param reference to podcast model
     */
-    virtual void ImageOperationCompleteL(TInt aError, TUint aHandle) = 0;
+    virtual void ImageOperationCompleteL(TInt aError, TUint aHandle, CPodcastModel& aPodcastModel) = 0;
     };
 
 // ============================================================================
@@ -65,27 +68,22 @@
     public: // Constructors and destructor
        /**
         * Factory method that constructs a CImageHandler by using the NewLC method
-        * and then cleans the cleanup stack.
-        * @param aBitmap Bitmap where the image data is loaded to.
-        * @param aScaledBitmap Bitmap where the scaled image data is loaded to.
+        * and then cleans the cleanup stack.               
         * @param aFs File server reference that is used to load the image data.
-        * @param aCallback Listener interface implementation that is notified
+        * @param Reference to podcast model
         *  when an image has been loaded.
         * @return pointer to created CImageHandler-object
         */
-        IMPORT_C static CImageHandler* NewL(RFs& aFs);
+        IMPORT_C static CImageHandler* NewL(RFs& aFs,CPodcastModel& aPodcastModel);
 
        /**
         * Factory method that constructs a CImageHandler and leaves it to the
         * cleanup stack.
-        * @param aBitmap Bitmap where the image data is loaded to.
-        * @param aScaledBitmap Bitmap where the scaled image data is loaded to.
         * @param aFs File server reference that is used to load the image data.
-        * @param aCallback Listener interface implementation that is notified
-        *  when an image has been loaded.
+        * @param Reference to podcast model
         * @return pointer to created CImageHandler-object
         */
-        IMPORT_C static CImageHandler* NewLC(RFs& aFs);
+        IMPORT_C static CImageHandler* NewLC(RFs& aFs,CPodcastModel& aPodcastModel);
        /**
         * Desctructor. Destroys the CImageDecoder used by the image handler.
         */
@@ -142,13 +140,12 @@
     protected:
         /**
          * C++ default constructor. Just stores the given parameters to
-         * corresponding attributes.      
-         * @param aScaledBitmap Bitmap where the scaled image data is loaded to.
+         * corresponding attributes.              
          * @param aFs File server reference that is used to load the image data.
-         * @param aCallback Listener interface implementation that is notified
+         * @param Reference to podcast model
          *  when an image has been loaded.
          */
-        CImageHandler(RFs& aFs);
+        CImageHandler(RFs& aFs, CPodcastModel& aPodcastModel);
         /**
          * 2nd phase constructor. Adds this object to the active scheduler.
          */
@@ -182,6 +179,9 @@
         
         /* Handle passed back to caller */
         TUint iHandle;
+        
+        /** Reference to the podcast model used for callbacks to be able to notify*/
+        CPodcastModel& iPodcastModel;
     };
 
 #endif
--- a/engine/inc/PodcastModel.h	Wed Mar 31 08:41:07 2010 +0200
+++ b/engine/inc/PodcastModel.h	Wed Mar 31 14:50:33 2010 +0200
@@ -102,7 +102,7 @@
 	CPodcastModel();
 	void ConstructL();
 	// From ImageHandler
-	void ImageOperationCompleteL(TInt aError, TUint aHandle);
+	void ImageOperationCompleteL(TInt aError, TUint aHandle, CPodcastModel& aPodcastModel);
 private:	
    CShowInfo* iPlayingPodcast;
    
--- a/engine/src/FeedEngine.cpp	Wed Mar 31 08:41:07 2010 +0200
+++ b/engine/src/FeedEngine.cpp	Wed Mar 31 14:50:33 2010 +0200
@@ -647,6 +647,15 @@
 		}
 	}
 
+void CFeedEngine::NotifyFeedUpdateComplete(TInt aFeedUid, TInt aError)
+	{
+	DP("CFeedEngine::NotifyFeedUpdateComplete");	
+	for (TInt i=0;i<iObservers.Count();i++) 
+		{
+		TRAP_IGNORE(iObservers[i]->FeedDownloadFinishedL(MFeedEngineObserver::EFeedAutoUpdate, aFeedUid, aError));
+		}
+	}
+
 void CFeedEngine::Disconnected(CHttpClient* /*aClient*/)
 	{
 	}
--- a/engine/src/FeedInfo.cpp	Wed Mar 31 08:41:07 2010 +0200
+++ b/engine/src/FeedInfo.cpp	Wed Mar 31 14:50:33 2010 +0200
@@ -17,6 +17,8 @@
 */
 
 #include "FeedInfo.h"
+#include "FeedEngine.h"
+#include "PodcastModel.h"
 #include <e32hashtab.h>
 #include <fbs.h>
 #include <bautils.h>
@@ -209,7 +211,7 @@
 		{
 		iFeedIcon = CEikonEnv::Static()->CreateBitmapL(cacheFileName, 0);
 		}	
-	}
+	} 
 
 EXPORT_C TBool CFeedInfo::CustomTitle() const
 	{
@@ -241,9 +243,8 @@
 	iFeedIcon->Duplicate(aBitmapToClone->Handle());
 	}
 
-void CFeedInfo::ImageOperationCompleteL(TInt aError, TUint /*aHandle*/)
-	{
-		
+void CFeedInfo::ImageOperationCompleteL(TInt aError, TUint /*aHandle*/, CPodcastModel& aPodcastModel)
+	{		
 	if (aError == KErrNone && iImageFileName && iFeedIcon)
 		{
 		TFileName cacheFileName;
@@ -253,5 +254,6 @@
 		cacheFileName.Append(parser.Name());
 		cacheFileName.Append(KMbmExtension());		
 		iFeedIcon->Save(cacheFileName);					
+		aPodcastModel.FeedEngine().NotifyFeedUpdateComplete(this->iUid, KErrNone);
 		}
 	}
--- a/engine/src/ImageHandler.cpp	Wed Mar 31 08:41:07 2010 +0200
+++ b/engine/src/ImageHandler.cpp	Wed Mar 31 14:50:33 2010 +0200
@@ -31,12 +31,13 @@
 // might leave.
 // -----------------------------------------------------------------------------
 //
-CImageHandler::CImageHandler( RFs& aFs )
+CImageHandler::CImageHandler( RFs& aFs, CPodcastModel& aPodcastModel )
     : CActive(CActive::EPriorityStandard)
     , iDecoder(NULL)
     , iScaler(NULL)
     , iFs(aFs)
     , iSize(0,0)
+    , iPodcastModel(aPodcastModel)
     {
     }
 
@@ -56,9 +57,9 @@
 // Two-phased constructor.
 // -----------------------------------------------------------------------------
 //
-EXPORT_C CImageHandler* CImageHandler::NewL(RFs& aFs)
+EXPORT_C CImageHandler* CImageHandler::NewL(RFs& aFs, CPodcastModel& aPodcastModel)
     {
-    CImageHandler* self = NewLC(aFs);
+    CImageHandler* self = NewLC(aFs, aPodcastModel);
     CleanupStack::Pop();
     return self;
     }
@@ -68,9 +69,9 @@
 // Two-phased constructor.
 // -----------------------------------------------------------------------------
 //
-EXPORT_C CImageHandler* CImageHandler::NewLC(RFs& aFs)
+EXPORT_C CImageHandler* CImageHandler::NewLC(RFs& aFs, CPodcastModel& aPodcastModel)
     {
-    CImageHandler* self = new (ELeave) CImageHandler(aFs);
+    CImageHandler* self = new (ELeave) CImageHandler(aFs, aPodcastModel);
     CleanupStack::PushL( self );
     self->ConstructL();
 
@@ -202,7 +203,7 @@
     else
         {
         // Invoke callback.
-        iCallback->ImageOperationCompleteL(iStatus.Int(), iHandle);        
+        iCallback->ImageOperationCompleteL(iStatus.Int(), iHandle, iPodcastModel);        
         if(iCallbackQue.Count())
         	{
         	TInt loaderror = KErrNotFound;
--- a/engine/src/PodcastModel.cpp	Wed Mar 31 08:41:07 2010 +0200
+++ b/engine/src/PodcastModel.cpp	Wed Mar 31 14:50:33 2010 +0200
@@ -78,7 +78,7 @@
 	iIapNameArray = new (ELeave) CDesCArrayFlat(KDefaultGranu);
 	iSNAPNameArray = new (ELeave) CDesCArrayFlat(KDefaultGranu);
 	iCmManager.OpenL();
-	iImageHandler = CImageHandler::NewL(FsSession());
+	iImageHandler = CImageHandler::NewL(FsSession(), *this);
 	
 	UpdateIAPListL();
 	UpdateSNAPListL();
@@ -437,7 +437,7 @@
 	}
 
 
-void CPodcastModel::ImageOperationCompleteL(TInt /*aError*/, TUint /*aHandle*/)
+void CPodcastModel::ImageOperationCompleteL(TInt /*aError*/, TUint /*aHandle*/, CPodcastModel& /*aPodcastModel*/)
 	{
 	
 	}
--- a/group/bld.inf	Wed Mar 31 08:41:07 2010 +0200
+++ b/group/bld.inf	Wed Mar 31 14:50:33 2010 +0200
@@ -22,9 +22,9 @@
 
 PRJ_MMPFILES
 
-#ifdef SQLITE_INCLUDED
+//#ifdef SQLITE_INCLUDED
 ..\engine\sqlite\group\sqlite.mmp
-#endif
+//#endif
 
 PRJ_MMPFILES
 ..\engine\group\engine.mmp