browserutilities/feedsengine/FeedsServer/Api/src/FeedsInterface.cpp
changeset 0 dd21522fd290
child 36 0ed94ceaa377
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/feedsengine/FeedsServer/Api/src/FeedsInterface.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,969 @@
+/*
+* 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 "FeedsInterface.h"
+#include "FeedsMap.h"
+#include "Transaction.h"
+#include "FeedAttributes.h"
+#include "FolderAttributes.h"
+#include "Logger.h"
+#include <e32math.h>
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::Constructor
+// 
+// Default constructor should never leave.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C RFeedsInterface::RFeedsInterface(MFeedsApiObserver& aObserver,
+        TInt aFolderListId) :
+    iObserver(aObserver), iRootFolder(NULL), iCurrentFeed(NULL), iFolderListId(aFolderListId), iIsConnected(EFalse)
+    {
+
+    }
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::Connect
+// 
+// Connects to Feed server
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RFeedsInterface::Connect()
+	{
+    TInt retry = 2;
+
+    TInt err;
+
+    for (;;)
+        {
+        // Attempt to create a session with the server.
+        err = CreateSession (KFeedsServerName, Version (), 25);
+
+        // Get the settings.
+        if ( err == KErrNone)
+        	{
+        	iIsConnected = ETrue;
+        	return KErrNone;
+        	}
+
+        // Return general errors.
+        if ( (err != KErrNotFound) && (err != KErrServerTerminated))
+        	{
+        	return err;
+        	}
+
+        // No more retries left.
+        if ( --retry == 0)
+        	{
+        	return err;
+        	}
+
+        // If need be start the server.
+        err = StartServer ();
+
+        // Return if the server failed to start.
+        if ( (err != KErrNone) && (err != KErrAlreadyExists))
+        	{
+        	return err;
+        	}
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::Close
+// 
+// Closes connection with server
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RFeedsInterface::Close()
+    {
+    SendReceive (EFeedsServerDisconnectManualUpdateConnection);
+    SendReceive (EFeedsServerCloseFeedSession);
+    SendReceive (EFeedsServerCompleteWatchSettings);
+    SendReceive (EFeedsServerCompleteWatchFolderList);
+    SendReceive (EFeedsServerCloseFolderSession);
+
+    RSessionBase::Close ();
+
+    delete iRootFolder;
+    iRootFolder = NULL;
+    delete iCurrentFeed;
+    iCurrentFeed = NULL;
+    iActiveTransaction.ResetAndDestroy ();
+    }
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::Version
+// 
+// Returns current version of API
+// -----------------------------------------------------------------------------
+//
+
+EXPORT_C TVersion RFeedsInterface::Version() const
+    {
+    return (TVersion(KFeedsServerMajorVersionNumber, KFeedsServerMinorVersionNumber,
+            KFeedsServerBuildVersionNumber));
+    }
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::SendAsyncCommand
+// 
+// calls SendReceive on current session
+// -----------------------------------------------------------------------------
+//
+
+void RFeedsInterface::SendAsyncCommand(TInt aFunction, const TIpcArgs& aArgs,
+        TRequestStatus& aStatus) const
+        {
+        SendReceive (aFunction, aArgs, aStatus);
+        }
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::RequestHandlerCompleted
+// 
+// Called by transaction when request completes.
+// -----------------------------------------------------------------------------
+//
+
+void RFeedsInterface::RequestHandlerCompleted(CTransaction& aTransaction,
+        TInt aStatus)
+    {
+    TInt pos = KErrNotFound;
+    
+    for (int i = 0; i < iActiveTransaction.Count (); i++)
+        {
+        if ( aTransaction.GetId ()== iActiveTransaction[i]->GetId ())
+            {
+            pos = i;
+            break;
+            }
+        }
+        
+    if ( aStatus != KErrNone && pos != KErrNotFound)
+        {
+        iObserver.RequestCompleted (iActiveTransaction[pos], aStatus == KErrNone ? EFeedsRequestCompleted
+                                    : EFeedsRequestFailed);
+        iActiveTransaction[pos]->AutoDelete();
+        iActiveTransaction.Remove (pos);
+        return;
+        }
+    
+    if ( pos != KErrNotFound)
+        {
+        switch (iActiveTransaction[pos]->Type ())
+        	{
+            case CTransaction::EFetchRootFolderItem:
+                if ( iActiveTransaction[pos]->iTranStatus == KErrNone)
+                    {
+                    if ( iRootFolder != NULL)
+                        {
+                        delete iRootFolder;
+                        iRootFolder = NULL;
+                        }
+                    iRootFolder = iActiveTransaction[pos]->OrphanFeedsEntity ();
+                    // Start watching for changes.
+                    TRAP_IGNORE(WatchFolderListL ());
+                    }
+                break;
+            case CTransaction::EFetchFeed:
+                if ( iActiveTransaction[pos]->iTranStatus == KErrNone)
+                    {
+                    if ( iCurrentFeed != NULL)
+                        {
+                        delete iCurrentFeed;
+                        }
+                    iCurrentFeed = iActiveTransaction[pos]->OrphanFeedsEntity ();
+                    UpdateFeed(iRootFolder, iCurrentFeed);
+                    }
+            	break;
+            case CTransaction::EFetchSettings:
+                   iActiveTransaction[pos]->GetSetting(iSetting);
+                break;
+            case CTransaction::EWatchForChanges:
+                if ( iActiveTransaction[pos]->iTranStatus == KErrNone)
+                    {
+                    TRAP_IGNORE(GetRootFolderL());
+                    iActiveTransaction[pos]->AutoDelete();
+                    iActiveTransaction.Remove (pos);
+                    return;
+                    }
+                break;
+            // no need to notify observer now, server will notify us later
+            // assuming FetchRootFolder or WatchFolderList has been called before
+            case CTransaction::EAddFolderItem:
+            case CTransaction::EDeleteFolderItem:
+            case CTransaction::EChangeFolderItem:
+            case CTransaction::EMoveFolderItem:
+            case CTransaction::EMoveFolderItemTo:
+            case CTransaction::EUpdateFolderItem:
+                iActiveTransaction[pos]->AutoDelete();
+                iActiveTransaction.Remove (pos);
+                return;
+            
+            case CTransaction::EImportOPML:
+            case CTransaction::EExportOPML:
+                break;
+
+            // feed related
+            case CTransaction::EUpdateItemStatus:
+                
+            // general client related
+            case CTransaction::EChangeSettings:
+                break;
+                
+            case CTransaction::EWatchForSettingChanges:
+                if ( iActiveTransaction[pos]->iTranStatus == KErrNone)
+                    {
+                    TRAP_IGNORE( 
+                        {
+                        CTransaction* trans = GetTransactionL();
+                        CleanupStack::PushL(trans);
+                        trans->FetchServerSettingsL();
+                        iActiveTransaction.AppendL(trans);
+                        CleanupStack::Pop(trans);
+                        });
+                    iActiveTransaction[pos]->AutoDelete();
+                    iActiveTransaction.Remove (pos);
+                    return;
+                    }
+                break;
+                
+            case CTransaction::ECancelAll:
+            case CTransaction::EDisconnectManualUpdateConnection:
+                return;
+
+        	}
+        iObserver.RequestCompleted (iActiveTransaction[pos],
+                    aStatus == KErrNone ? EFeedsRequestCompleted
+                                    : EFeedsRequestFailed);
+        iActiveTransaction[pos]->AutoDelete();
+        iActiveTransaction.Remove (pos);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::UpdateFeed
+// 
+// Updates timestamp/unreadcount in correponding on in rootfolder.
+// -----------------------------------------------------------------------------
+//
+
+TBool RFeedsInterface::UpdateFeed(CFeedsEntity* aRootFolder, CFeedsEntity* aFeed)
+	{
+    if ( aRootFolder == NULL || aFeed == NULL)
+         return EFalse;
+    if ( aRootFolder->GetType ()== EFeed && aFeed->iFeedId == aRootFolder->iFeedId)
+        {
+        TTime time;
+        time.HomeTime ();
+        aFeed->GetTimeValue (EFeedAttributeTimestamp, time);
+        aRootFolder->iAttrProp->SetTimeAttribute (EFeedAttributeTimestamp, time);
+        TInt unreadCount = 0;
+        TInt status;
+        for (TInt i=0; i<aFeed->GetChildren().Count ();i++)
+            {
+            CFeedsEntity* item = aFeed->GetChildren()[i];
+            item->GetIntegerValue (EItemAttributeStatus, status);
+            if ( status != EItemStatusRead)
+                {
+                unreadCount++;
+                }
+            }
+        aRootFolder->iAttrProp->SetIntegerAttribute (
+            EFolderAttributeUnreadCount, unreadCount);
+        return ETrue;
+        }
+    if ( aRootFolder->GetType ()== EFolder)
+        {
+        for (TInt i =0; i<aRootFolder->GetChildren().Count ();i++)
+            {
+            if ( UpdateFeed (aRootFolder->GetChildren()[i], aFeed))
+                {
+                return ETrue;
+                }
+            }
+        }
+    return EFalse;
+	}
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::CancelAllCommandsL
+// 
+// Cancel commands
+// -----------------------------------------------------------------------------
+//
+void RFeedsInterface::CancelAllCommandsL()
+    {
+    CTransaction* trans = GetTransactionL ();
+    CleanupStack::PushL (trans);
+
+    trans->CancelAllL();
+    iActiveTransaction.AppendL (trans);
+    CleanupStack::Pop (trans);
+    }
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::GetRootFolder
+// 
+// Fetches root folder
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RFeedsInterface::GetRootFolderL()
+    {
+    CTransaction* trans = GetTransactionL ();
+    CleanupStack::PushL (trans);
+
+    trans->FetchFolderItemL (EFalse);
+    iActiveTransaction.AppendL (trans);
+    CleanupStack::Pop (trans);
+    return trans->GetId();
+    }
+// -----------------------------------------------------------------------------
+// RFeedsInterface::Add
+// 
+// Adds new feed/folder into list
+// -----------------------------------------------------------------------------
+//
+
+EXPORT_C void RFeedsInterface::AddL(TFeedsEntityType aType, const CFeedsMap& aArgs,
+        const CFeedsEntity& aParent)
+    {
+    TPtrC title;
+    TPtrC url;
+    TInt freq;
+    aArgs.GetStringAttribute(EFeedAttributeTitle,title);
+    aArgs.GetStringAttribute(EFeedAttributeLink,url);
+    if (aArgs.GetIntegerAttribute(EFeedAttributeAutoUpdateFreq,freq) == KErrNotFound)
+        {
+        freq = 0;
+        }
+
+    CTransaction* trans = GetTransactionL ();
+    CleanupStack::PushL (trans);
+
+    trans->AddFolderItemL (title, url, aType==EFolder, aParent, freq);
+    iActiveTransaction.AppendL (trans);
+    CleanupStack::Pop (trans);
+    }
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::SetAttributeL
+// 
+// Changes various feed/folder/item attribute on server side.
+// -----------------------------------------------------------------------------
+//
+
+EXPORT_C TInt RFeedsInterface::SetAttributeL(const CFeedsEntity& aFeedEntity,
+        const CFeedsMap& aNewValues)
+    {
+    TPtrC title;
+    TPtrC url;
+    TInt freq = 0;
+    TFeedItemStatus readStatus;
+    TInt unreadCount = 0;
+    CFeedsEntity* parent = NULL;
+
+    switch (aFeedEntity.GetType())
+        {
+        case EFeed:
+            if( aNewValues.IsExist( EFeedAttributeTitle) )
+                {
+                aNewValues.GetStringAttribute ( EFeedAttributeTitle, title);                       
+                }
+                else
+                {
+                aFeedEntity.iAttrProp->GetStringAttribute( EFeedAttributeTitle, title);
+                }
+            if( aNewValues.IsExist ( EFeedAttributeLink) )     
+                {
+                aNewValues.GetStringAttribute ( EFeedAttributeLink, url);    
+                }
+            else
+                {
+                aFeedEntity.iAttrProp->GetStringAttribute( EFeedAttributeLink, url);    
+                }    
+            if( aNewValues.IsExist( EFeedAttributeAutoUpdateFreq))
+                {
+                aNewValues.GetIntegerAttribute( EFeedAttributeAutoUpdateFreq, freq);    
+                }
+            else
+                {
+                if ( KErrNotFound == aFeedEntity.iAttrProp->GetIntegerAttribute( EFeedAttributeAutoUpdateFreq, freq))
+                    {
+                    freq = 0;
+                    }
+                }
+            break;	
+
+        case EFolder:
+            if ( aNewValues.IsExist (EFeedAttributeTitle))
+                {
+                aNewValues.GetStringAttribute (EFeedAttributeTitle, title);
+                }
+            else
+                {
+                return KErrArgument;
+                }
+            break;
+
+        case EFeedsItem:
+
+            if ( aNewValues.IsExist (EItemAttributeStatus))
+                {
+                TInt status;
+                aNewValues.GetIntegerAttribute (EItemAttributeStatus, status);
+                readStatus = (TFeedItemStatus)status;
+                }
+            else
+                {
+                return KErrArgument;
+                }
+            break;
+
+        case EFeedsEnclosure:
+            //return KErrArgument;
+            break;
+        }
+    CTransaction* trans = GetTransactionL ();
+    CleanupStack::PushL (trans);
+
+    switch (aFeedEntity.GetType ())
+        {
+        case EFeed:
+            trans->ChangeFolderItemL (aFeedEntity, title, url, freq);
+            break;
+
+        case EFolder:
+            trans->ChangeFolderItemL (aFeedEntity, title, url, freq);
+            break;
+
+        case EFeedsItem:
+            {
+            parent = SearchFeed (aFeedEntity.GetParent()->iFeedId, iRootFolder);
+            RArray<TInt> itemIds;
+            RArray<TFeedItemStatus> status;
+            TInt oldStatus;
+            if ( aFeedEntity.iAttrProp->GetIntegerAttribute (
+                    EItemAttributeStatus, oldStatus)== KErrNotFound)
+                {
+                oldStatus = (TInt)EItemStatusUndefined;
+                }
+
+            if ( parent != NULL && parent->iAttrProp->GetIntegerAttribute (
+                    EFolderAttributeUnreadCount, unreadCount)!= KErrNotFound)
+                {
+                }
+
+            if ( oldStatus != (TInt) readStatus)
+                {
+                if ( (oldStatus == EItemStatusNew || oldStatus == EItemStatusUnread) && readStatus == EItemStatusRead)
+                    {
+                    unreadCount--;
+                    }
+                else
+                	if ( oldStatus == EItemStatusRead && (readStatus == EItemStatusNew || readStatus == EItemStatusUnread))
+                        {
+                        unreadCount++;
+                        }
+                }
+            itemIds.Append (aFeedEntity.GetId ());
+            status.Append (readStatus);
+
+            trans->UpdateItemStatusL (aFeedEntity.GetParent()->iFeedId, itemIds, status, unreadCount);
+
+            }
+            break;
+
+        case EFeedsEnclosure:
+        	break;
+        }
+    iActiveTransaction.AppendL (trans);
+    if ( aFeedEntity.GetType ()== EFeedsItem)
+        {
+        aFeedEntity.iAttrProp->SetIntegerAttribute (EItemAttributeStatus,
+                readStatus);
+        if ( parent != NULL)
+            parent->iAttrProp->SetIntegerAttribute (
+                EFolderAttributeUnreadCount, unreadCount);
+        }
+
+    CleanupStack::Pop (trans);
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::SearchFeed
+// 
+// Searches feed with given id ,in list.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CFeedsEntity* RFeedsInterface::SearchFeed(TInt aFeedId, CFeedsEntity* aSearch)
+    {
+
+    if ((aSearch->GetType ()== EFeed) && (aSearch->iFeedId == aFeedId))
+        {
+        return aSearch;
+        }
+    if ( aSearch->GetType ()== EFolder)
+        {
+        const RPointerArray<CFeedsEntity>& children = aSearch->GetChildren();
+        TInt count = children.Count();
+        CFeedsEntity* child = NULL;
+        CFeedsEntity *foundFeed = NULL;
+        for (TInt i=0; i<count;i++)
+            {
+            child = children[i];
+            foundFeed = SearchFeed (aFeedId, child);
+            if(foundFeed)
+                {
+                return foundFeed;
+                }		
+            }
+        }
+    return NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::Delete
+// 
+// Delete feeds/folder
+// -----------------------------------------------------------------------------
+//
+
+EXPORT_C void RFeedsInterface::DeleteL(const RPointerArray<const CFeedsEntity> aFeedsEntities)
+    {
+    CTransaction* trans = GetTransactionL();
+    CleanupStack::PushL(trans);
+
+    trans->DeleteFolderItemL(aFeedsEntities);
+    iActiveTransaction.AppendL(trans);
+    CleanupStack::Pop(trans);
+    }
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::DebugPrintTablesL
+//
+// Print tables of database.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RFeedsInterface::DebugPrintTablesL()
+    {
+    CTransaction* trans = GetTransactionL();
+    CleanupStack::PushL(trans);
+
+    trans->DebugPrintTables();
+    iActiveTransaction.AppendL(trans);
+    CleanupStack::Pop(trans);
+    }
+	
+// -----------------------------------------------------------------------------
+// RFeedsInterface::DisconnectManualUpdateConnectionL
+//
+// Disconnect connection provided by client for manual update.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RFeedsInterface::DisconnectManualUpdateConnectionL()
+    {
+    CTransaction* trans = GetTransactionL();
+    CleanupStack::PushL(trans);
+
+    trans->DisconnectManualUpdateConnection();
+    iActiveTransaction.AppendL(trans);
+    CleanupStack::Pop(trans);
+    }
+	
+	
+// -----------------------------------------------------------------------------
+// RFeedsInterface::Fetch
+// 
+// Fetch feed from server (May involve updation of feed)
+// -----------------------------------------------------------------------------
+//
+
+EXPORT_C TInt RFeedsInterface::FetchL(const CFeedsEntity& aEntity, TBool aForceUpdate, TBool aNoCache)
+    {
+    CTransaction* trans = GetTransactionL();
+    CleanupStack::PushL(trans);
+
+    trans->FetchFeedL(aEntity.iFeedId, aForceUpdate, aNoCache);
+    iActiveTransaction.AppendL(trans);
+    CleanupStack::Pop(trans);
+    return trans->GetId();
+    }
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::Fetch
+// 
+// Fetch feed from server (May involve updation of feed)
+// -----------------------------------------------------------------------------
+//
+
+EXPORT_C TInt RFeedsInterface::FetchL(const TDesC& aUrl, TBool aForceUpdate, TBool aNoCache)
+    {
+    CTransaction* trans = GetTransactionL();
+    CleanupStack::PushL(trans);
+
+    trans->FetchFeedL(aUrl, aForceUpdate, aNoCache);
+    iActiveTransaction.AppendL(trans);
+    CleanupStack::Pop(trans);
+    return trans->GetId();
+    }
+	
+// -----------------------------------------------------------------------------
+// RFeedsInterface::Update
+// 
+// Update feeds/Folder
+// -----------------------------------------------------------------------------
+//
+
+EXPORT_C TInt RFeedsInterface::UpdateL(const RPointerArray<const CFeedsEntity>& aFeedsArray)
+    {
+    CTransaction* trans = GetTransactionL();
+    CleanupStack::PushL(trans);
+    if(aFeedsArray.Count() == 1 && aFeedsArray[0]->GetId() == 0)
+        {
+        trans->UpdateFolderItemsL();
+        }
+    else
+        {
+        trans->UpdateFolderItemsL(aFeedsArray );
+        }
+
+    iActiveTransaction.AppendL(trans);
+    CleanupStack::Pop(trans);
+    return trans->GetId();
+    }
+
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::GetSettings
+// 
+// Fetches Settings from server
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RFeedsInterface::GetSettingsL(TFeedsServerSetting& aFeedsSetting, TBool aAsync/*=ETrue*/)
+    {
+
+    CTransaction* trans = GetTransactionL();
+    CleanupStack::PushL(trans);
+    if(aAsync)
+        {
+        trans->FetchServerSettingsL();
+        iActiveTransaction.AppendL(trans);
+        }
+    else
+        {
+        trans->FetchServerSettingsSyncL();
+        iSetting = trans->Settings();
+        trans->AutoDelete();
+        aFeedsSetting = iSetting;
+        }
+    CleanupStack::Pop(trans);
+    return KErrNone;
+    }
+	
+// -----------------------------------------------------------------------------
+// RFeedsInterface::SetSettings
+// 
+// Changes settings
+// -----------------------------------------------------------------------------
+//
+
+EXPORT_C void RFeedsInterface::SetSettingsL(const TFeedsServerSetting& aFeedsSetting)
+    {
+    CTransaction* trans = GetTransactionL();
+    CleanupStack::PushL(trans);
+
+    trans->ChangeServerSettingsL( aFeedsSetting );
+    iActiveTransaction.AppendL(trans);
+    CleanupStack::Pop(trans);
+    }
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::WatchSettings
+// 
+// Sets up a notifier to execute when the settings change.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RFeedsInterface::WatchSettingsL()
+    {
+    CTransaction* trans = GetTransactionL();
+    CleanupStack::PushL(trans);
+
+    trans->WatchSettingsL();
+    iActiveTransaction.AppendL(trans);
+    CleanupStack::Pop(trans);
+    }
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::ExportFolders
+// 
+// Exports list of folders in form of OPML file
+// -----------------------------------------------------------------------------
+//
+
+EXPORT_C void RFeedsInterface::ExportFoldersL(const RPointerArray<const CFeedsEntity>& aFeedsArray,const TDesC& aFileName)
+    {
+    CTransaction* trans = GetTransactionL();
+    CleanupStack::PushL(trans);
+
+    trans->ExportFolderItemL( aFeedsArray,aFileName);
+    iActiveTransaction.AppendL(trans);
+    CleanupStack::Pop(trans);
+    }
+    
+// -----------------------------------------------------------------------------
+// RFeedsInterface::ImportOPML
+// 
+// Imports OPML
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RFeedsInterface::ImportOPMLL(const TDesC& aFileName)
+    {
+    CTransaction* trans = GetTransactionL();
+    CleanupStack::PushL(trans);
+
+    trans->ImportOPMLL( aFileName ,EFalse);
+    iActiveTransaction.AppendL(trans);
+    CleanupStack::Pop(trans);
+    }
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::CancelAll
+// 
+// Cancels all pending requests
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RFeedsInterface::CancelAllL()
+    {
+    CTransaction* trans = GetTransactionL();
+    CleanupStack::PushL(trans);
+
+    trans->CancelAllL();
+    iActiveTransaction.AppendL(trans);
+    CleanupStack::Pop(trans);
+    }
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::Move
+// 
+// Move folder/feed to specific index.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RFeedsInterface::MoveL(const RPointerArray<const CFeedsEntity>& aFolderItems,TInt aIndex)
+    {
+    CTransaction* trans = GetTransactionL();
+    CleanupStack::PushL(trans);
+
+    trans->MoveFolderItemsL( aFolderItems,aIndex);
+    iActiveTransaction.AppendL(trans);
+    CleanupStack::Pop(trans);
+    }
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::MoveToFolder
+// 
+// Move feeds/folders to diff folder.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RFeedsInterface::MoveToFolderL(const RPointerArray<const CFeedsEntity>& aSourceFolders,const CFeedsEntity& aDestinationFolder)
+    {
+    CTransaction* trans = GetTransactionL();
+    CleanupStack::PushL(trans);
+
+    trans->MoveFolderItemsToL( aSourceFolders,aDestinationFolder);
+    iActiveTransaction.AppendL(trans);
+    CleanupStack::Pop(trans);
+    }
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::WatchFolderListL
+// 
+// Sets up notifier for changes happen on server side.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RFeedsInterface::WatchFolderListL()
+    {
+    for (int i=0; i<iActiveTransaction.Count ();i++)
+        {
+        if ( iActiveTransaction[i]->Type ()== CTransaction::EWatchForChanges)
+            {
+            return;
+            }
+        }
+
+    CTransaction* trans = GetTransactionL();
+    CleanupStack::PushL (trans);
+
+    trans->WatchFolderListL ();
+    iActiveTransaction.AppendL (trans);
+    CleanupStack::Pop (trans);
+    }
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::GetTransactionL
+// 
+// Factory function to return transaction with unique ID
+// -----------------------------------------------------------------------------
+//
+CTransaction* RFeedsInterface::GetTransactionL()
+    {
+    TBool found = EFalse;
+    TInt transId;
+    do
+        {
+        found = EFalse;
+        transId = Math::Random ();
+        for (int i=0; i<iActiveTransaction.Count ();i++)
+            {
+            if ( iActiveTransaction[i]->GetId ()== transId)
+                {
+                found = ETrue;
+                break;
+                }
+            }
+        }
+    while (found);
+    CTransaction* trans = CTransaction::NewL (*this, transId, iFolderListId);
+    trans->SetFeedInterface (this);
+    return trans;
+    }
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::StartServer
+// 
+// Create the server thread/process
+// -----------------------------------------------------------------------------
+//
+TInt RFeedsInterface::StartServer()
+    {
+    RProcess server;
+
+    // EPOC is easy, just create a new server process. Simultaneous
+    // launching of two such processes is detected when the second one
+    // attempts to create the server object, failing with KErrAlreadyExists.
+    TInt r = server.Create (KFeedsServerName, KNullDesC);
+    if ( r != KErrNone)
+        {
+        return r;
+        }
+
+    TRequestStatus stat;
+    server.Rendezvous (stat);
+
+    // An unrecoverable error occurred.
+    if ( stat != KRequestPending)
+        {
+        server.Kill (0);
+        }
+
+    // Logon OK, start the server.
+    else
+        {
+        server.Resume ();
+        }
+
+    // Wait for start or death.
+    User::WaitForRequest (stat);
+
+    // The 'exit reason' can't be used if the server panicked as this
+    // is the panic 'reason' and may be '0' which cannot be distinguished
+    // from KErrNone
+    r = (server.ExitType() == EExitPanic) ? KErrGeneral : stat.Int ();
+
+    // Close the server.
+    server.Close ();
+
+    return r;
+    }
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::RootFolder
+// 
+// Returns RootFolder
+// -----------------------------------------------------------------------------
+//
+
+EXPORT_C CFeedsEntity* RFeedsInterface::RootFolder()
+    {
+    return iRootFolder;
+    }
+// -----------------------------------------------------------------------------
+// RFeedsInterface::Feed
+// 
+// Return currently fetched feed
+// -----------------------------------------------------------------------------
+//
+
+EXPORT_C CFeedsEntity* RFeedsInterface::Feed()
+    {
+    return iCurrentFeed;
+    }
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::UpdateFeedItemStatusL
+// Updates the feed item's status
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void RFeedsInterface::UpdateFeedItemStatusL(const RArray<TInt>& aItemIds,
+        const RArray<TFeedItemStatus>& aItemStatus, TInt aUnreadCount)
+    {
+    CTransaction* trans = GetTransactionL();
+    CleanupStack::PushL(trans);
+
+    trans->UpdateItemStatusL( iCurrentFeed->iFeedId, aItemIds, aItemStatus, aUnreadCount);
+    iActiveTransaction.AppendL(trans);
+    CleanupStack::Pop(trans);
+
+    }
+
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::NetworkConnectionNeededL()
+// -----------------------------------------------------------------------------
+//
+void RFeedsInterface::NetworkConnectionNeededL( TInt* aConnectionPtr,
+        TInt& aSockSvrHandle, TBool& aNewConn, TApBearerType& aBearerType)
+    {
+    iObserver.NetworkConnectionNeededL ( aConnectionPtr, aSockSvrHandle,
+            aNewConn, aBearerType);
+    }
+	
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::SendReceiveSync
+// 
+// calls synchronous SendReceive on current session
+// -----------------------------------------------------------------------------
+//
+
+TInt RFeedsInterface::SendReceiveSync(TInt aFunction, const TIpcArgs& aArgs) const
+    {
+    return (SendReceive(aFunction, aArgs));
+    }
+
+// -----------------------------------------------------------------------------
+// RFeedsInterface::Settings
+// 
+// return current settings.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TFeedsServerSetting RFeedsInterface::Settings()
+    {
+    return iSetting;
+    }