# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1276065863 -10800 # Node ID 67eb01668b0ed84d17c332aed0dc72fff7b2c733 # Parent 8f0df5c829861eafc6e407d3b5395e0fa78a56aa Revision: 201021 Kit: 2010123 diff -r 8f0df5c82986 -r 67eb01668b0e inc/mpxvideoplayercustomviewmsgconsts.h --- a/inc/mpxvideoplayercustomviewmsgconsts.h Tue May 25 12:44:54 2010 +0300 +++ b/inc/mpxvideoplayercustomviewmsgconsts.h Wed Jun 09 09:44:23 2010 +0300 @@ -15,7 +15,8 @@ */ -// Version : %version: da1mmcf#3 % +// Version : %version: da1mmcf#4 % + #ifndef __MPXVIDEOPLAYERCUSTOMVIEWMSGCONSTS_H__ #define __MPXVIDEOPLAYERCUSTOMVIEWMSGCONSTS_H__ @@ -31,5 +32,6 @@ const TInt KMpxVideoPlaybackPdlReloading = 0x20024339; +const TInt KMpxVideoPlaybackPdlReloadComplete = 0x2002433A; #endif // __MPXVIDEOPLAYERCUSTOMVIEWMSGCONSTS_H__ diff -r 8f0df5c82986 -r 67eb01668b0e tsrc/testing/tools/builder.pl --- a/tsrc/testing/tools/builder.pl Tue May 25 12:44:54 2010 +0300 +++ b/tsrc/testing/tools/builder.pl Wed Jun 09 09:44:23 2010 +0300 @@ -1,3 +1,20 @@ +# +# 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 "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: +# + + use Cwd; # for cwd my $debug = 0; diff -r 8f0df5c82986 -r 67eb01668b0e tsrc/testing/tools/siscreator.pl --- a/tsrc/testing/tools/siscreator.pl Tue May 25 12:44:54 2010 +0300 +++ b/tsrc/testing/tools/siscreator.pl Wed Jun 09 09:44:23 2010 +0300 @@ -1,3 +1,20 @@ +# +# 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 "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: +# + + use warnings; use Cwd; # for cwd use File::Copy; diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/hgmyvideos/conf/hgmyvideos.confml Binary file videocollection/hgmyvideos/conf/hgmyvideos.confml has changed diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/hgmyvideos/inc/vcxhgmyvideoscategorymodelhandler.h --- a/videocollection/hgmyvideos/inc/vcxhgmyvideoscategorymodelhandler.h Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/hgmyvideos/inc/vcxhgmyvideoscategorymodelhandler.h Wed Jun 09 09:44:23 2010 +0300 @@ -126,7 +126,9 @@ * Handles "ExtraItem" list item selection. * * @param aCategoryId Selected category id - * @param aItemType On return, item type + * @param aItemType On return, item type. If both UID and URL were found, + * UID type will be returned. + * * @param aUid On return, UID if selected item contains UID * @param aUrl On return, URL string if selected item contains URL */ diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/hgmyvideos/inc/vcxhgmyvideosmainview.h --- a/videocollection/hgmyvideos/inc/vcxhgmyvideosmainview.h Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/hgmyvideos/inc/vcxhgmyvideosmainview.h Wed Jun 09 09:44:23 2010 +0300 @@ -15,7 +15,7 @@ */ -// Version : %version: 17 % +// Version : %version: 18 % #ifndef VCXHGMYVIDEOSMAINVIEW_H #define VCXHGMYVIDEOSMAINVIEW_H @@ -167,6 +167,14 @@ */ void LaunchBrowserL( const TDesC& aUrl ); + /** + * Launches Ovi store. + * + * @param aAppUid Ovi Store Launcher application UID + * @param aMsg command line arguments + */ + void LaunchOviStoreL( const TUid aAppUid, const TDesC& aArgs = KNullDesC() ); + private: // Constructors /** diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/hgmyvideos/src/vcxhgmyvideoscategorylistimpl.cpp --- a/videocollection/hgmyvideos/src/vcxhgmyvideoscategorylistimpl.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/hgmyvideos/src/vcxhgmyvideoscategorylistimpl.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -194,9 +194,14 @@ iCategoryModel->HandleExtraItemSelectionL( categoryId, itemType, appUid, urlString ); - if ( itemType == TVcxHgMyVideosCategoryItemTypeUid ) + // ExtraItem1 is Ovi Store + if ( categoryId == KCategoryIdExtraItem1 ) { - iView.LaunchAppL( appUid ); + iView.LaunchOviStoreL( appUid, urlString ); + } + else if ( itemType == TVcxHgMyVideosCategoryItemTypeUid ) + { + iView.LaunchAppL( appUid, urlString ); } else if ( itemType == TVcxHgMyVideosCategoryItemTypeUrl ) { diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/hgmyvideos/src/vcxhgmyvideoscategorymodelhandler.cpp --- a/videocollection/hgmyvideos/src/vcxhgmyvideoscategorymodelhandler.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/hgmyvideos/src/vcxhgmyvideoscategorymodelhandler.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -1125,22 +1125,20 @@ TBuf urlString; TInt uidInt( 0 ) ; - // Try to get web link URL first. + // Try to get URL. TInt error = iModel.GetMyVideosCustomizationString( urlKey, urlString ); if ( error == KErrNone && urlString.Size() > 0 ) { aUrl = urlString; aItemType = TVcxHgMyVideosCategoryItemTypeUrl; } - else + + // Try to fetch application UID. + error = iModel.GetMyVideosCustomizationInt( uidKey, uidInt ); + if ( error == KErrNone && uidInt != 0 ) { - // If URL is not found try to fetch application UID. - error = iModel.GetMyVideosCustomizationInt( uidKey, uidInt ); - if ( error == KErrNone && uidInt != 0 ) - { - aUid = TUid::Uid( uidInt ); - aItemType = TVcxHgMyVideosCategoryItemTypeUid; - } + aUid = TUid::Uid( uidInt ); + aItemType = TVcxHgMyVideosCategoryItemTypeUid; } } diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/hgmyvideos/src/vcxhgmyvideosmainview.cpp --- a/videocollection/hgmyvideos/src/vcxhgmyvideosmainview.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/hgmyvideos/src/vcxhgmyvideosmainview.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -15,7 +15,7 @@ */ -// Version : %version: 45 % +// Version : %version: 46 % // INCLUDE FILES #include @@ -58,6 +58,10 @@ _LIT( KBrowserProtocol, "4 " ); +// URL to Ovi Store videos. If Ovi Store Launcher is not installed, this +// address will be opened to web browser. +_LIT( KOviVideoStoreURL, "http://lr.ovi.mobi/store/video" ); + // ============================ MEMBER FUNCTIONS =============================== // ----------------------------------------------------------------------------- @@ -863,3 +867,36 @@ CleanupStack::PopAndDestroy( param ); } + +// ------------------------------------------------------------------------------ +// CVcxHgMyVideosMainView::LaunchOviStoreL() +// ------------------------------------------------------------------------------ +// +void CVcxHgMyVideosMainView::LaunchOviStoreL( const TUid aAppUid, const TDesC& aArgs ) + { + IPTVLOGSTRING_LOW_LEVEL( "CVcxHgMyVideosMainView::LaunchOviStoreL() enter" ); + RApaLsSession appArcSession; + User::LeaveIfError( appArcSession.Connect() ); + CleanupClosePushL( appArcSession ); + + TApaAppInfo appInfo; + TInt err = appArcSession.GetAppInfo( appInfo, aAppUid ); + IPTVLOGSTRING2_LOW_LEVEL( "CVcxHgMyVideosMainView::LaunchOviStoreL() GetAppInfo() error = %d", err ); + + if ( KErrNone == err ) + { + IPTVLOGSTRING3_LOW_LEVEL( "CVcxHgMyVideosMainView::LaunchOviStoreL() launch '%S' with arguments '%S'", &appInfo.iFullName, &aArgs ); + RProcess process; + User::LeaveIfError( process.Create( appInfo.iFullName, aArgs ) ); + process.Resume(); + process.Close(); + } + else + { + // Launcher not found, use browser until launcher is available + IPTVLOGSTRING_LOW_LEVEL( "CVcxHgMyVideosMainView::LaunchOviStoreL() launcher not found, launch browser" ); + LaunchBrowserL( KOviVideoStoreURL ); + } + + CleanupStack::PopAndDestroy( &appArcSession ); + } diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/download/inc/vcxmyvideosdownloadutil.h --- a/videocollection/mpxmyvideoscollection/download/inc/vcxmyvideosdownloadutil.h Tue May 25 12:44:54 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,407 +0,0 @@ -/* -* 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: -* -*/ - - - - -#ifndef VCXMYVIDEOSDOWNLOADUTIL_H -#define VCXMYVIDEOSDOWNLOADUTIL_H - -// INCLUDES - -#include -#include -#include -#include -#include "vcxmyvideostimer.h" - -// FORWARD DECLARATIONS -class CVcxConnectionUtility; -class CMediatorEventProvider; -class RFs; - -// CONSTANTS -const TInt KVcxSubDirLevels = 2; -const TInt KVcxMaxSubDirLength = 10; -const TInt KVcxMaxSubDirsLength = KVcxMaxSubDirLength * KVcxSubDirLevels; -const TInt KVcxMaxItemsInDir = 100; - -// CLASS DECLARATION - -NONSHARABLE_CLASS(MVcxMyVideosDownloadUtilObserver) - { - public: - /** - * Event handler which client must implement. - * - * @param aDownloadId Download ID in Download Manager. - * @param aProgress Download progress, 0-100. - * @param aDownloaded Current file size, in bytes. - * @param aDownloadError If download goes to failed state, this contains the reason code - * otherwise 0. - * @param aDownloadGlobalError if download goes to failed state, this contains the global reason - * code, otherwise 0. - */ - virtual void HandleDlEvent( TVcxMyVideosDownloadState aState, - TUint32 aDownloadId, - TInt aProgress, - TInt64 aDownloaded, - TInt32 aDownloadError, - TInt32 aDownloadGlobalError ) = 0; - }; - -/** -* Download related stuff. -* -* @lib mpxmyvideoscollectionplugin.dll -*/ -NONSHARABLE_CLASS(CVcxMyVideosDownloadUtil) : - public CBase, - public MHttpDownloadMgrObserver, - public MVcxMyVideosTimerObserver, - public MConnUtilEngineObserver - { - public: // Constructors and destructor - - /** - * Two-phased constructor - * @param aObserver Observer - * @param aFs File server session. - * @return Object constructed - */ - static CVcxMyVideosDownloadUtil* NewL ( MVcxMyVideosDownloadUtilObserver& aObserver, RFs& aFs ); - - /** - * Destructor - */ - virtual ~CVcxMyVideosDownloadUtil(); - - public: - /** - * Starts download. New download ID is written to aDownload. If KVcxMediaMyVideosDownloadId - * != 0, then the existing download is resumed. - * - * @param aDownload download parameters - */ - void StartDownloadL( CMPXMedia& aDownload ); - - /** - * Pauses download. - * - * @param aDownloadId Download ID. - * @return System-wide error code. - */ - TInt PauseDownload( TUint32 aDownloadId ); - - /** - * Returns download by download ID. Ownership is not moved. - * - * @param aDownloadId Download ID. - * @return Download, or NULL if not found. - */ - RHttpDownload* Download( TUint32 aDownloadId ); - - /** - * Returns download which has aFileName as EDlAttrDestFilename. - * Ownership is not moved. - * - * @param aFileName Filename. - * @return Download, or NULL if not found. - */ - RHttpDownload* Download( const TDesC& aFileName ); - - /** - * Returns array to downloads. - */ - const CDownloadArray& Downloads(); - - /** - * Deletes download from download manager using download id. - * - * @param aDeleteContent If ETrue, then content is deleted also. - * @return System-wide error code. - */ - TInt CancelDownload( TInt32 aId, TBool aDeleteContent ); - - /** - * Gets MPX/MDS version of the download state. - * - * @param aDownload Download whose state is fetched. - * @param aDownloadState On completion, the download state is written here. - */ - void GetDownloadState( - RHttpDownload& aDownload, - TVcxMyVideosDownloadState& aDownloadState ); - - /** - * Returns download state. - * - * @param aDownload Download - * @param aDownloaded How much the file has been downloaded in bytes. - * @param aAllowSilentReset if ETrue, silent flag is set to EFalse, in - * case dl size is not gotten ok. - * @return Download progress, in percentages. - */ - TInt8 DownloadProgress( RHttpDownload& aDownload, TUint64& aDownloaded, - TBool aAllowSilentReset ); - - - /** - * Checks that every download item in Download Manager has corresponding - * object in MPX/MDS (= aVideoList), if not, deletes the download. - */ - void ClearOrphanDownloadsL( CMPXMedia& aVideoList ); - - /** - * Deletes download asynchronously. - * - * @param aDownloadId Download to delete. - * @param aDeleteContent If ETrue, then the content file is also deleted. - */ - void DeleteDownloadAsync( TInt32 aDownloadId, TBool aDeleteContent ); - - /** - * Creates path and filename for the new video download. - * - * @return The path. - */ - HBufC* CreateFilePathL( const CMPXMedia& aMedia ); - - /** - * Notify via mediator, that one download has finished succesfully. - * - * @param aMsg Buffer that contains the data that is sent with event. - */ - void NotifyDownloadCompleted( const TDesC8& aMsg ); - - /** - * Notify via mediator, that count of new videos has decreased. - * - * @param aMsg Buffer that constains the data that is sent with event. - */ - void NotifyNewVideosCountDecreased( const TDesC8& aMsg ); - - public: // From MHttpDownloadMgrObserver - - /** - * Handler function for download events. - * - * @param aDownload download - * @aEvent aEvent event - */ - void HandleDMgrEventL( RHttpDownload& aDownload, THttpDownloadEvent aEvent ); - - public: // from MConnUtilEngineObserver - - /** - * Roaming request from connectioutility. - * Download utility decides whether it allows - * iap roaming and returns true or false based on decision. - * - * @return TBool - */ - TBool RequestIsRoamingAllowedL(); - - /** - * Iap change notification from connectiontutility - * - */ - void IapChangedL(); - - public: // from MVcxMyVideosTimer - /** - * Handle timer event. - * - * @param aTimer pointer to timer which expired. - */ - void TimerExpired( CVcxMyVideosTimer* aTimer ); - - private: - /** - * Constructor - * - * @param aObserver Observer - * @param aFs File server session. - */ - CVcxMyVideosDownloadUtil( MVcxMyVideosDownloadUtilObserver& aObserver, RFs& aFs ); - - /** - * Symbian 2nd phase constructor. - */ - void ConstructL (); - -#ifdef _DEBUG - const TDesC& GetS60DlStateDes( TInt32 aState ); - const TDesC& GetS60DlProgressDes( TInt32 aProgress ); -#endif - - /** - * Signal via mediator event that there is ongoing downloads. - */ - void NotifyDownloadStarted(); - - /** - * Check, is there running downloads. If not, notify via mediator - */ - void NotifyIfNoActiveDownloads(); - - /** - * Counts active downloads. - * @return Active download count. - */ - TInt32 ActiveDownloadCount(); - - /** - * Creates filepath. - * - * @param aMedia Media item whose path is created - * @param aPath New path is written here. - * @param aCounter Counter value which is inserted to filename. - */ - void GeneratePathL( const CMPXMedia& aMedia, TDes& aPath, TInt aCounter ); - - /** - * Finds a sub dir which has less than KVcxMaxItemsInDir items, if not - * found, creates one. The result is stored to iSubDir. - * - * @param aPath path - */ - void FindSubDirL( const TDesC& aPath ); - - /** - * Calculates entries from the path. - * - * @param aPath Path. - * @returm Entrycount on the path. - */ - TInt FileCountL( const TDesC& aPath ); - - /** - * Returns the drive section of the file path, - * according to preferred cenrep setting. If drive - * is locked or not present, the next available drive is - * tried. If no available drives found, system drive is used. - * Stores value to iPreferredMemoryDrivePath. - * - * @return The drive section of the file path. - */ - const TDesC& UsedMemoryDesL(); - - /** - * Stops iDownloadProgressTimer. - */ - void StopProgressTimer(); - - /** - * Starts iDownloadProgressTimer. - */ - void StartProgressTimer(); - - private: //data - - /** - * S60 Download manager client object. - */ - RHttpDownloadMgr iDownloadManager; - - /** - * Storage class for user name, used for 16->8 bit conversion. - * This is member variable to reduce stack usage. - */ - TBuf8 iUserName; - - /** - * Storage class for password, used for 16->8 bit conversion. - * This is member variable to reduce stack usage. - */ - TBuf8 iPassword; - - /** - * Storage class for url, used for 16->8 bit conversion. - * This is member variable to reduce stack usage. - */ - TBuf8 iUrl; - - /** - * Observer of this class. - */ - MVcxMyVideosDownloadUtilObserver& iObserver; - - /** - * Used to delete download asynchronously, own. - */ - CVcxMyVideosTimer* iDownloadDeleteTimer; - - /** - * Used to update download progresses, own. - */ - CVcxMyVideosTimer* iDownloadProgressTimer; - - /** - * Downloads which are deleted asynchronously are stored here. - */ - RArray iDownloadsToDelete; - - /** - * Delete content flags for async download delete are stored here. - */ - RArray iDeleteContent; - - /** - * connectionutility - */ - CVcxConnectionUtility* iConnUtil; - - /** - * iMediatorEventProvider - */ - CMediatorEventProvider* iMediatorEventProvider; - - /** - * IAP currently set to Download Manager. - * is used to avoid new set if IAP is the same already. - */ - TUint32 iCurrentIap; - - /** - * Used for storing the drive section of the path, - * c:, e:, etc. - */ - TBuf<2> iUsedMemoryDrivePath; - - /** - * Drive used for downloading. - */ - TInt iUsedDrive; - - /** - * Fileserver session. - */ - RFs& iFs; - - /** - * SubDir is stored here. - */ - TBuf iSubDir; - - /** - * Flag that tells do we really have a roaming situation. - */ - TBool iRoamingOngoing; - }; - -#endif // VCXMYVIDEOSDOWNLOADUTIL_H diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/download/src/vcxmyvideosdownloadutil.cpp --- a/videocollection/mpxmyvideoscollection/download/src/vcxmyvideosdownloadutil.cpp Tue May 25 12:44:54 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1354 +0,0 @@ -/* -* 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: -* -*/ - - - - -// INCLUDE FILES -#include -#include -#include -#include -#include -#include -#include -#include - -#include "vcxmyvideosdownloadutil.h" //this has to be before vcxconnectionutility.h -#include - -#include -#include -#include -#include -#include -#include -#include "vcxmyvideosdrivemonitor.h" - -// CONSTANTS -#ifdef _DEBUG -_LIT(KVcxHttpDlCreatedDes, "DlCreated"); -_LIT(KVcxHttpDlInprogressDes, "DlInprogress"); -_LIT(KVcxHttpDlPausedDes, "DlPaused"); -_LIT(KVcxHttpDlCompletedDes, "DlCompleted"); -_LIT(KVcxHttpDlFailedDes, "DlFailed"); -_LIT(KVcxHttpDlMovedDes, "DlMoved"); -_LIT(KVcxHttpDlMediaRemovedDes, "DlMediaRemoved"); -_LIT(KVcxHttpDlMediaInsertedDes, "DlMediaInserted"); -_LIT(KVcxHttpDlPausableDes, "DlPausable"); -_LIT(KVcxHttpDlNonPausableDes, "DlNonPausable"); -_LIT(KVcxHttpDlDeletedDes, "DlDeleted"); -_LIT(KVcxHttpDlAlreadyRunningDes, "DlAlreadyRunning"); -_LIT(KVcxHttpDlDeletingDes, "DlDeleting"); -_LIT(KVcxHttpDlMultipleMOStartedDes, "DlMultipleMOStarted"); -_LIT(KVcxHttpDlMultipleMOCompletedDes, "DlMultipleMOCompleted"); -_LIT(KVcxHttpDlMultipleMOFailedDes, "DlMultipleMOFailed"); - -_LIT(KVcxUnknownStateDes, "UnknownStateDes"); - - -_LIT(KVcxHttpProgNoneDes, "ProgNone"); -_LIT(KVcxHttpStartedDes, "Started"); -_LIT(KVcxHttpProgCreatingConnectionDes, "ProgCreatingConnection"); -_LIT(KVcxHttpProgConnectionNeededDes, "ProgConnectionNeeded"); -_LIT(KVcxHttpProgConnectedDes, "ProgConnected"); -_LIT(KVcxHttpProgConnectionSuspendedDes, "ProgConnectionSuspended"); -_LIT(KVcxHttpProgDisconnectedDes, "ProgDisconnected"); -_LIT(KVcxHttpProgDownloadStartedDes, "ProgDownloadStarted"); -_LIT(KVcxHttpContentTypeRequestedDes, "ContentTypeRequested"); -_LIT(KVcxHttpContentTypeReceivedDes, "ContentTypeReceived"); -_LIT(KVcxHttpProgSubmitIssuedDes, "ProgSubmitIssued"); -_LIT(KVcxHttpProgResponseHeaderReceivedDes, "ProgResponseHeaderReceived"); -_LIT(KVcxHttpProgResponseBodyReceivedDes, "ProgResponseBodyReceived"); -_LIT(KVcxHttpProgRedirectedPermanentlyDes, "ProgRedirectedPermanently"); -_LIT(KVcxHttpProgRedirectedTemporarilyDes, "ProgRedirectedTemporarily"); -_LIT(KVcxHttpProgDlNameChangedDes, "ProgDlNameChanged"); -_LIT(KVcxHttpProgContentTypeChangedDes, "ProgContentTypeChanged"); -_LIT(KVcxHttpProgCodDescriptorDownloadedDes, "ProgCodDescriptorDownloaded"); -_LIT(KVcxHttpProgCodDownloadStartedDes, "ProgCodDownloadStarted"); -_LIT(KVcxHttpProgCodDescriptorAcceptedDes, "ProgCodDescriptorAccepted"); -_LIT(KVcxHttpProgCodLoadEndDes, "ProgCodLoadEnd"); -_LIT(KVcxHttpProgSupportedMultiPartDes, "ProgSupportedMultiPart"); -_LIT(KVcxHttpProgMovingContentFileDes, "ProgMovingContentFile"); -_LIT(KVcxHttpProgContentFileMovedDes, "ProgContentFileMoved"); -_LIT(KVcxUnknownProgressDes, "UnknownProgress"); -#endif - -const TInt KMaxPathLength = 255; - -_LIT( KVcxExtensionDcf, ".dcf" ); -_LIT( KVcxExtensionOcf, ".odf" ); -_LIT( KVcxExtensionDm, ".dm" ); -_LIT( KVcxExtensionMp4, ".mp4" ); -_LIT( KVcxExtensionMpeg4, ".mpeg4" ); -_LIT( KVcxExtensionM4v, ".m4v" ); -_LIT( KVcxExtension3gpp, ".3gpp" ); -_LIT( KVcxExtension3gp, ".3gp" ); -_LIT( KVcxExtensionRm, ".rm" ); -_LIT( KVcxExtensionMpg4, ".mpg4" ); -_LIT( KVcxExtensionRmvb, ".rmvb" ); -_LIT( KVcxExtension3g2, ".3g2" ); -_LIT( KVcxExtensionWmv, ".wmv" ); -_LIT( KVcxExtensionAsf, ".asf" ); - -// ============================ MEMBER FUNCTIONS ============================== - -// ---------------------------------------------------------------------------- -// Two-phased constructor. -// ---------------------------------------------------------------------------- -// -CVcxMyVideosDownloadUtil* CVcxMyVideosDownloadUtil::NewL( - MVcxMyVideosDownloadUtilObserver& aObserver, RFs& aFs ) - { - MPX_FUNC("CVcxMyVideosDownloadUtil::NewL"); - - CVcxMyVideosDownloadUtil* self = new (ELeave) CVcxMyVideosDownloadUtil( aObserver, aFs ); - CleanupStack::PushL(self); - self->ConstructL(); - CleanupStack::Pop(self); - return self; - } - -// ---------------------------------------------------------------------------- -// Destructor. -// ---------------------------------------------------------------------------- -// -CVcxMyVideosDownloadUtil::~CVcxMyVideosDownloadUtil() - { - MPX_FUNC("CVcxMyVideosDownloadUtil::~CVcxMyVideosDownloadUtil"); - iDownloadManager.Disconnect(); //disconnects all downloads and puts them to pause - iDownloadManager.Close(); - delete iDownloadDeleteTimer; - iDownloadsToDelete.Close(); - iDeleteContent.Close(); - - if ( iConnUtil ) - { - iConnUtil->RemoveObserver( this ); - iConnUtil->DecreaseReferenceCount(); - } - - delete iMediatorEventProvider; - delete iDownloadProgressTimer; - } - -// ---------------------------------------------------------------------------- -// Constructor. -// ---------------------------------------------------------------------------- -// -CVcxMyVideosDownloadUtil::CVcxMyVideosDownloadUtil( - MVcxMyVideosDownloadUtilObserver& aObserver, RFs& aFs ) -: iObserver( aObserver ), iFs( aFs ) - { - MPX_FUNC("CVcxMyVideosDownloadUtil::CVcxMyVideosDownloadUtil"); - } - -// ---------------------------------------------------------------------------- -// Symbian 2nd phase constructor can leave. -// ---------------------------------------------------------------------------- -// -void CVcxMyVideosDownloadUtil::ConstructL () - { - MPX_FUNC("CVcxMyVideosDownloadUtil::ConstructL"); - - TUid uid = TUid::Uid( KVcxUidMyVideosMpxCollection ); - - iDownloadManager.ConnectL( uid, *this, ETrue ); - - iDownloadDeleteTimer = CVcxMyVideosTimer::NewL( 0, *this ); - iDownloadProgressTimer = CVcxMyVideosTimer::NewL( 0, *this ); - - iDownloadsToDelete.Reset(); - iDeleteContent.Reset(); - - iConnUtil = CVcxConnectionUtility::InstanceL(); - iConnUtil->RegisterObserverL( this ); - - iMediatorEventProvider = CMediatorEventProvider::NewL(); - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::StartDownloadL -// ---------------------------------------------------------------------------- -// -void CVcxMyVideosDownloadUtil::StartDownloadL( CMPXMedia& aDownload ) - { - MPX_FUNC("CVcxMyVideosDownloadUtil::StartDownloadL"); - // Requesting a new connection, update state - iRoamingOngoing = EFalse; - TInt err( KErrNone ); - - TUint32 iap( 0 ); - iap = *(aDownload.Value( KVcxMediaMyVideosIapId )); - - if( !iap ) - { - // no iap gotten yet. Use connectionutility to get one - err = iConnUtil->GetIap( iap, EFalse ); - - if( err != KErrNone || iap == 0 ) - { - MPX_DEBUG2("CVcxMyVideosDownloadUtil:: failed to get IAP from connectionutility: %d", err); - User::Leave( KErrCancel ); - } - } - - //if not set, the default is used from commsdb - - if ( iap != iCurrentIap ) - { - err = iDownloadManager.SetIntAttribute( EDlMgrIap, iap ); - } - - iCurrentIap = iap; - - if ( err != KErrNone ) - { - MPX_DEBUG2("CVcxMyVideosDownloadUtil:: failed to set IAP: %d", err); - } - - TMPXItemId mpxId = aDownload.ValueTObjectL( KMPXMediaGeneralId ); - - MPX_DEBUG2( "URL = %S", &(aDownload.ValueText( KVcxMediaMyVideosRemoteUrl )) ); - MPX_DEBUG2( "Username = %S", &(aDownload.ValueText( KVcxMediaMyVideosUsername )) ); - MPX_DEBUG2( "Password = %S", &(aDownload.ValueText( KVcxMediaMyVideosPassword )) ); - MPX_DEBUG2( "Filename = %S", &(aDownload.ValueText( KMPXMediaGeneralUri )) ); - MPX_DEBUG2( "IAP ID = %d", *(aDownload.Value( KVcxMediaMyVideosIapId )) ); - MPX_DEBUG2( "MDS ID = %d", mpxId.iId1 ); - - iUrl.Copy( aDownload.ValueText( KVcxMediaMyVideosRemoteUrl ) ); - - TInt32 downloadId = 0; - - // try to get download id from the download request - if ( aDownload.IsSupported(KVcxMediaMyVideosDownloadId) ) - { - MPX_DEBUG1("CVcxMyVideosDownloadUtil:: dl id is supported"); - downloadId = static_cast( - aDownload.ValueTObjectL( KVcxMediaMyVideosDownloadId )); - if ( downloadId != 0 ) - { - MPX_DEBUG1("CVcxMyVideosDownloadUtil:: dl id found -> resuming download"); - } - } - - if ( downloadId == 0 ) - { - MPX_DEBUG1("CVcxMyVideosDownloadUtil:: creating download"); - RHttpDownload& dl = iDownloadManager.CreateDownloadL( iUrl ); - dl.GetIntAttribute( EDlAttrId, downloadId ); - } - - RHttpDownload* download = Download( downloadId ); - - if ( !download ) - { - MPX_DEBUG1("CVcxMyVideosDownloadUtil:: no download found"); - User::Leave( KErrNotFound ); - } - - CnvUtfConverter::ConvertFromUnicodeToUtf8(iUserName, - aDownload.ValueText( KVcxMediaMyVideosUsername ) ); - CnvUtfConverter::ConvertFromUnicodeToUtf8(iPassword, - aDownload.ValueText( KVcxMediaMyVideosPassword ) ); - download->SetStringAttribute( EDlAttrDestFilename, - aDownload.ValueText( KMPXMediaGeneralUri ) ); - download->SetStringAttribute( EDlAttrUsername, iUserName ); - download->SetStringAttribute( EDlAttrPassword, iPassword ); - download->SetBoolAttribute( EDlAttrSilent, EFalse) ; - download->SetBoolAttribute( EDlAttrNoContentTypeCheck, ETrue ); - - err = download->Start(); - - if ( err != KErrNone ) - { - MPX_DEBUG2("CVcxMyVideosDownloadUtil:: could not start download: %d", err); - } - - aDownload.SetTObjectValueL( KVcxMediaMyVideosDownloadId, downloadId ); - - if( !err ) - { - NotifyDownloadStarted(); - StartProgressTimer(); - } - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::PauseDownload -// ---------------------------------------------------------------------------- -// -TInt CVcxMyVideosDownloadUtil::PauseDownload( TUint32 aDownloadId ) - { - RHttpDownload* download = Download( aDownloadId ); - - if ( !download ) - { - MPX_DEBUG1("CVcxMyVideosDownloadUtil:: no download found"); - return KErrNotFound; - } - - return download->Pause(); - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::HandleDMgrEventL -// ---------------------------------------------------------------------------- -// -void CVcxMyVideosDownloadUtil::HandleDMgrEventL( RHttpDownload& aDownload, - THttpDownloadEvent aEvent ) - { - MPX_FUNC("CVcxMyVideosDownloadUtil::HandleDMgrEventL"); - - TInt32 downloadId; - aDownload.GetIntAttribute( EDlAttrId, downloadId ); - -#ifdef _DEBUG - - MPX_DEBUG4("CVcxMyVideosDownloadUtil::HandleDMgrEventL(DL ID: %d, %S, %S)", - downloadId, - &GetS60DlProgressDes(aEvent.iProgressState), - &GetS60DlStateDes(aEvent.iDownloadState)); - - if ( aEvent.iProgressState == EHttpContentTypeReceived ) - { - const TInt debugBufMaxSize = 255; - TBuf contentType; - aDownload.GetStringAttribute( EDlAttrContentType, contentType ); - MPX_DEBUG2("CVcxMyVideosDownloadUtil:: Content type = %S", &contentType); - } -#endif - - TInt8 progress( 0 ); - TUint64 downloaded( 0 ); - - TInt32 remoteFileSize; - aDownload.GetIntAttribute( EDlAttrLength, remoteFileSize ); - - if ( remoteFileSize > 0 ) - { - TBool silent; - aDownload.GetBoolAttribute( EDlAttrSilent, silent ); - TBool progressive; - aDownload.GetBoolAttribute( EDlAttrProgressive, progressive ); - if ( !silent && !progressive ) - { - // remote file size received, we can set download to silent mode. - MPX_DEBUG2("CVcxMyVideosDownloadUtil:: setting download %d to silent mode", downloadId); - aDownload.SetBoolAttribute( EDlAttrSilent, ETrue ); - } - - if ( silent && progressive ) - { - aDownload.SetBoolAttribute( EDlAttrSilent, EFalse ); - } - - progress = DownloadProgress( aDownload, downloaded, EFalse ); - } - - TVcxMyVideosDownloadState state; - - switch ( aEvent.iDownloadState ) - { - case EHttpDlPaused: - { - state = EVcxMyVideosDlStatePaused; - iObserver.HandleDlEvent( state, static_cast(downloadId), - progress, downloaded, 0, 0 ); - NotifyIfNoActiveDownloads(); - StopProgressTimer(); - } - break; - - case EHttpDlCompleted: - case EHttpDlMultipleMOCompleted: - state = EVcxMyVideosDlStateDownloaded; - iObserver.HandleDlEvent( - state, static_cast(downloadId), progress, downloaded, 0, 0 ); - DeleteDownloadAsync( downloadId, EFalse /* dont delete content */ ); - StopProgressTimer(); - break; - - case EHttpDlFailed: - case EHttpDlMultipleMOFailed: - { - TInt32 errorId; - TInt32 globalErrorId; - aDownload.GetIntAttribute( EDlAttrErrorId, errorId ); - aDownload.GetIntAttribute( EDlAttrGlobalErrorId, globalErrorId ); - MPX_DEBUG2("CVcxMyVideosDownloadUtil:: DL error ID: %d", errorId); - MPX_DEBUG2("CVcxMyVideosDownloadUtil:: DL global error ID: %d", globalErrorId); - - state = EVcxMyVideosDlStateFailed; - iObserver.HandleDlEvent( - state, - static_cast(downloadId), - progress, - downloaded, - errorId, - globalErrorId ); - NotifyIfNoActiveDownloads(); - StopProgressTimer(); - } - break; - - - case EHttpDlCreated: - case EHttpDlInprogress: - case EHttpDlMultipleMOStarted: - iObserver.HandleDlEvent( EVcxMyVideosDlStateDownloading, - static_cast(downloadId), progress, downloaded, 0, 0 ); - StartProgressTimer(); - break; - - /// Download is going to be deleted. Cancel or download complete will trigger this. - case EHttpDlDeleting: - /// Download is deleted from another client instance. Normally not received, included here just to be sure. - case EHttpDlDeleted: - { - NotifyIfNoActiveDownloads(); - StopProgressTimer(); - } - break; - - /// download is moved from one client instance to another one. - case EHttpDlMoved: - /// MMC card or other storage media is removed from the phone. - case EHttpDlMediaRemoved: - /** MMC card or other storage media inserted and - * downloaded content file found on it. - * If MMC card inserted, but (partially) downloaded content file - * is not found on it, download is failed with error reason - * EContentFileIntegrity. */ - case EHttpDlMediaInserted: - /** Download process can be paused again. This event only occurs after - * EHttpDlNonPausable. */ - case EHttpDlPausable: - /// Download process cannot be paused, or the content will be lost. - case EHttpDlNonPausable: - /// Download is started when it's already progressing - case EHttpDlAlreadyRunning: - /// Internally used download event. Do NOT deal with them - case EHttpDlCancelTransaction: - - default: - break; - } - - } - -// --------------------------------------------------------- -// CVcxMyVideosDownloadUtil::Download -// --------------------------------------------------------- -// -RHttpDownload* CVcxMyVideosDownloadUtil::Download( TUint32 aDownloadId ) - { - if ( aDownloadId == 0 ) - { - return NULL; - } - - TInt count = iDownloadManager.CurrentDownloads().Count(); - TInt i; - TInt32 downloadId; - - for ( i = 0; i < count; i++ ) - { - iDownloadManager.CurrentDownloads()[i]->GetIntAttribute( EDlAttrId, downloadId ); - if ( downloadId == aDownloadId ) - { - return iDownloadManager.CurrentDownloads()[i]; - } - } - - MPX_DEBUG2("CVcxMyVideosDownloadUtil:: no download found with %d ID", aDownloadId); - return NULL; - } - -// --------------------------------------------------------- -// CVcxMyVideosDownloadUtil::Download -// --------------------------------------------------------- -// -RHttpDownload* CVcxMyVideosDownloadUtil::Download( const TDesC& aFileName ) - { - MPX_FUNC("CVcxMyVideosDownloadUtil::Download()"); - - TInt count = iDownloadManager.CurrentDownloads().Count(); - TInt i; - - for ( i = 0; i < count; i++ ) - { - const TInt KMaxFileNameLength = 256; - TBuf fileName; - iDownloadManager.CurrentDownloads()[i]->GetStringAttribute( EDlAttrDestFilename, fileName ); - - MPX_DEBUG3("CVcxMyVideosDownloadUtil:: download[%d] filename = %S", i, &fileName); - - if ( aFileName == fileName ) - { - return iDownloadManager.CurrentDownloads()[i]; - } - } - - MPX_DEBUG2("CVcxMyVideosDownloadUtil:: no download found with %S filename", &aFileName); - return NULL; - } - -// --------------------------------------------------------- -// CVcxMyVideosDownloadUtil::Downloads -// --------------------------------------------------------- -// -const CDownloadArray& CVcxMyVideosDownloadUtil::Downloads() - { - return iDownloadManager.CurrentDownloads(); - } - -// --------------------------------------------------------- -// CVcxMyVideosDownloadUtil::CancelDownload -// --------------------------------------------------------- -// -TInt CVcxMyVideosDownloadUtil::CancelDownload( TInt32 aId, TBool aDeleteContent ) - { - MPX_FUNC("CVcxMyVideosDownloadUtil::CancelDownload"); - - if ( iDownloadManager.CurrentDownloads().Count() < 1 ) - { - return KErrNotFound; - } - - RHttpDownload* download = Download( aId ); - - if ( !download ) - { - return KErrNotFound; - } - - MPX_DEBUG1("CVcxMyVideosDownloadUtil:: setting download to non silent mode"); - download->SetBoolAttribute( EDlAttrSilent, EFalse ); - - if ( aDeleteContent ) - { - MPX_DEBUG1("CVcxMyVideosDownloadUtil:: deleting content"); - download->Reset(); - } - - MPX_DEBUG1("CVcxMyVideosDownloadUtil:: deleting download from dl manager"); - download->Delete(); - - return KErrNone; - } - -// ----------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::RequestIsRoamingAllowedL -// ----------------------------------------------------------------------------- -// -TBool CVcxMyVideosDownloadUtil::RequestIsRoamingAllowedL() - { - MPX_FUNC("CVcxMyVideosDownloadUtil::RequestIsRoamingAllowedL"); - iDownloadManager.Disconnect(); - iRoamingOngoing = ETrue; - return ETrue; - } - -// ----------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::IapChangedL -// ----------------------------------------------------------------------------- -// -void CVcxMyVideosDownloadUtil::IapChangedL() - { - MPX_FUNC("CVcxMyVideosDownloadUtil::IapChangedL"); - if ( !iRoamingOngoing ) - { - // This is not roaming situation, must not call GetIap() - return; - } - iRoamingOngoing = EFalse; - TUint32 iap( 0 ); - TInt err = iConnUtil->GetIap( iap, EFalse ); - if ( err == KErrNone ) - { - iDownloadManager.SetIntAttribute( EDlMgrIap, iap ); - // Since download pause state is always result of download manager, not from user, - // we can resume all - iDownloadManager.StartAll(); - } - else - { - MPX_DEBUG2("CVcxMyVideosDownloadUtil::IapChangedL failed to get IAP from connectionutility: %d", err); - } - } - -// ----------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::GetDownloadState -// Gets MPX/MDS version of the download state. -// ----------------------------------------------------------------------------- -// -void CVcxMyVideosDownloadUtil::GetDownloadState( - RHttpDownload& aDownload, - TVcxMyVideosDownloadState& aDownloadState ) - { - TInt32 dlStateInDlManager; - aDownload.GetIntAttribute( EDlAttrState, dlStateInDlManager ); - - switch( dlStateInDlManager ) - { - case EHttpDlPaused: - aDownloadState = EVcxMyVideosDlStatePaused; - break; - - case EHttpDlCompleted: - aDownloadState = EVcxMyVideosDlStateDownloaded; - break; - - case EHttpDlFailed: - aDownloadState = EVcxMyVideosDlStateFailed; - break; - - case EHttpDlCreated: - case EHttpDlInprogress: - aDownloadState = EVcxMyVideosDlStateDownloading; - break; - - default: - aDownloadState = EVcxMyVideosDlStateNone; - break; - } - } - -// ----------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::DownloadProgress -// ----------------------------------------------------------------------------- -// -TInt8 CVcxMyVideosDownloadUtil::DownloadProgress( RHttpDownload& aDownload, TUint64& aDownloaded, - TBool aAllowSilentReset ) - { - TInt64 downloaded; - TInt32 fullSize; - - TBool isProgressive; - aDownload.GetBoolAttribute( EDlAttrProgressive, isProgressive ); - - if ( isProgressive ) - { - // this doesn't work if download is in silent mode - // unless it is in progressive mode - TInt32 downloaded32; - aDownload.GetIntAttribute( EDlAttrDownloadedSize, downloaded32 ); - downloaded = downloaded32; - } - else - { - const TInt KMaxFileNameLength = 256; - TBuf fileName; - aDownload.GetStringAttribute( EDlAttrDestFilename, fileName ); - - TEntry entry; - TInt err = iFs.Entry( fileName, entry ); - - if ( err != KErrNone ) - { - MPX_DEBUG1("CVcxMyVideosDownloadUtil:: Could not find file entry."); - aDownloaded = 0; - return 0; - } - - downloaded = entry.iSize; - } - - aDownload.GetIntAttribute( EDlAttrLength, fullSize ); - - if( aAllowSilentReset && fullSize == KErrNotFound ) - { - - TBool silent; - aDownload.GetBoolAttribute( EDlAttrSilent, silent ) ; - if ( silent ) - { - // if file size has corrupted, remove silent mode so that - // HandleDlMgrEvent can refresh size. This happens, in case - // we resume dl which have to start from the beginning - aDownload.SetBoolAttribute( EDlAttrSilent, EFalse ); - } - } - TInt64 progress64( 0 ); - aDownloaded = downloaded; - TInt64 fullsize64( fullSize ); - - if ( fullsize64 > 0 ) - { - progress64 = 100 * aDownloaded / fullsize64; - } - - return static_cast( progress64 ); - } - -#ifdef _DEBUG -// ----------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::GetS60DlStateDes -// ----------------------------------------------------------------------------- -// -const TDesC& CVcxMyVideosDownloadUtil::GetS60DlStateDes( TInt32 aState ) - { - switch ( aState ) - { - case EHttpDlCreated: - return KVcxHttpDlCreatedDes; - - case EHttpDlInprogress: - return KVcxHttpDlInprogressDes; - - case EHttpDlPaused: - return KVcxHttpDlPausedDes; - - case EHttpDlCompleted: - return KVcxHttpDlCompletedDes; - - case EHttpDlFailed: - return KVcxHttpDlFailedDes; - - case EHttpDlMoved: - return KVcxHttpDlMovedDes; - - case EHttpDlMediaRemoved: - return KVcxHttpDlMediaRemovedDes; - - case EHttpDlMediaInserted: - return KVcxHttpDlMediaInsertedDes; - - case EHttpDlPausable: - return KVcxHttpDlPausableDes; - - case EHttpDlNonPausable: - return KVcxHttpDlNonPausableDes; - - case EHttpDlDeleted: - return KVcxHttpDlDeletedDes; - - case EHttpDlAlreadyRunning: - return KVcxHttpDlAlreadyRunningDes; - - case EHttpDlDeleting: - return KVcxHttpDlDeletingDes; - - case EHttpDlMultipleMOStarted: - return KVcxHttpDlMultipleMOStartedDes; - - case EHttpDlMultipleMOCompleted: - return KVcxHttpDlMultipleMOCompletedDes; - - case EHttpDlMultipleMOFailed: - return KVcxHttpDlMultipleMOFailedDes; - - default: - return KVcxUnknownStateDes; - } - } - -// ----------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::GetS60DlProgressDes -// ----------------------------------------------------------------------------- -// -const TDesC& CVcxMyVideosDownloadUtil::GetS60DlProgressDes( TInt32 aProgress ) - { - switch ( aProgress ) - { - case EHttpProgNone: - return KVcxHttpProgNoneDes; - - case EHttpStarted: - return KVcxHttpStartedDes; - - case EHttpProgCreatingConnection: - return KVcxHttpProgCreatingConnectionDes; - - case EHttpProgConnectionNeeded: - return KVcxHttpProgConnectionNeededDes; - - case EHttpProgConnected: - return KVcxHttpProgConnectedDes; - - case EHttpProgConnectionSuspended: - return KVcxHttpProgConnectionSuspendedDes; - - case EHttpProgDisconnected: - return KVcxHttpProgDisconnectedDes; - - case EHttpProgDownloadStarted: - return KVcxHttpProgDownloadStartedDes; - - case EHttpContentTypeRequested: - return KVcxHttpContentTypeRequestedDes; - - case EHttpContentTypeReceived: - return KVcxHttpContentTypeReceivedDes; - - case EHttpProgSubmitIssued: - return KVcxHttpProgSubmitIssuedDes; - - case EHttpProgResponseHeaderReceived: - return KVcxHttpProgResponseHeaderReceivedDes; - - case EHttpProgResponseBodyReceived: - return KVcxHttpProgResponseBodyReceivedDes; - - case EHttpProgRedirectedPermanently: - return KVcxHttpProgRedirectedPermanentlyDes; - - case EHttpProgRedirectedTemporarily: - return KVcxHttpProgRedirectedTemporarilyDes; - - case EHttpProgDlNameChanged: - return KVcxHttpProgDlNameChangedDes; - - case EHttpProgContentTypeChanged: - return KVcxHttpProgContentTypeChangedDes; - - case EHttpProgCodDescriptorDownloaded: - return KVcxHttpProgCodDescriptorDownloadedDes; - - case EHttpProgCodDownloadStarted: - return KVcxHttpProgCodDownloadStartedDes; - - case EHttpProgCodDescriptorAccepted: - return KVcxHttpProgCodDescriptorAcceptedDes; - - case EHttpProgCodLoadEnd: - return KVcxHttpProgCodLoadEndDes; - - case EHttpProgSupportedMultiPart: - return KVcxHttpProgSupportedMultiPartDes; - - case EHttpProgMovingContentFile: - return KVcxHttpProgMovingContentFileDes; - - case EHttpProgContentFileMoved: - return KVcxHttpProgContentFileMovedDes; - - default: - return KVcxUnknownProgressDes; - } - } -#endif - -// ----------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::DeleteDownloadAsync -// ----------------------------------------------------------------------------- -// -void CVcxMyVideosDownloadUtil::DeleteDownloadAsync( TInt32 aDownloadId, TBool aDeleteContent ) - { - iDownloadsToDelete.Append( aDownloadId ); - iDeleteContent.Append( aDeleteContent ); - if ( !iDownloadDeleteTimer->IsActive() ) - { - iDownloadDeleteTimer->After( 0 ); - } - } - -// ----------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::TimerExpired -// ----------------------------------------------------------------------------- -// -void CVcxMyVideosDownloadUtil::TimerExpired( CVcxMyVideosTimer* aTimer ) - { - if ( aTimer == iDownloadDeleteTimer ) - { - for ( TInt i = 0; i < iDownloadsToDelete.Count(); i++ ) - { - CancelDownload( iDownloadsToDelete[i], iDeleteContent[i] ); - } - iDownloadsToDelete.Reset(); - iDeleteContent.Reset(); - return; - } - - if ( aTimer == iDownloadProgressTimer ) - { - const CDownloadArray& downloads = Downloads(); - - TInt count( downloads.Count() ); - TInt32 downloadId; - TInt8 progress( 0 ); - TUint64 downloaded; - TVcxMyVideosDownloadState downloadState; - - for ( TInt i = 0; i < count; i++ ) - { - GetDownloadState( *(downloads[i]), downloadState ); - if ( downloadState == EVcxMyVideosDlStateDownloading || - downloadState == EVcxMyVideosDlStatePaused ) - { - downloads[i]->GetIntAttribute( EDlAttrId, downloadId ); - progress = DownloadProgress( *(downloads[i]), downloaded, - ( downloadState == EVcxMyVideosDlStateDownloading ) ); - iObserver.HandleDlEvent( downloadState, - static_cast(downloadId), progress, downloaded, 0, 0 ); - } - } - NotifyIfNoActiveDownloads(); // Handles connection lost etc. state updates correctly. - StartProgressTimer(); - return; - } - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::ClearOrphanDownloadsL -// ---------------------------------------------------------------------------- -// -void CVcxMyVideosDownloadUtil::ClearOrphanDownloadsL( CMPXMedia& aVideoList ) - { - MPX_FUNC("CVcxMyVideosDownloadUtil::ClearOrphanDownloadsL"); - - const CDownloadArray& downloads = Downloads(); - - CMPXMediaArray* videoArray = aVideoList.Value( - KMPXMediaArrayContents); - - TBool found; - TInt32 downloadId; - - for ( TInt i = 0; i < downloads.Count(); i++ ) - { - downloads[i]->GetIntAttribute( EDlAttrId, downloadId ); - found = EFalse; - for ( TInt j = 0; j < videoArray->Count(); j++ ) - { - if ( (*videoArray)[j]->IsSupported( KVcxMediaMyVideosDownloadId )) - { - if ( (*videoArray)[j]->ValueTObjectL( KVcxMediaMyVideosDownloadId ) == - downloadId ) - { - found = ETrue; - break; - } - } - } - if ( !found ) - { - MPX_DEBUG2("CVcxMyVideosDownloadUtil:: download id (%d) not found from MPX/MDS, deleting download!", downloadId ); - CancelDownload( downloadId, ETrue /* delete content */); - } - } - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::NotifyDownloadStarted -// ---------------------------------------------------------------------------- -// -void CVcxMyVideosDownloadUtil::NotifyDownloadStarted() - { - iMediatorEventProvider->RaiseEvent( TUid::Uid( KVcxNsMpxMediatorDomain ), - TUid::Uid( KVcxNsMpxMediatorCategory ), - KVcxNsMpxEventDownloadStarted , - TVersion( KVcxNsMpxEventVersion, 0, 0 ), - KNullDesC8() ); - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::NotifyIfNoActiveDownloads -// ---------------------------------------------------------------------------- -// -void CVcxMyVideosDownloadUtil::NotifyIfNoActiveDownloads() - { - if ( !ActiveDownloadCount() ) - { - iMediatorEventProvider->RaiseEvent( TUid::Uid( KVcxNsMpxMediatorDomain ), - TUid::Uid( KVcxNsMpxMediatorCategory ), - KVcxNsMpxEventAllDownloadsEnded, - TVersion( KVcxNsMpxEventVersion, 0, 0 ), - KNullDesC8() ); - } - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::NotifyDownloadCompleted -// ---------------------------------------------------------------------------- -// -void CVcxMyVideosDownloadUtil::NotifyDownloadCompleted( const TDesC8& aMsg ) - { - iMediatorEventProvider->RaiseEvent( TUid::Uid( KVcxNsMpxMediatorDomain ), - TUid::Uid( KVcxNsMpxMediatorCategory ), - KVcxNsMpxEventDownloadCompleted, - TVersion( KVcxNsMpxEventVersion, 0, 0 ), - aMsg ); - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::NotifyNewVideosCountDecreased -// ---------------------------------------------------------------------------- -// -void CVcxMyVideosDownloadUtil::NotifyNewVideosCountDecreased( const TDesC8& aMsg ) - { - iMediatorEventProvider->RaiseEvent( TUid::Uid( KVcxNsMpxMediatorDomain ), - TUid::Uid( KVcxNsMpxMediatorCategory ), - KVcxNsMpxEventNewVideosCountDecreased, - TVersion( KVcxNsMpxEventVersion, 0, 0 ), - aMsg ); - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::ActiveDownloadCount -// ---------------------------------------------------------------------------- -// -TInt32 CVcxMyVideosDownloadUtil::ActiveDownloadCount() - { - const CDownloadArray& dlarray = Downloads(); - - TInt32 dlCount( 0 ); - - TVcxMyVideosDownloadState state; - - for ( TInt i = dlarray.Count() - 1; i >=0; i-- ) - { - GetDownloadState( *(dlarray[i]), state ); - - if( state == EVcxMyVideosDlStateDownloading ) - { - dlCount++; - } - } - return dlCount; - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::CreateFilePathL -// ---------------------------------------------------------------------------- -// -HBufC* CVcxMyVideosDownloadUtil::CreateFilePathL( const CMPXMedia& aMedia ) - { - MPX_FUNC("CVcxMyVideosDownloadUtil::CreateFilePathL"); - - HBufC* path = HBufC::NewL( KMaxPathLength ); - CleanupStack::PushL( path ); // 1-> - - TPtr pathPtr( path->Des() ); - - UsedMemoryDesL(); // generates new value to iUsedMemoryDrivePath - - iSubDir.Zero(); - - TInt counter = 0; - GeneratePathL( aMedia, pathPtr, counter ); - - while( BaflUtils::FileExists( iFs, pathPtr ) ) - { - GeneratePathL( aMedia, pathPtr, ++counter ); - } - - TText badChar( ' ' ); - TInt badCharLoc( KErrNotFound ); - while ( ! iFs.IsValidName( pathPtr, badChar ) ) - { - if ( badChar != ' ' ) - { - badCharLoc = pathPtr.LocateReverse( badChar ); - if ( KErrNotFound != badCharLoc ) - { - pathPtr[badCharLoc] = '_'; - } - } - // Note, for some reason File Server's IsValidName() returns EFalse if there - // is question mark as last character of string, but fails to return the - // correct character in parameter badChar. Must get past that to avoid never - // ending loop. Reported to symbian with EJSI-7LZG8C. - else - { - for ( TInt i = 0; i < pathPtr.Length(); i++ ) - { - if ( pathPtr[i] == '?' || pathPtr[i] == '*' ) - { - pathPtr[i] = '_'; - } - } - } - } - - MPX_DEBUG2("CVcxMyVideosDownloadUtil:: path = %S", path); - - CleanupStack::Pop( path ); // <-1 - return path; - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::GeneratePathL -// ---------------------------------------------------------------------------- -// -void CVcxMyVideosDownloadUtil::GeneratePathL( const CMPXMedia& aMedia, TDes& aPath, TInt aCounter ) - { - MPX_FUNC("CVcxMyVideosDownloadUtil::GeneratePathL"); - - _LIT( KBasePathNormal, "\\My Videos\\Downloads\\" ); - _LIT( KBasePathSystemDrive, "\\Data\\My Videos\\Downloads\\" ); - - aPath.Zero(); - aPath = iUsedMemoryDrivePath; - - if ( iUsedDrive == iFs.GetSystemDrive() ) - { - aPath.Append( KBasePathSystemDrive ); - } - else - { - aPath.Append( KBasePathNormal ); - } - - if ( iSubDir.Length() == 0 ) - { - FindSubDirL( aPath ); // recalculates iSubDir - } - - aPath.Append( iSubDir ); - - TPtrC title( aMedia.ValueText( KMPXMediaGeneralTitle ) ); - if ( title.Length() == 0 ) - { - _LIT( KNameless, "Default"); - aPath.Append( KNameless ); - } - else - { - const TInt KVcxMaxCounterAndExtension( 12 ); // 6 + 6 - TInt maxTitle = aPath.MaxLength() - aPath.Length() - KVcxMaxCounterAndExtension; - aPath.Append( title.Left( title.Length() <= maxTitle ? title.Length() : maxTitle ) ); - } - - //001-009 - //010-099 - - if ( aCounter > 0 ) - { - if ( aCounter < 10 ) - { - aPath.Append( _L("_(00") ); - } - else if ( aCounter > 9 && aCounter < 100 ) - { - aPath.Append( _L("_(0") ); - } - TBuf<8> buf; - buf.Format( _L("%d)"), aCounter ); - aPath.Append( buf ); - } - - // The algorithm is not final, this is the best we can do with current SW. - // See errors EJSI-7LZHLU, EJSI-7M2BW7, EJSI-7M2HMV. - // - TBool extFound( EFalse ); - TInt extPos = aMedia.ValueText( KVcxMediaMyVideosRemoteUrl ).LocateReverse('.'); - if ( extPos != KErrNotFound ) - { - TPtrC extension( aMedia.ValueText( KVcxMediaMyVideosRemoteUrl ).Mid( extPos ) ); - TInt extensionLength( KErrNotFound ); - - if ( extension.FindF( KVcxExtensionDcf ) == 0 ) - { - extensionLength = KVcxExtensionDcf().Length(); - } - else if ( extension.FindF( KVcxExtensionOcf ) == 0 ) - { - extensionLength = KVcxExtensionOcf().Length(); - } - else if ( extension.FindF( KVcxExtensionDm ) == 0 ) - { - extensionLength = KVcxExtensionDm().Length(); - } - else if ( extension.FindF( KVcxExtensionMp4 ) == 0 ) - { - extensionLength = KVcxExtensionMp4().Length(); - } - else if ( extension.FindF( KVcxExtensionMpeg4 ) == 0 ) - { - extensionLength = KVcxExtensionMpeg4().Length(); - } - else if ( extension.FindF( KVcxExtensionM4v ) == 0 ) - { - extensionLength = KVcxExtensionM4v().Length(); - } - else if ( extension.FindF( KVcxExtension3gpp ) == 0 ) - { - extensionLength = KVcxExtension3gpp().Length(); - } - else if ( extension.FindF( KVcxExtension3gp ) == 0 ) - { - extensionLength = KVcxExtension3gp().Length(); - } - else if ( extension.FindF( KVcxExtensionRm ) == 0 ) - { - extensionLength = KVcxExtensionRm().Length(); - } - else if ( extension.FindF( KVcxExtensionMpg4 ) == 0 ) - { - extensionLength = KVcxExtensionMpg4().Length(); - } - else if ( extension.FindF( KVcxExtensionRmvb ) == 0 ) - { - extensionLength = KVcxExtensionRmvb().Length(); - } - else if ( extension.FindF( KVcxExtension3g2 ) == 0 ) - { - extensionLength = KVcxExtension3g2().Length(); - } - else if ( extension.FindF( KVcxExtensionWmv ) == 0 ) - { - extensionLength = KVcxExtensionWmv().Length(); - } - else if ( extension.FindF( KVcxExtensionAsf ) == 0 ) - { - extensionLength = KVcxExtensionAsf().Length(); - } - - if ( extensionLength > 0 ) - { - // Remove possible extra characters after actual extension. - if ( extension.Length() > extensionLength ) - { - extension.Set( extension.Left( extensionLength ) ); - } - - extFound = ETrue; - aPath.Append( extension ); - } - } - - if ( ! extFound ) - { - aPath.Append( KVcxExtensionMp4 ); - } - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::FindSubDirL -// Finds subdir and stores it to iSubDir -// ---------------------------------------------------------------------------- -// -void CVcxMyVideosDownloadUtil::FindSubDirL( const TDesC& aPath ) - { - MPX_FUNC("CVcxMyVideosDownloadUtil::FindSubDirL"); - - MPX_DEBUG2("CVcxMyVideosDownloadUtil:: aPath = %S", &aPath); - - _LIT(KSubDirFormatterDes, "%d\\"); - - TBuf path; - TBuf foundSubDirs; - TBuf currentSubDir; - - //search subdirs - TBool found; - TInt subDirCounter; - TInt fileCount = 0; - for ( TInt i = 0; i < KVcxSubDirLevels; i++ ) - { - found = EFalse; - subDirCounter = 1; - while( !found ) - { - currentSubDir.Format( KSubDirFormatterDes, subDirCounter ); - path.Zero(); - path.Append( aPath ); - path.Append( foundSubDirs ); - path.Append( currentSubDir ); - MPX_DEBUG2("CVcxMyVideosDownloadUtil:: testing path: %S", &path); - fileCount = FileCountL( path ); - MPX_DEBUG2("CVcxMyVideosDownloadUtil:: file count = %d", fileCount); - if ( fileCount < KVcxMaxItemsInDir ) - { - found = ETrue; - foundSubDirs.Append( currentSubDir ); - } - else - { - subDirCounter++; - } - } - } - - iSubDir = foundSubDirs; - - MPX_DEBUG2("CVcxMyVideosDownloadUtil:: calling ensurepath for %S", &path); - BaflUtils::EnsurePathExistsL( iFs, path ); - - MPX_DEBUG2("CVcxMyVideosDownloadUtil:: iSubDir = %S", &iSubDir); - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::FileCount -// ---------------------------------------------------------------------------- -// -TInt CVcxMyVideosDownloadUtil::FileCountL( const TDesC& aPath ) - { - TInt count = 0; // return 0 in case of fail - - CDir* dir = NULL; - TInt err = iFs.GetDir( aPath, KEntryAttNormal | KEntryAttMatchMask, ESortBySize, dir ); - if ( err != KErrNone ) - { - MPX_DEBUG2("CVcxMyVideosDownloadUtil:: GetDir failed: %d", err); - } - else - { - count = dir->Count(); - } - delete dir; - return count; - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::UsedMemoryDesL -// ---------------------------------------------------------------------------- -// -const TDesC& CVcxMyVideosDownloadUtil::UsedMemoryDesL() - { - MPX_FUNC("CVcxMyVideosDownloadUtil::UsedMemoryDesL"); - - CVcxMyVideosDriveMonitor* driveMonitor = CVcxMyVideosDriveMonitor::NewL( iFs ); - CleanupStack::PushL( driveMonitor ); // 1-> - driveMonitor->GetUsedMemoryL( iUsedDrive ); - CleanupStack::PopAndDestroy( driveMonitor ); // <-1 - - TInt driveChar = 'a' + iUsedDrive; - iUsedMemoryDrivePath.Zero(); - iUsedMemoryDrivePath.Append( driveChar ); - _LIT(KColon, ":"); - iUsedMemoryDrivePath.Append( KColon ); - return iUsedMemoryDrivePath; - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::StopProgressTimer -// ---------------------------------------------------------------------------- -// -void CVcxMyVideosDownloadUtil::StopProgressTimer() - { - if ( ActiveDownloadCount() == 0 ) - { - MPX_DEBUG1("CVcxMyVideosDownloadUtil:: stopped iDownloadProgressTimer"); - iDownloadProgressTimer->Cancel(); - } - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosDownloadUtil::StartProgressTimer -// ---------------------------------------------------------------------------- -// -void CVcxMyVideosDownloadUtil::StartProgressTimer() - { - if ( !iDownloadProgressTimer->IsActive() && ActiveDownloadCount() > 0 ) - { - MPX_DEBUG1("CVcxMyVideosDownloadUtil:: started iDownloadProgressTimer"); - iDownloadProgressTimer->After( 3000000 ); - } - } diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/group/vcxmyvideoscollectionplugin.mmp --- a/videocollection/mpxmyvideoscollection/group/vcxmyvideoscollectionplugin.mmp Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/group/vcxmyvideoscollectionplugin.mmp Wed Jun 09 09:44:23 2010 +0300 @@ -16,7 +16,6 @@ - #include #include #include @@ -38,20 +37,17 @@ SOURCE vcxmyvideoscategories.cpp SOURCE vcxmyvideosmessagelist.cpp SOURCE vcxmyvideosasyncfileoperations.cpp -SOURCE vcxmyvideosdownloadcache.cpp SOURCE vcxmyvideosdrivemonitor.cpp SOURCE vcxmyvideosdriveinfo.cpp SOURCE vcxmyvideosdrivemonitorevent.cpp SOURCE vcxmyvideosactivetask.cpp SOURCE vcxmyvideosopenhandler.cpp +SOURCE vcxmyvideosmdsalbums.cpp +SOURCE vcxmyvideosmdscmdqueue.cpp +SOURCE vcxmyvideosalbums.cpp +SOURCE vcxmyvideosalbum.cpp SOURCE vcxmyvideosasyncfilecopy.cpp -SOURCEPATH ../download/src -SOURCE vcxmyvideosdownloadutil.cpp - -SOURCEPATH ../src -SOURCE vcxmyvideostimer.cpp - SOURCEPATH ../data START RESOURCE vcxmyvideoscollectionplugin.RSS @@ -59,7 +55,6 @@ END USERINCLUDE ../inc -USERINCLUDE ../download/inc USERINCLUDE ../../inc APP_LAYER_SYSTEMINCLUDE @@ -73,10 +68,6 @@ LIBRARY flogger.lib LIBRARY mdeclient.lib LIBRARY efsrv.lib -LIBRARY downloadmgr.lib LIBRARY charconv.lib -LIBRARY vcxconnectionutility.lib -LIBRARY mediatorclient.lib LIBRARY centralrepository.lib -LIBRARY drmutility.lib -LIBRARY platformenv.lib \ No newline at end of file +LIBRARY PlatformEnv.lib diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/inc/vcxmyvideosactivetask.h --- a/videocollection/mpxmyvideoscollection/inc/vcxmyvideosactivetask.h Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/inc/vcxmyvideosactivetask.h Wed Jun 09 09:44:23 2010 +0300 @@ -28,11 +28,22 @@ NONSHARABLE_CLASS( MVcxMyVideosActiveTaskObserver ) { public: + + enum TStepResult + { + EMoreToCome, + EDone, + /** + * Observer is responsible for calling Done or ContinueStepping if returning this. + */ + EStopStepping + }; + /** * Handle the execution of a step - * @return ETrue if complete, EFalse if more to do + * @return TStepResult */ - virtual TBool HandleStepL() = 0; + virtual TStepResult HandleStepL() = 0; /** * Handle the completion of the operation */ @@ -84,6 +95,30 @@ */ CMPXCommand& GetCommand(); + /** + * Get the command for the current task. + * @return the current command, ownership does not move. + */ + CMPXMedia* Command(); + + /** + * If observer returns EStopStepping from HandleStepL, then observer must call + * this or ContinueStepping when sub operation is finished. + * Can be used to run async operations. + */ + void Done(); + + /** + * If observer returns EStopStepping from HandleStepL, then observer must call + * this or Done when sub operation is finished. + * Can be used to run async operations. + */ + void ContinueStepping(); + + /** + * Add some functionality to CActive::Cancel + */ + void Cancel(); protected: // From base class @@ -91,7 +126,7 @@ * From CActive */ void RunL(); - + /** * From CActive */ @@ -114,6 +149,13 @@ */ void ConstructL(); +public: + /** + * Set to ETrue when stepping is stopped. + * Cancel or Done has to be called. + */ + TBool iStopped; + private: // data CMPXCommand* iCurCommand; // Current Command diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/inc/vcxmyvideosalbum.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videocollection/mpxmyvideoscollection/inc/vcxmyvideosalbum.h Wed Jun 09 09:44:23 2010 +0300 @@ -0,0 +1,221 @@ +/* +* 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: Class representing album in My Videos collection. +*/ + + +#ifndef CVCXMYVIDEOSALBUM_H +#define CVCXMYVIDEOSALBUM_H + +// INCLUDES +#include +#include + +class CMPXMedia; +class CVcxMyVideosCollectionPlugin; + +// CLASS DECLARATION + +/** + * Contains information about video which belongs to some album. + * These are stored to CVcxMyVideosAlbum::iVideoList. + */ +NONSHARABLE_CLASS(TVcxMyVideosAlbumVideo) + { + public: + + /** + * Constructor. + */ + TVcxMyVideosAlbumVideo(); + + /** + * = operator. + */ + TVcxMyVideosAlbumVideo& operator=( const TVcxMyVideosAlbumVideo& aVideo ); + private: + + /** + * Set values. + */ + void Set( TUint32 aMdsId, TUint32 aRelationMdsId, CMPXMedia* aVideo ); + + public: + TUint32 iMdsId; //Video object ID in MDS. + TUint32 iRelationMdsId; //Relation ID in MDS, this is used when removing items from album. + CMPXMedia* iMedia; + }; + +/** + * Contains list of videos belonging to an album. Videos can be searched, added and + * removed. Videos are kept in sorting order by MDS ID to speed up access. Pointers + * to media objects in collection cache are also stored to speed up access. + * Contains also logic for keeping album media attributes up to date. + */ +NONSHARABLE_CLASS(CVcxMyVideosAlbum) : public CBase + { +public: + // Constructors and destructor + + /** + * Destructor. + */ + ~CVcxMyVideosAlbum(); + + /** + * Two-phased constructor. + */ + static CVcxMyVideosAlbum* NewL( CVcxMyVideosCollectionPlugin& aCollectionPlugin ); + + /** + * Two-phased constructor. + */ + static CVcxMyVideosAlbum* NewLC( CVcxMyVideosCollectionPlugin& aCollectionPlugin ); + + // new methods + + /** + * Sets up this album. + * + * @param aAlbum Media class to set from. + */ + void SetL( /*CMPXMedia& aAlbum*/ ); + + /** + * Sorts iVideoList by MDS ID. + */ + void Sort(); + + /** + * Checks if aMdsId belongs to this album. Checking is + * done using bisection method. + * + * @param aMdsId Id to check. + */ + TBool BelongsToAlbum( TUint32 aMdsId ); + + /** + * Finds video from iVideoList. Uses bisection method, ie + * is fast. + * + * @param aMdsId Video to find. + * @param aVideo If found, this is filled with data. + * @param aIndex Position in iVideoList where from the video + * was found. + * @return System-wide error code. If != KErrNone, then + * aVideo and aIndex won't contain valid data. + */ + TInt Video( TUint32 aMdsId, TVcxMyVideosAlbumVideo& aVideo, TInt& aIndex ); + + /** + * Adds aVideo to this album. The id array is kept in ascending order. + * + * @param aVideo Video to add. + */ + void AddL( TVcxMyVideosAlbumVideo aVideo ); + + /** + * Removes videos from this album. + * + * @param aMdsIds Array containing IDs of the videos to remove. + */ + void Remove( RArray& aMdsIds ); + + /** + * Removes aMdsId from this album. + * + * @param aMdsId ID to remove. + * @param aCompress If ETrue, then Compress is called to iVideoList. + * ETrue as default. + */ + void Remove( TUint32 aMdsId, TBool aCompress = ETrue ); + + /** + * Used for keeping RArray in integer order by + * TVcxMyVideosAlbumVideo::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 TVcxMyVideosAlbumVideo& aVideo1, + const TVcxMyVideosAlbumVideo& aVideo2 ); + + /** + * Creates video list belonging to this album. Ownership goes to caller. + * + * @return Media containing media array. Array items are videos. + */ + CMPXMedia* CreateVideoListL(); + + /** + * Appends items from aFromVideoList to aToVideoList if they belong to + * this album. + * + * @param aFromVideoList From list. + * @param aToVideoList To List. + * @param aNewItemStartIndex Start index of the copy. Items in aFromVideoList before this + * value are ignored. + */ + void AppendToVideoListL( CMPXMedia& aFromVideoList, + CMPXMedia& aToVideoList, TInt aNewItemStartIndex ); + + /** + * Calculates KVcxMediaMyVideosCategoryItemCount, KVcxMediaMyVideosCategoryNewItemCount, + * KVcxMediaMyVideosCategoryNewItemName and KMPXMediaGeneralDate attributes to iMedia. + * + * @param aStartIndex Start position of the calculations in iVideoList. + * Can be used to update values when items are appended + * to old list, without calculating everything from scratch. + */ + void CalculateAttributesL( TInt aStartIndex = 0 ); + +private: + + /** + * Constructor for performing 1st stage construction + */ + CVcxMyVideosAlbum( CVcxMyVideosCollectionPlugin& aCollectionPlugin ); + + /** + * EPOC default constructor for performing 2nd stage construction + */ + void ConstructL(); + +private: //data + CVcxMyVideosCollectionPlugin& iCollection; + +public: //data + + /** + * MDS ID of this album. + */ + TUint32 iMdsId; + + /** + * MPX media object representing this album in collection, not own. + * The item is owned by CVcxMyVideosAlbums::iAlbumList + */ + CMPXMedia* iMedia; + + /** + * Array containing info about videos belonging to this album. + */ + RArray iVideoList; + + }; + +#endif // CVCXMYVIDEOSALBUM_H diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/inc/vcxmyvideosalbums.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videocollection/mpxmyvideoscollection/inc/vcxmyvideosalbums.h Wed Jun 09 09:44:23 2010 +0300 @@ -0,0 +1,366 @@ +/* +* 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: Albums related collection functionality. +*/ + + + +#ifndef VCXMYVIDEOSALBUMS_H +#define VCXMYVIDEOSALBUMS_H + +// INCLUDES +#include +#include "vcxmyvideosmdsdb.h" +#include "vcxmyvideosalbum.h" + +// FORWARD DECLARATIONS +class CVcxMyVideosMdsDb; +class CMPXMedia; +class CVcxMyVideosCollectionPlugin; +class CVcxMyVideosAlbum; + +// CONSTANTS + +// CLASS DECLARATION + +/** +* Albums related collection functionality. +* +* @lib mpxmyvideoscollectionplugin.lib +*/ +NONSHARABLE_CLASS(CVcxMyVideosAlbums) : public CBase, public MVcxMyVideosMdsAlbumsObserver + { + public: // Constructors and destructor + + /** + * Two-phased constructor + * @return object constructed + */ + static CVcxMyVideosAlbums* NewL( CVcxMyVideosCollectionPlugin& aCollectionPlugin ); + + /** + * Destructor + */ + virtual ~CVcxMyVideosAlbums(); + + public: // new methods + + /** + * Returns album from iAlbums array by MDS ID. Ownership does not move. + * + * @param aMdsId MDS ID of the album to get. + * @param aPos If given, then the position index in iAlbums is written here. + * Ownership does not move. + * @return Pointer to album or NULL if not found. + */ + CVcxMyVideosAlbum* Album( TUint32 aMdsId, TInt* aPos = NULL ); + + /** + * Creates iAlbumList if it doesn't exist yet. The list is populated + * from async callback, HandleGetAlbumsResp(). + */ + void CreateAlbumListL(); + + /** + * Fetches MDS IDs from MDS for all videos belonging to albums. + * Ie fills iAlbums[*]->iVideoList[*].iMdsId (and iAlbums[*]->iVideoList[*].iRelationMdsId) fields. + * Causes several async calls to MDS. + */ + void GetAlbumContentIdsL(); + + /** + * Adds videos to album. + * + * @param aCmd See attribute usage from vcxmyvideosdefs.h. + */ + void AddVideosToAlbumL( CMPXMedia* aCmd ); + + /** + * Removes videos from album. + * + * @param aCmd See attribute usage from vcxmyvideosdefs.h. + */ + void RemoveVideosFromAlbumL( CMPXMedia* aCmd ); + + /** + * Adds album to MDS and to this class. KMPXMediaGeneralTitle + * should be set in aCmd. Upon completion, the KMPXMediaGeneralId + * attribute contains the new MPX item ID. Leaves if could + * not add to MDS. + * + * @param aCmd Command object received from collection client. + */ + void AddAlbumL( CMPXMedia& aCmd ); + + /** + * Removes albums from MDS. MDS delete events will clean up albums + * from this class. + * + * @param aCmd MPX command received from the client. Contains media array, + * which contains medias with album IDs set to KMPXMediaGeneralId. + * Ownership does not move. + */ + void RemoveAlbumsFromMdsOnlyL( CMPXMedia* aCmd ); + + /** + * Removes albums from this object (iAlbumList and iAlbums). + * Called from MDS delete event. Album IDs which were removed are + * also removed from aAlbumIds array. After the call aAlbumIds + * will contain items which were not found and not deleted. + * Sends appropriate events to collection client. + * + * @param aAlbumIds Album IDs to be removed. + */ + void RemoveAlbumsL( RArray& aAlbumIds ); + + /** + * Removes album from this class (iAlbumList and iAlbums). + * Adds event to message list but does not send it. + * + * @param aMdsIds Album MDS ID to be removed. + * @param aCompress If ETrue, then iAlbums is compressed, + * otherwise not. + * @return ETrue if album was found and removed. + */ + TBool RemoveAlbumL( TUint32 aMdsId, TBool aCompress ); + + /** + * Fetches albums from MDS. This is called from MDS insert event. + * + * @param aAlbumIds Album IDs to fetch. + */ + void AddAlbumsFromMdsL( RArray& aAlbumIds ); + + /** + * Updates albums from MDS. This is called from MDS modify event. + * + * @param aAlbumIds Album IDs to update. + */ + void UpdateAlbumsFromMdsL( RArray& aAlbumIds ); + + /** + * Updates album attributes, does not write to MDS. Adds + * modify event to iCollection.iMessageList if necessarry. + * + * @param aAlbum New values are read from this. + * @return ETrue if album was modified, EFalse otherwise. + */ + TBool UpdateAlbumL( const CMPXMedia& aAlbum ); + + /** + * Calculates and updates album media attributes. + */ + void CalculateAttributesL(); + + /** + * Called when video's New Video flag changes. Calculates + * album attributes for the affected albums. Adds events + * to iCollection.iMessageList but does not send them. + * + * @param aMdsId MDS ID of the changed video. + */ + void NewVideoFlagChangedL( TUint32 aMdsId ); + + /** + * Called when video's title changes. Calculates + * album attributes for the affected albums. Adds events + * to iCollection.iMessageList but does not send them. + * + * @param aMdsId MDS ID of the changed video. + */ + void VideoTitleChangedL( TUint32 aMdsId ); + + /** + * Called when video is added or removed from cache. Adds changed + * album indexes to iChangedAlbums. + */ + void VideoAddedOrRemovedFromCacheL( CMPXMedia& video ); + + /** + * Goes through iChangedAlbums and updates album attributes and adds + * changed events. + */ + void UpdateChangedAlbumsL(); + +protected: + + /** + * From MVcxMyVideosMdsAlbumsObserver. + * Process albums arriving from MDS. Response to VcxMyVideosMdsAlbums::GetAlbumsL. + */ + void HandleGetAlbumsRespL( CMPXMedia* aAlbumList ); + + /** + * From MVcxMyVideosMdsAlbumsObserver. + * Process content ids arriving from MDS. Response to VcxMyVideosMdsAlbums::GetAlbumContentIdsL. + * + * @param aAlbumId ID of the album. + * @param aAlbumContent Array containing MDS object IDs. This array is the same which + * was given in GetAlbumContentIdsL call. + */ + void HandleGetAlbumContentIdsRespL( TUint32 aAlbumId, + RArray& aAlbumContentIds ); + + /** + * From MVcxMyVideosMdsAlbumsObserver. + * Response to VcxMyVideosMdsAlbums::GetAlbumsL. + * Sends insert events to collection clients. + * + * @param aAlbumList Pointer to same array which was given in GetAlbums call. + */ + void HandleGetAlbumsResp( CMPXMedia* aAlbumList ); + + /** + * From MVcxMyVideosMdsAlbumsObserver. + * Process content ids arriving from MDS. Response to CVcxMyVideosMdsAlbums::GetAlbumContentIdsL. + * + * @param aAlbumId ID of the album. + * @param aAlbumContent Array containing MDS object IDs. This array is the same which + * was given in GetAlbumContentL call. + */ + void HandleGetAlbumContentIdsResp( TUint32 aAlbumId, + RArray& aAlbumContentIds ); + + /** + * From MVcxMyVideosMdsAlbumsObserver. + * Process content videos arriving from MDS. Response to CVcxMyVideosMdsAlbums::GetAlbumContentVideosL. + * + * @param aAlbumId Album ID. + * @param aVideoList Media containing media array, array items are videos. + * @param aError Error code in case of failure. + * @param aFirstNewItemIndex The index of the first new item. + * @param aNewItemCount How many new items since the last results. + * @param aComplete ETrue is query is complete, EFalse if there is new to come. + */ + void HandleGetAlbumContentVideosResp( TUint32 /*aAlbumId*/, CMPXMedia& /*aVideoList*/, + TInt /*aError*/, TInt /*aFirstNewItemIndex*/, TInt /*aNewItemCount*/, TBool /*aComplete*/ ) {} + + /** + * From MVcxMyVideosMdsAlbumsObserver. + * Response to CVcxMyVideosMdsAlbums::AddVideosToAlbumL. + * + * @param aCmd Pointer to object which was given in AddVideosToAlbumL + * function call. Ownership does not move. + * @param aItemArray Item array which was tried to add to MDS. + */ + void HandleAddVideosToAlbumResp( CMPXMedia* aCmd, + RPointerArray& aItemArray ); + + /** + * From MVcxMyVideosMdsAlbumsObserver. + * Response to CVcxMyVideosMdsAlbums::RemoveRelationsL. + */ + void HandleRemoveRelationsResp( RArray& aRelationIds, + RArray& aResults ); + + /** + * From MVcxMyVideosMdsAlbumsObserver. + * Response to CVcxMyVideosMdsAlbums::RemoveAlbumsL. + */ + void HandleRemoveAlbumsResp( CMPXMedia* aCmd, + RArray& aResultIds ); + + /** + * From MVcxMyVideosMdsAlbumsObserver. + * Relation events from MDS. This object is set as an observer at + * iCollection.ConstructL, CVcxMyVideosMdsDb::NewL(..,aAlbumsObserver,..). + */ + void HandleRelationEvent( TObserverNotificationType aType, + const RArray& aRelationArray ); + + private: + + /** + * Fills in iAlbums array. This is called when iAlbumList is ready. + * Pointers to CVcxMyVideosVideoCache::iVideoList are not filled + * in yet. + */ + void CreateAlbumsL(); + + /** + * Constructor + */ + CVcxMyVideosAlbums( CVcxMyVideosCollectionPlugin& aCollectionPlugin ); + + /** + * Symbian 2nd phase constructor. + */ + void ConstructL(); + + /** + * Leaving version of HandleAddVideosToAlbumResp. + */ + void DoHandleAddVideosToAlbumRespL( CMPXMedia* aCmd, + RPointerArray& aItemArray ); + + public: + + /** + * Album list. This is given to client when categorylevel items are requested. Own. + * If this is destroyed/edited, then pointers have to be updated in iAlbums. + */ + CMPXMedia* iAlbumList; + + /** + * Array containing MDS IDs and pointers to album and video media items. + * Album media items are in iAlbumList and video media items are in + * CVcxMyVideosVideoCache::iVideoList. + */ + RArray iAlbums; + + /** + * ETrue when iAlbumList is ready and iAlbums contains video IDs. + */ + TBool iAlbumListIsComplete; + + private: + + /** + * Owner of this object. + */ + CVcxMyVideosCollectionPlugin& iCollection; + + /** + * Used in MDS operations to store MDS video (or relation) IDs. + */ + RArray iMdsOpTargetIds; + + /** + * Stores album video data during relation deletion. This is to + * avoid second search when resp arrives. + */ + RArray iRemoveFromAlbumVideos; + + /** + * Used in MDS operations to store operation results. Is in sync with iMdsOpTargetIds. + */ + RArray iMdsOpResults; + + /** + * Used in MDS operations to store operation results. Is in sync with iMdsOpTargetIds. + */ + RArray iMdsOpResultsUint32; + + /** + * When videos are removed or added from cache, the indexes of the + * changed albums are stored here. Reason is to calculate new attributes + * only once per changed album. + */ + RArray iChangedAlbums; + + }; + +#endif // VCXMYVIDEOSALBUMS_H + + diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/inc/vcxmyvideosasyncfileoperations.h --- a/videocollection/mpxmyvideoscollection/inc/vcxmyvideosasyncfileoperations.h Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/inc/vcxmyvideosasyncfileoperations.h Wed Jun 09 09:44:23 2010 +0300 @@ -27,10 +27,6 @@ #include #include -//#include "mpxdbactivetask.h" // change to <> when moved to s60 dir and remove temp .h-file - -#include "vcxmyvideosdownloadutil.h" - // FORWARD DECLARATIONS class CVcxMyVideosCollectionPlugin; class CVcxMyVideosAsyncFileCopy; @@ -84,17 +80,18 @@ /** * Performs one Move or Copy operation. Called by HandleStep. * - * @return ETrue if operation was the last one, EFalse othewise. + * @return MVcxMyVideosActiveTaskObserver::EDone if was last operation, + * MVcxMyVideosActiveTaskObserver::EMoreToCome otherwise. */ - TBool HandleMoveOrCopyStepL(); + MVcxMyVideosActiveTaskObserver::TStepResult HandleMoveOrCopyStepL(); /** * Moves or copies video to another drive. * * @param aMdsId MDS id of the item to be moved. - * @param aTargetDrive Target drive. + * @param aMove If ETrue, the source file is deleted. */ - void MoveOrCopyVideoL( TUint32 aMdsId, TInt aTargetDrive ); + void MoveOrCopyVideoL( TUint32 aMdsId ); /** * Generates and sends resp message for Move,Copy and Delete operations. @@ -110,9 +107,10 @@ /** * Performs one Delete operation. Called by HandleStep. * - * @return ETrue if operation was the last one, EFalse otherwise. + * @return MVcxMyVideosActiveTaskObserver::EDone if was last operation, + * MVcxMyVideosActiveTaskObserver::EMoreToCome otherwise. */ - TBool HandleDeleteStepL(); + MVcxMyVideosActiveTaskObserver::TStepResult HandleDeleteStepL(); private: @@ -162,9 +160,8 @@ * Does some sanity checks also. * * @param aMdsId MDS ID of the video being moved/copied. - * @param aTargetDrive Target drive. */ - void InitSingleMoveOrCopyL( TUint32 aMdsId, TInt aTargetDrive ); + void InitSingleMoveOrCopyL( TUint32 aMdsId ); public: diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/inc/vcxmyvideoscategories.h --- a/videocollection/mpxmyvideoscollection/inc/vcxmyvideoscategories.h Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/inc/vcxmyvideoscategories.h Wed Jun 09 09:44:23 2010 +0300 @@ -231,8 +231,8 @@ * @param aEventInfo This is written to generated event's extra info attribute. * */ - void UpdateVideosCountL( CMPXMedia& aCategory, TInt aIncrement, TMPXAttributeData aCountAttribute, - TInt aEventInfo ); + void UpdateVideosCountL( CMPXMedia& aCategory, TInt aIncrement, + TMPXAttributeData aCountAttribute, TInt aEventInfo ); /** * aVideo is added(or removed) to aCategory. Updates category variables accordingly. @@ -277,7 +277,8 @@ * Usefull if items are being deleted but are still on the * video list. */ - void UpdateCategoryNewVideoNameAndDateL( TInt aOrigin, TBool& aModified, RArray& aIgnoredIds ); + void UpdateCategoryNewVideoNameAndDateL( TInt aOrigin, TBool& aModified, + RArray& aIgnoredIds ); /** * Goes through aVideoList and checks all videos which have new video diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/inc/vcxmyvideoscollectionplugin.h --- a/videocollection/mpxmyvideoscollection/inc/vcxmyvideoscollectionplugin.h Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/inc/vcxmyvideoscollectionplugin.h Wed Jun 09 09:44:23 2010 +0300 @@ -11,12 +11,11 @@ * * Contributors: * -* Description: Implementation of My Videos MPX Collection Plugin interface* +* Description: Implementation of My Videos MPX Collection Plugin interface* */ - #ifndef VCXMYVIDEOSCOLLECTIONPLUGIN_H #define VCXMYVIDEOSCOLLECTIONPLUGIN_H @@ -30,18 +29,17 @@ #include "vcxmyvideosactivetask.h" #include "vcxmyvideosmdsdb.h" -#include "vcxmyvideosdownloadutil.h" // FORWARD DECLARATIONS class CVcxMyVideosMdsDb; class CMPXResource; class CMPXMediaArray; -class CVcxMyVideosDownloadUtil; class CVcxMyVideosVideoCache; class CVcxMyVideosCategories; class CVcxMyVideosMessageList; class CVcxMyVideosAsyncFileOperations; class CVcxMyVideosOpenHandler; +class CVcxMyVideosAlbums; // CONSTANTS @@ -55,13 +53,13 @@ NONSHARABLE_CLASS(CVcxMyVideosCollectionPlugin) : public CMPXCollectionPlugin, public MVcxMyVideosMdsDbObserver, - public MVcxMyVideosActiveTaskObserver, - public MVcxMyVideosDownloadUtilObserver + public MVcxMyVideosActiveTaskObserver { public: // Constructors and destructor friend class CVcxMyVideosOpenHandler; friend class CVcxMyVideosVideoCache; + friend class CVcxMyVideosAlbums; /** * Two-phased constructor @@ -190,7 +188,7 @@ /** * From MMPXDbActiveTaskObserver */ - TBool HandleStepL(); + MVcxMyVideosActiveTaskObserver::TStepResult HandleStepL(); /** * From MMPXDbActiveTaskObserver @@ -226,26 +224,12 @@ * From MVcxMyVideosMdsDbObserver. Called when media is removed or inserted. */ void HandleObjectPresentNotification(); - + /** * Leaving version of HandleObjectPresentNotification. */ void DoHandleObjectPresentNotificationL(); - - /** - * From CVcxMyVideosDownloadUtilObserver. - */ - void HandleDlEvent( TVcxMyVideosDownloadState aState, - TUint32 aDownloadId, TInt aProgress, TInt64 aDownloaded, - TInt32 aError, TInt32 aGlobalError ); - - /** - * Leaving version of HandleDlEvent. - */ - void DoHandleDlEventL( TVcxMyVideosDownloadState aState, - TUint32 aDownloadId, TInt aProgress, TInt64 aDownloaded, - TInt32 aError, TInt32 aGlobalError ); - + private: /** * Constructor @@ -256,38 +240,6 @@ * Symbian 2nd phase constructor. */ void ConstructL (); - - /** - * Synchronizes set of videos in cache with Download Manager. - * Download related attributes are set in cache if corresponding - * download is found. - * - * @param aItemsInCache Array of MDS IDs. - */ - void SyncWithDownloadsL( RArray& aItemsInCache ); - - /** - * Synchronizes video with Download Manager. - * - * @aVideo Video to synchronize. - * @aEventAdded Set to ETrue if event was added to iMessageList, does not change the - * value otherwise. - */ - void SyncVideoWithDownloadsL( CMPXMedia& aVideo, TBool& aEventAdded, - TBool aAddEvent = ETrue ); - - /** - * Copies download attributes from aDownload to aVideo. - * - * @param aVideo Video in cache. - * @param aDownload Corresponding download in Download Manager. - * @param aSendMpxEvent ETrue if MPX item has been modified and caller should - * send the modification event. - */ - void SyncVideoAndDownloadL( - CMPXMedia& aVideo, - RHttpDownload& aDownload, - TBool& aSendMpxEvent ); /** * Copies KVcxMediaMyVideosTransactionId field from aRequest to aResp. @@ -318,24 +270,7 @@ * fetching ongoing. */ void RestartVideoListFetchingL(); - - - /** - * Sets download ID to 0 and download state to none. Updates MDS and sends - * modified event. - * - * @param aDownloadId Download ID of the MPX item. - */ - void SetDownloadIdToZeroL( TUint aDownloadId ); - - -#ifdef _DEBUG - /** - * Returns download state as a descriptor. - */ - const TDesC& DownloadState( TUint8 aDlState ); -#endif - + public: /** @@ -363,23 +298,6 @@ void SendMyVideosMessageL( TUint32 aMessageId, CMPXCommand* aCommand = NULL ); /** - * Synchronizes video list with Download Manager. - * - * @param aVideoList Video list to synchronize. - * @param aStartPos Items before aStartPos index are left out from synchronizing. - * @param aSendEvents If ETrue and modifications are done to the list, then - * MPX events are sent. - */ - void SyncVideoListWithDownloadsL( CMPXMedia& aVideoList, - TBool aSendEvents, TInt aStartPos = 0 ); - - /** - * Returns reference to iDownloadUtil. If iDownloadUtil is NULL then - * it is created. - */ - CVcxMyVideosDownloadUtil& DownloadUtilL(); - - /** * Sends messages to clients. If udeb version, adds messageid * parameter to the message for debugging purposes. May or may not * contain media list as parameter. @@ -394,13 +312,13 @@ * @return Reference to iCategories member. */ CVcxMyVideosCategories& CategoriesL(); - + /** - * Notifies to mediator listeners that a download has completed. + * Creates iAlbums if its not created yet and returns reference to it. * - * @param aVideo Downloaded video. + * @return Reference to iAlbums member. */ - void NotifyDownloadCompletedL( CMPXMedia& aVideo ); + CVcxMyVideosAlbums& AlbumsL(); /** * Notifies to mediator listeners that count of new videos has decreased. @@ -435,7 +353,7 @@ * Executes command in several small steps. */ CVcxMyVideosActiveTask* iActiveTask; - + private: /** @@ -443,12 +361,12 @@ * Own. */ CVcxMyVideosCategories* iCategories; - + /** - * Download util, own. + * Albums related functionality (except mds db operations). Own. */ - CVcxMyVideosDownloadUtil* iDownloadUtil; - + CVcxMyVideosAlbums* iAlbums; + /** * Target drive for Move operation. */ @@ -469,15 +387,6 @@ */ TBool iOrphanDownloadsCleared; - -#ifdef _DEBUG - /** - * Used for debugging that client receives all events. - */ - TInt iTotalMessagesSent; - TInt iMessagesInArraySent; -#endif - }; #endif // VCXMYVIDEOSCOLLECTIONPLUGIN_H diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/inc/vcxmyvideoscollectionutil.h --- a/videocollection/mpxmyvideoscollection/inc/vcxmyvideoscollectionutil.h Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/inc/vcxmyvideoscollectionutil.h Wed Jun 09 09:44:23 2010 +0300 @@ -11,17 +11,17 @@ * * Contributors: * -* Description: +* Description: * */ - #ifndef VCXMYVIDEOSCOLLECTIONUTIL_H #define VCXMYVIDEOSCOLLECTIONUTIL_H // INCLUDES +#include // FORWARD DECLARATIONS class CMPXMedia; @@ -83,6 +83,15 @@ RArray& aMdsIds ); /** + * Appends all items from aFromList to aToList. New items will point to + * same shared memory. + * + * @param aToList List in which items are appended to. + * @param aFromList List in which items are copied from. + */ + static void AppendToListL( CMPXMedia& aToList, CMPXMedia& aFromList ); + + /** * Converts drive letter to drive number. * * @param aDrive drive letter @@ -118,6 +127,14 @@ static TUint32 FlagsL( CMPXMedia& aVideo ); /** + * Gets KMPXMediaGeneralDate (creation date) of aVideo. + * + * @param aVideo Media object to fetch parameter from. + * @return Creation date, works with TTime. + */ + static TInt64 CreationDateL( CMPXMedia& aVideo ); + + /** * Gets KVcxMediaMyVideosDownloadId attribute of aVideo. * * @param aVideo Media object to fetch parameter from. @@ -139,7 +156,7 @@ * @param aVideo Media object to fetch parameter from. * @return ID. */ - static TMPXItemId IdL( CMPXMedia& aVideo ); + static TMPXItemId IdL( const CMPXMedia& aVideo ); /** * Gets KVcxMediaMyVideosDuration attribute of aVideo. @@ -155,7 +172,7 @@ * @return KMPXMediaGeneralTitle value. If attribute is not supported, * then KNullDesC is returned. */ - static const TDesC& Title( CMPXMedia& aVideo ); + static const TDesC& Title( const CMPXMedia& aVideo ); /** * Gets KVcxMediaMyVideosRating attribute of the video. @@ -207,6 +224,44 @@ */ static TInt Origin( TInt aCategoryId ); + /** + * Gets KMPXMediaArrayContents attribute from aMedia. Leaves + * with KErrArgument is attribute is not supported. + * + * @param aMedia Media where from the attribute is fetched. + * @return Pointer to media array. + */ + static CMPXMediaArray* MediaArrayL( const CMPXMedia& aMedia ); + + /** + * Gets KVcxMediaMyVideosInt32Value attribute from aMedia. Leaves + * with KErrArgument if attribute is not supported. + * + * @param aMedia Media where from the attribute is fetched. + * @return Value of KVcxMediaMyVideosInt32Value attribute. + */ + static TInt32 Int32ValueL( CMPXMedia& aMedia ); + + /** + * Gets KVcxMediaMyVideosUint32Value attribute from aMedia. Leaves + * with KErrArgument if attribute is not supported. + * + * @param aMedia Media where from the attribute is fetched. + * @return Value of KVcxMediaMyVideosUint32Value attribute. + */ + static TUint32 Uint32ValueL( CMPXMedia& aMedia ); + + /** + * Gets KMPXMediaGeneralId attributes from aMediaArray and + * puts them to aIdArray. aIdArray is reset before adding. + * + * @param aMediaArray Media array containing media items which + * have KMPXMediaGeneralId attribute set. + * @param aIdArray Array where to the IDs are written to. + */ + static void GetIdsFromMediaArrayL( CMPXMediaArray& aMediaArray, + RArray& aIdArray ); + #ifdef _DEBUG /** * Prints process names which have file handle open to aFileName diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/inc/vcxmyvideosdownloadcache.h --- a/videocollection/mpxmyvideoscollection/inc/vcxmyvideosdownloadcache.h Tue May 25 12:44:54 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,110 +0,0 @@ -/* -* 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 which are being downloaded.* -*/ - - - - -#ifndef VCXMYVIDEOSDOWNLOADCACHE_H -#define VCXMYVIDEOSDOWNLOADCACHE_H - -// INCLUDES - -// FORWARD DECLARATIONS -class CMPXMedia; - -// CONSTANTS - -// CLASS DECLARATION - -/** -* Used for storing download ids and media object pointers to circular buffers for fast access. -* -* @lib mpxmyvideoscollectionplugin.lib -*/ -NONSHARABLE_CLASS(CVcxMyVideosDownloadCache) : public CBase - { - public: // Constructors and destructor - - /** - * Two-phased constructor - * @return Object constructed - */ - static CVcxMyVideosDownloadCache* NewL(); - - /** - * Destructor - */ - virtual ~CVcxMyVideosDownloadCache(); - - private: - /** - * Constructor - */ - CVcxMyVideosDownloadCache(); - - /** - * Symbian 2nd phase constructor. - */ - void ConstructL (); - - public: - /** - * Tries to find item with aDownloadId from Download Cache. - * - * @param aDownloadId Download ID in Download Manager. - * @return Returns pointer to media object, NULL if not found. - * Ownership does not move. - */ - CMPXMedia* Get( TUint32 aDownloadId ); - - /** - * Adds download ID and index pair to Download Cache. - * - * @param aDownloadId Download ID in Download Manager - * @param aVideo Pointer to video, ownership does not move. - */ - void Add( TUint32 aDownloadId, CMPXMedia* aVideo ); - - /** - * Deletes item from Download Cache - * - * @param aVideo Video to remove. - */ - void Delete( CMPXMedia* aVideo ); - - private: - - /** - * Array used as circular buffer, contains download ids. - */ - RArray iDownloadId; - - /** - * Array used as circular buffer, contains pointers to medias. - */ - RPointerArray iMedia; - - /** - * Current position of the circular buffers (iDownloadId and iMedia). - * Next item added is written to this position. - */ - TInt iPos; - - }; - -#endif // VCXMYVIDEOSVIDEOCACHE_H - - diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/inc/vcxmyvideosmdsalbums.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videocollection/mpxmyvideoscollection/inc/vcxmyvideosmdsalbums.h Wed Jun 09 09:44:23 2010 +0300 @@ -0,0 +1,528 @@ +/* +* 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: Provides albums support from MDS* +*/ + + + +#ifndef VCXMYVIDEOSMDSALBUMS_H +#define VCXMYVIDEOSMDSALBUMS_H + +// INCLUDES +#include +#include +#include "vcxmyvideosalbum.h" +#include "vcxmyvideosmdsdb.h" + +// FORWARD DECLARATIONS +class CMPXMedia; + +// CONSTANTS + +// CLASS DECLARATION + +/** +* Provides albums support, uses MDS. +* +* @lib mpxmyvideoscollectionplugin.lib +*/ +NONSHARABLE_CLASS(CVcxMyVideosMdsAlbums) : + public CActive, + public MMdEQueryObserver, + public MMdERelationItemObserver +#if 0 + , + public MMdERelationObserver +#endif + { + public: // Constructors and destructor + + friend class CVcxMyVideosMdsCmdQueue; + friend class CVcxMyVideosMdsDb; + + enum TVcxAsyncOperation + { + EVcxNone, + EVcxAddVideosToAlbum, + EVcxRemoveRelations, + EVcxRemoveAlbums + }; + + /** + * Constructor. + * + * @param aMdsDb Owner of this object. + * @param aObserver Object which is listening album related events. If NULL, then + * no observer is set. + */ + static CVcxMyVideosMdsAlbums* NewL( CVcxMyVideosMdsDb& aMdsDb, + MVcxMyVideosMdsAlbumsObserver* aObserver ); + + /** + * Destructor + */ + virtual ~CVcxMyVideosMdsAlbums(); + + public: // new methods + + /** + * From CActive. + * Cancels possible ongoing asynchronous request. + * + * @param aType Defines what kind of request is cancelled. + */ + void DoCancel( CVcxMyVideosMdsDb::TRequestType aType = CVcxMyVideosMdsDb::EAll ); + + /** + * Cancels queries. + * + * @param aType Defines what kind of request is cancelled. + */ + void CancelQueries( CVcxMyVideosMdsDb::TRequestType aType = CVcxMyVideosMdsDb::EAll ); + + /** + * Gets My Videos albums from MDS asynchronously. + * HandleGetAlbumsResp() callback function is called when ready. + * Utilizes CVcxMyVideosMdsCmdQueue. + * + * @param aAlbumList Album list is written here. Caller owns this, ownership + * does not move. + * @param aClient Response call is done to this object. + */ + void GetAlbumsL( CMPXMedia* aAlbumList, MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Gets album from MDS synchronously. + * + * @param aId MDS ID of the album to be fetched. + * @returm MPX media containing album data. Ownership + * moves to caller. NULL if not found. + */ + CMPXMedia* GetAlbumL( TUint32 aId ); + + /** + * Gets album content IDs asynchronously. + * HandleGetAlbumContentIdsResp() callback function is called when ready. + * Utilizes CVcxMyVideosMdsCmdQueue. + * + * @param aAlbumId Album ID. + * @param aContentArray Item IDs which belog to aAlbum are written here. Caller must + * keep aContentArray available until HandleGetAlbumContentIdsResp + * has been called. + * @param aClient Response call is done to this object. + */ + void GetAlbumContentIdsL( TUint32 aAlbumId, RArray& aContentArray, + MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Gets album content videos asynchronously. + * HandleGetAlbumContentVideosResp() callback function is called when ready. + * Utilizes CVcxMyVideosMdsCmdQueue. + * + * @param aAlbumId Album ID. + * @param aVideoList Media containing media array. Video media objects are added to media array. + * Caller must keep aVideoList available until callback has been called. + * @param aClient Response call is done to this object. + */ + void GetAlbumContentVideosL( TUint32 aAlbumId, CMPXMedia& aVideoList, + MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Adds videos to album asynchronously. HandleAddVideosToAlbumResp() callback function + * is called when operation finishes. + * Utilizes CVcxMyVideosMdsCmdQueue. + * + * @param aMpxCmd Media containing command parameters: album ID and video ID list. + * Results are also written to this object. See media structure and + * used attributes from vcxmyvideosdef.c file, + * KVcxCommandMyVideosAddToAlbum command. Ownership does not move. + * + * @param aClient Response call is done to this object. + */ + void AddVideosToAlbumL( CMPXMedia* aMpxCmd, MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Removes relations asynchronously. + * Utilizes CVcxMyVideosMdsCmdQueue. + * + * @param aRelationIds Relations which are removed. + * @param aResults In sync with aRelationIds. Result codes, KErrNone if successful, + * KErrGeneral if failed. + * @param aClient Response call is done to this object. + */ + void RemoveRelationsL( RArray& aRelationIds, + RArray& aResults, MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Adds album to MDS. aAlbum should have KMPXMediaGeneralTitle attribute + * set. The MDS item ID of the created album is written to KMPXMediaGeneralId + * attribute. + * + * @param aAlbum Album which is added to database. + */ + void AddAlbumL( CMPXMedia& aAlbum ); + + /** + * Removes albums asynchronously. HandleRemoveAlbumsResp() callback function + * is called when operation finishes. + * Utilizes CVcxMyVideosMdsCmdQueue. + * + * @param aMpxCmd Media containing command parameters: media array containing album IDs. + * Results are also written to this object. See media structure and + * used attributes from vcxmyvideosdef.c file, + * KVcxCommandMyVideosRemoveAlbums command. Ownership does not move. + * + * @param aClient Response call is done to this object. + */ + void RemoveAlbumsL( CMPXMedia* aMpxCmd, MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Sets album attributes. + * + * @param aVideo Values from aVideo are written to MDS. + */ + void SetAlbumL( CMPXMedia& aVideo ); + + protected: + + /** + * From CActive. + * Called when operation completes. + */ + void RunL(); + + /** + * From CActive. + * Actual implementation for cancelling. + */ + void DoCancel(); + + private: + + /** + * Constructor + */ + CVcxMyVideosMdsAlbums( CVcxMyVideosMdsDb& aMdsDb, + MVcxMyVideosMdsAlbumsObserver* aObserver ); + + /** + * Symbian 2nd phase constructor. + */ + void ConstructL(); + + /** + * Copies album data from aObject to aAlbum. + * + * @param aObject MDS object to copy data from. + * @param aAlbum MPX media to copy data to. + */ + void Object2MediaL( CMdEObject& aObject, CMPXMedia& aAlbum ); + + /** + * Copies album data from aAlbum to aObject. + * + * @param aAlbum MPX media to copy data from. + * @param aObject MDS object to copy data to. + */ + void Media2ObjectL( CMPXMedia& aAlbum, CMdEObject& aObject); + + /** + * Gets various defintions from MDS and stores them to member variables. + */ + void GetSchemaDefinitionsL(); + + /** + * Gets My Videos albums from MDS asynchronously. + * HandleGetAlbumsResp() callback function is called when ready. + * + * @param aAlbumList Album list is written here. Caller owns this, ownership + * does not move. + * @param aClient Callback is done to this object. + */ + void DoGetAlbumsL( CMPXMedia* aAlbumList, MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Gets album content IDs from MDS asynchronously. + * HandleGetAlbumContentIdsResp() callback function is called when ready. + * + * @param aAlbumId Album ID. + * @param aContentArray Array containing MDS IDs which belong to aAlbum. + * Caller is responsible to keep array available + * until HandleGetAlbumContentResp has been called. + * @param aClient Callback is done to this object. + */ + void DoGetAlbumContentIdsL( TUint32 aAlbumId, + RArray& aContentArray, + MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Gets album content videos from MDS asynchronously. + * HandleGetAlbumContentVideosResp() callback function is called when ready. + * + * @param aAlbumId Album ID. + * @param aVideoList Media containing empty media array. Videos are added to array. Caller + * must keep aVideoList available until HandleGetAlbumContentVideosResp + * is called. + * @param aClient Callback is done to this object. + */ + void DoGetAlbumContentVideosL( TUint32 aAlbumId, CMPXMedia& aVideoList, + MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Adds videos to album asynchronously. HandleAddVideosToAlbumResp() callback function + * is called when operation finishes. + * + * @param aMpxCmd Media containing command parameters: album ID and video ID list. + * Results are also written to this object. See media structure and + * used attributes from vcxmyvideosdef.c file, + * KVcxCommandMyVideosAddToAlbum command. Ownership does not move. + * @param aClient Response call is done to this object. + */ + void DoAddVideosToAlbumL( CMPXMedia* aMpxCmd, MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Removes relations asynchronously. + * + * @param aRelationIds Relations which are removed. + * @param aResults In sync with aRelationIds. Result codes, KErrNone if successful, + * KErrGeneral if failed. + * @param aClient Response call is done to this object. + */ + void DoRemoveRelationsL( RArray& aRelationIds, + RArray& aResults, MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Removes albums asynchronously. + * + * @param aMpxCmd Media containing command parameters: array with albums IDs. + * @param aClient Response call is done to this object. + */ + void DoRemoveAlbumsL( CMPXMedia* aMpxCmd, + MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Handles album query responses. + * + * @param aQuery Query instance. + * @param aError KErrNone, if the query was completed + * successfully. Otherwise one of the system-wide error + * codes. + */ + void HandleAlbumQueryCompletedL(CMdEQuery& aQuery, TInt aError); + + /** + * Handles video query responses. + * + * @param aQuery Query instance. + * @param aError KErrNone, if the query was completed + * successfully. Otherwise one of the system-wide error + * codes. + * @param aFirstNewItemIndex Index of the first new item in the query. + * @param aNewItemCount How many new items were added. + * @param aComplete ETrue if query is complete, EFalse if new to come. + */ + void HandleVideoQueryResultsL( CMdEQuery& aQuery, TInt aError, + TInt aFirstNewItemIndex, TInt aNewItemCount, TBool aComplete ); + + /** + * Handles relation query responses. + * + * @param aQuery Query instance. + * @param aError KErrNone, if the query was completed + * successfully. Otherwise one of the system-wide error + * codes. + */ + void HandleRelationQueryCompletedL( CMdEQuery& aQuery, TInt aError ); + + /** + * Called from RunL when video adding to album completes. + */ + void HandleAddVideosToAlbumCompletedL(); + + /** + * Called from RunL when relations remove completes. + */ + void HandleRemoveRelationsCompletedL(); + + /** + * Called from RunL when albums remove completes. + */ + void HandleRemoveAlbumsCompletedL(); + + /** + * Registers observing to MDS session. + */ + void SetObservingL(); + + protected: + + /** + * From MMdEQueryObserver. + * Called to notify the observer that new results have been received + * in the query. + * + * @param aQuery Query instance that received new results. + * @param aFirstNewItemIndex Index of the first new item that was added + * to the result item array. + * @param aNewItemCount Number of items added to the result item + * array. + */ + void HandleQueryNewResults(CMdEQuery& aQuery, + TInt aFirstNewItemIndex, + TInt aNewItemCount); + + /** + * From MMdEQueryObserver. + * Called to notify the observer that the query has been completed, + * or that an error has occured. + * + * @param aQuery Query instance. + * @param aError KErrNone, if the query was completed + * successfully. Otherwise one of the system-wide error + * codes. + */ + void HandleQueryCompleted(CMdEQuery& aQuery, TInt aError); + + /** + * From MMdERelationItemObserver + */ + void HandleRelationItemNotification(CMdESession& aSession, + TObserverNotificationType aType, + const RArray& aRelationArray); + + /** + * From MMdERelationObserver + */ + void HandleRelationNotification(CMdESession& aSession, + TObserverNotificationType aType, + const RArray& aRelationIdArray); + + private: + + /** + * Main class for Mds operations. Owns session to MDS. + */ + CVcxMyVideosMdsDb& iMdsDb; + + /** + * Observer of albums related events. May be NULL. + * not own. + */ + MVcxMyVideosMdsAlbumsObserver* iObserver; + + /** + * Asynchronous album object fetching query is stored here. Own. + */ + CMdEObjectQuery* iAlbumQuery; + + /** + * Asynchronous video object fetching query is stored here. Own. + */ + CMdEObjectQuery* iVideoQuery; + + /** + * Asynchronous relation fetching query is stored here. Own. + */ + CMdERelationQuery* iRelationQuery; + + /** + * The default namespace definition, not own. + */ + CMdENamespaceDef* iNamespaceDef; + + /** + * Album object definition, not own. + */ + CMdEObjectDef* iAlbumObjectDef; + + /** + * Album type property definition, not own. + */ + CMdEPropertyDef* iTypePropertyDef; + + /** + * "Contains" relation definition, not own. + */ + CMdERelationDef* iContainsRelationDef; + + /** + * Pointer to album list which is being fetched from MDS. Not own. + */ + CMPXMedia* iAlbumList; + + /** + * Pointer to video list which is being fetched from MDS. Not own. + */ + CMPXMedia* iVideoList; + + /** + * When doing some async operation to MDS, the album ID is stored here. + */ + TUint32 iAlbumId; + + /** + * When fetching album content from MDS, the pointer to content array is stored here. + * Only MDS ID is filled to TVideo. + * Not own. + */ + RArray* iAlbumContent; + + /** + * The pending async operation ID is stored here. + */ + TVcxAsyncOperation iAsyncOperation; + + /** + * Used for storing items during async mds operations. + */ + RPointerArray iItemArray; + + /** + * Used for storing result buffer during async mds operations. + */ + RMdEDataBuffer iResultBuffer; + + /** + * Used in async operations to store + * pointer to result array (which is owned by the user). + */ + RArray* iResultArray; + + /** + * Used in async operations to store + * pointer to result array (which is owned by the user). + */ + RArray* iResultArrayUint32; + + /** + * Used in async oprations (EVcxAddVideosToAlbum and EVcxRemoveVideosFromAlbum) to store + * pointer to item ID array (which is owned by the user). + */ + RArray* iIdArray; + + /** + * Used to store command parameters during async MDS operations. Not owned. + */ + CMPXMedia* iMpxCmd; + + /** + * Used to store pointer to client who initiated the async operation. + */ + MVcxMyVideosMdsAlbumsObserver* iClient; + + }; + +#endif // VCXMYVIDEOSMDSALBUMS_H + + diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/inc/vcxmyvideosmdscmdqueue.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videocollection/mpxmyvideoscollection/inc/vcxmyvideosmdscmdqueue.h Wed Jun 09 09:44:23 2010 +0300 @@ -0,0 +1,330 @@ +/* +* 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: Queues commands to MDS. +*/ + + + +#ifndef VCXMYVIDEOSMDSCMDQUEUE_H +#define VCXMYVIDEOSMDSCMDQUEUE_H + +// INCLUDES +#include +#include "vcxmyvideosalbum.h" +#include "vcxmyvideosmdsdb.h" + +// FORWARD DECLARATIONS +class CMPXMedia; + +// CONSTANTS + +// CLASS DECLARATION + +/** +* All MDS commands inherit this. +* +* @lib mpxmyvideoscollectionplugin.lib +*/ +NONSHARABLE_CLASS(CVcxMyVideosMdsCmd) : public CBase + { + public: + + /** + * Destructor + */ + virtual ~CVcxMyVideosMdsCmd() {} + + /** + * Command type. Used for casting the pointer to correct type. + */ + CVcxMyVideosMdsDb::TRequestType iCmdType; + + /** + * Pointer to client is stored here, used for performing response call. + */ + MVcxMyVideosMdsAlbumsObserver* iClient; + }; + +/** +* Class which encapsulates GetVideoListL function parameters. +* +* @lib mpxmyvideoscollectionplugin.lib +*/ +NONSHARABLE_CLASS(CVcxMyVideosMdsCmdGetVideoList) : public CVcxMyVideosMdsCmd + { + public: + + /** + * Constructor + */ + CVcxMyVideosMdsCmdGetVideoList() {} + + /** + * Destructor + */ + virtual ~CVcxMyVideosMdsCmdGetVideoList() {} + + public: + /** + * Stored CreateVideoListL function parameters, see meanings from vcxmyvideosmdsdb.h file. + */ + TVcxMyVideosSortingOrder iSortingOrder; + TBool iAscending; + TBool iFullDetails; + CMPXMedia** iVideoList; + }; + +/** +* Class which stores GetAlbumsL function arguments. +* +* @lib mpxmyvideoscollectionplugin.lib +*/ +NONSHARABLE_CLASS(CVcxMyVideosMdsCmdGetAlbums) : public CVcxMyVideosMdsCmd + { + public: // Constructors and destructor + + /** + * Constructor + */ + CVcxMyVideosMdsCmdGetAlbums() {} + + /** + * Destructor + */ + virtual ~CVcxMyVideosMdsCmdGetAlbums() {} + + public: + /** + * Stored GetAlbumsL function parameters, see meanings from vcxmyvideosmdsalbums.h file. + */ + CMPXMedia* iAlbumList; + }; + +/** +* Class which stores GetAlbumContentIdsL function arguments. +* +* @lib mpxmyvideoscollectionplugin.lib +*/ +NONSHARABLE_CLASS(CVcxMyVideosMdsCmdGetAlbumContentIds) : public CVcxMyVideosMdsCmd + { + public: // Constructors and destructor + + /** + * Constructor + */ + CVcxMyVideosMdsCmdGetAlbumContentIds() {} + + /** + * Destructor + */ + virtual ~CVcxMyVideosMdsCmdGetAlbumContentIds() {} + + public: + /** + * Stored GetAlbumContentL function parameters, see meanings from vcxmyvideosmdsalbums.h file. + */ + TUint32 iAlbumId; + RArray* iAlbumContent; //not own + }; + +/** +* Class which stores GetAlbumContentVideosL function arguments. +* +* @lib mpxmyvideoscollectionplugin.lib +*/ +NONSHARABLE_CLASS(CVcxMyVideosMdsCmdGetAlbumContentVideos) : public CVcxMyVideosMdsCmd + { + public: // Constructors and destructor + + /** + * Constructor + */ + CVcxMyVideosMdsCmdGetAlbumContentVideos() {} + + /** + * Destructor + */ + virtual ~CVcxMyVideosMdsCmdGetAlbumContentVideos() {} + + public: + /** + * Stored GetAlbumContentL function parameters, see meanings from vcxmyvideosmdsalbums.h file. + */ + TUint32 iAlbumId; + CMPXMedia* iAlbumContentVideos; //not own + }; + +/** +* Class which stores AddVideosToAlbumL function arguments. +* +* @lib mpxmyvideoscollectionplugin.lib +*/ +NONSHARABLE_CLASS(CVcxMyVideosMdsCmdAddVideosToAlbum) : public CVcxMyVideosMdsCmd + { + public: // Constructors and destructor + + /** + * Constructor + */ + CVcxMyVideosMdsCmdAddVideosToAlbum() {} + + /** + * Destructor + */ + virtual ~CVcxMyVideosMdsCmdAddVideosToAlbum() {} + + public: + /** + * Stored AddVideosToAlbumL function parameters, see meanings from vcxmyvideosdefs.h + * KVcxCommandMyVideosAddToAlbum command descriptions. + */ + CMPXMedia* iMpxCmd; + }; + +/** +* Class which stores RemoveRelationsL function arguments. +* +* @lib mpxmyvideoscollectionplugin.lib +*/ +NONSHARABLE_CLASS(CVcxMyVideosMdsCmdRemoveRelations) : public CVcxMyVideosMdsCmd + { + public: // Constructors and destructor + + /** + * Constructor + */ + CVcxMyVideosMdsCmdRemoveRelations() {} + + /** + * Destructor + */ + virtual ~CVcxMyVideosMdsCmdRemoveRelations() {} + + public: + /** + * Stored RemoveRelationsL function parameters, see meanings from vcxmyvideosmdsalbums.h file. + */ + RArray* iRelationIds; //not own + RArray* iResults; //not own + }; + +/** +* Class which stores RemoveAlbumsL function arguments. +* +* @lib mpxmyvideoscollectionplugin.lib +*/ +NONSHARABLE_CLASS(CVcxMyVideosMdsCmdRemoveAlbums) : public CVcxMyVideosMdsCmd + { + public: // Constructors and destructor + + /** + * Constructor + */ + CVcxMyVideosMdsCmdRemoveAlbums() {} + + /** + * Destructor + */ + virtual ~CVcxMyVideosMdsCmdRemoveAlbums() {} + + public: + /** + * Stored RemoveAlbumsL function parameters, see meanings from vcxmyvideosmdsalbums.h file. + */ + CMPXMedia* iMpxCmd; //not own + }; + +/** +* Queues MDS commands. +* +* @lib mpxmyvideoscollectionplugin.lib +*/ +NONSHARABLE_CLASS(CVcxMyVideosMdsCmdQueue) : public CBase + { + public: // Constructors and destructor + + /** + * Two-phased constructor + * @return object constructed + */ + static CVcxMyVideosMdsCmdQueue* NewL( CVcxMyVideosMdsDb& aMdsDb ); + + /** + * Destructor + */ + virtual ~CVcxMyVideosMdsCmdQueue(); + + public: // new methods + + /** + * Executes command if queue is empty, otherwise adds it to queue. + * Ownership of aCmd moves to this object. + * + * @param aCmd Command to execute. + */ + void ExecuteCmdL( CVcxMyVideosMdsCmd* aCmd ); + + /** + * Called when command finishes. Executes next command from the queue. + */ + void CmdFinished(); + + /** + * Removes commands from command queue. + * + * @param aType Defines what kind of commands are removed from the command queue. + */ + void Cancel( CVcxMyVideosMdsDb::TRequestType aType = CVcxMyVideosMdsDb::EAll ); + + private: + + /** + * Constructor + */ + CVcxMyVideosMdsCmdQueue( CVcxMyVideosMdsDb& aMdsDb ); + + /** + * Symbian 2nd phase constructor. + */ + void ConstructL(); + + /** + * Executes the command. + * + * @param aCmd Command to execute, ownership does not move. + */ + void DoExecuteCmdL( CVcxMyVideosMdsCmd* aCmd ); + + private: + + /** + * Owner of this object. + */ + CVcxMyVideosMdsDb& iMdsDb; + + /** + * Command queue. Own. + */ + RArray iQueue; + + /** + * Set to ETrue when command is started and to EFalse + * when command finishes. + */ + TBool iCmdInProgress; + }; + +#endif // VCXMYVIDEOSMDSCMDQUEUE_H + + diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/inc/vcxmyvideosmdsdb.h --- a/videocollection/mpxmyvideoscollection/inc/vcxmyvideosmdsdb.h Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/inc/vcxmyvideosmdsdb.h Wed Jun 09 09:44:23 2010 +0300 @@ -11,12 +11,11 @@ * * Contributors: * -* Description: MPX My Videos collection plugins' MDS database class* +* Description: MPX My Videos collection plugins' MDS database class* */ - #ifndef VCXMYVIDEOSMDSDB_H #define VCXMYVIDEOSMDSDB_H @@ -25,7 +24,13 @@ #include #include #include +#include #include +#include "vcxmyvideosalbum.h" + +class CVcxMyVideosMdsAlbums; +class CMPXMedia; +class CVcxMyVideosMdsCmdQueue; const TUid KHarvesterPSShutdown = { 0x200009F5 } ; const TInt KMdSShutdown = 0x00000002; // values 1 = shutdown, 0 = restart, normal state @@ -33,7 +38,144 @@ static _LIT_SECURITY_POLICY_PASS(KAllowAllPolicy); static _LIT_SECURITY_POLICY_C1(KPowerMgmtPolicy,ECapabilityPowerMgmt); -class CRepository; +/** + * MPX My Videos collection MDS database observer class. + * Part of ECOM Plugin. + */ +NONSHARABLE_CLASS(MVcxMyVideosMdsDbObserver) + { + public: + + /* + + Defined in mpxcollectionmessagedefs.h: + + enum TMPXChangeEventType + { + EMPXItemDeleted, // item/playlist deleted + EMPXItemInserted, // item/playlist added + EMPXItemModified // item/playlist/artist/album/genre/composer modified + }; + */ + + /** + * Handler function for database events. + * + * @param aEvent Event type. + * @param aId Array of IDs in database. + */ + virtual void HandleMyVideosDbEvent( TMPXChangeEventType aEvent, RArray& aId ) = 0; + + /** + * Handler function for video list fetching events. This callback is called as a response + * to CreateVideoList( aSync = EFalse ). + * + * @param aVideoList List of videos fetched from MDS. + * @param aNewItemsStartIndex Start position for the new items added. If -1, then no new + * items were added. + * @param aComplete ETrue if list is complete and no more items are expected, + * EFalse if there are more to come. + */ + virtual void HandleCreateVideoListResp( CMPXMedia* aVideoList, + TInt aNewItemsStartIndex, TBool aComplete ) = 0; + + /** + * Handler function for media remove/insert events. This is called every time + * media is removed or inserted (objects become present or non present). + */ + virtual void HandleObjectPresentNotification() = 0; + }; + + +/** + * MPX My Videos collection MDS albums related functionality observer class. + * Part of ECOM Plugin. + */ +NONSHARABLE_CLASS(MVcxMyVideosMdsAlbumsObserver) + { + public: + + /** + * This callback is called as a response to GetAlbumsL. + * + * @param aAlbumList List of albums fetched from MDS. + */ + virtual void HandleGetAlbumsResp( CMPXMedia* aAlbumList ) = 0; + + /** + * This callback is called as a response to GetAlbumContentIdsL. + * + * @param aAlbumId Album ID which was fetched. + * @param aContentArray Array containing MDS object IDs. This array is the same which + * was given in GetAlbumContentIdsL call. + */ + virtual void HandleGetAlbumContentIdsResp( TUint32 aAlbumId, + RArray& aContentArray ) = 0; + + /** + * Called as a response to GetAlbumContentVideosL. + * + * @param aAlbumId ID of the album containing the result videos. + * @param aVideoList Media containing array of videos. + * @param aError Error code in case of failure. + * @param aFirstNewItemIndex Index of the first new item. + * @param aNewItemCount How many new items in the query since the last results. + * @param aComplete ETrue if query is complete, EFalse if there is more to come. + */ + virtual void HandleGetAlbumContentVideosResp( TUint32 aAlbumId, CMPXMedia& aVideoList, + TInt aError, TInt aFirstNewItemIndex, TInt aNewItemCount, TBool aComplete ) = 0; + + /** + * Called as a response to AddVideosToAlbumL. Results are written from aItemArray + * to aCmd (KVcxMediaMyVideosInt32Value attribute). KErrNone if operation was successful, + * KErrGeneral otherwise. + * + * @param aCmd Pointer to same object which was given in AddVideosToAlbumL function call. + * @param aItemArray Array of relation items that were added to MDS. + */ + virtual void HandleAddVideosToAlbumResp( CMPXMedia* aCmd, + RPointerArray& aItemArray ) = 0; + + /** + * Called as a response to RemoveRelationsL. + * + * @param aRelationIds Relations which were tried to be removed. + * @param aResults Result codes, in sync with aRelationIds. KErrNone if successful, + * KErrGeneral if failed. + */ + virtual void HandleRemoveRelationsResp( RArray& aRelationIds, + RArray& aResults ) = 0; + + /** + * Called as a response to RemoveAlbumsL. + * + * @param aCmd Cmd which was given in RemoveAlbumsL call. + * @param aResults Result IDs. + */ + virtual void HandleRemoveAlbumsResp( CMPXMedia* aCmd, + RArray& aResultIds ) = 0; + + /** + * Event handler function for relation delete events. + * + * @param aType Event type + * @param aRelationArray Array containing relations. + */ + virtual void HandleRelationEvent( TObserverNotificationType aType, + const RArray& aRelationArray ) = 0; + +#if 0 + /** + * Event handler function for relation add events. + * + * @param aType Event type + * @param aRelationArray Array containing relations. + */ + virtual void HandleRelationIdEvent( TObserverNotificationType aType, + const RArray& aRelationIdArray ) = 0; +#endif + + }; /** * PSCW Listener Observer interface for signaling that MDS has Shutdown/restarted @@ -105,57 +247,7 @@ }; /** - * MPX My Videos collection MDS database observer class. - * Part of ECOM Plugin. - */ -NONSHARABLE_CLASS(MVcxMyVideosMdsDbObserver) - { - - public: - - /* - - Defined in mpxcollectionmessagedefs.h: - - enum TMPXChangeEventType - { - EMPXItemDeleted, // item/playlist deleted - EMPXItemInserted, // item/playlist added - EMPXItemModified // item/playlist/artist/album/genre/composer modified - }; - */ - - /** - * Handler function for database events. - * - * @param aEvent Event type. - * @param aId Array of IDs in database. - */ - virtual void HandleMyVideosDbEvent( TMPXChangeEventType aEvent, RArray& aId ) = 0; - - /** - * Handler function for list fetching events. This callback is called as a response - * to CreateVideoList( aSync = EFalse ). - * - * @param aVideoList List of videos fetched from MDS. - * @param aNewItemsStartIndex Start position for the new items added. If -1, then no new - * items were added. - * @param aComplete ETrue if list is complete and no more items are expected, - * EFalse if there are more to come. - */ - virtual void HandleCreateVideoListResp( CMPXMedia* aVideoList, - TInt aNewItemsStartIndex, TBool aComplete ) = 0; - - /** - * Handler function for media remove/insert events. This is called every time - * media is removed or inserted (objects become present or non present). - */ - virtual void HandleObjectPresentNotification() = 0; - }; - - -/** - * MPX My Videos collection ECOM plugins' MDS database class. + * MPX My Videos collection ECOM plugin's MDS database class. */ NONSHARABLE_CLASS(CVcxMyVideosMdsDb) : public CBase, @@ -168,17 +260,34 @@ public: + friend class CVcxMyVideosMdsAlbums; + friend class CVcxMyVideosMdsCmdQueue; + + enum TRequestType + { + EAll, + EGetVideoList, + EGetAlbums, + EGetAlbumContentIds, + EGetAlbumContentVideos, + EAddVideosToAlbum, + ERemoveRelations, + ERemoveAlbums + }; + /** * Two-phased constructor. * @param aObserver The db change observer. */ - static CVcxMyVideosMdsDb* NewL( MVcxMyVideosMdsDbObserver* aObserver, RFs& aFs ); + static CVcxMyVideosMdsDb* NewL( MVcxMyVideosMdsDbObserver* aObserver, + RFs& aFs, MVcxMyVideosMdsAlbumsObserver* aAlbumsObserver = NULL ); /** * Two-phased constructor. * @param aObserver The db change observer. */ - static CVcxMyVideosMdsDb* NewLC( MVcxMyVideosMdsDbObserver* aObserver, RFs& aFs ); + static CVcxMyVideosMdsDb* NewLC( MVcxMyVideosMdsDbObserver* aObserver, + RFs& aFs, MVcxMyVideosMdsAlbumsObserver* aAlbumsObserver = NULL ); /** @@ -187,9 +296,30 @@ virtual ~CVcxMyVideosMdsDb(); /** - * Cancels possible ongoing asynchronous operation. + * Cancels possible ongoing asynchronous operations. + * + * @param aType What kind of requests are cancelled. */ - void Cancel(); + void Cancel( TRequestType aType = EAll ); + + /** + * Creates list of videos from MDS. This function utilizes CVcxMyVideosMdsQueue, ie + * commands are put in queue if there are other commands pending. + * + * @param aSortingOrder Sorting order, see values from TSortingOrder. + * @param aAscending Sort direction, if ETrue then ascending, else descending. + * @param aFullDetails If ETrue, then all details will be filled to media objects, + * if EFalse, then only subset. + * @param aVideoList Reference to pointer variable. Container type CMPXMedia class, contains + * CMPXMediaArray filled with CMPXMedia objects. If aVideoList + * pointer variable is NULL, then new medialist is created. + * If pointer variable already contains value, then the given medialist + * should have empty media array. New items are appended to it. + * Caller naturally owns the data. + * + */ + void CreateVideoListL( TVcxMyVideosSortingOrder aSortingOrder, + TBool aAscending, TBool aFullDetails, CMPXMedia*& aVideoList ); /** * Add new video. @@ -216,34 +346,17 @@ void UpdateVideoL( CMPXMedia& aVideo ); /** - * Create list of videos from MDS. - * - * @param aSortingOrder Sorting order, see values from TSortingOrder. - * @param aAscending Sort direction, if ETrue then ascending, else descending. - * @param aFullDetails If ETrue, then all details will be filled to media objects, - * if EFalse, then only subset. - * @param aVideoList Reference to pointer variable. Container type CMPXMedia class, contains - * CMPXMediaArray filled with CMPXMedia objects. If aVideoList - * pointer variable is NULL, then new medialist is created. - * If pointer variable already contains value, then the given medialist - * should have empty media array. New items are appended to it. - * Caller naturally owns the data. - * - */ - void CreateVideoListL( TVcxMyVideosSortingOrder aSortingOrder, - TBool aAscending, TBool aFullDetails, CMPXMedia*& aVideoList ); - - /** * Get one video item from MDS and create a new media * object from it. * * @param aId Video identifier in MDS database. * @param aFullDetails If ETrue, then all details are fetched, othewise only subset. - * @return Pointer to media object, ownership moves. + * @return Pointer to media object, ownership moves. NULL if + * not found. */ CMPXMedia* CreateVideoL( TUint32 aId, TBool aFullDetails = ETrue ); -protected: // from base classes +protected: // from MMdESessionObserver @@ -301,6 +414,7 @@ // from MMdEObjectObserver + void HandleObjectNotification( CMdESession& aSession, TObserverNotificationType aType, const RArray& aObjectIdArray); @@ -308,10 +422,10 @@ // from MMdEObjectPresentObserver void HandleObjectPresentNotification(CMdESession& aSession, TBool aPresent, const RArray& aObjectIdArray); - + // from MVcxMdsShutdownMonitorObserver void ShutdownNotification( TInt aShutdownState ); - + private: /** @@ -319,17 +433,20 @@ * @param aObserver The db change observer. * @param aFs Session to file server. */ - CVcxMyVideosMdsDb( MVcxMyVideosMdsDbObserver* aObserver, RFs& aFs ); + CVcxMyVideosMdsDb( MVcxMyVideosMdsDbObserver* aObserver, + RFs& aFs, MVcxMyVideosMdsAlbumsObserver* aAlbumsObserver = NULL ); void ConstructL(); /** * Gets object from MDS. * - * @param aId The ID of the object to get. - * @return The object if found, NULL otherwise. + * @param aId The ID of the object to get. + * @param aIsVideo Set to ETrue if the object to be fetched is video. If set to + * EFalse, then the object is assumed to be album. + * @return The object if found, NULL otherwise. */ - CMdEObject* ObjectL( const TItemId aId ); + CMdEObject* ObjectL( const TItemId aId, TBool aIsVideo = ETrue ); /** * Read the video details from the given object to the media class. @@ -383,6 +500,29 @@ TInt aFirstNewItemIndex, TInt aNewItemCount); /** + * Creates list of videos from MDS. + * + * @param aSortingOrder Sorting order, see values from TSortingOrder. + * @param aAscending Sort direction, if ETrue then ascending, else descending. + * @param aFullDetails If ETrue, then all details will be filled to media objects, + * if EFalse, then only subset. + * @param aVideoList Reference to pointer variable. Container type CMPXMedia class, contains + * CMPXMediaArray filled with CMPXMedia objects. If aVideoList + * pointer variable is NULL, then new medialist is created. + * If pointer variable already contains value, then the given medialist + * should have empty media array. New items are appended to it. + * Caller naturally owns the data. + * + */ + void DoCreateVideoListL( TVcxMyVideosSortingOrder aSortingOrder, + TBool aAscending, TBool aFullDetails, CMPXMedia*& aVideoList ); + + /** + * Handles query complete events asynchronously. + */ + static TInt AsyncHandleQueryCompleted( TAny* aPtr ); + + /** * Sets Creation Date and Modified properties to object. Uses current date * value. * @@ -397,17 +537,17 @@ * @param aObject Creation date is written here. */ void SetCreationDateToObjectL( const CMPXMedia& aVideo, CMdEObject& aObject ); - + /** * Opens MDS session. */ void OpenMdsSessionL(); - + /** * @return MDS session. */ CMdESession& MdsSessionL(); - + public: /** @@ -416,15 +556,25 @@ */ TBool iVideoListFetchingIsOngoing; + /** + * Album related functionality. + */ + CVcxMyVideosMdsAlbums* iAlbums; + private: // data /** + * Command queue. Own. + */ + CVcxMyVideosMdsCmdQueue* iCmdQueue; + + /** * The MDS session object. Own. */ CMdESession* iMdsSession; /** - * The error code of last iMDSSession operation. + * The sessions error state. */ TInt iMdsSessionError; @@ -445,8 +595,8 @@ TBool iFullDetails; /** - * The default namespace definition. Not own. - */ + * The default namespace definition. Not own. + */ CMdENamespaceDef* iNamespaceDef; /** @@ -544,13 +694,7 @@ * The Last Play Point property definition. Not own. */ CMdEPropertyDef* iLastPlayPositionPropertyDef; - - /** - * 17. - * The Download ID property definition. Not own. - */ - CMdEPropertyDef* iDownloadIdPropertyDef; - + /** * 18. * Rating property definition, not own. @@ -605,17 +749,24 @@ * The observer for db changes. Not own. */ MVcxMyVideosMdsDbObserver* iMdsDbObserver; - + + /** + * The observer for albums related database events. Not own. + */ + MVcxMyVideosMdsAlbumsObserver* iAlbumsObserver; + /** - * Cenrep session. + * Used to handle complete events asynchronously. + * This avoids problems like deleting query objects in the + * handler or starting new query from the handler. */ - CRepository* iRepository; - + CAsyncCallBack* iAsyncHandleQueryCompleteCaller; + /** * Monitors Mds server shutdown states. */ CVcxMdsShutdownMonitor* iMdsShutdownMonitor; - + }; #endif // VCXMYVIDEOSMDSDB_H diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/inc/vcxmyvideosmessagelist.h --- a/videocollection/mpxmyvideoscollection/inc/vcxmyvideosmessagelist.h Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/inc/vcxmyvideosmessagelist.h Wed Jun 09 09:44:23 2010 +0300 @@ -98,7 +98,8 @@ * from vcxmyvideosdefs.h for values. * @param aVideo Video object which is in cache already. */ - void AddEventL(const TMPXItemId& aId, TMPXChangeEventType aChange, TInt32 aExtraInfo = 0, CMPXMedia* aVideo = NULL ); + void AddEventL(const TMPXItemId& aId, TMPXChangeEventType aChange, + TInt32 aExtraInfo = 0, CMPXMedia* aVideo = NULL ); /** * Creates My Videos custom event and appends it to iMessageList. diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/inc/vcxmyvideosopenhandler.h --- a/videocollection/mpxmyvideoscollection/inc/vcxmyvideosopenhandler.h Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/inc/vcxmyvideosopenhandler.h Wed Jun 09 09:44:23 2010 +0300 @@ -11,11 +11,11 @@ * * Contributors: * -* Description: Handles collection Open operation related functionality* +* Description: Handles collection Open operation related functionality +* */ - #ifndef VCXMYVIDEOSOPENHANDLER_H #define VCXMYVIDEOSOPENHANDLER_H @@ -23,13 +23,15 @@ class MMPXCollectionPluginObserver; class CVcxMyVideosMdsDb; +#include "vcxmyvideosmdsdb.h" /** */ -NONSHARABLE_CLASS( CVcxMyVideosOpenHandler ) : public CBase +NONSHARABLE_CLASS( CVcxMyVideosOpenHandler ) : public CBase, public MVcxMyVideosMdsAlbumsObserver { friend class CVcxMyVideosVideoCache; public: + /** * Two-phased constructor */ @@ -52,18 +54,62 @@ void OpenL( const CMPXCollectionPath& aPath ); /** - * Leaving version of HandleCreateVideoListResp. - * Handler function for list fetching events. This callback is called as a response - * to iCache.CreateVideoListL(). - * - * @param aVideoList List of videos fetched from MDS. - * @param aNewItemsStartIndex Start position for the new items added. - * @param aComplete ETrue if list is complete and no more items are expected, - * EFalse if there are more to come. - */ + * From MVcxMyVideosMdsAlbumsObserver. + */ + void HandleAlbumOpenL(); + + /** + * From MVcxMyVideosMdsAlbumsObserver, no implementation. + */ + void HandleGetAlbumsResp( CMPXMedia* /*aAlbumList*/ ) {} + + /** + * From MVcxMyVideosMdsAlbumsObserver, no implementation. + */ + void HandleGetAlbumContentIdsResp( TUint32 /*aAlbumId*/, + RArray& /*aContentArray*/ ) {} + + /** + * From MVcxMyVideosMdsAlbumsObserver, no implementation. + */ + void HandleAddVideosToAlbumResp( CMPXMedia* /*aCmd*/, + RPointerArray& /*aItemArray*/ ) {} + + /** + * From MVcxMyVideosMdsAlbumsObserver, no implementation. + */ + void HandleRemoveRelationsResp( RArray& /*aRelationIds*/, + RArray& /*aResults*/ ) {} + + /** + * From MVcxMyVideosMdsAlbumsObserver, no implementation. + */ + void HandleRemoveAlbumsResp( CMPXMedia* /*aCmd*/, + RArray& /*aResultIds*/ ) {} + + /** + * From MVcxMyVideosMdsAlbumsObserver, no implementation. + */ + void HandleRelationEvent( TObserverNotificationType /*aType*/, + const RArray& /*aRelationArray*/ ) {} + + /** + * Called as a response to GetAlbumContentVideosL. + * + * @param aAlbumId ID of the album containing the result videos. + * @param aVideoList Media containing array of videos. + * @param aError Error code in case of failure. + * @param aFirstNewItemIndex Index of the first new item. + * @param aNewItemCount How many new items in the query since the last results. + * @param aComplete ETrue if query is complete, EFalse if there is more to come. + */ + void HandleGetAlbumContentVideosResp( TUint32 aAlbumId, CMPXMedia& aVideoList, + TInt aError, TInt aFirstNewItemIndex, TInt aNewItemCount, TBool aComplete ); + + void DoHandleCreateVideoListRespL( CMPXMedia* aVideoList, TInt aNewItemsStartIndex, TBool aComplete ); - + private: /** * 2nd-phase Constructor @@ -77,6 +123,35 @@ CVcxMyVideosVideoCache& aCache, CVcxMyVideosMdsDb& aMds ); + /** + * Opens category. + * + * @param aCategoryId Category to open. + */ + void OpenCategoryL( TUint32 aCategoryId ); + + /** + * Leaving version of HandleGetAlbumContentVideosResp. + */ + void HandleGetAlbumContentVideosRespL( + TUint32 aAlbumId, CMPXMedia& /*aVideoList*/, TInt aError, + TInt /*aFirstNewItemIndex*/, TInt /*aNewItemCount*/, TBool aComplete ); +public: + + /** + * If album is opened when the album list is not yet complete, + * then the album ID which is tried to open is stored here. + * The open processing is continued when album list is received + * from MDS. There can't be several album opens pending since + * we do not call HandleOpen before we get the album list. + */ + TUint32 iPendingAlbumOpenId; + + /** + * for testing, temp + */ + CMPXMedia* iAlbumVideoList; + private: // data /** @@ -108,6 +183,26 @@ * This is in sync with iCategoryIdsBeingOpened. */ RArray iVideoListsBeingOpened; + + /** + * The album IDs being opened are stored here. These values are used + * to filter list when items arrive from MDS. + * This is in sync with iAlbumVideoListsBeingOpened. + */ + RArray iAlbumIdsBeingOpened; + + /** + * Video lists for albums being opened are stored here. + * This is in sync with iAlbumIdsBeingOpened. + */ + RArray iAlbumVideoListsBeingOpened; + + /** + * Path being opened is stored here for the HandleOpenL call. + * Not Own. + */ + const CMPXCollectionPath* iPath; + }; #endif // VCXMYVIDEOSACTIVETASK_H diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/inc/vcxmyvideostimer.h --- a/videocollection/mpxmyvideoscollection/inc/vcxmyvideostimer.h Tue May 25 12:44:54 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,120 +0,0 @@ -/* -* 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: Timer* -*/ - - - - -#ifndef __CVCXMYVIDEOSTIMER_H__ -#define __CVCXMYVIDEOSTIMER_H__ - -// INCLUDES -#include - -// FORWARD DECLARATIONS -class CVcxMyVideosTimer; - -// CLASS DECLARATION -/** -* This class specifies the function to be called when a timeout occurs. -* Used in conjunction with CVcxTimer class. -*/ -class MVcxMyVideosTimerObserver - { - public: // New functions - - /** - * The function to be called when a timeout occurs. - * - * @param aTimer Pointer to timer which expired. - */ - virtual void TimerExpired(CVcxMyVideosTimer* aTimer) = 0; - }; - -// CLASS DECLARATION -/** -* This class will notify an object after a specified timeout. -*/ -NONSHARABLE_CLASS(CVcxMyVideosTimer) : public CTimer - { - public: // Constructors and destructors - - /** - * Two-phased constructor. - * Creates a CVcxMyVideosTimer object using two phase construction, - * and returns a pointer to the created object. - * - * @param aPriority Priority to use for this timer. - * @param aTimerObserver Object to notify of timeout event. - * @return A pointer to the created instance of CVcxMyVideosTimer. - */ - static CVcxMyVideosTimer* NewL( const TInt aPriority, - MVcxMyVideosTimerObserver& aTimerObserver ); - - /** - * Two-phased constructor. - * Creates a CVcxMyVideosTimer object using two phase construction, - * and returns a pointer to the created object. - * - * @param aPriority Priority to use for this timer. - * @param aTimerObserver Object to notify of timeout event. - * @return A pointer to the created instance of CVcxMyVideosTimer. - */ - static CVcxMyVideosTimer* NewLC( const TInt aPriority, - MVcxMyVideosTimerObserver& aTimerObserver ); - - /** - * Destructor. - * Destroys the object and releases all memory objects. - */ - virtual ~CVcxMyVideosTimer(); - - protected: // Functions from base classes - - /** - * From CActive, RunL. - * Called when operation completes. - */ - void RunL(); - - private: // Constructors and destructors - - /** - * C++ default constructor. - * Performs the first phase of two phase construction. - * - * @param aPriority Priority to use for this timer. - * @param aTimeOutNotify An observer to notify. - */ - CVcxMyVideosTimer( const TInt aPriority, - MVcxMyVideosTimerObserver& aTimerObserver ); - - /** - * ConstructL. - * 2nd phase constructor. - */ - void ConstructL(); - - private: // Data - - /** - * The observer for this objects events. - */ - MVcxMyVideosTimerObserver& iObserver; - }; - -#endif // __CVCXMYVIDEOSTIMER_H__ - -// End of File \ No newline at end of file diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/inc/vcxmyvideosvideocache.h --- a/videocollection/mpxmyvideoscollection/inc/vcxmyvideosvideocache.h Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/inc/vcxmyvideosvideocache.h Wed Jun 09 09:44:23 2010 +0300 @@ -11,12 +11,11 @@ * * Contributors: * -* Description: Contains cached MDS media items* +* Description: Contains cached MDS media items* */ - #ifndef VCXMYVIDEOSVIDEOCACHE_H #define VCXMYVIDEOSVIDEOCACHE_H @@ -26,7 +25,6 @@ // FORWARD DECLARATIONS class CVcxMyVideosCollectionPlugin; class CMPXMedia; -class CVcxMyVideosDownloadCache; class CRepository; // CONSTANTS @@ -34,6 +32,140 @@ // 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& VideoArray(); +#endif + +private: + /** + * Constructor + */ + CVcxMyVideosVideoListIndex(); + + /** + * Symbian 2nd phase constructor. + */ + void ConstructL (); + + /** + * Sorts iVideoArray by MDS ID. + */ + void Sort(); + + /** + * Used for keeping RArray 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 iVideoArray; + }; + +/** * Used for storing MDS items to RAM for fast access. * * @lib mpxmyvideoscollectionplugin.lib @@ -55,6 +187,19 @@ */ 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 @@ -179,7 +324,14 @@ * @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 @@ -225,16 +377,6 @@ CMPXMedia* FindVideoByMdsIdL( TUint32 aMdsId, TInt& aPos ); /** - * Tries to find media with matching download ID from iVideoList and iPartialVideoList. - * If aDownloadId is 0, then NULL is returned. - * - * @param aDownloadId ID to compare - * @return Contains pointer to media if match found, NULL otherwise. - * Pointer ownership is not moved to the caller. - */ - CMPXMedia* FindVideoByDownloadIdL( TUint aDownloadId ); - - /** * Gets medias from iVideoList and iPartialVideoList. * * @param aMdsIds IDs of the items to fetch. @@ -242,7 +384,7 @@ * attribute contains the media items. Ownership * moves to caller. */ - CMPXMedia* GetVideosL( RArray aMdsIds ); + CMPXMedia* GetVideosL( RArray& aMdsIds ); /** * Removes video from iVideoList (or from iPartialVideoList). @@ -268,16 +410,19 @@ * @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. */ - void AddVideosFromMdsL( RArray& aMdsIds, TBool& aListFetchingWasCanceled ); + void AddVideosFromMdsL( RArray& aMdsIds, TBool& aListFetchingWasCanceled, + RArray* aNonVideoIds = NULL ); /** * 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. When new items are added, they are synchronized with - * Download Manager. Once iVideoList is complete, iVideoListIsPartial + * 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 @@ -337,32 +482,34 @@ * is removed. */ RArray iPartialVideoList; - - /** - * If ETrue then iVideoList does not contain all items from MDS. - */ - TBool iVideoListIsPartial; /** * Sorting order which was used last time when list was queryed from MDS. */ TVcxMyVideosSortingOrder iLastSortingOrder; - private: - /** - * Circular buffer containing download id and media object pointer pairs. - * Media object pointers are owned by iVideoList. - * Used to speed up access to media objects which are used regularly during the - * download. + * Set to ETrue when doing videolist fetching. + */ + TBool iIsFetchingVideoList; + private: + + /** + * If ETrue then iVideoList contains all items from MDS. */ - CVcxMyVideosDownloadCache* iDownloadCache; - + TBool iVideoListIsComplete; + /** * My Videos collection plugin, owner of this object. */ - CVcxMyVideosCollectionPlugin& iCollection; - + 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. */ diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/src/vcxmyvideosactivetask.cpp --- a/videocollection/mpxmyvideoscollection/src/vcxmyvideosactivetask.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/src/vcxmyvideosactivetask.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -79,6 +79,7 @@ // Start the AO iStatus = KRequestPending; + MPX_DEBUG1("CVcxMyVideosActiveTask::StartL SetActive"); SetActive(); TRequestStatus* status = &iStatus; User::RequestComplete( status, KErrNone ); @@ -112,39 +113,98 @@ } // --------------------------------------------------------------------------- -// From CActive +// Get the current media // --------------------------------------------------------------------------- // -void CVcxMyVideosActiveTask::RunL() +CMPXMedia* CVcxMyVideosActiveTask::Command() { - // ETrue is done, EFalse is more to do - // - if( iObserver.HandleStepL() ) - { - iObserver.HandleOperationCompleted( KErrNone ); - delete iCurCommand; - iCurCommand = NULL; - } - else - { - ++iCurStep; - iStatus = KRequestPending; - SetActive(); - TRequestStatus* status = &iStatus; - User::RequestComplete( status, KErrNone ); - } + return iCurCommand; } // --------------------------------------------------------------------------- // From CActive // --------------------------------------------------------------------------- // +void CVcxMyVideosActiveTask::RunL() + { + MPX_DEBUG1("CVcxMyVideosActiveTask::RunL() start"); + + switch ( iObserver.HandleStepL() ) + { + case MVcxMyVideosActiveTaskObserver::EDone: + Done(); + break; + + case MVcxMyVideosActiveTaskObserver::EMoreToCome: + ContinueStepping(); + break; + + //observer is responsible for calling Done, Cancel or ContinueStepping + case MVcxMyVideosActiveTaskObserver::EStopStepping: + MPX_DEBUG1("CVcxMyVideosActiveTask::RunL stopped stepping"); + iStopped = ETrue; + break; + } + MPX_DEBUG1("CVcxMyVideosActiveTask::RunL() exit"); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosActiveTask::Done +// --------------------------------------------------------------------------- +// +void CVcxMyVideosActiveTask::Done() + { + MPX_DEBUG1("CVcxMyVideosActiveTask::Done() start"); + + iObserver.HandleOperationCompleted( KErrNone ); + delete iCurCommand; + iCurCommand = NULL; + iStopped = EFalse; + + MPX_DEBUG1("CVcxMyVideosActiveTask::Done() exit"); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosActiveTask::ContinueStepping +// --------------------------------------------------------------------------- +// +void CVcxMyVideosActiveTask::ContinueStepping() + { + ++iCurStep; + iStatus = KRequestPending; + MPX_DEBUG1("CVcxMyVideosActiveTask::ContinueStepping SetActive"); + SetActive(); + iStopped = EFalse; + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + } + +void CVcxMyVideosActiveTask::Cancel() + { + if ( iStopped && !IsActive() ) + { + MPX_DEBUG1("CVcxMyVideosActiveTask:: was paused, calling DoCancel()"); + DoCancel(); + } + else + { + MPX_DEBUG1("CVcxMyVideosActiveTask:: wasn't paused, calling CActive::Cancel() normally"); + CActive::Cancel(); + } + } +// --------------------------------------------------------------------------- +// From CActive +// --------------------------------------------------------------------------- +// void CVcxMyVideosActiveTask::DoCancel() { + MPX_DEBUG1("CVcxMyVideosActiveTask::DoCancel() start"); // Callback and cleanup iObserver.HandleOperationCompleted( KErrCancel ); delete iCurCommand; iCurCommand = NULL; + iStopped = EFalse; + MPX_DEBUG1("CVcxMyVideosActiveTask::DoCancel() exit"); } // --------------------------------------------------------------------------- @@ -153,11 +213,15 @@ // TInt CVcxMyVideosActiveTask::RunError( TInt aError ) { + MPX_DEBUG1("CVcxMyVideosActiveTask::RunError() start"); + // Callback and cleanup iObserver.HandleOperationCompleted( aError ); delete iCurCommand; iCurCommand = NULL; + iStopped = EFalse; + MPX_DEBUG1("CVcxMyVideosActiveTask::RunError() exit"); return KErrNone; } diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/src/vcxmyvideosalbum.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videocollection/mpxmyvideoscollection/src/vcxmyvideosalbum.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -0,0 +1,334 @@ +/* +* 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: Class representing album in My Videos collection. +*/ + +#include +#include +#include +#include +#include +#include "vcxmyvideosalbum.h" +#include "vcxmyvideoscollectionplugin.h" +#include "vcxmyvideosvideocache.h" +#include "vcxmyvideoscollectionutil.h" + + +// --------------------------------------------------------------------------- +// TVcxMyVideosAlbumVideo::TVcxMyVideosAlbumVideo +// --------------------------------------------------------------------------- +// +TVcxMyVideosAlbumVideo::TVcxMyVideosAlbumVideo() + { + Set( 0, 0, 0 ); + } + +// --------------------------------------------------------------------------- +// TVcxMyVideosAlbumVideo::operator= +// --------------------------------------------------------------------------- +// +TVcxMyVideosAlbumVideo& TVcxMyVideosAlbumVideo::operator=( const TVcxMyVideosAlbumVideo& aVideo ) + { + Set( aVideo.iMdsId, aVideo.iRelationMdsId, aVideo.iMedia ); + return *this; + } + +// --------------------------------------------------------------------------- +// TVcxMyVideosAlbumVideo::Set +// --------------------------------------------------------------------------- +// +void TVcxMyVideosAlbumVideo::Set( TUint32 aMdsId, TUint32 aRelationMdsId, CMPXMedia* aVideo ) + { + iMdsId = aMdsId; + iRelationMdsId = aRelationMdsId; + iMedia = aVideo; + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosAlbum::CVcxMyVideosAlbum +// --------------------------------------------------------------------------- +// +CVcxMyVideosAlbum::CVcxMyVideosAlbum( CVcxMyVideosCollectionPlugin& aCollectionPlugin ) +: iCollection( aCollectionPlugin ) + { + // No implementation required + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosAlbum::~CVcxMyVideosAlbum +// --------------------------------------------------------------------------- +// +CVcxMyVideosAlbum::~CVcxMyVideosAlbum() + { + iVideoList.Close(); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosAlbum::NewLC +// --------------------------------------------------------------------------- +// +CVcxMyVideosAlbum* CVcxMyVideosAlbum::NewLC( CVcxMyVideosCollectionPlugin& aCollectionPlugin ) + { + CVcxMyVideosAlbum* self = new (ELeave) CVcxMyVideosAlbum( aCollectionPlugin ); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosAlbum::NewL +// --------------------------------------------------------------------------- +// +CVcxMyVideosAlbum* CVcxMyVideosAlbum::NewL( CVcxMyVideosCollectionPlugin& aCollectionPlugin ) + { + CVcxMyVideosAlbum* self = CVcxMyVideosAlbum::NewLC( aCollectionPlugin ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosAlbum::ConstructL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosAlbum::ConstructL() + { + iVideoList.Reset(); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosAlbum::Sort +// --------------------------------------------------------------------------- +// +void CVcxMyVideosAlbum::Sort() + { + const TLinearOrder KOrderByMdsId( + CVcxMyVideosAlbum::CompareVideosByMdsId ); + + iVideoList.Sort( KOrderByMdsId ); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosAlbum::SetL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosAlbum::SetL( /*CMPXMedia& aAlbum*/ ) + { + //TODO: + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosAlbum::BelongsToAlbum +// --------------------------------------------------------------------------- +// +TBool CVcxMyVideosAlbum::BelongsToAlbum( TUint32 aMdsId ) + { + const TLinearOrder KOrderByMdsId( + CVcxMyVideosAlbum::CompareVideosByMdsId ); + + TInt index; + TVcxMyVideosAlbumVideo video; + video.iMdsId = aMdsId; + TInt err = iVideoList.FindInOrder( video, index, KOrderByMdsId ); + + if ( err != KErrNone ) + { + return EFalse; + } + + return ETrue; + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosAlbum::Video +// --------------------------------------------------------------------------- +// +TInt CVcxMyVideosAlbum::Video( TUint32 aMdsId, TVcxMyVideosAlbumVideo& aVideo, TInt& aIndex ) + { + const TLinearOrder KOrderByMdsId( + CVcxMyVideosAlbum::CompareVideosByMdsId ); + + TVcxMyVideosAlbumVideo videoToFind; + videoToFind.iMdsId = aMdsId; + TInt err = iVideoList.FindInOrder( videoToFind, aIndex, KOrderByMdsId ); + + if ( err == KErrNone ) + { + aVideo = iVideoList[aIndex]; + } + + return err; + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosAlbum::AddL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosAlbum::AddL( TVcxMyVideosAlbumVideo aVideo ) + { + const TLinearOrder KOrderByMdsId( + CVcxMyVideosAlbum::CompareVideosByMdsId ); + + iVideoList.InsertInOrderAllowRepeatsL( aVideo, KOrderByMdsId ); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosAlbum::Remove +// --------------------------------------------------------------------------- +// +void CVcxMyVideosAlbum::Remove( RArray& aMdsIds ) + { + TInt count = aMdsIds.Count(); + for ( TInt i = 0; i < count; i++ ) + { + Remove( aMdsIds[i], EFalse /* don't compress */ ); + } + iVideoList.Compress(); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosAlbum::Remove +// --------------------------------------------------------------------------- +// +void CVcxMyVideosAlbum::Remove( TUint32 aMdsId, TBool aCompress ) + { + const TLinearOrder KOrderByMdsId( + CVcxMyVideosAlbum::CompareVideosByMdsId ); + + TVcxMyVideosAlbumVideo video; + video.iMdsId = aMdsId; + TInt pos; + TInt err = iVideoList.FindInOrder( video, pos, KOrderByMdsId ); + if ( err == KErrNone ) + { + iVideoList.Remove( pos ); + } + if ( aCompress ) + { + iVideoList.Compress(); + } + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosAlbum::CompareVideosByMdsId +// --------------------------------------------------------------------------- +// +TInt CVcxMyVideosAlbum::CompareVideosByMdsId( const TVcxMyVideosAlbumVideo& aVideo1, + const TVcxMyVideosAlbumVideo& aVideo2 ) + { + if ( aVideo1.iMdsId == aVideo2.iMdsId ) + { + return 0; + } + + if ( aVideo1.iMdsId < aVideo2.iMdsId ) + { + return -1; + } + return 1; + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosAlbum::CreateVideoListL +// Creates album video list from iCollection.iCache->iVideoList. +// --------------------------------------------------------------------------- +// +CMPXMedia* CVcxMyVideosAlbum::CreateVideoListL() + { + CMPXMedia* toVideoList = TVcxMyVideosCollectionUtil::CreateEmptyMediaListL(); + CleanupStack::PushL( toVideoList ); + + AppendToVideoListL( *iCollection.iCache->iVideoList, *toVideoList, 0 ); + + CleanupStack::Pop( toVideoList ); + + return toVideoList; + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosAlbum::CreateVideoListL +// Appends to video list the items which belong to this album. +// --------------------------------------------------------------------------- +// +void CVcxMyVideosAlbum::AppendToVideoListL( CMPXMedia& aFromVideoList, + CMPXMedia& aToVideoList, TInt aNewItemStartIndex ) + { + if ( aNewItemStartIndex < 0 ) + { + return; + } + + CMPXMediaArray* fromArray = aFromVideoList.Value( KMPXMediaArrayContents ); + CMPXMediaArray* toArray = aToVideoList.Value( KMPXMediaArrayContents ); + TUint32 mdsId; + CMPXMedia* fromVideo; + TInt count = fromArray->Count(); + for ( TInt i = aNewItemStartIndex; i < count; i++ ) + { + fromVideo = fromArray->AtL( i ); + mdsId = TVcxMyVideosCollectionUtil::IdL( *fromVideo ).iId1; + if ( BelongsToAlbum( mdsId ) ) + { + CMPXMedia* toVideo = CMPXMedia::NewL( *fromVideo ); //share underlying memory + CleanupStack::PushL( toVideo ); + toArray->AppendL( toVideo ); + CleanupStack::Pop( toVideo ); + } + } + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosAlbum::CalculateAttributesL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosAlbum::CalculateAttributesL( TInt aStartIndex ) + { + TInt videoCount = 0; + TUint32 count = iVideoList.Count(); + TInt newCount = 0; + CMPXMedia* video; + CMPXMedia* latestNewVideo = NULL; + TInt pos; + TUint32 flags; + TInt64 currentItemsCreationDate = 0; + TInt64 latestCreationDate = TVcxMyVideosCollectionUtil::CreationDateL( *iMedia ); + for ( TInt i = aStartIndex; i < count; i++ ) + { + video = iCollection.iCache->FindVideoByMdsIdL( iVideoList[i].iMdsId, pos ); + if ( video ) + { + videoCount++; + flags = TVcxMyVideosCollectionUtil::FlagsL( *video ); + if ( flags & EVcxMyVideosVideoNew ) + { + newCount++; + currentItemsCreationDate = TVcxMyVideosCollectionUtil::CreationDateL( *video ); + if ( latestCreationDate < currentItemsCreationDate ) + { + latestCreationDate = currentItemsCreationDate; + latestNewVideo = video; + } + } + } + } + iMedia->SetTObjectValueL( KVcxMediaMyVideosCategoryItemCount, videoCount ); + iMedia->SetTObjectValueL( KVcxMediaMyVideosCategoryNewItemCount, newCount ); + if ( latestNewVideo ) + { + iMedia->SetTextValueL( KVcxMediaMyVideosCategoryNewItemName, + TVcxMyVideosCollectionUtil::Title( *latestNewVideo ) ); + } + iMedia->SetTObjectValueL( KMPXMediaGeneralDate, latestCreationDate ); + } + diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/src/vcxmyvideosalbums.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videocollection/mpxmyvideoscollection/src/vcxmyvideosalbums.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -0,0 +1,806 @@ +/* +* 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: Albums related collection functionality (except db operations). +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include "vcxmyvideosalbums.h" +#include "vcxmyvideoscollectionutil.h" +#include "vcxmyvideoscollectionplugin.h" +#include "vcxmyvideosmdsdb.h" +#include "vcxmyvideosmdsalbums.h" +#include "vcxmyvideoscollectionutil.h" +#include "vcxmyvideosmessagelist.h" +#include "vcxmyvideosopenhandler.h" + +// ============================ MEMBER FUNCTIONS ============================= + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CVcxMyVideosAlbums::CVcxMyVideosAlbums( CVcxMyVideosCollectionPlugin& aCollection ) +: iCollection( aCollection ) + { + } + +// --------------------------------------------------------------------------- +// 2nd-phase constructor +// --------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::ConstructL() + { + iAlbums.Reset(); + iChangedAlbums.Reset(); + } + +// --------------------------------------------------------------------------- +// Two-Phase Constructor +// --------------------------------------------------------------------------- +// +CVcxMyVideosAlbums* CVcxMyVideosAlbums::NewL( CVcxMyVideosCollectionPlugin& aCollection ) + { + CVcxMyVideosAlbums* self = new(ELeave) CVcxMyVideosAlbums( aCollection ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CVcxMyVideosAlbums::~CVcxMyVideosAlbums() + { + delete iAlbumList; + TInt count = iAlbums.Count(); + for ( TInt i = 0; i < count; i++ ) + { + delete iAlbums[i]; + } + iAlbums.Close(); + iMdsOpTargetIds.Close(); + iMdsOpResults.Close(); + iMdsOpResultsUint32.Close(); + iRemoveFromAlbumVideos.Close(); + iChangedAlbums.Close(); + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::CreateAlbumListL +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::CreateAlbumListL() + { + if ( iAlbumList ) + { + return; + } + iAlbumList = TVcxMyVideosCollectionUtil::CreateEmptyMediaListL(); + iCollection.iMyVideosMdsDb->iAlbums->GetAlbumsL( iAlbumList, *this ); + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::CreateAlbumsL +// Called when iAlbumList is ready, fills iAlbums. +// Pointers to CVcxMyVideosVideoCache::iVideoList are not filled in yet. +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::CreateAlbumsL() + { + CMPXMediaArray* albumArray = iAlbumList->Value( KMPXMediaArrayContents ); + + TInt count = albumArray->Count(); + CVcxMyVideosAlbum* album; + CMPXMedia* media; + for ( TInt i = 0; i < count; i++ ) + { + media = albumArray->AtL( i ); + album = CVcxMyVideosAlbum::NewLC( iCollection ); + album->iMdsId = TVcxMyVideosCollectionUtil::IdL( *media ).iId1; + album->iMedia = media; + iAlbums.AppendL( album ); + CleanupStack::Pop( album ); + } + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::GetAlbumContentIdsL +// Fetches MDS IDs for all albums. +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::GetAlbumContentIdsL() + { + TInt count = iAlbums.Count(); + for ( TInt i = 0; i < count; i++ ) + { + // These calls go to queue and responses arrive asynchronously + // to HandleGetAlbumContentIdsRespL. + iCollection.iMyVideosMdsDb->iAlbums->GetAlbumContentIdsL( iAlbums[i]->iMdsId, + iAlbums[i]->iVideoList, *this ); + } + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::Album +// ---------------------------------------------------------------------------- +// +CVcxMyVideosAlbum* CVcxMyVideosAlbums::Album( TUint32 aMdsId, TInt* aPos ) + { + TInt count = iAlbums.Count(); + for ( TInt i = 0; i < count; i++ ) + { + if ( iAlbums[i]->iMdsId == aMdsId ) + { + if ( aPos ) + { + *aPos = i; + } + return iAlbums[i]; + } + } + return NULL; + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::AddVideosToAlbumL +// Command from MPX client. +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::AddVideosToAlbumL( CMPXMedia* aCmd ) + { + TInt albumId = TVcxMyVideosCollectionUtil::Uint32ValueL( *aCmd ); + CVcxMyVideosAlbum* album = Album( albumId ); + if ( album ) + { + CMPXMediaArray* mediaArray = TVcxMyVideosCollectionUtil::MediaArrayL( *aCmd ); + TInt count = mediaArray->Count(); + CMPXMedia* video; + TInt mdsId; + RArray uniqueVideoIds; + uniqueVideoIds.Reset(); + CleanupClosePushL( uniqueVideoIds ); + + for ( TInt i = 0; i < count; i++ ) + { + video = mediaArray->AtL( i ); + mdsId = TVcxMyVideosCollectionUtil::IdL( *video ).iId1; + + // Mark duplicates as failed to aCmd (KErrAlreadyExists) + if ( uniqueVideoIds.Find( mdsId ) == KErrNotFound ) + { + uniqueVideoIds.AppendL( mdsId ); + + // Mark videos which are already in album as failed to aCmd (KErrAlreadyExists) + if ( album->BelongsToAlbum( mdsId ) ) + { + MPX_DEBUG3("CVcxMyVideosAlbums:: %d already belongs to %d album", + mdsId, albumId ); + video->SetTObjectValueL( KVcxMediaMyVideosInt32Value, KErrAlreadyExists ); + } + else + { + video->SetTObjectValueL( KVcxMediaMyVideosInt32Value, KErrNone ); + } + } + else + { + MPX_DEBUG2("CVcxMyVideosAlbums:: %d already present in the aCmd, marking as KErrAlreadyExists", mdsId); + video->SetTObjectValueL( KVcxMediaMyVideosInt32Value, KErrAlreadyExists ); + } + + } + + CleanupStack::PopAndDestroy( &uniqueVideoIds ); + } + + iCollection.iMyVideosMdsDb->iAlbums->AddVideosToAlbumL( aCmd, *this ); + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::RemoveVideosFromAlbumL +// Converts video mpx ids to relation ids and calls RemoveRelationsL. +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::RemoveVideosFromAlbumL( CMPXMedia* aCmd ) + { + TInt albumId = TVcxMyVideosCollectionUtil::Uint32ValueL( *aCmd ); + CMPXMediaArray* array = TVcxMyVideosCollectionUtil::MediaArrayL( *aCmd ); + TVcxMyVideosAlbumVideo video; + TInt index; + TInt error; + CMPXMedia* media; + TInt count = array->Count(); + iMdsOpTargetIds.Reset(); + iMdsOpTargetIds.Reserve( count ); + iRemoveFromAlbumVideos.Reset(); + iRemoveFromAlbumVideos.Reserve( count ); + TVcxMyVideosAlbumVideo paddingVideo; + paddingVideo.iMdsId = 0; + paddingVideo.iRelationMdsId = 0; + + for ( TInt i = 0; i < count; i++ ) + { + media = array->AtL( i ); + error = Album( albumId )->Video( + TVcxMyVideosCollectionUtil::IdL( *media ).iId1, video, index ); + if ( error == KErrNone ) + { + iRemoveFromAlbumVideos.AppendL( video ); //store album video data now to avoid second search when response arrives + iMdsOpTargetIds.AppendL( video.iRelationMdsId ); + } + else + { + iRemoveFromAlbumVideos.AppendL( paddingVideo ); //add dummy video to keep media array and iRemoveFromAlbumVideos in sync + } + } + iMdsOpResultsUint32.Reset(); + iCollection.iMyVideosMdsDb->iAlbums->RemoveRelationsL( + iMdsOpTargetIds, iMdsOpResultsUint32, *this ); + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::AddAlbumL +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::AddAlbumL( CMPXMedia& aCmd ) + { + if ( TVcxMyVideosCollectionUtil::Title( aCmd ).Length() > 255 ) + { + User::Leave( KErrArgument ); + } + + iCollection.iMyVideosMdsDb->iAlbums->AddAlbumL( aCmd ); + + TUint32 mdsId = TVcxMyVideosCollectionUtil::IdL( aCmd ).iId1; + if ( !Album( mdsId ) ) + { + CMPXMediaArray* albumArray = iAlbumList->Value( KMPXMediaArrayContents ); + albumArray->AppendL( aCmd ); + + CVcxMyVideosAlbum* album = CVcxMyVideosAlbum::NewLC( iCollection ); + album->iMdsId = mdsId; + album->iMedia = albumArray->AtL( albumArray->Count() - 1 ); + iAlbums.AppendL( album ); + CleanupStack::Pop( album ); + + iCollection.iMessageList->AddEventL( TMPXItemId( mdsId, KVcxMvcMediaTypeAlbum ), + EMPXItemInserted, EVcxMyVideosListNoInfo, album->iMedia ); + iCollection.iMessageList->SendL(); + } + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::RemoveAlbumsFromMdsOnlyL +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::RemoveAlbumsFromMdsOnlyL( CMPXMedia* aCmd ) + { + iCollection.iMyVideosMdsDb->iAlbums->RemoveAlbumsL( aCmd, *this ); + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::RemoveAlbumsL +// From MDS delete event. +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::RemoveAlbumsL( RArray& aAlbumIds ) + { + TInt count = aAlbumIds.Count(); + for ( TInt i = count -1; i >= 0; i-- ) + { + TBool removed = RemoveAlbumL( aAlbumIds[i], EFalse /* dont compress */); + if ( removed ) + { + aAlbumIds.Remove( i ); + } + } + iAlbums.Compress(); + + iCollection.iMessageList->SendL(); + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::RemoveAlbumL +// ---------------------------------------------------------------------------- +// +TBool CVcxMyVideosAlbums::RemoveAlbumL( TUint32 aMdsId, TBool aCompress ) + { + TInt pos; + CVcxMyVideosAlbum* album = Album( aMdsId, &pos ); + if ( album ) + { + CMPXMediaArray* albumArray = TVcxMyVideosCollectionUtil::MediaArrayL( *iAlbumList ); + + iAlbums.Remove( pos ); + albumArray->Remove( pos ); + + MPX_DEBUG2("CVcxMyVideosAlbums:: removing album from pos %d", pos); + + if ( aCompress ) + { + iAlbums.Compress(); + } + iCollection.iMessageList->AddEventL( TMPXItemId( aMdsId, KVcxMvcMediaTypeAlbum ), + EMPXItemDeleted, EVcxMyVideosListNoInfo ); + return ETrue; + } + return EFalse; + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::CalculateAttributesL +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::CalculateAttributesL() + { + TInt count = iAlbums.Count(); + for ( TInt i = 0; i < count; i++ ) + { + iAlbums[i]->CalculateAttributesL(); + } + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::AddAlbumsFromMdsL +// From MDS insert event, no need to fetch content since the album was just +// created. +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::AddAlbumsFromMdsL( RArray& /*aAlbumIds*/ ) + { + //TODO: implement if we want to support albums which are added by someone else + // than My Videos Collection. + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::HandleGetAlbumsRespL +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::HandleGetAlbumsRespL( CMPXMedia* aAlbumList ) + { + // aAlbumList = iAlbumList + CMPXMediaArray* array = aAlbumList->Value( KMPXMediaArrayContents ); + TInt count = array->Count(); + TMPXItemId mpxId; + CMPXMedia* album; + for ( TInt i = 0; i < count; i++ ) + { + album = array->AtL( i ); + mpxId = TVcxMyVideosCollectionUtil::IdL( *album ); + iCollection.iMessageList->AddEventL( mpxId, EMPXItemInserted, 0, album ); + } + CreateAlbumsL(); //fills in iAlbums from iAlbumList + GetAlbumContentIdsL(); //fills iAlbums with MDS IDs of the videos asynchronously + iCollection.iMessageList->SendL(); + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::HandleGetAlbumContentIdsRespL +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::HandleGetAlbumContentIdsRespL( TUint32 aAlbumId, + RArray& /*aAlbumContentIds*/ ) + { + //&aAlbumContent = iAlbums[x]->iVideoList + + CVcxMyVideosAlbum* album( Album( aAlbumId ) ); + if ( album ) + { + album->Sort(); //sorts iAlbum[x]->iVideoList by MDS ID. + } + + //if last album -> album list is complete + if ( iAlbums[iAlbums.Count() -1]->iMdsId == aAlbumId ) + { + MPX_DEBUG1("CVcxMyVideosAlbums:: content ids for last album arrived -> album list is complete" ); + iAlbumListIsComplete = ETrue; + + if ( iCollection.iOpenHandler->iPendingAlbumOpenId ) + { + MPX_DEBUG1("CVcxMyVideosAlbums:: there was album open pending, calling HandleAlbumOpenL()" ); + + TRAPD( err, iCollection.iOpenHandler->HandleAlbumOpenL() ); + if ( err != KErrNone ) + { + MPX_DEBUG3("CVcxMyVideosAlbums:: HandleAlbumOpenL() left: %d, calling HandleOpen(NULL,%d)", + err, err); + iCollection.iObs->HandleOpen( static_cast(NULL), err ); + } + } + } + + +#ifdef _DEBUG + if ( album ) + { + TInt count = album->iVideoList.Count(); + + MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: content ids for album %d arrived", aAlbumId); + + for ( TInt i = 0; i < album->iVideoList.Count(); i++ ) + { + MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: mds id = %d", album->iVideoList[i].iMdsId ); + } + } +#endif + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::HandleGetAlbumsResp +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::HandleGetAlbumsResp( CMPXMedia* aAlbumList ) + { + TRAP_IGNORE( HandleGetAlbumsRespL( aAlbumList ) ); + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::HandleGetAlbumContentIdsResp +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::HandleGetAlbumContentIdsResp( TUint32 aAlbumId, + RArray& aAlbumContent ) + { + TRAP_IGNORE( HandleGetAlbumContentIdsRespL( aAlbumId, aAlbumContent ) ); + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::HandleAddVideosToAlbumResp +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::HandleAddVideosToAlbumResp( CMPXMedia* aCmd, + RPointerArray& aItemArray ) + { + TRAPD( err, DoHandleAddVideosToAlbumRespL( aCmd, aItemArray ) ); + + if ( err != KErrNone ) + { + CMPXMedia* cmd = iCollection.iActiveTask->Command(); + if ( cmd ) + { + cmd->SetTObjectValueL( KVcxMediaMyVideosInt32Value, err ); + iCollection.iActiveTask->Done(); + } + } + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::DoHandleAddVideosToAlbumResp +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::DoHandleAddVideosToAlbumRespL( CMPXMedia* aCmd, + RPointerArray& aItemArray ) + { + MPX_DEBUG1("CVcxMyVideosAlbums::DoHandleAddVideosToAlbumResp() start"); + + TUint32 albumId = TVcxMyVideosCollectionUtil::Uint32ValueL( *aCmd ); + CVcxMyVideosAlbum* album = Album( albumId ); + + CMPXMediaArray* mediaArray = TVcxMyVideosCollectionUtil::MediaArrayL( *aCmd ); + + TVcxMyVideosAlbumVideo video; + RArray modifiedAlbums; + modifiedAlbums.Reset(); + CleanupClosePushL( modifiedAlbums ); + + TInt mediaArrayCount = mediaArray->Count(); + TInt resultArrayCount = aItemArray.Count(); + CMPXMedia* media; + TInt j = 0; + for ( TInt i = 0; i < mediaArrayCount; i++ ) + { + if ( j > resultArrayCount - 1 ) + { + MPX_DEBUG1("CVcxMyVideosAlbums:: result array already at end, skipping the rest"); + break; //break from for loop + } + + media = mediaArray->AtL( i ); + + // Skip items which were already failed (KErrAlreadyExists) + if ( TVcxMyVideosCollectionUtil::Int32ValueL( *media ) != KErrAlreadyExists ) + { + video.iRelationMdsId = aItemArray[j]->Id(); + MPX_DEBUG3( "CVcxMyVideosAlbums:: item result[%d] = %d (id)", j, video.iRelationMdsId ); + if ( video.iRelationMdsId == KNoId ) + { + media->SetTObjectValueL( KVcxMediaMyVideosInt32Value, + KErrGeneral ); + } + else + { + media->SetTObjectValueL( KVcxMediaMyVideosInt32Value, KErrNone ); + video.iMdsId = TVcxMyVideosCollectionUtil::IdL( *media ).iId1; + if ( album ) + { + album->AddL( video ); + if ( modifiedAlbums.Find( album ) == KErrNotFound ) + { + modifiedAlbums.AppendL( album ); + } + iCollection.iMessageList->AddEventL( TMPXItemId( albumId, KVcxMvcMediaTypeAlbum ), + EMPXItemModified, EVcxMyVideosVideoListOrderChanged ); + } + } + j++; + } + else + { + MPX_DEBUG2("CVcxMyVideosAlbums:: skipping already failed %d(KErrAlreadyExists) media array item", + TVcxMyVideosCollectionUtil::IdL( *media ).iId1 ); + } + } + + TInt count = modifiedAlbums.Count(); + for ( TInt i = 0; i < count; i++ ) + { + modifiedAlbums[i]->CalculateAttributesL(); + } + + CleanupStack::PopAndDestroy( &modifiedAlbums ); + + iCollection.iActiveTask->Done(); + iCollection.iMessageList->SendL(); + + MPX_DEBUG1("CVcxMyVideosAlbums::DoHandleAddVideosToAlbumResp() exit"); + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::HandleRemoveRelationsResp +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::HandleRemoveRelationsResp( RArray& /*aRelationIds*/, + RArray& aResults ) + { + MPX_DEBUG1("CVcxMyVideosAlbums::HandleRemoveRelationsResp() start"); + + // iRemoveFromAlbumVideos and mediaArray are in sync + + TRAP_IGNORE( + + CMPXMedia* cmd = iCollection.iActiveTask->Command(); + CMPXMediaArray* mediaArray = TVcxMyVideosCollectionUtil::MediaArrayL( *cmd ); + TInt count = iRemoveFromAlbumVideos.Count(); + CMPXMedia* video; + TInt relationId; + for ( TInt i = 0; i < count; i++ ) + { + video = mediaArray->AtL( i ); + relationId = iRemoveFromAlbumVideos[i].iRelationMdsId; + if ( relationId != 0 && + aResults.Find( relationId ) != KErrNotFound ) + { + video->SetTObjectValueL( KVcxMediaMyVideosInt32Value, KErrNone ); + } + else + { + video->SetTObjectValueL( KVcxMediaMyVideosInt32Value, KErrGeneral ); + } + } + + ); + + iRemoveFromAlbumVideos.Reset(); + + iCollection.iActiveTask->Done(); + + MPX_DEBUG1("CVcxMyVideosAlbums::HandleRemoveRelationsResp() exit"); + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::HandleRemoveAlbumsResp +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::HandleRemoveAlbumsResp( CMPXMedia* aCmd, + RArray& aResultIds ) + { + TRAP_IGNORE( + + CMPXMediaArray* mediaArray = TVcxMyVideosCollectionUtil::MediaArrayL( *aCmd ); + TInt count = mediaArray->Count(); + TUint32 mdsId; + CMPXMedia* album; + for ( TInt i = 0; i < count; i++ ) + { + album = mediaArray->AtL( i ); + mdsId = TVcxMyVideosCollectionUtil::IdL( *album ).iId1; + if ( aResultIds.Find( mdsId ) != KErrNotFound ) + { + album->SetTObjectValueL( KVcxMediaMyVideosInt32Value, KErrNone ); + } + else + { + album->SetTObjectValueL( KVcxMediaMyVideosInt32Value, KErrGeneral ); + } + } + + ); + + iCollection.iActiveTask->Done(); + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::HandleRelationEvent +// Only relation removed events are received here. +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::HandleRelationEvent( TObserverNotificationType /*aType*/, + const RArray& aRelationArray ) + { + TRAP_IGNORE( + + RArray modifiedAlbums; + modifiedAlbums.Reset(); + CleanupClosePushL( modifiedAlbums ); + + TUint albumId; + CVcxMyVideosAlbum* album; + TInt count = aRelationArray.Count(); + + + for ( TInt i = 0; i < count; i++ ) + { + albumId = aRelationArray[i].LeftObjectId(); + + MPX_DEBUG3("CVcxMyVideosAlbums:: relation (%d,%d) deleted from MDS", + aRelationArray[i].LeftObjectId(), aRelationArray[i].RightObjectId() ); + + if ( iAlbumListIsComplete ) + { + album = Album( albumId ); + if ( album ) + { + if ( modifiedAlbums.Find( album ) == KErrNotFound ) + { + modifiedAlbums.AppendL( album ); + } + album->Remove( aRelationArray[i].RightObjectId(), ETrue /* compress */ ); + iCollection.iMessageList->AddEventL( TMPXItemId( albumId, KVcxMvcMediaTypeAlbum ), + EMPXItemModified, EVcxMyVideosVideoListOrderChanged ); + } + } + else + { + //We are fetching albums already, we assume that it will be up to date. + //If that is not the case, then we should set some flag here and restart + //album fetching from scratch. + } + } + + count = modifiedAlbums.Count(); + for ( TInt i = 0; i < count; i++ ) + { + modifiedAlbums[i]->CalculateAttributesL(); + } + + CleanupStack::PopAndDestroy( &modifiedAlbums ); + + iCollection.iMessageList->SendL(); + + ); + } + +//HandleRelationIdEvent + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::UpdateAlbumL +// Updates album attributes from aAlbum, if album is not found from memory, +// nothing is done (no fetching from MDS). +// This func is also called (by MDS modified event) when items are added or +// removed from album. +// ---------------------------------------------------------------------------- +// +TBool CVcxMyVideosAlbums::UpdateAlbumL( const CMPXMedia& aAlbum ) + { + TBool changed = EFalse; + + TMPXItemId mpxId = TVcxMyVideosCollectionUtil::IdL( aAlbum ); + CVcxMyVideosAlbum* album = Album( mpxId.iId1 ); + + if ( album && album->iMedia ) + { + CMPXMedia* media = album->iMedia; + + if ( media->IsSupported( KMPXMediaGeneralTitle ) ) + { + TPtrC newTitle( TVcxMyVideosCollectionUtil::Title( aAlbum ) ); + TPtrC oldTitle( TVcxMyVideosCollectionUtil::Title( *media ) ); + + if ( newTitle != oldTitle ) + { + media->SetTextValueL( KMPXMediaGeneralTitle, newTitle ); + iCollection.iMessageList->AddEventL( mpxId, EMPXItemModified ); + changed = ETrue; + } + } + // calculate attributes, in case that videos were removed or added to this album + album->CalculateAttributesL(); + } + + return changed; + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::NewVideoFlagChangedL +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::NewVideoFlagChangedL( TUint32 aMdsId ) + { + TInt count = iAlbums.Count(); + for ( TInt i = 0; i < count; i++ ) + { + if ( iAlbums[i]->BelongsToAlbum( aMdsId ) ) + { + iAlbums[i]->CalculateAttributesL(); + iCollection.iMessageList->AddEventL( + TMPXItemId( iAlbums[i]->iMdsId, KVcxMvcMediaTypeAlbum ), + EMPXItemModified, EVcxMyVideosListNoInfo ); + } + } + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::VideoTitleChangedL +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::VideoTitleChangedL( TUint32 aMdsId ) + { + NewVideoFlagChangedL( aMdsId ); // same calculation works for this + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::VideoAddedOrRemovedFromCacheL +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::VideoAddedOrRemovedFromCacheL( CMPXMedia& aVideo ) + { + TInt count = iAlbums.Count(); + TUint32 mdsId = TVcxMyVideosCollectionUtil::IdL( aVideo ).iId1; + for ( TInt i = 0; i < count; i++ ) + { + if ( iAlbums[i]->BelongsToAlbum( mdsId ) ) + { + if ( iChangedAlbums.Find( i ) == KErrNotFound ) + { + iChangedAlbums.AppendL( i ); + } + } + } + } +// ---------------------------------------------------------------------------- +// CVcxMyVideosAlbums::UpdateChangedAlbumsL +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosAlbums::UpdateChangedAlbumsL() + { + TInt count = iChangedAlbums.Count(); + for ( TInt i = 0; i < count; i++ ) + { + iCollection.iMessageList->AddEventL( + TMPXItemId( iAlbums[iChangedAlbums[i]]->iMdsId, KVcxMvcMediaTypeAlbum ), + EMPXItemModified, EVcxMyVideosVideoListOrderChanged ); + iAlbums[iChangedAlbums[i]]->CalculateAttributesL(); + } + iChangedAlbums.Reset(); + } +// END OF FILE diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/src/vcxmyvideosasyncfilecopy.cpp --- a/videocollection/mpxmyvideoscollection/src/vcxmyvideosasyncfilecopy.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/src/vcxmyvideosasyncfilecopy.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -127,7 +127,7 @@ User::LeaveIfError( error ); User::LeaveIfError( iSourceFile.Size( iDataRemaining ) ); User::LeaveIfError( iTargetFile.SetSize( iDataRemaining ) ); - + TInt suggestBlockSize; if ( iDataRemaining > KBigBufSize ) { diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/src/vcxmyvideosasyncfileoperations.cpp --- a/videocollection/mpxmyvideoscollection/src/vcxmyvideosasyncfileoperations.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/src/vcxmyvideosasyncfileoperations.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -34,7 +34,6 @@ #include "vcxmyvideoscollectionplugin.h" #include "vcxmyvideoscollection.hrh" #include "vcxmyvideoscollectionutil.h" -#include "vcxmyvideosdownloadutil.h" #include "vcxmyvideosvideocache.h" #include "vcxmyvideoscategories.h" #include "vcxmyvideosmessagelist.h" @@ -63,7 +62,7 @@ // ---------------------------------------------------------------------------- // CVcxMyVideosAsyncFileOperations::~CVcxMyVideosAsyncFileOperations() - { + { iOperationIdArray.Close(); iOperationResult.Close(); delete iFileCopier; @@ -220,7 +219,8 @@ // CVcxMyVideosAsyncFileOperations::HandleMoveOrCopyStepL // ---------------------------------------------------------------------------- // -TBool CVcxMyVideosAsyncFileOperations::HandleMoveOrCopyStepL() +MVcxMyVideosActiveTaskObserver::TStepResult + CVcxMyVideosAsyncFileOperations::HandleMoveOrCopyStepL() { // Reset inactivity timer. This will prevent ThumbAGDaemon start running while // Move/copy is ongoing and failing the operation due to locked file handle. @@ -228,20 +228,19 @@ CMPXMedia& cmd = iCollection.iActiveTask->GetCommand(); - TBool done; - + MVcxMyVideosActiveTaskObserver::TStepResult stepResult; + if ( iCurrentOperationIndex == 0 && !iFileCopier->CopyIsOngoing() ) { InitMoveOrCopyOperationsL( cmd ); } - TRAPD( err, MoveOrCopyVideoL( iOperationIdArray[iCurrentOperationIndex], - iTargetDrive )); + TRAPD( err, MoveOrCopyVideoL( iOperationIdArray[iCurrentOperationIndex] ) ); if ( iFileCopier->CopyIsOngoing() && err == KErrNone ) { // copy didnt finish yet, lets do some more steps before jumping to next file - return EFalse; + return MVcxMyVideosActiveTaskObserver::EMoreToCome; } iOperationResult.AppendL( err ); @@ -252,7 +251,7 @@ if ( iCurrentOperationIndex > (iOperationIdArray.Count() - 1) ) { iCurrentOperationIndex = 0; - done = ETrue; + stepResult = MVcxMyVideosActiveTaskObserver::EDone; if ( iIsMoveOperation ) { SendOperationRespL( KVcxMessageMyVideosMoveResp ); @@ -264,10 +263,10 @@ } else { - done = EFalse; + stepResult = MVcxMyVideosActiveTaskObserver::EMoreToCome; } - return done; + return stepResult; } // ---------------------------------------------------------------------------- @@ -329,7 +328,7 @@ // ---------------------------------------------------------------------------- // void CVcxMyVideosAsyncFileOperations::CancelOperationL( TInt aErr ) - { + { if ( iCollection.iActiveTask->IsActive() ) { TInt mvCmdId = -1; @@ -440,7 +439,7 @@ // CVcxMyVideosAsyncFileOperations::MoveOrCopyVideoL // ---------------------------------------------------------------------------- // -void CVcxMyVideosAsyncFileOperations::MoveOrCopyVideoL( TUint32 aMdsId, TInt aTargetDrive ) +void CVcxMyVideosAsyncFileOperations::MoveOrCopyVideoL( TUint32 aMdsId ) { if ( iFileCopier->CopyIsOngoing() ) { @@ -453,7 +452,7 @@ } //New file copy starts -> do sanity checks and mds and collection preparations - InitSingleMoveOrCopyL( aMdsId, aTargetDrive ); + InitSingleMoveOrCopyL( aMdsId ); MPX_DEBUG2("CVcxMyVideosAsyncFileOperations:: copying: %S", &iSourcePath); MPX_DEBUG2("CVcxMyVideosAsyncFileOperations:: to : %S", &iTargetPath); @@ -471,7 +470,7 @@ // CVcxMyVideosAsyncFileOperations::InitSingleMoveOrCopyL // ---------------------------------------------------------------------------- // -void CVcxMyVideosAsyncFileOperations::InitSingleMoveOrCopyL( TUint32 aMdsId, TInt aTargetDrive ) +void CVcxMyVideosAsyncFileOperations::InitSingleMoveOrCopyL( TUint32 aMdsId ) { //get media from cache or mds TInt pos; @@ -497,7 +496,7 @@ CleanupStack::PushL( video ); // 1-> // sanity checks - if ( video->ValueTObjectL( KVcxMediaMyVideosDownloadId ) != 0 ) + if ( TVcxMyVideosCollectionUtil::DownloadIdL( *video ) != 0 ) { MPX_DEBUG1("CVcxMyVideosAsyncFileOperations:: file is being downloaded, fail, leaving with KErrInUse code."); User::Leave( KErrInUse ); @@ -505,7 +504,7 @@ iSourcePath = video->ValueText( KMPXMediaGeneralUri ); - if ( !DriveHasEnoughFreeSpaceL( iSourcePath, aTargetDrive ) ) + if ( !DriveHasEnoughFreeSpaceL( iSourcePath, iTargetDrive ) ) { MPX_DEBUG1("CVcxMyVideosAsyncFileOperations:: target drive full -> skipping"); User::Leave( KErrDiskFull ); @@ -522,14 +521,14 @@ TInt sourceDrive; User::LeaveIfError( iCollection.iFs.CharToDrive( iSourcePath[0], sourceDrive ) ); - if ( sourceDrive == aTargetDrive ) + if ( sourceDrive == iTargetDrive ) { MPX_DEBUG1("CVcxMyVideosAsyncFileOperations:: source and target drives are the same, leaving with KErrAlreadyExists."); CleanupStack::PopAndDestroy( video ); // <-1 User::Leave( KErrAlreadyExists ); } - GenerateTargetPathForMoveOrCopyL( iSourcePath, iTargetPath, aTargetDrive ); + GenerateTargetPathForMoveOrCopyL( iSourcePath, iTargetPath, iTargetDrive ); MPX_DEBUG2("CVcxMyVideosAsyncFileOperations:: target path = %S", &iTargetPath ); @@ -682,18 +681,24 @@ if ( sourceDrive == systemDrive ) { //remove *:\data\* from the path - TPtrC pathData( aSourcePath.Mid(3,4) ); + const TInt dataWordStartPos = 3; + const TInt dataWordLength = 4; + + TPtrC pathData( aSourcePath.Mid( dataWordStartPos, dataWordLength ) ); MPX_DEBUG2("CVcxMyVideosAsyncFileOperations:: sourcePath.Mid(3,4)= %S", &pathData); - if ( aSourcePath.Mid(3,4) == KDataDes ) + if ( pathData == KDataDes ) { MPX_DEBUG1("CVcxMyVideosAsyncFileOperations:: source drive is system drive and 'data' exists in sourcePath"); MPX_DEBUG1("CVcxMyVideosAsyncFileOperations:: not copying 'data' to the target path"); - aTargetPath.Append( aSourcePath.Mid( 7 ) ); + + const TInt skipDataWordPos = 7; + aTargetPath.Append( aSourcePath.Mid( skipDataWordPos ) ); } else { - aTargetPath.Append( aSourcePath.Mid( 2 ) ); + const TInt dontSkipDataWordPos = 2; + aTargetPath.Append( aSourcePath.Mid( dontSkipDataWordPos ) ); } } else if ( aTargetDrive == systemDrive ) @@ -718,7 +723,7 @@ // CVcxMyVideosAsyncFileOperations::HandleDeleteStepL // ---------------------------------------------------------------------------- // -TBool CVcxMyVideosAsyncFileOperations::HandleDeleteStepL() +MVcxMyVideosActiveTaskObserver::TStepResult CVcxMyVideosAsyncFileOperations::HandleDeleteStepL() { // Reset inactivity timer. This will prevent ThumbAGDaemon start running while // delete is ongoing and failing the operation due to locked file handle. @@ -728,7 +733,7 @@ //no sanity checks for array items, since we want to generate all events, even if there is nothing to delete - TBool done; + MVcxMyVideosActiveTaskObserver::TStepResult stepResult; TUint32 cmdId = cmd.ValueTObjectL( KVcxMediaMyVideosCommandId ); @@ -774,16 +779,15 @@ if ( iCurrentOperationIndex > (iOperationIdArray.Count() - 1) ) { iCurrentOperationIndex = 0; - done = ETrue; - + stepResult = MVcxMyVideosActiveTaskObserver::EDone; SendOperationRespL( KVcxMessageMyVideosDeleteResp ); } else { - done = EFalse; + stepResult = MVcxMyVideosActiveTaskObserver::EMoreToCome; } - return done; + return stepResult; } diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/src/vcxmyvideoscategories.cpp --- a/videocollection/mpxmyvideoscollection/src/vcxmyvideoscategories.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/src/vcxmyvideoscategories.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -182,6 +182,8 @@ CleanupClosePushL( newVideosIncrements ); // 2-> TInt i; + videosIncrements.ReserveL( categoryCount ); + newVideosIncrements.ReserveL( categoryCount ); for ( i = 0; i < categoryCount; i++ ) { videosIncrements.AppendL( 0 ); @@ -277,18 +279,20 @@ { category = aCategoryArray.AtL( i ); - UpdateVideosCountL( *category, aVideosIncrements[i], KVcxMediaMyVideosCategoryItemCount, - EVcxMyVideosListNoInfo ); + //codescanner warning: aVideosIncrements count is same as aCategoryArray count, so the range is checked + UpdateVideosCountL( *category, aVideosIncrements[i], + KVcxMediaMyVideosCategoryItemCount, EVcxMyVideosListNoInfo ); modified = ETrue; } + //codescanner warning: aNewVideosIncrements count is same as aCategoryArray count, so the range is checked if ( aNewVideosIncrements[i] != 0 ) { category = aCategoryArray.AtL( i ); - UpdateVideosCountL( *category, aNewVideosIncrements[i], KVcxMediaMyVideosCategoryNewItemCount, - EVcxMyVideosListNoInfo ); + UpdateVideosCountL( *category, aNewVideosIncrements[i], + KVcxMediaMyVideosCategoryNewItemCount, EVcxMyVideosListNoInfo ); modified = ETrue; } @@ -444,16 +448,8 @@ MPX_DEBUG1("CVcxMyVideosCategories:: video added"); if ( TVcxMyVideosCollectionUtil::FlagsL( aVideo ) & EVcxMyVideosVideoNew ) { - TInt64 newItemsDate( 0 ); - if ( aVideo.IsSupported( KMPXMediaGeneralDate ) ) - { - newItemsDate = aVideo.ValueTObjectL( KMPXMediaGeneralDate ); - } - TInt64 prevNewDate( 0 ); - if ( aCategory.IsSupported( KMPXMediaGeneralDate ) ) - { - prevNewDate = aCategory.ValueTObjectL( KMPXMediaGeneralDate ); - } + TInt64 newItemsDate = TVcxMyVideosCollectionUtil::CreationDateL( aVideo ); + TInt64 prevNewDate = TVcxMyVideosCollectionUtil::CreationDateL( aCategory ); if ( static_cast(newItemsDate) > static_cast(prevNewDate) ) { @@ -550,11 +546,14 @@ { case -1: return KVcxMyVideosAllVideosCategoryIndex; - + case EVcxMyVideosOriginCapturedWithCamera: return KVcxMyVideosCapturedCategoryIndex; case EVcxMyVideosOriginDownloaded: +#ifndef VIDEO_COLLECTION_PLUGIN_TB92 + return KVcxMyVideosDownloadsCategoryIndex; +#endif case EVcxMyVideosOriginTvRecording: case EVcxMyVideosOriginSideLoaded: case EVcxMyVideosOriginOther: @@ -680,7 +679,8 @@ prevNewVideoName.Set( iListArray->AtL( categoryIndex )->ValueText( KVcxMediaMyVideosCategoryNewItemName ) ); CMPXMedia* newVideo; - currentNewVideoName.Set( CalculateNewVideoNameL( *videoList, aOrigin, aIgnoredIds, newVideo ) ); + currentNewVideoName.Set( CalculateNewVideoNameL( + *videoList, aOrigin, aIgnoredIds, newVideo ) ); if ( currentNewVideoName.CompareF( prevNewVideoName ) != 0 ) { iListArray->AtL( categoryIndex )->SetTextValueL( diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/src/vcxmyvideoscollectionplugin.cpp --- a/videocollection/mpxmyvideoscollection/src/vcxmyvideoscollectionplugin.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/src/vcxmyvideoscollectionplugin.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -11,12 +11,11 @@ * * Contributors: * -* Description: Implementation of My Videos collection Plugin interface* +* Description: Implementation of My Videos collection Plugin interface* */ - // INCLUDE FILES #include #include @@ -35,15 +34,14 @@ #include "vcxmyvideoscollectionplugin.h" #include "vcxmyvideoscollection.hrh" #include "vcxmyvideoscollectionutil.h" -#include "vcxmyvideosdownloadutil.h" #include "vcxmyvideosvideocache.h" #include "vcxmyvideoscategories.h" #include "vcxmyvideosmessagelist.h" #include "vcxmyvideosasyncfileoperations.h" #include "vcxmyvideosopenhandler.h" +#include "vcxmyvideosmdsalbums.h" +#include "vcxmyvideosalbums.h" -const TInt KMaxFileDeleteAttempts = 4; -const TInt KFileDeleteLoopDelay = 100000; // ============================ MEMBER FUNCTIONS ============================== @@ -73,13 +71,13 @@ MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: this = %x", this); delete iMyVideosMdsDb; - delete iDownloadUtil; delete iCache; delete iMessageList; delete iCategories; delete iAsyncFileOperations; delete iActiveTask; delete iOpenHandler; + delete iAlbums; iFs.Close(); } @@ -102,8 +100,11 @@ MPX_FUNC("CVcxMyVideosCollectionPlugin::ConstructL"); User::LeaveIfError( iFs.Connect() ); - +#ifdef VIDEO_COLLECTION_PLUGIN_TB92 iMyVideosMdsDb = CVcxMyVideosMdsDb::NewL( this, iFs ); +#else + iMyVideosMdsDb = CVcxMyVideosMdsDb::NewL( this, iFs, &AlbumsL() ); +#endif iActiveTask = CVcxMyVideosActiveTask::NewL( *this ); iCache = CVcxMyVideosVideoCache::NewL( *this ); iMessageList = CVcxMyVideosMessageList::NewL( *this ); @@ -132,7 +133,7 @@ const TArray& /*aCaps*/, CMPXAttributeSpecs* /*aSpecs*/) { - MPX_FUNC("CMPXMyVideosDbPlugin::MediaL"); + MPX_FUNC("CVcxMyVideosCollectionPlugin::MediaL"); MPX_DEBUG_PATH(aPath); RArray supportedIds; @@ -165,7 +166,7 @@ if ( ids.Count() == 0 ) { - MPX_DEBUG1("CMPXMyVideosDbPlugin:: request didn't contain any items ids, aborting"); + MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: request didn't contain any items ids, aborting"); iObs->HandleMedia( NULL, KErrArgument ); CleanupStack::PopAndDestroy( &ids ); // <-2 @@ -181,27 +182,27 @@ if ( videoInCache ) { // 0 attributes means "get all" -> can't use cache - MPX_DEBUG2("CMPXMyVideosDbPlugin:: client is requesting %d attributes", aAttrs.Count()); + MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: client is requesting %d attributes", aAttrs.Count()); if ( aAttrs.Count() > 0 ) { TBool nonSupportedAttrCanBeFoundFromMds; if ( TVcxMyVideosCollectionUtil::AreSupported( *videoInCache, aAttrs, nonSupportedAttrCanBeFoundFromMds ) ) { - MPX_DEBUG1("CMPXMyVideosDbPlugin:: all attributes found from cache"); + MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: all attributes found from cache"); useCachedVideo = ETrue; } else { - MPX_DEBUG1("CMPXMyVideosDbPlugin:: all attributes NOT found from cache"); + MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: all attributes NOT found from cache"); if ( !nonSupportedAttrCanBeFoundFromMds ) { - MPX_DEBUG1("CMPXMyVideosDbPlugin:: none of the non cached attrs can be found from MDS -> use cached version"); + MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: none of the non cached attrs can be found from MDS -> use cached version"); useCachedVideo = ETrue; } else { - MPX_DEBUG1("CMPXMyVideosDbPlugin:: at least one of the non cached attributes can be found from MDS"); + MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: at least one of the non cached attributes can be found from MDS"); } } } @@ -211,16 +212,23 @@ if ( useCachedVideo ) { - MPX_DEBUG1("CMPXMyVideosDbPlugin:: using cached video"); + MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: using cached video"); video = CMPXMedia::CopyL( *videoInCache ); } else { - MPX_DEBUG1("CMPXMyVideosDbPlugin:: fetching from MDS"); + MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: fetching from MDS"); video = iMyVideosMdsDb->CreateVideoL( ids[0].iId1, ETrue /* full details */ ); } - - iObs->HandleMedia( video, KErrNone ); + + if ( video ) + { + iObs->HandleMedia( video, KErrNone ); + } + else + { + iObs->HandleMedia( NULL, KErrNotFound ); + } CleanupStack::PopAndDestroy( &ids ); // <-2 CleanupStack::PopAndDestroy( &supportedIds ); // <-1 @@ -246,7 +254,7 @@ void CVcxMyVideosCollectionPlugin::CommandL( CMPXCommand& aCmd) { - MPX_FUNC("CVcxMyVideosCollectionPlugin::CommandL 2"); + MPX_DEBUG1("CVcxMyVideosCollectionPlugin::CommandL() start"); if ( !aCmd.IsSupported( KMPXCommandGeneralId ) ) { @@ -292,7 +300,20 @@ MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: sync KMPXCommandIdCollectionSet arrived"); CMPXMedia* video = aCmd.Value( KMPXCommandColSetMedia ); - SetVideoL( *video ); + + TMPXItemId mpxId = TVcxMyVideosCollectionUtil::IdL( *video ); + if ( mpxId.iId2 == KVcxMvcMediaTypeVideo ) + { + SetVideoL( *video ); + } + else if ( mpxId.iId2 == KVcxMvcMediaTypeAlbum ) + { + iMyVideosMdsDb->iAlbums->SetAlbumL( *video ); + } + else + { + User::Leave( KErrNotFound ); + } } break; @@ -313,6 +334,13 @@ iActiveTask->Cancel(); } break; + + case KVcxCommandMyVideosAddAlbum: + { + MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: sync KVcxCommandMyVideosAddAlbum arrived"); + AlbumsL().AddAlbumL( aCmd ); + } + break; } } break; @@ -324,7 +352,7 @@ } } } - + MPX_DEBUG1("CVcxMyVideosCollectionPlugin::CommandL() exit"); } // ---------------------------------------------------------------------------- @@ -366,33 +394,6 @@ // void CVcxMyVideosCollectionPlugin::SendMessages( CMPXMessage& aMessages ) { -#if _DEBUG - TRAP_IGNORE( - - if ( aMessages.IsSupported( KMPXMessageArrayContents ) ) - { - const CMPXMessageArray* messageArray = - aMessages.Value(KMPXMessageArrayContents); - - for( TInt i = 0; i < messageArray->Count(); i++ ) - { - MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: sending message ID: %d in array", ++iTotalMessagesSent); - messageArray->AtL( i )->SetTObjectValueL( KVcxMediaMyVideosMessageId, iTotalMessagesSent ); - iMessagesInArraySent++; - } - - MPX_DEBUG3("CVcxMyVideosCollectionPlugin:: total messages sent (MSG ID): %d, messages in array sent: %d", - iTotalMessagesSent, iMessagesInArraySent); - } - else - { - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: NO ARRAY IN MESSAGE!!!"); - return; - } - - ); -#endif - iObs->HandleMessage( aMessages ); } @@ -404,7 +405,6 @@ TMPXChangeEventType aEvent, RArray& aId ) { - //MPX_FUNC("CVcxMyVideosCollectionPlugin::HandleMyVideosDbEvent"); TRAPD( err, DoHandleMyVideosDbEventL( aEvent, aId )); if ( err != KErrNone ) { @@ -422,6 +422,10 @@ { MPX_FUNC("CVcxMyVideosCollectionPlugin::DoHandleMyVideosDbEventL"); + RArray nonVideoIds; + nonVideoIds.Reset(); + CleanupClosePushL( nonVideoIds ); + switch ( aEvent ) { case EMPXItemDeleted: @@ -430,7 +434,10 @@ MPX_DEBUG1("CVcxMyVideosCollectionPlugin::DoHandleMyVideosDbEventL() Items from MDS deleted, deleting from cache |" ); MPX_DEBUG1("CVcxMyVideosCollectionPlugin::DoHandleMyVideosDbEventL() --------------------------------------------'"); - iCache->RemoveL( aId ); + iCache->RemoveL( aId ); +#ifndef VIDEO_COLLECTION_PLUGIN_TB92 + AlbumsL().RemoveAlbumsL( aId ); +#endif } break; @@ -443,22 +450,33 @@ if ( iMyVideosMdsDb->iVideoListFetchingIsOngoing ) { MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: video list fetching is ongoing, ignoring add event"); + CleanupStack::PopAndDestroy( &nonVideoIds ); return; } TBool videoListFetchingWasCancelled = EFalse; - + // After the call, aId will contain only items which were actually inserted to cache. // We receive add events for all object types. When fetching the item from MDS we use - // video condition and only video objects are added to cache. - iCache->AddVideosFromMdsL( aId, videoListFetchingWasCancelled ); + // video condition and only video objects are added to cache. Items which were detected + // to not be videos are added to nonVideoIds. + iCache->AddVideosFromMdsL( aId, videoListFetchingWasCancelled, &nonVideoIds ); + +#ifndef VIDEO_COLLECTION_PLUGIN_TB92 +#if 0 //TODO: do this if we want to support albums which are being added by someone else than My Videos Collection + + //After the call nonVideoIds will contain only items which were actually added + //to albums. + AlbumsL().AddAlbumsFromMdsL( nonVideoIds ); +#endif +#endif + if ( videoListFetchingWasCancelled ) { RestartVideoListFetchingL(); } - - SyncWithDownloadsL( aId ); } + break; case EMPXItemModified: @@ -467,7 +485,11 @@ MPX_DEBUG1("CVcxMyVideosCollectionPlugin::DoHandleMyVideosDbEventL() Items modified in MDS, updating cache |"); MPX_DEBUG1("CVcxMyVideosCollectionPlugin::DoHandleMyVideosDbEventL() --------------------------------------'"); CMPXMedia* video; - for ( TInt i = 0; i < aId.Count(); i++ ) +#ifndef VIDEO_COLLECTION_PLUGIN_TB92 + CMPXMedia* album; +#endif + TInt count = aId.Count(); + for ( TInt i = count - 1; i >= 0; i-- ) { video = iMyVideosMdsDb->CreateVideoL( aId[i], ETrue /* full details */ ); @@ -479,41 +501,75 @@ } else { +#ifdef VIDEO_COLLECTION_PLUGIN_TB92 MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: couldn't find the modified item from MDS"); + aId.Remove( i ); +#else + MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: item was not found from videos, checking albums"); + album = iMyVideosMdsDb->iAlbums->GetAlbumL( aId[i] ); + + if ( album ) + { + CleanupStack::PushL( album ); // 1-> + iAlbums->UpdateAlbumL( *album ); // this will add event to iMessageList if necessarry + CleanupStack::PopAndDestroy( album ); // <-1 + } + else + { + MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: couldn't find the modified item from MDS"); + } + aId.Remove( i ); +#endif } } + } - SyncWithDownloadsL( aId ); break; } - - TInt pos; - for ( TInt i = 0; i < aId.Count(); i++ ) - { - if ( aEvent == EMPXItemInserted ) + + TInt pos; + TInt count = aId.Count(); + for ( TInt i = 0; i < count; i++ ) { - // add item from cache to the message if we have it. - CMPXMedia* video = iCache->FindVideoByMdsIdL( aId[i], pos ); - TRAP_IGNORE( iMessageList->AddEventL( TMPXItemId( aId[i], 0), aEvent, 0, video ) ); + if ( aEvent == EMPXItemInserted ) + { + // add item from cache to the message if we have it. + CMPXMedia* video = iCache->FindVideoByMdsIdL( aId[i], pos ); + TRAP_IGNORE( iMessageList->AddEventL( TMPXItemId( aId[i], KVcxMvcMediaTypeVideo), + aEvent, 0, video ) ); + } + else + { + TRAP_IGNORE( iMessageList->AddEventL( TMPXItemId( aId[i], KVcxMvcMediaTypeVideo), + aEvent ) ); + } } - else - { - TRAP_IGNORE( iMessageList->AddEventL( TMPXItemId( aId[i], 0), aEvent ) ); - } + +#ifndef VIDEO_COLLECTION_PLUGIN_TB92 + //nonVideoIds are albums + count = nonVideoIds.Count(); + for ( TInt i = 0; i < count; i++ ) + { + TRAP_IGNORE( iMessageList->AddEventL( + TMPXItemId( nonVideoIds[i], KVcxMvcMediaTypeAlbum ), aEvent ) ); } - - iMessageList->SendL(); + + iAlbums->UpdateChangedAlbumsL(); +#endif + + CleanupStack::PopAndDestroy( &nonVideoIds ); + iMessageList->SendL(); } // ---------------------------------------------------------------------------- // CVcxMyVideosCollectionPlugin::HandleStepL // ---------------------------------------------------------------------------- // -TBool CVcxMyVideosCollectionPlugin::HandleStepL() +MVcxMyVideosActiveTaskObserver::TStepResult CVcxMyVideosCollectionPlugin::HandleStepL() { MPX_FUNC("CVcxMyVideosCollectionPlugin::HandleStepL"); - TBool done(ETrue); + MVcxMyVideosActiveTaskObserver::TStepResult stepResult(MVcxMyVideosActiveTaskObserver::EDone); switch ( iActiveTask->GetTask() ) { @@ -532,8 +588,7 @@ MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: async KMPXCommandIdCollectionSet out"); - done = ETrue; - + stepResult = MVcxMyVideosActiveTaskObserver::EDone; break; } case KVcxCommandIdMyVideos: @@ -548,183 +603,7 @@ TInt myVideosCmd( cmd.ValueTObjectL( KVcxMediaMyVideosCommandId ) ); switch ( myVideosCmd ) - { - case KVcxCommandMyVideosStartDownload: - { - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: Handling KVcxCommandMyVideosStartDownload command."); - - CMPXMedia* video = CMPXMedia::NewL( *(iActiveTask->GetCommand().Value( - KMPXCommandColAddMedia)) ); - CleanupStack::PushL( video ); // 1-> - - if ( !iCache->iVideoList ) - { - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: iVideoListCache = NULL -> creating new empty iVideoListCache"); - iCache->iVideoListIsPartial = ETrue; - iCache->iVideoList = TVcxMyVideosCollectionUtil::CreateEmptyMediaListL(); - } - - TBool resume = EFalse; - - if ( video->IsSupported( KVcxMediaMyVideosDownloadId ) ) - { - TUint32 downloadId = video->ValueTObjectL( KVcxMediaMyVideosDownloadId ); - if ( downloadId != 0 ) - { - MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: download id %d given by the client -> this is download resume", - downloadId); - resume = ETrue; - - // load the existing item to cache if its not there already - } - } - - if ( !resume ) - { - if ( !video->IsSupported( KVcxMediaMyVideosRemoteUrl ) ) - { - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: KVcxMediaMyVideosRemoteUrl not supported -> leaving with KErrArgument"); - User::Leave( KErrArgument ); - } - - if ( video->ValueText( KVcxMediaMyVideosRemoteUrl ).Length() > - KVcxMvcMaxUrlLength ) - { - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: url longer than 1024 -> leaving with KErrArgument"); - User::Leave( KErrArgument ); - } - - MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: starting download for url: %S", - &video->ValueText( KVcxMediaMyVideosRemoteUrl ) ); - - video->SetTObjectValueL( KVcxMediaMyVideosOrigin, EVcxMyVideosOriginDownloaded ); - video->SetTObjectValueL( KVcxMediaMyVideosDownloadState, - static_cast(EVcxMyVideosDlStateDownloading) ); - video->SetTObjectValueL( KMPXMediaGeneralFlags, EVcxMyVideosVideoNew ); - - HBufC* fileName = DownloadUtilL().CreateFilePathL( *video ); - CleanupStack::PushL( fileName ); // 2-> - video->SetTextValueL( KMPXMediaGeneralUri, *fileName ); - CleanupStack::PopAndDestroy( fileName ); // <-2 - } - - TRAPD( err, DownloadUtilL().StartDownloadL( *video ) ); //download id is written to video object - - if ( err != KErrNone ) - { - MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: StartDownloadL left: %d", err); - User::Leave( err ); - } - - if ( !resume ) - { - TUint32 newDownloadId = video->ValueTObjectL( KVcxMediaMyVideosDownloadId ); - MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: new download ID: %d", - newDownloadId); - - AddVideoToMdsAndCacheL( *video ); - } - else - { - // clear old error codes from the dl item - TInt pos; - - CMPXMedia* videoInCache = iCache->FindVideoByMdsIdL( - TVcxMyVideosCollectionUtil::IdL( *video ), pos ); - if ( videoInCache ) - { - videoInCache->SetTObjectValueL( KVcxMediaMyVideosDownloadError, 0 ); - videoInCache->SetTObjectValueL( KVcxMediaMyVideosDownloadGlobalError, 0 ); - } - } - - CleanupStack::PopAndDestroy( video ); // <-1 - done = ETrue; - } - break; - - case KVcxCommandMyVideosCancelDownload: - { - // Error code is returned to client if dl item was left to system. - // If file delete fails, then mds item is also left to system. - - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: Handling KVcxCommandMyVideosCancelDownload command."); - - CMPXMedia* video = CMPXMedia::NewL( *(iActiveTask->GetCommand().Value( - KMPXCommandColAddMedia)) ); - CleanupStack::PushL( video ); // 1-> - - if ( !video->IsSupported( KVcxMediaMyVideosDownloadId ) || - !video->IsSupported( KMPXMediaGeneralId ) || - !video->IsSupported( KMPXMediaGeneralUri ) ) - { - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: parameter missing, can't cancel dl, leaving with KErrArgument"); - User::Leave( KErrArgument ); - } - - TUint32 downloadId = video->ValueTObjectL( - KVcxMediaMyVideosDownloadId ); - DownloadUtilL().CancelDownload( downloadId, ETrue /* remove file */ ); - - if ( BaflUtils::FileExists( iFs, video->ValueText( KMPXMediaGeneralUri ) ) ) - { - TMPXItemId mpxItemId = video->ValueTObjectL( KMPXMediaGeneralId ); - TInt err( KErrNone ); - - for ( TInt i = 0; i < KMaxFileDeleteAttempts; i++ ) - { - TRAP( err, AsyncFileOperationsL().DeleteVideoL( mpxItemId.iId1, ETrue ) ); - - if ( err == KErrInUse ) - { - MPX_DEBUG1( "CVcxMyVideosCollectionPlugin:: file is already in use, waiting a moment and try again"); - User::After( KFileDeleteLoopDelay ); - } - else - { - break; - } - } - - if ( err != KErrNone && err != KErrNotFound ) - { -#ifdef _DEBUG - if ( err == KErrInUse ) - { - TVcxMyVideosCollectionUtil::PrintOpenFileHandlesL( - video->ValueText( KMPXMediaGeneralUri ), iFs ); - } -#endif - - // Some error occured when cancelling download operation, dl item is however gone and file is left - // -> change dl id to 0 and leave mpx collection item there. Report operation to client as a success. - MPX_DEBUG1( "CVcxMyVideosCollectionPlugin:: dl item is gone from dl manager, file and mpx item are left, setting dl id to 0"); - TRAP_IGNORE( SetDownloadIdToZeroL( downloadId ) ); - } - } - - CleanupStack::PopAndDestroy( video ); // <-1 - done = ETrue; - } - break; - - case KVcxCommandMyVideosPauseDownload: - { - CMPXMedia& cmd = iActiveTask->GetCommand(); - if ( !cmd.IsSupported( KVcxMediaMyVideosDownloadId ) ) - { - User::Leave( KErrArgument ); - } - else - { - TInt err = DownloadUtilL().PauseDownload( - cmd.ValueTObjectL( KVcxMediaMyVideosDownloadId ) ); - User::LeaveIfError( err ); - } - done = ETrue; - } - break; - + { case KVcxCommandMyVideosGetMediaFullDetailsByMpxId: { MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: KVcxCommandMyVideosGetMediaFullDetailsByMpxId received"); @@ -738,25 +617,21 @@ CMPXMedia* video = iMyVideosMdsDb->CreateVideoL( mpxId.iId1, ETrue /* full details */ ); - + if ( !video ) { - User::Leave( KErrGeneral ); + User::Leave( KErrNotFound ); } CleanupStack::PushL( video ); // 1-> - - TBool eventsAdded; - SyncVideoWithDownloadsL( *video, eventsAdded, - EFalse /* dont add event to iMessageList */ ); - + cmd.SetCObjectValueL( KMPXCommandColAddMedia, video ); CleanupStack::PopAndDestroy( video ); // <-1 cmd.SetTObjectValueL(KMPXMessageCollectionId, TUid::Uid( KVcxUidMyVideosMpxCollection)); - done = ETrue; + stepResult = MVcxMyVideosActiveTaskObserver::EDone; } break; @@ -802,22 +677,18 @@ if ( !iCache->iVideoList ) { MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: iVideoListCache = NULL -> creating new empty iCache->iVideoList"); - iCache->iVideoListIsPartial = ETrue; + iCache->SetComplete( EFalse ); iCache->iVideoList = TVcxMyVideosCollectionUtil::CreateEmptyMediaListL(); } TBool videoListFetchingWasCancelled = EFalse; - if ( iCache->iVideoListIsPartial ) + if ( !iCache->IsComplete() ) { // Load items to cache MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: loading requested items to iCache->iVideoList"); - + iCache->AddVideosFromMdsL( mdsIds, videoListFetchingWasCancelled ); - if ( mdsIds.Count() > 0 ) - { - SyncWithDownloadsL( mdsIds ); - } } else { @@ -850,7 +721,7 @@ CleanupStack::PopAndDestroy( &mdsIds2 ); // <-2 CleanupStack::PopAndDestroy( &mdsIds ); // <-1 - done = ETrue; + stepResult = MVcxMyVideosActiveTaskObserver::EDone; } break; @@ -858,16 +729,44 @@ case KVcxCommandMyVideosMove: { MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: KVcxCommandMyVideosMove or Copy step"); - done = AsyncFileOperationsL().HandleMoveOrCopyStepL(); + stepResult = AsyncFileOperationsL().HandleMoveOrCopyStepL(); } break; case KVcxCommandMyVideosDelete: { MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: KVcxCommandMyVideosDelete step"); - done = AsyncFileOperationsL().HandleDeleteStepL(); + stepResult = AsyncFileOperationsL().HandleDeleteStepL(); } break; + + case KVcxCommandMyVideosAddToAlbum: + iAlbums->AddVideosToAlbumL( &iActiveTask->GetCommand() ); + stepResult = MVcxMyVideosActiveTaskObserver::EStopStepping; + break; + + case KVcxCommandMyVideosRemoveFromAlbum: + iAlbums->RemoveVideosFromAlbumL( &iActiveTask->GetCommand() ); + stepResult = MVcxMyVideosActiveTaskObserver::EStopStepping; + break; + + case KVcxCommandMyVideosAddAlbum: + { + MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: async KVcxCommandMyVideosAddAlbum arrived"); + AlbumsL().AddAlbumL( iActiveTask->GetCommand() ); + stepResult = MVcxMyVideosActiveTaskObserver::EDone; + break; + } + + case KVcxCommandMyVideosRemoveAlbums: + { + MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: async KVcxCommandMyVideosRemoveAlbums arrived"); + AlbumsL().RemoveAlbumsFromMdsOnlyL( iActiveTask->Command() ); + stepResult = MVcxMyVideosActiveTaskObserver::EStopStepping; + break; + } + + } } break; @@ -878,7 +777,7 @@ TMPXItemId mpxId = iActiveTask->GetCommand().ValueTObjectL( KMPXMediaGeneralId ); AsyncFileOperationsL().DeleteVideoL( mpxId.iId1 ); - done = ETrue; + stepResult = MVcxMyVideosActiveTaskObserver::EDone; break; } @@ -889,7 +788,7 @@ break; } } - return done; + return stepResult; } @@ -905,10 +804,14 @@ if ( aErr != KErrNone ) { MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: Leave or cancel happened during the operation: %d", aErr); - TRAPD( err, AsyncFileOperationsL().CancelOperationL( aErr ) ); // generates resp message for move,copy or delete operations - if ( err != KErrNone ) + + if ( iAsyncFileOperations ) { - MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: failed to generate resp msg: %d", err); + TRAPD( err, AsyncFileOperationsL().CancelOperationL( aErr ) ); // generates resp message for move,copy or delete operations + if ( err != KErrNone ) + { + MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: failed to generate resp msg: %d", err); + } } } @@ -921,435 +824,6 @@ } // ---------------------------------------------------------------------------- -// CVcxMyVideosCollectionPlugin::HandleDlEvent -// From CVcxMyVideosDownloadUtilObserver -// ---------------------------------------------------------------------------- -// -void CVcxMyVideosCollectionPlugin::HandleDlEvent( TVcxMyVideosDownloadState aState, - TUint32 aDownloadId, - TInt aProgress, - TInt64 aDownloaded, - TInt32 aError, - TInt32 aGlobalError ) - { - TRAPD( err, DoHandleDlEventL( aState, aDownloadId, aProgress, - aDownloaded, aError, aGlobalError ) ); - if ( err != KErrNone ) - { - MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: DoHandleDlEventL left with error code: %d", err); - } - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosCollectionPlugin::DoHandleDlEventL -// ---------------------------------------------------------------------------- -// -void CVcxMyVideosCollectionPlugin::DoHandleDlEventL( TVcxMyVideosDownloadState aState, - TUint32 aDownloadId, - TInt aProgress, - TInt64 aDownloaded, - TInt32 aError, - TInt32 aGlobalError ) - { - MPX_FUNC("CVcxMyVideosCollectionPlugin::DoHandleDlEventL"); - - CMPXMedia* video = iCache->FindVideoByDownloadIdL( aDownloadId ); - - MPX_DEBUG3("CVcxMyVideosCollectionPlugin:: dl event for download ID %d, pointer = %x) arrived.", aDownloadId, video); - - TBool sendEvent = EFalse; - if ( video ) - { - TMPXItemId mpxId( TVcxMyVideosCollectionUtil::IdL( *video ) ); - MPX_DEBUG4("CVcxMyVideosCollectionPlugin:: MPX item (MDS ID %d) (DL ID %d) %S", - mpxId.iId1, aDownloadId, &TVcxMyVideosCollectionUtil::Title( *video ) ); - - TUint8 currentState = TVcxMyVideosCollectionUtil::DownloadStateL( *video ); - - if ( currentState == EVcxMyVideosDlStateDownloaded ) - { - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: already in Downloaded state, discarding event"); - return; - } - - if ( currentState != aState ) - { - MPX_DEBUG5("CVcxMyVideosCollectionPlugin:: updating (mds id: %d) (dl id: %d) state: %S -> %S", - mpxId.iId1, aDownloadId, &DownloadState( currentState ), &DownloadState( aState ) ); - video->SetTObjectValueL( KVcxMediaMyVideosDownloadState, static_cast(aState) ); - sendEvent = ETrue; - - if ( aState == EVcxMyVideosDlStateDownloaded ) - { - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: downloaded state received -> setting download id to 0"); - - //1. set download id to 0 - video->SetTObjectValueL( KVcxMediaMyVideosDownloadId, 0 ); - - //2. update drm flag -#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API - RFile64 dlFile; -#else - RFile dlFile; -#endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API - TInt err = dlFile.Open( iFs, video->ValueText( KMPXMediaGeneralUri ), EFileRead ); - if ( err == KErrNone ) - { - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: file opened ok for drm reading"); - CleanupClosePushL( dlFile ); // 1-> - DRM::CDrmUtility* drmUtil = DRM::CDrmUtility::NewLC(); // 2-> - if ( drmUtil->IsProtectedL( dlFile ) ) - { - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: file is DRM protected, setting the property flag"); - TUint32 flags = video->ValueTObjectL( KMPXMediaGeneralFlags ); - flags |= EVcxMyVideosVideoDrmProtected; - video->SetTObjectValueL( KMPXMediaGeneralFlags, flags ); - } - else - { - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: file is not DRM protected"); - } - CleanupStack::PopAndDestroy( drmUtil ); // <-2 - CleanupStack::PopAndDestroy( &dlFile ); // <-1 - } - else - { - MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: file didnt open for drm reading, %d", err); - } - NotifyDownloadCompletedL( *video ); - - //3. Update file size using iCache->UpdateVideoL function since it changes item position and - // sends category modified events if necessarry. - CMPXMedia* updateObject = CMPXMedia::NewL(); - CleanupStack::PushL( updateObject ); // 1-> - updateObject->SetTObjectValueL( KMPXMediaGeneralId, mpxId ); -#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API - updateObject->SetTObjectValueL( KMPXMediaGeneralExtSizeInt64, - static_cast( aDownloaded ) ); - // set current value to 0 to force event sending and video list position updating - video->SetTObjectValueL( KMPXMediaGeneralExtSizeInt64, 0 ); -#else - updateObject->SetTObjectValueL( KMPXMediaGeneralSize, - static_cast( aDownloaded ) ); - // set current value to 0 to force event sending and video list position updating - video->SetTObjectValueL( KMPXMediaGeneralSize, 0 ); -#endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API - iCache->UpdateVideoL( *updateObject ); - CleanupStack::PopAndDestroy( updateObject ); // <-1 - // find video again since it might have been deleted in iCache->UpdateVideoL - TInt pos; - video = iCache->FindVideoByMdsIdL( mpxId.iId1, pos ); - - //file size and download id are saved to database - iMyVideosMdsDb->UpdateVideoL( *video ); - sendEvent = EFalse; // MDS will send the event, this avoids duplicate - } - - if ( aState == EVcxMyVideosDlStateFailed ) - { - video->SetTObjectValueL( KVcxMediaMyVideosDownloadError, aError ); - video->SetTObjectValueL( KVcxMediaMyVideosDownloadGlobalError, - aGlobalError ); - } - } - else - { - MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: state was already same(%S), skipping state update.", &DownloadState( currentState )); - } - - TInt8 currentProgress = video->ValueTObjectL( KVcxMediaMyVideosDownloadProgress ); - if ( currentProgress != aProgress ) - { - MPX_DEBUG4("CVcxMyVideosCollectionPlugin:: (dl id: %d) progress: %d -> %d", - aDownloadId, currentProgress, aProgress ); - - video->SetTObjectValueL( KVcxMediaMyVideosDownloadProgress, - static_cast( aProgress ) ); - // Don't send the update event for progress. - //sendEvent = ETrue; - } - else - { - MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: progress was already same(%d), skipping progress update.", currentProgress); - } - - TInt64 currentFileSize = 0; -#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API - if ( video->IsSupported( KMPXMediaGeneralExtSizeInt64 ) ) - { - currentFileSize = video->ValueTObjectL( KMPXMediaGeneralExtSizeInt64 ); - } -#else - if ( video->IsSupported( KMPXMediaGeneralSize ) ) - { - currentFileSize = video->ValueTObjectL( KMPXMediaGeneralSize ); - } -#endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API - if ( currentFileSize != aDownloaded ) - { - MPX_DEBUG4("CVcxMyVideosCollectionPlugin:: updating (dl id: %d) size: %ld -> %ld", - aDownloadId, currentFileSize, aDownloaded ); - -#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API - video->SetTObjectValueL( KMPXMediaGeneralExtSizeInt64, aDownloaded ); -#else - TInt newFileSize( aDownloaded ); - video->SetTObjectValueL( KMPXMediaGeneralSize, newFileSize ); -#endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API - //sendEvent = ETrue; - } - - if ( sendEvent ) - { - iMessageList->AddEventL( mpxId, EMPXItemModified ); - iMessageList->SendL(); - } - } - else - { - if ( (aState != EVcxMyVideosDlStateDownloaded) && (aProgress < 100) && - !iCache->iVideoListIsPartial ) - { - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: -----------------------------------------------------------------------."); - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: Event for progressing download arrived, but the MPX/MDS item not found!|"); - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: -> deleting download. |"); - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: -----------------------------------------------------------------------'"); - - RHttpDownload* download = DownloadUtilL().Download( aDownloadId ); - if ( download ) - { - MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: Download ID (%d) not found from MPX/MDS, deleting download!", - aDownloadId ); - DownloadUtilL().DeleteDownloadAsync( aDownloadId, ETrue ); - } - } - } - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosCollectionPlugin::SyncWithDownloadsL -// ---------------------------------------------------------------------------- -// -void CVcxMyVideosCollectionPlugin::SyncWithDownloadsL( - RArray& aItemsInCache ) - { - MPX_FUNC("CVcxMyVideosCollectionPlugin::SyncWithDownloadsL()"); - - TBool eventsAdded = EFalse; - for ( TInt i = 0; i < aItemsInCache.Count(); i++ ) - { - TInt pos; - CMPXMedia* video = iCache->FindVideoByMdsIdL( aItemsInCache[i], pos ); - if ( video ) - { - SyncVideoWithDownloadsL( *video, eventsAdded ); - } - } - if ( eventsAdded ) - { - iMessageList->SendL(); - } - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosCollectionPlugin::SyncVideoWithDownloadsL -// ---------------------------------------------------------------------------- -// -void CVcxMyVideosCollectionPlugin::SyncVideoWithDownloadsL( CMPXMedia& aVideo, - TBool& aEventAdded, TBool aAddEvent ) - { - TInt downloadId( TVcxMyVideosCollectionUtil::DownloadIdL( aVideo ) ); - - if ( downloadId ) - { - RHttpDownload* download( DownloadUtilL().Download( downloadId ) ); - - if ( download ) - { - MPX_DEBUG2("CVcxMyVideosCollectionPlugin::SyncVideoWithDownloadsL() item (DL ID: %d) found from dl manager", downloadId); - - TBool modified = EFalse; - SyncVideoAndDownloadL( aVideo, *download, modified ); - if ( modified && aAddEvent ) - { - iMessageList->AddEventL( TVcxMyVideosCollectionUtil::IdL( aVideo ), - EMPXItemModified ); - aEventAdded = ETrue; - } - } - else - { - //download id != 0 and it is not found from download manager -> we set download id to 0 - MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: download id %d != 0 and no corresponding download found from Download Manager", - downloadId); - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: -> setting download id to 0"); - aVideo.SetTObjectValueL( KVcxMediaMyVideosDownloadId, 0 ); - iMyVideosMdsDb->UpdateVideoL( aVideo ); // if video list fetching is ongoing, this will leave with KErrNotReady - } - } - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosCollectionPlugin::SyncVideoAndDownloadL -// ---------------------------------------------------------------------------- -// -void CVcxMyVideosCollectionPlugin::SyncVideoAndDownloadL( - CMPXMedia& aVideo, - RHttpDownload& aDownload, - TBool& aModified ) - { - MPX_FUNC("CVcxMyVideosCollectionPlugin::SyncVideoAndDownloadL()"); - - aModified = EFalse; - - TBuf downloadUrl; - aDownload.GetStringAttribute( EDlAttrReqUrl, downloadUrl ); - if ( aVideo.ValueText( KVcxMediaMyVideosRemoteUrl ) - != downloadUrl ) - { - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: urls in MPX and DL Manager differ!"); - MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: remote url in MPX: %S", - &(aVideo.ValueText( KVcxMediaMyVideosRemoteUrl ))); - MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: remote url in DL Manager: %S", - &downloadUrl); - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: -> updating MPX cache"); - - aVideo.SetTextValueL( KVcxMediaMyVideosRemoteUrl, downloadUrl ); - aModified = ETrue; - } - else - { - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: remote urls already same in dl manager and mpx"); - } - - // KVcxMediaMyVideosDownloadState - TVcxMyVideosDownloadState dlStateInDlManager; - DownloadUtilL().GetDownloadState( aDownload, dlStateInDlManager ); - - TUint8 dlStateInMpxCache; - if ( aVideo.IsSupported( KVcxMediaMyVideosDownloadState )) - { - dlStateInMpxCache = aVideo.ValueTObjectL( KVcxMediaMyVideosDownloadState ); - } - else - { - dlStateInMpxCache = static_cast( EVcxMyVideosDlStateNone ); - } - - MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: dl state in dl manager: %S", &DownloadState( dlStateInDlManager )); - MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: dl state in mpx cache: %S", &DownloadState( dlStateInMpxCache )); - - if ( static_cast( dlStateInDlManager ) != dlStateInMpxCache ) - { - if ( dlStateInDlManager == EVcxMyVideosDlStateDownloaded ) - { - // Download finished event has arrived when we weren't around, call event handler to get things right. - // Collection is updated and download is deleted from Download Manager. - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: Download is in Finished state and collection has download id != 0"); - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: -> we have missed download finished event, lets generate it by ourselves."); - - TUint64 downloaded( 0 ); - TUint8 progress( DownloadUtilL().DownloadProgress( aDownload, downloaded, EFalse ) ); - TUint32 downloadId( aVideo.ValueTObjectL( KVcxMediaMyVideosDownloadId ) ); - HandleDlEvent( dlStateInDlManager, downloadId, - progress, downloaded, KErrNone, KErrNone ); - DownloadUtilL().DeleteDownloadAsync( downloadId, EFalse /* don't delete content */ ); - } - else - { - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: dl state in dl manager differs of mpx cache-> updating mpx cache"); - aVideo.SetTObjectValueL( KVcxMediaMyVideosDownloadState, - static_cast( dlStateInDlManager ) ); - aModified = ETrue; - } - } - else - { - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: download state already same in dl manager and mds"); - } - - // KVcxMediaMyVideosDownloadProgress - TUint64 downloaded = 0; - TInt8 dlProgressInDlManager = DownloadUtilL().DownloadProgress( - aDownload, downloaded, EFalse ); - - TInt8 dlProgressInMpxCache; - if ( aVideo.IsSupported( KVcxMediaMyVideosDownloadProgress ) ) - { - dlProgressInMpxCache = aVideo.ValueTObjectL( KVcxMediaMyVideosDownloadProgress ); - } - else - { - aVideo.SetTObjectValueL( KVcxMediaMyVideosDownloadProgress, 0 ); - dlProgressInMpxCache = 0; - } - - MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: dl progress in dl manager: %d", dlProgressInDlManager); - MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: dl progress in mpx cache: %d", dlProgressInMpxCache); - - if ( dlProgressInDlManager != dlProgressInMpxCache ) - { - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: dl progress in dl manager differs of mpx cache-> updating mpx cache"); - aVideo.SetTObjectValueL( KVcxMediaMyVideosDownloadProgress, - static_cast( dlProgressInDlManager ) ); - aModified = ETrue; - } - else - { - MPX_DEBUG1("CVcxMyVideosCollectionPlugin:: download progress already same in dl manager and mds"); - } - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosCollectionPlugin::SyncVideoListWithDownloadsL -// ---------------------------------------------------------------------------- -// -void CVcxMyVideosCollectionPlugin::SyncVideoListWithDownloadsL( CMPXMedia& aVideoList, - TBool aSendEvents, TInt aStartPos ) - { - MPX_FUNC("CVcxMyVideosCollectionPlugin::SyncVideoListWithDownloadsL"); - - CMPXMediaArray* videoArray = aVideoList.Value( - KMPXMediaArrayContents); - - CMPXMedia* video; - - TBool eventsAdded = EFalse; - for ( TInt i = aStartPos; i < videoArray->Count(); i++ ) - { - video = (*videoArray)[i]; - SyncVideoWithDownloadsL( *video, eventsAdded, aSendEvents ); - } - if ( eventsAdded ) - { - iMessageList->SendL(); - } - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosCollectionPlugin::DownloadUtil -// ---------------------------------------------------------------------------- -// -CVcxMyVideosDownloadUtil& CVcxMyVideosCollectionPlugin::DownloadUtilL() - { - if ( !iDownloadUtil ) - { - iDownloadUtil = CVcxMyVideosDownloadUtil::NewL( *this, iFs ); - } - - if ( !iOrphanDownloadsCleared ) - { - if ( !iCache->iVideoListIsPartial ) - { - iOrphanDownloadsCleared = ETrue; - iDownloadUtil->ClearOrphanDownloadsL( *iCache->iVideoList ); - } - } - - return *iDownloadUtil; - } - -// ---------------------------------------------------------------------------- // CVcxMyVideosCollectionPlugin::CategoriesL // ---------------------------------------------------------------------------- // @@ -1363,6 +837,20 @@ } // ---------------------------------------------------------------------------- +// CVcxMyVideosCollectionPlugin::AlbumsL +// TODO: Unecessarry func since we always load this +// ---------------------------------------------------------------------------- +// +CVcxMyVideosAlbums& CVcxMyVideosCollectionPlugin::AlbumsL() + { + if ( !iAlbums ) + { + iAlbums = CVcxMyVideosAlbums::NewL( *this ); + } + return *iAlbums; + } + +// ---------------------------------------------------------------------------- // CVcxMyVideosCollectionPlugin::HandleCreateVideoListResp // ---------------------------------------------------------------------------- // @@ -1434,33 +922,6 @@ } // ---------------------------------------------------------------------------- -// CVcxMyVideosCollectionPlugin::NotifyDownloadCompletedL -// ---------------------------------------------------------------------------- -// -void CVcxMyVideosCollectionPlugin::NotifyDownloadCompletedL( CMPXMedia& aVideo ) - { - const TInt KMediaExtSize( 8 ); - - HBufC8* buffer = HBufC8::NewL( KMediaExtSize ); - CleanupStack::PushL( buffer ); - TPtr8 des = buffer->Des(); - - RDesWriteStream stream; - CleanupClosePushL( stream ); - stream.Open( des ); - - aVideo.ExternalizeL( stream ); - - stream.CommitL(); - - CleanupStack::PopAndDestroy( &stream ); - - DownloadUtilL().NotifyDownloadCompleted( *buffer ); - - CleanupStack::PopAndDestroy( buffer ); - } - -// ---------------------------------------------------------------------------- // CVcxMyVideosCollectionPlugin::NotifyNewVideosCountDecreasedL // ---------------------------------------------------------------------------- // @@ -1481,9 +942,7 @@ stream.CommitL(); CleanupStack::PopAndDestroy( &stream ); - - DownloadUtilL().NotifyNewVideosCountDecreased( *buffer ); - + CleanupStack::PopAndDestroy( buffer ); } @@ -1505,7 +964,7 @@ ids.Reset(); CleanupClosePushL( ids ); // 1-> ids.AppendL( mpxId.iId1 ); - HandleMyVideosDbEvent( EMPXItemInserted, ids ); //this will fetch from mds to cache and sync with downloads + HandleMyVideosDbEvent( EMPXItemInserted, ids ); //this will fetch from mds to cache CleanupStack::PopAndDestroy( &ids ); // <-1 } @@ -1621,53 +1080,3 @@ iMessageList->SendL(); } -// ---------------------------------------------------------------------------- -// CVcxMyVideosCollectionPlugin::SetDownloadIdToZeroL -// ---------------------------------------------------------------------------- -// -void CVcxMyVideosCollectionPlugin::SetDownloadIdToZeroL( TUint aDownloadId ) - { - CMPXMedia* video = iCache->FindVideoByDownloadIdL( aDownloadId ); - if ( video ) - { - video->SetTObjectValueL( KVcxMediaMyVideosDownloadId, 0 ); - video->SetTObjectValueL( KVcxMediaMyVideosDownloadState, - static_cast( EVcxMyVideosDlStateNone ) ); - iMyVideosMdsDb->UpdateVideoL( *video ); - iMessageList->AddEventL( TVcxMyVideosCollectionUtil::IdL( - *video ), EMPXItemModified ); - iMessageList->SendL(); - } - } - -#ifdef _DEBUG -// ---------------------------------------------------------------------------- -// CVcxMyVideosCollectionPlugin::DownloadState -// ---------------------------------------------------------------------------- -// -const TDesC& CVcxMyVideosCollectionPlugin::DownloadState( TUint8 aDlState ) - { - _LIT(KDlStateNoneDes, "None"); - _LIT(KDlStateDownloadingDes, "Downloading"); - _LIT(KDlStateFailedDes, "Failed"); - _LIT(KDlStatePausedDes, "Paused"); - _LIT(KDlStateDownloadedDes, "Downloaded"); - - switch ( aDlState ) - { - case EVcxMyVideosDlStateNone: - return KDlStateNoneDes; - case EVcxMyVideosDlStateDownloading: - return KDlStateDownloadingDes; - case EVcxMyVideosDlStateFailed: - return KDlStateFailedDes; - case EVcxMyVideosDlStatePaused: - return KDlStatePausedDes; - case EVcxMyVideosDlStateDownloaded: - return KDlStateDownloadedDes; - default: - return KNullDesC; - } - } -#endif - diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/src/vcxmyvideoscollectionutil.cpp --- a/videocollection/mpxmyvideoscollection/src/vcxmyvideoscollectionutil.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/src/vcxmyvideoscollectionutil.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -11,13 +11,12 @@ * * Contributors: * -* Description: +* Description: * */ - // INCLUDE FILES #include #include @@ -166,7 +165,25 @@ } } } - + +// --------------------------------------------------------------------------- +// TVcxMyVideosCollectionUtil::AppendToListL +// New items in aToList will point to same shared memory as items in aFromList. +// --------------------------------------------------------------------------- +// +void TVcxMyVideosCollectionUtil::AppendToListL( CMPXMedia& aToList, CMPXMedia& aFromList ) + { + CMPXMedia* media; + CMPXMediaArray* toArray = aToList.Value( KMPXMediaArrayContents ); + CMPXMediaArray* fromArray = aFromList.Value( KMPXMediaArrayContents ); + TInt count = fromArray->Count(); + for ( TInt i = 0; i < count; i++ ) + { + media = CMPXMedia::NewL( *(fromArray->AtL( i )) ); // points to same shared memory + toArray->AppendL( media ); //ownership moves + } + } + // --------------------------------------------------------------------------- // This helper function converts drive letter to drive number // --------------------------------------------------------------------------- @@ -213,7 +230,8 @@ { aUniquePath = aPath.Mid( 0, pos ); } - counterDigits.Format(_L("%d"), counter++); + _LIT(KPercentD, "%d"); + counterDigits.Format( KPercentD, counter++ ); aUniquePath.Append( '_' ); aUniquePath.Append( '(' ); aUniquePath.AppendJustify( counterDigits, KMaxDigits, TAlign( ERight ), '0' ); @@ -236,12 +254,19 @@ if ( aVideo.IsSupported( KVcxMediaMyVideosOrigin ) ) { origin = aVideo.ValueTObjectL( KVcxMediaMyVideosOrigin ); - if ( origin == EVcxMyVideosOriginSideLoaded || - origin == EVcxMyVideosOriginDownloaded || - origin == EVcxMyVideosOriginTvRecording ) +#ifdef VIDEO_COLLECTION_PLUGIN_TB92 + if ( origin != EVcxMyVideosOriginCapturedWithCamera ) { origin = EVcxMyVideosOriginOther; } +#else + if ( origin != EVcxMyVideosOriginCapturedWithCamera && + origin != EVcxMyVideosOriginDownloaded + ) + { + origin = EVcxMyVideosOriginOther; + } +#endif } return origin; } @@ -262,6 +287,21 @@ } // ---------------------------------------------------------------------------- +// TVcxMyVideosCollectionUtil::CreationDateL +// ---------------------------------------------------------------------------- +// +TInt64 TVcxMyVideosCollectionUtil::CreationDateL( CMPXMedia& aVideo ) + { + TInt64 creationDate = 0; + + if ( aVideo.IsSupported( KMPXMediaGeneralDate ) ) + { + creationDate = aVideo.ValueTObjectL( KMPXMediaGeneralDate ); + } + return creationDate; + } + +// ---------------------------------------------------------------------------- // TVcxMyVideosCollectionUtil::DownloadIdL // ---------------------------------------------------------------------------- // @@ -296,7 +336,7 @@ // TVcxMyVideosCollectionUtil::IdL // ---------------------------------------------------------------------------- // -TMPXItemId TVcxMyVideosCollectionUtil::IdL( CMPXMedia& aVideo ) +TMPXItemId TVcxMyVideosCollectionUtil::IdL( const CMPXMedia& aVideo ) { TMPXItemId id( 0, 0 ); @@ -329,7 +369,7 @@ // TVcxMyVideosCollectionUtil::Title // ---------------------------------------------------------------------------- // -const TDesC& TVcxMyVideosCollectionUtil::Title( CMPXMedia& aVideo ) +const TDesC& TVcxMyVideosCollectionUtil::Title( const CMPXMedia& aVideo ) { if ( aVideo.IsSupported( KMPXMediaGeneralTitle ) ) { @@ -460,7 +500,63 @@ } return KErrNotFound; } - + +// ---------------------------------------------------------------------------- +// TVcxMyVideosCollectionUtil::MediaArrayL +// ---------------------------------------------------------------------------- +// +CMPXMediaArray* TVcxMyVideosCollectionUtil::MediaArrayL( const CMPXMedia& aMedia ) + { + if ( !aMedia.IsSupported( KMPXMediaArrayContents ) ) + { + User::Leave( KErrArgument ); + } + + return aMedia.Value( KMPXMediaArrayContents ); + } + +// ---------------------------------------------------------------------------- +// TVcxMyVideosCollectionUtil::Int32ValueL +// ---------------------------------------------------------------------------- +// +TInt32 TVcxMyVideosCollectionUtil::Int32ValueL( CMPXMedia& aMedia ) + { + if ( !aMedia.IsSupported( KVcxMediaMyVideosInt32Value ) ) + { + User::Leave( KErrArgument ); + } + return aMedia.ValueTObjectL( KVcxMediaMyVideosInt32Value ); + } + +// ---------------------------------------------------------------------------- +// TVcxMyVideosCollectionUtil::Uint32ValueL +// ---------------------------------------------------------------------------- +// +TUint32 TVcxMyVideosCollectionUtil::Uint32ValueL( CMPXMedia& aMedia ) + { + if ( !aMedia.IsSupported( KVcxMediaMyVideosUint32Value ) ) + { + User::Leave( KErrArgument ); + } + return aMedia.ValueTObjectL( KVcxMediaMyVideosUint32Value ); + } + +// ---------------------------------------------------------------------------- +// TVcxMyVideosCollectionUtil::GetIdsFromMediaArrayL +// ---------------------------------------------------------------------------- +// +void TVcxMyVideosCollectionUtil::GetIdsFromMediaArrayL( CMPXMediaArray& aMediaArray, + RArray& aIdArray ) + { + TInt count = aMediaArray.Count(); + aIdArray.Reset(); + aIdArray.ReserveL( count ); + for ( TInt i = 0; i < count; i++ ) + { + aIdArray.AppendL( IdL( *aMediaArray.AtL( i ) ).iId1 ); + } + } + #ifdef _DEBUG // ---------------------------------------------------------------------------- // TVcxMyVideosCollectionUtil::PrintOpenFileHandlesL @@ -502,7 +598,8 @@ // void TVcxMyVideosCollectionUtil::GetProcessName( TInt aThreadId, TFullName& aProcessName ) { - TFindThread find(_L("*")); + _LIT(KAsterixDes, "*"); + TFindThread find( KAsterixDes ); while( find.Next( aProcessName ) == KErrNone ) { RThread thread; diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/src/vcxmyvideosdownloadcache.cpp --- a/videocollection/mpxmyvideoscollection/src/vcxmyvideosdownloadcache.cpp Tue May 25 12:44:54 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,133 +0,0 @@ -/* -* 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: Download list cache. Circular buffer made for speeding up* -*/ - - - - -// INCLUDE FILES -#include -#include -#include -#include -#include -#include -#include -#include -#include "vcxmyvideosdownloadcache.h" -#include "vcxmyvideoscollectionplugin.h" -#include "vcxmyvideosdownloadutil.h" -#include "vcxmyvideoscollectionutil.h" -#include "vcxmyvideoscategories.h" - -const TInt KVcxMvDownloadFindCacheSize = 20; - -// ============================ MEMBER FUNCTIONS ============================== - -// ---------------------------------------------------------------------------- -// Two-phased constructor. -// ---------------------------------------------------------------------------- -// -CVcxMyVideosDownloadCache* CVcxMyVideosDownloadCache::NewL() - { - CVcxMyVideosDownloadCache* self = new (ELeave) CVcxMyVideosDownloadCache(); - CleanupStack::PushL(self); - self->ConstructL(); - CleanupStack::Pop(self); - return self; - } - -// ---------------------------------------------------------------------------- -// Destructor. -// ---------------------------------------------------------------------------- -// -CVcxMyVideosDownloadCache::~CVcxMyVideosDownloadCache() - { - MPX_FUNC("CVcxMyVideosDownloadCache::~CVcxMyVideosDownloadCache"); - - iDownloadId.Close(); - iMedia.Close(); // pointers are not own - } - -// ---------------------------------------------------------------------------- -// Constructor. -// ---------------------------------------------------------------------------- -// -CVcxMyVideosDownloadCache::CVcxMyVideosDownloadCache() - { - MPX_FUNC("CVcxMyVideosDownloadCache::CVcxMyVideosDownloadCache"); - } - -// ---------------------------------------------------------------------------- -// Symbian 2nd phase constructor can leave. -// ---------------------------------------------------------------------------- -// -void CVcxMyVideosDownloadCache::ConstructL () - { - iDownloadId.Reset(); - iMedia.Reset(); - for ( TInt i = 0; i < KVcxMvDownloadFindCacheSize; i++ ) - { - iDownloadId.Append( 0 ); - iMedia.Append( NULL ); - } - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosDownloadCache::Get -// ---------------------------------------------------------------------------- -// -CMPXMedia* CVcxMyVideosDownloadCache::Get( TUint32 aDownloadId ) - { - for ( TInt i = 0; i < KVcxMvDownloadFindCacheSize; i++ ) - { - if ( iDownloadId[i] == aDownloadId ) - { - return iMedia[i]; - } - } - return NULL; - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosDownloadCache::Add -// ---------------------------------------------------------------------------- -// -void CVcxMyVideosDownloadCache::Add( TUint32 aDownloadId, CMPXMedia* aVideo ) - { - iPos++; - iPos %= KVcxMvDownloadFindCacheSize; - iDownloadId[iPos] = aDownloadId; - iMedia[iPos] = aVideo; - } - -// ---------------------------------------------------------------------------- -// CVcxMyVideosDownloadCache::Delete -// ---------------------------------------------------------------------------- -// -void CVcxMyVideosDownloadCache::Delete( CMPXMedia* aVideo ) - { - for ( TInt i = 0; i < KVcxMvDownloadFindCacheSize; i++ ) - { - if ( iMedia[i] == aVideo ) - { - iDownloadId[i] = 0; - iMedia[i] = NULL; - } - } - } - -// End of file - diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/src/vcxmyvideosdrivemonitor.cpp --- a/videocollection/mpxmyvideoscollection/src/vcxmyvideosdrivemonitor.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/src/vcxmyvideosdrivemonitor.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -155,46 +155,6 @@ } } -#if 0 // not used in mpx my videos collection -// ----------------------------------------------------------------------------- -// CVcxMyVideosDriveMonitor::RegisterObserverL -// ----------------------------------------------------------------------------- -// -void CVcxMyVideosDriveMonitor::RegisterObserverL( MVcxMyVideosDriveMonitorObserver* aObserver ) - { - iObservers.AppendL( aObserver ); - - if ( !IsActive() ) - { - iFs.NotifyChange( ENotifyDisk, iStatus ); - SetActive(); - } - } - -// ----------------------------------------------------------------------------- -// CVcxMyVideosDriveMonitor::RemoveObserverL -// ----------------------------------------------------------------------------- -// -void CVcxMyVideosDriveMonitor::RemoveObserverL( MVcxMyVideosDriveMonitorObserver* aObserver ) - { - TInt i; - for ( i = 0; i < iObservers.Count(); i++ ) - { - if ( aObserver == iObservers[i] ) - { - iObservers.Remove( i ); - iObservers.Compress(); - break; - } - } - - if ( iObservers.Count() == 0 ) - { - iFs.NotifyChangeCancel(); - } - } -#endif - /* N96 without memory card: 26/09/2007 11:37:22 CIptvDriveMonitor:: drive[2]: type = EMediaNANDFlash @@ -471,111 +431,6 @@ } return KErrNotFound; } - -#if 0 // not used by mpx my videos collection - -// ----------------------------------------------------------------------------- -// CVcxMyVideosDriveMonitor::PhoneMemoryDriveL -// ----------------------------------------------------------------------------- -// -TInt CVcxMyVideosDriveMonitor::PhoneMemoryDriveL() - { - TInt drive; - User::LeaveIfError( drive = PhoneMemoryDrive() ); - return drive; - } - -// ----------------------------------------------------------------------------- -// CVcxMyVideosDriveMonitor::PhoneMemoryDrive -// ----------------------------------------------------------------------------- -// -TInt CVcxMyVideosDriveMonitor::PhoneMemoryDrive() - { - TInt i; - for ( i = 0; i < iAvailableDrives.Count(); i++ ) - { - if ( iAvailableDrives[i].iDrive == EDriveC ) - { - return iAvailableDrives[i].iDrive; - } - } - return KErrNotFound; - } - - -// ----------------------------------------------------------------------------- -// CVcxMyVideosDriveMonitor::FixedDriveL -// ----------------------------------------------------------------------------- -// -TInt CVcxMyVideosDriveMonitor::FixedDriveL( TBool aExcludeCDrive ) - { - TInt drive; - User::LeaveIfError( drive = FixedDrive( aExcludeCDrive ) ); - return drive; - } - -// ----------------------------------------------------------------------------- -// CVcxMyVideosDriveMonitor::FixedDrive -// ----------------------------------------------------------------------------- -// -TInt CVcxMyVideosDriveMonitor::FixedDrive( TBool aExcludeCDrive ) - { - TInt i; - for ( i = 0; i < iAvailableDrives.Count(); i++ ) - { - MPX_DEBUG2("CVcxMyVideosDriveMonitor:: iAvailableDrives[%d]", i); - - if ( !(iAvailableDrives[i].iFlags & TVcxMyVideosDriveInfo::ERemovable) ) - { - if ( iAvailableDrives[i].iDrive != EDriveC ) - { - MPX_DEBUG2("CVcxMyVideosDriveMonitor:: FixedDrive() returning drive %d", iAvailableDrives[i].iDrive); - return iAvailableDrives[i].iDrive; - } - else - { - if ( !aExcludeCDrive ) - { - MPX_DEBUG2("CVcxMyVideosDriveMonitor:: FixedDrive() returning drive %d", iAvailableDrives[i].iDrive); - return iAvailableDrives[i].iDrive; - } - } - } - } - MPX_DEBUG1("CVcxMyVideosDriveMonitor:: FixedDrive() fixed drive not found"); - return KErrNotFound; - } - -// ----------------------------------------------------------------------------- -// CVcxMyVideosDriveMonitor::IsMmcInserted() -// ----------------------------------------------------------------------------- -// -TBool CVcxMyVideosDriveMonitor::IsMmcInserted() - { - TInt drive = MemoryCardDrive(); - - if ( drive == KErrNotFound ) - { - return EFalse; - } - - TInt arrayPos = ArrayPos( drive ); - - if ( arrayPos == KErrNotFound ) - { - return EFalse; - } - - TUint32 flags = iAvailableDrives[arrayPos].iFlags; - - if ( (flags & TVcxMyVideosDriveInfo::ELocked) || (flags & TVcxMyVideosDriveInfo::EMediaNotPresent) ) - { - return EFalse; - } - - return ETrue; - } -#endif // ----------------------------------------------------------------------------- // CVcxMyVideosDriveMonitor::RunL() diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/src/vcxmyvideosmdsalbums.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videocollection/mpxmyvideoscollection/src/vcxmyvideosmdsalbums.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -0,0 +1,1080 @@ +/* +* 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: Provides albums support utilizing MDS. +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "vcxmyvideosmdsalbums.h" +#include "vcxmyvideosmdsdb.h" +#include "vcxmyvideoscollectionutil.h" +#include "vcxmyvideosmdscmdqueue.h" + +// ============================ MEMBER FUNCTIONS ============================= + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CVcxMyVideosMdsAlbums::CVcxMyVideosMdsAlbums( CVcxMyVideosMdsDb& aMdsDb, + MVcxMyVideosMdsAlbumsObserver* aObserver ) +: CActive( EPriorityStandard ), iMdsDb( aMdsDb ), iObserver(aObserver) + { + } + +// --------------------------------------------------------------------------- +// 2nd-phase constructor +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::ConstructL() + { + GetSchemaDefinitionsL(); + SetObservingL(); + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// Two-Phase Constructor +// --------------------------------------------------------------------------- +// +CVcxMyVideosMdsAlbums* CVcxMyVideosMdsAlbums::NewL( CVcxMyVideosMdsDb& aMdsDb, + MVcxMyVideosMdsAlbumsObserver* aObserver ) + { + CVcxMyVideosMdsAlbums* self = new(ELeave) CVcxMyVideosMdsAlbums( aMdsDb, aObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CVcxMyVideosMdsAlbums::~CVcxMyVideosMdsAlbums() + { + CancelQueries(); + delete iAlbumQuery; + delete iVideoQuery; + delete iRelationQuery; + iItemArray.Close(); + iResultBuffer.Close(); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::CancelQueries +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::CancelQueries( CVcxMyVideosMdsDb::TRequestType aType ) + { + MPX_DEBUG1("CVcxMyVideosMdsAlbums::CancelQueries() start"); + + if ( aType == CVcxMyVideosMdsDb::EAll || aType == CVcxMyVideosMdsDb::EGetAlbums ) + { + if ( iAlbumQuery ) + { + iAlbumQuery->Cancel(); + } + } + + if ( aType == CVcxMyVideosMdsDb::EAll || aType == CVcxMyVideosMdsDb::EGetAlbumContentIds ) + { + if ( iRelationQuery ) + { + iRelationQuery->Cancel(); + } + } + + if ( aType == CVcxMyVideosMdsDb::EAll || aType == CVcxMyVideosMdsDb::EGetAlbumContentVideos ) + { + if ( iVideoQuery ) + { + iVideoQuery->Cancel(); + } + } + + if ( aType == CVcxMyVideosMdsDb::EAll || aType == CVcxMyVideosMdsDb::EAddVideosToAlbum + || aType == CVcxMyVideosMdsDb::ERemoveRelations + || aType == CVcxMyVideosMdsDb::ERemoveAlbums ) + { + + // MDS does not offer cancel for these + //Cancel(); + } + + MPX_DEBUG1("CVcxMyVideosMdsAlbums::CancelQueries() exit"); + } + +// --------------------------------------------------------------------------- +// From CActive +// CVcxMyVideosMdsAlbums::DoCancel +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::DoCancel() + { + MPX_DEBUG1("CVcxMyVideosMdsAlbums::DoCancel() start"); + + // MDS does not offer way to cancel these async requests + + MPX_DEBUG1("CVcxMyVideosMdsAlbums::DoCancel() exit"); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::SetObservingL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::SetObservingL() + { + if ( iObserver ) + { + //ENotifyAdd and ENotifyModify are not supported + iMdsDb.MdsSessionL().AddRelationItemObserverL( *this, NULL, + ENotifyRemove, iMdsDb.iNamespaceDef ); + +#if 0 + // We receive only IDs from here. We need to make query to get + // relation objects-> slow to use. We use the response from + // the add operation instead. This way we don't receive + // add events if someone else adds videos to our albums + // but the performance is the best possible. + iMdsDb.MdsSessionL().AddRelationObserverL( *this, NULL, + ENotifyAdd | ENotifyModify | ENotifyRemove ); +#endif + } + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::GetAlbumsL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::GetAlbumsL( CMPXMedia* aAlbumList, + MVcxMyVideosMdsAlbumsObserver& aClient ) + { + CVcxMyVideosMdsCmdGetAlbums* cmd = new (ELeave) CVcxMyVideosMdsCmdGetAlbums; + CleanupStack::PushL( cmd ); + cmd->iCmdType = CVcxMyVideosMdsDb::EGetAlbums; + cmd->iClient = &aClient; + cmd->iAlbumList = aAlbumList; + iMdsDb.iCmdQueue->ExecuteCmdL( cmd ); //owneship moves + CleanupStack::Pop( cmd ); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::GetAlbumL +// --------------------------------------------------------------------------- +// +CMPXMedia* CVcxMyVideosMdsAlbums::GetAlbumL( TUint32 aId ) + { + CMdEObject* object = iMdsDb.ObjectL( aId, EFalse /* is not video, is album */); + + if ( !object ) + { + MPX_DEBUG2("CVcxMyVideosMdsAlbums:: mds id %d not found from mds", aId); + return NULL; + } + + CleanupStack::PushL( object ); // 1-> + + CMPXMedia* album = CMPXMedia::NewL( ); + CleanupStack::PushL( album ); // 2-> + + Object2MediaL( *object, *album ); + + CleanupStack::Pop( album ); // <-2 + CleanupStack::PopAndDestroy( object ); // <-1 + + return album; + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::DoGetAlbumsL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::DoGetAlbumsL( CMPXMedia* aAlbumList, + MVcxMyVideosMdsAlbumsObserver& aClient ) + { + MPX_DEBUG1("CVcxMyVideosMdsAlbums::DoGetAlbumsL() start"); + + iAlbumList = aAlbumList; //store pointer to album list, we do not own this + iClient = &aClient; + + delete iAlbumQuery; + iAlbumQuery = NULL; + + iAlbumQuery = iMdsDb.MdsSessionL().NewObjectQueryL( *iNamespaceDef, *iAlbumObjectDef, this ); + + CMdELogicCondition& rootCondition = iAlbumQuery->Conditions(); + rootCondition.SetOperator( ELogicConditionOperatorOr ); + rootCondition.AddObjectConditionL( *iAlbumObjectDef ); + rootCondition.AddPropertyConditionL( *iTypePropertyDef, + TMdEIntRange( MdeConstants::Album::EAlbumUser, MdeConstants::Album::EAlbumUser, + EMdERangeTypeEqual ) ); + + iAlbumQuery->FindL(); + + MPX_DEBUG1("CVcxMyVideosMdsAlbums::DoGetAlbumsL() exit"); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::GetAlbumContentIdsL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::GetAlbumContentIdsL( TUint32 aAlbumId, + RArray& aContentArray, + MVcxMyVideosMdsAlbumsObserver& aClient ) + { + CVcxMyVideosMdsCmdGetAlbumContentIds* cmd = new (ELeave) CVcxMyVideosMdsCmdGetAlbumContentIds; + CleanupStack::PushL( cmd ); // 1-> + cmd->iCmdType = CVcxMyVideosMdsDb::EGetAlbumContentIds; + cmd->iClient = &aClient; + cmd->iAlbumId = aAlbumId; + cmd->iAlbumContent = &aContentArray; + iMdsDb.iCmdQueue->ExecuteCmdL( cmd ); //owneship moves + CleanupStack::Pop( cmd ); // <-1 + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::DoGetAlbumContentIdsL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::DoGetAlbumContentIdsL( TUint32 aAlbumId, + RArray& aContentArray, + MVcxMyVideosMdsAlbumsObserver& aClient ) + { + MPX_DEBUG1("CVcxMyVideosMdsAlbums::DoGetAlbumContentIdsL() start"); + + delete iRelationQuery; + iRelationQuery = NULL; + + iClient = &aClient; + iAlbumId = aAlbumId; + iAlbumContent = &aContentArray; + + iRelationQuery = iMdsDb.MdsSessionL().NewRelationQueryL( *iNamespaceDef, this ); + + CMdELogicCondition& rootCondition = iRelationQuery->Conditions(); + + //relation left side contains and... + CMdERelationCondition& relationCondition = + rootCondition.AddRelationConditionL( *iContainsRelationDef, ERelationConditionSideLeft); // "AND" + + CMdELogicCondition& leftCondition = relationCondition.LeftL(); + CMdELogicCondition& rightCondition = relationCondition.RightL(); + + //...left side is album... + leftCondition.AddObjectConditionL( *iAlbumObjectDef ); + //...and left id is aAlbumId.. + leftCondition.AddObjectConditionL( aAlbumId ); + + //Right side is video + rightCondition.AddObjectConditionL( *iMdsDb.iVideoObjectDef ); + + iRelationQuery->FindL(); + + MPX_DEBUG1("CVcxMyVideosMdsAlbums::DoGetAlbumContentIdsL() exit"); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::GetAlbumContentVideosL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::GetAlbumContentVideosL( TUint32 aAlbumId, CMPXMedia& aVideoList, + MVcxMyVideosMdsAlbumsObserver& aClient ) + { + MPX_DEBUG1("CVcxMyVideosMdsAlbums::GetAlbumContentVideosL() start"); + + CVcxMyVideosMdsCmdGetAlbumContentVideos* cmd = new (ELeave) CVcxMyVideosMdsCmdGetAlbumContentVideos; + CleanupStack::PushL( cmd ); // 1-> + cmd->iCmdType = CVcxMyVideosMdsDb::EGetAlbumContentVideos; + cmd->iClient = &aClient; + cmd->iAlbumId = aAlbumId; + cmd->iAlbumContentVideos = &aVideoList; + iMdsDb.iCmdQueue->ExecuteCmdL( cmd ); //owneship moves + CleanupStack::Pop( cmd ); // <-1 + MPX_DEBUG1("CVcxMyVideosMdsAlbums::GetAlbumContentVideosL() exit"); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::DoGetAlbumContentVideosL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::DoGetAlbumContentVideosL( TUint32 aAlbumId, CMPXMedia& aVideoList, + MVcxMyVideosMdsAlbumsObserver& aClient ) + { + MPX_DEBUG1("CVcxMyVideosMdsAlbums::DoGetAlbumContentVideosL() start"); + + delete iVideoQuery; + iVideoQuery = NULL; + + iClient = &aClient; + iVideoList = &aVideoList; + iAlbumId = aAlbumId; + + iVideoQuery = iMdsDb.MdsSessionL().NewObjectQueryL( *iNamespaceDef, *iMdsDb.iVideoObjectDef, this ); + CMdELogicCondition& rootCondition = iVideoQuery->Conditions(); + CMdERelationCondition& relationCondition = + rootCondition.AddRelationConditionL( *iContainsRelationDef ); + + CMdELogicCondition& leftCondition = relationCondition.LeftL(); + CMdELogicCondition& rightCondition = relationCondition.RightL(); + + //...left side is an album... + leftCondition.AddObjectConditionL( *iAlbumObjectDef ); + //...and left id is aAlbumId.. + leftCondition.AddObjectConditionL( aAlbumId ); + + //and queried object is on the right side of the relation + relationCondition.SetSide( ERelationConditionSideRight ); + + const TInt maxItemsInQueryResult = 500; + iVideoQuery->FindL( KMdEQueryDefaultMaxCount, maxItemsInQueryResult ); + + MPX_DEBUG1("CVcxMyVideosMdsAlbums::DoGetAlbumContentVideosL() exit"); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::GetSchemaDefinitionsL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::GetSchemaDefinitionsL() + { + iNamespaceDef = &(iMdsDb.MdsSessionL().GetDefaultNamespaceDefL()); + + _LIT( KVcxAlbumObjectName, "Album" ); + iAlbumObjectDef = &(iNamespaceDef->GetObjectDefL( KVcxAlbumObjectName )); + + _LIT( KVcxTypePropertyName, "Type" ); + iTypePropertyDef = &(iAlbumObjectDef->GetPropertyDefL( KVcxTypePropertyName )); + + _LIT( KVcxContainsRelationName, "Contains" ); + iContainsRelationDef = + &(iNamespaceDef->GetRelationDefL( KVcxContainsRelationName )); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::Object2MediaL +// For album objects only. +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::Object2MediaL( + CMdEObject& aObject, + CMPXMedia& aAlbum ) + { + aAlbum.SetTObjectValueL(KMPXMediaGeneralType, EMPXGroup ); + + CMdEProperty* property = NULL; + + // ID + TMPXItemId mpxId; + mpxId.iId1 = aObject.Id(); + mpxId.iId2 = KVcxMvcMediaTypeAlbum; + aAlbum.SetTObjectValueL( KMPXMediaGeneralId, mpxId ); + + // TITLE + if ( aObject.Property( *iMdsDb.iTitlePropertyDef, property, 0 ) != KErrNotFound ) + { + aAlbum.SetTextValueL( KMPXMediaGeneralTitle, + static_cast(property)->Value()); + } + + // CREATION DATE + if ( aObject.Property( *iMdsDb.iCreationDatePropertyDef, property, 0 ) != KErrNotFound ) + { + aAlbum.SetTObjectValueL( KMPXMediaGeneralDate, + static_cast(property)->Value().Int64() ); + } + + // MODIFIED DATE + if ( aObject.Property( *iMdsDb.iLastModifiedDatePropertyDef, property, 0 ) != KErrNotFound ) + { + aAlbum.SetTObjectValueL( KVcxMediaMyVideosModifiedDate, + static_cast(property)->Value().Int64() ); + } + +#if 0 //TODO + // ALBUM TYPE + if ( aObject.Property( *iTypePropertyDef, property, 0 ) != KErrNotFound ) + { + aAlbum.SetTObjectValueL( KVcxMediaMyVideosAlbumType, + static_cast(property)->Value() ); + } +#endif + + //TODO: usage count + + aAlbum.SetTObjectValueL( KMPXMediaGeneralType, EMPXGroup ); + aAlbum.SetTObjectValueL( KMPXMediaGeneralCategory, EMPXNoCategory ); + aAlbum.SetTObjectValueL( KVcxMediaMyVideosCategoryItemCount, 0 ); + aAlbum.SetTObjectValueL( KVcxMediaMyVideosCategoryNewItemCount, 0 ); + + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::Media2ObjectL +// Called by AddAlbumL() +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::Media2ObjectL( + CMPXMedia& aAlbum, + CMdEObject& aObject) + { + CMdEProperty* property; + + // MDS ID + + // TITLE (NAME) + if ( aAlbum.IsSupported( KMPXMediaGeneralTitle ) ) + { + if ( aObject.Property( *iMdsDb.iTitlePropertyDef, property, 0 ) != KErrNotFound ) + { + static_cast(property)->SetValueL( + aAlbum.ValueText( KMPXMediaGeneralTitle ) ); + } + else + { + aObject.AddTextPropertyL( + *iMdsDb.iTitlePropertyDef, aAlbum.ValueText( KMPXMediaGeneralTitle ) ); + } + } + + // KMPXMediaGeneralDate ( creation date ) + if ( aAlbum.IsSupported( KMPXMediaGeneralDate ) ) + { + TInt64 creationDateInt64 = 0; + creationDateInt64 = aAlbum.ValueTObjectL( KMPXMediaGeneralDate ); + TTime creationDate( creationDateInt64 ); + if ( aObject.Property( *iMdsDb.iCreationDatePropertyDef, property, 0 ) != KErrNotFound ) + { + static_cast(property)->SetValueL( creationDate ); + } + else + { + aObject.AddTimePropertyL( *iMdsDb.iCreationDatePropertyDef, creationDate ); + } + } + + // KVcxMediaMyVideosModifiedDate + if ( aAlbum.IsSupported( KVcxMediaMyVideosModifiedDate ) ) + { + TInt64 modifiedDateInt64 = aAlbum.ValueTObjectL( KVcxMediaMyVideosModifiedDate ); + TTime modifiedDate( modifiedDateInt64 ); + if ( aObject.Property( *iMdsDb.iLastModifiedDatePropertyDef, property, 0 ) != KErrNotFound ) + { + static_cast(property)->SetValueL( modifiedDate ); + } + else + { + aObject.AddTimePropertyL( *iMdsDb.iLastModifiedDatePropertyDef, modifiedDate ); + } + } + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::GetSchemaDefinitionsL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::HandleQueryNewResults(CMdEQuery& aQuery, + TInt aFirstNewItemIndex, + TInt aNewItemCount ) + { + if ( &aQuery == iVideoQuery ) + { + TRAPD( err, HandleVideoQueryResultsL( aQuery, KErrNone, + aFirstNewItemIndex, aNewItemCount, EFalse /* completed */ ) ); + if ( err != KErrNone ) + { + MPX_DEBUG2("CVcxMyVideosMdsAlbums:: HandleVideoQueryResultsL() left: %d", err); + } + } + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::HandleQueryCompleted +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::HandleQueryCompleted( CMdEQuery& aQuery, TInt aError ) + { + if ( &aQuery == iAlbumQuery ) + { + TRAPD( err, HandleAlbumQueryCompletedL( aQuery, aError ) ); + if ( err != KErrNone ) + { + MPX_DEBUG2("CVcxMyVideosMdsAlbums:: HandleAlbumQueryCompletedL() left: %d", err); + } + } + else if ( &aQuery == iVideoQuery ) + { + TRAPD( err, HandleVideoQueryResultsL( aQuery, aError, 0, 0, ETrue /* completed */ ) ); + if ( err != KErrNone ) + { + MPX_DEBUG2("CVcxMyVideosMdsAlbums:: HandleVideoQueryResultsL() left: %d", err); + } + } + else if ( &aQuery == iRelationQuery ) + { + TRAPD( err, HandleRelationQueryCompletedL( aQuery, aError ) ); + if ( err != KErrNone ) + { + MPX_DEBUG2("CVcxMyVideosMdsAlbums:: HandleRelationQueryCompletedL() left: %d", err); + } + } + + iMdsDb.iCmdQueue->CmdFinished(); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::HandleAlbumQueryCompletedL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::HandleAlbumQueryCompletedL( CMdEQuery& /*aQuery*/, TInt aError ) + { + MPX_DEBUG1("CVcxMyVideosMdsAlbums::HandleAlbumQueryCompletedL() start"); + + if ( aError != KErrNone ) + { + MPX_DEBUG2("CVcxMyVideosMdsAlbums:: object query failed with error: %d", aError); + return; + } + + CMPXMediaArray* array = iAlbumList->Value( KMPXMediaArrayContents ); + + CMPXMedia* media; + TInt count = iAlbumQuery->Count(); + + iAlbumList->SetTObjectValueL( KMPXMediaArrayCount, count ); + + for ( TInt i = 0; i < count; i++ ) + { + CMdEObject& object = iAlbumQuery->Result( i ); + + media = CMPXMedia::NewL(); + CleanupStack::PushL( media ); // 1-> + + Object2MediaL( object, *media ); + +#ifdef _DEBUG + TBuf title; + title = TVcxMyVideosCollectionUtil::Title( *media ); + MPX_DEBUG2("CVcxMyVideosMdsAlbums:: object title: %S", &title); +#endif + + array->AppendL( media ); + + CleanupStack::Pop( media ); // <-1 + } + + iClient->HandleGetAlbumsResp( iAlbumList ); + iAlbumList = NULL; + + MPX_DEBUG1("CVcxMyVideosMdsAlbums::HandleAlbumQueryCompletedL() exit"); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::HandleVideoQueryCompletedL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::HandleVideoQueryResultsL( CMdEQuery& /*aQuery*/, TInt aError, + TInt aFirstNewItemIndex, TInt aNewItemCount, TBool aComplete ) + { + MPX_DEBUG1("CVcxMyVideosMdsAlbums::HandleVideoQueryResultsL() start"); + + if ( aComplete ) + { + // error code given only if completed + if ( aError != KErrNone ) + { + MPX_DEBUG2("CVcxMyVideosMdsAlbums:: object query failed with error: %d", aError); + } + + iClient->HandleGetAlbumContentVideosResp( iAlbumId, *iVideoList, + aError, aFirstNewItemIndex, aNewItemCount, aComplete ); + return; + } + + CMPXMediaArray* array = iVideoList->Value( KMPXMediaArrayContents ); + + CMPXMedia* media; + TInt count = iVideoQuery->Count(); + + iVideoList->SetTObjectValueL( KMPXMediaArrayCount, count ); + + for ( TInt i = aFirstNewItemIndex; i < count; i++ ) + { + CMdEObject& object = iVideoQuery->Result( i ); + + media = CMPXMedia::NewL(); + CleanupStack::PushL( media ); // 1-> + + iMdsDb.Object2MediaL( object, *media ); + +#ifdef _DEBUG + TBuf<256> title; + title = TVcxMyVideosCollectionUtil::Title( *media ); + MPX_DEBUG2("CVcxMyVideosMdsAlbums:: object title: %S", &title); +#endif + + array->AppendL( media ); + + CleanupStack::Pop( media ); // <-1 + } + + iClient->HandleGetAlbumContentVideosResp( iAlbumId, *iVideoList, + aError, aFirstNewItemIndex, aNewItemCount, aComplete ); + iVideoList = NULL; + + MPX_DEBUG1("CVcxMyVideosMdsAlbums::HandleVideoQueryResultsL() exit"); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::HandleRelationQueryCompletedL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::HandleRelationQueryCompletedL( CMdEQuery& /*aQuery*/, TInt aError ) + { + MPX_DEBUG1("CVcxMyVideosMdsAlbums::HandleRelationQueryCompletedL() start"); + + if ( aError != KErrNone ) + { + MPX_DEBUG2("CVcxMyVideosMdsAlbums:: relation query failed with error: %d", aError); + return; + } + + TInt count = iRelationQuery->Count(); + TVcxMyVideosAlbumVideo video; + for ( TInt i = 0; i < count; i++ ) + { + MPX_DEBUG4("Relation (id = %d): %d contains %d", iRelationQuery->Result( i ).Id(), + iRelationQuery->Result( i ).LeftObjectId(), + iRelationQuery->Result( i ).RightObjectId()); + video.iMdsId = iRelationQuery->Result( i ).RightObjectId(); + video.iRelationMdsId = iRelationQuery->Result( i ).Id(); + iAlbumContent->AppendL( video ); + } + + iClient->HandleGetAlbumContentIdsResp( iAlbumId, *iAlbumContent ); + + MPX_DEBUG1("CVcxMyVideosMdsAlbums::HandleRelationQueryCompletedL() exit"); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::AddVideosToAlbumL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::AddVideosToAlbumL( CMPXMedia* aCmd, + MVcxMyVideosMdsAlbumsObserver& aClient ) + { + MPX_DEBUG1("CVcxMyVideosMdsAlbums::AddVideosToAlbumL() start"); + + CVcxMyVideosMdsCmdAddVideosToAlbum* cmd = new (ELeave) CVcxMyVideosMdsCmdAddVideosToAlbum; + CleanupStack::PushL( cmd ); // 1-> + cmd->iCmdType = CVcxMyVideosMdsDb::EAddVideosToAlbum; + cmd->iClient = &aClient; + cmd->iMpxCmd = aCmd; + iMdsDb.iCmdQueue->ExecuteCmdL( cmd ); //ownership moves + CleanupStack::Pop( cmd ); // <-1 + MPX_DEBUG1("CVcxMyVideosMdsAlbums::AddVideosToAlbumL() exit"); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::DoAddVideosToAlbumL +// Called by iMdsDb.iCmdQueue +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::DoAddVideosToAlbumL( CMPXMedia* aCmd, + MVcxMyVideosMdsAlbumsObserver& aClient ) + { + iItemArray.Reset(); + iResultBuffer.Close(); + CMdERelation* relation; + CMPXMediaArray* videoArray = TVcxMyVideosCollectionUtil::MediaArrayL( *aCmd ); + + TInt albumId = TVcxMyVideosCollectionUtil::Uint32ValueL( *aCmd ); + + TInt count = videoArray->Count(); + iItemArray.Reserve( count ); + for ( TInt i = 0; i < count; i++ ) + { + // Filter already failed items out from the request (KErrAlreadyExists) + if ( TVcxMyVideosCollectionUtil::Int32ValueL( *videoArray->AtL( i ) ) + != KErrAlreadyExists ) + { + relation = iMdsDb.MdsSessionL().NewRelationL( + *iContainsRelationDef, albumId, + TVcxMyVideosCollectionUtil::IdL( *videoArray->AtL( i ) ) ); + CleanupStack::PushL( relation ); + iItemArray.AppendL( relation ); + CleanupStack::Pop( relation ); + } + } + + iClient = &aClient; + iMpxCmd = aCmd; + + iAsyncOperation = EVcxAddVideosToAlbum; + + iMdsDb.MdsSessionL().AddItemsAsyncL( iItemArray, iStatus, iResultBuffer ); + SetActive(); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::RemoveRelationsL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::RemoveRelationsL( RArray& aRelationIds, + RArray& aResults, MVcxMyVideosMdsAlbumsObserver& aClient ) + { + MPX_DEBUG1("CVcxMyVideosMdsAlbums::RemoveRelationsL() start"); + + CVcxMyVideosMdsCmdRemoveRelations* cmd = new (ELeave) CVcxMyVideosMdsCmdRemoveRelations; + CleanupStack::PushL( cmd ); // 1-> + cmd->iCmdType = CVcxMyVideosMdsDb::ERemoveRelations; + cmd->iClient = &aClient; + cmd->iRelationIds = &aRelationIds; + cmd->iResults = &aResults; + iMdsDb.iCmdQueue->ExecuteCmdL( cmd ); //owneship moves + CleanupStack::Pop( cmd ); // <-1 + MPX_DEBUG1("CVcxMyVideosMdsAlbums::RemoveRelationsL() exit"); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::DoRemoveRelationsL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::DoRemoveRelationsL( RArray& aRelationIds, + RArray& aResults, MVcxMyVideosMdsAlbumsObserver& aClient ) + { + MPX_DEBUG1("CVcxMyVideosMdsAlbums::DoRemoveRelationsL() start"); + + iResultBuffer.Close(); + + iClient = &aClient; + iResultArrayUint32 = &aResults; + iIdArray = &aRelationIds; + + iAsyncOperation = EVcxRemoveRelations; + + iMdsDb.MdsSessionL().RemoveRelationsAsyncL( *iIdArray, iStatus, iResultBuffer, iNamespaceDef ); + SetActive(); + + MPX_DEBUG1("CVcxMyVideosMdsAlbums::DoRemoveRelationsL() exit"); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::AddAlbumL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::AddAlbumL( CMPXMedia& aAlbum ) + { + MPX_DEBUG1("CVcxMyVideosMdsAlbums::AddAlbumL() start"); + + CMdEObject* object = iMdsDb.MdsSessionL().NewObjectLC( + *iAlbumObjectDef, KNullDesC ); // 1-> + + Media2ObjectL( aAlbum, *object ); + iMdsDb.SetCreationAndModifiedDatesL( *object ); + + TUint32 mdsId; + +#ifdef _DEBUG + TRAPD( err, mdsId = iMdsDb.MdsSessionL().AddObjectL( *object ) ); + + if ( err != KErrNone ) + { + MPX_DEBUG2( "CVcxMyVideosMdsAlbums:: iMdsDb.MdsSessionL().AddObjectL leaved with error: %d", err ); + User::Leave( err ); + } +#else + + mdsId = iMdsDb.MdsSessionL().AddObjectL( *object ); + +#endif + + if ( mdsId == KNoId ) + { + MPX_DEBUG1( "CVcxMyVideosMdsAlbums::AddAlbumL could not add new album" ); + User::Leave( KErrGeneral ); + } + + MPX_DEBUG2( "CVcxMyVideosMdsAlbums::AddAlbumL album created, mds id: %d", mdsId ); + + aAlbum.SetTObjectValueL( KMPXMediaGeneralId, TMPXItemId( mdsId, KVcxMvcMediaTypeAlbum ) ); + + CleanupStack::PopAndDestroy( object ); // <-1 + + MPX_DEBUG1("CVcxMyVideosMdsAlbums::AddAlbumL() exit"); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::SetAlbumL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::SetAlbumL( CMPXMedia& aVideo ) + { + MPX_DEBUG1("CVcxMyVideosMdsDb::SetAlbumL() start"); + + TMPXItemId mpxId = TVcxMyVideosCollectionUtil::IdL( aVideo ); + + MPX_DEBUG2("CVcxMyVideosMdsAlbums::SetAlbumL updating object %d ", mpxId.iId1); + + CMdEObject* object = + iMdsDb.MdsSessionL().OpenObjectL( mpxId.iId1, *iAlbumObjectDef ); + if ( !object ) + { + // No object with this ID was found! + MPX_DEBUG1("CVcxMyVideosMdsAlbums::SetAlbumL no object found"); + User::Leave( KErrNotFound ); + } + else + { + MPX_DEBUG1("CVcxMyVideosMdsAlbums::SetAlbumL object found"); + + if ( object->OpenForModifications() ) + { + CleanupStack::PushL( object ); // 1-> + + Media2ObjectL( aVideo, *object ); + + iMdsDb.MdsSessionL().CommitObjectL( *object ); + + CleanupStack::PopAndDestroy( object ); + } + else + { + // Object is already locked! + MPX_DEBUG1("CVcxMyVideosMdsAlbums::SetAlbumL object was locked!"); + delete object; + User::Leave( KErrInUse ); + } + } + + MPX_DEBUG1("CVcxMyVideosMdsDb::SetAlbumL() exit"); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::RemoveAlbumsL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::RemoveAlbumsL( CMPXMedia* aMpxCmd, MVcxMyVideosMdsAlbumsObserver& aClient ) + { + MPX_DEBUG1("CVcxMyVideosMdsAlbums::RemoveAlbumsL() start"); + + CVcxMyVideosMdsCmdRemoveAlbums* cmd = new (ELeave) CVcxMyVideosMdsCmdRemoveAlbums; + CleanupStack::PushL( cmd ); // 1-> + cmd->iCmdType = CVcxMyVideosMdsDb::ERemoveAlbums; + cmd->iClient = &aClient; + cmd->iMpxCmd = aMpxCmd; + iMdsDb.iCmdQueue->ExecuteCmdL( cmd ); //owneship moves + CleanupStack::Pop( cmd ); // <-1 + MPX_DEBUG1("CVcxMyVideosMdsAlbums::RemoveAlbumsL() exit"); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::DoRemoveAlbumsL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::DoRemoveAlbumsL( CMPXMedia* aMpxCmd, + MVcxMyVideosMdsAlbumsObserver& aClient ) + { + MPX_DEBUG1("CVcxMyVideosMdsAlbums::DoRemoveAlbumsL() start"); + + iResultBuffer.Close(); + + iClient = &aClient; + iMpxCmd = aMpxCmd; + + RArray idArray; + CleanupClosePushL( idArray ); + + CMPXMediaArray* mediaArray = TVcxMyVideosCollectionUtil::MediaArrayL( *aMpxCmd ); + + TVcxMyVideosCollectionUtil::GetIdsFromMediaArrayL( *mediaArray, idArray ); + + iAsyncOperation = EVcxRemoveAlbums; + + iMdsDb.MdsSessionL().RemoveObjectsAsyncL( idArray, iStatus, iResultBuffer, iNamespaceDef ); + + CleanupStack::PopAndDestroy( &idArray ); + SetActive(); + + MPX_DEBUG1("CVcxMyVideosMdsAlbums::DoRemoveAlbumsL() exit"); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::RunL +// From CActive. +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::RunL() + { +#ifdef _DEBUG + TInt status = iStatus.Int(); + if ( status != KErrNone ) + { + MPX_DEBUG2("CVcxMyVideosMdsAlbums::RunL() iStatus = %d", status); + } +#endif + + switch ( iAsyncOperation ) + { + case EVcxAddVideosToAlbum: + { + HandleAddVideosToAlbumCompletedL(); + } + break; + + case EVcxRemoveRelations: + HandleRemoveRelationsCompletedL(); + break; + + case EVcxRemoveAlbums: + HandleRemoveAlbumsCompletedL(); + break; + } + + iMdsDb.iCmdQueue->CmdFinished(); + } + +//TODO: implement RunError + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::HandleAddVideosToAlbumCompletedL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::HandleAddVideosToAlbumCompletedL() + { + MPX_DEBUG1("CVcxMyVideosMdsAlbums::HandleAddVideosToAlbumCompletedL() start"); + + iMdsDb.MdsSessionL().DeserializeItemsL( iResultBuffer, iItemArray ); + + iClient->HandleAddVideosToAlbumResp( iMpxCmd, iItemArray ); + iResultBuffer.Close(); + iItemArray.Close(); + + MPX_DEBUG1("CVcxMyVideosMdsAlbums::HandleAddVideosToAlbumCompletedL() exit"); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::HandleRemoveRelationsCompletedL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::HandleRemoveRelationsCompletedL() + { + MPX_DEBUG1("CVcxMyVideosMdsAlbums::HandleRemoveRelationsCompletedL() start"); + + iMdsDb.MdsSessionL().DeserializeIdsL( iResultBuffer, NULL, NULL, iResultArrayUint32 ); + +#ifdef _DEBUG + TItemId result; + TInt count = iResultArrayUint32->Count(); + for ( TInt i = 0; i < count; i++ ) + { + result = (*iResultArrayUint32)[i]; + MPX_DEBUG3("relation remove result[%d] = %d", i, result); + } +#endif + + iClient->HandleRemoveRelationsResp( *iIdArray, *iResultArrayUint32 ); + + MPX_DEBUG1("CVcxMyVideosMdsAlbums::HandleRemoveRelationsCompletedL() exit"); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::HandleRemoveAlbumsCompletedL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::HandleRemoveAlbumsCompletedL() + { + MPX_DEBUG1("CVcxMyVideosMdsAlbums::HandleRemoveAlbumsCompletedL() start"); + + RArray resultArray; + resultArray.Reset(); + CleanupClosePushL( resultArray ); + + iMdsDb.MdsSessionL().DeserializeIdsL( iResultBuffer, &resultArray, NULL, NULL ); + +#ifdef _DEBUG + TItemId result; + TInt count = resultArray.Count(); + + MPX_DEBUG2("CVcxMyVideosMdsAlbums:: remove albums result count = %d", count); + + for ( TInt i = 0; i < count; i++ ) + { + result = resultArray[i]; + MPX_DEBUG3("CVcxMyVideosMdsAlbums:: remove albums result[%d] = %d", i, result); + } +#endif + + iClient->HandleRemoveAlbumsResp( iMpxCmd, resultArray ); + + CleanupStack::PopAndDestroy( &resultArray ); + + MPX_DEBUG1("CVcxMyVideosMdsAlbums::HandleRemoveRelationsCompletedL() exit"); + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::HandleRelationItemNotification +// From MMdERelationItemObserver +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::HandleRelationItemNotification(CMdESession& /*aSession*/, + TObserverNotificationType aType, + const RArray& aRelationArray) + { + if ( iObserver ) + { + iObserver->HandleRelationEvent( aType, aRelationArray ); + } + } + +#if 0 +// ---------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::HandleRelationNotification +// From MMdERelationObserver +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::HandleRelationNotification(CMdESession& /*aSession*/, + TObserverNotificationType aType, + const RArray& aRelationIdArray) + { + switch ( aType ) + { + case ENotifyAdd: + MPX_DEBUG1("CVcxMyVideosMdsAlbums:: relation ENotifyAdd"); + if ( iObserver ) + { + iObserver->HandleRelationIdEvent( aType, aRelationIdArray ); + } + break; + case ENotifyModify: + MPX_DEBUG1("CVcxMyVideosMdsAlbums:: ENotifyModify"); + break; + case ENotifyRemove: + //remove is handled at HandleRelationItemNotification + break; + } + } +#endif + +// END OF FILE diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/src/vcxmyvideosmdscmdqueue.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videocollection/mpxmyvideoscollection/src/vcxmyvideosmdscmdqueue.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -0,0 +1,231 @@ +/* +* 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: Queues commands to MDS. +* +*/ + + +// INCLUDE FILES +#include +#include +#include "vcxmyvideosmdscmdqueue.h" +#include "vcxmyvideosmdsdb.h" +#include "vcxmyvideosmdsalbums.h" + + +// ============================ MEMBER FUNCTIONS ============================= + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CVcxMyVideosMdsCmdQueue::CVcxMyVideosMdsCmdQueue( CVcxMyVideosMdsDb& aMdsDb ) +: iMdsDb( aMdsDb ) + { + } + +// --------------------------------------------------------------------------- +// 2nd-phase constructor +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsCmdQueue::ConstructL() + { + iQueue.Reset(); + } + +// --------------------------------------------------------------------------- +// Two-Phase Constructor +// --------------------------------------------------------------------------- +// +CVcxMyVideosMdsCmdQueue* CVcxMyVideosMdsCmdQueue::NewL( CVcxMyVideosMdsDb& aMdsDb ) + { + CVcxMyVideosMdsCmdQueue* self = new(ELeave) CVcxMyVideosMdsCmdQueue( aMdsDb ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CVcxMyVideosMdsCmdQueue::~CVcxMyVideosMdsCmdQueue() + { + for ( TInt i = 0; i < iQueue.Count(); i++ ) + { + delete iQueue[i]; + } + iQueue.Close(); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsCmdQueue::Cancel +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsCmdQueue::Cancel( CVcxMyVideosMdsDb::TRequestType aType ) + { + TInt count = iQueue.Count()-1; + for ( TInt i = count; i >= 0; i-- ) + { + if ( iQueue[i]->iCmdType == aType || aType == CVcxMyVideosMdsDb::EAll ) + { + delete iQueue[i]; + iQueue[i] = NULL; + iQueue.Remove( i ); + } + } + iQueue.Compress(); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsCmdQueue::ExecuteCmdL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsCmdQueue::ExecuteCmdL( CVcxMyVideosMdsCmd* aCmd ) + { + if ( iQueue.Count() == 0 && !iCmdInProgress ) + { + DoExecuteCmdL( aCmd ); //ownership does not move + delete aCmd; + } + else + { + iQueue.AppendL( aCmd ); + } + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsCmdQueue::CmdFinished +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsCmdQueue::CmdFinished() + { + iCmdInProgress = EFalse; + + TInt err( KErrGeneral ); + while ( err != KErrNone ) + { + if ( iQueue.Count() == 0 ) + { + break; + } + + TInt cmdIndexToExecute; + // Let other commads bypass EGetVideoList + if ( iQueue.Count() > 1 && iQueue[0]->iCmdType == CVcxMyVideosMdsDb::EGetVideoList ) + { + cmdIndexToExecute = 1; + } + else + { + cmdIndexToExecute = 0; + } + TRAP( err, DoExecuteCmdL( iQueue[cmdIndexToExecute] ) ); //ownership does not move + delete iQueue[cmdIndexToExecute]; + iQueue[cmdIndexToExecute] = NULL; + iQueue.Remove( cmdIndexToExecute ); + iQueue.Compress(); + +#ifdef _DEBUG + if ( err != KErrNone ) + { + MPX_DEBUG2("CVcxMyVideosMdsCmdQueue:: MDS cmd failed: %d", err); + } +#endif + } + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsCmdQueue::DoExecuteCmdL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsCmdQueue::DoExecuteCmdL( CVcxMyVideosMdsCmd* aCmd ) + { + switch ( aCmd->iCmdType ) + { + case CVcxMyVideosMdsDb::EGetVideoList: + { + CVcxMyVideosMdsCmdGetVideoList* cmd = + static_cast( aCmd ); + iMdsDb.DoCreateVideoListL( cmd->iSortingOrder, + cmd->iAscending, + cmd->iFullDetails, + *cmd->iVideoList ); + iCmdInProgress = ETrue; + } + break; + + case CVcxMyVideosMdsDb::EGetAlbums: + { + CVcxMyVideosMdsCmdGetAlbums* cmd = static_cast( aCmd ); + iMdsDb.iAlbums->DoGetAlbumsL( cmd->iAlbumList, *cmd->iClient ); + iCmdInProgress = ETrue; + } + break; + + case CVcxMyVideosMdsDb::EGetAlbumContentIds: + { + CVcxMyVideosMdsCmdGetAlbumContentIds* cmd = + static_cast( aCmd ); + iMdsDb.iAlbums->DoGetAlbumContentIdsL( cmd->iAlbumId, *cmd->iAlbumContent, + *cmd->iClient ); + iCmdInProgress = ETrue; + } + break; + + case CVcxMyVideosMdsDb::EGetAlbumContentVideos: + { + CVcxMyVideosMdsCmdGetAlbumContentVideos* cmd = + static_cast( aCmd ); + iMdsDb.iAlbums->DoGetAlbumContentVideosL( cmd->iAlbumId, *cmd->iAlbumContentVideos, + *cmd->iClient ); + iCmdInProgress = ETrue; + } + break; + + case CVcxMyVideosMdsDb::EAddVideosToAlbum: + { + CVcxMyVideosMdsCmdAddVideosToAlbum* cmd = + static_cast( aCmd ); + iMdsDb.iAlbums->DoAddVideosToAlbumL( cmd->iMpxCmd, + *cmd->iClient ); + iCmdInProgress = ETrue; + } + break; + + case CVcxMyVideosMdsDb::ERemoveRelations: + { + CVcxMyVideosMdsCmdRemoveRelations* cmd = + static_cast( aCmd ); + iMdsDb.iAlbums->DoRemoveRelationsL( *cmd->iRelationIds, *cmd->iResults, + *cmd->iClient ); + iCmdInProgress = ETrue; + } + break; + + case CVcxMyVideosMdsDb::ERemoveAlbums: + { + CVcxMyVideosMdsCmdRemoveAlbums* cmd = + static_cast( aCmd ); + iMdsDb.iAlbums->DoRemoveAlbumsL( cmd->iMpxCmd, *cmd->iClient ); + iCmdInProgress = ETrue; + } + break; + + default: + break; + } + } +// END OF FILE diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/src/vcxmyvideosmdsdb.cpp --- a/videocollection/mpxmyvideoscollection/src/vcxmyvideosmdsdb.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/src/vcxmyvideosmdsdb.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -11,12 +11,11 @@ * * Contributors: * -* Description: MPX My Videos collection plugin's MDS database class* +* Description: MPX My Videos collection plugin's MDS database class* */ - //#include #include #include @@ -29,9 +28,11 @@ #include #include #include -#include #include "vcxmyvideosmdsdb.h" #include "vcxmyvideoscollectionutil.h" +#include "vcxmyvideosmdsalbums.h" +#include "vcxmyvideoscollectionutil.h" +#include "vcxmyvideosmdscmdqueue.h" _LIT( KVcxVideoObjectName, "Video" ); //1 (ID) @@ -55,7 +56,6 @@ _LIT( KVcxOriginPropertyName, "Origin" ); //16 _LIT( KVcxDurationPropertyName, "Duration" ); //17 _LIT( KVcxLastPlayPositionPropertyName, "LastPlayPosition" ); //10 -_LIT( KVcxDownloadIdPropertyName, "DownloadID" ); //18 _LIT( KVcxRatingPropertyName, "Rating" ); //19 _LIT( KVcxBitratePropertyName, "Bitrate" ); //20 _LIT( KVcxAudioFourCcPropertyName, "AudioFourCC" ); //21 @@ -162,8 +162,9 @@ // CVcxMyVideosMdsDb::CVcxMyVideosMdsDb // --------------------------------------------------------------------------- // -CVcxMyVideosMdsDb::CVcxMyVideosMdsDb( MVcxMyVideosMdsDbObserver* aObserver, RFs& aFs ) -: iFs( aFs ), iMdsDbObserver(aObserver) +CVcxMyVideosMdsDb::CVcxMyVideosMdsDb( MVcxMyVideosMdsDbObserver* aObserver, + RFs& aFs, MVcxMyVideosMdsAlbumsObserver* aAlbumsObserver ) +: iFs( aFs ), iMdsDbObserver(aObserver), iAlbumsObserver(aAlbumsObserver) { } @@ -175,13 +176,22 @@ { MPX_DEBUG1( "CVcxMyVideosMdsDb::ConstructL start" ); + iCmdQueue = CVcxMyVideosMdsCmdQueue::NewL( *this ); + iActiveSchedulerWait = new (ELeave) CActiveSchedulerWait; OpenMdsSessionL(); + + iAlbums = CVcxMyVideosMdsAlbums::NewL( *this, iAlbumsObserver ); + + TCallBack callBack( AsyncHandleQueryCompleted, this ); + iAsyncHandleQueryCompleteCaller = new (ELeave) CAsyncCallBack( callBack, + CActive::EPriorityStandard ); + iMdsShutdownMonitor = CVcxMdsShutdownMonitor::NewL( *this, KHarvesterPSShutdown, KMdSShutdown, EFalse ); - + MPX_DEBUG1( "CVcxMyVideosMdsDb::ConstructL exit" ); } @@ -198,7 +208,6 @@ delete iMdsSession; iMdsSession = NULL; iMdsSession = CMdESession::NewL( *this ); - if ( !iMdsSession ) { User::Leave( KErrGeneral ); @@ -222,6 +231,12 @@ iMdsSession->AddObjectPresentObserverL( *this ); GetSchemaDefinitionsL(); + + if ( iAlbums ) + { + iAlbums->GetSchemaDefinitionsL(); + iAlbums->SetObservingL(); + } } else { @@ -243,7 +258,6 @@ MPX_DEBUG1( "CVcxMyVideosMdsDb::--------------------------------------------------------------." ); MPX_DEBUG3( "CVcxMyVideosMdsDb::HandleObjectPresentNotification( aPresent = %1d, count = %3d) |", aPresent, aObjectIdArray.Count() ); MPX_DEBUG1( "CVcxMyVideosMdsDb::--------------------------------------------------------------'" ); - //iMdsDbObserver->HandleObjectPresentNotification(); TObserverNotificationType type; if ( aPresent ) @@ -261,10 +275,11 @@ // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- // -CVcxMyVideosMdsDb* CVcxMyVideosMdsDb::NewL( MVcxMyVideosMdsDbObserver* aObserver, RFs& aFs ) +CVcxMyVideosMdsDb* CVcxMyVideosMdsDb::NewL( MVcxMyVideosMdsDbObserver* aObserver, + RFs& aFs, MVcxMyVideosMdsAlbumsObserver* aAlbumsObserver ) { CVcxMyVideosMdsDb* self = - CVcxMyVideosMdsDb::NewLC( aObserver, aFs ); + CVcxMyVideosMdsDb::NewLC( aObserver, aFs, aAlbumsObserver ); CleanupStack::Pop( self ); return self; } @@ -273,10 +288,10 @@ // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- // -CVcxMyVideosMdsDb* CVcxMyVideosMdsDb::NewLC( - MVcxMyVideosMdsDbObserver* aObserver, RFs& aFs ) +CVcxMyVideosMdsDb* CVcxMyVideosMdsDb::NewLC( MVcxMyVideosMdsDbObserver* aObserver, + RFs& aFs, MVcxMyVideosMdsAlbumsObserver* aAlbumsObserver ) { - CVcxMyVideosMdsDb* self = new( ELeave ) CVcxMyVideosMdsDb( aObserver, aFs ); + CVcxMyVideosMdsDb* self = new( ELeave ) CVcxMyVideosMdsDb( aObserver, aFs, aAlbumsObserver ); CleanupStack::PushL( self ); self->ConstructL(); return self; @@ -290,13 +305,15 @@ { MPX_DEBUG1( "CVcxMyVideosMdsDb::~CVcxMyVideosMdsDb() start" ); - Cancel(); + Cancel( EGetVideoList ); + + delete iAlbums; + delete iCmdQueue; delete iVideoQuery; delete iMdsSession; delete iActiveSchedulerWait; - delete iRepository; + delete iAsyncHandleQueryCompleteCaller; delete iMdsShutdownMonitor; - MPX_DEBUG1( "CVcxMyVideosMdsDb::~CVcxMyVideosMdsDb() exit" ); } @@ -304,16 +321,26 @@ // CVcxMyVideosMdsDb::Cancel // --------------------------------------------------------------------------- // -void CVcxMyVideosMdsDb::Cancel() +void CVcxMyVideosMdsDb::Cancel( TRequestType aType ) { MPX_DEBUG1("CVcxMyVideosMdsDb::Cancel() start"); - if ( iVideoQuery ) + iCmdQueue->Cancel( aType ); + + if ( aType == EAll || aType == EGetVideoList ) { - iVideoQuery->Cancel(); + if ( iVideoQuery ) + { + iVideoQuery->Cancel(); + } + iVideoListFetchingIsOngoing = EFalse; } - iVideoListFetchingIsOngoing = EFalse; + if ( aType != EGetVideoList ) + { + iAlbums->CancelQueries( aType ); + } + MPX_DEBUG1("CVcxMyVideosMdsDb::Cancel() exit"); } @@ -335,7 +362,7 @@ object->AddUint8PropertyL( *iOriginPropertyDef, aVideo.ValueTObjectL( KVcxMediaMyVideosOrigin ) ); - + CMdEProperty* property; // Type can not be modified normally, so set it here @@ -410,7 +437,7 @@ MPX_DEBUG2( "CVcxMyVideosMdsDb:: MdsSessionL().RemoveObjectL left: %d", err ); retValue = err; } - + MPX_DEBUG1( "CVcxMyVideosMdsDb::RemoveVideoL() exit" ); return retValue; } @@ -429,7 +456,7 @@ CMdEObject* object = MdsSessionL().OpenObjectL( mpxId.iId1, *iVideoObjectDef ); - if ( object == NULL ) + if ( !object ) { // No object with this ID was found! MPX_DEBUG1("CVcxMyVideosMdsDb::UpdateVideoL no object found"); @@ -457,7 +484,6 @@ User::Leave( KErrInUse ); } } - MPX_DEBUG1( "CVcxMyVideosMdsDb::UpdateVideoL() exit" ); } @@ -469,6 +495,27 @@ TBool aAscending, TBool aFullDetails, CMPXMedia*& aVideoList ) { MPX_DEBUG1( "CVcxMyVideosMdsDb::CreateVideoListL() start" ); + + CVcxMyVideosMdsCmdGetVideoList* cmd = new (ELeave) CVcxMyVideosMdsCmdGetVideoList; + CleanupStack::PushL( cmd ); // 1-> + cmd->iCmdType = CVcxMyVideosMdsDb::EGetVideoList; + cmd->iSortingOrder = aSortingOrder; + cmd->iAscending = aAscending; + cmd->iFullDetails = aFullDetails; + cmd->iVideoList = &aVideoList; + + iCmdQueue->ExecuteCmdL( cmd ); //ownership moves + CleanupStack::Pop( cmd ); // <-1 + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsDb::DoCreateVideoListL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsDb::DoCreateVideoListL( TVcxMyVideosSortingOrder aSortingOrder, + TBool aAscending, TBool aFullDetails, CMPXMedia*& aVideoList ) + { + MPX_FUNC( "CVcxMyVideosMdsDb::DoCreateVideoListL" ); if ( iVideoListFetchingIsOngoing ) { @@ -553,14 +600,13 @@ iFullDetails = aFullDetails; - iVideoQuery->FindL(KMdEQueryDefaultMaxCount, 500); + const TInt maxItemsInQueryResult = 500; + iVideoQuery->FindL( KMdEQueryDefaultMaxCount, maxItemsInQueryResult ); aVideoList->SetTObjectValueL( KMPXMediaGeneralType, EMPXGroup ); aVideoList->SetTObjectValueL( KMPXMediaArrayCount, mediaArray->Count() ); iVideoList = aVideoList; // lets store the pointer, ownership stays at observer - - MPX_DEBUG1( "CVcxMyVideosMdsDb::CreateVideoListL() exit" ); } // --------------------------------------------------------------------------- @@ -624,7 +670,6 @@ iMdsDbObserver->HandleCreateVideoListResp( iVideoList, aFirstNewItemIndex, EFalse /* not complete yet */); - MPX_DEBUG1("CVcxMyVideosMdsDb::HandleQueryNewResults() exit"); } @@ -635,40 +680,48 @@ // --------------------------------------------------------------------------- // void CVcxMyVideosMdsDb::HandleQueryCompleted( -#if _DEBUG - CMdEQuery& aQuery, -#else CMdEQuery& /*aQuery*/, -#endif TInt /*aError*/) { - MPX_DEBUG1( "CVcxMyVideosMdsDb::HandleQueryCompleted() start" ); + iAsyncHandleQueryCompleteCaller->CallBack(); + } - if ( !iVideoList ) +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsDb::AsyncHandleQueryCompleted +// --------------------------------------------------------------------------- +// +TInt CVcxMyVideosMdsDb::AsyncHandleQueryCompleted( TAny* aThis ) + { + MPX_FUNC( "CVcxMyVideosMdsDb::AsyncHandleQueryCompleted" ); + + CVcxMyVideosMdsDb* thisObj = static_cast( aThis ); + + if ( !thisObj->iVideoList ) { MPX_DEBUG1("CVcxMyVideosMdsDb:: iVideoList is NULL, should never happen"); - return; + return KErrNone; } #ifdef _DEBUG - CMPXMediaArray* array = iVideoList->Value( KMPXMediaArrayContents ); + CMPXMediaArray* array = thisObj->iVideoList->Value( KMPXMediaArrayContents ); #endif - MPX_DEBUG2("CVcxMyVideosMdsDb:: query contains %d items", aQuery.Count()); + MPX_DEBUG2("CVcxMyVideosMdsDb:: query contains %d items", thisObj->iVideoQuery->Count()); MPX_DEBUG2("CVcxMyVideosMdsDb:: iVideoList contains %d items", array->Count()); - if (iActiveSchedulerWait->IsStarted()) + if ( thisObj->iActiveSchedulerWait->IsStarted() ) { - iActiveSchedulerWait->AsyncStop(); + thisObj->iActiveSchedulerWait->AsyncStop(); } - iVideoListFetchingIsOngoing = EFalse; - iMdsDbObserver->HandleCreateVideoListResp( iVideoList, KErrNotFound /* KErrNotFound = no new items */, + thisObj->iVideoListFetchingIsOngoing = EFalse; + thisObj->iMdsDbObserver->HandleCreateVideoListResp( thisObj->iVideoList, KErrNotFound /* KErrNotFound = no new items */, ETrue /* complete */); - - MPX_DEBUG1( "CVcxMyVideosMdsDb::HandleQueryCompleted() exit" ); + + thisObj->iVideoList = NULL; // not owned by us -> just clear - iVideoList = NULL; // not owned by us -> just clear + thisObj->iCmdQueue->CmdFinished(); + return KErrNone; } // --------------------------------------------------------------------------- @@ -681,21 +734,21 @@ CMdEObject* object = ObjectL( aId ); - CMPXMedia* video = NULL; - - if ( object ) + if ( !object ) { - CleanupStack::PushL( object ); // 1-> + MPX_DEBUG2("CVcxMyVideosMdsDb:: mds id %d not found from mds", aId); + return NULL; + } + + CleanupStack::PushL( object ); // 1-> - video = CMPXMedia::NewL( ); - CleanupStack::PushL( video ); // 2-> - - Object2MediaL( *object, *video, aFullDetails ); + CMPXMedia* video = CMPXMedia::NewL( ); + CleanupStack::PushL( video ); // 2-> - CleanupStack::Pop( video ); // <-2 - CleanupStack::PopAndDestroy( object ); // <-1 - } + Object2MediaL( *object, *video, aFullDetails ); + CleanupStack::Pop( video ); // <-2 + CleanupStack::PopAndDestroy( object ); // <-1 MPX_DEBUG1( "CVcxMyVideosMdsDb::CreateVideoL() exit" ); return video; @@ -719,7 +772,6 @@ iMdsSessionError = aError; } - MPX_DEBUG1("CVcxMyVideosMdsDb::HandleSessionOpened() exit" ); } @@ -770,10 +822,9 @@ // CVcxMyVideosMdsDb::ObjectL // --------------------------------------------------------------------------- // -CMdEObject* CVcxMyVideosMdsDb::ObjectL( const TItemId aId ) +CMdEObject* CVcxMyVideosMdsDb::ObjectL( const TItemId aId, TBool aIsVideo ) { MPX_DEBUG1("CVcxMyVideosMdsDb::ObjectL start"); - // If the id is not valid, just return NULL, because // MdsSessionL().GetObjectL leaves in that case if ( aId == KNoId ) @@ -781,9 +832,16 @@ return NULL; } - CMdEObject* object = NULL; - object = MdsSessionL().GetObjectL( aId, *iVideoObjectDef ); - + CMdEObject* object; + if ( aIsVideo ) + { + object = MdsSessionL().GetObjectL( aId, *iVideoObjectDef ); + } + else + { + object = MdsSessionL().GetObjectL( aId, *iAlbums->iAlbumObjectDef ); + } + if ( object ) { MPX_DEBUG2( "CVcxMyVideosMdsDb::ObjectL found, id: %d", aId ); @@ -968,10 +1026,20 @@ if ( aObject.Property( *iOriginPropertyDef, property, 0 ) != KErrNotFound ) { TUint8 origin = static_cast(property)->Value(); +#ifdef VIDEO_COLLECTION_PLUGIN_TB92 if( origin != EVcxMyVideosOriginCapturedWithCamera ) { origin = EVcxMyVideosOriginOther; } +#else + if ( origin != EVcxMyVideosOriginCapturedWithCamera && + origin != EVcxMyVideosOriginDownloaded + ) + { + origin = EVcxMyVideosOriginOther; + } + +#endif aVideo.SetTObjectValueL( KVcxMediaMyVideosOrigin, origin ); } @@ -992,18 +1060,7 @@ aVideo.SetTObjectValueL( KMPXMediaGeneralLastPlaybackPosition, pos ); } - - //18. DOWNLOAD ID (BRIEF) - if ( aObject.Property( *iDownloadIdPropertyDef, property, 0 ) != KErrNotFound ) - { - aVideo.SetTObjectValueL( KVcxMediaMyVideosDownloadId, - static_cast(property)->Value() ); - } - else - { - aVideo.SetTObjectValueL( KVcxMediaMyVideosDownloadId, 0 ); - } - + //19. RATING (FULL) if ( aObject.Property( *iRatingPropertyDef, property, 0 ) != KErrNotFound && aFullDetails ) @@ -1136,10 +1193,8 @@ } #endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API -#if 1 // 6. KMPXMediaGeneralDate ( creation date ) SetCreationDateToObjectL( aVideo, aObject ); -#endif // 7. KMPXMediaGeneralFlags (including DRM flag) if ( aVideo.IsSupported( KMPXMediaGeneralFlags ) ) @@ -1336,6 +1391,7 @@ static_cast(property)->SetValueL( flags ); } + if ( aObject.Property( *iLastPlayPositionPropertyDef, property, 0 ) != KErrNotFound ) { static_cast(property)->SetValueL( lastPlaybackPos ); @@ -1346,21 +1402,6 @@ } } - // 18. DOWNLOAD ID - if ( aVideo.IsSupported( KVcxMediaMyVideosDownloadId ) ) - { - TUint32 dlId = aVideo.ValueTObjectL( KVcxMediaMyVideosDownloadId ); - - if ( aObject.Property( *iDownloadIdPropertyDef, property, 0 ) != KErrNotFound ) - { - static_cast(property)->SetValueL( dlId ); - } - else - { - aObject.AddUint32PropertyL( *iDownloadIdPropertyDef, dlId ); - } - } - // 19. RATING if ( aVideo.IsSupported( KVcxMediaMyVideosRating ) ) { @@ -1526,9 +1567,9 @@ iRatingPropertyDef = &(iVideoObjectDef->GetPropertyDefL( KVcxRatingPropertyName )); //19 iBitratePropertyDef = &(iVideoObjectDef->GetPropertyDefL( - KVcxBitratePropertyName )); //20 + KVcxBitratePropertyName )); //20 iAudioFourCcPropertyDef = &(iVideoObjectDef->GetPropertyDefL( - KVcxAudioFourCcPropertyName )); //21 + KVcxAudioFourCcPropertyName )); //21 iWidthPropertyDef = &(iVideoObjectDef->GetPropertyDefL( KVcxWidthPropertyName )); //22 iHeightPropertyDef = &(iVideoObjectDef->GetPropertyDefL( @@ -1548,10 +1589,7 @@ iAudioLanguagePropertyDef = &(iVideoObjectDef->GetPropertyDefL( KVcxAudioLanguagePropertyName )); //14 - - iDownloadIdPropertyDef = &(iVideoObjectDef->GetPropertyDefL( - KVcxDownloadIdPropertyName )); //18 - + } // --------------------------------------------------------------------------- diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/src/vcxmyvideosmessagelist.cpp --- a/videocollection/mpxmyvideoscollection/src/vcxmyvideosmessagelist.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/src/vcxmyvideosmessagelist.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -106,7 +106,7 @@ MPX_DEBUG1("CVcxMyVideosMessageList:: ----------------------------------------------'" ); #endif - if ( AlreadyInMessageListL( aId, aChange, aExtraInfo ) ) + if ( aChange == EMPXItemModified && AlreadyInMessageListL( aId, aChange, aExtraInfo ) ) { MPX_DEBUG1("CVcxMyVideosMessageList:: already in message list, skipping add"); return; @@ -130,7 +130,7 @@ { message->SetTObjectValueL( KVcxMediaMyVideosInt32Value, aExtraInfo ); } - + MPX_DEBUG1("CVcxMyVideosMessageList:: appending to message array"); iMessageArray->AppendL( message ); // ownership moves @@ -189,6 +189,24 @@ { extraInfo = media->ValueTObjectL( KVcxMediaMyVideosInt32Value ); } + + if ( extraInfo == EVcxMyVideosVideoListOrderChanged && + aExtraInfo == 0 ) + { + MPX_DEBUG1("CVcxMyVideosMessageList:: found similar message with EVcxMyVideosVideoListOrderChanged flag set, discarding this msg"); + return ETrue; + } + + if ( aExtraInfo == EVcxMyVideosVideoListOrderChanged && + extraInfo == 0 ) + { + MPX_DEBUG1("CVcxMyVideosMessageList:: Turning the EVcxMyVideosVideoListOrderChanged flag on to the previous message"); + MPX_DEBUG1("CVcxMyVideosMessageList:: and discarding this."); + media->SetTObjectValueL( KVcxMediaMyVideosInt32Value, + EVcxMyVideosVideoListOrderChanged ); + return ETrue; + } + if ( aExtraInfo == extraInfo ) { return ETrue; @@ -271,7 +289,7 @@ // void CVcxMyVideosMessageList::SendL() { - MPX_FUNC("CVcxMyVideosMessageList::SendL()"); + MPX_DEBUG1("CVcxMyVideosMessageList::SendL"); if ( iMessageCount == 0 || !iMessageList ) { @@ -299,9 +317,7 @@ iMessageList->SetTObjectValueL(KMPXMessageGeneralId, KVcxCommandIdMyVideos); iMessageList->SetTObjectValueL(KVcxMediaMyVideosCommandId, KVcxMessageMyVideosMessageArray ); - iMessageList->SetTObjectValueL(KMPXMessageCollectionId, TUid::Uid(KVcxUidMyVideosMpxCollection)); - //iMessageList->SetTObjectValueL(KMPXMessageChangeEventType, aChange); - //iMessageList->SetTObjectValueL(KMPXMessageMediaGeneralId, TMPXItemId(0, 0) ); + iMessageList->SetTObjectValueL(KMPXMessageCollectionId, TUid::Uid(KVcxUidMyVideosMpxCollection)); iMessageCount = 0; } } diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/src/vcxmyvideosopenhandler.cpp --- a/videocollection/mpxmyvideoscollection/src/vcxmyvideosopenhandler.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/src/vcxmyvideosopenhandler.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -11,11 +11,11 @@ * * Contributors: * -* Description: Handles collection Open operation related functionality.* +* Description: Handles collection Open operation related functionality. +* */ - // INCLUDE FILES #include #include @@ -31,6 +31,8 @@ #include "vcxmyvideoscategories.h" #include "vcxmyvideosmessagelist.h" #include "vcxmyvideoscollectionutil.h" +#include "vcxmyvideosalbums.h" +#include "vcxmyvideosmdsalbums.h" // ============================ MEMBER FUNCTIONS ============================= @@ -52,6 +54,9 @@ void CVcxMyVideosOpenHandler::ConstructL() { iCategoryIdsBeingOpened.Reset(); + iVideoListsBeingOpened.Reset(); + iAlbumIdsBeingOpened.Reset(); + iAlbumVideoListsBeingOpened.Reset(); } // --------------------------------------------------------------------------- @@ -85,6 +90,16 @@ iVideoListsBeingOpened[i] = NULL; } iVideoListsBeingOpened.Close(); + + iAlbumIdsBeingOpened.Close(); + + count = iAlbumVideoListsBeingOpened.Count(); + for ( TInt i = 0; i < count; i++ ) + { + delete iAlbumVideoListsBeingOpened[i]; + iAlbumVideoListsBeingOpened[i] = NULL; + } + iAlbumVideoListsBeingOpened.Close(); } // --------------------------------------------------------------------------- @@ -99,114 +114,89 @@ MPX_DEBUG1("CVcxMyVideosOpenHandler:: path before open:"); MPX_DEBUG_PATH( aPath ); + iPath = &aPath; + + const TInt categoryLevel = 1; + const TInt videosLevel = 2; + const TInt playlistLevel = 3; + switch ( aPath.Levels() ) { - case 1: + case categoryLevel: { - //we are at root level, return main level items (categories) - - // this is needed to update category counters + //we are at root level, return main level items (categories + albums) + +#ifndef VIDEO_COLLECTION_PLUGIN_TB92 + iCollection.AlbumsL().CreateAlbumListL(); //async +#endif + + // This is needed to update category counters. + // Goes to queue if CreateAlbumListL command goes to execution TRAPD( err, iCache.CreateVideoListL() ); if ( err != KErrNone ) { - MPX_DEBUG2("iCache->CreateVideoListL() left: %d. Returning categories anyway.", err); + MPX_DEBUG2("iCache->CreateVideoListL() left: %d. Returning categories and albums anyway.", err); } - iCollection.CategoriesL().iList-> - SetTObjectValueL( KVcxMediaMyVideosVideoListIsPartial, - iCache.iVideoListIsPartial ); - - iCollection.iObs->HandleOpen( iCollection.CategoriesL().iList, KErrNone ); + CMPXMedia* itemList = TVcxMyVideosCollectionUtil::CreateEmptyMediaListL(); + CleanupStack::PushL( itemList ); + + itemList->SetTObjectValueL( KVcxMediaMyVideosVideoListIsPartial, + !iCache.IsComplete() ); + + TVcxMyVideosCollectionUtil::AppendToListL( *itemList, *iCollection.CategoriesL().iList ); +#ifndef VIDEO_COLLECTION_PLUGIN_TB92 + TVcxMyVideosCollectionUtil::AppendToListL( *itemList, *iCollection.AlbumsL().iAlbumList ); +#endif + itemList->SetCObjectValueL( KMPXMediaGeneralContainerPath, iPath ); + iCollection.iObs->HandleOpen( itemList, KErrNone ); + CleanupStack::PopAndDestroy( itemList ); + MPX_DEBUG1("CVcxMyVideosOpenHandler:: called HandleOpen for categories + albums"); } break; - case 2: + case videosLevel: { - //we are at second level, return video list from some category + //we are at second level, return video list from some category or album - TInt categoryId = aPath.Id(); +#ifndef VIDEO_COLLECTION_PLUGIN_TB92 + iCollection.AlbumsL().CreateAlbumListL(); //async +#endif - MPX_DEBUG2("CVcxMyVideosOpenHandler:: opening category %d", categoryId); + TMPXItemId categoryId( aPath.Id() ); - if ( categoryId != KVcxMvcCategoryIdAll && - categoryId != KVcxMvcCategoryIdDownloads && - categoryId != KVcxMvcCategoryIdTvRecordings && - categoryId != KVcxMvcCategoryIdCaptured && - categoryId != KVcxMvcCategoryIdOther ) + if ( ( categoryId.iId2 == KVcxMvcMediaTypeCategory ) || + ( categoryId.iId2 == KVcxMvcMediaTypeVideo ) && + (categoryId.iId1 == KVcxMvcCategoryIdAll || + categoryId.iId1 == KVcxMvcCategoryIdDownloads || + categoryId.iId1 == KVcxMvcCategoryIdTvRecordings || + categoryId.iId1 == KVcxMvcCategoryIdCaptured || + categoryId.iId1 == KVcxMvcCategoryIdOther) ) { - MPX_DEBUG2("CVcxMyVideosOpenHandler:: category ID not valid (%d) -> calling HandleOpen with KErrNotFound", categoryId); - iCollection.iObs->HandleOpen( static_cast(NULL), KErrNotFound ); + MPX_DEBUG2("CVcxMyVideosOpenHandler:: opening category %d", categoryId.iId1 ); + OpenCategoryL( categoryId.iId1 ); return; } - - TUint8 origin = static_cast( TVcxMyVideosCollectionUtil::Origin( categoryId ) ); - - iCache.CreateVideoListL(); // Causes async call to MDS, callbacks to DoHandleCreateVideoListRespL will happen. - // If iCache.iVideoList is complete and can be used (correct sorting order), - // then nothing is done. - - if ( !iCache.iVideoListIsPartial ) + else { - MPX_DEBUG1("CVcxMyVideosOpenHandler:: videolist complete"); - - // iCache.iVideoList is complete - if ( categoryId == KVcxMvcCategoryIdAll ) + MPX_DEBUG2("CVcxMyVideosOpenHandler:: opening album %d", categoryId.iId1 ); + + iPendingAlbumOpenId = categoryId.iId1; + if ( iCollection.AlbumsL().iAlbumListIsComplete ) { - MPX_DEBUG1("CVcxMyVideosOpenHandler:: KVcxMvcCategoryIdAll: calling HandleOpen(iCache.iVideoList)"); - iCollection.iObs->HandleOpen( iCache.iVideoList, KErrNone ); + HandleAlbumOpenL(); // iPendingAlbumOpenId goes to 0 + return; } else { - MPX_DEBUG1("CVcxMyVideosOpenHandler:: other than KVcxMvcCategoryIdAll: creating new category video list"); - CMPXMedia* videoList = iCache.CreateVideoListByOriginL( origin ); - MPX_DEBUG1("CVcxMyVideosOpenHandler:: calling HandleOpen(new list)"); - iCollection.iObs->HandleOpen( videoList, KErrNone ); - delete videoList; - } - iCollection.iMessageList->AddEventL( KVcxMessageMyVideosListComplete ); - iCollection.iMessageList->SendL(); - - // No append events will arrive anymore -> we create our own version of the - // video list. - iCache.ReCreateVideoListL(); - } - else - { - MPX_DEBUG1("CVcxMyVideosOpenHandler:: video list incomplete"); - // iCache.iVideoList is incomplete - - if ( categoryId == KVcxMvcCategoryIdAll ) - { - MPX_DEBUG1("CVcxMyVideosOpenHandler:: KVcxMvcCategoryIdAll, calling HandleOpen"); - iCollection.iObs->HandleOpen( iCache.iVideoList, KErrNone ); + // We will continue at HandleAlbumOpenL when album list arrives, iPendingAlbumOpenId is left != 0 + return; } - else - { - MPX_DEBUG1("CVcxMyVideosOpenHandler:: other than KVcxMvcCategoryIdAll"); + } + } - TInt pos = iCategoryIdsBeingOpened.Find( categoryId ); - if ( pos == KErrNotFound ) - { - MPX_DEBUG1("CVcxMyVideosOpenHandler:: category was not opened yet, creating list for it"); - iCategoryIdsBeingOpened.AppendL( categoryId ); - CMPXMedia* videoList = iCache.CreateVideoListByOriginL( origin ); - iVideoListsBeingOpened.AppendL( videoList ); - MPX_DEBUG1("CVcxMyVideosOpenHandler:: calling HandleOpen"); - iCollection.iObs->HandleOpen( iCache.iVideoList, KErrNone ); - } - else - { - MPX_DEBUG1("CVcxMyVideosOpenHandler:: category was already being opened, calling HandleOpen with that"); - iCollection.iObs->HandleOpen( iVideoListsBeingOpened[pos], KErrNone ); - } - } - } - - } - break; - - case 3: + case playlistLevel: { iCollection.iObs->HandleOpen(const_cast (&aPath), KErrNone); } @@ -218,14 +208,95 @@ } //switch } +// --------------------------------------------------------------------------- +// CVcxMyVideosOpenHandler::OpenCategoryL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosOpenHandler::OpenCategoryL( TUint32 aCategoryId ) + { + TUint8 origin = static_cast( TVcxMyVideosCollectionUtil::Origin( aCategoryId ) ); + + iCache.CreateVideoListL(); // Causes async call to MDS, callbacks to DoHandleCreateVideoListRespL will follow. + // If iCache.iVideoList is complete and can be used (correct sorting order), + // then nothing is done. + + if ( iCache.IsComplete() ) + { + MPX_DEBUG1("CVcxMyVideosOpenHandler:: videolist complete"); + + // iCache.iVideoList is complete + if ( aCategoryId == KVcxMvcCategoryIdAll ) + { + MPX_DEBUG1("CVcxMyVideosOpenHandler:: KVcxMvcCategoryIdAll: calling HandleOpen(iCache.iVideoList)"); + iCache.iVideoList->SetCObjectValueL( KMPXMediaGeneralContainerPath, iPath ); + iCache.iVideoList->SetTObjectValueL( KVcxMediaMyVideosInt32Value, + EVcxMyVideosVideoListComplete ); + iCollection.iObs->HandleOpen( iCache.iVideoList, KErrNone ); + } + else + { + MPX_DEBUG1("CVcxMyVideosOpenHandler:: other than KVcxMvcCategoryIdAll: creating new category video list"); + CMPXMedia* videoList = iCache.CreateVideoListByOriginL( origin ); + MPX_DEBUG1("CVcxMyVideosOpenHandler:: calling HandleOpen(new list)"); + videoList->SetCObjectValueL( KMPXMediaGeneralContainerPath, iPath ); + videoList->SetTObjectValueL( KVcxMediaMyVideosInt32Value, + EVcxMyVideosVideoListComplete ); + iCollection.iObs->HandleOpen( videoList, KErrNone ); + delete videoList; + } + iCollection.iMessageList->AddEventL( KVcxMessageMyVideosListComplete ); + iCollection.iMessageList->SendL(); + + // No append events will arrive anymore -> we create our own version of the + // video list. + iCache.ReCreateVideoListL(); + } + else + { + MPX_DEBUG1("CVcxMyVideosOpenHandler:: video list incomplete"); + // iCache.iVideoList is incomplete + + if ( aCategoryId == KVcxMvcCategoryIdAll ) + { + MPX_DEBUG1("CVcxMyVideosOpenHandler:: KVcxMvcCategoryIdAll, calling HandleOpen"); + iCache.iVideoList->SetCObjectValueL( KMPXMediaGeneralContainerPath, iPath ); + iCollection.iObs->HandleOpen( iCache.iVideoList, KErrNone ); + } + else + { + MPX_DEBUG1("CVcxMyVideosOpenHandler:: other than KVcxMvcCategoryIdAll"); + + TInt pos = iCategoryIdsBeingOpened.Find( aCategoryId ); + if ( pos == KErrNotFound ) + { + MPX_DEBUG1("CVcxMyVideosOpenHandler:: category was not opened yet, creating list for it"); + iCategoryIdsBeingOpened.AppendL( aCategoryId ); + CMPXMedia* videoList = iCache.CreateVideoListByOriginL( origin ); + CleanupStack::PushL( videoList ); + iVideoListsBeingOpened.AppendL( videoList ); + CleanupStack::Pop( videoList ); + MPX_DEBUG1("CVcxMyVideosOpenHandler:: calling HandleOpen"); + videoList->SetCObjectValueL( KMPXMediaGeneralContainerPath, iPath ); + iCollection.iObs->HandleOpen( videoList, KErrNone ); + } + else + { + MPX_DEBUG1("CVcxMyVideosOpenHandler:: category was already being opened, calling HandleOpen with that"); + iVideoListsBeingOpened[pos]->SetCObjectValueL( KMPXMediaGeneralContainerPath, iPath ); + iCollection.iObs->HandleOpen( iVideoListsBeingOpened[pos], KErrNone ); + } + } + } + } + // ---------------------------------------------------------------------------- // CVcxMyVideosOpenHandler::DoHandleCreateVideoListRespL -// New items fetched from MDS. iCache.iVideoList = aVideoList. +// New items fetched from MDS. iCollection.iCache->iVideoList = &aVideoList. // ---------------------------------------------------------------------------- // void CVcxMyVideosOpenHandler::DoHandleCreateVideoListRespL( CMPXMedia* aVideoList, TInt aNewItemsStartIndex, TBool aComplete ) - { + { MPX_FUNC("CVcxMyVideosOpenHandler::DoHandleCreateVideoListRespL()"); MPX_DEBUG2("CVcxMyVideosOpenHandler:: aComplete = %d", aComplete); @@ -237,29 +308,36 @@ } // Append new items to category video lists. All category is using iCache.iVideoList, thus no need to append to it. - TInt count = iCategoryIdsBeingOpened.Count(); - for ( TInt i = 0; i < count; i++ ) + TInt categoryCount = iCategoryIdsBeingOpened.Count(); + for ( TInt i = 0; i < categoryCount; i++ ) { iCache.AppendToListL( *iVideoListsBeingOpened[i], *aVideoList, TVcxMyVideosCollectionUtil::Origin( iCategoryIdsBeingOpened[i] ), aNewItemsStartIndex ); } - + + // Append new items to album video lists. + TInt albumCount = iAlbumVideoListsBeingOpened.Count(); + for ( TInt i = 0; i < albumCount; i++ ) + { + iCollection.iAlbums->Album( iAlbumIdsBeingOpened[i] )->AppendToVideoListL( + *aVideoList, *(iAlbumVideoListsBeingOpened[i]), aNewItemsStartIndex ); + } + if ( aComplete == 0 ) { iCollection.iMessageList->AddEventL( KVcxMessageMyVideosItemsAppended ); // Still fetching items - // Missing download fields filled from download manager - TRAP_IGNORE( iCollection.SyncVideoListWithDownloadsL( *(iCache.iVideoList), - EFalse /* dont send events */, aNewItemsStartIndex ); ); iCollection.CategoriesL().UpdateCategoriesL( *aVideoList, aNewItemsStartIndex ); } else { // End event arrived - iCache.iVideoListIsPartial = EFalse; + iCache.SetComplete( ETrue ); + iCache.iIsFetchingVideoList = EFalse; + // Create modify event for All category. // This will cause client to make a new OpenL() call. @@ -271,7 +349,7 @@ EVcxMyVideosVideoListOrderChanged ); // We dont send here, the send is at the end of this function. - for ( TInt i = 0; i < count; i++ ) + for ( TInt i = 0; i < categoryCount; i++ ) { // Create modify event for other than All categories. // This will cause client to make a new OpenL() call. @@ -288,14 +366,184 @@ iVideoListsBeingOpened.Reset(); iCategoryIdsBeingOpened.Reset(); - // all category, lets delete our copy and start using new one, this gives the full ownership to client + for ( TInt i = 0; i < albumCount; i++ ) + { + // Create modify event for albums. + // This will cause client to make a new OpenL() call. + // Also this causes collection framework to purge its possibly outdated + // (KVcxMessageMyVideosItemsAppended events don't update collection frameworks cache) cache. + MPX_DEBUG3("CVcxMyVideosOpenHandler:: adding modify event for album %d, extra info = %d", + iAlbumIdsBeingOpened[i], EVcxMyVideosVideoListOrderChanged ); + iCollection.iMessageList->AddEventL( + TMPXItemId( iAlbumIdsBeingOpened[i], KVcxMvcMediaTypeAlbum ), + EMPXItemModified, EVcxMyVideosVideoListOrderChanged ); + // We dont send here, the send is at the end of this function. + delete iAlbumVideoListsBeingOpened[i]; // we can delete our copy, client has its own copy + iAlbumVideoListsBeingOpened[i] = NULL; + } + iAlbumVideoListsBeingOpened.Reset(); + iAlbumIdsBeingOpened.Reset(); + + // All category, lets delete our copy and start using new one, this gives the full + // ownership of the list to client. Video objects will continue to point to the same shared data. iCache.ReCreateVideoListL(); iCollection.CategoriesL().UpdateCategoriesNewVideoNamesL(); + iCollection.AlbumsL().CalculateAttributesL(); + iCollection.iMessageList->AddEventL( KVcxMessageMyVideosListComplete ); } iCollection.iMessageList->SendL(); } +// ---------------------------------------------------------------------------- +// CVcxMyVideosOpenHandler::HandleAlbumOpenL +// Album list has been fetched already. +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosOpenHandler::HandleAlbumOpenL() + { + MPX_DEBUG1("CVcxMyVideosOpenHandler::HandleAlbumOpenL() start"); + + CVcxMyVideosAlbum* album = iCollection.AlbumsL().Album( iPendingAlbumOpenId ); + if ( album ) + { + if ( iCollection.iCache->IsComplete() ) + { + //videolist complete + CMPXMedia* videoList = album->CreateVideoListL(); + CleanupStack::PushL( videoList ); // 1-> + videoList->SetCObjectValueL( KMPXMediaGeneralContainerPath, iPath ); + videoList->SetTObjectValueL( KVcxMediaMyVideosInt32Value, + EVcxMyVideosVideoListComplete ); + iCollection.iObs->HandleOpen( videoList, KErrNone ); + CleanupStack::PopAndDestroy( videoList ); // <-1 + iCollection.iMessageList->AddEventL( KVcxMessageMyVideosListComplete ); + iCollection.iMessageList->SendL(); + } + else + { + if ( iCollection.iCache->iIsFetchingVideoList ) + { + MPX_DEBUG1("CVcxMyVideosOpenHandler:: videolist fetching already in progress -> use that to populate album"); + + // videolist incomplete and fetching already going on + TInt pos = iAlbumIdsBeingOpened.Find( iPendingAlbumOpenId ); + if ( pos == KErrNotFound ) + { + //store video list for append events + CMPXMedia* videoList = album->CreateVideoListL(); + CleanupStack::PushL( videoList ); + iAlbumVideoListsBeingOpened.AppendL( videoList ); + CleanupStack::Pop( videoList ); + iAlbumIdsBeingOpened.AppendL( iPendingAlbumOpenId ); + videoList->SetCObjectValueL( KMPXMediaGeneralContainerPath, iPath ); + iCollection.iObs->HandleOpen( videoList, KErrNone ); + } + else + { + //video list already stored + iAlbumVideoListsBeingOpened[pos]->SetCObjectValueL( KMPXMediaGeneralContainerPath, iPath ); + iCollection.iObs->HandleOpen( iAlbumVideoListsBeingOpened[pos], + KErrNone ); + } + } + else + { + MPX_DEBUG1("CVcxMyVideosOpenHandler:: videolist partial and no fetching going on -> fetch the album videos separately"); + + delete iAlbumVideoList; + iAlbumVideoList = NULL; + iAlbumVideoList = TVcxMyVideosCollectionUtil::CreateEmptyMediaListL(); + iCollection.iMyVideosMdsDb->iAlbums->GetAlbumContentVideosL( iPendingAlbumOpenId, + *iAlbumVideoList, *this ); + return; + } + } + } + else + { + MPX_DEBUG2("CVcxMyVideosOpenHandler:: album ID not valid (%d) -> calling HandleOpen with KErrNotFound", + iPendingAlbumOpenId); + iCollection.iObs->HandleOpen( static_cast(NULL), KErrNotFound ); + } + iPendingAlbumOpenId = 0; + + MPX_DEBUG1("CVcxMyVideosOpenHandler::HandleAlbumOpenL() exit"); + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosOpenHandler::HandleGetAlbumContentVideosResp +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosOpenHandler::HandleGetAlbumContentVideosResp( + TUint32 aAlbumId, CMPXMedia& aVideoList, TInt aError, + TInt aFirstNewItemIndex, TInt aNewItemCount, TBool aComplete ) + { + TRAPD( err, HandleGetAlbumContentVideosRespL( aAlbumId, aVideoList, aError, + aFirstNewItemIndex, aNewItemCount, aComplete )); + if ( err != KErrNone ) + { + MPX_DEBUG2("CVcxMyVideosOpenHandler:: HandleGetAlbumContentVideosRespL leaved: %d", err); + } + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosOpenHandler::HandleGetAlbumContentVideosRespL +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosOpenHandler::HandleGetAlbumContentVideosRespL( + TUint32 aAlbumId, CMPXMedia& /*aVideoList*/, TInt aError, + TInt /*aFirstNewItemIndex*/, TInt /*aNewItemCount*/, TBool aComplete ) + { + MPX_DEBUG1("CVcxMyVideosOpenHandler::HandleGetAlbumContentVideosRespL() start"); + + if ( aError != KErrNone ) + { + MPX_DEBUG2("CVcxMyVideosOpenHandler:: error %d occured when fetching album videos", aError ); + } + + MPX_DEBUG3("CVcxMyVideosOpenHandler:: iPendingAlbumOpenId = %d, aAlbumId = %d", iPendingAlbumOpenId, aAlbumId ); + + if ( iPendingAlbumOpenId == aAlbumId ) + { + MPX_DEBUG2("CVcxMyVideosOpenHandler:: First videos for album %d arrived, calling HandleOpen()", aAlbumId); + + iAlbumVideoList->SetCObjectValueL( KMPXMediaGeneralContainerPath, iPath ); + if ( aComplete ) + { + iAlbumVideoList->SetTObjectValueL( KVcxMediaMyVideosInt32Value, + EVcxMyVideosVideoListComplete ); + } + iCollection.iObs->HandleOpen( iAlbumVideoList, aError ); + iPendingAlbumOpenId = 0; + } + + if ( !aComplete ) + { + iCollection.iMessageList->AddEventL( KVcxMessageMyVideosItemsAppended ); + + MPX_DEBUG3("CVcxMyVideosOpenHandler:: adding modify event for album %d, extra info = %d", + aAlbumId, EVcxMyVideosVideoListOrderChanged ); + iCollection.iMessageList->AddEventL( TMPXItemId( aAlbumId, 2 ), EMPXItemModified, + EVcxMyVideosVideoListOrderChanged ); + } + else + { + //TODO: should add album id + iCollection.AlbumsL().CalculateAttributesL(); + + iCollection.iMessageList->AddEventL( KVcxMessageMyVideosListComplete ); + + + delete iAlbumVideoList; + iAlbumVideoList = NULL; + } + + iCollection.iMessageList->SendL(); + + MPX_DEBUG1("CVcxMyVideosOpenHandler::HandleGetAlbumContentVideosRespL() exit"); + } + // END OF FILE diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/src/vcxmyvideostimer.cpp --- a/videocollection/mpxmyvideoscollection/src/vcxmyvideostimer.cpp Tue May 25 12:44:54 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,100 +0,0 @@ -/* -* 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: General purpose timer* -*/ - - - - - -// INCLUDE FILES -#include "vcxmyvideostimer.h" - -// ========================= MEMBER FUNCTIONS ================================== - -// ----------------------------------------------------------------------------- -// CVcxMyVideosTimer::NewL() -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -CVcxMyVideosTimer* CVcxMyVideosTimer::NewL(const TInt aPriority, - MVcxMyVideosTimerObserver& aTimerObserver) - { - CVcxMyVideosTimer* self = CVcxMyVideosTimer::NewLC(aPriority, aTimerObserver ); - CleanupStack::Pop( self ); - return self; - } - -// ----------------------------------------------------------------------------- -// CVcxMyVideosTimer::NewLC() -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -CVcxMyVideosTimer* CVcxMyVideosTimer::NewLC(const TInt aPriority, - MVcxMyVideosTimerObserver& aTimerObserver) - { - CVcxMyVideosTimer* self = new ( ELeave ) CVcxMyVideosTimer(aPriority, aTimerObserver); - CleanupStack::PushL( self ); - self->ConstructL(); - return self; - } - -// ----------------------------------------------------------------------------- -// CVcxMyVideosTimer::CVcxMyVideosTimer() -// C++ default constructor can NOT contain any code, that might leave. -// ----------------------------------------------------------------------------- -// -CVcxMyVideosTimer::CVcxMyVideosTimer(const TInt aPriority, - MVcxMyVideosTimerObserver& aTimerObserver) -: CTimer( aPriority ), iObserver( aTimerObserver ) - { - // No implementation required - } - -// ----------------------------------------------------------------------------- -// CVcxMyVideosTimer::ConstructL() -// Symbian 2nd phase constructor can leave. -// ----------------------------------------------------------------------------- -// -void CVcxMyVideosTimer::ConstructL() - { - CTimer::ConstructL(); - CActiveScheduler::Add( this ); - } - -// ----------------------------------------------------------------------------- -// CVcxMyVideosTimer::~CVcxMyVideosTimer() -// Destructor. -// ----------------------------------------------------------------------------- -// -CVcxMyVideosTimer::~CVcxMyVideosTimer() - { - // No implementation required - } - -// ----------------------------------------------------------------------------- -// CVcxMyVideosTimer::RunL() -// Called when operation completes. -// ----------------------------------------------------------------------------- -// -void CVcxMyVideosTimer::RunL() - { - // Timer request has completed, so notify the timer's owner - if ( iStatus == KErrNone ) - { - iObserver.TimerExpired( this ); - } - } - -// End of File diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/src/vcxmyvideosvideocache.cpp --- a/videocollection/mpxmyvideoscollection/src/vcxmyvideosvideocache.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/src/vcxmyvideosvideocache.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -11,7 +11,7 @@ * * Contributors: * -* Description: Video list cache. Contains cached data from MDS.* +* Description: Video list cache. Contains cached data from MDS.* */ @@ -30,19 +30,230 @@ #include #include "vcxmyvideosvideocache.h" #include "vcxmyvideoscollectionplugin.h" -#include "vcxmyvideosdownloadutil.h" #include "vcxmyvideoscollectionutil.h" #include "vcxmyvideoscategories.h" -#include "vcxmyvideosdownloadcache.h" #include "vcxmyvideosmessagelist.h" #include "vcxmyvideosopenhandler.h" - -// If video list fetching is going on and at the same time add/delete events -// arrive from mds, what to do? +#include "vcxmyvideosalbums.h" // ============================ MEMBER FUNCTIONS ============================== // ---------------------------------------------------------------------------- +// constructor. +// ---------------------------------------------------------------------------- +// +TVcxMyVideosVideo::TVcxMyVideosVideo() +:iMdsId( 0 ), iVideo( NULL ), iPos( KErrNotFound ) + { + } + +// --------------------------------------------------------------------------- +// TVcxMyVideosVideo::operator= +// --------------------------------------------------------------------------- +// +TVcxMyVideosVideo& TVcxMyVideosVideo::operator=( const TVcxMyVideosVideo& aVideo ) + { + Set( aVideo.iMdsId, aVideo.iPos, aVideo.iVideo ); + return *this; + } + +// ---------------------------------------------------------------------------- +// TVcxMyVideosVideo::Set +// ---------------------------------------------------------------------------- +// +void TVcxMyVideosVideo::Set( TUint32 aMdsId, TInt aPos, CMPXMedia* aVideo ) + { + iMdsId = aMdsId; + iPos = aPos; + iVideo = aVideo; + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosVideoListIndex::NewL +// ---------------------------------------------------------------------------- +// +CVcxMyVideosVideoListIndex* CVcxMyVideosVideoListIndex::NewL() + { + CVcxMyVideosVideoListIndex* self = new (ELeave) CVcxMyVideosVideoListIndex(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosVideoListIndex::CVcxMyVideosVideoListIndex +// ---------------------------------------------------------------------------- +// +CVcxMyVideosVideoListIndex::CVcxMyVideosVideoListIndex() + { + + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosVideoListIndex::ConstructL +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosVideoListIndex::ConstructL () + { + iVideoArray.Reset(); + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosVideoListIndex::~CVcxMyVideosVideoListIndex +// ---------------------------------------------------------------------------- +// +CVcxMyVideosVideoListIndex::~CVcxMyVideosVideoListIndex() + { + iVideoArray.Close(); + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosVideoListIndex::~CVcxMyVideosVideoListIndex +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosVideoListIndex::SetL( const CMPXMedia& aVideoList ) + { + CMPXMediaArray* mediaArray = TVcxMyVideosCollectionUtil::MediaArrayL( aVideoList ); + TInt count = mediaArray->Count(); + iVideoArray.Reset(); + iVideoArray.ReserveL( count ); + for ( TInt i = 0; i < count; i++ ) + { + AddL( mediaArray->AtL( i ), i ); + } + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosVideoListIndex::Find +// ---------------------------------------------------------------------------- +// +TInt CVcxMyVideosVideoListIndex::Find( TUint32 aMdsId, TVcxMyVideosVideo& aVideo ) + { + const TLinearOrder KOrderByMdsId( + CVcxMyVideosVideoListIndex::CompareVideosByMdsId ); + + TInt index; + TVcxMyVideosVideo video; + video.iMdsId = aMdsId; + TInt err = iVideoArray.FindInOrder( video, index, KOrderByMdsId ); + + if ( err != KErrNone ) + { + return KErrNotFound; + } + + aVideo = iVideoArray[index]; + return KErrNone; + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosVideoListIndex::Remove +// ---------------------------------------------------------------------------- +// +TInt CVcxMyVideosVideoListIndex::Remove( TUint32 aMdsId, TBool aCompress ) + { + const TLinearOrder KOrderByMdsId( + CVcxMyVideosVideoListIndex::CompareVideosByMdsId ); + + TVcxMyVideosVideo video; + video.iMdsId = aMdsId; + TInt pos; + TInt posInVideoList; + TInt err = iVideoArray.FindInOrder( video, pos, KOrderByMdsId ); + if ( err == KErrNone ) + { + posInVideoList = iVideoArray[pos].iPos; + iVideoArray.Remove( pos ); + + // update all indexes which are bigger than posInVideoList + TInt count = iVideoArray.Count(); + for ( TInt i = 0; i < count; i++ ) + { + if ( iVideoArray[i].iPos > posInVideoList ) + { + iVideoArray[i].iPos--; + } + } + } + + if ( aCompress ) + { + iVideoArray.Compress(); + } + + return err; + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosVideoListIndex::AddL +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosVideoListIndex::AddL( CMPXMedia* aVideo, TInt aPos ) + { + TVcxMyVideosVideo video; + video.Set( TVcxMyVideosCollectionUtil::IdL( *aVideo ).iId1, aPos, aVideo ); + + const TLinearOrder KOrderByMdsId( + CVcxMyVideosVideoListIndex::CompareVideosByMdsId ); + + // update indexes + TInt count = iVideoArray.Count(); + for ( TInt i = 0; i < count; i++ ) + { + if ( iVideoArray[i].iPos >= aPos ) + { + iVideoArray[i].iPos++; + } + } + + iVideoArray.InsertInOrderAllowRepeatsL( video, KOrderByMdsId ); + + } + +#ifdef _DEBUG +// ---------------------------------------------------------------------------- +// CVcxMyVideosVideoListIndex::VideoArray +// ---------------------------------------------------------------------------- +// +const RArray& CVcxMyVideosVideoListIndex::VideoArray() + { + return iVideoArray; + } +#endif + +// ---------------------------------------------------------------------------- +// CVcxMyVideosVideoListIndex::Sort +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosVideoListIndex::Sort() + { + const TLinearOrder KOrderByMdsId( + CVcxMyVideosVideoListIndex::CompareVideosByMdsId ); + + iVideoArray.Sort( KOrderByMdsId ); + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosVideoListIndex::CompareVideosByMdsId +// ---------------------------------------------------------------------------- +// +TInt CVcxMyVideosVideoListIndex::CompareVideosByMdsId( const TVcxMyVideosVideo& aVideo1, + const TVcxMyVideosVideo& aVideo2 ) + { + if ( aVideo1.iMdsId == aVideo2.iMdsId ) + { + return 0; + } + + if ( aVideo1.iMdsId < aVideo2.iMdsId ) + { + return -1; + } + return 1; + } + +// ---------------------------------------------------------------------------- // Two-phased constructor. // ---------------------------------------------------------------------------- // @@ -67,10 +278,8 @@ MPX_FUNC("CVcxMyVideosVideoCache::~CVcxMyVideosVideoCache"); delete iVideoList; - delete iDownloadCache; - delete iCenRep; - DeletePartialList(); + delete iVideoListIndex; } // ---------------------------------------------------------------------------- @@ -93,10 +302,10 @@ MPX_FUNC("CVcxMyVideosVideoCache::ConstructL"); iVideoList = TVcxMyVideosCollectionUtil::CreateEmptyMediaListL(); - iVideoListIsPartial = ETrue; - - iDownloadCache = CVcxMyVideosDownloadCache::NewL(); + SetComplete( EFalse ); + iPartialVideoList.Reset(); + iVideoListIndex = CVcxMyVideosVideoListIndex::NewL(); } // ---------------------------------------------------------------------------------------------------------- @@ -219,7 +428,19 @@ { return NULL; } - + + if ( IsComplete() ) + { + TVcxMyVideosVideo video; + TInt pos = iVideoListIndex->Find( aMdsId, video ); + if ( pos != KErrNotFound ) + { + aPos = video.iPos; + MPX_DEBUG2("CVcxMyVideosVideoCache::FindVideoByMdsIdL found %d from index", aMdsId ); + return video.iVideo; + } + } + CMPXMediaArray* cachedVideoArray = iVideoList->Value( KMPXMediaArrayContents); @@ -260,76 +481,10 @@ } // ---------------------------------------------------------------------------- -// CVcxMyVideosVideoCache::FindVideoByDownloadIdL -// ---------------------------------------------------------------------------- -// -CMPXMedia* CVcxMyVideosVideoCache::FindVideoByDownloadIdL( TUint aDownloadId ) - { - MPX_FUNC("CVcxMyVideosVideoCache::FindVideoByDownloadIdL()"); - - MPX_DEBUG2("CVcxMyVideosVideoCache:: looking for MPX item with download ID %d from cache", aDownloadId); - - if ( aDownloadId == 0 ) - { - MPX_DEBUG1("CVcxMyVideosVideoCache:: dl id == 0 -> NOT FOUND"); - return NULL; - } - - if ( !iVideoList ) - { - MPX_DEBUG1("CVcxMyVideosVideoCache:: iVideoList is NULL -> NOT FOUND"); - return NULL; - } - - CMPXMedia* video = iDownloadCache->Get( aDownloadId ); - if ( video ) - { - MPX_DEBUG1("CVcxMyVideosVideoCache:: found from Download Cache"); - return video; - } - - MPX_DEBUG1("CVcxMyVideosVideoCache:: not found from Download Cache"); - - CMPXMediaArray* cachedVideoArray = iVideoList->Value( - KMPXMediaArrayContents); - - TUint32 downloadId; - TInt count = cachedVideoArray->Count(); - for ( TInt i = 0; i < count; i++ ) - { - downloadId = TVcxMyVideosCollectionUtil::DownloadIdL( *cachedVideoArray->AtL( i ) ); - if ( downloadId == aDownloadId ) - { - MPX_DEBUG1("CVcxMyVideosVideoCache:: found from iVideoList"); - MPX_DEBUG1("CVcxMyVideosVideoCache:: adding to iDownloadCache"); - iDownloadCache->Add( downloadId, (*cachedVideoArray)[i] ); - return (*cachedVideoArray)[i]; - } - } - - count = iPartialVideoList.Count(); - for ( TInt i = 0; i < count; i++ ) - { - downloadId = TVcxMyVideosCollectionUtil::DownloadIdL( *(iPartialVideoList[i]) ); - if ( downloadId == aDownloadId ) - { - MPX_DEBUG1("CVcxMyVideosVideoCache:: found from iPartialVideoList"); - MPX_DEBUG1("CVcxMyVideosVideoCache:: adding to iDownloadCache"); - iDownloadCache->Add( downloadId, iPartialVideoList[i] ); - return iPartialVideoList[i]; - } - } - - MPX_DEBUG1("CVcxMyVideosVideoCache:: NOT FOUND"); - return NULL; - } - - -// ---------------------------------------------------------------------------- // CVcxMyVideosVideoCache::GetVideosL // ---------------------------------------------------------------------------- // -CMPXMedia* CVcxMyVideosVideoCache::GetVideosL( RArray aMdsIds ) +CMPXMedia* CVcxMyVideosVideoCache::GetVideosL( RArray& aMdsIds ) { CMPXMessage* videoList = TVcxMyVideosCollectionUtil::CreateEmptyMediaListL(); CleanupStack::PushL( videoList ); // 1-> @@ -350,14 +505,14 @@ // CVcxMyVideosVideoCache::AddVideosFromMdsL // Called when item inserted events arrive from mds or from // KVcxCommandMyVideosGetMediasByMpxId cmd handler. -// Synchronizing with downloads is not done here, caller must take care of it. // If mpx item is already in cache, or MDS does not contain the item (or was not video item), // then it is removed from aMdsIds. Ie after this function call aMdsIds contains -// only IDs which are actually added to cache. +// only IDs which are actually added to cache. aNonVideoIds will contain IDs +// which were not video objects. // ---------------------------------------------------------------------------- // void CVcxMyVideosVideoCache::AddVideosFromMdsL( RArray& aMdsIds, - TBool& aListFetchingWasCanceled ) + TBool& aListFetchingWasCanceled, RArray* aNonVideoIds ) { MPX_FUNC("CVcxMyVideosVideoCache::AddVideosFromMdsL"); @@ -375,6 +530,8 @@ { MPX_DEBUG2("CVcxMyVideosVideoCache:: MDSID(%d) not found from cache, ok", aMdsIds[j]); + //TODO: This doesnt work with new mds cmd queue. Cancel must be done if there is _any_ async req going on. + // Maybe the fetching could be changed to asynchronous... if ( iCollection.iMyVideosMdsDb->iVideoListFetchingIsOngoing ) { // If list fetching is not canceled, CreateVideoObjectL will leave with KErrNotReady. @@ -405,13 +562,17 @@ } else { - MPX_DEBUG2("CVcxMyVideosVideoCache:: video with %d ID not found from MDS -> skipping add to cache and deleting from id array", aMdsIds[j] ); + MPX_DEBUG2("CVcxMyVideosVideoCache:: video with %d ID not found from MDS -> prob non video object, skipping add to cache", aMdsIds[j] ); + if ( aNonVideoIds ) + { + aNonVideoIds->AppendL( aMdsIds[j] ); + } aMdsIds.Remove( j ); } } else { - MPX_DEBUG2("CVcxMyVideosVideoCache:: %d was already in cache -> skipping add, and deleting from id array", aMdsIds[j]); + MPX_DEBUG2("CVcxMyVideosVideoCache:: %d was already in cache -> skipping add", aMdsIds[j]); aMdsIds.Remove( j ); } } @@ -427,7 +588,7 @@ { MPX_FUNC("CVcxMyVideosVideoCache::AddL"); - if ( iVideoListIsPartial ) + if ( !IsComplete() ) { MPX_DEBUG1("CVcxMyVideosVideoCache:: iVideoList is partial, adding to iPartialVideoList"); return AddToPartialListL( aVideo ); @@ -578,21 +739,22 @@ TVcxMyVideosSortingOrder sortingOrder = SortingOrderL(); - if ( iCollection.iMyVideosMdsDb->iVideoListFetchingIsOngoing + if ( iIsFetchingVideoList && sortingOrder == iLastSortingOrder && !aForce ) { MPX_DEBUG1("CVcxMyVideosVideoCache:: iVideoList creation is already ongoing, skipping"); return; } - if ( iVideoListIsPartial || (sortingOrder != iLastSortingOrder) || aForce ) + if ( !IsComplete() || (sortingOrder != iLastSortingOrder) || aForce ) { MPX_DEBUG1("CVcxMyVideosVideoCache:: iVideoList was partial or in wrong order or aForce was ETrue, recreating"); - if ( iCollection.iMyVideosMdsDb->iVideoListFetchingIsOngoing ) + if ( iIsFetchingVideoList ) { MPX_DEBUG1("CVcxMyVideosVideoCache:: video list fetching is ongoing, canceling it"); - iCollection.iMyVideosMdsDb->Cancel(); + iCollection.iMyVideosMdsDb->Cancel( CVcxMyVideosMdsDb::EGetVideoList ); + iIsFetchingVideoList = EFalse; } ResetVideoListL(); @@ -618,8 +780,9 @@ EFalse /* brief list */, iVideoList /* use existing */ ); + iIsFetchingVideoList = ETrue; iLastSortingOrder = sortingOrder; - iVideoListIsPartial = ETrue; + SetComplete( EFalse ); } else { @@ -648,7 +811,7 @@ TBool changed = EFalse; // 1 MPX ID cant be changed - // 2 + // 2 if ( aVideo.IsSupported( KMPXMediaGeneralTitle ) ) { if ( videoInCache->ValueText( KMPXMediaGeneralTitle ) != @@ -682,30 +845,7 @@ if ( videoInCache->ValueText( KMPXMediaGeneralUri ) != aVideo.ValueText( KMPXMediaGeneralUri ) ) - { -#if 0 // this should be in mds, or mds should keep title empty if it is not set by client - TParse parse; - HBufC* oldTitle = HBufC::NewL( videoInCache->ValueText( KMPXMediaGeneralTitle ).Length() ); - CleanupStack::PushL( oldTitle ); // 1-> - oldTitle->Des() = videoInCache->ValueText( KMPXMediaGeneralTitle ); - oldTitle->Des().LowerCase(); - - parse.Set( videoInCache->ValueText( KMPXMediaGeneralUri ), NULL, NULL ); - MPX_DEBUG2("CVcxMyVideosVideoCache:: title generated from old file name: %S", &parse.Name()); - MPX_DEBUG2("CVcxMyVideosVideoCache:: old title (lower cased): %S", oldTitle); - if ( parse.Name() == *oldTitle ) - { - // filename has been used as a title -> update title also to new filename - MPX_DEBUG1("CVcxMyVideosVideoCache:: filename has been used as a title -> changing title to new filename"); - parse.Set( aVideo.ValueText( KMPXMediaGeneralUri ), NULL, NULL ); - videoInCache->SetTextValueL( KMPXMediaGeneralTitle, parse.Name() ); - - //updates sorting order and category attributes if necessarry - HandleVideoTitleModifiedL( videoInCache ); - } - CleanupStack::PopAndDestroy( oldTitle ); // <-1 -#endif - + { videoInCache->SetTextValueL( KMPXMediaGeneralUri, aVideo.ValueText( KMPXMediaGeneralUri ) ); @@ -763,7 +903,7 @@ KMPXMediaGeneralId ).iId1, pos ); iCollection.CategoriesL().GenerateCategoryModifiedEventL( - *videoInCache, ETrue /* flush */, EVcxMyVideosVideoListOrderChanged ); + *videoInCache, EFalse /* dont flush */, EVcxMyVideosVideoListOrderChanged ); } changed = ETrue; @@ -783,7 +923,7 @@ if ( aVideo.IsSupported( KMPXMediaGeneralLastPlaybackPosition ) ) { newFlags &= ~EVcxMyVideosVideoNew; - MPX_DEBUG3("CVcxMyVideosVideoCache:: %x -> %x", oldFlags, newFlags); + MPX_DEBUG3("CVcxMyVideosVideoCache:: flags: %x -> %x", oldFlags, newFlags); } if ( oldFlags != newFlags ) @@ -804,13 +944,11 @@ oldFlags, newFlags, origin, modified ); - - if ( !(newFlags & EVcxMyVideosVideoNew) && - origin == EVcxMyVideosOriginDownloaded ) - { - MPX_DEBUG1("CVcxMyVideosVideoCache::UpdateVideoL - Count of new videos in Downloaded origin has decreased, sending mediator event to notification launcher"); - iCollection.NotifyNewVideosCountDecreasedL( *videoInCache ); - } + +#ifndef VIDEO_COLLECTION_PLUGIN_TB92 + iCollection.AlbumsL().NewVideoFlagChangedL( + TVcxMyVideosCollectionUtil::IdL( *videoInCache ).iId1 ); +#endif } changed = ETrue; } @@ -947,23 +1085,7 @@ changed = ETrue; } } - // 18 - if ( aVideo.IsSupported( KVcxMediaMyVideosDownloadId ) ) - { - TUint32 downloadIdInCache( TVcxMyVideosCollectionUtil::DownloadIdL( *videoInCache ) ); - TUint32 downloadIdInNew( TVcxMyVideosCollectionUtil::DownloadIdL( aVideo ) ); - if ( downloadIdInNew != downloadIdInCache ) - { - videoInCache->SetTObjectValueL( KVcxMediaMyVideosDownloadId, - downloadIdInNew ); - if ( downloadIdInNew == 0 ) - { - iDownloadCache->Delete( videoInCache ); - } - changed = ETrue; - } - } // 19 if ( aVideo.IsSupported( KVcxMediaMyVideosRating ) ) { @@ -1001,10 +1123,6 @@ videoInCache->SetTObjectValueL( KVcxMediaMyVideosAudioFourCc, AudioFourCcInNew ); - if ( AudioFourCcInNew == 0 ) - { - iDownloadCache->Delete( videoInCache ); - } changed = ETrue; } } @@ -1047,7 +1165,12 @@ changed = ETrue; } } - + + if ( changed ) + { + iCollection.iMessageList->SendL(); + } + return changed; } @@ -1067,6 +1190,11 @@ iCollection.CategoriesL().UpdateCategoryNewVideoNameAndDateL( *aVideoInCache, modified ); +#ifndef VIDEO_COLLECTION_PLUGIN_TB92 + iCollection.AlbumsL().VideoTitleChangedL( + TVcxMyVideosCollectionUtil::IdL( *aVideoInCache ).iId1 ); +#endif + TVcxMyVideosSortingOrder sortingOrder = SortingOrderL(); if ( sortingOrder == EVcxMyVideosSortingName ) { @@ -1354,22 +1482,28 @@ TInt pos = FindCorrectPositionL( aVideo, aSortingOrder ); - CMPXMediaArray* cachedVideoArray = NULL; - cachedVideoArray = iVideoList->Value( + CMPXMediaArray* cachedVideoArray = iVideoList->Value( KMPXMediaArrayContents ); if ( pos > (cachedVideoArray->Count() -1) ) { - cachedVideoArray->AppendL( aVideo ); + cachedVideoArray->AppendL( aVideo ); } else { cachedVideoArray->InsertL( aVideo, pos ); } - + iVideoListIndex->AddL( cachedVideoArray->AtL( pos ), pos ); +#ifdef _DEBUG + CheckVideoListIndexL(); +#endif + if ( aUpdateCategories ) { iCollection.CategoriesL().VideoAddedL( aVideo ); +#ifndef VIDEO_COLLECTION_PLUGIN_TB92 + iCollection.AlbumsL().VideoAddedOrRemovedFromCacheL( aVideo ); +#endif } return KErrNone; @@ -1407,6 +1541,7 @@ // ---------------------------------------------------------------------------- // CVcxMyVideosVideoCache::RemoveL +// All removes end up here (except ResetVideoListL). // ---------------------------------------------------------------------------- // TInt CVcxMyVideosVideoCache::RemoveL( TUint32 aMdsId, TBool aUpdateCategories ) @@ -1421,26 +1556,14 @@ MPX_DEBUG1("CVcxMyVideosVideoCache:: RemoveL failed since the item wasn't on cache"); return KErrNotFound; } - - iDownloadCache->Delete( video ); - - TUint32 flags( 0 ); - if ( video->IsSupported( KMPXMediaGeneralFlags ) ) - { - flags = video->ValueTObjectL( KMPXMediaGeneralFlags ); - } - - if ( ( flags & EVcxMyVideosVideoNew ) && - TVcxMyVideosCollectionUtil::OriginL( *video ) == EVcxMyVideosOriginDownloaded ) - { - MPX_DEBUG1("CVcxMyVideosVideoCache::RemoveL - New video has been removed from Downloaded origin -> sending mediator event to notification launcher"); - iCollection.NotifyNewVideosCountDecreasedL( *video ); - } if ( aUpdateCategories && pos != KErrNotFound /* no need to update if item is on iPartialVideoList*/ ) { iCollection.CategoriesL().VideoRemovedL( *video ); +#ifndef VIDEO_COLLECTION_PLUGIN_TB92 + iCollection.AlbumsL().VideoAddedOrRemovedFromCacheL( *video ); +#endif } if ( pos != KErrNotFound ) @@ -1450,6 +1573,10 @@ MPX_DEBUG2("CVcxMyVideosVideoCache:: %d removed from iVideoList", aMdsId); cachedVideoArray->Remove( pos ); + iVideoListIndex->Remove( aMdsId, ETrue /* compress */); +#ifdef _DEBUG + CheckVideoListIndexL(); +#endif } else { @@ -1483,7 +1610,7 @@ { MPX_FUNC("CVcxMyVideosVideoCache::ResetVideoListL"); - iCollection.iMyVideosMdsDb->Cancel(); + iCollection.iMyVideosMdsDb->Cancel( CVcxMyVideosMdsDb::EGetVideoList ); CMPXMediaArray* mediaArray = iVideoList->ValueCObjectL( KMPXMediaArrayContents ); @@ -1521,11 +1648,7 @@ } } - iVideoListIsPartial = ETrue; - - delete iDownloadCache; - iDownloadCache = NULL; - iDownloadCache = CVcxMyVideosDownloadCache::NewL(); + SetComplete( EFalse ); iCollection.CategoriesL().ResetVideoCountersL(); //this does not send events } @@ -1563,11 +1686,92 @@ delete iVideoList; iVideoList = NULL; iVideoList = newList; + + iVideoListIndex->SetL( *iVideoList ); +#ifdef _DEBUG + CheckVideoListIndexL(); +#endif + CleanupStack::Pop( newList ); // <-1 + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosVideoCache::IsComplete +// ---------------------------------------------------------------------------- +// +TBool CVcxMyVideosVideoCache::IsComplete() + { + return iVideoListIsComplete; + } + +// ---------------------------------------------------------------------------- +// CVcxMyVideosVideoCache::SetComplete +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosVideoCache::SetComplete( TBool aComplete ) + { + if ( !iVideoListIsComplete && aComplete ) + { + MPX_DEBUG1("CVcxMyVideosVideoCache:: iVideoList turned to complete, setting up iVideoListIndex"); + iVideoListIndex->SetL( *iVideoList ); +#ifdef _DEBUG + CheckVideoListIndexL(); +#endif + } + iVideoListIsComplete = aComplete; + } - delete iDownloadCache; - iDownloadCache = NULL; - iDownloadCache = CVcxMyVideosDownloadCache::NewL(); +#ifdef _DEBUG +// ---------------------------------------------------------------------------- +// CVcxMyVideosVideoCache::SetComplete +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosVideoCache::CheckVideoListIndexL() + { + if ( !IsComplete() ) + { + return; + } + + TInt pos; + TInt mdsId; + CMPXMedia* video; + CMPXMediaArray* mediaArray = TVcxMyVideosCollectionUtil::MediaArrayL( *iVideoList ); + TInt count = iVideoListIndex->VideoArray().Count(); + for ( TInt i = 0; i < count; i++ ) + { + pos = iVideoListIndex->VideoArray()[i].iPos; + mdsId = iVideoListIndex->VideoArray()[i].iMdsId; + video = iVideoListIndex->VideoArray()[i].iVideo; + + if ( pos < 0 || pos > mediaArray->Count() -1 ) + { + MPX_DEBUG3( "CVcxMyVideosVideoCache:: iVideoListIndex->iVideoArray[%d].iPos out of range -> Panic", + i, pos ); + _LIT( KVideoListIndexPosCorrupted, "iVideoListIndex pos"); + User::Panic( KVideoListIndexPosCorrupted, KErrCorrupt ); + } + + if ( mediaArray->AtL( pos ) != video ) + { + MPX_DEBUG3( "CVcxMyVideosVideoCache:: iVideoListIndex->iVideoArray[%d].iVideo != mediaArray->AtL( %d ) -> Panic", + i, pos ); + _LIT( KVideoListIndexVideoCorrupted, "iVideoListIndex video pointer"); + User::Panic( KVideoListIndexVideoCorrupted, KErrCorrupt ); + } + + if ( TVcxMyVideosCollectionUtil::IdL( *mediaArray->AtL( pos ) ).iId1 != + mdsId ) + { + MPX_DEBUG3( "CVcxMyVideosVideoCache:: iVideoListIndex->iVideoArray[%d].iMdsId != MDSID in mediaArray->AtL( %d ) -> Panic", + i, pos ); + _LIT( KVideoListIndexMdsIdCorrupted, "iVideoListIndex MDS ID"); + User::Panic( KVideoListIndexMdsIdCorrupted, KErrCorrupt ); + } + } + MPX_DEBUG1("CVcxMyVideosVideoCache:: iVideoListIndex check OK"); } +#endif + // End of file diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideoscollectionutiltest/conf/VcxMyVideosCollectionUtilTest.cfg --- a/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideoscollectionutiltest/conf/VcxMyVideosCollectionUtilTest.cfg Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideoscollectionutiltest/conf/VcxMyVideosCollectionUtilTest.cfg Wed Jun 09 09:44:23 2010 +0300 @@ -1,3 +1,8 @@ + +[Define] +EErrArgument -6 +[Enddefine] + [Test] title CreateEmptyMediaList create VcxMyVideosCollectionUtilTest foobar @@ -20,9 +25,26 @@ [Endtest] [Test] +title CopyFromListToList2 +create VcxMyVideosCollectionUtilTest foobar +foobar CopyFromListToList2 5 3 +delete foobar +[Endtest] + +[Test] title DriveLetter2DriveNumber create VcxMyVideosCollectionUtilTest foobar -foobar DriveLetter2DriveNumber +foobar DriveLetter2DriveNumber a: 0 +foobar DriveLetter2DriveNumber c 2 +foobar DriveLetter2DriveNumber E: 4 +foobar DriveLetter2DriveNumber Z 25 +foobar DriveLetter2DriveNumber z0rRo 25 +foobar DriveLetter2DriveNumber @ EErrArgument +foobar DriveLetter2DriveNumber [ EErrArgument +foobar DriveLetter2DriveNumber ?: EErrArgument +foobar DriveLetter2DriveNumber ä EErrArgument +foobar DriveLetter2DriveNumber " " EErrArgument +foobar DriveLetter2DriveNumber KNullDesC EErrArgument delete foobar [Endtest] diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideoscollectionutiltest/group/bld.inf --- a/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideoscollectionutiltest/group/bld.inf Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideoscollectionutiltest/group/bld.inf Wed Jun 09 09:44:23 2010 +0300 @@ -24,33 +24,18 @@ PRJ_TESTEXPORTS // NOTE: If using ARS requirements all export operations should be done under this. // 'abld test export' - -PRJ_EXPORTS ../conf/vcxmyvideoscollectionutiltest.cfg /epoc32/winscw/c/testframework/vcxmyvideoscollectionutiltest.cfg ../init/testframework.ini /epoc32/winscw/c/testframework/testframework.ini ../data/mmc/file.txt /epoc32/winscw/c/data/vcxmyvideoscollectionutiltest_file.txt +../data/mmc/file.txt /epoc32/winscw/c/data/vcxmyvideoscollectionutiltest_file2 + +PRJ_EXPORTS PRJ_TESTMMPFILES - - +VcxMyVideosCollectionUtilTest.mmp PRJ_MMPFILES - - VcxMyVideosCollectionUtilTest.mmp -// Specify the .mmp files required for building the important component -// releasables. -// -// Specify "tidy" if the component you need to build doesn't need to be -// released. Specify "ignore" if the MMP file exists but should be -// ignored. -// Example: -/* -\agnmodel\group\agnmodel.mmp -#if defined(MARM) -\agnmodel\group\agsvexe.mmp -#endif -*/ // End of File diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideoscollectionutiltest/inc/VcxMyVideosCollectionUtilTest.h --- a/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideoscollectionutiltest/inc/VcxMyVideosCollectionUtilTest.h Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideoscollectionutiltest/inc/VcxMyVideosCollectionUtilTest.h Wed Jun 09 09:44:23 2010 +0300 @@ -142,6 +142,8 @@ virtual TInt CreateEmptyMessageListL( CStifItemParser& aItem ); virtual TInt CopyFromListToListL( CStifItemParser& aItem ); + + virtual TInt CopyFromListToListL2( CStifItemParser& aItem ); virtual TInt DriveLetter2DriveNumberL( CStifItemParser& aItem ); diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideoscollectionutiltest/src/VcxMyVideosCollectionUtilTestBlocks.cpp --- a/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideoscollectionutiltest/src/VcxMyVideosCollectionUtilTestBlocks.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideoscollectionutiltest/src/VcxMyVideosCollectionUtilTestBlocks.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -22,6 +22,8 @@ #include #include #include +#include +#include #include #include #include "VcxMyVideosCollectionUtilTest.h" @@ -53,28 +55,7 @@ // FORWARD DECLARATIONS //class ?FORWARD_CLASSNAME; -// ============================= LOCAL FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// ?function_name ?description. -// ?description -// Returns: ?value_1: ?description -// ?value_n: ?description_line1 -// ?description_line2 -// ----------------------------------------------------------------------------- -// -/* -?type ?function_name( - ?arg_type arg, // ?description - ?arg_type arg) // ?description - { - - ?code // ?comment - - // ?comment - ?code - } -*/ +const TMPXAttributeData KMPXMediaFail={0xC0FFEE,0xBADBEEF}; // ============================ MEMBER FUNCTIONS =============================== @@ -106,6 +87,7 @@ ENTRY( "CreateEmptyMediaList", CVcxMyVideosCollectionUtilTest::CreateEmptyMediaListL ), ENTRY( "CreateEmptyMessageList", CVcxMyVideosCollectionUtilTest::CreateEmptyMessageListL ), ENTRY( "CopyFromListToList", CVcxMyVideosCollectionUtilTest::CopyFromListToListL ), + ENTRY( "CopyFromListToList2", CVcxMyVideosCollectionUtilTest::CopyFromListToListL2 ), ENTRY( "DriveLetter2DriveNumber", CVcxMyVideosCollectionUtilTest::DriveLetter2DriveNumberL ), ENTRY( "MakeUniqueFileName", CVcxMyVideosCollectionUtilTest::MakeUniqueFileNameL ), ENTRY( "Origin", CVcxMyVideosCollectionUtilTest::OriginL ), @@ -142,6 +124,9 @@ { CMPXMedia* media = TVcxMyVideosCollectionUtil::CreateEmptyMediaListL(); delete media; + + // Only thing that can fail here is method call leaves. If we reach the end + // everyting has worked fine and we can return ok. return KErrNone; } @@ -153,6 +138,9 @@ { CMPXMedia* media = TVcxMyVideosCollectionUtil::CreateEmptyMessageListL(); delete media; + + // Only thing that can fail here is method call leaves. If we reach the end + // everyting has worked fine and we can return ok. return KErrNone; } @@ -164,7 +152,13 @@ { CMPXMedia* from = TVcxMyVideosCollectionUtil::CreateEmptyMediaListL(); CMPXMedia* to = TVcxMyVideosCollectionUtil::CreateEmptyMediaListL(); + CMPXMedia* failList = CMPXMedia::NewL(); + CMPXMedia* media( NULL ); + TInt itemsToCopy( 0 ); + TInt itemsCopied( 0 ); RArray ids; + TMPXItemId idGet; + TInt retVal( KErrGeneral ); TInt numberOfMedia; TInt wantedId; @@ -175,26 +169,198 @@ ids.Append( wantedId ); // add stuff to be copied to "from" -list + CleanupStack::PushL( from ); + CleanupStack::PushL( to ); + CMPXMediaArray* fromMessageArray = from->Value( + KMPXMediaArrayContents ); + CleanupStack::PushL( fromMessageArray ); + TVcxMyVideosCollectionUtil::CopyFromListToListL( *from, *to, ids ); + + for(TInt i = 0; i < numberOfMedia; i++ ) + { + media = CMPXMedia::NewL(); + CleanupStack::PushL( media ); + media->SetTObjectValueL( KMPXMediaGeneralId, + TMPXItemId( i, i) ); + media->SetTObjectValueL( KVcxMediaMyVideosInt32Value, + 42 ); + fromMessageArray->AppendL( media ); + if( i == wantedId ) + { + itemsToCopy++; + } + CleanupStack::Pop( media ); + } + + TRAPD( err, TVcxMyVideosCollectionUtil::CopyFromListToListL( *from, *failList, ids ) ); + if( err != KErrArgument ) + { + CleanupStack::Pop( fromMessageArray ); + CleanupStack::Pop( to ); + CleanupStack::Pop( from ); + fromMessageArray->Reset(); + delete failList; + delete from; + delete to; + return retVal; + } TVcxMyVideosCollectionUtil::CopyFromListToListL( *from, *to, ids ); // check that the "to" -list have the items it should have + CMPXMediaArray* toMessageArray = to->Value( + KMPXMediaArrayContents ); + CleanupStack::PushL( toMessageArray ); + for( TInt i = 0; i < toMessageArray->Count(); i++ ) + { + idGet = TVcxMyVideosCollectionUtil::IdL( *(toMessageArray->operator[](i)) ); + if( idGet.iId1 == wantedId ) + { + itemsCopied++; + } + } + + if( itemsCopied == itemsToCopy ) + { + retVal = KErrNone; + } + + CleanupStack::Pop( toMessageArray ); + CleanupStack::Pop( fromMessageArray ); + CleanupStack::Pop( to ); + CleanupStack::Pop( from ); + + toMessageArray->Reset(); + fromMessageArray->Reset(); + + delete failList; delete from; - delete to; + delete to; + return retVal; + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosCollectionUtilTest::CopyFromListToListL2 +// --------------------------------------------------------------------------- +// +TInt CVcxMyVideosCollectionUtilTest::CopyFromListToListL2( CStifItemParser& aItem ) + { + RArray fromArray; + CMPXMedia* to = TVcxMyVideosCollectionUtil::CreateEmptyMediaListL(); + CMPXMedia* failList = CMPXMedia::NewL(); + CMPXMedia* media( NULL ); + TInt itemsToCopy( 0 ); + TInt itemsCopied( 0 ); + RArray ids; + TMPXItemId idGet; + TInt retVal( KErrGeneral ); + + TInt numberOfMedia; + TInt wantedId; + + aItem.GetNextInt( numberOfMedia ); + aItem.GetNextInt( wantedId ); + + ids.Append( wantedId ); + + // add stuff to be copied to "from" -list + CleanupStack::PushL( to ); + + TVcxMyVideosCollectionUtil::CopyFromListToListL( fromArray, *to, ids ); - return KErrNone; + for(TInt i = 0; i < numberOfMedia; i++ ) + { + media = CMPXMedia::NewL(); + CleanupStack::PushL( media ); + media->SetTObjectValueL( KMPXMediaGeneralId, + TMPXItemId( i, i) ); + media->SetTObjectValueL( KVcxMediaMyVideosInt32Value, + 42 ); + fromArray.AppendL( media ); + if( i == wantedId ) + { + itemsToCopy++; + } + CleanupStack::Pop( media ); + } + + TRAPD(err, TVcxMyVideosCollectionUtil::CopyFromListToListL( fromArray, *failList, ids )); + if( err != KErrArgument ) + { + CleanupStack::Pop( to ); + fromArray.Reset(); + delete failList; + delete to; + return retVal; + } + + TVcxMyVideosCollectionUtil::CopyFromListToListL( fromArray, *to, ids ); + + // check that the "to" -list have the items it should have + CMPXMediaArray* toMessageArray = to->Value( + KMPXMediaArrayContents ); + CleanupStack::PushL( toMessageArray ); + + for( TInt i = 0; i < toMessageArray->Count(); i++ ) + { + idGet = TVcxMyVideosCollectionUtil::IdL( *(toMessageArray->operator[](i)) ); + if( idGet.iId1 == wantedId ) + { + itemsCopied++; + } + } + + if( itemsCopied == itemsToCopy ) + { + retVal = KErrNone; + } + + CleanupStack::Pop( toMessageArray ); + CleanupStack::Pop( to ); + + toMessageArray->Reset(); + + for( TInt i = 0; i < fromArray.Count(); i++ ) + { + CMPXMedia* arrayMedia = fromArray[i]; + delete arrayMedia; + } + fromArray.Reset(); + delete failList; + delete to; + return retVal; } // --------------------------------------------------------------------------- // This helper function converts drive letter to drive number // --------------------------------------------------------------------------- // -TInt CVcxMyVideosCollectionUtilTest::DriveLetter2DriveNumberL( CStifItemParser& /*aItem*/ ) +TInt CVcxMyVideosCollectionUtilTest::DriveLetter2DriveNumberL( CStifItemParser& aItem ) { - TVcxMyVideosCollectionUtil::DriveLetter2DriveNumber( _L("E:") ); - return KErrNone; + TInt retVal( KErrNone ); + TPtrC string; + TInt expectedValue( -1 ); + + aItem.SetParsingType( CStifItemParser::EQuoteStyleParsing ); + + User::LeaveIfError( aItem.GetNextString( string ) ); + User::LeaveIfError( aItem.GetNextInt( expectedValue ) ); + + _LIT( KNullDescString, "KNullDesC" ); + if ( string.Compare( KNullDescString ) == 0 ) + { + string.Set( KNullDesC ); + } + + TInt driveNumber = TVcxMyVideosCollectionUtil::DriveLetter2DriveNumber( string ); + if ( driveNumber != expectedValue ) + { + retVal = KErrGeneral; + } + + return retVal; } // --------------------------------------------------------------------------- @@ -203,12 +369,41 @@ // TInt CVcxMyVideosCollectionUtilTest::MakeUniqueFileNameL( CStifItemParser& /*aItem*/ ) { + TInt retVal( KErrNone ); RFs fs; fs.Connect(); TBuf path; - TVcxMyVideosCollectionUtil::MakeUniqueFileNameL( fs, _L("c://testframework//testframework.ini"), path ); + _LIT( KFileName1, "c:\\data\\vcxmyvideoscollectionutiltest_file.txt" ); + _LIT( KFileName2, "c:\\data\\vcxmyvideoscollectionutiltest_file2" ); + _LIT( KInvalidFile, "c:\\data\\vcxmyvideoscollectionutiltest_DoesNotExist" ); + + // File with filename extension + TVcxMyVideosCollectionUtil::MakeUniqueFileNameL( fs, KFileName1, path ); + if ( path.Length() <= KFileName1().Length() ) + { + retVal = KErrGeneral; + } + + // File without filename extension + TVcxMyVideosCollectionUtil::MakeUniqueFileNameL( fs, KFileName2, path ); + if ( ( path.Find( KFileName2 ) == KErrNotFound ) || + ( path.Length() <= KFileName2().Length() ) ) + { + retVal = KErrGeneral; + } + + // Non-existent file + TVcxMyVideosCollectionUtil::MakeUniqueFileNameL( fs, KInvalidFile, path ); + if ( path.Compare( KInvalidFile ) != 0 ) + { + retVal = KErrGeneral; + } + + // Null descriptor + TVcxMyVideosCollectionUtil::MakeUniqueFileNameL( fs, KNullDesC, path ); + fs.Close(); - return KErrNone; + return retVal; } // ---------------------------------------------------------------------------- @@ -219,9 +414,17 @@ { CMPXMedia* media = CMPXMedia::NewL(); TInt retVal( KErrNone ); + TUint8 valueGet = TVcxMyVideosCollectionUtil::OriginL( *media ); + valueGet = TVcxMyVideosCollectionUtil::OriginL( *media ); + if( EVcxMyVideosOriginOther != valueGet ) + { + retVal = KErrGeneral; + delete media; + return retVal; + } TUint8 valueSet = EVcxMyVideosOriginCapturedWithCamera; media->SetTObjectValueL( KVcxMediaMyVideosOrigin, valueSet ); - TUint8 valueGet = TVcxMyVideosCollectionUtil::OriginL( *media ); + valueGet = TVcxMyVideosCollectionUtil::OriginL( *media ); if( valueSet != valueGet ) { retVal = KErrGeneral; @@ -246,10 +449,17 @@ TInt CVcxMyVideosCollectionUtilTest::FlagsL( CStifItemParser& /*aItem*/ ) { CMPXMedia* media = CMPXMedia::NewL(); - TInt retVal( KErrNone ); + TInt retVal( KErrNone ); TUint32 flagsSet( 0xBEEF ); + TUint32 flagsGet( TVcxMyVideosCollectionUtil::FlagsL( *media ) ); + if( flagsGet != 0 ) + { + delete media; + retVal = KErrGeneral; + return retVal; + } media->SetTObjectValueL( KMPXMediaGeneralFlags, flagsSet ); - TUint32 flagsGet( TVcxMyVideosCollectionUtil::FlagsL( *media ) ); + flagsGet= TVcxMyVideosCollectionUtil::FlagsL( *media ); if( flagsSet != flagsGet ) { retVal = KErrGeneral; @@ -267,8 +477,15 @@ CMPXMedia* media = CMPXMedia::NewL(); TInt retVal( KErrNone ); TUint32 idSet( 0xBEEF ); + TUint32 idGet( TVcxMyVideosCollectionUtil::DownloadIdL( *media ) ); + if( 0 != idGet ) + { + delete media; + retVal = KErrGeneral; + return retVal; + } media->SetTObjectValueL( KVcxMediaMyVideosDownloadId, idSet ); - TUint32 idGet( TVcxMyVideosCollectionUtil::DownloadIdL( *media ) ); + idGet = TVcxMyVideosCollectionUtil::DownloadIdL( *media ); if( idSet != idGet ) { retVal = KErrGeneral; @@ -286,8 +503,15 @@ CMPXMedia* media = CMPXMedia::NewL(); TInt retVal( KErrNone ); TVcxMyVideosDownloadState stateSet = EVcxMyVideosDlStateFailed; + TVcxMyVideosDownloadState stateGet = TVcxMyVideosCollectionUtil::DownloadStateL( *media ); + if( EVcxMyVideosDlStateNone != stateGet ) + { + delete media; + retVal = KErrGeneral; + return retVal; + } media->SetTObjectValueL( KVcxMediaMyVideosDownloadState, stateSet ); - TVcxMyVideosDownloadState stateGet = TVcxMyVideosCollectionUtil::DownloadStateL( *media ); + stateGet = TVcxMyVideosCollectionUtil::DownloadStateL( *media ); if( stateSet != stateGet ) { retVal = KErrGeneral; @@ -305,8 +529,15 @@ CMPXMedia* media = CMPXMedia::NewL(); TInt retVal( KErrNone ); TMPXItemId idSet( 2, 7 ); + TMPXItemId idGet = TVcxMyVideosCollectionUtil::IdL( *media ); + if( (idGet.iId1 != 0) || (idGet.iId2 != 0) ) + { + delete media; + retVal = KErrGeneral; + return retVal; + } media->SetTObjectValueL( KMPXMediaGeneralId, idSet ); - TMPXItemId idGet = TVcxMyVideosCollectionUtil::IdL( *media );; + idGet = TVcxMyVideosCollectionUtil::IdL( *media ); if( idSet != idGet ) { retVal = KErrGeneral; @@ -324,8 +555,15 @@ CMPXMedia* media = CMPXMedia::NewL(); TInt retVal( KErrNone ); TReal32 durationSet( 150 ); + TReal32 durationGet = TVcxMyVideosCollectionUtil::DurationL( *media ); + if( -1 != durationGet ) + { + delete media; + retVal = KErrGeneral; + return retVal; + } media->SetTObjectValueL( KVcxMediaMyVideosDuration, durationSet ); - TReal32 durationGet = TVcxMyVideosCollectionUtil::DurationL( *media );; + durationGet = TVcxMyVideosCollectionUtil::DurationL( *media ); if( durationSet != durationGet ) { retVal = KErrGeneral; @@ -343,8 +581,17 @@ CMPXMedia* media = CMPXMedia::NewL(); TInt retVal( KErrNone ); _LIT( valueSet, "TeamNinja" ); + HBufC* valueGet = TVcxMyVideosCollectionUtil::Title( *media ).AllocL(); + if( valueGet->Size() != 0 ) + { + delete media; + delete valueGet; + retVal = KErrGeneral; + return retVal; + } + delete valueGet; media->SetTextValueL( KMPXMediaGeneralTitle, valueSet ); - HBufC* valueGet = TVcxMyVideosCollectionUtil::Title( *media ).AllocL(); + valueGet = TVcxMyVideosCollectionUtil::Title( *media ).AllocL(); if( valueGet->CompareF( valueSet ) ) { retVal = KErrGeneral; @@ -363,8 +610,15 @@ CMPXMedia* media = CMPXMedia::NewL(); TInt retVal( KErrNone ); TUint8 valueSet( 21 ); + TUint8 valueGet = TVcxMyVideosCollectionUtil::RatingL( *media );; + if( 0 != valueGet ) + { + delete media; + retVal = KErrGeneral; + return retVal; + } media->SetTObjectValueL( KVcxMediaMyVideosRating, valueSet ); - TUint8 valueGet = TVcxMyVideosCollectionUtil::RatingL( *media );; + valueGet = TVcxMyVideosCollectionUtil::RatingL( *media );; if( valueSet != valueGet ) { retVal = KErrGeneral; @@ -382,8 +636,15 @@ CMPXMedia* media = CMPXMedia::NewL(); TInt retVal( KErrNone ); TUint32 valueSet( 21 ); + TUint32 valueGet = TVcxMyVideosCollectionUtil::AudioFourCcL( *media );; + if( 0 != valueGet ) + { + delete media; + retVal = KErrGeneral; + return retVal; + } media->SetTObjectValueL( KVcxMediaMyVideosAudioFourCc, valueSet ); - TUint32 valueGet = TVcxMyVideosCollectionUtil::AudioFourCcL( *media );; + valueGet = TVcxMyVideosCollectionUtil::AudioFourCcL( *media );; if( valueSet != valueGet ) { retVal = KErrGeneral; @@ -401,8 +662,14 @@ TInt retVal( KErrNone ); CMPXMedia* media = CMPXMedia::NewL(); RArray attrs; - attrs.Append( KMPXMediaGeneralMimeType ); TBool inMds( EFalse ); + TVcxMyVideosCollectionUtil::AreSupported( *media, attrs.Array(), inMds ); + attrs.Append( KMPXMediaFail ); + TVcxMyVideosCollectionUtil::AreSupported( *media, attrs.Array(), inMds ); + attrs.Append( KMPXMediaVideoBitRate ); + inMds = ETrue; + TVcxMyVideosCollectionUtil::AreSupported( *media, attrs.Array(), inMds ); + media->SetTObjectValueL( KMPXMediaVideoBitRate, 47 ); TVcxMyVideosCollectionUtil::AreSupported( *media, attrs.Array(), inMds ); delete media; return retVal; @@ -415,8 +682,7 @@ TInt CVcxMyVideosCollectionUtilTest::AttrBelongsToFullSetL( CStifItemParser& /*aItem*/ ) { TInt retVal( KErrNone ); - // TMPXAttribute attr; - // attr = KMPXMediaGeneralMimeType; + if ( !( TVcxMyVideosCollectionUtil::AttrBelongsToFullSet( KMPXMediaGeneralComment ) && TVcxMyVideosCollectionUtil::AttrBelongsToFullSet( KMPXMediaGeneralCopyright ) && TVcxMyVideosCollectionUtil::AttrBelongsToFullSet( KMPXMediaGeneralMimeType ) && @@ -430,6 +696,12 @@ TVcxMyVideosCollectionUtil::AttrBelongsToFullSet( KMPXMediaVideoArtist ) ) ) { retVal = KErrGeneral; + return retVal; + } + + if( TVcxMyVideosCollectionUtil::AttrBelongsToFullSet( KMPXMediaFail ) ) + { + retVal = KErrGeneral; } return retVal; @@ -455,6 +727,12 @@ != KErrNotFound ) ) { retVal = KErrGeneral; + return retVal; + } + + if( TVcxMyVideosCollectionUtil::Origin( KCategoryIdExtraItem3 ) != KErrNotFound ) + { + retVal = KErrGeneral; } return retVal; @@ -513,22 +791,6 @@ return retVal; } -// ----------------------------------------------------------------------------- -// CVcxMyVideosCollectionUtilTest::?member_function -// ?implementation_description -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -/* -TInt CVcxMyVideosCollectionUtilTest::?member_function( - CItemParser& aItem ) - { - - ?code - - } -*/ - // ========================== OTHER EXPORTED FUNCTIONS ========================= // None diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/conf/VcxMyVideosMdsDbTest.cfg --- a/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/conf/VcxMyVideosMdsDbTest.cfg Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/conf/VcxMyVideosMdsDbTest.cfg Wed Jun 09 09:44:23 2010 +0300 @@ -6,9 +6,15 @@ RemoveVideoL UpdateVideoL CreateVideoListL +DoCreateVideoListL CreateVideoL - - +HandleQueryNewResultsL +HandleQueryCompletedL +AsyncHandleQueryCompletedL +HandleSessionErrorL +HandleObjectNotificationL +HandleObjectPresentNotificationL +ShutdownNotificationL [Test] title Create & delete @@ -41,7 +47,11 @@ title Cancel create VcxMyVideosMdsDbTest test test CreateL -test CancelL +loop 10 +test CancelL LOOP_COUNTER +test DoCreateVideoListL 4 +test CancelL LOOP_COUNTER +endloop test DeleteL delete test [Endtest] @@ -50,11 +60,26 @@ title AddVideoL create VcxMyVideosMdsDbTest test test CreateL -test AddVideoL 0 0 +test AddVideoL 0 0 0 0 0 +allownextresult -2 +test AddVideoL 0 -2 0 0 allownextresult -2 -test AddVideoL 0 -2 -allownextresult -2 -test AddVideoL 1 0 +test AddVideoL 1 0 0 0 0 + +test AddVideoL 0 0 0 0 0 1 +test AddVideoL 0 0 0 0 1 0 +test AddVideoL 0 0 0 0 1 1 +test AddVideoL 0 0 0 1 0 0 +test AddVideoL 0 0 0 1 0 1 +test AddVideoL 0 0 0 1 1 0 +test AddVideoL 0 0 0 1 1 1 +test AddVideoL 0 0 1 0 0 1 +test AddVideoL 0 0 1 0 1 0 +test AddVideoL 0 0 1 0 1 1 +test AddVideoL 0 0 1 1 0 0 +test AddVideoL 0 0 1 1 0 1 +test AddVideoL 0 0 1 1 1 0 +test AddVideoL 0 0 1 1 1 1 test DeleteL delete test [Endtest] @@ -81,6 +106,8 @@ test UpdateVideoL 1 0 allownextresult -2 test UpdateVideoL 0 -2 +allownextresult -14 +test UpdateVideoL 0 0 1 test DeleteL delete test [Endtest] @@ -89,11 +116,12 @@ title CreateVideoL create VcxMyVideosMdsDbTest test test CreateL -test CreateVideoL 0 0 -allownextresult -1 -test CreateVideoL 1 0 +test CreateVideoL 0 0 1 2 +test CreateVideoL 1 0 1 3 allownextresult -2 -test CreateVideoL 0 -2 +test CreateVideoL 0 -2 1 4 +test CreateVideoL 0 0 0 5 +test CreateVideoL 0 0 0 0 test DeleteL delete test [Endtest] @@ -102,23 +130,127 @@ title CreateVideoListL create VcxMyVideosMdsDbTest test test CreateL -test CreateVideoListL 0 0 0 0 -test CreateVideoListL 0 0 0 1 -test CreateVideoListL 0 0 1 0 -test CreateVideoListL 0 0 1 0 -test CreateVideoListL 0 1 0 0 -test CreateVideoListL 0 1 0 1 -test CreateVideoListL 0 1 1 0 -test CreateVideoListL 0 1 1 1 -test CreateVideoListL 1 0 0 0 -test CreateVideoListL 1 0 0 1 -test CreateVideoListL 1 0 1 0 -test CreateVideoListL 1 0 1 1 -test CreateVideoListL 1 1 0 0 -test CreateVideoListL 1 1 0 1 -test CreateVideoListL 1 1 1 0 -test CreateVideoListL 1 1 1 1 +test CreateVideoListL +test DeleteL +delete test +[Endtest] + +[Test] +title DoCreateVideoListL +create VcxMyVideosMdsDbTest test +test CreateL +loop 128 +test DoCreateVideoListL LOOP_COUNTER +test CancelL +endloop +test DeleteL +delete test +[Endtest] + +[Test] +title HandleQueryNewResultsL +create VcxMyVideosMdsDbTest test +test CreateL +test HandleQueryNewResultsL 0 0 0 +test DoCreateVideoListL 0 1 +test HandleQueryNewResultsL 0 0 0 +test HandleQueryNewResultsL 0 0 1 +test HandleQueryNewResultsL 0 1 0 +test HandleQueryNewResultsL 0 1 1 +test HandleQueryNewResultsL 1 0 0 +test HandleQueryNewResultsL 1 0 1 +test HandleQueryNewResultsL 1 1 0 +test HandleQueryNewResultsL 1 1 1 +test HandleQueryNewResultsL 0 0 0 1 +test DeleteL +delete test +[Endtest] + +[Test] +title HandleQueryCompletedL +create VcxMyVideosMdsDbTest test +test CreateL +test HandleQueryCompletedL 0 0 +test HandleQueryCompletedL 0 1 +test HandleQueryCompletedL 1 0 +test HandleQueryCompletedL 1 1 +test DoCreateVideoListL 0 1 +test HandleQueryCompletedL 0 0 +test HandleQueryCompletedL 0 1 +test HandleQueryCompletedL 1 0 +test HandleQueryCompletedL 1 1 test DeleteL delete test [Endtest] +[Test] +title AsyncHandleQueryCompletedL +create VcxMyVideosMdsDbTest test +test CreateL +test AsyncHandleQueryCompletedL 0 0 +test AsyncHandleQueryCompletedL 0 1 +test AsyncHandleQueryCompletedL 1 0 +test AsyncHandleQueryCompletedL 1 1 +test DoCreateVideoListL 0 1 +test AsyncHandleQueryCompletedL 0 0 +test AsyncHandleQueryCompletedL 0 1 +test AsyncHandleQueryCompletedL 1 0 +test AsyncHandleQueryCompletedL 1 1 +test DeleteL +delete test +[Endtest] + +[Test] +title HandleSessionErrorL +create VcxMyVideosMdsDbTest test +test CreateL +test HandleSessionErrorL 0 +test HandleSessionErrorL 1 +test DeleteL +delete test +[Endtest] + +[Test] +title HandleObjectNotificationL +create VcxMyVideosMdsDbTest test +test CreateL +loop 10 +test HandleObjectNotificationL LOOP_COUNTER +endloop +test HandleObjectNotificationL 1 1 +test DeleteL +delete test +[Endtest] + +[Test] +title HandleObjectPresentNotification +create VcxMyVideosMdsDbTest test +test CreateL +test HandleObjectPresentNotification 0 +test HandleObjectPresentNotification 1 +test HandleObjectPresentNotification 0 1 +test DeleteL +delete test +[Endtest] + +[Test] +title ShutdownNotificationL +create VcxMyVideosMdsDbTest test +test CreateL +test ShutdownNotificationL 0 +test ShutdownNotificationL 1 +test ShutdownNotificationL 2 +test DeleteL +delete test +[Endtest] + +[Test] +title MdsServerTerminated +create VcxMyVideosMdsDbTest test +test CreateL +test ShutdownNotificationL 1 +allownextresult -15 +test AddVideoL 4 +test DeleteL +delete test +[Endtest] \ No newline at end of file diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/group/VcxMyVideosMdsDbTest.mmp --- a/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/group/VcxMyVideosMdsDbTest.mmp Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/group/VcxMyVideosMdsDbTest.mmp Wed Jun 09 09:44:23 2010 +0300 @@ -17,7 +17,7 @@ * */ -// %version: 1 % +// %version: 2 % #include @@ -60,6 +60,8 @@ SOURCE mdeitem.cpp SOURCE mdeinstanceitem.cpp SOURCE mdeorderrule.cpp +SOURCE vcxmyvideosmdscmdqueue.cpp +SOURCE vcxmyvideosmdsalbums.cpp SOURCEPATH ../../../src SOURCE vcxmyvideosmdsdb.cpp diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/inc/VcxMyVideosMdsDbTest.h --- a/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/inc/VcxMyVideosMdsDbTest.h Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/inc/VcxMyVideosMdsDbTest.h Wed Jun 09 09:44:23 2010 +0300 @@ -32,8 +32,22 @@ #include //#include + + +#include +#include +#include +#include +#include +#include +#include "vcxmyvideosalbum.h" + +#define protected public +#define private public #include "vcxmyvideosmdsdb.h" -#include "vcxmyvideosactivetask.h" +#undef private +#undef protected + // MACROS @@ -95,7 +109,7 @@ * @param aEvent Event type. * @param aId Array of IDs in database. */ - void HandleMyVideosDbEvent( TMPXChangeEventType aEvent, RArray& aId ){}; + void HandleMyVideosDbEvent( TMPXChangeEventType aEvent, RArray& aId ); /** * Handler function for list fetching events. This callback is called as a response @@ -108,7 +122,7 @@ * EFalse if there are more to come. */ void HandleCreateVideoListResp( CMPXMedia* aVideoList, - TInt aNewItemsStartIndex, TBool aComplete ){}; + TInt aNewItemsStartIndex, TBool aComplete ); /** * Handler function for media remove/insert events. This is called every time @@ -188,9 +202,26 @@ virtual TInt UpdateVideoL( CStifItemParser& aItem ); virtual TInt CreateVideoListL( CStifItemParser& aItem ); + + virtual TInt DoCreateVideoListL( CStifItemParser& aItem ); virtual TInt CreateVideoL( CStifItemParser& aItem ); + virtual TInt HandleQueryNewResultsL( CStifItemParser& aItem ); + + virtual TInt HandleQueryCompletedL( CStifItemParser& aItem ); + + virtual TInt AsyncHandleQueryCompletedL( CStifItemParser& aItem ); + + virtual TInt HandleSessionErrorL( CStifItemParser& aItem ); + + virtual TInt HandleObjectNotificationL( CStifItemParser& aItem ); + + virtual TInt HandleObjectPresentNotification( CStifItemParser& aItem ); + + virtual TInt ShutdownNotificationL( CStifItemParser& aItem ); + + /** * Method used to log version of test class */ @@ -207,7 +238,11 @@ public: TInt mdssessionerror, mdssessionasyncerror, - mdsoperationleaves, mdsoperationreturns ; + mdsoperationleaves, mdsoperationreturns, mdeobjectopenresult, + querycountresult, propertynotdefined, propertyisnull, handledbeventleave ; + + + CMPXMedia* iVideoList; }; diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/inc/mdeobjectquery.h --- a/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/inc/mdeobjectquery.h Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/inc/mdeobjectquery.h Wed Jun 09 09:44:23 2010 +0300 @@ -132,6 +132,8 @@ * Speed optimization to drop freetexts from results. */ TBool iFreetextsInResult; + + mutable CMdEObject* iCMdEObject; }; #endif // __MDEOBJECTQUERY_H__ diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/inc/mdesessionimpl.h --- a/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/inc/mdesessionimpl.h Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/inc/mdesessionimpl.h Wed Jun 09 09:44:23 2010 +0300 @@ -26,11 +26,11 @@ class CMdEDataBuffer; class CMdCSerializationBuffer; class CMdESessionStartupAO; -class CMdESessionAsyncHandler; +class CMdeSessionStartTimer; class RMdESessionAsyncRequest { - friend class CMdESessionAsyncHandler; + friend class CMdeSessionStartTimer; private: enum TRequestType { @@ -53,13 +53,13 @@ TRequestStatus* iRequestStatus; }; -NONSHARABLE_CLASS(CMdESessionAsyncHandler) : public CTimer +NONSHARABLE_CLASS(CMdeSessionStartTimer) : public CTimer { public: - static CMdESessionAsyncHandler* NewL(MMdESessionObserver& aObserver); + static CMdeSessionStartTimer* NewL(MMdESessionObserver& aObserver); - ~CMdESessionAsyncHandler(); + ~CMdeSessionStartTimer(); private: @@ -67,7 +67,7 @@ void ConstructL(); - CMdESessionAsyncHandler(MMdESessionObserver& aObserver); + CMdeSessionStartTimer(MMdESessionObserver& aObserver); private: RArray iRequests; @@ -630,7 +630,7 @@ RPointerArray iNamespaceDefs; -// CMdESessionAsyncHandler* iAsyncHandler; +// CMdeSessionStartTimer* iAsyncHandler; TUint32 iNextQueryId; @@ -644,7 +644,7 @@ }; TSessionState iSessionState; - CMdESessionAsyncHandler* iTimer; + CMdeSessionStartTimer* iTimer; }; #endif // __MDESESSIONIMPL_H__ diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/inc/mpxmedia.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/inc/mpxmedia.h Wed Jun 09 09:44:23 2010 +0300 @@ -0,0 +1,33 @@ +/* +* 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: MPX My Videos collection plugins' MDS database class* +*/ + + + +#include + +#include +#include +#include +#include +#include +#include +#include "vcxmyvideosalbum.h" + +#define protected public +#define private public +#include "vcxmyvideosmdsdb.h" +#undef private +#undef protected diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/inc/myvideostesttrap.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/inc/myvideostesttrap.h Wed Jun 09 09:44:23 2010 +0300 @@ -0,0 +1,74 @@ +/* +* Copyright (c) 2010 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 MYVIDEOSTESTTRAP_H_ + +#include +#undef TRAPD +#undef TRAP_IGNORE + +#define TRAPD(_r, _s) \ + TInt _r; \ + { \ + _r = 0; \ + { TRAP_INSTRUMENTATION_START; } \ + try { \ + __WIN32SEHTRAP \ + TTrapHandler* ____t = User::MarkCleanupStack(); \ + _s; \ + User::UnMarkCleanupStack(____t); \ + { TRAP_INSTRUMENTATION_NOLEAVE; } \ + __WIN32SEHUNTRAP \ + } \ + catch (XLeaveException& l) \ + { \ + _r = l.GetReason(); \ + { TRAP_INSTRUMENTATION_LEAVE(_r); } \ + } \ + \ + __CALL_EMPTY_FUNCTION \ + { TRAP_INSTRUMENTATION_END; } \ + } + +#define TRAP_IGNORE(_s) \ + { \ + { TRAP_INSTRUMENTATION_START; } \ + try { \ + __WIN32SEHTRAP \ + TTrapHandler* ____t = User::MarkCleanupStack(); \ + _s; \ + User::UnMarkCleanupStack(____t); \ + { TRAP_INSTRUMENTATION_NOLEAVE; } \ + __WIN32SEHUNTRAP \ + } \ + catch (XLeaveException& l) \ + { \ + l.GetReason(); \ + { TRAP_INSTRUMENTATION_LEAVE(l.Reason()); } \ + } \ + \ + __CALL_EMPTY_FUNCTION \ + { TRAP_INSTRUMENTATION_END; } \ + } + + + + +#define MYVIDEOSTESTTRAP_H_ + + +#endif /* MYVIDEOSTESTTRAP_H_ */ diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/inc/vcxmyvideosalbum.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/inc/vcxmyvideosalbum.h Wed Jun 09 09:44:23 2010 +0300 @@ -0,0 +1,230 @@ +/* +* 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: Class representing album in My Videos collection. +*/ + + +#ifndef CVCXMYVIDEOSALBUM_H +#define CVCXMYVIDEOSALBUM_H + +// INCLUDES +#include +#include +#include +#include +#include +#include +#include +#include + +typedef TInt TVcxMyVideosAlbumVideo; + +#define protected public +#define private public +#include "vcxmyvideosmdsdb.h" +#undef private +#undef protected + + +class CMPXMedia; +class CVcxMyVideosCollectionPlugin; + +// CLASS DECLARATION + +/** + * Contains information about video which belongs to some album. + * These are stored to CVcxMyVideosAlbum::iVideoList. + */ +// +//NONSHARABLE_CLASS(TVcxMyVideosAlbumVideo) +// { +// public: +// +// /** +// * Constructor. +// */ +// TVcxMyVideosAlbumVideo(); +// +// /** +// * = operator. +// */ +// TVcxMyVideosAlbumVideo& operator=( const TVcxMyVideosAlbumVideo& aVideo ); +// +// /** +// * Set values. +// */ +// void Set( TUint32 aMdsId, TUint32 aRelationMdsId, CMPXMedia* aVideo ); +// +// TUint32 iMdsId; //Video object ID in MDS. +// TUint32 iRelationMdsId; //Relation ID in MDS, this is used when removing items from album. +// CMPXMedia* iMedia; +// }; + +/** + * Contains list of videos belonging to an album. Videos can be searched, added and + * removed. Videos are kept in sorting order by MDS ID to speed up access. Pointers + * to media objects in collection cache are also stored to speed up access. + * Contains also logic for keeping album media attributes up to date. + */ +NONSHARABLE_CLASS(CVcxMyVideosAlbum) : public CBase + { +public: + // Constructors and destructor + + /** + * Destructor. + */ + ~CVcxMyVideosAlbum(); + + /** + * Two-phased constructor. + */ + static CVcxMyVideosAlbum* NewL( CVcxMyVideosCollectionPlugin& aCollectionPlugin ); + + /** + * Two-phased constructor. + */ + static CVcxMyVideosAlbum* NewLC( CVcxMyVideosCollectionPlugin& aCollectionPlugin ); + + // new methods + + /** + * Sets up this album. + * + * @param aAlbum Media class to set from. + */ + void SetL( /*CMPXMedia& aAlbum*/ ); + + /** + * Sorts iVideoList by MDS ID. + */ + void Sort(); + + /** + * Checks if aMdsId belongs to this album. Checking is + * done using bisection method. + * + * @param aMdsId Id to check. + */ + TBool BelongsToAlbum( TUint32 aMdsId ); + + /** + * Finds video from iVideoList. Uses bisection method, ie + * is fast. + * + * @param aMdsId Video to find. + * @param aVideo If found, this is filled with data. + * @param aIndex Position in iVideoList where from the video + * was found. + * @return System-wide error code. If != KErrNone, then + * aVideo and aIndex won't contain valid data. + */ + TInt Video( TUint32 aMdsId, TVcxMyVideosAlbumVideo& aVideo, TInt& aIndex ); + + /** + * Adds aVideo to this album. The id array is kept in ascending order. + * + * @param aVideo Video to add. + */ + void AddL( TVcxMyVideosAlbumVideo aVideo ); + + /** + * Removes videos from this album. + * + * @param aMdsIds Array containing IDs of the videos to remove. + */ + void Remove( RArray& aMdsIds ); + + /** + * Removes aMdsId from this album. + * + * @param aMdsId ID to remove. + * @param aCompress If ETrue, then Compress is called to iVideoList. + * ETrue as default. + */ + void Remove( TUint32 aMdsId, TBool aCompress = ETrue ); + + /** + * Used for keeping RArray in integer order by + * TVcxMyVideosAlbumVideo::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 TVcxMyVideosAlbumVideo& aVideo1, + const TVcxMyVideosAlbumVideo& aVideo2 ); + + /** + * Creates video list belonging to this album. Ownership goes to caller. + * + * @return Media containing media array. Array items are videos. + */ + CMPXMedia* CreateVideoListL(); + + /** + * Appends items from aFromVideoList to aToVideoList if they belong to + * this album. + * + * @param aFromVideoList From list. + * @param aToVideoList To List. + * @param aNewItemStartIndex Start index of the copy. Items in aFromVideoList before this + * value are ignored. + */ + void AppendToVideoListL( CMPXMedia& aFromVideoList, + CMPXMedia& aToVideoList, TInt aNewItemStartIndex ); + + /** + * Calculates KVcxMediaMyVideosCategoryItemCount, KVcxMediaMyVideosCategoryNewItemCount, + * KVcxMediaMyVideosCategoryNewItemName and KMPXMediaGeneralDate attributes to iMedia. + * + * @param aStartIndex Start position of the calculations in iVideoList. + * Can be used to update values when items are appended + * to old list, without calculating everything from scratch. + */ + void CalculateAttributesL( TInt aStartIndex = 0 ); + + /** + * Constructor for performing 1st stage construction + */ + CVcxMyVideosAlbum( CVcxMyVideosCollectionPlugin& aCollectionPlugin ); + + /** + * EPOC default constructor for performing 2nd stage construction + */ + void ConstructL(); + + CVcxMyVideosCollectionPlugin& iCollection; + + /** + * MDS ID of this album. + */ + TUint32 iMdsId; + + /** + * MPX media object representing this album in collection, not own. + * The item is owned by CVcxMyVideosAlbums::iAlbumList + */ + CMPXMedia* iMedia; + + /** + * Array containing info about videos belonging to this album. + */ + RArray iVideoList; + + }; + +#endif // CVCXMYVIDEOSALBUM_H diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/inc/vcxmyvideoscollectionutil.h --- a/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/inc/vcxmyvideoscollectionutil.h Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/inc/vcxmyvideoscollectionutil.h Wed Jun 09 09:44:23 2010 +0300 @@ -22,11 +22,14 @@ #define VCXMYVIDEOSCOLLECTIONUTIL_H // INCLUDES +#include // FORWARD DECLARATIONS class CMPXMedia; class RFs; +#include "myvideostesttrap.h" + // CONSTANTS // CLASS DECLARATION @@ -83,6 +86,15 @@ RArray& aMdsIds ); /** + * Appends all items from aFromList to aToList. New items will point to + * same shared memory. + * + * @param aToList List in which items are appended to. + * @param aFromList List in which items are copied from. + */ + static void AppendToListL( CMPXMedia& aToList, CMPXMedia& aFromList ); + + /** * Converts drive letter to drive number. * * @param aDrive drive letter @@ -118,6 +130,14 @@ static TUint32 FlagsL( CMPXMedia& aVideo ); /** + * Gets KMPXMediaGeneralDate (creation date) of aVideo. + * + * @param aVideo Media object to fetch parameter from. + * @return Creation date, works with TTime. + */ + static TInt64 CreationDateL( CMPXMedia& aVideo ); + + /** * Gets KVcxMediaMyVideosDownloadId attribute of aVideo. * * @param aVideo Media object to fetch parameter from. @@ -139,7 +159,7 @@ * @param aVideo Media object to fetch parameter from. * @return ID. */ - static TMPXItemId IdL( CMPXMedia& aVideo ); + static TMPXItemId IdL( const CMPXMedia& aVideo ); /** * Gets KVcxMediaMyVideosDuration attribute of aVideo. @@ -155,7 +175,7 @@ * @return KMPXMediaGeneralTitle value. If attribute is not supported, * then KNullDesC is returned. */ - static const TDesC& Title( CMPXMedia& aVideo ); + static const TDesC& Title( const CMPXMedia& aVideo ); /** * Gets KVcxMediaMyVideosRating attribute of the video. @@ -207,6 +227,44 @@ */ static TInt Origin( TInt aCategoryId ); + /** + * Gets KMPXMediaArrayContents attribute from aMedia. Leaves + * with KErrArgument is attribute is not supported. + * + * @param aMedia Media where from the attribute is fetched. + * @return Pointer to media array. + */ + static CMPXMediaArray* MediaArrayL( const CMPXMedia& aMedia ); + + /** + * Gets KVcxMediaMyVideosInt32Value attribute from aMedia. Leaves + * with KErrArgument if attribute is not supported. + * + * @param aMedia Media where from the attribute is fetched. + * @return Value of KVcxMediaMyVideosInt32Value attribute. + */ + static TInt32 Int32ValueL( CMPXMedia& aMedia ); + + /** + * Gets KVcxMediaMyVideosUint32Value attribute from aMedia. Leaves + * with KErrArgument if attribute is not supported. + * + * @param aMedia Media where from the attribute is fetched. + * @return Value of KVcxMediaMyVideosUint32Value attribute. + */ + static TUint32 Uint32ValueL( CMPXMedia& aMedia ); + + /** + * Gets KMPXMediaGeneralId attributes from aMediaArray and + * puts them to aIdArray. aIdArray is reset before adding. + * + * @param aMediaArray Media array containing media items which + * have KMPXMediaGeneralId attribute set. + * @param aIdArray Array where to the IDs are written to. + */ + static void GetIdsFromMediaArrayL( CMPXMediaArray& aMediaArray, + RArray& aIdArray ); + #ifdef _DEBUG /** * Prints process names which have file handle open to aFileName diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/inc/vcxmyvideosmdsalbums.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/inc/vcxmyvideosmdsalbums.h Wed Jun 09 09:44:23 2010 +0300 @@ -0,0 +1,541 @@ +/* +* 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: Provides albums support from MDS* +*/ + + + +#ifndef VCXMYVIDEOSMDSALBUMS_H +#define VCXMYVIDEOSMDSALBUMS_H + +// INCLUDES +#include +#include + +#include +#include +#include +#include +#include +#include +#include "vcxmyvideosalbum.h" + +#define protected public +#define private public +#include "vcxmyvideosmdsdb.h" +#undef private +#undef protected + +// FORWARD DECLARATIONS +class CMPXMedia; +class MVcxMyVideosMdsAlbumsObserver; + +// CONSTANTS + +// CLASS DECLARATION + +/** +* Provides albums support, uses MDS. +* +* @lib mpxmyvideoscollectionplugin.lib +*/ +NONSHARABLE_CLASS(CVcxMyVideosMdsAlbums) : + public CActive, + public MMdEQueryObserver, + public MMdERelationItemObserver +#if 0 + , + public MMdERelationObserver +#endif + { + public: // Constructors and destructor + + friend class CVcxMyVideosMdsCmdQueue; + friend class CVcxMyVideosMdsDb; + + enum TVcxAsyncOperation + { + EVcxNone, + EVcxAddVideosToAlbum, + EVcxRemoveRelations, + EVcxRemoveAlbums + }; + + /** + * Constructor. + * + * @param aMdsDb Owner of this object. + * @param aObserver Object which is listening album related events. If NULL, then + * no observer is set. + */ + static CVcxMyVideosMdsAlbums* NewL( CVcxMyVideosMdsDb& aMdsDb, + MVcxMyVideosMdsAlbumsObserver* aObserver ); + + /** + * Destructor + */ + virtual ~CVcxMyVideosMdsAlbums(); + + public: // new methods + + /** + * From CActive. + * Cancels possible ongoing asynchronous request. + * + * @param aType Defines what kind of request is cancelled. + */ + void DoCancel( CVcxMyVideosMdsDb::TRequestType aType = CVcxMyVideosMdsDb::EAll ); + + /** + * Cancels queries. + * + * @param aType Defines what kind of request is cancelled. + */ + void CancelQueries( CVcxMyVideosMdsDb::TRequestType aType = CVcxMyVideosMdsDb::EAll ); + + /** + * Gets My Videos albums from MDS asynchronously. + * HandleGetAlbumsResp() callback function is called when ready. + * Utilizes CVcxMyVideosMdsCmdQueue. + * + * @param aAlbumList Album list is written here. Caller owns this, ownership + * does not move. + * @param aClient Response call is done to this object. + */ + void GetAlbumsL( CMPXMedia* aAlbumList, MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Gets album from MDS synchronously. + * + * @param aId MDS ID of the album to be fetched. + * @returm MPX media containing album data. Ownership + * moves to caller. NULL if not found. + */ + CMPXMedia* GetAlbumL( TUint32 aId ); + + /** + * Gets album content IDs asynchronously. + * HandleGetAlbumContentIdsResp() callback function is called when ready. + * Utilizes CVcxMyVideosMdsCmdQueue. + * + * @param aAlbumId Album ID. + * @param aContentArray Item IDs which belog to aAlbum are written here. Caller must + * keep aContentArray available until HandleGetAlbumContentIdsResp + * has been called. + * @param aClient Response call is done to this object. + */ + void GetAlbumContentIdsL( TUint32 aAlbumId, RArray& aContentArray, + MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Gets album content videos asynchronously. + * HandleGetAlbumContentVideosResp() callback function is called when ready. + * Utilizes CVcxMyVideosMdsCmdQueue. + * + * @param aAlbumId Album ID. + * @param aVideoList Media containing media array. Video media objects are added to media array. + * Caller must keep aVideoList available until callback has been called. + * @param aClient Response call is done to this object. + */ + void GetAlbumContentVideosL( TUint32 aAlbumId, CMPXMedia& aVideoList, + MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Adds videos to album asynchronously. HandleAddVideosToAlbumResp() callback function + * is called when operation finishes. + * Utilizes CVcxMyVideosMdsCmdQueue. + * + * @param aMpxCmd Media containing command parameters: album ID and video ID list. + * Results are also written to this object. See media structure and + * used attributes from vcxmyvideosdef.c file, + * KVcxCommandMyVideosAddToAlbum command. Ownership does not move. + * + * @param aClient Response call is done to this object. + */ + void AddVideosToAlbumL( CMPXMedia* aMpxCmd, MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Removes relations asynchronously. + * Utilizes CVcxMyVideosMdsCmdQueue. + * + * @param aRelationIds Relations which are removed. + * @param aResults In sync with aRelationIds. Result codes, KErrNone if successful, + * KErrGeneral if failed. + * @param aClient Response call is done to this object. + */ + void RemoveRelationsL( RArray& aRelationIds, + RArray& aResults, MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Adds album to MDS. aAlbum should have KMPXMediaGeneralTitle attribute + * set. The MDS item ID of the created album is written to KMPXMediaGeneralId + * attribute. + * + * @param aAlbum Album which is added to database. + */ + void AddAlbumL( CMPXMedia& aAlbum ); + + /** + * Removes albums asynchronously. HandleRemoveAlbumsResp() callback function + * is called when operation finishes. + * Utilizes CVcxMyVideosMdsCmdQueue. + * + * @param aMpxCmd Media containing command parameters: media array containing album IDs. + * Results are also written to this object. See media structure and + * used attributes from vcxmyvideosdef.c file, + * KVcxCommandMyVideosRemoveAlbums command. Ownership does not move. + * + * @param aClient Response call is done to this object. + */ + void RemoveAlbumsL( CMPXMedia* aMpxCmd, MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Sets album attributes. + * + * @param aVideo Values from aVideo are written to MDS. + */ + void SetAlbumL( CMPXMedia& aVideo ); + + protected: + + /** + * From CActive. + * Called when operation completes. + */ + void RunL(); + + /** + * From CActive. + * Actual implementation for cancelling. + */ + void DoCancel(); + + private: + + /** + * Constructor + */ + CVcxMyVideosMdsAlbums( CVcxMyVideosMdsDb& aMdsDb, + MVcxMyVideosMdsAlbumsObserver* aObserver ); + + /** + * Symbian 2nd phase constructor. + */ + void ConstructL(); + + /** + * Copies album data from aObject to aAlbum. + * + * @param aObject MDS object to copy data from. + * @param aAlbum MPX media to copy data to. + */ + void Object2MediaL( CMdEObject& aObject, CMPXMedia& aAlbum ); + + /** + * Copies album data from aAlbum to aObject. + * + * @param aAlbum MPX media to copy data from. + * @param aObject MDS object to copy data to. + */ + void Media2ObjectL( CMPXMedia& aAlbum, CMdEObject& aObject); + + /** + * Gets various defintions from MDS and stores them to member variables. + */ + void GetSchemaDefinitionsL(); + + /** + * Gets My Videos albums from MDS asynchronously. + * HandleGetAlbumsResp() callback function is called when ready. + * + * @param aAlbumList Album list is written here. Caller owns this, ownership + * does not move. + * @param aClient Callback is done to this object. + */ + void DoGetAlbumsL( CMPXMedia* aAlbumList, MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Gets album content IDs from MDS asynchronously. + * HandleGetAlbumContentIdsResp() callback function is called when ready. + * + * @param aAlbumId Album ID. + * @param aContentArray Array containing MDS IDs which belong to aAlbum. + * Caller is responsible to keep array available + * until HandleGetAlbumContentResp has been called. + * @param aClient Callback is done to this object. + */ + void DoGetAlbumContentIdsL( TUint32 aAlbumId, + RArray& aContentArray, + MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Gets album content videos from MDS asynchronously. + * HandleGetAlbumContentVideosResp() callback function is called when ready. + * + * @param aAlbumId Album ID. + * @param aVideoList Media containing empty media array. Videos are added to array. Caller + * must keep aVideoList available until HandleGetAlbumContentVideosResp + * is called. + * @param aClient Callback is done to this object. + */ + void DoGetAlbumContentVideosL( TUint32 aAlbumId, CMPXMedia& aVideoList, + MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Adds videos to album asynchronously. HandleAddVideosToAlbumResp() callback function + * is called when operation finishes. + * + * @param aMpxCmd Media containing command parameters: album ID and video ID list. + * Results are also written to this object. See media structure and + * used attributes from vcxmyvideosdef.c file, + * KVcxCommandMyVideosAddToAlbum command. Ownership does not move. + * @param aClient Response call is done to this object. + */ + void DoAddVideosToAlbumL( CMPXMedia* aMpxCmd, MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Removes relations asynchronously. + * + * @param aRelationIds Relations which are removed. + * @param aResults In sync with aRelationIds. Result codes, KErrNone if successful, + * KErrGeneral if failed. + * @param aClient Response call is done to this object. + */ + void DoRemoveRelationsL( RArray& aRelationIds, + RArray& aResults, MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Removes albums asynchronously. + * + * @param aMpxCmd Media containing command parameters: array with albums IDs. + * @param aClient Response call is done to this object. + */ + void DoRemoveAlbumsL( CMPXMedia* aMpxCmd, + MVcxMyVideosMdsAlbumsObserver& aClient ); + + /** + * Handles album query responses. + * + * @param aQuery Query instance. + * @param aError KErrNone, if the query was completed + * successfully. Otherwise one of the system-wide error + * codes. + */ + void HandleAlbumQueryCompletedL(CMdEQuery& aQuery, TInt aError); + + /** + * Handles video query responses. + * + * @param aQuery Query instance. + * @param aError KErrNone, if the query was completed + * successfully. Otherwise one of the system-wide error + * codes. + * @param aFirstNewItemIndex Index of the first new item in the query. + * @param aNewItemCount How many new items were added. + * @param aComplete ETrue if query is complete, EFalse if new to come. + */ + void HandleVideoQueryResultsL( CMdEQuery& aQuery, TInt aError, + TInt aFirstNewItemIndex, TInt aNewItemCount, TBool aComplete ); + + /** + * Handles relation query responses. + * + * @param aQuery Query instance. + * @param aError KErrNone, if the query was completed + * successfully. Otherwise one of the system-wide error + * codes. + */ + void HandleRelationQueryCompletedL( CMdEQuery& aQuery, TInt aError ); + + /** + * Called from RunL when video adding to album completes. + */ + void HandleAddVideosToAlbumCompletedL(); + + /** + * Called from RunL when relations remove completes. + */ + void HandleRemoveRelationsCompletedL(); + + /** + * Called from RunL when albums remove completes. + */ + void HandleRemoveAlbumsCompletedL(); + + /** + * Registers observing to MDS session. + */ + void SetObservingL(); + + protected: + + /** + * From MMdEQueryObserver. + * Called to notify the observer that new results have been received + * in the query. + * + * @param aQuery Query instance that received new results. + * @param aFirstNewItemIndex Index of the first new item that was added + * to the result item array. + * @param aNewItemCount Number of items added to the result item + * array. + */ + void HandleQueryNewResults(CMdEQuery& aQuery, + TInt aFirstNewItemIndex, + TInt aNewItemCount); + + /** + * From MMdEQueryObserver. + * Called to notify the observer that the query has been completed, + * or that an error has occured. + * + * @param aQuery Query instance. + * @param aError KErrNone, if the query was completed + * successfully. Otherwise one of the system-wide error + * codes. + */ + void HandleQueryCompleted(CMdEQuery& aQuery, TInt aError); + + /** + * From MMdERelationItemObserver + */ + void HandleRelationItemNotification(CMdESession& aSession, + TObserverNotificationType aType, + const RArray& aRelationArray); + + /** + * From MMdERelationObserver + */ + void HandleRelationNotification(CMdESession& aSession, + TObserverNotificationType aType, + const RArray& aRelationIdArray); + + private: + + /** + * Main class for Mds operations. Owns session to MDS. + */ + CVcxMyVideosMdsDb& iMdsDb; + + /** + * Observer of albums related events. May be NULL. + * not own. + */ + MVcxMyVideosMdsAlbumsObserver* iObserver; + + /** + * Asynchronous album object fetching query is stored here. Own. + */ + CMdEObjectQuery* iAlbumQuery; + + /** + * Asynchronous video object fetching query is stored here. Own. + */ + CMdEObjectQuery* iVideoQuery; + + /** + * Asynchronous relation fetching query is stored here. Own. + */ + CMdERelationQuery* iRelationQuery; + + /** + * The default namespace definition, not own. + */ + CMdENamespaceDef* iNamespaceDef; + + /** + * Album object definition, not own. + */ + CMdEObjectDef* iAlbumObjectDef; + + /** + * Album type property definition, not own. + */ + CMdEPropertyDef* iTypePropertyDef; + + /** + * "Contains" relation definition, not own. + */ + CMdERelationDef* iContainsRelationDef; + + /** + * Pointer to album list which is being fetched from MDS. Not own. + */ + CMPXMedia* iAlbumList; + + /** + * Pointer to video list which is being fetched from MDS. Not own. + */ + CMPXMedia* iVideoList; + + /** + * When doing some async operation to MDS, the album ID is stored here. + */ + TUint32 iAlbumId; + + /** + * When fetching album content from MDS, the pointer to content array is stored here. + * Only MDS ID is filled to TVideo. + * Not own. + */ + RArray* iAlbumContent; + + /** + * The pending async operation ID is stored here. + */ + TVcxAsyncOperation iAsyncOperation; + + /** + * Used for storing items during async mds operations. + */ + RPointerArray iItemArray; + + /** + * Used for storing result buffer during async mds operations. + */ + //RMdEDataBuffer iResultBuffer; + + /** + * Used in async operations to store + * pointer to result array (which is owned by the user). + */ + RArray* iResultArray; + + /** + * Used in async operations to store + * pointer to result array (which is owned by the user). + */ + RArray* iResultArrayUint32; + + /** + * Used in async oprations (EVcxAddVideosToAlbum and EVcxRemoveVideosFromAlbum) to store + * pointer to item ID array (which is owned by the user). + */ + RArray* iIdArray; + + /** + * Used to store command parameters during async MDS operations. Not owned. + */ + CMPXMedia* iMpxCmd; + + /** + * Used to store pointer to client who initiated the async operation. + */ + MVcxMyVideosMdsAlbumsObserver* iClient; + + }; + +#endif // VCXMYVIDEOSMDSALBUMS_H + + diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/inc/vcxmyvideosmdscmdqueue.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/inc/vcxmyvideosmdscmdqueue.h Wed Jun 09 09:44:23 2010 +0300 @@ -0,0 +1,343 @@ +/* +* 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: Queues commands to MDS. +*/ + + + +#ifndef VCXMYVIDEOSMDSCMDQUEUE_H +#define VCXMYVIDEOSMDSCMDQUEUE_H + +// INCLUDES +#include + +#include +#include +#include +#include +#include +#include +#include "vcxmyvideosalbum.h" + +#define protected public +#define private public +#include "vcxmyvideosmdsdb.h" +#undef private +#undef protected + +// FORWARD DECLARATIONS +class CMPXMedia; +class MVcxMyVideosMdsAlbumsObserver; + +// CONSTANTS + +// CLASS DECLARATION + +/** +* All MDS commands inherit this. +* +* @lib mpxmyvideoscollectionplugin.lib +*/ +NONSHARABLE_CLASS(CVcxMyVideosMdsCmd) : public CBase + { + public: + + /** + * Destructor + */ + virtual ~CVcxMyVideosMdsCmd() {} + + /** + * Command type. Used for casting the pointer to correct type. + */ + CVcxMyVideosMdsDb::TRequestType iCmdType; + + /** + * Pointer to client is stored here, used for performing response call. + */ + MVcxMyVideosMdsAlbumsObserver* iClient; + }; + +/** +* Class which encapsulates GetVideoListL function parameters. +* +* @lib mpxmyvideoscollectionplugin.lib +*/ +NONSHARABLE_CLASS(CVcxMyVideosMdsCmdGetVideoList) : public CVcxMyVideosMdsCmd + { + public: + + /** + * Constructor + */ + CVcxMyVideosMdsCmdGetVideoList() {} + + /** + * Destructor + */ + virtual ~CVcxMyVideosMdsCmdGetVideoList() {} + + public: + /** + * Stored CreateVideoListL function parameters, see meanings from vcxmyvideosmdsdb.h file. + */ + TVcxMyVideosSortingOrder iSortingOrder; + TBool iAscending; + TBool iFullDetails; + CMPXMedia** iVideoList; + }; + +/** +* Class which stores GetAlbumsL function arguments. +* +* @lib mpxmyvideoscollectionplugin.lib +*/ +NONSHARABLE_CLASS(CVcxMyVideosMdsCmdGetAlbums) : public CVcxMyVideosMdsCmd + { + public: // Constructors and destructor + + /** + * Constructor + */ + CVcxMyVideosMdsCmdGetAlbums() {} + + /** + * Destructor + */ + virtual ~CVcxMyVideosMdsCmdGetAlbums() {} + + public: + /** + * Stored GetAlbumsL function parameters, see meanings from vcxmyvideosmdsalbums.h file. + */ + CMPXMedia* iAlbumList; + }; + +/** +* Class which stores GetAlbumContentIdsL function arguments. +* +* @lib mpxmyvideoscollectionplugin.lib +*/ +NONSHARABLE_CLASS(CVcxMyVideosMdsCmdGetAlbumContentIds) : public CVcxMyVideosMdsCmd + { + public: // Constructors and destructor + + /** + * Constructor + */ + CVcxMyVideosMdsCmdGetAlbumContentIds() {} + + /** + * Destructor + */ + virtual ~CVcxMyVideosMdsCmdGetAlbumContentIds() {} + + public: + /** + * Stored GetAlbumContentL function parameters, see meanings from vcxmyvideosmdsalbums.h file. + */ + TUint32 iAlbumId; + RArray* iAlbumContent; //not own + }; + +/** +* Class which stores GetAlbumContentVideosL function arguments. +* +* @lib mpxmyvideoscollectionplugin.lib +*/ +NONSHARABLE_CLASS(CVcxMyVideosMdsCmdGetAlbumContentVideos) : public CVcxMyVideosMdsCmd + { + public: // Constructors and destructor + + /** + * Constructor + */ + CVcxMyVideosMdsCmdGetAlbumContentVideos() {} + + /** + * Destructor + */ + virtual ~CVcxMyVideosMdsCmdGetAlbumContentVideos() {} + + public: + /** + * Stored GetAlbumContentL function parameters, see meanings from vcxmyvideosmdsalbums.h file. + */ + TUint32 iAlbumId; + CMPXMedia* iAlbumContentVideos; //not own + }; + +/** +* Class which stores AddVideosToAlbumL function arguments. +* +* @lib mpxmyvideoscollectionplugin.lib +*/ +NONSHARABLE_CLASS(CVcxMyVideosMdsCmdAddVideosToAlbum) : public CVcxMyVideosMdsCmd + { + public: // Constructors and destructor + + /** + * Constructor + */ + CVcxMyVideosMdsCmdAddVideosToAlbum() {} + + /** + * Destructor + */ + virtual ~CVcxMyVideosMdsCmdAddVideosToAlbum() {} + + public: + /** + * Stored AddVideosToAlbumL function parameters, see meanings from vcxmyvideosdefs.h + * KVcxCommandMyVideosAddToAlbum command descriptions. + */ + CMPXMedia* iMpxCmd; + }; + +/** +* Class which stores RemoveRelationsL function arguments. +* +* @lib mpxmyvideoscollectionplugin.lib +*/ +NONSHARABLE_CLASS(CVcxMyVideosMdsCmdRemoveRelations) : public CVcxMyVideosMdsCmd + { + public: // Constructors and destructor + + /** + * Constructor + */ + CVcxMyVideosMdsCmdRemoveRelations() {} + + /** + * Destructor + */ + virtual ~CVcxMyVideosMdsCmdRemoveRelations() {} + + public: + /** + * Stored RemoveRelationsL function parameters, see meanings from vcxmyvideosmdsalbums.h file. + */ + RArray* iRelationIds; //not own + RArray* iResults; //not own + }; + +/** +* Class which stores RemoveAlbumsL function arguments. +* +* @lib mpxmyvideoscollectionplugin.lib +*/ +NONSHARABLE_CLASS(CVcxMyVideosMdsCmdRemoveAlbums) : public CVcxMyVideosMdsCmd + { + public: // Constructors and destructor + + /** + * Constructor + */ + CVcxMyVideosMdsCmdRemoveAlbums() {} + + /** + * Destructor + */ + virtual ~CVcxMyVideosMdsCmdRemoveAlbums() {} + + public: + /** + * Stored RemoveAlbumsL function parameters, see meanings from vcxmyvideosmdsalbums.h file. + */ + CMPXMedia* iMpxCmd; //not own + }; + +/** +* Queues MDS commands. +* +* @lib mpxmyvideoscollectionplugin.lib +*/ +NONSHARABLE_CLASS(CVcxMyVideosMdsCmdQueue) : public CBase + { + public: // Constructors and destructor + + /** + * Two-phased constructor + * @return object constructed + */ + static CVcxMyVideosMdsCmdQueue* NewL( CVcxMyVideosMdsDb& aMdsDb ); + + /** + * Destructor + */ + virtual ~CVcxMyVideosMdsCmdQueue(); + + public: // new methods + + /** + * Executes command if queue is empty, otherwise adds it to queue. + * Ownership of aCmd moves to this object. + * + * @param aCmd Command to execute. + */ + void ExecuteCmdL( CVcxMyVideosMdsCmd* aCmd ); + + /** + * Called when command finishes. Executes next command from the queue. + */ + void CmdFinished(); + + /** + * Removes commands from command queue. + * + * @param aType Defines what kind of commands are removed from the command queue. + */ + void Cancel( CVcxMyVideosMdsDb::TRequestType aType = CVcxMyVideosMdsDb::EAll ); + + private: + + /** + * Constructor + */ + CVcxMyVideosMdsCmdQueue( CVcxMyVideosMdsDb& aMdsDb ); + + /** + * Symbian 2nd phase constructor. + */ + void ConstructL(); + + /** + * Executes the command. + * + * @param aCmd Command to execute, ownership does not move. + */ + void DoExecuteCmdL( CVcxMyVideosMdsCmd* aCmd ); + + private: + + /** + * Owner of this object. + */ + CVcxMyVideosMdsDb& iMdsDb; + + /** + * Command queue. Own. + */ + RArray iQueue; + + /** + * Set to ETrue when command is started and to EFalse + * when command finishes. + */ + TBool iCmdInProgress; + }; + +#endif // VCXMYVIDEOSMDSCMDQUEUE_H + + diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/src/VcxMyVideosMdsDbTestBlocks.cpp --- a/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/src/VcxMyVideosMdsDbTestBlocks.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/src/VcxMyVideosMdsDbTestBlocks.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -15,7 +15,7 @@ * */ -// Version : %version: 1 % +// Version : %version: 6 % // [INCLUDE FILES] - do not remove #include @@ -35,7 +35,20 @@ #include #include +#include +#include +#include +#include +#include +#include +#include "vcxmyvideosalbum.h" + +#define protected public +#define private public #include "vcxmyvideosmdsdb.h" +#undef private +#undef protected + #include "vcxmyvideoscollectionutil.h" @@ -103,7 +116,7 @@ // void CVcxMyVideosMdsDbTest::Delete() { - + delete iVideoList; } // ----------------------------------------------------------------------------- @@ -124,7 +137,16 @@ ENTRY( "RemoveVideoL", CVcxMyVideosMdsDbTest::RemoveVideoL ), ENTRY( "UpdateVideoL", CVcxMyVideosMdsDbTest::UpdateVideoL ), ENTRY( "CreateVideoListL", CVcxMyVideosMdsDbTest::CreateVideoListL ), - ENTRY( "CreateVideoL", CVcxMyVideosMdsDbTest::CreateVideoL ) + ENTRY( "DoCreateVideoListL", CVcxMyVideosMdsDbTest::DoCreateVideoListL ), + ENTRY( "CreateVideoL", CVcxMyVideosMdsDbTest::CreateVideoL ), + ENTRY( "HandleQueryNewResultsL", CVcxMyVideosMdsDbTest::HandleQueryNewResultsL ), + ENTRY( "HandleQueryCompletedL", CVcxMyVideosMdsDbTest::HandleQueryCompletedL ), + ENTRY( "AsyncHandleQueryCompletedL", CVcxMyVideosMdsDbTest::AsyncHandleQueryCompletedL ), + ENTRY( "HandleSessionErrorL", CVcxMyVideosMdsDbTest::HandleSessionErrorL ), + ENTRY( "HandleObjectNotificationL", CVcxMyVideosMdsDbTest::HandleObjectNotificationL ), + ENTRY( "HandleObjectPresentNotification", CVcxMyVideosMdsDbTest::HandleObjectPresentNotification ), + ENTRY( "ShutdownNotificationL", CVcxMyVideosMdsDbTest::ShutdownNotificationL ), + }; const TInt count = sizeof( KFunctions ) / @@ -153,7 +175,7 @@ return KErrNone; } -TInt CVcxMyVideosMdsDbTest::DeleteL( CStifItemParser& aItem ) +TInt CVcxMyVideosMdsDbTest::DeleteL( CStifItemParser& ) { delete iMdsDb; return KErrNone; @@ -161,82 +183,80 @@ TInt CVcxMyVideosMdsDbTest::CancelL( CStifItemParser& aItem ) { - iMdsDb->Cancel(); + TInt type = NextIntOrZero( aItem ); + iMdsDb->Cancel( ( CVcxMyVideosMdsDb::TRequestType ) type ); return KErrNone; } TInt CVcxMyVideosMdsDbTest::AddVideoL( CStifItemParser& aItem ) { - PrepareMdsL( aItem ); + mdsoperationreturns = NextIntOrZero( aItem ); + mdsoperationleaves = NextIntOrZero( aItem ); + TBool setMimeType = NextIntOrZero( aItem ) ; + propertynotdefined = NextIntOrZero( aItem ); + propertyisnull = NextIntOrZero( aItem ); + TBool setAttrs = NextIntOrZero( aItem ) ; CMPXMedia* media = CMPXMedia::NewL(); - + CleanupStack::PushL( media ); TUint32 mdsId; - //1. MPX ID, set by collection - //2 - media->SetTextValueL( KMPXMediaGeneralTitle, _L("KMPXMediaGeneralTitle") ); - //3 - media->SetTextValueL( KMPXMediaGeneralComment, _L("KMPXMediaGeneralComment") ); - //4 media->SetTextValueL( KMPXMediaGeneralUri, _L("c:\\data\\videos\\addtest1.mp4") ); - //5 - media->SetTObjectValueL( KMPXMediaGeneralSize, 100 ); - //6 Creation date - TTime time; - time.HomeTime(); - media->SetTObjectValueL( KMPXMediaGeneralDate, time.Int64() ); - //7 - TUint32 flags = EVcxMyVideosVideoDrmProtected || EVcxMyVideosVideoNew; - media->SetTObjectValueL( KMPXMediaGeneralFlags, flags ); - //8 - media->SetTextValueL( KMPXMediaGeneralCopyright, _L("Copyright info") ); - //9 - media->SetTextValueL( KMPXMediaGeneralMimeType, _L("Mime type") ); - //10 - TInt lastPlaybackPos( 13232 ); - media->SetTObjectValueL( KMPXMediaGeneralLastPlaybackPosition, lastPlaybackPos ); - //11 - media->SetTObjectValueL( KVcxMediaMyVideosModifiedDate, time.Int64() ); - //12 - media->SetTObjectValueL( KVcxMediaMyVideosAgeProfile, 18 ); - //13 - media->SetTextValueL( KVcxMediaMyVideosAudioLanguage, _L("Audio language") ); - //14 - media->SetTextValueL( KVcxMediaMyVideosAuthor, _L("Author") ); - //15 - media->SetTObjectValueL( KVcxMediaMyVideosOrigin, 1 ); - //16 - TReal32 duration( 1212 ); - media->SetTObjectValueL( KVcxMediaMyVideosDuration, duration ); - //17 - media->SetTObjectValueL( KVcxMediaMyVideosDownloadId, 0 ); - //18 - media->SetTObjectValueL( KVcxMediaMyVideosRating, 1 ); + if ( setAttrs ) + { + media->SetTextValueL( KMPXMediaGeneralTitle, _L("KMPXMediaGeneralTitle") ); + media->SetTextValueL( KMPXMediaGeneralComment, _L("KMPXMediaGeneralComment") ); + media->SetTObjectValueL( KMPXMediaGeneralSize, 100 ); + media->SetTObjectValueL( KMPXMediaGeneralDate, 1465324313154 ); + media->SetTObjectValueL( KMPXMediaGeneralFlags, 10 ); + media->SetTextValueL( KMPXMediaGeneralCopyright, _L("Copyright info") ); + media->SetTObjectValueL( KMPXMediaGeneralLastPlaybackPosition, 13232 ); + media->SetTObjectValueL( KVcxMediaMyVideosModifiedDate, 1465324313154 ); + media->SetTObjectValueL( KVcxMediaMyVideosAgeProfile, 18 ); + media->SetTextValueL( KVcxMediaMyVideosAudioLanguage, _L("Audio language") ); + media->SetTextValueL( KVcxMediaMyVideosAuthor, _L("Author") ); + media->SetTObjectValueL( KVcxMediaMyVideosOrigin, 1 ); + media->SetTObjectValueL( KVcxMediaMyVideosDuration, 1212 ); + media->SetTObjectValueL( KVcxMediaMyVideosDownloadId, 0 ); + media->SetTObjectValueL( KVcxMediaMyVideosRating, 1 ); + media->SetTObjectValueL( KVcxMediaMyVideosDownloadError, -1 ); + media->SetTObjectValueL( KVcxMediaMyVideosDownloadGlobalError, -2 ); + media->SetTObjectValueL( KMPXMediaVideoBitRate, 1235 ); + media->SetTObjectValueL( KMPXMediaVideoWidth, 15 ); + media->SetTObjectValueL( KMPXMediaVideoHeight, 12 ); + media->SetTObjectValueL( KVcxMediaMyVideosAudioFourCc, 0 ); + media->SetTObjectValueL( KVcxMediaMyVideosAudioFourCc, 0 ); + media->SetTextValueL( KMPXMediaVideoArtist, _L("artist") ); + media->SetTObjectValueL( KMPXMediaGeneralExtSizeInt64, 123456 ); + } - media->SetTObjectValueL( KVcxMediaMyVideosDownloadError, -1 ); - - media->SetTObjectValueL( KVcxMediaMyVideosDownloadGlobalError, -2 ); + if ( setMimeType ) + { + media->SetTextValueL( KMPXMediaGeneralMimeType, _L("Mime type") ); + } iMdsDb->AddVideoL( *media, mdsId ); - delete media; + CleanupStack::PopAndDestroy( media ); + return KErrNone; } TInt CVcxMyVideosMdsDbTest::RemoveVideoL( CStifItemParser& aItem ) { - PrepareMdsL( aItem ); - - TInt id; - aItem.GetNextInt( id ); + mdsoperationreturns = NextIntOrZero( aItem ); + mdsoperationleaves = NextIntOrZero( aItem ); + TInt id = NextIntOrZero( aItem ); + return iMdsDb->RemoveVideo( id ); } TInt CVcxMyVideosMdsDbTest::UpdateVideoL( CStifItemParser& aItem ) { - PrepareMdsL( aItem ); + mdsoperationreturns = NextIntOrZero( aItem ); + mdsoperationleaves = NextIntOrZero( aItem ); + mdeobjectopenresult = NextIntOrZero( aItem ); CMPXMedia* media = CMPXMedia::NewL(); CleanupStack::PushL(media); @@ -292,30 +312,63 @@ return KErrNone; } -TInt CVcxMyVideosMdsDbTest::CreateVideoListL( CStifItemParser& aItem ) +TInt CVcxMyVideosMdsDbTest::CreateVideoListL( CStifItemParser& ) + { + TVcxMyVideosSortingOrder sortingorder = ( TVcxMyVideosSortingOrder ) 0; + + CMPXMedia* videoList( NULL ); + CMPXMedia* localvideoList( NULL ); + CMPXMediaArray* mediaArray( NULL ); + + + iMdsDb->CreateVideoListL( sortingorder, 0, 0, videoList ); + + return KErrNone; + } + +TInt CVcxMyVideosMdsDbTest::DoCreateVideoListL( CStifItemParser& aItem ) { - TVcxMyVideosSortingOrder sortingorder = ( TVcxMyVideosSortingOrder ) NextIntOrZero( aItem ); - TBool ascending = NextIntOrZero( aItem ); - TBool fullDetails = NextIntOrZero( aItem ); - TBool docreate = NextIntOrZero( aItem ); + TBool bitmask = NextIntOrZero( aItem ); + TBool storelist = NextIntOrZero( aItem ); + TBool ascending = bitmask & 0x01; + TBool fullDetails = bitmask & 0x02; + TBool docreate = bitmask & 0x04; + TBool fetchongoing = bitmask & 0x08; + + TVcxMyVideosSortingOrder sortingorder = ( TVcxMyVideosSortingOrder ) ( bitmask >> 4 ); + CMPXMedia* videoList( NULL ); + CMPXMedia* localvideoList( NULL ); CMPXMediaArray* mediaArray( NULL ); if ( docreate ) { - videoList = CMPXMedia::NewL(); - CleanupStack::PushL( videoList ); + localvideoList = CMPXMedia::NewL(); + CleanupStack::PushL( localvideoList ); mediaArray = CMPXMediaArray::NewL(); - videoList->SetCObjectValueL( KMPXMediaArrayContents, mediaArray ); CleanupStack::PushL( mediaArray ); + localvideoList->SetCObjectValueL( KMPXMediaArrayContents, mediaArray ); + CleanupStack::PopAndDestroy( mediaArray ); + + videoList = localvideoList; } - iMdsDb->CreateVideoListL( sortingorder, ascending, fullDetails, videoList ); + if ( fetchongoing ) + { + iMdsDb->DoCreateVideoListL( sortingorder, ascending, fullDetails, videoList ); + iMdsDb->iVideoListFetchingIsOngoing = fetchongoing; + } + + iMdsDb->DoCreateVideoListL( sortingorder, ascending, fullDetails, videoList ); if ( docreate ) { - CleanupStack::PopAndDestroy( videoList ); + CleanupStack::PopAndDestroy( localvideoList ); + } + else if ( storelist ) + { + iVideoList = videoList; } else { @@ -327,20 +380,110 @@ TInt CVcxMyVideosMdsDbTest::CreateVideoL( CStifItemParser& aItem ) { - PrepareMdsL( aItem ); + mdsoperationreturns = NextIntOrZero( aItem ); + mdsoperationleaves = NextIntOrZero( aItem ); + TBool fulldetails = NextIntOrZero( aItem ); + TUint32 id = NextIntOrZero( aItem ); - TUint32 aId; - TBool aFullDetails = ETrue; - CMPXMedia* media = iMdsDb->CreateVideoL( aId, aFullDetails ); + CMPXMedia* media ( NULL ); + media = iMdsDb->CreateVideoL( id, fulldetails ); delete media; return KErrNone; } +TInt CVcxMyVideosMdsDbTest::HandleQueryNewResultsL( CStifItemParser& aItem ) + { + querycountresult = NextIntOrZero( aItem ); + propertyisnull = NextIntOrZero( aItem ); + propertynotdefined = NextIntOrZero( aItem ); + handledbeventleave = NextIntOrZero( aItem ); + + TInt firstnewitemindex = NextIntOrZero( aItem ); + TInt newitemcount = NextIntOrZero( aItem ); + + + iMdsDb->HandleQueryNewResults( *(CMdEQuery*) NULL, firstnewitemindex, newitemcount ); + + return KErrNone; + } + +TInt CVcxMyVideosMdsDbTest::HandleQueryCompletedL( CStifItemParser& ) + { + CMdEQuery* query ( NULL ); + iMdsDb->HandleQueryCompleted( *query, 0 ); + return KErrNone; + } + +TInt CVcxMyVideosMdsDbTest::AsyncHandleQueryCompletedL( CStifItemParser& aItem ) + { + TInt a = NextIntOrZero( aItem ); + TInt b = NextIntOrZero( aItem ); + TInt ret = CVcxMyVideosMdsDb::AsyncHandleQueryCompleted( iMdsDb ); + return KErrNone; + } + +TInt CVcxMyVideosMdsDbTest::HandleSessionErrorL( CStifItemParser& aItem ) + { + iMdsDb->iVideoListFetchingIsOngoing = NextIntOrZero( aItem ); + TUint32 err = NextIntOrZero( aItem ); + + CMdESession* cmdesession ( NULL ); + iMdsDb->HandleSessionError( *cmdesession, err ); + return KErrNone; + } + +TInt CVcxMyVideosMdsDbTest::HandleObjectNotificationL( CStifItemParser& aItem ) + { + TInt notificationtype = NextIntOrZero( aItem ); + handledbeventleave = NextIntOrZero( aItem ); + + RArray ids; + ids.Append( 0 ); + ids.Append( 1 ); + ids.Append( 2 ); + + iMdsDb->HandleObjectNotification( *(CMdESession*)0, ( TObserverNotificationType )notificationtype, ids ); + return KErrNone; + } + +TInt CVcxMyVideosMdsDbTest::HandleObjectPresentNotification( CStifItemParser& aItem ) + { + TInt a = NextIntOrZero( aItem ); + CMdESession* cmdesession ( NULL ); + RArray ids; + ids.Append( 0 ); + ids.Append( 1 ); + ids.Append( 2 ); + handledbeventleave = NextIntOrZero(aItem); + iMdsDb->HandleObjectPresentNotification( *cmdesession, a, ids ); + return KErrNone; + } + +TInt CVcxMyVideosMdsDbTest::ShutdownNotificationL( CStifItemParser& aItem ) + { + TInt a = NextIntOrZero( aItem ); + iMdsDb->ShutdownNotification( a ); + return KErrNone; + } void CVcxMyVideosMdsDbTest::PrepareMdsL( CStifItemParser& aItem ) { mdsoperationreturns = NextIntOrZero( aItem ); - - mdsoperationleaves = NextIntOrZero( aItem ); + mdsoperationleaves = NextIntOrZero( aItem ); } +void CVcxMyVideosMdsDbTest::HandleMyVideosDbEvent( TMPXChangeEventType , RArray& ) + { + if ( handledbeventleave ) + { + User::Leave( handledbeventleave ); + } + } + +void CVcxMyVideosMdsDbTest::HandleCreateVideoListResp( CMPXMedia* aVideoList, TInt aNewItemsStartIndex, TBool aComplete ) + { + if ( handledbeventleave ) + { + User::Leave( handledbeventleave ); + } + } diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/src/mdeobject.cpp --- a/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/src/mdeobject.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/src/mdeobject.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -23,6 +23,8 @@ #include #include +#include "VcxMyVideosMdsDbTest.h" + ////////////////////////////// // // // TMdEObject // @@ -173,12 +175,19 @@ EXPORT_C TInt CMdEObject::Property(const CMdEPropertyDef& aDef, CMdEProperty*& aProperty, TInt aStartAt) const { + if ( test->propertynotdefined ) + { + return KErrNotFound; + } if( !iProperty ) { iProperty = new CMdEProperty(); } - aProperty = iProperty; + if ( test->propertyisnull ) + { + aProperty = NULL; + } } EXPORT_C CMdEProperty& CMdEObject::AddBoolPropertyL(CMdEPropertyDef& aDef, TBool aValue) @@ -296,6 +305,14 @@ EXPORT_C TBool CMdEObject::OpenForModifications() const { + if ( test->mdeobjectopenresult ) + { + return EFalse; + } + else + { + return ETrue; + } } void CMdEObject::ClearObject( TBool aClearFlags ) diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/src/mdeobjectquery.cpp --- a/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/src/mdeobjectquery.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/src/mdeobjectquery.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -39,10 +39,18 @@ CMdEObjectQuery::~CMdEObjectQuery() { + delete iCMdEObject; } EXPORT_C CMdEObject& CMdEObjectQuery::Result(TInt aIndex) const { + if ( !iCMdEObject ) + { + const TPtrC ptr = KNullDesC(); + iCMdEObject = CMdEObject::NewL( * ( CMdEObjectDef* )NULL,ptr, 0 ); + } + + return *iCMdEObject; } EXPORT_C CMdEObjectDef& CMdEObjectQuery::ObjectDef() const diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/src/mdequery.cpp --- a/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/src/mdequery.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/src/mdequery.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -17,12 +17,13 @@ #include "mdequery.h" - #include "mdeorderrule.h" #include "mdeinstanceitem.h" #include "mdelogiccondition.h" #include "mdenamespacedef.h" +#include "VcxMyVideosMdsDbTest.h" + CMdEQuery::CMdEQuery(TQueryType aType, CMdESession& aSession, CMdENamespaceDef& aNamespaceDef) : iQueryId( 0 ), iSession(aSession), iNamespaceDef(aNamespaceDef), iType(aType), @@ -114,6 +115,7 @@ EXPORT_C TInt CMdEQuery::Count() const { + return test->querycountresult; } EXPORT_C CMdEItem& CMdEQuery::ResultItem(TInt aIndex) const diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/src/mdesessionimpl.cpp --- a/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/src/mdesessionimpl.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/src/mdesessionimpl.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -41,31 +41,31 @@ // for CleanupResetAndDestroyPushL #include -CMdESessionAsyncHandler* CMdESessionAsyncHandler::NewL(MMdESessionObserver& aObserver) +CMdeSessionStartTimer* CMdeSessionStartTimer::NewL(MMdESessionObserver& aObserver) { - CMdESessionAsyncHandler* self = new CMdESessionAsyncHandler( aObserver ); + CMdeSessionStartTimer* self = new CMdeSessionStartTimer( aObserver ); CleanupStack::PushL(self); self->ConstructL(); CleanupStack::Pop(self); return self; } -void CMdESessionAsyncHandler::ConstructL() +void CMdeSessionStartTimer::ConstructL() { CTimer::ConstructL(); } -CMdESessionAsyncHandler::~CMdESessionAsyncHandler() +CMdeSessionStartTimer::~CMdeSessionStartTimer() { Cancel(); } -void CMdESessionAsyncHandler::RunL() +void CMdeSessionStartTimer::RunL() { iObserver.HandleSessionOpened(*(CMdESession*) 0 ,test->mdssessionasyncerror); } -CMdESessionAsyncHandler::CMdESessionAsyncHandler(MMdESessionObserver& aObserver) +CMdeSessionStartTimer::CMdeSessionStartTimer(MMdESessionObserver& aObserver) : CTimer( CActive::EPriorityStandard ), iObserver( aObserver ) { CActiveScheduler::Add(this); @@ -75,7 +75,7 @@ : iSessionStartupAO( NULL ), iSessionObserver(&aObserver), iSchemaBuffer( NULL ), iNextQueryId( 0 ) { - iTimer = CMdESessionAsyncHandler::NewL( aObserver ); + iTimer = CMdeSessionStartTimer::NewL( aObserver ); iTimer->After( 1000 ); } diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/src/vcxmyvideoscollectionutil.cpp --- a/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/src/vcxmyvideoscollectionutil.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/src/vcxmyvideoscollectionutil.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -94,6 +94,12 @@ } // --------------------------------------------------------------------------- +// TVcxMyVideosCollectionUtil::AppendToListL +// New items in aToList will point to same shared memory as items in aFromList. +// --------------------------------------------------------------------------- +// +void TVcxMyVideosCollectionUtil::AppendToListL( CMPXMedia& aToList, CMPXMedia& aFromList ) + {} // This helper function converts drive letter to drive number // --------------------------------------------------------------------------- // @@ -127,6 +133,11 @@ } // ---------------------------------------------------------------------------- +// TVcxMyVideosCollectionUtil::CreationDateL +// ---------------------------------------------------------------------------- +// +TInt64 TVcxMyVideosCollectionUtil::CreationDateL( CMPXMedia& aVideo ) + {} // TVcxMyVideosCollectionUtil::DownloadIdL // ---------------------------------------------------------------------------- // @@ -146,7 +157,7 @@ // TVcxMyVideosCollectionUtil::IdL // ---------------------------------------------------------------------------- // -TMPXItemId TVcxMyVideosCollectionUtil::IdL( CMPXMedia& aVideo ) +TMPXItemId TVcxMyVideosCollectionUtil::IdL( const CMPXMedia& aVideo ) { } @@ -165,7 +176,7 @@ // TVcxMyVideosCollectionUtil::Title // ---------------------------------------------------------------------------- // -const TDesC& TVcxMyVideosCollectionUtil::Title( CMPXMedia& aVideo ) +const TDesC& TVcxMyVideosCollectionUtil::Title( const CMPXMedia& aVideo ) { } @@ -211,6 +222,31 @@ { } +// ---------------------------------------------------------------------------- +// TVcxMyVideosCollectionUtil::MediaArrayL +// ---------------------------------------------------------------------------- +// +CMPXMediaArray* TVcxMyVideosCollectionUtil::MediaArrayL( const CMPXMedia& aMedia ) + {} +// ---------------------------------------------------------------------------- +// TVcxMyVideosCollectionUtil::Int32ValueL +// ---------------------------------------------------------------------------- +// +TInt32 TVcxMyVideosCollectionUtil::Int32ValueL( CMPXMedia& aMedia ) + {} +// ---------------------------------------------------------------------------- +// TVcxMyVideosCollectionUtil::Uint32ValueL +// ---------------------------------------------------------------------------- +// +TUint32 TVcxMyVideosCollectionUtil::Uint32ValueL( CMPXMedia& aMedia ) + {} +// ---------------------------------------------------------------------------- +// TVcxMyVideosCollectionUtil::GetIdsFromMediaArrayL +// ---------------------------------------------------------------------------- +// +void TVcxMyVideosCollectionUtil::GetIdsFromMediaArrayL( CMPXMediaArray& aMediaArray, + RArray& aIdArray ) + {} #ifdef _DEBUG // ---------------------------------------------------------------------------- // TVcxMyVideosCollectionUtil::PrintOpenFileHandlesL diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/src/vcxmyvideosmdsalbums.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/src/vcxmyvideosmdsalbums.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -0,0 +1,366 @@ +/* +* 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: Provides albums support utilizing MDS. +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "vcxmyvideosmdsalbums.h" + +#include +#include +#include +#include +#include +#include +#include "vcxmyvideosalbum.h" + +#define protected public +#define private public +#include "vcxmyvideosmdsdb.h" +#undef private +#undef protected + +#include "vcxmyvideoscollectionutil.h" +#include "vcxmyvideosmdscmdqueue.h" + +// ============================ MEMBER FUNCTIONS ============================= + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CVcxMyVideosMdsAlbums::CVcxMyVideosMdsAlbums( CVcxMyVideosMdsDb& aMdsDb, + MVcxMyVideosMdsAlbumsObserver* aObserver ) +: CActive( EPriorityStandard ), iMdsDb( aMdsDb ), iObserver(aObserver) + { + } + +// --------------------------------------------------------------------------- +// 2nd-phase constructor +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::ConstructL() + { + GetSchemaDefinitionsL(); + SetObservingL(); + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// Two-Phase Constructor +// --------------------------------------------------------------------------- +// +CVcxMyVideosMdsAlbums* CVcxMyVideosMdsAlbums::NewL( CVcxMyVideosMdsDb& aMdsDb, + MVcxMyVideosMdsAlbumsObserver* aObserver ) + { + CVcxMyVideosMdsAlbums* self = new(ELeave) CVcxMyVideosMdsAlbums( aMdsDb, aObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CVcxMyVideosMdsAlbums::~CVcxMyVideosMdsAlbums() + { + CancelQueries(); + delete iAlbumQuery; + delete iVideoQuery; + delete iRelationQuery; + iItemArray.Close(); + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::CancelQueries +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::CancelQueries( CVcxMyVideosMdsDb::TRequestType aType ) + { + } + +// --------------------------------------------------------------------------- +// From CActive +// CVcxMyVideosMdsAlbums::DoCancel +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::DoCancel() + { + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::SetObservingL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::SetObservingL() + { + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::GetAlbumsL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::GetAlbumsL( CMPXMedia* aAlbumList, + MVcxMyVideosMdsAlbumsObserver& aClient ) + { + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::GetAlbumL +// --------------------------------------------------------------------------- +// +CMPXMedia* CVcxMyVideosMdsAlbums::GetAlbumL( TUint32 aId ) + { + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::DoGetAlbumsL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::DoGetAlbumsL( CMPXMedia* aAlbumList, + MVcxMyVideosMdsAlbumsObserver& aClient ) + { + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::GetAlbumContentIdsL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::GetAlbumContentIdsL( TUint32 aAlbumId, + RArray& aContentArray, + MVcxMyVideosMdsAlbumsObserver& aClient ) + { + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::DoGetAlbumContentIdsL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::DoGetAlbumContentIdsL( TUint32 aAlbumId, + RArray& aContentArray, + MVcxMyVideosMdsAlbumsObserver& aClient ) + { + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::GetAlbumContentVideosL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::GetAlbumContentVideosL( TUint32 aAlbumId, CMPXMedia& aVideoList, + MVcxMyVideosMdsAlbumsObserver& aClient ) + { + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::DoGetAlbumContentVideosL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::DoGetAlbumContentVideosL( TUint32 aAlbumId, CMPXMedia& aVideoList, + MVcxMyVideosMdsAlbumsObserver& aClient ) + { + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::GetSchemaDefinitionsL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::GetSchemaDefinitionsL() + { + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::Object2MediaL +// For album objects only. +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::Object2MediaL( + CMdEObject& aObject, + CMPXMedia& aAlbum ) + { + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::Media2ObjectL +// Called by AddAlbumL() +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::Media2ObjectL( + CMPXMedia& aAlbum, + CMdEObject& aObject) + { + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::GetSchemaDefinitionsL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::HandleQueryNewResults(CMdEQuery& aQuery, + TInt aFirstNewItemIndex, + TInt aNewItemCount ) + { + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::HandleQueryCompleted +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::HandleQueryCompleted( CMdEQuery& aQuery, TInt aError ) + { + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::HandleAlbumQueryCompletedL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::HandleAlbumQueryCompletedL( CMdEQuery& /*aQuery*/, TInt aError ) + { + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::HandleVideoQueryCompletedL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::HandleVideoQueryResultsL( CMdEQuery& /*aQuery*/, TInt aError, + TInt aFirstNewItemIndex, TInt aNewItemCount, TBool aComplete ) + { + + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::HandleRelationQueryCompletedL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::HandleRelationQueryCompletedL( CMdEQuery& /*aQuery*/, TInt aError ) + { + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::AddVideosToAlbumL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::AddVideosToAlbumL( CMPXMedia* aCmd, + MVcxMyVideosMdsAlbumsObserver& aClient ) + { + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::DoAddVideosToAlbumL +// Called by iMdsDb.iCmdQueue +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::DoAddVideosToAlbumL( CMPXMedia* aCmd, + MVcxMyVideosMdsAlbumsObserver& aClient ) + { + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::RemoveRelationsL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::RemoveRelationsL( RArray& aRelationIds, + RArray& aResults, MVcxMyVideosMdsAlbumsObserver& aClient ) + { + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::DoRemoveRelationsL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::DoRemoveRelationsL( RArray& aRelationIds, + RArray& aResults, MVcxMyVideosMdsAlbumsObserver& aClient ) + { + } + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::AddAlbumL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::AddAlbumL( CMPXMedia& aAlbum ) + {} + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::SetAlbumL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::SetAlbumL( CMPXMedia& aVideo ) + {} + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::RemoveAlbumsL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::RemoveAlbumsL( CMPXMedia* aMpxCmd, MVcxMyVideosMdsAlbumsObserver& aClient ) + {} + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::DoRemoveAlbumsL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::DoRemoveAlbumsL( CMPXMedia* aMpxCmd, + MVcxMyVideosMdsAlbumsObserver& aClient ) + {} + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::RunL +// From CActive. +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::RunL() + {} + +//TODO: implement RunError + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::HandleAddVideosToAlbumCompletedL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::HandleAddVideosToAlbumCompletedL() + {} + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::HandleRemoveRelationsCompletedL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::HandleRemoveRelationsCompletedL() + {} + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::HandleRemoveAlbumsCompletedL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::HandleRemoveAlbumsCompletedL() + {} + +// ---------------------------------------------------------------------------- +// CVcxMyVideosMdsAlbums::HandleRelationItemNotification +// From MMdERelationItemObserver +// ---------------------------------------------------------------------------- +// +void CVcxMyVideosMdsAlbums::HandleRelationItemNotification(CMdESession& /*aSession*/, + TObserverNotificationType aType, + const RArray& aRelationArray) + {} diff -r 8f0df5c82986 -r 67eb01668b0e videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/src/vcxmyvideosmdscmdqueue.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videocollection/mpxmyvideoscollection/tsrc/ut_vcxmyvideosmdsdb/src/vcxmyvideosmdscmdqueue.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -0,0 +1,103 @@ +/* +* 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: Queues commands to MDS. +* +*/ + + +// INCLUDE FILES +#include +#include +#include "vcxmyvideosmdscmdqueue.h" + +#include +#include +#include +#include +#include +#include +#include "vcxmyvideosalbum.h" + +#define protected public +#define private public +#include "vcxmyvideosmdsdb.h" +#undef private +#undef protected + +// ============================ MEMBER FUNCTIONS ============================= + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CVcxMyVideosMdsCmdQueue::CVcxMyVideosMdsCmdQueue( CVcxMyVideosMdsDb& aMdsDb ) +: iMdsDb( aMdsDb ) + { + } + +// --------------------------------------------------------------------------- +// 2nd-phase constructor +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsCmdQueue::ConstructL() + {} + +// --------------------------------------------------------------------------- +// Two-Phase Constructor +// --------------------------------------------------------------------------- +// +CVcxMyVideosMdsCmdQueue* CVcxMyVideosMdsCmdQueue::NewL( CVcxMyVideosMdsDb& aMdsDb ) + { + CVcxMyVideosMdsCmdQueue* self = new(ELeave) CVcxMyVideosMdsCmdQueue( aMdsDb ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CVcxMyVideosMdsCmdQueue::~CVcxMyVideosMdsCmdQueue() + {} + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsCmdQueue::Cancel +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsCmdQueue::Cancel( CVcxMyVideosMdsDb::TRequestType aType ) + {} + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsCmdQueue::ExecuteCmdL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsCmdQueue::ExecuteCmdL( CVcxMyVideosMdsCmd* aCmd ) + {} + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsCmdQueue::CmdFinished +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsCmdQueue::CmdFinished() + {} + +// --------------------------------------------------------------------------- +// CVcxMyVideosMdsCmdQueue::DoExecuteCmdL +// --------------------------------------------------------------------------- +// +void CVcxMyVideosMdsCmdQueue::DoExecuteCmdL( CVcxMyVideosMdsCmd* aCmd ) + {} +// END OF FILE diff -r 8f0df5c82986 -r 67eb01668b0e videoplayback/inc/mpxvideobaseplaybackview.h --- a/videoplayback/inc/mpxvideobaseplaybackview.h Tue May 25 12:44:54 2010 +0300 +++ b/videoplayback/inc/mpxvideobaseplaybackview.h Wed Jun 09 09:44:23 2010 +0300 @@ -16,7 +16,7 @@ */ -// Version : %version: 22 % +// Version : %version: 23 % // This file defines the API for VideoBasePlaybackView.dll @@ -287,6 +287,10 @@ TBool IsMultiItemPlaylist(); + virtual void SendWindowCommandL( TMPXVideoPlaybackCommand aCmd ); + + virtual void HandlePdlReloadComplete(); + private: /** @@ -352,8 +356,6 @@ void HandleRealOneBitmapTimeoutL(); - void SendWindowCommandL( TMPXVideoPlaybackCommand aCmd ); - TBool IsInMemoryPlugin(); #ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API diff -r 8f0df5c82986 -r 67eb01668b0e videoplayback/inc/mpxvideopdlplaybackview.h --- a/videoplayback/inc/mpxvideopdlplaybackview.h Tue May 25 12:44:54 2010 +0300 +++ b/videoplayback/inc/mpxvideopdlplaybackview.h Wed Jun 09 09:44:23 2010 +0300 @@ -16,7 +16,7 @@ */ -// Version : %version: 7 % +// Version : %version: 8 % // This file defines the API for VideoPlaybackView.dll @@ -75,6 +75,10 @@ void HandleInitializingStateL( TMPXPlaybackState aLastState ); + void SendWindowCommandL( TMPXVideoPlaybackCommand aCmd ); + + void HandlePdlReloadComplete(); + private: CMPXVideoPdlPlaybackView(); @@ -91,6 +95,7 @@ TMPXPlaybackPdDownloadState iPdlState; TInt iDownloadSize; + TBool iUserInputsBlocked; }; #endif // __VIDEOPDLPLAYBACKVIEW_H__ diff -r 8f0df5c82986 -r 67eb01668b0e videoplayback/inc/mpxvideoplaybackcontrolscontroller.h --- a/videoplayback/inc/mpxvideoplaybackcontrolscontroller.h Tue May 25 12:44:54 2010 +0300 +++ b/videoplayback/inc/mpxvideoplaybackcontrolscontroller.h Wed Jun 09 09:44:23 2010 +0300 @@ -16,7 +16,7 @@ */ -// Version : %version: 17 % +// Version : %version: 18 % #ifndef MPXVIDEOPLAYBACKCONTROLSCONTROLLER_H_ @@ -374,6 +374,7 @@ TFileName iBitmapFileName; TBool iTvOutConnected; + TBool iShowControls; TBool iRNFormat; #ifdef RD_TACTILE_FEEDBACK diff -r 8f0df5c82986 -r 67eb01668b0e videoplayback/inc/mpxvideoplaybackuserinputhandler.h --- a/videoplayback/inc/mpxvideoplaybackuserinputhandler.h Tue May 25 12:44:54 2010 +0300 +++ b/videoplayback/inc/mpxvideoplaybackuserinputhandler.h Wed Jun 09 09:44:23 2010 +0300 @@ -16,7 +16,7 @@ */ -// Version : %version: 8 % +// Version : %version: 9 % #ifndef MPXVIDEOPLAYBACKUSERINPUTHANDLER_H_ @@ -44,13 +44,12 @@ class CMPXVideoPlaybackUserInputHandler : public CBase, public MRemConCoreApiTargetObserver { - public: // Constructors and destructor /** * Two-phased constructor. */ - IMPORT_C static CMPXVideoPlaybackUserInputHandler* NewL(CMPXVideoPlaybackContainer* iContainer ); + IMPORT_C static CMPXVideoPlaybackUserInputHandler* NewL( CMPXVideoPlaybackContainer* iContainer ); /** * Destructor. @@ -62,7 +61,7 @@ /** * C++ default constructor. */ - CMPXVideoPlaybackUserInputHandler(CMPXVideoPlaybackContainer* iContainer); + CMPXVideoPlaybackUserInputHandler( CMPXVideoPlaybackContainer* iContainer ); /** * Symbian 2nd phase constructor. @@ -77,11 +76,11 @@ void ProcessKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType ); - void ProcessMediaKey(TRemConCoreApiOperationId aOperationId, - TRemConCoreApiButtonAction aButtonAct); + void ProcessMediaKey( TRemConCoreApiOperationId aOperationId, + TRemConCoreApiButtonAction aButtonAct ); - void DoHandleMediaKey(TRemConCoreApiOperationId aOperationId, - TRemConCoreApiButtonAction aButtonAct); + void DoHandleMediaKey( TRemConCoreApiOperationId aOperationId, + TRemConCoreApiButtonAction aButtonAct ); // From MRemConCoreApiTargetObserver /** @@ -91,20 +90,26 @@ */ virtual void MrccatoPlay( TRemConCoreApiPlaybackSpeed aSpeed, - TRemConCoreApiButtonAction aButtonAct); + TRemConCoreApiButtonAction aButtonAct ); virtual void MrccatoCommand( TRemConCoreApiOperationId aOperationId, - TRemConCoreApiButtonAction aButtonAct); + TRemConCoreApiButtonAction aButtonAct ); /** * Setter method for iForeground * @param aForeground - the value to be set * @return void */ - void SetForeground(TBool aForeground); + void SetForeground( TBool aForeground ); - private: + /* + * Function will block all user inputs until the new PDL command is received + * @param aBlockInputs - the value to be set + */ + void BlockPdlUserInputs( TBool aBlockInputs ); + + private: /** * Handles volume repeat timer timout * @return TInt @@ -117,33 +122,36 @@ */ void HandleVolumeRepeatL(); - void HandleFastForward(TRemConCoreApiButtonAction aButtonAct); + void HandleFastForward( TRemConCoreApiButtonAction aButtonAct ); - void HandleRewind(TRemConCoreApiButtonAction aButtonAct); + void HandleRewind( TRemConCoreApiButtonAction aButtonAct ); - void HandleVolumeUp(TRemConCoreApiButtonAction aButtonAct); + void HandleVolumeUp( TRemConCoreApiButtonAction aButtonAct ); - void HandleVolumeDown(TRemConCoreApiButtonAction aButtonAct); + void HandleVolumeDown( TRemConCoreApiButtonAction aButtonAct ); - void ReRoutePointerEventL(CCoeControl* aControl, - const TPointerEvent& aPointerEvent, - TMPXVideoControlType aMPXControl); + void ReRoutePointerEventL( CCoeControl* aControl, + const TPointerEvent& aPointerEvent, + TMPXVideoControlType aMPXControl ); + + TBool IsUserInputAllowed(); private: - TMPXVideoUserInputType iProcessingInputType; // the type of input being processed + TMPXVideoUserInputType iProcessingInputType; // the type of input being processed TUint iLastPressedKeyCode; // keycode of last key that sent EEventKeyDown TInt iLastPressedKeyScanCode; // scancode of last key that sent EEventKeyDown TRemConCoreApiOperationId iLastMediaKeyPressed; // Id of last mediakey thats sent a button-press - CRemConInterfaceSelector* iInterfaceSelector; // Side volume key, owned + CRemConInterfaceSelector* iInterfaceSelector; // Side volume key, owned CRemConCoreApiTarget* iCoreTarget; // Owned by CRemConInterfaceSelector CPeriodic* iVolumeRepeatTimer; // owned TBool iVolumeRepeatUp; TBool iForeground; + TBool iBlockPdlInputs; - CMPXVideoPlaybackContainer* iContainer; // not owned + CMPXVideoPlaybackContainer* iContainer; // not owned CCoeControl* iActiveControlPtr; // not owned TMPXVideoControlType iActiveControlType; }; diff -r 8f0df5c82986 -r 67eb01668b0e videoplayback/videohelix/group/mpxvideohelixplayback.mmp --- a/videoplayback/videohelix/group/mpxvideohelixplayback.mmp Tue May 25 12:44:54 2010 +0300 +++ b/videoplayback/videohelix/group/mpxvideohelixplayback.mmp Wed Jun 09 09:44:23 2010 +0300 @@ -15,7 +15,7 @@ * */ -// Version : %version: 15 % +// Version : %version: 16 % @@ -85,4 +85,6 @@ LIBRARY accpolicy.lib #endif +MACRO USE_S60_DOWNLOAD_MANAGER + // End of File diff -r 8f0df5c82986 -r 67eb01668b0e videoplayback/videohelix/inc/mpxvideodlmgrif.h --- a/videoplayback/videohelix/inc/mpxvideodlmgrif.h Tue May 25 12:44:54 2010 +0300 +++ b/videoplayback/videohelix/inc/mpxvideodlmgrif.h Wed Jun 09 09:44:23 2010 +0300 @@ -15,8 +15,10 @@ * */ -// Version : %version: 9 % +// Version : %version: 12 % + +#ifdef USE_S60_DOWNLOAD_MANAGER #ifndef __MPXVIDEODLMGRIF_H__ #define __MPXVIDEODLMGRIF_H__ @@ -135,6 +137,15 @@ */ TBool IsDownloadPaused(); + /* + * UpdateDownloadSizeL + * + * For DRM protected clips, the download size will be updated using the file handle + * + * @since S60 9.2 + */ + void UpdateDownloadSizeL(); + private: /* * CMPDownloadMgrInterface @@ -220,8 +231,6 @@ void ConvertDMgrStatetoMpxState( TInt32 dmgrState ); - void UpdateDownloadSizeL(); - // // Private Members // Not Owned Data @@ -251,4 +260,6 @@ #endif __MPXVIDEODLMGRIF_H__ +#endif // USE_S60_DOWNLOAD_MANAGER + // End of file diff -r 8f0df5c82986 -r 67eb01668b0e videoplayback/videohelix/inc/mpxvideoplaybackcontroller.h --- a/videoplayback/videohelix/inc/mpxvideoplaybackcontroller.h Tue May 25 12:44:54 2010 +0300 +++ b/videoplayback/videohelix/inc/mpxvideoplaybackcontroller.h Wed Jun 09 09:44:23 2010 +0300 @@ -16,7 +16,7 @@ */ -// Version : %version: 28 % +// Version : %version: 29 % #ifndef _CMPXVIDEOPLAYBACKCONTROLLER_H_ @@ -290,7 +290,9 @@ friend class CMPXProgressiveDLPlaybackMode; friend class CMPXVideoSeeker; +#ifdef USE_S60_DOWNLOAD_MANAGER friend class CMPXVideoDlMgrIf; +#endif // USE_S60_DOWNLOAD_MANAGER friend class CMPXVideoAccessoryObserver; friend class CMpxVideoPlayerUtility; friend class CMPXVideoPosterFrameSetter; diff -r 8f0df5c82986 -r 67eb01668b0e videoplayback/videohelix/inc/mpxvideoplaybackmode.h --- a/videoplayback/videohelix/inc/mpxvideoplaybackmode.h Tue May 25 12:44:54 2010 +0300 +++ b/videoplayback/videohelix/inc/mpxvideoplaybackmode.h Wed Jun 09 09:44:23 2010 +0300 @@ -16,7 +16,7 @@ */ -// Version : %version: 16 % +// Version : %version: 19 % #ifndef _CMPXVIDEOPLAYBACKMODE_H_ @@ -29,7 +29,9 @@ #include #include "mpxhelixplaybackplugindefs.h" +#ifdef USE_S60_DOWNLOAD_MANAGER #include "mpxvideodlmgrif.h" +#endif #include "mpxvideo_debug.h" // @@ -79,7 +81,6 @@ virtual void OpenFile64L( const RFile64& aMediaFile ); #endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API - protected: /* * C++ default constructor @@ -92,15 +93,12 @@ */ virtual void ConstructL( CMPXVideoPlaybackController* aVideoPlaybackCtlr ); - protected: // // Data // CMPXVideoPlaybackController* iVideoPlaybackCtlr; // not owned - CMPXVideoPosterFrameSetter* iPosterFrameSetter; - }; /*******************************************************/ @@ -170,21 +168,49 @@ static CMPXVideoPlaybackMode* NewL( CMPXVideoPlaybackController* aVideoPlaybackCtlr ); virtual ~CMPXProgressiveDLPlaybackMode(); +#ifdef USE_S60_DOWNLOAD_MANAGER + inline virtual TInt GetMode(); void ConnectToDownloadL( CMPXCommand& aCmd ); void HandleOpenComplete(); void GetPdlStatusL( CMPXCommand& aCmd ); void UpdateSeekPosition( TInt64& aPosition ); inline TBool IsDownloadPaused(); + void OpenFileL( const RFile& aMediaFile ); + +#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API + void OpenFile64L( const RFile64& aMediaFile ); +#endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API + +#endif // USE_S60_DOWNLOAD_MANAGER private: - void ConstructL( CMPXVideoPlaybackController* aVideoPlaybackCtlr ); +#ifdef USE_S60_DOWNLOAD_MANAGER private: - CMPXVideoDlMgrIf* iDlMgrIf; // owned + CMPXVideoDlMgrIf* iDlMgrIf; // owned +#endif // USE_S60_DOWNLOAD_MANAGER + }; +#ifdef USE_S60_DOWNLOAD_MANAGER + +inline +TInt CMPXProgressiveDLPlaybackMode::GetMode() +{ + MPX_DEBUG(_L("CMPXProgressiveDLPlaybackMode::GetMode()")); + return EMPXVideoProgressiveDownload; +} + +inline +TBool CMPXProgressiveDLPlaybackMode::IsDownloadPaused() +{ + return iDlMgrIf->IsDownloadPaused(); +} + +#endif // USE_S60_DOWNLOAD_MANAGER + // INLINE METHODS inline @@ -217,22 +243,10 @@ } inline -TInt CMPXProgressiveDLPlaybackMode::GetMode() -{ - MPX_DEBUG(_L("CMPXProgressiveDLPlaybackMode::GetMode()")); - return EMPXVideoProgressiveDownload; -} - -inline TBool CMPXVideoPlaybackMode::IsDownloadPaused() { return EFalse; } -inline -TBool CMPXProgressiveDLPlaybackMode::IsDownloadPaused() -{ - return iDlMgrIf->IsDownloadPaused(); -} #endif //_CMPXVIDEOPLAYBACKMODE_H_ diff -r 8f0df5c82986 -r 67eb01668b0e videoplayback/videohelix/src/mpxvideodlmgrif.cpp --- a/videoplayback/videohelix/src/mpxvideodlmgrif.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videoplayback/videohelix/src/mpxvideodlmgrif.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -16,7 +16,7 @@ */ -// Version : %version: 23 % +// Version : %version: 25 % #include @@ -95,7 +95,6 @@ } } - void CMPXVideoDlMgrIf::ConnectToDownloadL( CMPXCommand& aCmd ) { MPX_ENTER_EXIT(_L("CMPXVideoDlMgrIf::ConnectToDownloadL()")); @@ -120,13 +119,14 @@ // // A new download id has been sent. Reset member variables // - iMoveNeeded = EFalse; - iCurrentDl = NULL; - iDlId = downloadId; - iPlayerOpened = EFalse; - iDlTotalSize = 0; + iMoveNeeded = EFalse; + iCurrentDl = NULL; + iDownloadState = EPbDlStateDownloadCompleted; + iDlId = downloadId; + iPlayerOpened = EFalse; + iDlTotalSize = 0; iDownloadProgress = 0; - iCodDownload = EFalse; + iCodDownload = EFalse; if ( iDlMgrConnected ) { @@ -414,11 +414,6 @@ // error = HandleCustomCommand( EMMFROPControllerSetDownloadSize, iDownloadProgress ); } - - // - // Update download size for DRM protected clips - // - MPX_TRAPD( updateError, UpdateDownloadSizeL() ); } } } @@ -658,9 +653,19 @@ // TReal CMPXVideoDlMgrIf::GetDownloadRatio() { - TReal downloadRatio = (TReal)iDownloadProgress / (TReal)iDlTotalSize; + TReal downloadRatio = 0.0; + + if ( iDownloadState == EPbDlStateDownloadCompleted ) + { + downloadRatio = 100.0; + } + else + { + downloadRatio = (TReal)iDownloadProgress / (TReal)iDlTotalSize; + } + MPX_DEBUG(_L("CMPXVideoDlMgrIf::GetDownloadRatio(%f)"), downloadRatio); - + return downloadRatio; } @@ -671,9 +676,7 @@ TBool CMPXVideoDlMgrIf::IsDownloadPaused() { TBool paused = ( iDownloadState == EPbDlStateDownloadPaused ); - - MPX_DEBUG(_L("CMPXVideoDlMgrIf::GetDownloadRatio(%d)"), paused); - + MPX_DEBUG(_L("CMPXVideoDlMgrIf::IsDownloadPaused(%d)"), paused); return paused; } diff -r 8f0df5c82986 -r 67eb01668b0e videoplayback/videohelix/src/mpxvideoplaybackmode.cpp --- a/videoplayback/videohelix/src/mpxvideoplaybackmode.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videoplayback/videohelix/src/mpxvideoplaybackmode.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -16,7 +16,7 @@ */ -// Version : %version: 29 % +// Version : %version: 32 % // @@ -70,7 +70,7 @@ CMPXVideoPlaybackMode::~CMPXVideoPlaybackMode() { MPX_DEBUG(_L("CMPXVideoPlaybackMode::~CMPXVideoPlaybackMode()")); - + if ( iPosterFrameSetter ) { delete iPosterFrameSetter; @@ -223,6 +223,12 @@ MPX_TRAPD( err, iVideoPlaybackCtlr->iState->SendErrorToViewL( KMPXVideoCallOngoingError ) ); } + else if ( iVideoPlaybackCtlr->IsKeyLocked() && + iVideoPlaybackCtlr->iFileDetails->iVideoEnabled ) + { + // playback not allowed for the clip having video if keylock is true + // Let playAllowed remain false + } else { playAllowed = ETrue; @@ -287,7 +293,7 @@ // ------------------------------------------------------------------------------------------------ void CMPXVideoPlaybackMode::HandleFrameReady(TInt /*aError*/) { - MPX_DEBUG(_L("CMPXLocalPlaybackMode::HandleFrameReady()")); + MPX_DEBUG(_L("CMPXLocalPlaybackMode::HandleFrameReady()")); } //************************************************************************************************// // CMPXLocalPlaybackMode @@ -311,7 +317,7 @@ void CMPXLocalPlaybackMode::HandleSetPosterFrame() { MPX_DEBUG(_L("CMPXLocalPlaybackMode::HandleSetPosterFrame()")); - + // create poster frame setter if it does not already exist if ( ! iPosterFrameSetter ) { @@ -321,13 +327,13 @@ if ( iPosterFrameSetter ) { iPosterFrameSetter->RequestPosterFrame(); - } + } } void CMPXLocalPlaybackMode::HandleFrameReady(TInt aError) { - MPX_DEBUG(_L("CMPXLocalPlaybackMode::HandleFrameReady()")); - + MPX_DEBUG(_L("CMPXLocalPlaybackMode::HandleFrameReady()")); + iPosterFrameSetter->HandlePosterFrameReady(aError); } @@ -423,6 +429,12 @@ MPX_TRAPD(err, iVideoPlaybackCtlr->iState->SendErrorToViewL( KMPXVideoCallOngoingError )); } + else if ( iVideoPlaybackCtlr->IsKeyLocked() && + iVideoPlaybackCtlr->iFileDetails->iVideoEnabled ) + { + // playback not allowed for the clip having video if keylock is true + // Let playAllowed remain false + } else { MPX_TRAPD( err, @@ -557,23 +569,31 @@ { iVideoPlaybackCtlr = aVideoPlaybackCtlr; +#ifdef USE_S60_DOWNLOAD_MANAGER // // Create the Download Mgr Interface // iDlMgrIf = CMPXVideoDlMgrIf::NewL( iVideoPlaybackCtlr ); +#endif // USE_S60_DOWNLOAD_MANAGER + } CMPXProgressiveDLPlaybackMode::~CMPXProgressiveDLPlaybackMode() { MPX_DEBUG(_L("CMPXProgressiveDLPlaybackMode::~CMPXProgressiveDLPlaybackMode()")); +#ifdef USE_S60_DOWNLOAD_MANAGER if ( iDlMgrIf ) { delete iDlMgrIf; iDlMgrIf = NULL; } +#endif // USE_S60_DOWNLOAD_MANAGER + } +#ifdef USE_S60_DOWNLOAD_MANAGER + // ------------------------------------------------------------------------------------------------ // CMPXProgressiveDLPlaybackMode::ConnectToDownloadL() // ------------------------------------------------------------------------------------------------ @@ -637,4 +657,30 @@ KErrNone ); } +// ------------------------------------------------------------------------------------------------ +// CMPXProgressiveDLPlaybackMode::OpenFileL() +// ------------------------------------------------------------------------------------------------ +void CMPXProgressiveDLPlaybackMode::OpenFileL( const RFile& aMediaFile ) +{ + MPX_ENTER_EXIT(_L("CMPXProgressiveDLPlaybackMode::OpenFileL()")); + + iDlMgrIf->UpdateDownloadSizeL(); + CMPXVideoPlaybackMode::OpenFileL( aMediaFile ); +} + +#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API +// ------------------------------------------------------------------------------------------------ +// CMPXProgressiveDLPlaybackMode::OpenFile64L() +// ------------------------------------------------------------------------------------------------ +void CMPXProgressiveDLPlaybackMode::OpenFile64L( const RFile64& aMediaFile ) +{ + MPX_ENTER_EXIT(_L("CMPXProgressiveDLPlaybackMode::OpenFile64L( RFile64 )")); + + iDlMgrIf->UpdateDownloadSizeL(); + CMPXVideoPlaybackMode::OpenFile64L( aMediaFile ); +} +#endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API + +#endif // USE_S60_DOWNLOAD_MANAGER + // End of file diff -r 8f0df5c82986 -r 67eb01668b0e videoplayback/videohelix/src/mpxvideoplaybackstate.cpp --- a/videoplayback/videohelix/src/mpxvideoplaybackstate.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videoplayback/videohelix/src/mpxvideoplaybackstate.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -16,7 +16,7 @@ */ -// Version : %version: 43 % +// Version : %version: 44 % // @@ -1795,7 +1795,7 @@ if ( aError == KErrNone ) { - if ( iVideoPlaybackCtlr->iAppInForeground ) + if ( iVideoPlaybackCtlr->iPlaybackMode->CanPlayNow() ) { iVideoPlaybackCtlr->ChangeState( EMPXVideoPlaying ); diff -r 8f0df5c82986 -r 67eb01668b0e videoplayback/videohelix/tsrc/ut_videohelixtest/conf/videohelixtest.cfg --- a/videoplayback/videohelix/tsrc/ut_videohelixtest/conf/videohelixtest.cfg Tue May 25 12:44:54 2010 +0300 +++ b/videoplayback/videohelix/tsrc/ut_videohelixtest/conf/videohelixtest.cfg Wed Jun 09 09:44:23 2010 +0300 @@ -54,6 +54,7 @@ ERFile 1 ERFile64 0 +EMPXVideoLocal 0 [Enddefine] @@ -883,3 +884,32 @@ delete test pause 1000 [Endtest] + +[Test] +title 61. InitialiseL link via 32-bit file handle +create videohelixtest test +test InitializeStreamingWithSdpFileHandleL ERFile 60000 10 sdp_test.sdp KErrNone KErrNone KErrNone +waittestclass test +delete test +pause 1000 +[Endtest] + +[Test] +title 62. InitialiseL link via 64-bit file handle +create videohelixtest test +test InitializeStreamingWithSdpFileHandleL ERFile64 60000 10 sdp_test.sdp KErrNone KErrNone KErrNone +waittestclass test +delete test +pause 1000 +[Endtest] + +[Test] +title 63. Retrieve FileName and playback mode -- Custom Commands EPbCmdInitView +create videohelixtest test +test Initialize 60000 10 vhpp_test.3gp KErrNone KErrNone KErrNone +waittestclass test +test RetrieveFileNameAndModeL vhpp_test.3gp EMPXVideoLocal +pause 1000 +delete test +pause 1000 +[Endtest] diff -r 8f0df5c82986 -r 67eb01668b0e videoplayback/videohelix/tsrc/ut_videohelixtest/group/videohelixtest.mmp --- a/videoplayback/videohelix/tsrc/ut_videohelixtest/group/videohelixtest.mmp Tue May 25 12:44:54 2010 +0300 +++ b/videoplayback/videohelix/tsrc/ut_videohelixtest/group/videohelixtest.mmp Wed Jun 09 09:44:23 2010 +0300 @@ -15,7 +15,7 @@ * */ -// Version : %version: 9 % +// Version : %version: 10 % @@ -93,4 +93,6 @@ LIBRARY hwrmlightclient.lib // Lights control LIBRARY fbscli.lib +MACRO USE_S60_DOWNLOAD_MANAGER + // End of File diff -r 8f0df5c82986 -r 67eb01668b0e videoplayback/videohelix/tsrc/ut_videohelixtest/inc/dlmgr_stub.h --- a/videoplayback/videohelix/tsrc/ut_videohelixtest/inc/dlmgr_stub.h Tue May 25 12:44:54 2010 +0300 +++ b/videoplayback/videohelix/tsrc/ut_videohelixtest/inc/dlmgr_stub.h Wed Jun 09 09:44:23 2010 +0300 @@ -15,8 +15,9 @@ * */ -// Version : %version: 4 % +// Version : %version: 5 % +#ifdef USE_S60_DOWNLOAD_MANAGER #ifndef __RHTTPDOWNLOADMGRAPIEXT_H__ #define __RHTTPDOWNLOADMGRAPIEXT_H__ @@ -188,3 +189,4 @@ #endif // __RHTTPDOWNLOADMGRAPIEXT_H__ +#endif // USE_S60_DOWNLOAD_MANAGER diff -r 8f0df5c82986 -r 67eb01668b0e videoplayback/videohelix/tsrc/ut_videohelixtest/inc/videohelixtest.h --- a/videoplayback/videohelix/tsrc/ut_videohelixtest/inc/videohelixtest.h Tue May 25 12:44:54 2010 +0300 +++ b/videoplayback/videohelix/tsrc/ut_videohelixtest/inc/videohelixtest.h Wed Jun 09 09:44:23 2010 +0300 @@ -15,7 +15,7 @@ * */ -// Version : %version: 14 % +// Version : %version: e003sa33#15 % #ifndef __VHPPTESTCASE_H__ @@ -172,6 +172,8 @@ virtual TInt InitializeWithPositionL( CStifItemParser& aItem ); virtual TInt InitializeLinkWithPositionL( CStifItemParser& aItem ); virtual TInt InitializeHandleWithPositionL( CStifItemParser& aItem ); + virtual TInt InitializeStreamingWithSdpFileHandleL( CStifItemParser& aItem ); + virtual TInt RetrieveFileNameAndModeL( CStifItemParser& aItem ); // --------------------------------------------------------------------- // Helper Functions diff -r 8f0df5c82986 -r 67eb01668b0e videoplayback/videohelix/tsrc/ut_videohelixtest/src/tnmgr_stub.cpp --- a/videoplayback/videohelix/tsrc/ut_videohelixtest/src/tnmgr_stub.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videoplayback/videohelix/tsrc/ut_videohelixtest/src/tnmgr_stub.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -15,7 +15,7 @@ * */ -// Version : %version: 1 % +// Version : %version: 2 % #include #include "tnmgr_stub.h" @@ -42,7 +42,7 @@ MPX_ENTER_EXIT(_L("CThumbnailManager::CThumbnailManager() - stub impl")); } -TThumbnailRequestId CThumbnailManager::SetThumbnailL( CThumbnailObjectSource& aObjectSource ) +TThumbnailRequestId CThumbnailManager::SetThumbnailL( CThumbnailObjectSource& /* aObjectSource */ ) { MPX_ENTER_EXIT(_L("CThumbnailManager::SetThumbnailL() - stub impl")); return 0; @@ -63,7 +63,7 @@ return self; } -CThumbnailObjectSource::CThumbnailObjectSource( CFbsBitmap* aBitmap, const TDesC& aUri ) +CThumbnailObjectSource::CThumbnailObjectSource( CFbsBitmap* /* aBitmap */ , const TDesC& /* aUri */ ) { } diff -r 8f0df5c82986 -r 67eb01668b0e videoplayback/videohelix/tsrc/ut_videohelixtest/src/videohelixtestbody.cpp --- a/videoplayback/videohelix/tsrc/ut_videohelixtest/src/videohelixtestbody.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videoplayback/videohelix/tsrc/ut_videohelixtest/src/videohelixtestbody.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -15,7 +15,7 @@ * */ -// Version : %version: 23 % +// Version : %version: e003sa33#24.1.1 % // [INCLUDE FILES] - do not remove @@ -42,6 +42,7 @@ #include "mpxmediavideodefs.h" #include "mpxvideo_debug.h" #include "mpxvideoplayerutility_stub.h" +#include "mpxhelixplaybackplugindefs.h" #ifdef __WINSCW__ _LIT( KVideoTestPath, "c:\\data\\Videos\\" ); @@ -118,7 +119,10 @@ ENTRY ("InitializeWithPositionL", CVHPPTestClass::InitializeWithPositionL), ENTRY ("InitializeLinkWithPositionL", CVHPPTestClass::InitializeLinkWithPositionL), - ENTRY ("InitializeHandleWithPositionL", CVHPPTestClass::InitializeHandleWithPositionL) + ENTRY ("InitializeHandleWithPositionL", CVHPPTestClass::InitializeHandleWithPositionL), + ENTRY ( "InitializeStreamingWithSdpFileHandleL", + CVHPPTestClass::InitializeStreamingWithSdpFileHandleL ), + ENTRY ( "RetrieveFileNameAndModeL", CVHPPTestClass::RetrieveFileNameAndModeL ) // // ADD NEW ENTRIES HERE @@ -1142,6 +1146,10 @@ MPX_ENTER_EXIT(_L("CVHPPTestClass::ConnectToDownloadL()")); iLog->Log(_L("CVHPPTestClass::ConnectToDownloadL()")); + TInt err = KErrNone; + +#ifdef USE_S60_DOWNLOAD_MANAGER + iDlMgrTester = CDlMgrTestClass::NewL(); iDlMgrTester->AddStifObserver( this ); @@ -1152,7 +1160,7 @@ // // Read in the download id and filename // - TInt err = aItem.GetNextInt( dlId ); + err = aItem.GetNextInt( dlId ); if ( err == KErrNone ) { @@ -1188,7 +1196,17 @@ CleanupStack::PopAndDestroy( cmd ); } } - + +#else // USE_S60_DOWNLOAD_MANAGER + + // suppress build warning + MPX_DEBUG(_L("CVHPPTestClass::ConnectToDownloadL() : parsing type = %d"), aItem.ParsingType()); + + // Signal TestScripter to continue from waittestclass + Signal(); + +#endif // USE_S60_DOWNLOAD_MANAGER + return err; } @@ -1202,6 +1220,8 @@ MPX_ENTER_EXIT(_L("CVHPPTestClass::SendPdlCustomCommandL"), _L("aCustomCmd = %d"), aCustomCmd ); +#ifdef USE_S60_DOWNLOAD_MANAGER + CMPXCommand* cmd = CMPXCommand::NewL(); CleanupStack::PushL( cmd ); @@ -1212,6 +1232,14 @@ iPlaybackPlugin->CommandL( *cmd ); CleanupStack::PopAndDestroy( cmd ); + +#else // USE_S60_DOWNLOAD_MANAGER + + // Signal TestScripter to continue from waittestclass + Signal(); + +#endif // USE_S60_DOWNLOAD_MANAGER + } // ----------------------------------------------------------------------------- @@ -1224,6 +1252,8 @@ MPX_ENTER_EXIT(_L("CVHPPTestClass::PauseDownloadL()")); iLog->Log(_L("CVHPPTestClass::PauseDownloadL()")); +#ifdef USE_S60_DOWNLOAD_MANAGER + TCallbackEvent* event = new TCallbackEvent; event->iEvent = EPDownloadStateChanged; @@ -1233,7 +1263,14 @@ AddExpectedEvent( event ); iDlMgrTester->PauseDownload(); - + +#else // USE_S60_DOWNLOAD_MANAGER + + // Signal TestScripter to continue from waittestclass + Signal(); + +#endif // USE_S60_DOWNLOAD_MANAGER + return KErrNone; } @@ -1247,9 +1284,13 @@ MPX_ENTER_EXIT(_L("CVHPPTestClass::ResumeDownloadL()")); iLog->Log(_L("CVHPPTestClass::ResumeDownloadL()")); + TInt err = KErrNone; + +#ifdef USE_S60_DOWNLOAD_MANAGER + TInt dlSize; - TInt err = aItem.GetNextInt( dlSize ); + err = aItem.GetNextInt( dlSize ); if ( err == KErrNone ) { @@ -1273,7 +1314,17 @@ iDlMgrTester->ResumeDownload(); } - + +#else // USE_S60_DOWNLOAD_MANAGER + + // suppress build warning + MPX_DEBUG(_L("CVHPPTestClass::ResumeDownloadL() : parsing type = %d"), aItem.ParsingType()); + + // Signal TestScripter to continue from waittestclass + Signal(); + +#endif // USE_S60_DOWNLOAD_MANAGER + return err; } @@ -1287,6 +1338,8 @@ MPX_ENTER_EXIT(_L("CVHPPTestClass::CancelDownloadL()")); iLog->Log(_L("CVHPPTestClass::CancelDownloadL()")); +#ifdef USE_S60_DOWNLOAD_MANAGER + TCallbackEvent* event = new TCallbackEvent; event->iEvent = EPDownloadStateChanged; @@ -1297,6 +1350,13 @@ iDlMgrTester->CancelDownload(); +#else // USE_S60_DOWNLOAD_MANAGER + + // Signal TestScripter to continue from waittestclass + Signal(); + +#endif // USE_S60_DOWNLOAD_MANAGER + return KErrNone; } @@ -1310,6 +1370,10 @@ MPX_ENTER_EXIT(_L("CVHPPTestClass::RetrievePdlStatusL()")); iLog->Log(_L("CVHPPTestClass::RetrievePdlStatusL()")); + TInt err = KErrNone; + +#ifdef USE_S60_DOWNLOAD_MANAGER + TInt pdlState; TInt expectedPdlState; TInt downloadedBytes; @@ -1320,7 +1384,7 @@ // // Read in the expected download data // - TInt err = aItem.GetNextInt( expectedPdlState ); + err = aItem.GetNextInt( expectedPdlState ); if ( err == KErrNone ) { @@ -1368,6 +1432,16 @@ CleanupStack::PopAndDestroy( cmd ); } +#else // USE_S60_DOWNLOAD_MANAGER + + // suppress build warning + MPX_DEBUG(_L("CVHPPTestClass::RetrievePdlStatusL() : parsing type = %d"), aItem.ParsingType()); + + // Signal TestScripter to continue from waittestclass + Signal(); + +#endif // USE_S60_DOWNLOAD_MANAGER + return err; } @@ -1548,6 +1622,8 @@ void CVHPPTestClass::ProcessEvent( TCallbackEvent* aCallback ) { + MPX_ENTER_EXIT(_L("CVHPPTestClass::ProcessEvent")); + if ( iExpectedCallbackArray->Count() > 0 ) { TCallbackEvent* expectedCallback = (*iExpectedCallbackArray)[0]; @@ -2352,4 +2428,164 @@ return err; } +TInt +CVHPPTestClass::InitializeStreamingWithSdpFileHandleL( CStifItemParser& aItem ) +{ + MPX_ENTER_EXIT(_L("CVHPPTestClass::InitializeStreamingWithSdpFileHandleL()")); + iLog->Log(_L("CVHPPTestClass::InitializeStreamingWithSdpFileHandleL()")); + + TInt duration; + TInt volumeSteps; + TInt fileHandle32; + + TInt err = aItem.GetNextInt( fileHandle32 ); + + if ( err == KErrNone ) + { + +#ifndef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API + // + // set RFile as default if the 64-bit flag is not defined + // + fileHandle32 = ETrue; +#endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API + + err = aItem.GetNextInt( duration ); + + if ( err == KErrNone ) + { + // + // We will always get an Init Complete message out + // + TCallbackEvent* event = new TCallbackEvent; + + event->iEvent = EPInitialised; + event->iData = duration; + event->iError = KErrNone; + + AddExpectedEvent( event ); + + // + // read number of volume steps + // + err = aItem.GetNextInt( volumeSteps ); + + if ( err == KErrNone ) + { + // + // set volume steps + // + SetVolumeSteps( volumeSteps ); + + TBuf<120> fullPath; + err = ReadFileInitializationParameters( aItem, fullPath ); + + if ( err == KErrNone ) + { + PreparePluginL(); + + MPX_DEBUG( _L("Initialize the Plugin: link = %S"), &fullPath ); + iLog->Log( _L("Initialize the Plugin: link = %S"), &fullPath ); + + // + // Extract the streaming link from the ram file and + // Initalize the Plugin with the file handle and an access point + // + RFs fs; + TInt error = fs.Connect(); + + if ( fileHandle32 ) + { + RFile file; + error = file.Open( fs, fullPath, EFileRead | EFileShareAny ); + + MPX_DEBUG( _L("Initialize the Plugin: file open error = %d"), + error ); + + User::LeaveIfError( error ); + + iPlaybackPlugin->InitStreamingL( file, 11 ); + file.Close(); + } + #ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API + else + { + RFile64 file64; + error = file64.Open( fs, fullPath, EFileRead | EFileShareAny ); + + MPX_DEBUG( _L("Initialize the Plugin: file open error = %d"), + error ); + + User::LeaveIfError( error ); + + iPlaybackPlugin->InitStreaming64L( file64, 11 ); + file64.Close(); + } +#endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API + + fs.Close(); + } + } + } + } + return err; +} + +TInt +CVHPPTestClass::RetrieveFileNameAndModeL( CStifItemParser& aItem ) +{ + MPX_ENTER_EXIT( _L("CVHPPTestClass::RetrieveFileNameAndModeL()") ); + iLog->Log( _L("CVHPPTestClass::RetrieveFileNameAndModeL()") ); + + TBuf<120> fullPath; + TPtrC fileName; + TInt err; + + err = aItem.GetNextString( fileName ); + + if ( err == KErrNone ) + { + // + // Build the full path to the file + // + fullPath.Append( KVideoTestPath ); + fullPath.Append( fileName ); + + TInt mode; + err = aItem.GetNextInt( mode); + + if ( err == KErrNone ) + { + CMPXCommand* cmd = CMPXCommand::NewL(); + CleanupStack::PushL( cmd ); + + cmd->SetTObjectValueL( KMPXCommandGeneralDoSync, ETrue ); + cmd->SetTObjectValueL( KMPXCommandGeneralId, + KMPXMediaIdVideoPlayback ); + cmd->SetTObjectValueL( KMPXMediaVideoPlaybackCommand, EPbCmdInitView ); + + iPlaybackPlugin->CommandL( *cmd ); + + TPtrC clipName( cmd->ValueText( KMPXMediaVideoPlaybackFileName ) ); + TMPXVideoMode playbackMode = (TMPXVideoMode) cmd->ValueTObjectL( KMPXMediaVideoMode ); + + MPX_DEBUG( _L(" Expected Data: filename = %S, playbackmode= %d" ), + &fullPath, mode ); + + MPX_DEBUG( _L(" Retrieved Data: filename = %S, playbackmode= %d"), + &clipName, playbackMode ); + + if ( fullPath.Compare( clipName) != 0 || mode != playbackMode ) + { + err = KErrGeneral; + MPX_DEBUG( _L(" err = %d"), err ); + } + + CleanupStack::PopAndDestroy( cmd ); + } + } + + return err; +} + // EOF diff -r 8f0df5c82986 -r 67eb01668b0e videoplayback/videoplaybackcontrols/group/mpxvideoplaybackcontrols.mmp --- a/videoplayback/videoplaybackcontrols/group/mpxvideoplaybackcontrols.mmp Tue May 25 12:44:54 2010 +0300 +++ b/videoplayback/videoplaybackcontrols/group/mpxvideoplaybackcontrols.mmp Wed Jun 09 09:44:23 2010 +0300 @@ -15,7 +15,7 @@ * */ -// Version : %version: 11 % +// Version : %version: 12 % @@ -82,5 +82,6 @@ LIBRARY bmpanim.lib LIBRARY flogger.lib LIBRARY playbackhelper.lib +LIBRARY centralrepository.lib // For display backlight timeout value //End of file diff -r 8f0df5c82986 -r 67eb01668b0e videoplayback/videoplaybackcontrols/src/mpxvideoplaybackcontrolscontroller.cpp --- a/videoplayback/videoplaybackcontrols/src/mpxvideoplaybackcontrolscontroller.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videoplayback/videoplaybackcontrols/src/mpxvideoplaybackcontrolscontroller.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -16,7 +16,7 @@ */ -// Version : %version: 41 % +// Version : %version: 42 % // INCLUDE FILES @@ -42,6 +42,8 @@ #include #include +#include + #ifdef RD_TACTILE_FEEDBACK #include #endif //RD_TACTILE_FEEDBACK @@ -115,6 +117,7 @@ iFileDetails = aDetails; iTvOutConnected = iFileDetails->iTvOutConnected; + iShowControls = ETrue; iRNFormat = IsRealFormatL( iFileDetails->iClipName->Des() ); @@ -328,6 +331,15 @@ { MPX_DEBUG(_L(" [EMPXControlCmdHandleBackgroundEvent]")); + TBool keylock( EFalse ); + RProperty::Get( KPSUidAvkonDomain, KAknKeyguardStatus, keylock ); + + // Don't show controls when key is locked + if ( keylock ) + { + iShowControls = EFalse; + } + ResetDisappearingTimers( EMPXTimerReset ); for ( TInt i = 0 ; i < iControls.Count() ; i++ ) @@ -340,6 +352,7 @@ case EMPXControlCmdHandleForegroundEvent: { MPX_DEBUG(_L(" [EMPXControlCmdHandleForegroundEvent]")); + iShowControls = ETrue; UpdateControlsVisibility(); break; } @@ -1263,13 +1276,16 @@ MPX_ENTER_EXIT(_L("CMPXVideoPlaybackControlsController::ShowControls()"), _L("iState = %d"), iState ); - CloseMediaDetailsViewer(); - - ResetDisappearingTimers( EMPXTimerReset ); + if ( iShowControls ) + { + CloseMediaDetailsViewer(); - for ( TInt i = 0 ; i < iControls.Count() ; i++ ) - { - iControls[i]->SetVisibility( iState ); + ResetDisappearingTimers( EMPXTimerReset ); + + for ( TInt i = 0 ; i < iControls.Count() ; i++ ) + { + iControls[i]->SetVisibility( iState ); + } } } diff -r 8f0df5c82986 -r 67eb01668b0e videoplayback/videoplaybackviews/src/mpxvideobaseplaybackview.cpp --- a/videoplayback/videoplaybackviews/src/mpxvideobaseplaybackview.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videoplayback/videoplaybackviews/src/mpxvideobaseplaybackview.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -16,7 +16,7 @@ */ -// Version : %version: 79 % +// Version : %version: 80 % // Include Files @@ -368,6 +368,11 @@ iMediaRequested = EFalse; break; } + case KMpxVideoPlaybackPdlReloadComplete: + { + HandlePdlReloadComplete(); + break; + } case EMPXPbvCmdRealOneBitmapTimeout: { HandleRealOneBitmapTimeoutL(); @@ -2282,4 +2287,13 @@ } } +// ------------------------------------------------------------------------------------------------- +// CMPXVideoBasePlaybackView::HandlePdlReloadComplete() +// ------------------------------------------------------------------------------------------------- +// +void CMPXVideoBasePlaybackView::HandlePdlReloadComplete() +{ + MPX_DEBUG(_L("CMPXVideoBasePlaybackView::HandlePdlReloadComplete()")); +} + // EOF diff -r 8f0df5c82986 -r 67eb01668b0e videoplayback/videoplaybackviews/src/mpxvideopdlplaybackview.cpp --- a/videoplayback/videoplaybackviews/src/mpxvideopdlplaybackview.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videoplayback/videoplaybackviews/src/mpxvideopdlplaybackview.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -16,7 +16,7 @@ */ -// Version : %version: 24 % +// Version : %version: 25 % // Include Files @@ -34,6 +34,7 @@ #include "mpxvideopdlplaybackview.h" #include "mpxvideoplaybackcontainer.h" #include "mpxvideoplaybackviewfiledetails.h" +#include "mpxvideoplaybackuserinputhandler.h" #include #include "mpxvideo_debug.h" @@ -208,7 +209,7 @@ // The download size and downloaded bytes will be set to 100 so // the download progress bar will show 100% // - if ( iPdlState == EPbDlStateNotDownloading ) + if ( iPdlState == EPbDlStateNotDownloading || iPdlState == EPbDlStateDownloadCompleted ) { iDownloadSize = 100; downloadedBytes = 100; @@ -449,6 +450,49 @@ // For PDL view, reset the container and controls for new download // DoHandleInitializingStateL( aLastState ); + + // + // User inputs should not be blocked since the new download is initializing + // + iUserInputsBlocked = EFalse; + iContainer->UserInputHandler()->BlockPdlUserInputs( iUserInputsBlocked ); +} + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPdlPlaybackView::SendWindowCommandL() +// ------------------------------------------------------------------------------------------------- +// +void CMPXVideoPdlPlaybackView::SendWindowCommandL( TMPXVideoPlaybackCommand aCmd ) +{ + MPX_ENTER_EXIT(_L("CMPXVideoPdlPlaybackView::SendWindowCommandL()"), + _L("aCmd = %d"), aCmd ); + + CMPXVideoBasePlaybackView::SendWindowCommandL( aCmd ); + + if ( aCmd == EPbCmdHandleBackground && ! IsAppInFrontL() ) + { + // + // Block all inputs when PDL view is sent to full background + // Commands will be enabled when new command is received from LWP + // + iUserInputsBlocked = ETrue; + iContainer->UserInputHandler()->BlockPdlUserInputs( iUserInputsBlocked ); + } +} + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPdlPlaybackView::HandlePdlReloadComplete() +// ------------------------------------------------------------------------------------------------- +// +void CMPXVideoPdlPlaybackView::HandlePdlReloadComplete() +{ + MPX_ENTER_EXIT(_L("CMPXVideoPdlPlaybackView::HandlePdlReloadComplete()")); + + // + // User inputs should not be blocked since the new PDL command is complete + // + iUserInputsBlocked = EFalse; + iContainer->UserInputHandler()->BlockPdlUserInputs( iUserInputsBlocked ); } // EOF diff -r 8f0df5c82986 -r 67eb01668b0e videoplayback/videoplaybackviews/src/mpxvideoplaybackuserinputhandler.cpp --- a/videoplayback/videoplaybackviews/src/mpxvideoplaybackuserinputhandler.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videoplayback/videoplaybackviews/src/mpxvideoplaybackuserinputhandler.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -15,7 +15,8 @@ * */ -// Version : %version: 18 % + +// Version : %version: 19 % // INCLUDE FILES @@ -51,8 +52,6 @@ #include "mpxvideo_debug.h" - - // ======== MEMBER FUNCTIONS ======================================================================= // ------------------------------------------------------------------------------------------------- @@ -61,7 +60,10 @@ // CMPXVideoPlaybackUserInputHandler::CMPXVideoPlaybackUserInputHandler( CMPXVideoPlaybackContainer* aContainer) - : iContainer(aContainer) + : iProcessingInputType(EMpxVideoNone), + iForeground(ETrue), + iBlockPdlInputs(EFalse), + iContainer(aContainer) { } @@ -98,9 +100,6 @@ // not detrimental if Media Keys dont work - so ignore any errors here TRAP_IGNORE( iInterfaceSelector->OpenTargetL() ); - - iProcessingInputType = EMpxVideoNone; - iForeground = ETrue; } // ------------------------------------------------------------------------------------------------- @@ -117,7 +116,6 @@ delete iVolumeRepeatTimer; } - if ( iInterfaceSelector ) { delete iInterfaceSelector; @@ -238,7 +236,6 @@ } } - // ------------------------------------------------------------------------------------------------- // CMPXVideoPlaybackUserInputHandler::HandleRewind() // ------------------------------------------------------------------------------------------------- @@ -302,7 +299,6 @@ } } - // ------------------------------------------------------------------------------------------------- // CMPXVideoPlaybackUserInputHandler::HandleVolumeDown() // ------------------------------------------------------------------------------------------------- @@ -347,7 +343,6 @@ } } - // ------------------------------------------------------------------------------------------------- // CMPXVideoPlaybackUserInputHandler::ProcessPointerEvent() // ------------------------------------------------------------------------------------------------- @@ -365,7 +360,7 @@ { case EMpxVideoNone: { - if ( aPointerEvent.iType == TPointerEvent::EButton1Down && iForeground ) + if ( aPointerEvent.iType == TPointerEvent::EButton1Down && IsUserInputAllowed() ) { iProcessingInputType = EMpxVideoTouch; @@ -411,7 +406,7 @@ if ( aPointerEvent.iType == TPointerEvent::EButton1Up ) { // - // Reroute button up event to active control and end current + // Reroute button up event to active control and end current // control processing // ReRoutePointerEventL( iActiveControlPtr, aPointerEvent, iActiveControlType ); @@ -459,7 +454,7 @@ { case EMpxVideoNone: { - if ( aType == EEventKeyDown && iForeground ) + if ( aType == EEventKeyDown && IsUserInputAllowed() ) { iProcessingInputType = EMpxVideoKeyboard; iLastPressedKeyCode = aKeyEvent.iCode; @@ -504,7 +499,7 @@ { case EMpxVideoNone: { - if ( iForeground ) + if ( IsUserInputAllowed() ) { if ( aButtonAct == ERemConCoreApiButtonPress ) { @@ -598,5 +593,28 @@ } } +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackUserInputHandler::BlockPdlUserInputs() +// ------------------------------------------------------------------------------------------------- +// +void CMPXVideoPlaybackUserInputHandler::BlockPdlUserInputs( TBool aBlockInputs ) +{ + MPX_DEBUG(_L("CMPXVideoPlaybackUserInputHandler::BlockPdlUserInputs(%d)"), aBlockInputs); + + iBlockPdlInputs = aBlockInputs; +} + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackUserInputHandler::IsUserInputAllowed() +// ------------------------------------------------------------------------------------------------- +// +TBool CMPXVideoPlaybackUserInputHandler::IsUserInputAllowed() +{ + TBool allowInput = ( iForeground && ! iBlockPdlInputs ); + + MPX_DEBUG(_L("CMPXVideoPlaybackUserInputHandler::IsUserInputAllowed(%d)"), allowInput); + + return allowInput; +} // EOF diff -r 8f0df5c82986 -r 67eb01668b0e videoplayerapp/mpxvideoplayer/inc/mpxvideoplayerappuiengine.h --- a/videoplayerapp/mpxvideoplayer/inc/mpxvideoplayerappuiengine.h Tue May 25 12:44:54 2010 +0300 +++ b/videoplayerapp/mpxvideoplayer/inc/mpxvideoplayerappuiengine.h Wed Jun 09 09:44:23 2010 +0300 @@ -15,7 +15,8 @@ * */ -// Version : %version: e92_33 % + +// Version : %version: da1mmcf#34 % #ifndef CMPXVIDEOPLAYERAPPUIENGINE_H @@ -225,10 +226,10 @@ void ClosePlaybackPluginL(); - void SignalViewPdlReloadingL(); - + void SendMessageToPdlViewL( TInt aMsg ); + /* - * Activates an active object to finish the + * Activates an active object to finish the * initialization of the standalone application */ void ActivateLateConstructTimerL(); @@ -299,16 +300,16 @@ void InitializePlaylistL( const CMPXCollectionPlaylist& aPlaylist, TBool aPlay ); /* - * Provides the static function for the callback to + * Provides the static function for the callback to * finish the standalone application construction * Called by CPeriodic iConstructTimer * @param aPtr Pointer to callback class * @return KErrNone */ static TInt LateConstructCallback( TAny* aPtr ); - + /* - * Called to finalize the standalone + * Called to finalize the standalone * application initialization. */ virtual void DoLateConstructL(); diff -r 8f0df5c82986 -r 67eb01668b0e videoplayerapp/mpxvideoplayer/sis/VideoPlayer.pkg --- a/videoplayerapp/mpxvideoplayer/sis/VideoPlayer.pkg Tue May 25 12:44:54 2010 +0300 +++ b/videoplayerapp/mpxvideoplayer/sis/VideoPlayer.pkg Wed Jun 09 09:44:23 2010 +0300 @@ -20,7 +20,7 @@ &EN ; Header -#{"Video Player"},(0x200159B2),9,20,2, TYPE=SA, RU +#{"Video Player"},(0x200159B2),9,20,21, TYPE=SA, RU ; Supports Series 60 v5.0 ;[0x1028315F], 0, 0, 0, {"Series60ProductID"} diff -r 8f0df5c82986 -r 67eb01668b0e videoplayerapp/mpxvideoplayer/sis/VideoPlayer_stub.pkg --- a/videoplayerapp/mpxvideoplayer/sis/VideoPlayer_stub.pkg Tue May 25 12:44:54 2010 +0300 +++ b/videoplayerapp/mpxvideoplayer/sis/VideoPlayer_stub.pkg Wed Jun 09 09:44:23 2010 +0300 @@ -20,7 +20,7 @@ &EN ;Header -#{"Video Player"},(0x200159B2),9,20,2, TYPE=SA +#{"Video Player"},(0x200159B2),9,20,21, TYPE=SA ;Localised Vendor name %{"Nokia"} diff -r 8f0df5c82986 -r 67eb01668b0e videoplayerapp/mpxvideoplayer/src/mpxvideoembeddedpdlhandler.cpp --- a/videoplayerapp/mpxvideoplayer/src/mpxvideoembeddedpdlhandler.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videoplayerapp/mpxvideoplayer/src/mpxvideoembeddedpdlhandler.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -16,7 +16,7 @@ */ -// Version : %version: ou1cpsw#14 % +// Version : %version: 15 % #include @@ -33,6 +33,7 @@ #include "mpxvideoembeddedpdlhandler.h" #include "mpxvideoplayerappuiengine.h" #include "mpxvideoplayerconstants.h" +#include "mpxvideoplayercustomviewmsgconsts.h" #include #include "mpxvideo_debug.h" @@ -100,6 +101,7 @@ if ( ( aDlId == iDownloadId ) && ( ! aFileName.Compare( *iDownloadFileName ) ) ) { iAppUiEngine->PlaybackUtilityL().CommandL( EPbCmdPlay ); + iAppUiEngine->SendMessageToPdlViewL( KMpxVideoPlaybackPdlReloadComplete ); } else { @@ -107,9 +109,7 @@ // New download received, close old playback plugin // iAppUiEngine->ClosePlaybackPluginL(); - - iAppUiEngine->SignalViewPdlReloadingL(); - + iAppUiEngine->SendMessageToPdlViewL( KMpxVideoPlaybackPdlReloading ); StartNewDownloadL( aDlId, aFileName ); } } diff -r 8f0df5c82986 -r 67eb01668b0e videoplayerapp/mpxvideoplayer/src/mpxvideoplayerappuiengine.cpp --- a/videoplayerapp/mpxvideoplayer/src/mpxvideoplayerappuiengine.cpp Tue May 25 12:44:54 2010 +0300 +++ b/videoplayerapp/mpxvideoplayer/src/mpxvideoplayerappuiengine.cpp Wed Jun 09 09:44:23 2010 +0300 @@ -15,7 +15,8 @@ * */ -// Version : %version: e92_71 % + +// Version : %version: da1mmcf#72 % #include @@ -907,7 +908,7 @@ // ----------------------------------------------------------------------------- -// +// // ----------------------------------------------------------------------------- // void CMpxVideoPlayerAppUiEngine::HandleSoftKeyBackL() @@ -930,7 +931,7 @@ } // ----------------------------------------------------------------------------- -// +// // ----------------------------------------------------------------------------- // TBool CMpxVideoPlayerAppUiEngine::ProcessCommandParametersL( TApaCommand aCommand, @@ -964,7 +965,7 @@ } // ----------------------------------------------------------------------------- -// +// // ----------------------------------------------------------------------------- // void CMpxVideoPlayerAppUiEngine::ActivateExitActiveObject() @@ -1119,19 +1120,19 @@ } // ------------------------------------------------------------------------------------------------- -// CMpxVideoPlayerAppUiEngine::SignalViewPdlReloadingL() +// CMpxVideoPlayerAppUiEngine::SendMessageToPdlViewL() // ------------------------------------------------------------------------------------------------- // -void CMpxVideoPlayerAppUiEngine::SignalViewPdlReloadingL() +void CMpxVideoPlayerAppUiEngine::SendMessageToPdlViewL( TInt aMsg ) { - MPX_ENTER_EXIT(_L("CMpxVideoPlayerAppUiEngine::SignalViewPdlReloadingL")); + MPX_ENTER_EXIT(_L("CMpxVideoPlayerAppUiEngine::SendMessageToPdlViewL")); if ( iViewUtility->ActiveViewType() == TUid::Uid( KMpxPlaybackPluginTypeUid ) ) { // // The display window must be removed before closing the playback plugin // - iAppUi->View()->HandleCommandL( KMpxVideoPlaybackPdlReloading ); + iAppUi->View()->HandleCommandL( aMsg ); } } @@ -1142,13 +1143,13 @@ void CMpxVideoPlayerAppUiEngine::ActivateLateConstructTimerL() { MPX_ENTER_EXIT(_L("CMpxVideoPlayerAppUiEngine::ActivateLateConstructTimerL()")); - + if ( !iConstructTimer ) { const TTimeIntervalMicroSeconds32 timeout = 250000; // 250 ms - + TCallBack callback ( CMpxVideoPlayerAppUiEngine::LateConstructCallback, this ); - + iConstructTimer = CPeriodic::NewL( CActive::EPriorityIdle ); iConstructTimer->Start( timeout, 0, callback ); @@ -1162,9 +1163,9 @@ TInt CMpxVideoPlayerAppUiEngine::LateConstructCallback( TAny* aPtr ) { MPX_ENTER_EXIT(_L("CMpxVideoPlayerAppUiEngine::LateConstructCallback()")); - + TRAP_IGNORE( static_cast(aPtr)->DoLateConstructL() ); - + return KErrNone; } @@ -1176,8 +1177,8 @@ { MPX_ENTER_EXIT(_L("CMpxVideoPlayerAppUiEngine::DoLateConstructL()")); - iConstructTimer->Cancel(); - + iConstructTimer->Cancel(); + PlaybackUtilityL(); }