browserutilities/feedsengine/FeedsServer/Api/src/FeedsEntity.cpp
changeset 0 dd21522fd290
child 36 0ed94ceaa377
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/feedsengine/FeedsServer/Api/src/FeedsEntity.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,673 @@
+/*
+* Copyright (c) 2008 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:  The client side connection to the FeedsSever.
+ *
+*/
+
+
+#include "FeedsEntity.h"
+#include "FeedsMap.h"
+#include "PackedAttributes.h"
+#include "FeedAttributes.h"
+#include <FolderAttributes.h>
+#include "Packed.h"
+#include "PackedFeed.h"
+#include "PackedFolder.h"
+#include "FeedsInterface.h"
+
+// Constant definitions
+_LIT(KNew, "new");
+_LIT(KRead, "read");
+_LIT(KUnread, "unread");
+
+// -----------------------------------------------------------------------------
+// CFeedsEntity::ChangeValueL
+//
+// Changes attribute/Property values based on passed Map
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CFeedsEntity::ChangeValueL(const CFeedsMap& aNewValues)
+    {
+    return iFeedInterface->SetAttributeL(*this, aNewValues);
+    } 
+// -----------------------------------------------------------------------------
+// CFeedsEntity::GetStringValue
+//
+// Returns String value based on passed attribute.
+// -----------------------------------------------------------------------------
+//
+
+EXPORT_C TInt CFeedsEntity::GetStringValue(TUint anAttribute, TPtrC& aValue) const
+    {
+    return iAttrProp->GetStringAttribute(anAttribute, aValue);
+    }
+// -----------------------------------------------------------------------------
+// CFeedsEntity::GetIntegerValue
+//
+// Initialises aValue with integer value of passed anAttribute.
+// -----------------------------------------------------------------------------
+//
+
+EXPORT_C TInt CFeedsEntity::GetIntegerValue(TUint anAttribute, TInt& aValue) const
+    {
+    if(EFeedAttributeFeedId == anAttribute)
+        {
+        aValue = iFeedId;
+        return KErrNone;    
+        }
+    else
+        return iAttrProp->GetIntegerAttribute(anAttribute, aValue);
+    }
+// -----------------------------------------------------------------------------
+// CFeedsEntity::GetTimeValue
+//
+// Initialises aValue with time value of passed anAttribute.
+// -----------------------------------------------------------------------------
+//
+
+EXPORT_C TInt CFeedsEntity::GetTimeValue(TUint anAttribute, TTime& aValue) const
+    {
+    return iAttrProp->GetTimeAttribute(anAttribute, aValue);
+    }
+
+// -----------------------------------------------------------------------------
+// CFeedsEntity::NewL
+//
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CFeedsEntity* CFeedsEntity::NewL(RFeedsInterface* aFeedsInterface)
+    {
+    CFeedsEntity* self = new (ELeave) CFeedsEntity();
+
+    CleanupStack::PushL (self);
+    self->ConstructL ();
+    self->SetFeedInterface (aFeedsInterface);
+    CleanupStack::Pop ();
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CFeedsEntity::NewL
+//
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CFeedsEntity* CFeedsEntity::NewL(CPackedFolder* aPackedFolder,
+        RFeedsInterface* aFeedsInterface)
+    {
+    CFeedsEntity* self = new (ELeave) CFeedsEntity(aPackedFolder);
+
+    CleanupStack::PushL (self);
+    self->SetFeedInterface (aFeedsInterface);
+    self->ConstructL (*aPackedFolder);
+    CleanupStack::Pop ();
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CFeedsEntity::NewL
+//
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CFeedsEntity* CFeedsEntity::NewL(CPackedFeed* aPackedFeed,
+        RFeedsInterface* aFeedsInterface)
+    {
+    CFeedsEntity* self = new (ELeave) CFeedsEntity(aPackedFeed);
+
+    CleanupStack::PushL (self);
+    self->SetFeedInterface (aFeedsInterface);
+    self->ConstructL (*aPackedFeed);
+    CleanupStack::Pop ();
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CFeedsEntity::NewFolderL
+//
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CFeedsEntity* CFeedsEntity::NewFolderL(const TDesC& aTitle, TInt aEntryId, TInt aStatusCode)
+    {
+    CFeedsEntity* self = new (ELeave) CFeedsEntity();
+
+    CleanupStack::PushL (self);
+    self->ConstructL ();
+    CleanupStack::Pop ();
+
+    self->iId = aEntryId;
+    self->iType = EFolder;
+    self->iAttrProp->SetStringAttribute (EFolderAttributeTitle, aTitle);
+    self->iAttrProp->SetIntegerAttribute(EFolderAttributeStatus,aStatusCode);
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CFeedsEntity::NewFeedL
+//
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CFeedsEntity* CFeedsEntity::NewFeedL( const TDesC& aTitle, const TDesC& aUrl,
+        TInt aEntryId, TInt aFeedId, const TTime& aTimestamp, TInt aStatusCode, TInt aFreq,
+        const TInt& aUnreadCount)
+    {
+    CFeedsEntity* self = new (ELeave) CFeedsEntity();
+
+    CleanupStack::PushL (self);
+    self->ConstructL ();
+    CleanupStack::Pop ();
+
+    self->iId = aEntryId;
+    self->iType = EFeed;
+    self->iAttrProp->SetStringAttribute (EFeedAttributeTitle, aTitle);
+    self->iAttrProp->SetStringAttribute (EFeedAttributeLink, aUrl);
+    self->iAttrProp->SetTimeAttribute (EFeedAttributeTimestamp, aTimestamp);
+    self->iAttrProp->SetIntegerAttribute (EFeedAttributeAutoUpdateFreq, aFreq);
+    self->iAttrProp->SetIntegerAttribute (EFolderAttributeUnreadCount,
+    		aUnreadCount);
+    self->iFeedId = aFeedId;
+    self->iAttrProp->SetIntegerAttribute(EFolderAttributeStatus,aStatusCode);
+    return self;
+    }
+	
+// -----------------------------------------------------------------------------
+// CFeedsEntity::NewMiniItemL
+//
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CFeedsEntity* CFeedsEntity::NewMiniItemL()
+    {
+    CFeedsEntity* self = new (ELeave) CFeedsEntity();
+
+    CleanupStack::PushL (self);
+    self->ConstructL ();
+    CleanupStack::Pop ();
+
+    self->iType = EMiniItem;
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CFeedsEntity::CFeedsEntity
+// C++ default constructor can NOT contain any code, that
+// might leave.    aPackedFolder is adopted 
+// -----------------------------------------------------------------------------
+//
+CFeedsEntity::CFeedsEntity(CPackedFolder* aPackedFolder) :
+    iPacked((CPacked*)aPackedFolder)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CFeedsEntity::CFeedsEntity
+// C++ default constructor can NOT contain any code, that
+// might leave.    aPackedFolder is adopted 
+// -----------------------------------------------------------------------------
+//
+CFeedsEntity::CFeedsEntity(CPackedFeed* aPackedFeed) :
+    iPacked((CPacked*)aPackedFeed)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CFeedsEntity::CFeedsEntity
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CFeedsEntity::CFeedsEntity()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CFeedsEntity::ConstructL
+// Symbian 2nd phase constructor can leave.
+// by this method.
+// -----------------------------------------------------------------------------
+//
+void CFeedsEntity::ConstructL()
+    {
+    iAttrProp = CFeedsMap::NewL ();
+    }
+
+CFeedsEntity::~CFeedsEntity()
+    {
+    delete iAttrProp;
+    iAttrProp = NULL;
+    iChildren.ResetAndDestroy ();
+    }
+
+// -----------------------------------------------------------------------------
+// CFeedsEntity::ConstructL
+// Symbian 2nd phase constructor can leave.
+// by this method.
+// -----------------------------------------------------------------------------
+//
+void CFeedsEntity::ConstructL(const CPackedFolder& aPackedFolder)
+    {
+    CFeedsEntity* rootFolder = NULL;
+    CFeedsEntity* currentFolder = NULL;
+    CFeedsEntity* folderItem = NULL;
+    CFeedsEntity* miniItem = NULL;
+    TPtrC title;
+    TPtrC url;
+    TInt entryId;
+    TInt feedId;
+    TTime timestamp;
+    TInt freq;
+    TInt unreadCount;
+    TInt status; 
+    TBool isMiniItem = EFalse;
+    TUint attribute;
+    //	CItemMini* miniItem = NULL;
+    TPtrC attributeValue;
+
+    ConstructL ();
+
+    // Unpack the packed folder.
+    while (aPackedFolder.HasNextToken ())
+        {
+        TUint token;
+
+        token = aPackedFolder.NextToken ();
+
+        switch (token)
+            {
+            case EFolderTokenFolderBegin:
+                // Get the folder item's attributes.
+                aPackedFolder.ExtractAttributes (title, url, entryId, feedId,
+                        timestamp, unreadCount, status, freq);
+
+                // CPackedFolders contain a single root folder.  Because of this
+                // the first folder should be treated as the root.  "this" 
+                // becomes the root CFeedsEntity.
+                if ( rootFolder == NULL)
+                    {
+                    iId = entryId;
+                    iType = EFolder;
+                    iParent = NULL;
+                    iAttrProp->SetStringAttribute (EFolderAttributeTitle, title);
+                    iAttrProp->SetIntegerAttribute(EFolderAttributeStatus,status);
+                    rootFolder = this;
+                    currentFolder = this;
+                    }
+
+            	// Otherwise create a subfolder and set its parent.
+            	else
+                    {
+                    folderItem = CFeedsEntity::NewFolderL (title, entryId, status);
+                    folderItem->SetFeedInterface (iFeedInterface);
+                    // Add the folder to the parent.
+                    User::LeaveIfError (currentFolder->iChildren.Append (folderItem));
+                    folderItem->iParent = currentFolder;
+
+                    // Set this folder as the active folder.
+                    currentFolder = folderItem;
+                    }
+                break;
+
+            case EFolderTokenFolderEnd:
+                // Set the current folder to its parent.
+                currentFolder = const_cast<CFeedsEntity*>(currentFolder->iParent);
+                break;
+
+            case EFolderTokenFeed:
+                // Get the folder item's attributes.
+                aPackedFolder.ExtractAttributes (title, url, entryId, feedId,
+                        timestamp, unreadCount, status, freq);
+
+                // Create the new feed and add it to the current folder.
+                // folderListId is shared by all feeds/folders
+                folderItem = CFeedsEntity::NewFeedL (title, url, entryId,
+                        feedId, timestamp, status, freq, unreadCount );
+                folderItem->SetFeedInterface (iFeedInterface);
+                // Add the folder to the parent.
+                User::LeaveIfError (currentFolder->iChildren.Append (folderItem));
+                folderItem->iParent = currentFolder;
+                break;
+
+            case EFolderTokenItemBegin:
+                miniItem = CFeedsEntity::NewMiniItemL();
+            //	miniItem->iType = EMiniItem;
+                CleanupStack::PushL(miniItem);
+                isMiniItem = ETrue;
+                break;
+
+            case EFolderTokenItemEnd:
+                isMiniItem = EFalse;         
+                miniItem->SetFeedInterface (iFeedInterface);       
+            //    folderItem->AddMiniItem(miniItem);
+                User::LeaveIfError (currentFolder->iChildren.Append (miniItem));
+               // CleanupStack::Pop(miniItem);
+            	break;
+
+            case EPackedTokenAttribute:
+                aPackedFolder.ExtractAttributeValue(attribute, attributeValue);
+                    
+                if (isMiniItem)
+                    {
+                    miniItem->SetAttribute(attribute, attributeValue);
+                    }
+                else
+                    {
+                    // TODO: Panic.
+                    }
+                break;			
+
+            	
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CFeedsEntity::ConstructL
+// Symbian 2nd phase constructor can leave.
+// by this method.
+// -----------------------------------------------------------------------------
+//
+void CFeedsEntity::ConstructL(const CPackedFeed& aPackedFeed)
+    {
+    TBool isFeed = EFalse;
+    TBool isItem = EFalse;
+    TBool isEnclosure = EFalse;
+
+    CFeedsEntity* item = NULL;
+    CFeedsEntity* enclosure = NULL;
+    TUint attribute;
+    TPtrC attributeValue;
+    ConstructL ();
+
+    // Unpack the packed feed.
+    while (aPackedFeed.HasNextToken ())
+        {
+        TUint token;
+
+        token = aPackedFeed.NextToken ();
+
+        switch (token)
+            {
+            case EFeedTokenFeedBegin:
+                isFeed = ETrue;
+                break;
+
+            case EFeedTokenItemBegin:
+                item = CFeedsEntity::NewL (iFeedInterface);
+                item->iType = EFeedsItem;
+                item->iParent = this;
+                CleanupStack::PushL (item);
+                isItem = ETrue;
+                break;
+
+            case EFeedTokenEnclosureBegin:
+                enclosure = CFeedsEntity::NewL (iFeedInterface);
+                enclosure->iType = EFeedsEnclosure;
+                enclosure->iParent = item;
+                CleanupStack::PushL (enclosure);
+                isEnclosure = ETrue;
+                break;
+
+            case EFeedTokenFeedEnd:
+                isFeed = EFalse;
+                break;
+
+            case EFeedTokenItemEnd:
+                isItem = EFalse;
+                User::LeaveIfError (iChildren.Append (item));
+                CleanupStack::Pop (item);
+                break;
+
+            case EFeedTokenEnclosureEnd:
+                isEnclosure = EFalse;
+                User::LeaveIfError (item->iChildren.Append (enclosure));
+                CleanupStack::Pop (enclosure);
+                break;
+
+            case EPackedTokenAttribute:
+                aPackedFeed.ExtractAttributeValue (attribute, attributeValue);
+                if ( isEnclosure)
+                    {
+                    enclosure->SetAttribute (attribute, attributeValue);
+                    }
+                else
+                    if ( isItem)
+                        {
+                        item->SetAttribute (attribute, attributeValue);
+                        }
+                    else
+                        if ( isFeed)
+                            {
+                            SetAttribute (attribute, attributeValue);
+                            }
+                        else
+                            {
+                            // TODO: Panic.
+                            }
+                break;
+
+            case EFeedTokenOtherTitle:
+                //iOtherTitles++;
+                break;
+
+            case EFeedTokenOtherDescription:
+                //iOtherDescriptions++;
+                break;
+
+            case EFeedTokenOtherLink:
+                //iOtherLinks++;
+                break;
+
+            default:
+                // Ignore
+                break;
+            };
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CFeedsEntity::SetAttribute
+//
+// adds given attribute in iAttrProp Map
+// -----------------------------------------------------------------------------
+//
+void CFeedsEntity::SetAttribute(TUint aAttribute, const TPtrC& aAttributeValue)
+    {
+    switch(iType)
+    {
+        case EFeed:
+            {
+            switch(aAttribute)
+                {
+                case EFeedAttributeUnused:
+                case EFeedAttributeTitle:
+                case EFeedAttributeLink:
+                case EFeedAttributeDescription:
+                case EFeedAttributeTimestamp:
+                case EFeedAttributeImage:
+                case EFeedAttributeTTL:
+                case EFeedAttributeSkipHours:
+                case EFeedAttributeSkipDays:
+                case EFeedAttributeLanguage:
+                case EFeedAttributeCopyright:
+                case EFeedAttributeEditor:
+                case EFeedAttributeWebMaster:
+                case EFeedAttributePubDate:
+                case EFeedAttributeCategory:
+                case EFeedAttributeGenerator:
+                case EFeedAttributeDocs:
+                case EFeedAttributeCloud:
+                case EFeedAttributeRating:
+                case EFeedAttributeTextInput:
+                case EFeedAttributeAssociatedUrl:
+                case EFeedAttributeFeedUrl:
+                    iAttrProp->SetStringAttribute (aAttribute, aAttributeValue);
+                    break; 
+                case EFeedAttributeFeedId:
+                    {
+                    TLex lex(aAttributeValue);
+                    lex.Val (iFeedId);
+                    break;
+                    }                    
+                case EFeedAttributeAutoUpdateFreq:
+                    {
+                    iAttrProp->SetStringAttribute (aAttribute, aAttributeValue);
+                    break;
+                    }
+                }
+                break;
+            }
+        case EFeedsItem:
+            {
+            switch(aAttribute)
+                {
+                case EItemAttributeTitle:
+                case EItemAttributeLink:
+                case EItemAttributeDescription:
+                case EItemAttributeIdStr:
+                case EItemAttributeEnclosure:
+                case EItemAttributeTimestamp:
+                case EItemAttributeImage:
+                case EItemAttributeAuthor:
+                case EItemAttributeCategory:
+                case EItemAttributeComments:
+                case EItemAttributeSource:
+                    iAttrProp->SetStringAttribute (aAttribute, aAttributeValue);
+                    break;
+
+                case EItemAttributeStatus:
+                    {
+                    TInt itemStatus(EItemStatusUndefined);
+                    if ( aAttributeValue.CompareF (KNew)== 0)
+                        {
+                        itemStatus = EItemStatusNew;
+                        }
+                    else
+                        if ( aAttributeValue.CompareF (KRead)== 0)
+                            {
+                            itemStatus = EItemStatusRead;
+                            }
+                        else
+                            if ( aAttributeValue.CompareF (KUnread)== 0)
+                                {
+                                itemStatus = EItemStatusUnread;
+                                }
+                    iAttrProp->SetIntegerAttribute (aAttribute, itemStatus);
+                    }
+                    break;
+
+                case EItemAttributeItemId:
+                    {
+                    TLex lex(aAttributeValue);
+                    lex.Val (iId);
+                    break;
+                    }
+               }
+               break;        
+            }
+        case EFeedsEnclosure:
+            {
+            switch(aAttribute)
+                {
+                case EEnclosureAttributeContentType:
+                case EEnclosureAttributeSize:
+                case EEnclosureAttributeLink:
+                case EEnclosureAttributeTitle:
+                     iAttrProp->SetStringAttribute (aAttribute, aAttributeValue);
+                     break;
+                }
+                break;
+            }
+        case EMiniItem:
+            {
+            switch(aAttribute)
+                {
+                case EFolderAttributeMiniItemTitle:
+                    iAttrProp->SetStringAttribute (aAttribute, aAttributeValue);
+                    break;
+                case EFolderAttributeMiniItemId: 
+                    {
+                    TLex16  lex(aAttributeValue);
+                    lex.Val(iId);
+                    break;                
+                    }
+                }
+              break;
+            }
+        case EFolder:
+        default:
+            {
+            switch(aAttribute)
+                {
+                case EFolderAttributeUnreadCount:
+                case EFolderAttributeTitle:
+                    iAttrProp->SetStringAttribute (aAttribute, aAttributeValue);
+                    break;
+                }
+              break;                
+            }
+    }
+   }
+   
+
+// -----------------------------------------------------------------------------
+// CFeedsEntity::GetType
+//@return TFeedsEntityType enum
+// Gets type of CFeedsEntity (Where this represents folder/feeds/items/enclosures)
+// -----------------------------------------------------------------------------
+//   
+EXPORT_C TFeedsEntityType CFeedsEntity::GetType() const
+    {
+    return iType;
+    }
+
+// -----------------------------------------------------------------------------
+// CFeedsEntity::GetType
+//
+//Gets ID of feeds entity (This ID is actually unique integer value)
+// -----------------------------------------------------------------------------
+//      
+EXPORT_C TInt CFeedsEntity::GetId() const
+  	{
+  	return iId;
+  	}
+  
+// -----------------------------------------------------------------------------
+// CFeedsEntity::GetParent
+//
+// Returns Parent of this feeds entity (NULL if it is root folder)
+// -----------------------------------------------------------------------------
+//    
+EXPORT_C CFeedsEntity* CFeedsEntity::GetParent() const
+    {
+    return iParent;
+    }
+
+// -----------------------------------------------------------------------------
+// CFeedsEntity::GetChildren
+//
+// Returns RPointerArray containing all children of this CFeedsEntity
+// -----------------------------------------------------------------------------
+// 
+EXPORT_C const RPointerArray<CFeedsEntity>& CFeedsEntity::GetChildren() const
+    {
+    return iChildren;
+    }