browserutilities/feedsengine/FeedsServer/Client/src/Feed.cpp
changeset 0 dd21522fd290
child 36 0ed94ceaa377
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/feedsengine/FeedsServer/Client/src/Feed.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,417 @@
+/*
+* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Holds information about a feed.
+*
+*/
+
+
+//#ifdef _DEBUG
+#include <f32file.h>
+//#endif
+
+#include "FeedAttributes.h"
+#include "FeedsServerFeed.h"
+#include "Logger.h"
+
+// -----------------------------------------------------------------------------
+// CFeed::NewL
+//
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CFeed* CFeed::NewL(CFeedsEntity* aFeedsEntity)
+    {
+    CFeed* self = new (ELeave) CFeed(aFeedsEntity);
+
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CFeed::CFeed
+//
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CFeed::CFeed(CFeedsEntity* aFeedsEntity):
+        iLeakTracker(CLeakTracker::EFeed), iFeedsEntity(aFeedsEntity), iTitle(KNullDesC), 
+        iDescription(KNullDesC), iUrl(KNullDesC), iDate(0), iItems(5)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CFeed::ConstructL
+//
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CFeed::ConstructL()
+    {
+    CEnclosure*  enclosure = NULL;
+    TPtrC        title;
+    TPtrC        description;
+    TPtrC        url;   
+    TInt         feedId;    
+    TInt         itemCount  = iFeedsEntity->GetChildren().Count();
+
+
+    for(TInt i=0 ; i< itemCount ; i++)
+        {
+        CFeedsEntity *feedEntity = iFeedsEntity->GetChildren()[i];
+        CItem *newItem = CItem::NewL( feedEntity);
+        CleanupStack::PushL( newItem);
+        TInt   enclosureCount = feedEntity->GetChildren().Count();
+ 
+        for(TInt j=0 ; j< enclosureCount ; j++)
+             {
+             enclosure = CEnclosure::NewL( feedEntity->GetChildren()[j]);
+             CleanupStack::PushL( enclosure);
+             newItem->AddEnclosureL( enclosure);
+             CleanupStack::Pop( enclosure);
+             }                 
+
+        iItems.Append( newItem);
+        CleanupStack::Pop( newItem);
+        }
+
+    iFeedsEntity->GetIntegerValue( EFeedAttributeFeedId, feedId);
+    iFeedId = feedId;
+
+    iFeedsEntity->GetStringValue( EFeedAttributeTitle, title);
+    SetAttribute( EFeedAttributeTitle, title);
+
+    iFeedsEntity->GetStringValue( EFeedAttributeDescription, description);
+    SetAttribute( EFeedAttributeDescription, description);
+
+    iFeedsEntity->GetStringValue( EFeedAttributeLink, url);
+    SetAttribute( EFeedAttributeLink,url);           
+
+    iFeedsEntity->GetTimeValue( EFeedAttributeTimestamp, iDate);   
+
+    }
+
+
+// -----------------------------------------------------------------------------
+// CFeed::~CFeed
+//
+// Deconstructor.
+// -----------------------------------------------------------------------------
+//
+CFeed::~CFeed()
+    {
+    // Delete the items.
+    iItems.ResetAndDestroy();
+    }
+
+// -----------------------------------------------------------------------------
+// CFeed::Id
+//
+// Returns the feed's unique id.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CFeed::Id() const
+    {
+    return iFeedId;
+    }
+
+// -----------------------------------------------------------------------------
+// CFeed::Title
+//
+// Returns the feed's title.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& CFeed::Title() const
+    {
+    return iTitle;
+    }
+
+// -----------------------------------------------------------------------------
+// CFeed::Description
+//
+// Returns the feed's description.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& CFeed::Description() const
+    {
+    return iDescription;
+    }
+
+// -----------------------------------------------------------------------------
+// CFeed::Url
+//
+// Returns the feed's url.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& CFeed::Url() const
+    {
+    return iUrl;
+    }
+
+// -----------------------------------------------------------------------------
+// CFeed::Date
+//
+// Returns the feed's date.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TTime& CFeed::Date() const
+    {
+    return iDate;
+    }
+
+// -----------------------------------------------------------------------------
+// CFeed::ItemCount
+//
+// Returns the number of items.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CFeed::ItemCount() const
+    {
+    return iItems.Count();
+    }
+
+// -----------------------------------------------------------------------------
+// CFeed::ItemAt
+//
+// Returns the item at the given index
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const CItem& CFeed::ItemAt(TInt aIndex) const
+    {
+    return *(iItems[aIndex]);
+    }
+
+// -----------------------------------------------------------------------------
+// CFeed::ItemStatusL
+//
+// Returns the INITIAL status of each of the items in the feed.
+// The caller can then modify the values and call RFeed::UpdateFeedItemStatusL
+// to request the feeds server to update the feed's item status.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CFeed::ItemStatusL(RArray<TInt>& aItemIds, 
+        RArray<TItemStatus>& aItemStatus) const
+    {
+    aItemIds.Reset();
+    aItemStatus.Reset();
+
+    // Add the item attributes.
+    for (TInt i = 0; i < iItems.Count(); i++)
+        {
+        User::LeaveIfError(aItemIds.Append(iItems[i]->Id()));
+        User::LeaveIfError(aItemStatus.Append(iItems[i]->ItemStatus()));
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CFeed::AddItemL
+//
+// Appends the new Item to the Feed.  aItem is adopted by this method.
+// -----------------------------------------------------------------------------
+//
+void CFeed::AddItemL(CItem* aItem)
+    {
+    User::LeaveIfError(iItems.Append(aItem));
+    }
+
+// -----------------------------------------------------------------------------
+// CFeed::SetAttribute
+//
+// Sets an attribute.
+// -----------------------------------------------------------------------------
+//
+void CFeed::SetAttribute(TUint aAttribute, const TPtrC& aAttributeValue)
+    {
+    switch (aAttribute)
+        {
+        case EFeedAttributeFeedId:
+            {
+            TLex16  lex(aAttributeValue); 
+
+            lex.Val(iFeedId);
+            }
+            break;
+
+        case EFeedAttributeTitle:
+            iTitle.Set(aAttributeValue);
+            break;
+
+        case EFeedAttributeDescription:
+            iDescription.Set(aAttributeValue);
+            break;
+
+        case EFeedAttributeLink:
+            iUrl.Set(aAttributeValue);
+            break;
+
+        case EFeedAttributeTimestamp:
+            {
+            TLex16  lex(aAttributeValue); 
+            TInt64  val;
+            lex.Val(val);                
+            iDate = val;
+            }
+            break;
+
+        default:
+            break;
+        }
+    }
+
+//#ifdef _DEBUG
+// -----------------------------------------------------------------------------
+// CFeed::Debug_Print
+//
+// Prints the item to the log file.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CFeed::Debug_Print(void) const
+    {
+    FEED_LOG(_L("Feeds"), _L("Feeds_Dump.log"), 
+        EFileLoggingModeAppend, _L("\tFeed:"));
+
+    if (iTitle.Length() > 0)
+        {
+        FEED_LOG1(_L("Feeds"), _L("Feeds_Dump.log"), 
+            EFileLoggingModeAppend, _L("\t\tTitle: %S"), &iTitle);
+        }
+
+    if (iUrl.Length() > 0)
+        {
+        FEED_LOG1(_L("Feeds"), _L("Feeds_Dump.log"), 
+            EFileLoggingModeAppend, _L("\t\tLink: %S"), &iUrl);
+        }
+
+    if (iDescription.Length() > 0)
+        {
+        FEED_LOG1(_L("Feeds"), _L("Feeds_Dump.log"), 
+            EFileLoggingModeAppend, _L("\t\tDescription: %S"), &iDescription);
+        }
+
+    // Print the items.
+    FEED_LOG(_L("Feeds"), _L("Feeds_Dump.log"), 
+        EFileLoggingModeAppend, _L("\tItems:"));
+
+    for (TInt i = 0; i < iItems.Count(); i++)
+        {
+        iItems[i]->Debug_Print();
+        }
+
+    FEED_LOG(_L("Feeds"), _L("Feeds_Dump.log"), 
+        EFileLoggingModeAppend, _L(""));
+    FEED_LOG(_L("Feeds"), _L("Feeds_Dump.log"), 
+        EFileLoggingModeAppend, _L(""));
+    }
+
+
+// -----------------------------------------------------------------------------
+// CFeed::Debug_PrintInfo
+//
+// Prints info about the feed.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CFeed::Debug_PrintInfo(const TDesC& aUrl, RFile& aFile) const
+    {
+    TInt            channels = 1;
+    TInt            titles = 0;
+    TInt            descriptions = 0;
+    TInt            items = 0;
+    TInt            links = 0;
+     
+    // Count the "unimportant" attributes.
+    titles = iOtherTitles;
+    links = iOtherLinks;
+    descriptions = iOtherDescriptions;
+    
+    // Add the Channel attributes
+    if (iTitle.Length() > 0)
+        {
+        titles++;
+        }
+    if (iDescription.Length() > 0)
+        {
+        descriptions++;
+        }
+    if (iUrl.Length() > 0)
+        {
+        links++;
+        }
+
+    // Add the item attributes.
+    for (TInt i = 0; i < iItems.Count(); i++)
+        {
+        CItem*  item;
+
+        item = iItems[i];
+        items++;
+
+        if (item->Title().Length() > 0)
+            {
+            titles++;
+            }
+        if (item->Description().Length() > 0)
+            {
+            descriptions++;
+            }
+        if (item->Url().Length() > 0)
+            {
+            links++;
+            }
+        }
+
+    // Write out the stats.
+    TBuf8<100>    buff;
+
+    aFile.Write(_L8("Feed Overview:\n"));
+
+    // Write out the url.
+    TUint8* asciiBuf = new TUint8[aUrl.Length() + 1];
+
+    if (asciiBuf != NULL)
+        {
+        TPtr8 asciiPtr(asciiBuf, 0, aUrl.Length() + 1);
+        TPtrC16 ucs2Ptr(aUrl);
+
+        asciiPtr.Copy(ucs2Ptr);
+        asciiPtr.ZeroTerminate();
+
+        aFile.Write(_L8("\tfile: "));
+        aFile.Write(asciiPtr);
+        aFile.Write(_L8("\n"));
+
+        delete asciiBuf;
+        }
+
+    buff.Format(_L8("\tchannel: %d\n"), channels);
+    aFile.Write(buff);
+
+    buff.Format(_L8("\tdescription: %d\n"), descriptions);
+    aFile.Write(buff);
+
+    buff.Format(_L8("\titem: %d\n"), items);
+    aFile.Write(buff);
+
+    buff.Format(_L8("\tlink: %d\n"), links);
+    aFile.Write(buff);
+
+    buff.Format(_L8("\ttitle: %d\n"), titles);
+    aFile.Write(buff);
+
+    buff.Format(_L8("\r\n"));
+    aFile.Write(buff);
+    }
+//#endif