| author | teknolog | 
| Sun, 04 Apr 2010 15:54:17 +0100 | |
| changeset 109 | 223f270fa7ff | 
| parent 108 | 554d9980157f | 
| child 110 | 403412eb5292 | 
| permissions | -rw-r--r-- | 
| 2 | 1 | /* | 
| 2 | * Copyright (c) 2007-2010 Sebastian Brannstrom, Lars Persson, EmbedDev AB | |
| 3 | * | |
| 4 | * All rights reserved. | |
| 5 | * This component and the accompanying materials are made available | |
| 6 | * under the terms of the License "Eclipse Public License v1.0" | |
| 7 | * which accompanies this distribution, and is available | |
| 8 | * at the URL "http://www.eclipse.org/legal/epl-v10.html". | |
| 9 | * | |
| 10 | * Initial Contributors: | |
| 11 | * EmbedDev AB - initial contribution. | |
| 12 | * | |
| 13 | * Contributors: | |
| 14 | * | |
| 15 | * Description: | |
| 16 | * | |
| 17 | */ | |
| 18 | ||
| 19 | #include "FeedEngine.h" | |
| 20 | #include <f32file.h> | |
| 21 | #include <bautils.h> | |
| 22 | #include <s32file.h> | |
| 23 | #include "SettingsEngine.h" | |
| 24 | #include "ShowEngine.h" | |
| 25 | #include <e32hashtab.h> | |
| 26 | #include "OpmlParser.h" | |
| 27 | #include "PodcastUtils.h" | |
| 28 | #include <utf.h> | |
| 29 | ||
| 108 
554d9980157f
Moved temporary feed parser files to subdirectory under private dir, and added cleanup of this directory on startup.
 teknolog parents: 
