videofeeds/server/IptvSearchManager/inc/CIptvSearchManager.h
changeset 0 96612d01cf9f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videofeeds/server/IptvSearchManager/inc/CIptvSearchManager.h	Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,594 @@
+/*
+* Copyright (c) 2007 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: 
+*
+*/
+
+
+
+
+#ifndef CIPTVSEARCHMANAGER_H
+#define CIPTVSEARCHMANAGER_H
+
+// System includes
+#include <e32base.h>
+#include "MIptvEpgVodCallback.h"
+#include "MIptvEpgManagerUpdateObserver.h"
+#include "CIptvUtil.h"
+#include <cenrepnotifyhandler.h>
+#include "CIptvEpgManagerUpdater.h"
+
+// Forward declarations
+class TIptvRssSearchQuery;
+class CIptvVodContentContentFullDetails;
+class CIptvVodContentContentBriefDetails;
+class CIptvVodContentCategoryBriefDetails;
+class CIptvService;
+class CIptvServer;
+class CIptvEpgPluginInterface;
+class CIptvEpgVodMsqQueue;
+class CIptvContentIdMediaContentItem;
+class CIptvEpgSession;
+class CIptvEpgService;
+class CRepository;
+
+/**
+*	CIptvSearchManager is the class to receive search requests from the client,
+*	passes them to the RSS plugin and receives content information from the plugin
+*	when it reports about downloaded and parsed categories and contents. This
+*	class stores the found search results in RAM; results are not stored to any
+*	database.
+*	When new search is performed old search results will be deleted.
+*/
+class CIptvSearchManager : public CBase,
+                           public MIptvEpgVodCallback,
+                           public MIptvEpgManagerUpdateObserver,
+		                   public MCenRepNotifyHandlerCallback
+	{
+	public:
+
+    	/**
+    	*	Symbian two phase constructor
+    	*	@param	None
+    	*	@return	Pointer to a newly created CIptvSearchManager object
+    	*/
+    	static CIptvSearchManager* NewL( CIptvServer& aServer,
+    	                                 CIptvEpgSession& aParent,
+    									 CIptvEpgVodMsqQueue* aVodMsgQueue );
+    	
+    	/**
+    	*	Destructor
+    	*/
+    	~CIptvSearchManager();
+	
+	public: // New methods
+	
+    	/**
+    	*	Method to perform search
+    	*/
+    	TInt Search( TIptvRssSearchQuery& aQuery );
+    	
+    	/**
+    	*	Method to cancel current search. This causes the cleanup for
+    	*	search results and RSS plugin to be stopped
+    	*	@param	None
+    	*	@return	None
+    	*/
+    	TInt CancelSearch();
+    	
+    	/**
+    	*	Getter for brief details of the search category.
+    	*	@param	None
+    	*	@return	Pointer to the brief details object that descvribes the search
+    	*			category. If search is not possible we return NULL here. Ownership
+    	*			of the returned object is transferred.
+    	*/
+    	CIptvVodContentCategoryBriefDetails* SearchCategoryContentBriefDetailsL();
+    	
+    	/**
+    	*	Getter method for the brief details of the specified content.
+    	*	@param	aContentId		Id of the content that's details are requested
+    	*	@param	aSearchString	Not used in search operations
+    	*	@param	aFrom			Not used in search operations
+    	*	@param	aAmount			Not used in search operations
+    	*	@param	aTotalAmount	Number of details found for the given content id
+    	*	@param	aEcgList		On return contains the list of the details object
+    	*							that are matching the given content id
+    	*/    	
+    	void GetSearchContentBriefDetailsL( TIptvCategoryId aContentId,
+    										TDesC& aSearchString,
+    										TUint32 aFrom,
+    										TUint32 aAmount,
+    										TUint32& aTotalAmount,
+    										RPointerArray<CIptvVodContentContentBriefDetails>& aEcgList );
+    	
+    	/**
+    	*	Getter for the parent category for the given category. In this method
+    	*	aCategoryId is compared with KIptvRssSearchCategoryId
+    	*	@param	aCategoryId			Used to identify if parent category for the search
+    	*								is asked (compared with KIptvRssSearchCategoryId)
+    	*	@param	aParentCategoryId	On return contains KIptvVodContentCategoryRootId if
+    	*								aCategoryId == KIptvRssSearchCategoryId)
+    	*	@return	KErrNone if aCategoryId == KIptvRssSearchCategoryId, otherwise KErrNotSupported
+    	*/    	
+    	TInt GetParentCategory( TIptvCategoryId aCategoryId, TIptvCategoryId& aParentCategoryId );
+    	
+    	/**
+    	*	Setter for service id. This method must be called before starting the
+    	*	update.
+    	*	@param	aServiceId	Value for current service's id
+    	*	@return	None
+    	*/
+    	TInt SetServiceId( TUint32 aServiceId );
+    	
+    	/**
+    	*	Sets the iap to be used for search operation. This variable is
+    	*	passed to RSS plugin so it knows what iap user has selected.
+    	*	@param	aIap	Iap to be used for search operations
+    	*	@return	None
+    	*/    	
+    	void SetIap( TUint32 aIap );
+    	
+    	/**
+    	*	Returns the boolean value if current service supports search
+    	*	functionality
+    	*	@param	None
+    	*	@return	ETrue if search is possible, otherwise EFalse
+    	*/    	
+    	TBool IsSearchPossible() const;
+    	
+    	/**
+    	*	Setter for the service information to be used for the search operations.
+    	*	Given service defines if the search operations are allowed for the service
+    	*	and as well as the url for the search operations. Contents of the aService
+    	*	are stored into the iCurrentService member variable.
+    	*	@param	aService	Pointer to the service object that describes currently
+    	*						active service.
+    	*/    	
+    	void SetServiceL( CIptvEpgService* aService );
+    	
+    	/**
+    	*	Method to retrieve a list of media content access definitions for
+    	*	the specified content id. There might be different locations for same content
+    	*	where bitrate, mime type and so on can vary. Higher level implementations
+    	*	can select the proper content from the list to be downloaded.
+    	*	@param	aContentId		Content id which media contents are to be retrieved
+    	*	@param	aContents		On return contains the list of different sets of
+    	*							media contents available for specified content.
+    	*/    	
+    	void GetContentAccessListL( TUint32 aContentId, RPointerArray<CIptvMediaContent>& aContents );
+    	
+    	/**
+    	*	Method to retrieve the proper media content based on the content id
+    	*	and an index inside the array of media contents of aContentId.
+    	*	@param	aContentId	ContentId which content access is to be
+    	*						retrieved
+    	*	@param	aIndex		Index of the media content client is willing to retrieve.
+    	*	@return	On return contains the item from iMediaContents array that has
+    	*			matching content id.
+    	*/    	
+    	CIptvMediaContent* GetContentAccessL( TUint32 aContentId, TUint32 aIndex );
+    	
+    	/**
+    	*	Getter for more specified data for the specified content.
+    	*	@param	aContentId			Content id which details is to be retrieved
+    	*	@param	aContentFullDetails	On return contains the full details of the
+    	*								specified content.
+    	*	@return	KErrNone if successful, otherwise Symbian error code.
+    	*/    	
+    	TInt GetContentDetailsL( TIptvContentId aContentId,
+    							 CIptvVodContentContentFullDetails& aContentFullDetails );
+    	
+	    /**
+	    *	Method to add a message queue for the local array.
+	    *	@param	aVodMsgQueue	Message queue pointer to be inserted to the
+	    *							local array.
+	    *	@return	None
+	    */
+        void AddEpgVodMsgQueue( CIptvEpgVodMsqQueue* aVodMsgQueue );
+	
+	    /**
+	    *	Method to remove specified message queue object from the local array.
+	    *	@param	aVodMsgQueue	Message queue pointer to be removed from
+	    *							the array
+	    *	@return	None
+	    */
+        void RemoveEpgVodMsgQueue( CIptvEpgVodMsqQueue* aVodMsgQueue );	
+
+        /**
+        *	Clears all the results and returns the search manager to initiate
+        *	state. This method call takes care of freeing all the memory in
+        *	the arrays inside this class as well as deleting thumbnails
+        *	downloaded for search result located in iThumbnailDirectory.
+        *	@param	None
+        *	@return	None
+        */
+        void ClearAllResults();
+
+        /**
+        * Updates Search Manager's list of Content ID numbers that have been
+        * used by downloads from previous search results. This method should 
+        * be called before starting a new search. Call is external, because
+        * Search Manager does not have all the necessary dependencies to generate
+        * the list.
+        *
+        * @param aUsedIdArray New array of used Content ID numbers.
+        */
+        void UpdateUsedContentIdsListL( RArray<TInt>& aUsedIdArray );
+
+	public: // Methods to satisfy MIptvEpgVodCallback inheritance
+	
+        /**
+        *	Method called by the plugin to tell that plugin has started doing
+        *	it's job.
+        *	@param	None
+        *	@return	None
+        */
+        void StartedL();
+
+        /**
+        *	ECG content update from XML completed. Thumbnails are not downloaded yet.
+        *	@param	None
+        *	@return	None
+        */
+        void ContentUpdateCompletedL();
+
+        /**
+        *	Method to used to signalize that plugin has finished it's job
+        *	@param aUpdateInterval	Update interval defines how long EPG data
+        *							is valid.
+        *	@return	KErrNone if successful, otherwise some of the Symbian wide
+        *			error codes
+        */
+        TInt FinishedL( TTime& aUpdateInterval );
+
+        /**
+        *	Adds new category to be added to the result array
+        *
+        *	@param aCategory	Reference to CIptvEpgCategory object.
+        *	@param aCategoryKey	New category key value is inserted to
+        *						aCategoryKey
+        *	@return				KErrNone if successful, otherwise another
+        *						of the system-wide error codes.
+        */
+        TInt AddCategoryL( CIptvEpgCategory& aCategory, TUint32& aCategoryKey );
+
+        /**
+        *	Adds new content to added to the result array
+        *	@param aContent			Reference to CIptvEpgContent object.         
+        *	@param aMediaContents	Pointer array containing media content objects.
+        *							There can be n media content's for one content.
+        *	@param aContentKey		New content key value is inserted to aContentKey
+        *	@return KErrNone if successful, otherwise another of the system-wide
+        			error codes.
+        */
+        TInt AddContentL( CIptvEpgContent& aContent,
+        				  RPointerArray<CIptvMediaContent> aMediaContents,
+        				  TUint32& aContentKey );
+
+        /**
+        *	Updates the thumbnail path for the service.
+        *	@param aIconFilePath	Full path to service thumbnail in local filesystem.
+        *   @param aGrouped         if true updates also grouped item, otherwise not.
+        * 	@return KErrNone if successful, otherwise another of the system-wide
+        *			error codes.
+        */
+        TInt UpdateServiceThumbnailL( TDesC& aIconFilePath, const TBool aGrouped );
+
+        /**
+        *	Add content to specified category. Value is updated to the result array
+        *	@param	aCategoryKey      Category key.        
+        * 	@param	aContentKey       Content key.
+        *	@return	KErrNone on success, otherwise one of the system-wide error codes
+        */    
+        TInt AddRelationL( TUint32& aCategoryKey, TUint32& aContentKey );
+
+        /**
+        *	Error that has occured during the parsing
+        *	@param	aError	Error code describing the occured error
+        *	@return	None
+        */    
+        void ErrorL(TInt aError, TInt aInfo);      
+
+        /**
+        *	Method to update icon for a category
+        *	@param	aCategoryKey	Category key.
+        *	@param	aIconFileId		Icon file id to search from the database.         
+        *	@param	aIconFilePath	Full path to icon file or URL + filename.
+        *	@param	aIsUrl			If aIconFilePath is URL aIsUrl == ETrue,
+        *							if aIconFilePath is path to local filesystem
+        *							aIsUrl == EFalse.
+        *	@return KErrNone if successful, otherwise another of the system-wide error codes.
+        */
+        TInt UpdateCategoryIconL( TUint32& aCategoryKey,
+        						  TUint32& aIconFileId,
+        						  TDesC& aIconFilePath,
+        						  TBool aIsUrl);
+
+        /**
+         *	Method to update icon for content
+         *	@param	aCategoryKey	Content key.
+         *	@param	aIconFileId		Icon file id to search from the database.         
+         *	@param	aIconFilePath	Full path to icon file or URL + filename.
+         *	@param	aIsUrl			If aIconFilePath is URL aIsUrl == ETrue,
+         *							if aIconFilePath is path to local filesystem
+         *							aIsUrl == EFalse.
+         *	@return KErrNone if successful, otherwise another of the system-wide error codes.
+         */
+        TInt UpdateContentIconL( TUint32& aContentKey,
+        						 TUint32& aIconFileId,
+        						 TDesC& aIconFilePath,
+        						 TBool aIsUrl);
+
+		/**
+		*	Resets the global file id values for both media access array and
+		*	parent details as well
+		*	@param	aId		Id defining the global file id's to be reseted
+		*	@return	KErrNone if successful, otherwise a Symbian error code
+		*/
+		TInt ResetGlobalId( CIptvMyVideosGlobalFileId& aId );
+    
+		/**
+		*	Sets the global file id values for media content specified by content id
+		*	@param	aContentKey	Key to describe content id of the media content
+		*	@param	aId		Id defining the global file id's to be reseted
+		*	@param	aIndex	Index of media content array which details is updated
+		*	@return	KErrNone if successful, otherwise a Symbian error code
+		*/
+		TInt SetGlobalId( TUint32 aContentKey,
+					  	  CIptvMyVideosGlobalFileId& aId,
+					  	  TUint32 aIndex );
+		
+		public: // From MIptvEpgManagerUpdateObserver
+      
+        /**        
+         * Check if plugin is running, and closes everything down if plugin has
+         * completed.
+         */
+        void CheckIsPluginRunning();
+    
+        /**
+         * Returns ETrue if plugin is running.
+         */
+        TBool IsPluginRunning() { return iPluginIsRunning; }
+
+	public: // from MCenRepNotifyHandlerCallback
+		/**
+		*	Receive notification about changed int value in central repository
+		*	@param	aId			Id of the key that is changed in the central
+		*						repository
+		*	@param	aNewValue	New value of aId in the central repository
+		*	@return	None
+		*/
+	    void HandleNotifyInt( TUint32 aId, TInt aNewValue );
+
+
+	private: // Private methods
+
+    	/**
+    	*	Default constructor
+    	*/
+    	CIptvSearchManager( CIptvServer& aServer, CIptvEpgSession& aParent );
+    	
+    	/**
+    	*	Symbian second phase constructor for initialization code that might
+    	*	leave
+    	*	@param	None
+    	*	@return	None
+    	*/
+    	void ConstructL( CIptvEpgVodMsqQueue* aVodMsgQueue );
+    	
+    	/**
+    	*	Method to take care of inserting search parameters to the search
+    	*	http url. Search parameters are delivered to this class when
+    	*	CIptvSearchManager::Search( TSearchQuery ) is called. Values found
+    	*	from TSearchQuery is inserted into the search http address found
+    	*	from CIptvService object's iSearchUrl.
+    	*	@param	None
+    	*	@return	None
+    	*/
+    	void ParseSearchAddressL( TIptvRssSearchQuery& aQuery );
+
+        /**
+        *	Handler method for search operation. This is the method that
+        *	actually creates the plugin instance and sets all the necessary
+        *	information for it in order to make metadata download and parsing
+        *	possible
+        *	@param	aQuery	Class that contains the search query parameters
+        *	@return	None
+        */    	
+    	void HandleSearchL( TIptvRssSearchQuery& aQuery );
+    	
+        /**
+        *	Creates a full details item of plugin provided epg content object
+        *	@param	aContent	Content that contains the details to be stored
+        *	@return	On return contains new full details object with details
+        *			provided by aContent
+        */
+        CIptvVodContentContentFullDetails*
+        	CreateContentFullDetailsFromEpgDataL( CIptvEpgContent& aContent );
+        
+        /**
+        *	Directory is parsed when search manager receives the information
+        *	about used service. Retrieved thumbnaildirectory path is stored to
+        *	iThumbnailDirectory member variable.
+        *	@param	None
+        *	@return	None
+        */
+        void ResolveThumbnailDirectory();
+        
+        /**
+        *	Reads the central repository values that are needed by the search
+        *	manager.
+        *	@param	None
+        *	@return	None
+        */
+        void ReadCenRepData();
+
+        /**
+        * Resets base Content key to first available value.
+        */        
+        void ResetContentKey();
+
+        /**
+        * Increments base Content key to next available value.
+        */        
+        void IncrementContentKey();
+
+        /**
+        * Return current value of base Content key. Call IncrementContentKey()
+        * separately to increment the key to next value.
+        *
+        * @return Current value of base Content key.
+        */        
+        TUint32 GetContentKey();
+
+        /**
+        * Sets base Content key to first available value starting from given base
+        * value. Should not be called directly, as this is helper for other Content
+        * key methods.
+        *
+        * @param aBase Base value for Content key's new value.
+        */
+        void SetToNextAvailableContentKey( TUint32 aBase );
+
+	private: // Instance variables
+
+    	/**
+    	*	This is the category that represents the 'Search' to be displayed at the UI
+    	*/
+    	CIptvVodContentCategoryBriefDetails* iSearchCategory;
+    	
+    	/**
+    	*	Pointer array containing the parsed content from the search url.
+    	*/
+    	RPointerArray<CIptvVodContentContentFullDetails> iAllContentFullDetails;
+    	
+    	
+    	/**
+    	*	Id for the service we are currently handling
+    	*/
+    	TUint32 iServiceId;
+    	
+    	/**
+    	*	Locally stored object that has the details of the currently
+    	*	active service.
+    	*/    	
+    	CIptvEpgService* iCurrentService;
+    	
+    	/**
+    	*	Reference to the server object
+    	*/    	
+    	CIptvServer& iServer;
+    	
+    	/**
+    	*	Epg session handle to check if vod update is run by RSS plugin
+    	*/
+        CIptvEpgSession& iParent;
+    	
+    	/**
+    	*	Array of vod message queues.
+    	*/    	
+    	RPointerArray<CIptvEpgVodMsqQueue> iVodMsgQueues;
+    	
+    	/**
+    	*	Pointer to the RSS plugin. This plugin is used to perform the
+    	*	search operation (download, parsing and content detail sending
+    	*	to search manager)
+    	*/    	
+    	CIptvEpgPluginInterface* iRssPlugin;
+    	
+    	/**
+    	*	Iap to be used for the search http transactions.
+    	*/    	
+    	TUint32 iIap;
+    	
+    	/**
+    	*	Boolean to define if this instance of the search manager is
+    	*	running a RSS plugin for the search.
+    	*/    	
+    	TBool iPluginIsRunning;
+    	
+    	/**
+    	*	Array that contains the media content items for all the 
+    	*	found search results
+    	*/    	
+    	RPointerArray<CIptvContentIdMediaContentItem> iMediaContents;
+    	
+    	/**
+    	*	Auto-increment value that is used as content id for the
+    	*	CIptvVodContentContentFullDetails objects stored in
+    	*	iAllContentFullDetails array. This value is set 
+    	*/    	
+    	TUint32 iContentKey;
+    	
+    	/**
+    	* Array of Content ID numbers that have been used by downloads of previous
+    	* searches. Array is stored so we don't re-use same key for two downloads.
+    	*/
+    	RArray<TUint32> iUsedContentKeys;
+
+    	/**
+    	*	Buf to contain the search url template that is used for search
+    	*	This template contains the copy of search url value of the
+    	*	iCurrentService
+    	*/    	
+    	HBufC* iSearchUrlTemplate;
+    	
+    	/**
+    	*	Updater object that monitors the update progress
+    	*/    	
+    	CIptvEpgManagerUpdater* iUpdater;
+    	
+    	/**
+    	*	Directory path pointing to directory where search thumbnails
+    	*	are stored.
+    	*/
+    	TBuf<KIptvMaxPath> iThumbnailDirectory;
+    	
+    	/**
+    	*	Fileserver session instance
+    	*/
+    	RFs iFs;
+    	
+    	/**
+    	*	File manager instance used to delete directory that contains
+    	*	thumbnails when this class get's deleted or we are about to
+    	*	start new search
+    	*/
+    	CFileMan* iFileMan;
+    	
+    	/**
+    	*	Central repository handle to read parental rating data
+    	*/
+    	CRepository* iCenRepSession;
+    	
+    	/**
+    	*	Notify handler to receive notifications about changed value(s)
+    	*	in central repository
+    	*/
+    	CCenRepNotifyHandler* iCenRepNotifyHandler;
+    	
+    	/**
+    	*	Currently used parental rating value. This value is initialised
+    	*	to 0 (KParentalRatingOff constant defined in .cpp file). Set value
+    	*	is read from the central repository and this value can be updated
+    	*	from central repository observer method HandleNotifyInt.
+    	*/
+    	TInt iParentalControl;
+	};
+
+#endif // CIPTVSEARCHMANAGER_H
+
+// End of file.