diff -r 000000000000 -r 951a5db380a0 videditor/VideoEditorCommon/src/VideoEditorUtils.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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& /*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(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