107diff
changeset | 30 | _LIT(KFeedParseStorePath, "feeds\\"); | 
| 2 | 31 | |
| 32 | CFeedEngine* CFeedEngine::NewL(CPodcastModel& aPodcastModel) | |
| 33 | 	{
 | |
| 34 | CFeedEngine* self = new (ELeave) CFeedEngine(aPodcastModel); | |
| 35 | CleanupStack::PushL(self); | |
| 36 | self->ConstructL(); | |
| 37 | CleanupStack::Pop(self); | |
| 38 | return self; | |
| 39 | } | |
| 40 | ||
| 41 | void CFeedEngine::ConstructL() | |
| 42 | 	{
 | |
| 43 | iParser = new (ELeave) CFeedParser(*this, iPodcastModel.FsSession()); | |
| 44 | ||
| 45 | iFeedClient = CHttpClient::NewL(iPodcastModel, *this); | |
| 46 | iFeedTimer.ConstructL(); | |
| 47 | ||
| 109 | 48 | TInt err = KErrNone; | 
| 49 | TInt feedCount = 0; | |
| 2 | 50 | |
| 109 | 51 | TRAP(err, feedCount = DBGetFeedCountL()); | 
| 52 | if (err == KErrNone && feedCount > 0) | |
| 2 | 53 |     	{
 | 
| 54 | 		DP("Loading feeds from DB");
 | |
| 109 | 55 | TRAP(err, DBLoadFeedsL()); | 
| 56 | } | |
| 57 | ||
| 2 | 58 | |
| 109 | 59 | 	if (err != KErrNone || iPodcastModel.IsFirstStartup()) {
 | 
| 2 | 60 | TFileName defaultFile = iPodcastModel.SettingsEngine().DefaultFeedsFileName(); | 
| 61 | 		DP1("Loading default feeds from %S", &defaultFile);
 | |
| 62 | 		if (BaflUtils::FileExists(iPodcastModel.FsSession(), defaultFile)) {
 | |
| 63 | ImportFeedsL(defaultFile); | |
| 64 | } | |
| 109 | 65 | } | 
| 66 | ||
| 67 | // clean out feeds temp directory | |
| 68 | TFileName feedTempPath; | |
| 69 | feedTempPath.Copy (iPodcastModel.SettingsEngine().PrivatePath ()); | |
| 70 | feedTempPath.Append(KFeedParseStorePath); | |
| 71 | 	feedTempPath.Append(_L("*"));
 | |
| 108 
554d9980157f
Moved temporary feed parser files to subdirectory under private dir, and added cleanup of this directory on startup.
 teknolog parents: 
107diff
changeset | 72 | |
| 109 | 73 | BaflUtils::EnsurePathExistsL(iPodcastModel.FsSession(), feedTempPath); | 
| 74 | BaflUtils::DeleteFile(iPodcastModel.FsSession(),feedTempPath); | |
| 2 | 75 | |
| 76 | TFileName importFile = iPodcastModel.SettingsEngine().ImportFeedsFileName(); | |
| 77 |     if (BaflUtils::FileExists(iPodcastModel.FsSession(), importFile)) {
 | |
| 78 |     	DP("Importing feeds");
 | |
| 109 | 79 | TRAP_IGNORE(ImportFeedsL(importFile)); | 
| 2 | 80 | } | 
| 109 | 81 | |
| 82 | RunFeedTimer(); | |
| 2 | 83 | } | 
| 84 | ||
| 85 | CFeedEngine::CFeedEngine(CPodcastModel& aPodcastModel) | |
| 86 | : iClientState(EIdle), | |
| 87 | iFeedTimer(this), | |
| 88 | iPodcastModel(aPodcastModel), | |
| 89 | iDB(*aPodcastModel.DB()) | |
| 90 | 	{
 | |
| 91 | } | |
| 92 | ||
| 93 | CFeedEngine::~CFeedEngine() | |
| 94 | 	{
 | |
| 95 | iObservers.Close(); | |
| 96 | ||
| 97 | iFeedsUpdating.Close(); | |
| 98 | iSortedFeeds.ResetAndDestroy(); | |
| 99 | iSearchResults.ResetAndDestroy(); | |
| 100 | ||
| 101 | delete iParser; | |
| 102 | delete iFeedClient; | |
| 103 | delete iOpmlParser; | |
| 104 | } | |
| 105 | ||
| 106 | /** | |
| 107 | * Returns the current internal state of the feed engine4 | |
| 108 | */ | |
| 109 | EXPORT_C TClientState CFeedEngine::ClientState() | |
| 110 | 	{
 | |
| 111 | return iClientState; | |
| 112 | } | |
| 113 | ||
| 114 | ||
| 115 | /** | |
| 116 | * Returns the current updating client UID if clientstate is != ENotUpdateing | |
| 117 | * @return TUint | |
| 118 | */ | |
| 119 | EXPORT_C TUint CFeedEngine::ActiveClientUid() | |
| 120 | 	{
 | |
| 121 | if(iActiveFeed != NULL) | |
| 122 | 		{
 | |
| 123 | return iActiveFeed->Uid(); | |
| 124 | } | |
| 125 | return 0; | |
| 126 | } | |
| 127 | ||
| 128 | void CFeedEngine::RunFeedTimer() | |
| 129 | 	{
 | |
| 130 | iFeedTimer.Cancel(); | |
| 131 | ||
| 132 | if (iPodcastModel.SettingsEngine().UpdateAutomatically() != EAutoUpdateOff) | |
| 133 | 		{
 | |
| 134 | TInt interval = iPodcastModel.SettingsEngine().UpdateFeedInterval(); | |
| 135 | ||
| 136 | if (interval != 0) | |
| 137 | 			{
 | |
| 138 | iFeedTimer.SetPeriod(interval); | |
| 139 | iFeedTimer.RunPeriodically(); | |
| 140 | } | |
| 141 | } | |
| 142 | } | |
| 143 | ||
| 144 | EXPORT_C void CFeedEngine::UpdateAllFeedsL(TBool aAutoUpdate) | |
| 145 | 	{
 | |
| 146 | iAutoUpdatedInitiator = aAutoUpdate; | |
| 147 | if (iFeedsUpdating.Count() > 0) | |
| 148 | 		{
 | |
| 149 | 		DP("Cancelling update");
 | |
| 150 | iFeedClient->Stop(); | |
| 151 | iFeedsUpdating.Reset(); | |
| 152 | return; | |
| 153 | } | |
| 154 | ||
| 155 | TInt cnt = iSortedFeeds.Count(); | |
| 156 | for (int i=0;i<cnt;i++) | |
| 157 | 		{
 | |
| 102 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 158 | iFeedsUpdating.Append(iSortedFeeds[i]->Uid()); | 
| 2 | 159 | } | 
| 160 | ||
| 161 | UpdateNextFeedL(); | |
| 162 | } | |
| 163 | ||
| 164 | EXPORT_C void CFeedEngine::CancelUpdateAllFeeds() | |
| 165 | 	{
 | |
| 166 | if(iClientState != EIdle) | |
| 167 | 		{
 | |
| 32 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 168 | iCancelRequested = ETrue; | 
| 2 | 169 | iFeedsUpdating.Reset(); | 
| 170 | iFeedClient->Stop(); | |
| 171 | } | |
| 172 | } | |
| 173 | ||
| 174 | void CFeedEngine::UpdateNextFeedL() | |
| 175 | 	{
 | |
| 176 | 	DP1("UpdateNextFeed. %d feeds left to update", iFeedsUpdating.Count());
 | |
| 177 | ||
| 102 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 178 | // reset active feed, will be set again in UpdateFeedL if needed | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 179 | iActiveFeed = NULL; | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 180 | |
| 2 | 181 | if (iFeedsUpdating.Count() > 0) | 
| 182 | 		{
 | |
| 102 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 183 | CFeedInfo *info = GetFeedInfoByUid(iFeedsUpdating[0]); | 
| 2 | 184 | iFeedsUpdating.Remove(0); | 
| 185 | ||
| 102 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 186 | if (info == NULL) | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 187 | 			{
 | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 188 | UpdateNextFeedL(); | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 189 | } | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 190 | else | 
| 2 | 191 | 			{
 | 
| 102 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 192 | TBool result = EFalse; | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 193 | 			//DP2("** UpdateNextFeed: %S, ID: %u", &(info->Url()), info->Uid());
 | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 194 | TRAPD(error, result = UpdateFeedL(info->Uid())); | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 195 | |
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 196 | if (error != KErrNone || !result) | 
| 2 | 197 | 				{
 | 
| 102 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 198 | 				DP("Error while updating all feeds");
 | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 199 | for (TInt i=0;i<iObservers.Count();i++) | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 200 | 					{
 | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 201 | TRAP_IGNORE(iObservers[i]->FeedUpdateAllCompleteL(iAutoUpdatedInitiator?MFeedEngineObserver::EFeedAutoUpdate:MFeedEngineObserver::EFeedManualUpdate)); | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 202 | } | 
| 2 | 203 | } | 
| 204 | } | |
| 205 | } | |
| 206 | else | |
| 207 | 		{
 | |
| 208 | iClientState = EIdle; | |
| 209 | for (TInt i=0;i<iObservers.Count();i++) | |
| 210 | 			{
 | |
| 211 | TRAP_IGNORE(iObservers[i]->FeedUpdateAllCompleteL(iAutoUpdatedInitiator?MFeedEngineObserver::EFeedAutoUpdate:MFeedEngineObserver::EFeedManualUpdate)); | |
| 212 | } | |
| 213 | } | |
| 214 | } | |
| 215 | ||
| 216 | EXPORT_C TBool CFeedEngine::UpdateFeedL(TUint aFeedUid) | |
| 217 | 	{
 | |
| 218 | 	DP("FeedEngine::UpdateFeedL BEGIN");
 | |
| 102 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 219 | |
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 220 | if (iActiveFeed) | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 221 | 		{
 | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 222 | User::Leave(KErrInUse); | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 223 | } | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 224 | |
| 2 | 225 | iActiveFeed = GetFeedInfoByUid(aFeedUid); | 
| 106 
83752b9e3cb6
Fix for regression in icon handling. Minor fix for trailing backslash in podcast dir in settings pane. New udeb SISs.
 teknolog parents: 
102diff
changeset | 226 | |
| 32 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 227 | iCancelRequested = EFalse; | 
| 2 | 228 | |
| 229 | if (iActiveFeed->LastUpdated() == 0) | |
| 230 | 		{
 | |
| 231 | iCatchupMode = ETrue; | |
| 106 
83752b9e3cb6
Fix for regression in icon handling. Minor fix for trailing backslash in podcast dir in settings pane. New udeb SISs.
 teknolog parents: 
102diff
changeset | 232 | iCatchupCounter = 0; | 
| 2 | 233 | } | 
| 32 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 234 | |
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 235 | iActiveFeed->SetLastError(KErrNone); | 
| 36 
e010fc411ddc
Merge, plus minor fix to CFeedEngine
 Brendan Donegan <brendand@symbian.org>diff
changeset | 236 | DBUpdateFeedL(*iActiveFeed); | 
| 32 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 237 | |
| 2 | 238 | iUpdatingFeedFileName.Copy (iPodcastModel.SettingsEngine().PrivatePath ()); | 
| 108 
554d9980157f
Moved temporary feed parser files to subdirectory under private dir, and added cleanup of this directory on startup.
 teknolog parents: 
107diff
changeset | 239 | iUpdatingFeedFileName.Append(KFeedParseStorePath); | 
| 
554d9980157f
Moved temporary feed parser files to subdirectory under private dir, and added cleanup of this directory on startup.
 teknolog parents: 
107diff
changeset | 240 | BaflUtils::EnsurePathExistsL(iPodcastModel.FsSession(), iUpdatingFeedFileName); | 
| 
554d9980157f
Moved temporary feed parser files to subdirectory under private dir, and added cleanup of this directory on startup.
 teknolog parents: 
107diff
changeset | 241 | |
| 2 | 242 | _LIT(KFileNameFormat, "%lu.xml"); | 
| 243 | iUpdatingFeedFileName.AppendFormat(KFileNameFormat, aFeedUid); | |
| 244 | ||
| 245 | if(iFeedClient->GetL(iActiveFeed->Url(), iUpdatingFeedFileName, iPodcastModel.SettingsEngine().SpecificIAP())) | |
| 246 | 		{
 | |
| 247 | iClientState = EUpdatingFeed; | |
| 248 | ||
| 249 | for (TInt i=0;i<iObservers.Count();i++) | |
| 250 | 			{
 | |
| 251 | TRAP_IGNORE(iObservers[i]->FeedDownloadStartedL(iAutoUpdatedInitiator?MFeedEngineObserver::EFeedAutoUpdate:MFeedEngineObserver::EFeedManualUpdate, iActiveFeed->Uid())); | |
| 252 | } | |
| 253 | ||
| 254 | 		DP("FeedEngine::UpdateFeedL END, return ETrue");
 | |
| 255 | return ETrue; | |
| 256 | } | |
| 257 | else | |
| 258 | 		{
 | |
| 259 | 		DP("FeedEngine::UpdateFeedL END, return EFalse");
 | |
| 260 | return EFalse; | |
| 261 | } | |
| 262 | } | |
| 263 | ||
| 264 | void CFeedEngine::NewShowL(CShowInfo& aItem) | |
| 265 | 	{
 | |
| 266 | HBufC* description = HBufC::NewLC(KMaxDescriptionLength); | |
| 267 | TPtr ptr(description->Des()); | |
| 268 | ptr.Copy(aItem.Description()); | |
| 269 | PodcastUtils::CleanHtmlL(ptr); | |
| 8 | 270 | |
| 271 | aItem.SetDescriptionL(*description); | |
| 2 | 272 | CleanupStack::PopAndDestroy(description); | 
| 273 | ||
| 274 | 	if (iCatchupMode) {
 | |
| 275 | // in catchup mode, we let one show be unplayed | |
| 276 | 		if (++iCatchupCounter > 1) {
 | |
| 277 | aItem.SetPlayState(EPlayed); | |
| 278 | } | |
| 279 | } | |
| 280 | ||
| 281 | TBool isShowAdded = iPodcastModel.ShowEngine().AddShowL(aItem); | |
| 282 | ||
| 283 | if (aItem.PlayState() == ENeverPlayed && isShowAdded && iPodcastModel.SettingsEngine().DownloadAutomatically()) | |
| 284 | 		{
 | |
| 285 | iPodcastModel.ShowEngine().AddDownloadL(aItem); | |
| 286 | } | |
| 287 | } | |
| 288 | ||
| 289 | void CFeedEngine::GetFeedImageL(CFeedInfo *aFeedInfo) | |
| 290 | 	{
 | |
| 291 | 	DP("GetFeedImage");
 | |
| 292 | ||
| 293 | TFileName filePath; | |
| 294 | filePath.Copy(iPodcastModel.SettingsEngine().BaseDir()); | |
| 295 | ||
| 296 | // create relative file name | |
| 297 | TFileName relPath; | |
| 298 | relPath.Copy(aFeedInfo->Title()); | |
| 299 | 	relPath.Append('\\');
 | |
| 300 | ||
| 301 | TFileName fileName; | |
| 302 | PodcastUtils::FileNameFromUrl(aFeedInfo->ImageUrl(), fileName); | |
| 303 | relPath.Append(fileName); | |
| 304 | PodcastUtils::EnsureProperPathName(relPath); | |
| 305 | ||
| 306 | // complete file path is base dir + rel path | |
| 307 | filePath.Append(relPath); | |
| 100 
e0fc52a5df4d
Update to keep features from merge.
 Lars Persson <lars.persson@embeddev.se> parents: 
99diff
changeset | 308 | aFeedInfo->SetImageFileNameL(filePath, NULL); | 
| 2 | 309 | |
| 310 | if(iFeedClient->GetL(aFeedInfo->ImageUrl(), filePath, ETrue)) | |
| 311 | 		{
 | |
| 312 | iClientState = EUpdatingImage; | |
| 313 | } | |
| 314 | } | |
| 315 | ||
| 316 | EXPORT_C TBool CFeedEngine::AddFeedL(const CFeedInfo&aItem) | |
| 317 | 	{
 | |
| 318 | 	DP2("CFeedEngine::AddFeed, title=%S, URL=%S", &aItem.Title(), &aItem.Url());
 | |
| 319 | for (TInt i=0;i<iSortedFeeds.Count();i++) | |
| 320 | 		{
 | |
| 321 | if (iSortedFeeds[i]->Uid() == aItem.Uid()) | |
| 322 | 			{
 | |
| 323 | 			DP1("Already have feed %S, discarding", &aItem.Url());			
 | |
| 324 | return EFalse; | |
| 325 | } | |
| 326 | } | |
| 327 | ||
| 328 | TLinearOrder<CFeedInfo> sortOrder( CFeedEngine::CompareFeedsByTitle); | |
| 329 | CFeedInfo* newItem = aItem.CopyL(); | |
| 330 | CleanupStack::PushL(newItem); | |
| 331 | User::LeaveIfError(iSortedFeeds.InsertInOrder(newItem, sortOrder)); | |
| 332 | CleanupStack::Pop(newItem); | |
| 333 | ||
| 334 | ||
| 335 | // Save the feeds into DB | |
| 336 | DBAddFeedL(aItem); | |
| 337 | return ETrue; | |
| 338 | } | |
| 339 | ||
| 109 | 340 | void CFeedEngine::DBAddFeedL(const CFeedInfo& aItem) | 
| 2 | 341 | 	{
 | 
| 342 | 	DP2("CFeedEngine::DBAddFeed, title=%S, URL=%S", &aItem.Title(), &aItem.Url());
 | |
| 343 | ||
| 109 | 344 | CFeedInfo *info; | 
| 345 | ||
| 346 | TRAPD(err, DBGetFeedInfoByUidL(aItem.Uid())); | |
| 347 | ||
| 348 | 	if (err == KErrNone && info) {
 | |
| 2 | 349 | delete info; | 
| 109 | 350 | User::Leave(KErrAlreadyExists); | 
| 2 | 351 | } | 
| 352 | ||
| 353 | HBufC* titleBuf = HBufC::NewLC(KMaxLineLength); | |
| 354 | TPtr titlePtr(titleBuf->Des()); | |
| 355 | titlePtr.Copy(aItem.Title()); | |
| 356 | PodcastUtils::SQLEncode(titlePtr); | |
| 357 | ||
| 358 | HBufC* descBuf = HBufC::NewLC(KMaxLineLength); | |
| 359 | TPtr descPtr(descBuf->Des()); | |
| 360 | descPtr.Copy(aItem.Description()); | |
| 361 | PodcastUtils::SQLEncode(descPtr); | |
| 362 | ||
| 363 | _LIT(KSqlStatement, "insert into feeds (url, title, description, imageurl, imagefile, link, built, lastupdated, uid, feedtype, customtitle, lasterror)" | |
| 364 | " values (\"%S\",\"%S\", \"%S\", \"%S\", \"%S\", \"%S\", \"%Ld\", \"%Ld\", \"%u\", \"%u\", \"%u\", \"%d\")"); | |
| 365 | iSqlBuffer.Format(KSqlStatement, | |
| 366 | &aItem.Url(), titleBuf, descBuf, &aItem.ImageUrl(), &aItem.ImageFileName(), &aItem.Link(), | |
| 367 | aItem.BuildDate().Int64(), aItem.LastUpdated().Int64(), aItem.Uid(), EAudioPodcast, aItem.CustomTitle(), aItem.LastError()); | |
| 368 | ||
| 369 | CleanupStack::PopAndDestroy(descBuf); | |
| 370 | CleanupStack::PopAndDestroy(titleBuf); | |
| 371 | ||
| 372 | sqlite3_stmt *st; | |
| 373 | ||
| 374 | int rc = sqlite3_prepare16_v2(&iDB, (const void*)iSqlBuffer.PtrZ() , -1, &st, (const void**) NULL); | |
| 375 | ||
| 376 | if (rc==SQLITE_OK) | |
| 377 | 		{
 | |
| 109 | 378 | Cleanup_sqlite3_finalize_PushL(st); | 
| 2 | 379 | rc = sqlite3_step(st); | 
| 380 | ||
| 109 | 381 | if (rc != SQLITE_DONE) | 
| 2 | 382 | 			{
 | 
| 109 | 383 | User::Leave(KErrCorrupt); | 
| 2 | 384 | } | 
| 109 | 385 | CleanupStack::PopAndDestroy(); // st | 
| 2 | 386 | } | 
| 109 | 387 | else | 
| 388 | 		{
 | |
| 389 | User::Leave(KErrCorrupt); | |
| 390 | } | |
| 2 | 391 | } | 
| 392 | ||
| 393 | EXPORT_C void CFeedEngine::RemoveFeedL(TUint aUid) | |
| 394 | 	{
 | |
| 102 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 395 | if (iActiveFeed && iActiveFeed->Uid() == aUid) | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 396 | 		{
 | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 397 | User::Leave(KErrInUse); | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 398 | } | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 399 | |
| 2 | 400 | for (int i=0;i<iSortedFeeds.Count();i++) | 
| 401 | 		{
 | |
| 402 | if (iSortedFeeds[i]->Uid() == aUid) | |
| 403 | 			{
 | |
| 404 | iPodcastModel.ShowEngine().DeleteAllShowsByFeedL(aUid); | |
| 53 | 405 | |
| 2 | 406 | CFeedInfo* feedToRemove = iSortedFeeds[i]; | 
| 407 | ||
| 408 | //delete the image file if it exists | |
| 409 | if ((feedToRemove->ImageFileName().Length() >0) | |
| 410 | && BaflUtils::FileExists(iPodcastModel.FsSession(), feedToRemove->ImageFileName())) | |
| 411 | 				{
 | |
| 412 | iPodcastModel.FsSession().Delete(feedToRemove->ImageFileName()); | |
| 413 | } | |
| 414 | ||
| 415 | //delete the folder. It has the same name as the title. | |
| 416 | TFileName filePath; | |
| 417 | filePath.Copy(iPodcastModel.SettingsEngine().BaseDir()); | |
| 418 | filePath.Append(feedToRemove->Title()); | |
| 419 | 			filePath.Append('\\');
 | |
| 420 | iPodcastModel.FsSession().RmDir(filePath); | |
| 421 | ||
| 422 | iSortedFeeds.Remove(i); | |
| 423 | delete feedToRemove; | |
| 424 | ||
| 425 | 			DP("Removed feed from array");
 | |
| 426 | ||
| 427 | // now remove it from DB | |
| 109 | 428 | DBRemoveFeedL(aUid); | 
| 2 | 429 | } | 
| 430 | } | |
| 431 | } | |
| 432 | ||
| 433 | ||
| 109 | 434 | void CFeedEngine::DBRemoveFeedL(TUint aUid) | 
| 2 | 435 | 	{
 | 
| 436 | 	DP("CFeedEngine::DBRemoveFeed");
 | |
| 437 | _LIT(KSqlStatement, "delete from feeds where uid=%u"); | |
| 438 | iSqlBuffer.Format(KSqlStatement, aUid); | |
| 439 | ||
| 440 | sqlite3_stmt *st; | |
| 441 | ||
| 442 | int rc = sqlite3_prepare16_v2(&iDB, (const void*)iSqlBuffer.PtrZ() , -1, &st, (const void**) NULL); | |
| 443 | ||
| 444 | if (rc==SQLITE_OK) | |
| 445 | 		{
 | |
| 109 | 446 | Cleanup_sqlite3_finalize_PushL(st); | 
| 2 | 447 | rc = sqlite3_step(st); | 
| 448 | ||
| 109 | 449 | if (rc != SQLITE_DONE) | 
| 2 | 450 | 			{
 | 
| 109 | 451 | User::Leave(KErrNotFound); | 
| 2 | 452 | } | 
| 109 | 453 | |
| 454 | CleanupStack::PopAndDestroy(); //st | |
| 2 | 455 | } | 
| 109 | 456 | else | 
| 457 | 		{
 | |
| 458 | User::Leave(KErrCorrupt); | |
| 459 | } | |
| 2 | 460 | } | 
| 461 | ||
| 109 | 462 | void CFeedEngine::DBUpdateFeedL(const CFeedInfo &aItem) | 
| 2 | 463 | 	{
 | 
| 464 | 	DP2("CFeedEngine::DBUpdateFeed, title=%S, URL=%S", &aItem.Title(), &aItem.Url());
 | |
| 465 | ||
| 466 | HBufC* titleBuf = HBufC::NewLC(KMaxLineLength); | |
| 467 | TPtr titlePtr(titleBuf->Des()); | |
| 468 | titlePtr.Copy(aItem.Title()); | |
| 469 | PodcastUtils::SQLEncode(titlePtr); | |
| 470 | ||
| 471 | HBufC* descBuf = HBufC::NewLC(KMaxLineLength); | |
| 472 | TPtr descPtr(descBuf->Des()); | |
| 473 | descPtr.Copy(aItem.Description()); | |
| 474 | PodcastUtils::SQLEncode(descPtr); | |
| 475 | ||
| 476 | _LIT(KSqlStatement, "update feeds set url=\"%S\", title=\"%S\", description=\"%S\", imageurl=\"%S\", imagefile=\"%S\"," \ | |
| 477 | "link=\"%S\", built=\"%Lu\", lastupdated=\"%Lu\", feedtype=\"%u\", customtitle=\"%u\", lasterror=\"%d\" where uid=\"%u\""); | |
| 478 | iSqlBuffer.Format(KSqlStatement, | |
| 479 | &aItem.Url(), titleBuf, descBuf, &aItem.ImageUrl(), &aItem.ImageFileName(), &aItem.Link(), | |
| 480 | aItem.BuildDate().Int64(), aItem.LastUpdated().Int64(), EAudioPodcast, aItem.CustomTitle(), aItem.LastError(), aItem.Uid()); | |
| 481 | ||
| 482 | CleanupStack::PopAndDestroy(descBuf); | |
| 483 | CleanupStack::PopAndDestroy(titleBuf); | |
| 484 | ||
| 485 | sqlite3_stmt *st; | |
| 486 | ||
| 487 | int rc = sqlite3_prepare16_v2(&iDB, (const void*)iSqlBuffer.PtrZ() , -1, &st, (const void**) NULL); | |
| 488 | ||
| 489 | if (rc==SQLITE_OK) | |
| 490 | 		{
 | |
| 109 | 491 | Cleanup_sqlite3_finalize_PushL(st); | 
| 2 | 492 | rc = sqlite3_step(st); | 
| 493 | ||
| 109 | 494 | if (rc != SQLITE_DONE) | 
| 2 | 495 | 			{
 | 
| 109 | 496 | User::Leave(KErrNotFound); | 
| 2 | 497 | } | 
| 109 | 498 | CleanupStack::PopAndDestroy(); //st | 
| 2 | 499 | } | 
| 500 | else | |
| 501 | 		{
 | |
| 109 | 502 | User::Leave(KErrCorrupt); | 
| 2 | 503 | } | 
| 504 | } | |
| 505 | ||
| 506 | void CFeedEngine::ParsingCompleteL(CFeedInfo *item) | |
| 507 | 	{
 | |
| 508 | TBuf<KMaxLineLength> title; | |
| 509 | title.Copy(item->Title()); | |
| 8 | 510 | item->SetTitleL(title); // if this leaves we are out of memory | 
| 2 | 511 | } | 
| 512 | ||
| 513 | ||
| 514 | EXPORT_C void CFeedEngine::AddObserver(MFeedEngineObserver *observer) | |
| 515 | 	{
 | |
| 516 | iObservers.Append(observer); | |
| 517 | } | |
| 518 | ||
| 519 | EXPORT_C void CFeedEngine::RemoveObserver(MFeedEngineObserver *observer) | |
| 520 | 	{
 | |
| 521 | TInt index = iObservers.Find(observer); | |
| 522 | ||
| 523 | if (index > KErrNotFound) | |
| 524 | 		{
 | |
| 525 | iObservers.Remove(index); | |
| 526 | } | |
| 527 | } | |
| 528 | ||
| 529 | void CFeedEngine::Connected(CHttpClient* /*aClient*/) | |
| 530 | 	{
 | |
| 531 | } | |
| 532 | ||
| 533 | void CFeedEngine::Progress(CHttpClient* /*aHttpClient*/, TInt /*aBytes*/, TInt /*aTotalBytes*/) | |
| 534 | 	{	
 | |
| 535 | } | |
| 536 | ||
| 537 | void CFeedEngine::CompleteL(CHttpClient* /*aClient*/, TInt aError) | |
| 538 | 	{
 | |
| 539 | 	DP2("CFeedEngine::CompleteL BEGIN, iClientState=%d, aSuccessful=%d", iClientState, aError);
 | |
| 540 | ||
| 541 | switch(iClientState) | |
| 542 | 		{		
 | |
| 543 | case EUpdatingFeed: | |
| 544 | 		{
 | |
| 545 | iClientState = EIdle; | |
| 546 | switch (aError) | |
| 547 | 			{
 | |
| 548 | case KErrCancel: | |
| 549 | 				{
 | |
| 550 | iFeedsUpdating.Reset(); | |
| 551 | } | |
| 552 | break; | |
| 553 | case KErrCouldNotConnect: | |
| 554 | iFeedsUpdating.Reset(); | |
| 555 | break; | |
| 556 | default: | |
| 557 | 				{
 | |
| 32 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 558 | 				if (!iCancelRequested) {
 | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 559 | iActiveFeed->SetLastError(aError); | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 560 | TTime time; | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 561 | time.HomeTime(); | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 562 | iActiveFeed->SetLastUpdated(time); | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 563 | |
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 564 | if( aError == KErrNone) | 
| 106 
83752b9e3cb6
Fix for regression in icon handling. Minor fix for trailing backslash in podcast dir in settings pane. New udeb SISs.
 teknolog parents: 
102diff
changeset | 565 | 						{
 | 
| 
83752b9e3cb6
Fix for regression in icon handling. Minor fix for trailing backslash in podcast dir in settings pane. New udeb SISs.
 teknolog parents: 
102diff
changeset | 566 | // Parse the feed. We need to trap this call since it could leave and then | 
| 
83752b9e3cb6
Fix for regression in icon handling. Minor fix for trailing backslash in podcast dir in settings pane. New udeb SISs.
 teknolog parents: 
102diff
changeset | 567 | // the whole update chain will be broken | 
| 
83752b9e3cb6
Fix for regression in icon handling. Minor fix for trailing backslash in podcast dir in settings pane. New udeb SISs.
 teknolog parents: 
102diff
changeset | 568 | // change client state | 
| 32 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 569 | TRAPD(parserErr, iParser->ParseFeedL(iUpdatingFeedFileName, iActiveFeed, iPodcastModel.SettingsEngine().MaxListItems())); | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 570 | |
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 571 | if(parserErr) | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 572 | 							{
 | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 573 | // we do not need to any special action on this error. | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 574 | iActiveFeed->SetLastError(parserErr); | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 575 | 							DP1("CFeedEngine::Complete()\t Failed to parse feed. Leave with error code=%d", parserErr);
 | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 576 | } | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 577 | else | 
| 2 | 578 | 							{
 | 
| 32 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 579 | iPodcastModel.ShowEngine().DeleteOldShowsByFeed(iActiveFeed->Uid()); | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 580 | } | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 581 | |
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 582 | // delete the downloaded XML file as it is no longer needed | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 583 | BaflUtils::DeleteFile(iPodcastModel.FsSession(),iUpdatingFeedFileName); | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 584 | |
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 585 | // if the feed has specified a image url. download it if we dont already have it | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 586 | if((iActiveFeed->ImageUrl().Length() > 0)) | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 587 | 							{
 | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 588 | if ( (iActiveFeed->ImageFileName().Length() == 0) || | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 589 | (iActiveFeed->ImageFileName().Length() > 0 && | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 590 | !BaflUtils::FileExists(iPodcastModel.FsSession(), | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 591 | iActiveFeed->ImageFileName()) ) | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 592 | ) | 
| 2 | 593 | 								{
 | 
| 32 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 594 | TRAPD(error, GetFeedImageL(iActiveFeed)); | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 595 | if (error) | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 596 | 									{
 | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 597 | // we have failed in a very early stage to fetch the image. | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 598 | // continue with next Feed update | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 599 | iActiveFeed->SetLastError(parserErr); | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 600 | iClientState = EIdle; | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 601 | } | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 602 | } | 
| 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 603 | } | 
| 2 | 604 | } | 
| 605 | } | |
| 32 
26a3f2dfba08
Fix for bug where we always load the feed icon a large number of times
 teknolog parents: 
8diff
changeset | 606 | iCancelRequested = EFalse; | 
| 2 | 607 | }break; | 
| 608 | } | |
| 107 
af6475fdf8d6
Improved error handling; Implemented support for more than 2 flash drives also for import/export feeds
 teknolog parents: 
106diff
changeset | 609 | DBUpdateFeedL(*iActiveFeed); | 
| 96 | 610 | NotifyFeedUpdateComplete(iActiveFeed->Uid(), aError); | 
| 611 | ||
| 7 | 612 | // we will wait until the image has been downloaded to start the next feed update. | 
| 613 | if (iClientState == EIdle) | |
| 614 | 				{
 | |
| 615 | UpdateNextFeedL(); | |
| 616 | } | |
| 617 | }break; | |
| 618 | case EUpdatingImage: | |
| 619 | 			{
 | |
| 620 | // change client state to not updating | |
| 621 | iClientState = EIdle; | |
| 91 
87cb33beeae2
Remove icon index. Start caching icons as mbms.
 Lars Persson <lars.persson@embeddev.se> parents: 
32diff
changeset | 622 | if(aError == KErrNone) | 
| 
87cb33beeae2
Remove icon index. Start caching icons as mbms.
 Lars Persson <lars.persson@embeddev.se> parents: 
32diff
changeset | 623 | 				{
 | 
| 109 | 624 | // now the image has been downloaded, so we set it again in the FeedInfo to start | 
| 625 | // converting it | |
| 626 | TRAP_IGNORE(iActiveFeed->SetImageFileNameL(iActiveFeed->ImageFileName(), &iPodcastModel)); | |
| 91 
87cb33beeae2
Remove icon index. Start caching icons as mbms.
 Lars Persson <lars.persson@embeddev.se> parents: 
32diff
changeset | 627 | } | 
| 106 
83752b9e3cb6
Fix for regression in icon handling. Minor fix for trailing backslash in podcast dir in settings pane. New udeb SISs.
 teknolog parents: 
102diff
changeset | 628 | DBUpdateFeedL(*iActiveFeed); | 
| 96 | 629 | NotifyFeedUpdateComplete(iActiveFeed->Uid(), aError); | 
| 7 | 630 | UpdateNextFeedL(); | 
| 631 | }break; | |
| 632 | case ESearching: | |
| 2 | 633 | 			{
 | 
| 7 | 634 | iClientState = EIdle; | 
| 635 | ||
| 636 | 			DP2("Search complete, results in %S with error %d", &iSearchResultsFileName, aError);
 | |
| 637 | if(aError == KErrNone) | |
| 2 | 638 | 				{
 | 
| 7 | 639 | if (!iOpmlParser) | 
| 640 | 					{
 | |
| 641 | iOpmlParser = new COpmlParser(*this, iPodcastModel.FsSession()); | |
| 642 | } | |
| 643 | ||
| 644 | 				DP("Parsing OPML");
 | |
| 645 | iOpmlParser->ParseOpmlL(iSearchResultsFileName, ETrue); | |
| 2 | 646 | } | 
| 7 | 647 | else | 
| 648 | 				{
 | |
| 35 
66c5303f3610
A ton of CodeScanner fixes (high issues) - but not all
 Brendan Donegan <brendand@symbian.org> parents: 
8diff
changeset | 649 | NotifyOpmlParsingCompleteL(aError, 0); | 
| 7 | 650 | } | 
| 651 | ||
| 652 | BaflUtils::DeleteFile(iPodcastModel.FsSession(), iSearchResultsFileName); | |
| 653 | }break; | |
| 102 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 654 | default: | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 655 | 			User::Panic(_L("FeedEngine"), KErrUnknown);
 | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 656 | break; | 
| 2 | 657 | } | 
| 658 | 	DP("CFeedEngine::CompleteL END");
 | |
| 659 | } | |
| 660 | ||
| 93 
bbf5c5204844
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
 Lars Persson <lars.persson@embeddev.se> parents: 
91diff
changeset | 661 | void CFeedEngine::NotifyFeedUpdateComplete(TInt aFeedUid, TInt aError) | 
| 
bbf5c5204844
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
 Lars Persson <lars.persson@embeddev.se> parents: 
91diff
changeset | 662 | 	{
 | 
| 
bbf5c5204844
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
 Lars Persson <lars.persson@embeddev.se> parents: 
91diff
changeset | 663 | 	DP("CFeedEngine::NotifyFeedUpdateComplete");	
 | 
| 
bbf5c5204844
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
 Lars Persson <lars.persson@embeddev.se> parents: 
91diff
changeset | 664 | for (TInt i=0;i<iObservers.Count();i++) | 
| 
bbf5c5204844
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
 Lars Persson <lars.persson@embeddev.se> parents: 
91diff
changeset | 665 | 		{
 | 
| 
bbf5c5204844
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
 Lars Persson <lars.persson@embeddev.se> parents: 
91diff
changeset | 666 | TRAP_IGNORE(iObservers[i]->FeedDownloadFinishedL(MFeedEngineObserver::EFeedAutoUpdate, aFeedUid, aError)); | 
| 
bbf5c5204844
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
 Lars Persson <lars.persson@embeddev.se> parents: 
91diff
changeset | 667 | } | 
| 
bbf5c5204844
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
 Lars Persson <lars.persson@embeddev.se> parents: 
91diff
changeset | 668 | } | 
| 
bbf5c5204844
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
 Lars Persson <lars.persson@embeddev.se> parents: 
91diff
changeset | 669 | |
| 2 | 670 | void CFeedEngine::Disconnected(CHttpClient* /*aClient*/) | 
| 671 | 	{
 | |
| 672 | } | |
| 673 | ||
| 674 | void CFeedEngine::DownloadInfo(CHttpClient* /*aHttpClient */, int /*aTotalBytes*/) | |
| 675 | 	{	
 | |
| 676 | 	/*DP1("About to download %d bytes", aTotalBytes);
 | |
| 677 | 	if(aHttpClient == iShowClient && iShowDownloading != NULL && aTotalBytes != -1) {
 | |
| 678 | iShowDownloading->iShowSize = aTotalBytes; | |
| 679 | }*/ | |
| 680 | } | |
| 681 | ||
| 682 | EXPORT_C void CFeedEngine::ImportFeedsL(const TDesC& aFile) | |
| 683 | 	{
 | |
| 684 | TFileName opmlPath; | |
| 685 | opmlPath.Copy(aFile); | |
| 686 | ||
| 687 | 	if (!iOpmlParser) {
 | |
| 688 | iOpmlParser = new COpmlParser(*this, iPodcastModel.FsSession()); | |
| 689 | } | |
| 690 | ||
| 691 | iOpmlParser->ParseOpmlL(opmlPath, EFalse); | |
| 692 | } | |
| 693 | ||
| 694 | EXPORT_C TBool CFeedEngine::ExportFeedsL(TFileName& aFile) | |
| 695 | 	{
 | |
| 696 | RFile rfile; | |
| 697 | TFileName privatePath; | |
| 698 | iPodcastModel.FsSession().PrivatePath(privatePath); | |
| 699 | TInt error = rfile.Temp(iPodcastModel.FsSession(), privatePath, aFile, EFileWrite); | |
| 700 | if (error != KErrNone) | |
| 701 | 		{
 | |
| 702 | 		DP("CFeedEngine::ExportFeedsL()\tFailed to open file");
 | |
| 703 | return EFalse; | |
| 704 | } | |
| 705 | CleanupClosePushL(rfile); | |
| 706 | ||
| 707 | HBufC* templ = HBufC::NewLC(KMaxLineLength); | |
| 708 | templ->Des().Copy(KOpmlFeed()); | |
| 709 | ||
| 710 | HBufC* line = HBufC::NewLC(KMaxLineLength); | |
| 711 | HBufC* xmlUrl = HBufC::NewLC(KMaxURLLength); | |
| 712 | HBufC* htmlUrl = HBufC::NewLC(KMaxURLLength); | |
| 713 | HBufC* desc = HBufC::NewLC(KMaxDescriptionLength); | |
| 714 | HBufC* title = HBufC::NewLC(KMaxTitleLength); | |
| 715 | ||
| 716 | HBufC8* utf8line = CnvUtfConverter::ConvertFromUnicodeToUtf8L(KOpmlHeader()); | |
| 717 | ||
| 718 | rfile.Write(*utf8line); | |
| 719 | delete utf8line; | |
| 720 | ||
| 721 | for (int i=0; i<iSortedFeeds.Count(); i++) | |
| 722 | 		{
 | |
| 723 | CFeedInfo *info = iSortedFeeds[i]; | |
| 724 | 		DP1("Exporting feed '%S'", &iSortedFeeds[i]->Title());
 | |
| 725 | ||
| 726 | // XML URL | |
| 727 | TPtr ptrXml(xmlUrl->Des()); | |
| 728 | if (info->Url() != KNullDesC) | |
| 729 | 			{
 | |
| 730 | ptrXml.Copy(info->Url()); | |
| 731 | PodcastUtils::XMLEncode(ptrXml); | |
| 732 | } | |
| 733 | ||
| 734 | // Description | |
| 735 | TPtr ptrDesc(desc->Des()); | |
| 736 | ptrDesc.Zero(); | |
| 737 | 		if (info->Description() != KNullDesC) {
 | |
| 738 | ptrDesc.Copy(info->Description()); | |
| 739 | PodcastUtils::XMLEncode(ptrDesc); | |
| 740 | } | |
| 741 | ||
| 742 | // Title | |
| 743 | TPtr ptrTitle(title->Des()); | |
| 744 | ptrTitle.Zero(); | |
| 745 | ||
| 746 | 		if (info->Title() != KNullDesC) {
 | |
| 747 | ptrTitle.Copy(info->Title()); | |
| 748 | PodcastUtils::XMLEncode(ptrTitle); | |
| 749 | } | |
| 750 | ||
| 751 | // HTML URL | |
| 752 | TPtr ptrHtmlUrl(htmlUrl->Des()); | |
| 753 | ptrHtmlUrl.Zero(); | |
| 754 | ||
| 755 | 		if (info->Link() != KNullDesC) {
 | |
| 756 | ptrHtmlUrl.Copy(info->Link()); | |
| 757 | PodcastUtils::XMLEncode(ptrHtmlUrl); | |
| 758 | } | |
| 759 | // Write line to OPML file | |
| 760 | line->Des().Format(*templ, title, desc, xmlUrl, htmlUrl); | |
| 761 | utf8line = CnvUtfConverter::ConvertFromUnicodeToUtf8L(*line); | |
| 762 | rfile.Write(*utf8line); | |
| 763 | delete utf8line; | |
| 764 | } | |
| 765 | ||
| 766 | utf8line = CnvUtfConverter::ConvertFromUnicodeToUtf8L(KOpmlFooter()); | |
| 767 | rfile.Write(*utf8line); | |
| 768 | delete utf8line; | |
| 769 | ||
| 770 | CleanupStack::PopAndDestroy(7);//destroy 6 bufs & close rfile | |
| 771 | ||
| 772 | return ETrue; | |
| 773 | } | |
| 774 | ||
| 775 | EXPORT_C CFeedInfo* CFeedEngine::GetFeedInfoByUid(TUint aFeedUid) | |
| 776 | 	{
 | |
| 777 | TInt cnt = iSortedFeeds.Count(); | |
| 778 | for (TInt i=0;i<cnt;i++) | |
| 779 | 		{
 | |
| 780 | if (iSortedFeeds[i]->Uid() == aFeedUid) | |
| 781 | 			{
 | |
| 782 | return iSortedFeeds[i]; | |
| 783 | } | |
| 784 | } | |
| 785 | ||
| 786 | return NULL; | |
| 787 | } | |
| 788 | ||
| 789 | EXPORT_C const RFeedInfoArray& CFeedEngine::GetSortedFeeds() | |
| 790 | {
 | |
| 791 | TLinearOrder<CFeedInfo> sortOrder( CFeedEngine::CompareFeedsByTitle); | |
| 792 | ||
| 793 | iSortedFeeds.Sort(sortOrder); | |
| 794 | return iSortedFeeds; | |
| 795 | } | |
| 796 | ||
| 797 | TInt CFeedEngine::CompareFeedsByTitle(const CFeedInfo &a, const CFeedInfo &b) | |
| 798 | 	{
 | |
| 799 | 		//DP2("Comparing %S to %S", &a.Title(), &b.Title());
 | |
| 800 | return a.Title().CompareF(b.Title()); | |
| 801 | } | |
| 802 | ||
| 109 | 803 | EXPORT_C void CFeedEngine::GetStatsByFeedL(TUint aFeedUid, TUint &aNumShows, TUint &aNumUnplayed) | 
| 2 | 804 | 	{
 | 
| 109 | 805 | 	//DP1("CFeedEngine::GetStatsByFeed, aFeedUid=%u", aFeedUid);
 | 
| 806 | DBGetStatsByFeedL(aFeedUid, aNumShows, aNumUnplayed); | |
| 2 | 807 | } | 
| 808 | ||
| 109 | 809 | void CFeedEngine::DBGetStatsByFeedL(TUint aFeedUid, TUint &aNumShows, TUint &aNumUnplayed) | 
| 2 | 810 | 	{
 | 
| 811 | 	//DP1("CFeedEngine::DBGetStatsByFeed, feedUid=%u", aFeedUid);
 | |
| 812 | _LIT(KSqlStatement, "select count(*) from shows where feeduid=%u"); | |
| 813 | iSqlBuffer.Format(KSqlStatement, aFeedUid); | |
| 814 | ||
| 815 | sqlite3_stmt *st; | |
| 816 | ||
| 817 | int rc = sqlite3_prepare16_v2(&iDB, (const void*)iSqlBuffer.PtrZ() , -1, &st, (const void**) NULL); | |
| 818 | ||
| 109 | 819 | if( rc==SQLITE_OK) | 
| 820 | 		{
 | |
| 821 | Cleanup_sqlite3_finalize_PushL(st); | |
| 2 | 822 | rc = sqlite3_step(st); | 
| 823 | ||
| 109 | 824 | if (rc == SQLITE_ROW) | 
| 825 | 	  		{
 | |
| 2 | 826 | aNumShows = sqlite3_column_int(st, 0); | 
| 109 | 827 | } | 
| 828 | else | |
| 829 | 	  		{
 | |
| 830 | User::Leave(KErrNotFound); | |
| 831 | } | |
| 832 | CleanupStack::PopAndDestroy(); // st | |
| 833 | } | |
| 834 | else | |
| 835 | 		{
 | |
| 836 | User::Leave(KErrCorrupt); | |
| 837 | } | |
| 2 | 838 | |
| 839 | _LIT(KSqlStatement2, "select count(*) from shows where feeduid=%u and playstate=0"); | |
| 840 | iSqlBuffer.Format(KSqlStatement2, aFeedUid); | |
| 841 | ||
| 842 | rc = sqlite3_prepare16_v2(&iDB, (const void*)iSqlBuffer.PtrZ() , -1, &st, (const void**) NULL); | |
| 843 | ||
| 109 | 844 | if(rc==SQLITE_OK) | 
| 845 | 		{
 | |
| 846 | Cleanup_sqlite3_finalize_PushL(st); | |
| 2 | 847 | rc = sqlite3_step(st); | 
| 848 | ||
| 109 | 849 | if (rc == SQLITE_ROW) | 
| 850 | 	  		{
 | |
| 2 | 851 | aNumUnplayed = sqlite3_column_int(st, 0); | 
| 109 | 852 | } | 
| 853 | else | |
| 854 | 	  		{
 | |
| 855 | User::Leave(KErrNotFound); | |
| 856 | } | |
| 857 | CleanupStack::PopAndDestroy(); // st | |
| 2 | 858 | } | 
| 859 | } | |
| 860 | ||
| 109 | 861 | TUint CFeedEngine::DBGetFeedCountL() | 
| 2 | 862 | 	{
 | 
| 109 | 863 | 	DP("DBGetFeedCount BEGIN");
 | 
| 864 | sqlite3_stmt *st; | |
| 865 | int rc = sqlite3_prepare_v2(&iDB,"select count(*) from feeds" , -1, &st, (const char**) NULL); | |
| 866 | TUint size = 0; | |
| 2 | 867 | |
| 109 | 868 | if( rc==SQLITE_OK ) | 
| 869 | 		{
 | |
| 870 | Cleanup_sqlite3_finalize_PushL(st); | |
| 871 | rc = sqlite3_step(st); | |
| 872 | ||
| 873 | if (rc == SQLITE_ROW) | |
| 874 | 			{
 | |
| 2 | 875 | size = sqlite3_column_int(st, 0); | 
| 109 | 876 | } | 
| 877 | else | |
| 878 | 			{
 | |
| 879 | User::Leave(KErrCorrupt); | |
| 880 | } | |
| 881 | CleanupStack::PopAndDestroy(); // st | |
| 882 | } | |
| 883 | else | |
| 884 | 		{
 | |
| 885 | User::Leave(KErrCorrupt); | |
| 886 | } | |
| 887 | ||
| 888 | 	DP1("DBGetFeedCount END=%d", size);
 | |
| 889 | return size; | |
| 2 | 890 | } | 
| 891 | ||
| 892 | void CFeedEngine::DBLoadFeedsL() | |
| 893 | 	{
 | |
| 894 | 	DP("DBLoadFeeds BEGIN");
 | |
| 895 | iSortedFeeds.Reset(); | |
| 896 | CFeedInfo *feedInfo = NULL; | |
| 897 | ||
| 898 | _LIT(KSqlStatement, "select url, title, description, imageurl, imagefile, link, built, lastupdated, uid, feedtype, customtitle from feeds"); | |
| 899 | iSqlBuffer.Format(KSqlStatement); | |
| 900 | ||
| 901 | sqlite3_stmt *st; | |
| 902 | ||
| 903 | TLinearOrder<CFeedInfo> sortOrder( CFeedEngine::CompareFeedsByTitle); | |
| 904 | ||
| 905 | int rc = sqlite3_prepare16_v2(&iDB, (const void*)iSqlBuffer.PtrZ() , -1, &st, (const void**) NULL); | |
| 906 | ||
| 109 | 907 | if (rc==SQLITE_OK) | 
| 908 | 		{
 | |
| 909 | Cleanup_sqlite3_finalize_PushL(st); | |
| 2 | 910 | rc = sqlite3_step(st); | 
| 109 | 911 | while(rc == SQLITE_ROW) | 
| 912 | 			{
 | |
| 2 | 913 | feedInfo = CFeedInfo::NewLC(); | 
| 914 | ||
| 915 | const void *urlz = sqlite3_column_text16(st, 0); | |
| 916 | TPtrC16 url((const TUint16*)urlz); | |
| 917 | feedInfo->SetUrlL(url); | |
| 918 | ||
| 919 | const void *titlez = sqlite3_column_text16(st, 1); | |
| 920 | TPtrC16 title((const TUint16*)titlez); | |
| 921 | feedInfo->SetTitleL(title); | |
| 922 | ||
| 923 | const void *descz = sqlite3_column_text16(st, 2); | |
| 924 | TPtrC16 desc((const TUint16*)descz); | |
| 925 | feedInfo->SetDescriptionL(desc); | |
| 926 | ||
| 927 | const void *imagez = sqlite3_column_text16(st, 3); | |
| 928 | TPtrC16 image((const TUint16*)imagez); | |
| 929 | feedInfo->SetImageUrlL(image); | |
| 930 | ||
| 931 | const void *imagefilez = sqlite3_column_text16(st, 4); | |
| 932 | TPtrC16 imagefile((const TUint16*)imagefilez); | |
| 109 | 933 | if (imagefile.Length() > 0) | 
| 934 | 				{
 | |
| 935 | feedInfo->SetImageFileNameL(imagefile, &iPodcastModel); | |
| 936 | } | |
| 937 | ||
| 2 | 938 | const void *linkz = sqlite3_column_text16(st, 5); | 
| 939 | TPtrC16 link((const TUint16*)linkz); | |
| 940 | feedInfo->SetDescriptionL(link); | |
| 941 | ||
| 942 | sqlite3_int64 built = sqlite3_column_int64(st, 6); | |
| 943 | TTime buildtime(built); | |
| 944 | feedInfo->SetBuildDate(buildtime); | |
| 945 | ||
| 946 | sqlite3_int64 lastupdated = sqlite3_column_int64(st, 7); | |
| 947 | TTime lastupdatedtime(lastupdated); | |
| 948 | feedInfo->SetLastUpdated(lastupdatedtime); | |
| 949 | ||
| 950 | sqlite3_int64 customtitle = sqlite3_column_int64(st, 10); | |
| 109 | 951 | if (customtitle) | 
| 952 | 				{
 | |
| 2 | 953 | feedInfo->SetCustomTitle(); | 
| 109 | 954 | } | 
| 2 | 955 | |
| 956 | TInt lasterror = sqlite3_column_int(st, 11); | |
| 957 | feedInfo->SetLastError(lasterror); | |
| 958 | ||
| 959 | TLinearOrder<CFeedInfo> sortOrder( CFeedEngine::CompareFeedsByTitle); | |
| 960 | ||
| 961 | iSortedFeeds.InsertInOrder(feedInfo, sortOrder); | |
| 962 | ||
| 963 | CleanupStack::Pop(feedInfo); | |
| 964 | ||
| 965 | rc = sqlite3_step(st); | |
| 109 | 966 | } | 
| 967 | CleanupStack::PopAndDestroy();//st | |
| 2 | 968 | } | 
| 109 | 969 | else | 
| 970 | 		{
 | |
| 971 | User::Leave(KErrCorrupt); | |
| 972 | } | |
| 2 | 973 | |
| 974 | 	DP("DBLoadFeeds END");
 | |
| 975 | } | |
| 976 | ||
| 977 | CFeedInfo* CFeedEngine::DBGetFeedInfoByUidL(TUint aFeedUid) | |
| 978 | 	{
 | |
| 979 | 	DP("CFeedEngine::DBGetFeedInfoByUid");
 | |
| 980 | CFeedInfo *feedInfo = NULL; | |
| 981 | _LIT(KSqlStatement, "select url, title, description, imageurl, imagefile, link, built, lastupdated, uid, feedtype, customtitle, lasterror from feeds where uid=%u"); | |
| 982 | iSqlBuffer.Format(KSqlStatement, aFeedUid); | |
| 983 | ||
| 984 | sqlite3_stmt *st; | |
| 109 | 985 | |
| 2 | 986 | int rc = sqlite3_prepare16_v2(&iDB, (const void*)iSqlBuffer.PtrZ() , -1, &st, (const void**) NULL); | 
| 987 | ||
| 109 | 988 | if (rc==SQLITE_OK) | 
| 989 | 		{
 | |
| 2 | 990 | Cleanup_sqlite3_finalize_PushL(st); | 
| 991 | rc = sqlite3_step(st); | |
| 109 | 992 | if (rc == SQLITE_ROW) | 
| 993 | 			{
 | |
| 2 | 994 | feedInfo = CFeedInfo::NewLC(); | 
| 995 | ||
| 996 | const void *urlz = sqlite3_column_text16(st, 0); | |
| 997 | TPtrC16 url((const TUint16*)urlz); | |
| 998 | feedInfo->SetUrlL(url); | |
| 999 | ||
| 1000 | const void *titlez = sqlite3_column_text16(st, 1); | |
| 1001 | TPtrC16 title((const TUint16*)titlez); | |
| 1002 | feedInfo->SetTitleL(title); | |
| 1003 | ||
| 1004 | const void *descz = sqlite3_column_text16(st, 2); | |
| 1005 | TPtrC16 desc((const TUint16*)descz); | |
| 1006 | feedInfo->SetDescriptionL(desc); | |
| 1007 | ||
| 1008 | const void *imagez = sqlite3_column_text16(st, 3); | |
| 1009 | TPtrC16 image((const TUint16*)imagez); | |
| 1010 | feedInfo->SetImageUrlL(image); | |
| 1011 | ||
| 1012 | const void *imagefilez = sqlite3_column_text16(st, 4); | |
| 1013 | TPtrC16 imagefile((const TUint16*)imagefilez); | |
| 1014 | feedInfo->SetDescriptionL(imagefile); | |
| 1015 | ||
| 1016 | const void *linkz = sqlite3_column_text16(st, 5); | |
| 1017 | TPtrC16 link((const TUint16*)linkz); | |
| 1018 | feedInfo->SetDescriptionL(link); | |
| 1019 | ||
| 1020 | sqlite3_int64 built = sqlite3_column_int64(st, 6); | |
| 1021 | TTime buildtime(built); | |
| 1022 | feedInfo->SetBuildDate(buildtime); | |
| 1023 | ||
| 1024 | sqlite3_int64 lastupdated = sqlite3_column_int64(st, 7); | |
| 1025 | TTime lastupdatedtime(lastupdated); | |
| 1026 | feedInfo->SetLastUpdated(lastupdatedtime); | |
| 1027 | ||
| 1028 | sqlite3_int64 customtitle = sqlite3_column_int64(st, 10); | |
| 1029 | 			if (customtitle) {
 | |
| 1030 | feedInfo->SetCustomTitle(); | |
| 1031 | } | |
| 1032 | ||
| 1033 | TInt lasterror = sqlite3_column_int(st, 11); | |
| 1034 | feedInfo->SetLastError(lasterror); | |
| 1035 | ||
| 1036 | CleanupStack::Pop(feedInfo); | |
| 109 | 1037 | } | 
| 1038 | else | |
| 1039 | 			{
 | |
| 1040 | User::Leave(KErrNotFound); | |
| 1041 | } | |
| 2 | 1042 | CleanupStack::PopAndDestroy();//st | 
| 109 | 1043 | } | 
| 1044 | else | |
| 1045 | 		{
 | |
| 1046 | User::Leave(KErrNotFound); | |
| 1047 | } | |
| 2 | 1048 | |
| 1049 | return feedInfo; | |
| 1050 | } | |
| 1051 | ||
| 102 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 1052 | EXPORT_C void CFeedEngine::UpdateFeedInfoL(CFeedInfo *aItem) | 
| 2 | 1053 | 	{
 | 
| 102 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 1054 | if (iActiveFeed && iActiveFeed->Uid() == aItem->Uid()) | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 1055 | 		{
 | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 1056 | User::Leave(KErrInUse); | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 1057 | } | 
| 
04c6ccce8e7e
Fix for bug 2408. Improved feed engine robustness.
 teknolog parents: 
100diff
changeset | 1058 | |
| 35 
66c5303f3610
A ton of CodeScanner fixes (high issues) - but not all
 Brendan Donegan <brendand@symbian.org> parents: 
8diff
changeset | 1059 | DBUpdateFeedL(*aItem); | 
| 2 | 1060 | } | 
| 1061 | ||
| 1062 | EXPORT_C void CFeedEngine::SearchForFeedL(TDesC& aSearchString) | |
| 1063 | 	{
 | |
| 1064 | 	DP1("FeedEngine::SearchForFeedL BEGIN, aSearchString=%S", &aSearchString);
 | |
| 1065 | ||
| 1066 | 	if (iClientState != EIdle) {
 | |
| 1067 | User::Leave(KErrInUse); | |
| 1068 | } | |
| 1069 | TBuf<KMaxURLLength> ssBuf; | |
| 1070 | ssBuf.Copy(aSearchString); | |
| 1071 | 	PodcastUtils::ReplaceString(ssBuf, _L(" "), _L("%20"));
 | |
| 1072 | // prepare search URL | |
| 1073 | HBufC* templ = HBufC::NewLC(KMaxLineLength); | |
| 1074 | templ->Des().Copy(KSearchUrl()); | |
| 1075 | ||
| 1076 | HBufC* url = HBufC::NewLC(KMaxURLLength); | |
| 1077 | url->Des().Format(*templ, &ssBuf); | |
| 1078 | ||
| 1079 | 	DP1("SearchURL: %S", url);
 | |
| 1080 | ||
| 1081 | // crate path to store OPML search results | |
| 1082 | iPodcastModel.FsSession().PrivatePath(iSearchResultsFileName); | |
| 1083 | ||
| 1084 | iSearchResultsFileName.Append(KSearchResultsFileName); | |
| 1085 | iSearchResults.ResetAndDestroy(); | |
| 1086 | // run search | |
| 1087 | if(iFeedClient->GetL(*url, iSearchResultsFileName, iPodcastModel.SettingsEngine().SpecificIAP())) | |
| 1088 | 		{
 | |
| 1089 | iClientState = ESearching; | |
| 1090 | } | |
| 1091 | else | |
| 1092 | 		{
 | |
| 1093 | iClientState = EIdle; | |
| 1094 | User::Leave(KErrAbort); | |
| 1095 | } | |
| 1096 | ||
| 1097 | CleanupStack::PopAndDestroy(url); | |
| 1098 | CleanupStack::PopAndDestroy(templ); | |
| 1099 | ||
| 1100 | 	DP("FeedEngine::SearchForFeedL END");
 | |
| 1101 | } | |
| 1102 | ||
| 1103 | EXPORT_C void CFeedEngine::AddSearchResultL(CFeedInfo *item) | |
| 1104 | 	{
 | |
| 1105 | 	DP1("CFeedEngine::AddSearchResultL, item->Title()=%S", &(item->Title()));
 | |
| 1106 | iSearchResults.AppendL(item); | |
| 1107 | } | |
| 1108 | ||
| 1109 | EXPORT_C const RFeedInfoArray& CFeedEngine::GetSearchResults() | |
| 1110 | 	{
 | |
| 1111 | return iSearchResults; | |
| 1112 | } | |
| 1113 | ||
| 1114 | ||
| 35 
66c5303f3610
A ton of CodeScanner fixes (high issues) - but not all
 Brendan Donegan <brendand@symbian.org> parents: 
8diff
changeset | 1115 | EXPORT_C void CFeedEngine::OpmlParsingCompleteL(TInt aError, TUint aNumFeedsAdded) | 
| 2 | 1116 | 	{
 | 
| 35 
66c5303f3610
A ton of CodeScanner fixes (high issues) - but not all
 Brendan Donegan <brendand@symbian.org> parents: 
8diff
changeset | 1117 | NotifyOpmlParsingCompleteL(aError, aNumFeedsAdded); | 
| 2 | 1118 | } | 
| 1119 | ||
| 35 
66c5303f3610
A ton of CodeScanner fixes (high issues) - but not all
 Brendan Donegan <brendand@symbian.org> parents: 
8diff
changeset | 1120 | void CFeedEngine::NotifyOpmlParsingCompleteL(TInt aError, TUint aNumFeedsAdded) | 
| 2 | 1121 | 	{
 | 
| 1122 | for (TInt i=0;i<iObservers.Count();i++) | |
| 1123 | 		{
 | |
| 7 | 1124 | iObservers[i]->OpmlParsingComplete(aError, aNumFeedsAdded); | 
| 2 | 1125 | } | 
| 1126 | } |