browserutilities/feedsengine/FeedsServer/Server/inc/FeedsServerSession.h
changeset 0 dd21522fd290
child 16 a359256acfc6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/feedsengine/FeedsServer/Server/inc/FeedsServerSession.h	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,528 @@
+/*
+* 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:  Represent a session on server side.
+*
+*/
+
+
+#ifndef FEEDS_SERVER_SESSION_H
+#define FEEDS_SERVER_SESSION_H
+
+// INCLUDES
+#include <e32base.h>
+
+#include "LeakTracker.h"
+#include "UpdateFeedTask.h"
+#include "UpdateAllFeedsTask.h"
+#include "ImportFeedsTask.h"
+#include "PackedFolder.h"
+
+// CONSTANTS
+// Fixed for Bug id - JJUN-78VES7 (FeedsServer crashes under IPC attack)
+#define KMaxTitleLength 256
+// MACROS
+
+// DATA TYPES
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// CLASS DECLARATION
+class CFeedsServer;
+class CPacked;
+class CPackedFeed;
+class CPackedFolder;
+class CSessionHttpConnection;
+
+
+/**
+*  Represents a session on server side.
+*
+*  \b Library: FeedsEngine.lib
+*
+*  @since 3.1
+*/
+NONSHARABLE_CLASS(CFeedsServerSession): public CSession2, public MUpdateFeedTaskObserver,
+        public MUpdateAllFeedsTaskObserver, public MImportFeedsTaskObserver
+    {
+    public:  // Constructors and destructor
+
+        /**
+        * Constructor.
+        */
+        static CFeedsServerSession* NewL(CFeedsServer& aFeedsServer);
+
+        /**
+        * Destructor.
+        */
+        ~CFeedsServerSession();
+
+
+    private: // From CSession2
+        /**
+        * Client-server framework calls this function to handle messages 
+        * from client.  This calls DispatchMessageL under the trap harness 
+        * in order to propagate any errors back to the client (via 
+        * RMessage2::Complete) rather than leaving.
+        *
+        * @since 3.1
+        * @param aMessage A received message.
+        * @return Void.
+        */
+        virtual void ServiceL(const RMessage2& aMessage);
+
+
+    public:  // From MUpdateFeedTaskObserver
+        /**
+        * Notifies the observer that the task is about to start a lengthy 
+        * operation.  In response the observer could display somekind of 
+        * status indicator.
+        *
+        * @since 3.0
+        * @return void.
+        */
+        virtual void StartWait();
+
+        /**
+        * Called upon completion of the task.
+        *
+        * @since 3.0
+        * @param aPackedFeed The resulting feed.  aPackedFeed is adopted by the 
+        *                    implementing class.
+        * @param aFeedUrl The feed's url.
+        * @param aStatusCode The completion status of the request.
+        * @return Void
+        */
+        virtual void Completed(CPackedFeed* aPackedFeed, const TDesC& aFeedUrl, TInt aFeedId, TInt aStatusCode);
+
+
+    public:  // From MUpdateAllFeedsTaskObserver
+        /**
+        * Called to notify the obsever how many feeds remain to be updated.
+        *
+        * @since 3.1
+        * @param aStatusCode The completion status of the request.
+        * @return Void
+        */
+        virtual void UpdateAllFeedsProgress(TInt aMaxCount, TInt aRemaining);
+
+        /**
+        * Called upon completion of the task.
+        *
+        * @since 3.1
+        * @param aStatusCode The completion status of the request.
+        * @return Void
+        */
+        virtual void UpdateAllFeedsCompleted(TInt aStatusCode);
+
+        /**
+        * Returns the server's http-connection instance;
+        *
+        * @since 3.1
+        * @return The database.
+        */
+        inline virtual CHttpConnection& HttpConnection() {return (CHttpConnection&) *iHttpConnection;}
+        
+    public:  // From MImportFeedsTaskObserver
+        /**
+        * Called to notify the obsever to indicate the start of OPML import
+        *
+        * @since 3.2
+        * @return Void
+        */    
+        virtual void StartImportWait();
+
+        /**
+        * Called to notify the obsever to indicate the completion OPML import
+        *
+        * @since 3.2
+        * @param aStatusCode The completion status of the request.
+        * @return Void
+        */    
+        virtual void ImportCompleted(TInt aStatusCode);
+
+    public:  // New methods
+        /**
+        * 
+        *
+        * @since 3.1
+        * @param aMessage The message to write to.
+        * @return void.
+        */
+        void NetworkConnectionNeededL();
+
+
+    private:  // New methods
+        /**
+        * C++ default constructor.
+        */
+        CFeedsServerSession(CFeedsServer& aFeedsServer);
+
+        /**
+        * By default Symbian 2nd phase constructor is private.
+        */
+        void ConstructL();
+
+        /**
+        * Handle messages from the client.
+        *
+        * @since 3.1
+        * @param aMessage A received message.
+        * @return Void.
+        */
+        void DispatchMessageL(const RMessage2& aMessage);
+
+        /**
+        * Returns the root folder item -- fetching it if need be.
+        *
+        * @since 3.1
+        * @param aMessage A received message.
+        * @return void.
+        */
+        void GetRootFolderL(const RMessage2& aMessage);
+   
+        /**
+        * Returns the requested feed -- fetching it if need be.
+        *
+        * @since 3.1
+        * @param aMessage A received message.
+        * @return void.
+        */
+        void GetFeedL(const RMessage2& aMessage);
+   
+        /**
+        * Cancel all activities that can be cancelled.
+        *
+        * @since 3.1
+        * @param aMessage A received message.
+        * @return void.
+        */
+        void CancelAllRequestsL(const RMessage2& aMessage);
+   
+        /**
+        * Cancel all feed related activities that can be cancelled.
+        *
+        * @since 3.1
+        * @return void.
+        */
+        void CancelFeedRequestsL();
+   
+        /**
+        * Cancel all folder related activities that can be cancelled.
+        *
+        * @since 3.1
+        * @return void.
+        */
+        void CancelFolderRequestsL();
+   
+        /**
+        * Updates the given feed's item status.
+        *
+        * @since 3.1
+        * @param aMessage A received message.
+        * @return void.
+        */
+        void ChangeFeedItemStatusL(const RMessage2& aMessage);
+   
+        /**
+        * Updates the database to reflect the addition of the folder item.
+        * A update root folder item is sent out to all active
+        * folder item sessions.
+        *
+        * @since 3.1
+        * @param aMessage A received message.
+        * @return void.
+        */
+        void AddFolderItemL(const RMessage2& aMessage);
+   
+        /**
+        * Updates the database to reflect the edited folder item.
+        * A update root folder item is sent out to all active
+        * folder item sessions.
+        *
+        * @since 3.1
+        * @param aMessage A received message.
+        * @return void.
+        */
+        void ChangeFolderItemL(const RMessage2& aMessage);
+   
+        /**
+        * Updates the database to reflect the deletion of the folder item.
+        * A update root folder item is sent out to all active
+        * folder item sessions.
+        *
+        * @since 3.1
+        * @param aMessage A received message.
+        * @return void.
+        */
+        void DeleteFolderItemsL(const RMessage2& aMessage);
+   
+        /**
+        * Updates the database to reflect the moved folder items.
+        * A update root folder item is sent out to all active
+        * folder item sessions.
+        *
+        * @since 3.1
+        * @param aMessage A received message.
+        * @return void.
+        */
+        void MoveFolderItemsL(const RMessage2& aMessage);
+   
+        /**
+        * Updates the database to reflect the new parentage of the 
+        * folder items.  A update root folder item is sent out to 
+        * all active folder item sessions.
+        *
+        * @since 3.1
+        * @param aMessage A received message.
+        * @return void.
+        */
+        void MoveFolderItemsToL(const RMessage2& aMessage);
+   
+        /**
+        * Update the given folder items or all feeds associated with the folder list id.
+        *
+        * @since 3.1
+        * @param aMessage A received message.
+        * @return void.
+        */
+        void UpdateFolderItemsL(const RMessage2& aMessage);
+
+        /**
+        * Returns the settings.
+        *
+        * @since 3.1
+        * @param aMessage A received message.
+        * @return void.
+        */
+        void GetSettingsL(const RMessage2& aMessage);
+   
+        /**
+        * Updates the database to reflect the new settings.
+        * A update settings is sent out to all active
+        * server sessions.
+        *
+        * @since 3.1
+        * @param aMessage A received message.
+        * @return void.
+        */
+        void ChangeSettingsL(const RMessage2& aMessage);      
+
+        /**
+        * Sets up a notifier to execute when the settings changes.
+        *
+        * @since 3.2
+        * @param aMessage A received message.
+        * @return void.
+        */
+        void WatchSettingsL(const RMessage2& aMessage);
+   
+        /**
+        * Disconnect the session http connection provided by client app.
+        *
+        * @since 3.1
+        * @return void.
+        */
+        void DisconnectManualUpdateConnection(const RMessage2& aMessage);      
+
+        /**
+        * Sets up a notifier to execute when the folder list changes.
+        *
+        * @since 3.1
+        * @param aMessage A received message.
+        * @return void.
+        */
+        void WatchFolderListL(const RMessage2& aMessage);
+
+        /**
+        * Notify the session that the given folder-list changed.
+        *
+        * @since 3.1
+        * @return void.
+        */
+        void NotifyFolderListChanged(TInt aFolderListId);
+
+        /**
+        * Notify the session that the settings of given folder-list changed.
+        *
+        * @since 3.2
+        * @return void.
+        */
+        void NotifySettingsChanged(TInt aFolderListId);
+
+        /**
+        * Called upon completion of the task -- helper method for Completed.
+        *
+        * @since 3.1
+        * @param aPackedFeed The resulting feed.  Adopted by this method.
+        * @param aFeedUrl The feed's url.
+        * @param aStatusCode The completion status of the request.
+        * @return Void
+        */
+        void CompletedHelperL(CPackedFeed*& aPackedFeed, const TDesC& aFeedUrl,TInt aFeedId);
+
+        /**
+        * Send the next chunk of the token-array to the client.
+        *
+        * @since 3.1
+        * @param aPacked The source of the payload to send.
+        * @param aMessage The message to write to.
+        * @return void.
+        */
+        void SendTokenChunkL(CPacked& aPacked, const RMessagePtr2& aMessage);
+
+        /**
+        * Send the next chunk of the string-table to the client.
+        *
+        * @since 3.1
+        * @param aPacked The source of the payload to send.
+        * @param aMessage The message to write to.
+        * @return void.
+        */
+        void SendStringTableChunkL(CPacked& aPacked, const RMessage2& aMessage);
+
+        /**
+        * Set the connection to use.
+        *
+        * @since 3.1
+        * @param aMessage The message to write to.
+        * @return void.
+        */
+        void SetConnectionL(const RMessage2& aMessage);
+   
+        /**
+        * Import OPML file passed from the client.
+        *
+        * @since 3.2
+        * @param aMessage The message passed by client
+        * @return void.
+        */
+        void ImportOPMLL( const RMessage2& aMessage );      
+        
+        /**
+        * Import OPML file passed from the client asyncronously.
+        *
+        * @since 3.2
+        * @param aMessage The message passed by client
+        * @return void.
+        */
+		void ImportOPMLAsyncL( const RMessage2& aMessage );
+
+        /**
+        * Export feeds as an OPML file passed from the client.
+        *
+        * @since 3.2
+        * @return void.
+        */
+        void ExportOPMLL( const RMessage2& aMessage );      
+
+        /**
+        * Completes any pending (asynchronous) message from the client
+        * with the specified error code.
+        */
+        void CompleteClientPendingMessage( TInt aCompletionCode = KErrNone );
+        
+        /**
+        * Set up an asynchronous message from the client so that we can
+        * complete it at a later date.
+        */
+        void SetClientPendingMessage( RMessagePtr2 aMessage );
+        
+        /**
+        * Extracts the message sent by the client
+        *
+        * @since 3.2
+        * @return void.
+        */
+        void ExtractClientImportMessageL();
+
+        /**
+        * Callback function for calling SendTokenChunkL from CompletedHelperL() function
+        * This ensures if GetFeedL call was cancelled then no data should be sent to client.
+        *
+        * @since ?
+        * @ param aPtr Pointer to CFeedServerSession class
+        * @return Integer
+        */
+        static TInt LazyCallBack(TAny* aPtr);
+
+        /**
+        * Called upon completion of the task.
+        *
+        * @since 7.1
+        * @param aStatusCode The completion status of the request.
+        * @return Void
+        */
+        void UpdateAllFeedsCompletedL(TInt aStatusCode);
+
+
+    private:  // Friends
+        friend class CFeedsServer;
+        
+    
+    private:   
+        TLeakTracker           iLeakTracker;
+        
+        CFeedsServer&                 iFeedsServer;
+        CSessionHttpConnection*       iHttpConnection;
+        
+        CUpdateAllFeedsTask*  iUpdateAllFeedsTask;
+        TInt                  iUpdateAllFolderListId;
+        TInt                  iFolderListId;
+        CUpdateFeedTask*      iUpdateFeedTask;
+        RMessagePtr2          iPendingMessage;
+        
+        // TODO: These variables aren't safe to use if multiple requests
+        //       are being made in the same RFeedsServer session.  This would be 
+        //       an issue if the client had two active RFeeds or two active 
+        //       RFolderItems or even one active RFeed and one active RFolderItem 
+        //       (which may happen if a client is fetching a feed and a different 
+        //       client changes their shared folder list).
+        CPackedFeed*          iPackedFeed;
+        TBool                 iStoreFeeds;
+        
+        CPackedFolder*        iPackedFolder;
+
+        TInt                  iWatchFolderListId;
+        RMessage2             iWatchFolderListMessage;
+        RMessagePtr2          iWatchSettingsMessage;
+        
+        // iResponseTokensSent and iResponseOffset are used by GetFeed and GetRootFolder
+        // There may be multiple GetFeed or GetRootFolder request coming from client for one feed or
+        // folder list request,These two variable keep track of what part of CPacked should be sent
+        // to the client.
+        // for GetRootFolder iCurrentRequest = 0
+        // for GetFeed       iCurrentRequest = 1;
+        TInt                  iCurrentRequest;
+        TBool                 iResponseTokensSent[2]; 
+        TInt                  iResponseOffset[2];     
+        
+        CImportFeedsTask*     iOPMLImportTask;
+        
+        TInt 					iCurrOp;
+        TInt 					iPrevOp;
+        HBufC*				  iExportOPMLFileName;
+        CIdle*				  iLazyCaller; //To call SetTokenChunkL function;
+        TInt				  iPendingStatus;
+        TInt				  iPendingMessageHandle;
+        TBool				  iGetFeedCalled; 
+        
+        
+    };
+
+
+#endif      // FEEDS_SERVER_SESSION_H
+
+// End of File