--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videocollection/mpxmyvideoscollection/tsrc/ut_collectionplugintest/inc/vcxmyvideosvideocache_stub.h Wed Oct 13 14:34:36 2010 +0300
@@ -0,0 +1,534 @@
+/*
+* 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: Contains cached MDS media items*
+*/
+
+
+
+#ifndef VCXMYVIDEOSVIDEOCACHE_H
+#define VCXMYVIDEOSVIDEOCACHE_H
+
+// INCLUDES
+#include "vcxmyvideosmdsdb.h"
+
+// FORWARD DECLARATIONS
+class CVcxMyVideosCollectionPlugin;
+class CMPXMedia;
+class CRepository;
+
+// CONSTANTS
+
+// CLASS DECLARATION
+
+/**
+ * Contains information about video.
+ * These are stored to CVcxMyVideosVideoListIndex::iVideoArray.
+ */
+NONSHARABLE_CLASS(TVcxMyVideosVideo)
+ {
+ public:
+
+ /**
+ * Constructor.
+ */
+ TVcxMyVideosVideo();
+
+ /**
+ * = operator.
+ */
+ TVcxMyVideosVideo& operator=( const TVcxMyVideosVideo& aVideo );
+ public:
+
+ /**
+ * Set values.
+ *
+ * @param aMdsId MDS ID
+ * @param aPos Position in CVcxMyVideosVideoCache::iVideoList
+ * @param aVideo Pointer to CVcxMyVideosVideoCache::iVideoList item,
+ * ownership does not move.
+ */
+ void Set( TUint32 aMdsId, TInt aPos, CMPXMedia* aVideo );
+
+ public:
+ TUint32 iMdsId; // Video object ID in MDS.
+ CMPXMedia* iVideo; // Pointer to CVcxMyVideosVideoCache::iVideoList item
+ TInt iPos; // Items position in CVcxMyVideosVideoCache::iVideoList
+ };
+
+/**
+* Used for keeping videos in MDS ID order for fast access.
+* (Indexes CVcxMyVideosVideoCache::iVideoList).
+*
+* @lib mpxmyvideoscollectionplugin.lib
+*/
+NONSHARABLE_CLASS(CVcxMyVideosVideoListIndex) : public CBase
+ {
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor
+ * @return Object constructed
+ */
+ static CVcxMyVideosVideoListIndex* NewL();
+
+ /**
+ * Destructor
+ */
+ virtual ~CVcxMyVideosVideoListIndex();
+
+public:
+
+ /**
+ * Sets up iVideoArray from aVideoList. Sorting is also done.
+ *
+ * @param aVideoList Video list to use for constructing iVideoArray.
+ */
+ void SetL( const CMPXMedia& aVideoList );
+
+ /**
+ * Finds video by MDS ID from the index. Uses bisection method.
+ *
+ * @param aVideo The found video data is written here.
+ * @return KErrNotFound if not found, index of the item in iVideoArray
+ * otherwise.
+ */
+ TInt Find( TUint32 aMdsId, TVcxMyVideosVideo& aVideo );
+
+ /**
+ * Removes video from index.
+ *
+ * @param aMdsId ID if the item to be removed.
+ * @param aCompress If ETrue, compresses the video array.
+ * @return KErrNotFound if not found, index of the removed item otherwise.
+ */
+ TInt Remove( TUint32 aMdsId, TBool aCompress = ETrue );
+
+ /**
+ * Adds video to index. Keeps sorting order.
+ *
+ * @param aVideo Video to be added, ownership does not move.
+ * @param aPos aVideo's position in CVcxMyVideosVideoCache::iVideoList.
+ */
+ void AddL( CMPXMedia* aVideo, TInt aPos );
+
+#ifdef _DEBUG
+ /**
+ * Returns reference to video array.
+ */
+ const RArray<TVcxMyVideosVideo>& VideoArray();
+#endif
+
+private:
+ /**
+ * Constructor
+ */
+ CVcxMyVideosVideoListIndex();
+
+ /**
+ * Symbian 2nd phase constructor.
+ */
+ void ConstructL ();
+
+ /**
+ * Sorts iVideoArray by MDS ID.
+ */
+ void Sort();
+
+ /**
+ * Used for keeping RArray<TVcxMyVideosVideo> in integer order by
+ * TVcxMyVideosVideo::iMdsId.
+ *
+ * @param aVideo1 Video to compare
+ * @param aVideo2 Video to compare
+ * @return -1 if aVideo1 is smaller than aVideo2, 1 if aVideo1 is larger than
+ * aVideo2.
+ */
+ static TInt CompareVideosByMdsId( const TVcxMyVideosVideo& aVideo1,
+ const TVcxMyVideosVideo& aVideo2 );
+
+private:
+
+ /**
+ * Video array which is kept in order by MDS ID.
+ */
+ RArray<TVcxMyVideosVideo> iVideoArray;
+ };
+
+/**
+* Used for storing MDS items to RAM for fast access.
+*
+* @lib mpxmyvideoscollectionplugin.lib
+*/
+NONSHARABLE_CLASS(CVcxMyVideosVideoCache) : public CBase
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor
+ * @param aMyVideosCollectionPlugin Owner of this object.
+ * @return Object constructed
+ */
+ static CVcxMyVideosVideoCache* NewL (
+ CVcxMyVideosCollectionPlugin& aMyVideosCollectionPlugin );
+
+ /**
+ * Destructor
+ */
+ virtual ~CVcxMyVideosVideoCache();
+
+ public:
+
+ /**
+ * @return ETrue if iVideoList is complete. (All items have
+ * been fetched from MDS.)
+ */
+ TBool IsComplete();
+
+ /**
+ * Set to ETrue when all items have been fetched from MDS.
+ */
+ void SetComplete( TBool aComplete );
+
+ private:
+ /**
+ * Constructor
+ */
+ CVcxMyVideosVideoCache( CVcxMyVideosCollectionPlugin& aMyVideosCollectionPlugin );
+
+ /**
+ * Symbian 2nd phase constructor.
+ */
+ void ConstructL ();
+
+ /**
+ * Finds correct position in iVideoList for the new video.
+ *
+ * @param aMedia Video to be inserted to the list.
+ * @param aSortingOrder Sorting order.
+ * @return Position in the cache.
+ */
+ TInt FindCorrectPositionL( CMPXMedia& aMedia, TVcxMyVideosSortingOrder aSortingOrder );
+
+ /**
+ * Compares aNewVideo and aVideoInList in sizes, creation dates
+ * or titles.
+ *
+ * @param aNewVideo Video to be added to the list.
+ * @param aVideoInList Video in cache video list which is currently compared against
+ * aNewVideo.
+ * @param aSortingOrder Defines which attributes are compared. Size, Creation Date and Title
+ * are possible.
+ * @return -1 if aVideoInList has smaller value, 1 if greater and 0 if equal.
+ */
+ TInt CompareL( CMPXMedia& aNewVideo, CMPXMedia& aVideoInList,
+ TVcxMyVideosSortingOrder aSortingOrder );
+
+ /**
+ * Adds video to iVideoList to the correct position, according to sorting order.
+ * MDS ID is used to identify the video.
+ *
+ * @param aVideo Video to add.
+ * @param aSortingOrder Sorting order used.
+ * @param aUpdateCategories If ETrue, then categories are updated.
+ * @return KErrNone if added, KErrAlreadyExists if already exists and
+ * was not added.
+ */
+ TInt AddToCorrectPlaceL( CMPXMedia& aVideo, TVcxMyVideosSortingOrder aSortingOrder,
+ TBool aUpdateCategories = ETrue );
+
+ /**
+ * Moves a video to correct place on iVideoList, according to sorting order.
+ * aVideo should be a refrence to iVideoList item. After the call the referenced
+ * item is gone and the reference shouldn't be used anymore.
+ *
+ * @param aVideo Video to move.
+ * @param aSortingOrder Sorting order used.
+ */
+ void MoveToCorrectPlaceL( CMPXMedia& aVideo,
+ TVcxMyVideosSortingOrder aSortingOrder );
+
+ /**
+ * Removes video from iVideoList or iPartialVideoList.
+ * MDS ID is used to identify the video.
+ *
+ * @param aVideo Video to remove, MDS ID is read from here.
+ * @param aUpdateCategories If ETrue, then categories are updated.
+ * @return KErrNotFound if not found, KErrNone otherwise.
+ */
+ TInt RemoveL( CMPXMedia& aVideo, TBool aUpdateCategories = ETrue );
+
+ /**
+ * Fetches sorting order from Cenrep.
+ * @return Sorting order.
+ */
+ TVcxMyVideosSortingOrder SortingOrderL();
+
+ /**
+ * Called when Title in video cache has been modified.
+ * Updates sorting order and category attributes if necessarry.
+ * NOTICE that aVideoInCache is not allowed to own the media object, since this
+ * function may change the pointer value to point to a new object.
+ *
+ * @param aVideoInCache Video in cache which Title has been modified. aVideoInCache
+ * is not allowed to own the data.
+ */
+ void HandleVideoTitleModifiedL( CMPXMedia*& aVideoInCache );
+
+ /**
+ * Deletes iPartialList.
+ */
+ void DeletePartialList();
+
+ /**
+ * Adds video to cache (iVideoList or iPartialVideoList). Ownership moves.
+ *
+ * @param aVideo Video to add.
+ * @param aSortingOrder Sorting order.
+ * @param aUpdateCategores If ETrue, then category and album attributes are updated.
+ * @return KErrNone if added, KErrAlreadyExists if already exists and
+ * was not added.
+ */
+ TInt AddL( CMPXMedia* aVideo, TVcxMyVideosSortingOrder aSortingOrder,
+ TBool aUpdateCategories = ETrue );
+
+ /**
+ * Adds video to iPartialVideoList. Ownership moves.
+ *
+ * @param aVideo Video to add.
+ * @return KErrNone if item was added, KErrAlreadyExists if video
+ * was already on the list and was not added.
+ */
+ TInt AddToPartialListL( CMPXMedia* aVideo );
+
+ /**
+ * Finds the array position of aVideo in iPartialVideoList .
+ *
+ * @param aVideo Video which position is searched.
+ * @return Position, KErrNotFound if item is not in iPartialVideoList.
+ */
+ TInt PosOnPartialVideoListL( CMPXMedia& aVideo );
+
+ /**
+ * Finds the array position of aVideo in iVideoList.
+ *
+ * @param aVideo Video which position is searched.
+ * @return Position, KErrNotFound if item is not in iVideoList.
+ */
+ TInt PosOnVideoListL( CMPXMedia& aVideo );
+
+#ifdef _DEBUG
+ /**
+ * Checks that iVideoListIndex is correctly formed.
+ */
+ void CheckVideoListIndexL();
+#endif
+
+ public:
+ /**
+ * Creates filtered video list from iVideoList. This is used for
+ * showing video categories by origin.
+ *
+ * @param aOrigin Only videos with this origin are added to list,
+ * see values from TVcxMyVideosOrigin (in vcxmyvideosdefs.h).
+ * @return New video list, containing videos from aOrigin.
+ */
+ CMPXMedia* CreateVideoListByOriginL( TUint8 aOrigin );
+
+ /**
+ * Appends items from aFromList to aToList if items origin is equal with
+ * aOrigin. This is used when fetching other than All category from MDS.
+ *
+ * @param aToList List to append
+ * @param aFromList List to append from.
+ * @param aOrigin Only items with this origin are copied.
+ * @param aNewItemsStartIndex Start index in aFromList where from the copying is started.
+ */
+ void AppendToListL( CMPXMedia& aToList, CMPXMedia& aFromList,
+ TUint8 aOrigin, TInt aNewItemsStartIndex );
+
+ /**
+ * Tries to find media with matching URI from the cached video list.
+ *
+ * @param aUri URI to compare
+ * @return Contains pointer to media if match found, NULL otherwise.
+ * Pointer ownership is not moved to the caller.
+ */
+ CMPXMedia* FindVideoByUriL( const TDesC& aUri );
+
+ /**
+ * Tries to find media with matching MdsId from iVideoList and iPartialVideoList.
+ *
+ * @param aMdsId ID to compare
+ * @param aPos If found from iVideoList, the position index is written here,
+ * KErrNotFound otherwise. If found from iPartialVideoList, then
+ * the value is still set to KErrNotFound.
+ * @return Contains pointer to media if match found, NULL otherwise.
+ * Pointer ownership is not moved to the caller.
+ */
+ CMPXMedia* FindVideoByMdsIdL( TUint32 aMdsId, TInt& aPos );
+
+ /**
+ * Gets medias from iVideoList and iPartialVideoList.
+ *
+ * @param aMdsIds IDs of the items to fetch.
+ * @return Pointer to fetched items, KMPXMediaArrayContents
+ * attribute contains the media items. Ownership
+ * moves to caller.
+ */
+ CMPXMedia* GetVideosL( RArray<TUint32>& aMdsIds );
+
+ /**
+ * Removes video from iVideoList (or from iPartialVideoList).
+ *
+ * @param aMdsId MDS ID of the video to be removed.
+ * @param aUpdateCategories If ETrue, then categories are updated.
+ * @return KErrNotFound if not found, KErrNone otherwise.
+ */
+ TInt RemoveL( TUint32 aMdsId, TBool aUpdateCategories = ETrue );
+
+ /**
+ * Removes videos from iVideoList.
+ *
+ * @param aUpdateCategories If ETrue, then categories are updated.
+ * @param aMdsIds Array containing MDS IDs of the videos to be deleted.
+ */
+ void RemoveL( RArray<TUint32>& aMdsIds, TBool aUpdateCategories = ETrue );
+
+ /**
+ * Adds videos to cache (iVideoList or iPartialVideoList). After the function call aMdsIds
+ * will contain only those items which were actually added to cache.
+ *
+ * @param aMdsIds Array containing MDS IDs of the videos to be added.
+ * @param aListFetchingWasCanceled This is set to EFalse if video list fetching from mds
+ * had to be cancelled. EFalse otherwise.
+ * @param aNonVideoIds If argument given then Ids which were detected to not be
+ * videos are written here. Caller owns the array, ownership
+ * does not move.
+ * @param aUpdateCategories If ETrue, then category/album attributes are updated.
+ */
+ void AddVideosFromMdsL( RArray<TUint32>& aMdsIds, TBool& aListFetchingWasCanceled,
+ RArray<TUint32>* aNonVideoIds = NULL, TBool aUpdateCategories = ETrue );
+
+ /**
+ * Deletes old and creates new iVideoList. After the function call iVideoList exists,
+ * but it might not contain any media items yet, only empty array.
+ * Media items are added to the list asynchronoysly in
+ * VcxMyVideosColletionPlugin::HandleCreateVideoListResp(), called by
+ * VcxMyVideosMdsDb. Once iVideoList is complete, iVideoListIsPartial
+ * is set to EFalse. During the video list fetching
+ * VcxMyVideosMdsDb::iVideoListFetchingIsOngoing is ETrue.
+ * If there is video list creation already ongoing
+ * and the aSortingOrder is the same, nothing is done.
+ * During the video list fetching iPartialVideoList items are moved to
+ * iVideoList. When fetch is complete, iPartialVideoList is empty.
+ *
+ * @param aForce If ETrue, then the list is always created from scratch, possible
+ * ongoing fetch is cancelled.
+ */
+ void CreateVideoListL( TBool aForce = EFalse );
+
+ /**
+ * Resets iVideoList (removes items, empty list is left) and cancels possible ongoing
+ * asynchronous videolist fetching. iVideoListIsPartial is set to ETrue.
+ * CVcxMyVideosCollection plugin variables are not touched. Caller is responsible to
+ * either cancel the fetch from plugin, or restart fetch from mds in a way that
+ * client gets its list. iVideoList media object remains pointing to same shared data.
+ */
+ void ResetVideoListL();
+
+ /**
+ * Updates video attributes in cache from aVideo. NOTE: iVideoList might be changed
+ * if Size or Title values are modified and matching sorting order is currently on.
+ * Pointers to iVideoList items should be refreshed after calling this with size and title
+ * parameters.
+ *
+ * @param aVideo Attributes are read from here and updated to cache if difference exists.
+ * @return ETrue if any parameter was changed.
+ */
+ TBool UpdateVideoL( CMPXMedia& aVideo );
+
+ /**
+ * iVideoList and its media array are deleted and recreated. New instances point to
+ * different global heap position. Media objects stay the same and point to
+ * same global heap.
+ */
+ void ReCreateVideoListL();
+
+ /**
+ * Replaces items in iVideoList with items from iPartialVideoList.
+ * Called by iCollection when fetching videolist.
+ */
+ void CheckForPartialVideoListItemsL( TInt aNewItemsStartIndex );
+
+ public:
+
+ /**
+ * Contains list of all videos in MDS. Used for caching MDS to RAM.
+ */
+ CMPXMedia* iVideoList;
+
+ /**
+ * Items fetched by MDS ID which don't (yet) have instance in iVideoList
+ * are added here. When iVideoList instance is received from MDS, it is
+ * replaced by item from iPartialVideoList and instance from iPartialVideoList
+ * is removed.
+ */
+ RArray<CMPXMedia*> iPartialVideoList;
+
+ /**
+ * Sorting order which was used last time when list was queryed from MDS.
+ */
+ TVcxMyVideosSortingOrder iLastSortingOrder;
+
+ /**
+ * Set to ETrue when doing videolist fetching.
+ */
+ TBool iIsFetchingVideoList;
+
+ private:
+
+ /**
+ * If ETrue then iVideoList contains all items from MDS.
+ */
+ TBool iVideoListIsComplete;
+
+ /**
+ * My Videos collection plugin, owner of this object.
+ */
+ CVcxMyVideosCollectionPlugin& iCollection;
+
+ /**
+ * Index which keeps TVcxMyVidesVideo items indexed in MDS ID
+ * order for fast access.
+ */
+ CVcxMyVideosVideoListIndex* iVideoListIndex;
+
+ /**
+ * Provides access to the sorting order key in cenrep. Own.
+ */
+ CRepository* iCenRep;
+
+ public: // Friend classes
+
+ // used in testing
+ TBool iLeaveOnReset;
+ TBool iCancelListFetching;
+
+ friend class CCollectionPluginTest;
+
+ };
+
+#endif // VCXMYVIDEOSVIDEOCACHE_H
+
+