diff -r 000000000000 -r dd21522fd290 browserutilities/feedsengine/FeedsServer/Server/inc/FeedsServerSession.h --- /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 + +#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