videditor/VideoEditorCommon/src/VideoEditorUtils.cpp
changeset 0 951a5db380a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videditor/VideoEditorCommon/src/VideoEditorUtils.cpp	Fri Jan 29 14:08:33 2010 +0200
@@ -0,0 +1,531 @@
+/*
+* Copyright (c) 2010 Ixonos Plc.
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the "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:
+* Ixonos Plc
+*
+* Description: 
+*
+*/
+
+
+
+// INCLUDES
+#include <bautils.h>
+#include <eikenv.h>
+#include <badesca.h>
+#include <PathInfo.h>
+#include <sysutil.h>
+#include <DRMCommon.h>
+#include <AknUtils.h>
+#include <data_caging_path_literals.hrh>
+#include <AknListQueryDialog.h> 
+#include <VedSimpleCutVideo.rsg>
+#include <BAUTILS.H> 
+
+#include "VideoEditorUtils.h"
+#include "VideoEditorCommon.h"
+#include "VeiSettings.h"
+#include "VideoEditorDebugUtils.h"
+
+
+// CONSTANTS
+_LIT (KEditedSuffix, "-");
+_LIT(KManualVideoEditorMifFile,        "ManualVideoEditor.mif");
+_LIT(KVideoEditorUiComponentsMifFile,  "VideoEditorUiComponents.mif");
+_LIT(KVideoEditorMbmFile,              "VideoEditorBitmaps.mbm");
+
+//=============================================================================
+EXPORT_C void VideoEditorUtils::NotifyNewMediaDocumentL (
+    RFs& /*aFsSession*/, 
+    const TDesC& aFileName )
+{
+	LOGFMT(KVideoEditorLogFile, "VideoEditorUtils::NotifyNewMediaDocumentL: In (%S)", &aFileName);
+    LOG(KVideoEditorLogFile, "VideoEditorUtils::NotifyNewMediaDocumentL: Out");
+}
+
+//=============================================================================
+EXPORT_C TInt VideoEditorUtils::GenerateNewDocumentNameL (
+    RFs& aFsSession, 
+    const TDesC& aSourceFileName, 
+    TDes& aTargetFileName,
+    TVedVideoFormat aOutputFormat,
+    TInt aTargetSizeEstimate,
+    VideoEditor::TMemory aMemoryInUse )
+{
+	LOG(KVideoEditorLogFile, "VideoEditorUtils::GenerateNewDocumentNameL, in:");
+	LOGFMT4(KVideoEditorLogFile, "VideoEditorUtils::GenerateNewDocumentNameL 1\tSource file: %S, output format: %d, required space: %d, memory in use: %d", &aSourceFileName, aOutputFormat, aTargetSizeEstimate, aMemoryInUse);
+
+	TInt err = KErrNone;
+
+	//	Set file name to parser
+	TParsePtrC fileParse (aSourceFileName);
+
+	//  Test filename is already too long
+	if (fileParse.NameAndExt().Length() > KMaxFileName - 5)
+	{
+		err = KErrArgument;
+	}
+
+	// Otherwise proceed to generate the filename
+	else
+	{
+		//	If the memory is specified as EMemAutomatic, the target is primarily
+		//	on the memory card, and if that is full, on the phone memory.
+		//	If EMemPhoneMemory or EMemMemoryCard is specified, only that one is used.
+		VideoEditor::TMemory selectedMemoryInUse;
+		aMemoryInUse == VideoEditor::EMemAutomatic ? 
+			selectedMemoryInUse = VideoEditor::EMemMemoryCard : 
+			selectedMemoryInUse = aMemoryInUse;
+
+		//  Find file suffix that is not yet used 
+		TInt val = 1;
+		TFileName temp;
+
+		//  First try the above selected primary location.
+		TFileName driveAndPath;
+		if (selectedMemoryInUse == VideoEditor::EMemPhoneMemory)
+		{
+			driveAndPath.Copy( PathInfo::PhoneMemoryRootPath() );
+		}
+		else
+		{
+			driveAndPath.Copy( PathInfo::MemoryCardRootPath() );
+		}
+		driveAndPath.Append( PathInfo::VideosPath() );
+		TRAPD(errBafl, BaflUtils::EnsurePathExistsL (aFsSession, driveAndPath));
+		LOGFMT(KVideoEditorLogFile, "VideoEditorUtils::GenerateNewDocumentNameL 2, errBafl:%d", errBafl );
+		TBool primaryLocationFull = ( KErrNone != errBafl 
+			|| !IsEnoughFreeSpaceToSaveL ( aFsSession, driveAndPath, aTargetSizeEstimate ) );
+
+
+		//	If the memory is full, and the memory is selected as automatic,
+		//	try alternative location.
+		if (primaryLocationFull && aMemoryInUse == VideoEditor::EMemAutomatic)
+		{
+			if (selectedMemoryInUse == VideoEditor::EMemMemoryCard)
+			{
+				driveAndPath.Copy (PathInfo::PhoneMemoryRootPath() );
+			}
+			else
+			{
+				driveAndPath.Copy (PathInfo::MemoryCardRootPath() );
+			}
+			driveAndPath.Append ( PathInfo::VideosPath() );
+			TBool secondaryLocationFull = ( !BaflUtils::FolderExists (aFsSession, driveAndPath)
+            || !IsEnoughFreeSpaceToSaveL ( aFsSession, driveAndPath, aTargetSizeEstimate ) );
+			if (secondaryLocationFull)
+			{
+				err = KErrDiskFull;
+			}
+		}
+
+        //	Now sufficient disk space has been verified.
+        //	Proceed to generate the unique file name.
+        if (KErrNone == err)
+        {
+            LOGFMT(KVideoEditorLogFile, "VideoEditorUtils::GenerateNewDocumentNameL 3, File will be saved to path: %S", &driveAndPath );
+
+            //  Copy drive and path to temporary file name
+            temp.Copy( driveAndPath );
+
+            //  Add file name without suffix 
+            TPtrC name = fileParse.Name();
+            TInt offset = FindSuffix ( name );
+            if (offset == KErrNotFound)
+	        {
+                temp.Append ( fileParse.Name() );
+            }
+            else
+            {
+                temp.Append ( name.Left (offset) );
+            }
+    
+            temp.Append ( KEditedSuffix );
+            temp.AppendNumFixedWidth (val, EDecimal, 3);
+            temp.Append ( aOutputFormat == EVedVideoFormat3GPP ? KExt3gp : KExtMp4 );
+
+            //  Increase edit number until we find a file name that is not used
+            while ( FileAlreadyExistsL(aFsSession, temp) )
+            {
+                ++val;
+                temp.Zero();
+                temp.Copy ( driveAndPath );
+                if (offset == KErrNotFound)
+                {
+                    temp.Append ( fileParse.Name() );
+                }
+		        else
+                {
+                    temp.Append ( name.Left (offset) );
+                }
+
+                temp.Append ( KEditedSuffix );
+                if (val < 1000)
+                {
+                    temp.AppendNumFixedWidth ( val, EDecimal, 3);
+                }
+                else
+                {
+                    temp.AppendNumFixedWidth ( val, EDecimal, 4);
+                }
+
+                temp.Append ( aOutputFormat == EVedVideoFormat3GPP ? KExt3gp : KExtMp4 );
+            }
+
+            //  Set document name 
+            aTargetFileName.Copy ( temp );
+        }
+    }
+
+    LOGFMT(KVideoEditorLogFile, "VideoEditorUtils::GenerateNewDocumentNameL: out (%d)", err);    
+    return err;
+}
+
+
+//=============================================================================
+EXPORT_C TInt VideoEditorUtils::GenerateFileNameL (
+    RFs& aFsSession, 
+    const TDesC& aSourceFileName, 
+    TDes& aTargetFileName,
+    TVedVideoFormat aOutputFormat,
+    TInt aTargetSizeEstimate,
+    TFileName aDrive )
+{
+	LOG(KVideoEditorLogFile, "VideoEditorUtils::GenerateNewDocumentNameL, in:");
+	LOGFMT4(KVideoEditorLogFile, "VideoEditorUtils::GenerateNewDocumentNameL 1\tSource file: %S, output format: %d, required space: %d, memory in use: %d", &aSourceFileName, &aOutputFormat, &aTargetSizeEstimate, &aDrive);
+
+	TInt err = KErrNone;
+
+	//	Set file name to parser
+	TParsePtrC fileParse (aSourceFileName);
+
+	//  Test if filename is already too long
+	if (fileParse.NameAndExt().Length() > KMaxFileName - 5)
+	{
+		err = KErrArgument;
+	}
+
+	// Otherwise proceed to generate the filename
+	else
+	{
+		//  Find file suffix that is not yet used 
+		TInt val = 1;
+		TFileName temp;
+
+		TFileName driveAndPath = aDrive;
+		driveAndPath.Append( PathInfo::VideosPath() );
+		
+		// create the folder if it doesn't exist
+		TRAPD(errBafl, BaflUtils::EnsurePathExistsL (aFsSession, driveAndPath));
+		LOGFMT(KVideoEditorLogFile, "VideoEditorUtils::GenerateNewDocumentNameL 2, errBafl:%d", errBafl );
+				
+		TBool selectedLocationFull = ( KErrNone != errBafl 
+
+			|| !IsEnoughFreeSpaceToSaveL ( aFsSession, driveAndPath, aTargetSizeEstimate ) );
+
+		if (selectedLocationFull)
+			{
+				err = KErrDiskFull;
+			}
+	
+	    //	Now sufficient disk space has been verified.
+        //	Proceed to generate the unique file name.
+        if (KErrNone == err)
+        {
+           LOGFMT(KVideoEditorLogFile, "VideoEditorUtils::GenerateNewDocumentNameL 3, File will be saved to path: %S", &driveAndPath );
+
+            //  Copy drive and path to temporary file name
+            temp.Copy( driveAndPath );
+
+            //  Add file name without suffix 
+            TPtrC name = fileParse.Name();
+
+            TInt offset = FindSuffix ( name );
+
+            if (offset == KErrNotFound)
+	        {
+                temp.Append ( fileParse.Name() );
+            }
+            else
+            {
+                temp.Append ( name.Left (offset) );
+            }
+    
+            temp.Append ( KEditedSuffix );
+            temp.AppendNumFixedWidth (val, EDecimal, 3);
+            temp.Append ( aOutputFormat == EVedVideoFormat3GPP ? KExt3gp : KExtMp4 );
+
+            //  Increase edit number until we find a file name that is not used
+            while ( FileAlreadyExistsL(aFsSession, temp) )
+            {
+                ++val;
+                temp.Zero();
+                temp.Copy ( driveAndPath );
+                if (offset == KErrNotFound)
+                {
+                    temp.Append ( fileParse.Name() );
+                }
+		        else
+                {
+                    temp.Append ( name.Left (offset) );
+                }
+
+                temp.Append ( KEditedSuffix );
+                if (val < 1000)
+                {
+                    temp.AppendNumFixedWidth ( val, EDecimal, 3);
+                }
+                else
+                {
+                    temp.AppendNumFixedWidth ( val, EDecimal, 4);
+                }
+
+                temp.Append ( aOutputFormat == EVedVideoFormat3GPP ? KExt3gp : KExtMp4 );
+            }
+
+            //  Set document name 
+            aTargetFileName.Copy ( temp );
+        }
+    }
+
+    LOGFMT(KVideoEditorLogFile, "VideoEditorUtils::GenerateNewDocumentNameL: out (%d)", err);    
+    return err;
+}
+
+
+//=============================================================================
+EXPORT_C TBool VideoEditorUtils::IsEnoughFreeSpaceToSaveL( 
+	RFs& aFsSession, 
+	const TDesC& aFileName, 
+	TInt aSizeEstimate ) 
+	{
+	LOGFMT(KVideoEditorLogFile, "VideoEditorUtils::IsEnoughFreeSpaceToSaveL: in: %S", &aFileName);
+
+	TBool spaceBelowCriticalLevel( EFalse );
+
+	TParsePtrC fileParse (aFileName);
+
+	TInt mmc = fileParse.Drive().Left(1).CompareF( PathInfo::MemoryCardRootPath().Left(1) );
+	if( mmc == 0 )
+		{
+		spaceBelowCriticalLevel = SysUtil::MMCSpaceBelowCriticalLevelL( 
+										&aFsSession, aSizeEstimate );
+		}
+	else
+		{
+		spaceBelowCriticalLevel = SysUtil::DiskSpaceBelowCriticalLevelL( 
+										&aFsSession, aSizeEstimate, EDriveC );
+		}	
+
+	LOGFMT(KVideoEditorLogFile, "VideoEditorUtils::IsEnoughFreeSpaceToSaveL: out: %d", !spaceBelowCriticalLevel);
+	return !spaceBelowCriticalLevel;
+	}
+
+//=============================================================================
+EXPORT_C TBool VideoEditorUtils::IsDrmProtectedL( const TDesC& aFileName ) 
+	{
+	LOGFMT(KVideoEditorLogFile, "VideoEditorUtils::IsDrmProtectedL: in: %S", &aFileName);
+
+	TBool isProtected = EFalse;
+	DRMCommon* drm = DRMCommon::NewL();
+	CleanupStack::PushL (drm);
+	drm->IsProtectedFile( aFileName, isProtected );
+	CleanupStack::PopAndDestroy (drm);
+
+	LOGFMT(KVideoEditorLogFile, "VideoEditorUtils::IsDrmProtectedL: out: %d", isProtected);
+	return isProtected;
+	}
+
+//=============================================================================
+EXPORT_C TFileName VideoEditorUtils::IconFileNameAndPath( TInt aInconFileIndex )
+	{
+	LOG(KVideoEditorLogFile, "VideoEditorUtils::IconFileNameAndPath: in:");
+
+	TFileName fileName;
+	Dll::FileName(fileName);
+	TParse p;
+
+	switch (aInconFileIndex)
+		{
+		case KManualVideoEditorIconFileId:
+			p.Set(KManualVideoEditorMifFile, &KDC_APP_BITMAP_DIR, &fileName);
+			break;
+		case KVideoEditorUiComponentsIconFileId:
+			p.Set(KVideoEditorUiComponentsMifFile, &KDC_APP_BITMAP_DIR, &fileName);
+			break;
+		case KVeiNonScalableIconFileId:
+			p.Set(KVideoEditorMbmFile, &KDC_APP_BITMAP_DIR, &fileName);
+			break;
+		default:
+			User::Invariant();
+		}
+
+	TPtrC fullName = p.FullName();
+	LOGFMT2(KVideoEditorLogFile, "VideoEditorUtils::IconFileNameAndPath: Id: %d, name: %S", aInconFileIndex, &fullName);
+
+	return fullName;
+	}
+
+//=============================================================================
+TInt VideoEditorUtils::FindSuffix ( 
+    const TDesC &   aName
+    )
+{
+    TInt offset = KErrNotFound;
+    TInt l = aName.Length();
+
+    while (l)
+    {
+        l--;
+                
+        if ( l <= (aName.Length() - 3) && aName[l] == TChar('-') )
+        {
+            offset = l;
+            break;    
+        }
+        else if ( aName[l] < 0x30 || aName[l] > 0x39 )
+        {
+            break;                
+        }
+        
+    }
+
+    return offset;
+}
+
+//=============================================================================
+TBool VideoEditorUtils::FileAlreadyExistsL ( RFs& aFsSession, const TDesC& aFileName )
+{
+	LOGFMT(KVideoEditorLogFile, "VideoEditorUtils::FileAlreadyExistsL: %S", &aFileName);
+
+    TBool fileExists = BaflUtils::FileExists( aFsSession, aFileName );
+
+	LOGFMT(KVideoEditorLogFile, "VideoEditorUtils::FileAlreadyExistsL: Out: %d", fileExists);
+    return fileExists;
+}
+
+//=============================================================================
+EXPORT_C void VideoEditorUtils::GetMGAlbumsListForMediaFileL ( 
+    RArray<TInt>& /*aAlbumIdList*/,
+    const TDesC& /*aFileName*/ )
+{
+    LOG(KVideoEditorLogFile, "VideoEditorUtils::GetMGAlbumsListForMediaFileL: In" );
+	LOG(KVideoEditorLogFile, "VideoEditorUtils::GetMGAlbumsListForMediaFileL: Out" );
+}
+
+
+//=============================================================================
+EXPORT_C void VideoEditorUtils::AddMediaFileToMGAlbumL( 
+    const TDesC& /*aFilename*/, 
+    TInt /*aAlbumId*/ )
+	{
+	LOG(KVideoEditorLogFile, "VideoEditorUtils::AddMediaFileToMGAlbumL: In");
+	LOG(KVideoEditorLogFile, "VideoEditorUtils::AddMediaFileToMGAlbumL: Out");
+	}
+
+//=============================================================================
+EXPORT_C TBool VideoEditorUtils::IsLandscapeScreenOrientation()
+	{
+	TRect rect;
+	AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EScreen, rect);
+	return rect.Width() > rect.Height();
+	}
+
+
+//=============================================================================
+EXPORT_C TInt VideoEditorUtils::LaunchQueryDialogL (const TDesC & aPrompt)
+{
+	CAknQueryDialog * dlg = 
+		new (ELeave) CAknQueryDialog ( const_cast<TDesC&>(aPrompt) );
+
+	return dlg->ExecuteLD (R_VIE_CONFIRMATION_QUERY);
+}
+
+
+//=============================================================================
+EXPORT_C TInt VideoEditorUtils::LaunchListQueryDialogL (
+	MDesCArray *	aTextItems,
+	const TDesC &	aPrompt
+	) 
+{
+	//	Selected text item index
+	TInt index (-1);
+
+	//	Create a new list dialog
+    CAknListQueryDialog * dlg = new (ELeave) CAknListQueryDialog (&index);
+
+	//	Prepare list query dialog
+	dlg->PrepareLC (R_VIE_LIST_QUERY);
+
+	//	Set heading
+	dlg->QueryHeading()->SetTextL (aPrompt);
+
+	//	Set text item array
+	dlg->SetItemTextArray (aTextItems);	
+
+	//	Set item ownership
+	dlg->SetOwnershipType (ELbmDoesNotOwnItemArray);
+
+	//	Execute
+	if (dlg->RunLD())
+	{
+		return index;
+	}
+	else
+	{
+		return -1;
+	}
+}
+
+//=============================================================================
+EXPORT_C TInt VideoEditorUtils::LaunchSaveVideoQueryL () 
+{
+	//	Create dialog heading and options
+    HBufC * heading = CEikonEnv::Static()->AllocReadResourceLC ( R_VIE_QUERY_HEADING_SAVE );
+    HBufC * option1 = CEikonEnv::Static()->AllocReadResourceLC ( R_VIE_QUERY_SAVE_NEW );       
+    HBufC * option2 = CEikonEnv::Static()->AllocReadResourceLC ( R_VIE_QUERY_SAVE_REPLACE ); 
+                
+	//	Query dialog texts
+	CDesCArray * options = new (ELeave) CDesCArraySeg ( 2 );
+	CleanupStack::PushL (options);
+	options->AppendL( option1->Des() );
+	options->AppendL( option2->Des() );
+
+	//	Execute query dialog
+	TInt ret = LaunchListQueryDialogL ( options, *heading );
+
+	options->Reset();
+	
+	CleanupStack::PopAndDestroy( options ); 
+	CleanupStack::PopAndDestroy( option2 );
+	CleanupStack::PopAndDestroy( option1 );
+	CleanupStack::PopAndDestroy( heading );
+		
+	return ret;
+}
+
+
+//=============================================================================
+EXPORT_C TInt VideoEditorUtils::LaunchSaveChangesQueryL () 
+{
+	//	Create dialog prompt
+    HBufC * prompt = CEikonEnv::Static()->AllocReadResourceLC ( R_VIE_QUERY_SAVE_CHANGES );
+    
+	//	Execute query dialog
+	TInt ret = LaunchQueryDialogL ( *prompt );
+
+	CleanupStack::PopAndDestroy( prompt );
+
+	return ret;
+}
+
+// End of File