diff -r 1fc85118c3ae -r 870918037e16 eventsui/eventseditor/src/evtmgmtuiringtonecomponent.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eventsui/eventseditor/src/evtmgmtuiringtonecomponent.cpp Wed Sep 01 12:31:27 2010 +0100 @@ -0,0 +1,591 @@ +/* +* 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 "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: 'Set Assigntone' component for retrieving ringtone. +* +*/ + +#include +#include +#include // Audio File List +#include // DRM +#include +#include +#include +#include +#include +#include // Voice Recorder +#include +#include // Icon Array +#include +#include +#include +#include +#include +#include // Gul Icon +#include +#include +#include +#include +#include +#include + +#include "evtmgmteditorui.hrh" +#include "evtmgmtuiringtonecomponent.h" +#include "evtdebug.h" +#include "evteditorconsts.h" + +const TInt KSetToneGranularity = 2; + +// --------------------------------------------------------------------------- +// CEvtEditor ::NewL() +// --------------------------------------------------------------------------- +// +CEvtMgmtUiRingtoneComponent* CEvtMgmtUiRingtoneComponent::NewL(const TPtrC aPrevRingtone) + { + CEvtMgmtUiRingtoneComponent * self = CEvtMgmtUiRingtoneComponent::NewLC(aPrevRingtone); + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------------------------- +// CEvtEditor ::NewLC() +// --------------------------------------------------------------------------- +// +CEvtMgmtUiRingtoneComponent* CEvtMgmtUiRingtoneComponent::NewLC(const TPtrC aPrevRingtone) + { + CEvtMgmtUiRingtoneComponent * self = new (ELeave) CEvtMgmtUiRingtoneComponent(); + CleanupStack::PushL(self); + self->ConstructL( aPrevRingtone ); + return self; + } + +// --------------------------------------------------------------------------- +// CEvtMgmtUiDescComponent ::~CEvtMgmtUiDescComponent() +// --------------------------------------------------------------------------- +// +CEvtMgmtUiRingtoneComponent::~CEvtMgmtUiRingtoneComponent() + { + delete iRingtone; + iRingtone = NULL; + + if( iRecorderClient ) + { + delete iRecorderClient; + iRecorderClient = NULL; + } + + if( iSelectRingtoneDlg ) + { + delete iSelectRingtoneDlg; + iSelectRingtoneDlg = NULL; + } + } + +// --------------------------------------------------------------------------- +// CEvtMgmtUiRingtoneComponent ::ConstructL() +// --------------------------------------------------------------------------- +// +void CEvtMgmtUiRingtoneComponent ::ConstructL( const TPtrC aPrevRingtone ) + { + iRingtone = aPrevRingtone.AllocL(); + } + +// --------------------------------------------------------------------------- +// CEvtMgmtUiRingtoneComponent ::CEvtMgmtUiRingtoneComponent() +// --------------------------------------------------------------------------- +// +CEvtMgmtUiRingtoneComponent::CEvtMgmtUiRingtoneComponent() + { + } + +// ----------------------------------------------------------------------------- +// CEvtMgmtUiRingtoneComponent::Ringtone() +// It is used to retrieve the selected ringtone's absolute path. +// @ret absolute path of the selected ringtone +// ----------------------------------------------------------------------------- +TPtrC CEvtMgmtUiRingtoneComponent::Ringtone() const + { + // if ringtone, returns ringtone else empty string + if( iRingtone ) + return *iRingtone; + else + return KNullDesC(); + } + +// ----------------------------------------------------------------------------- +// CEvtMgmtUiRingtoneComponent::DefaultRingtoneL() +// It is used to retrieve the path of the Default Tone. +// @ret absolute path of the default ringtone +// ----------------------------------------------------------------------------- +TPtrC CEvtMgmtUiRingtoneComponent::DefaultRingtoneL() + { + TFileName toneFileName; + CRepository* centralRepository = CRepository::NewLC(KCRUidCalendar); + User::LeaveIfError(centralRepository->Get(KCalendarSoundFile, toneFileName)); + CleanupStack::PopAndDestroy(centralRepository); + if( iRingtone ) + { + delete iRingtone; + iRingtone = NULL; + } + iRingtone = toneFileName.AllocL(); + + // if ringtone, returns ringtone else empty string + if( iRingtone ) + return *iRingtone; + else + return KNullDesC(); + } + +// ----------------------------------------------------------------------------- +// CEvtMgmtUiRingtoneComponent::DisplayAudioPopupDlgL() +// It is used to display 'Set tone' popup dialog and to retrieve ringtone. +// @ret error if there is any error +// KErrNone if it is successful +// ----------------------------------------------------------------------------- +TInt CEvtMgmtUiRingtoneComponent::DisplayAudioTonePopupDlgL() + { + TInt response = KErrNone; + + //display 'set tone' popup dialog + TInt index = DisplayPopupDlgL(); + + switch(index) + { + case EEvtMgmtUiAssignedToneTone: // if 'select from exising' is selected + { + response = DisplayRingtoneSelectionDlgL(); + break; + } + case EvtMgmtUiAssignedToneRecordNew: //if 'record new' is selected + { + response = RecordNewToneL(); + break; + } + default: + { + response = KErrCancel; + Debug(_L("DisplayAudioTonePopupDlgL panic")); + break; + } + } + return response; + } + +// ----------------------------------------------------------------------------- +// CEvtMgmtUiRingtoneComponent::DisplayRingtoneSelectionDlgL() +// t is used display system's 'select tone' dialog. +// @ret error while displaying 'select tone' dialog and +// retrieving ringtone from it. +// KErrNone if it is successful +// ----------------------------------------------------------------------------- +TInt CEvtMgmtUiRingtoneComponent::DisplayRingtoneSelectionDlgL() + { + TInt response = KErrNone; + + // Create instance of FileList using new FileList API + if(!iSelectRingtoneDlg) + iSelectRingtoneDlg = CFLDFileListContainer::NewL(); + + iSelectRingtoneDlg->SetAutomatedType( CDRMHelper::EAutomatedTypeRingingTone ); + + // Do not show videos, use new FileList API + iSelectRingtoneDlg->AddExclusiveMediaTypeL( ECLFMediaTypeVideo ); + + HBufC* strOff = StringLoader::LoadLC( R_EVTUI_RINGTONESELECT_OFF ); + + iSelectRingtoneDlg->InsertEndNullItemL( *strOff ); + TFileName ringtone( *iRingtone ); + + //launch selection dialog + if( iSelectRingtoneDlg->LaunchL( ringtone ) ) //if ringtone is selected + { + delete iRingtone; + iRingtone = NULL; + iRingtone = ringtone.AllocL(); + } + else // if dialog is cancelled + response = KErrCancel; + + CleanupStack::PopAndDestroy(1 ); // strOff + delete iSelectRingtoneDlg; + iSelectRingtoneDlg = NULL; + + //return error code + return response; + } + +// ----------------------------------------------------------------------------- +// CEvtMgmtUiRingtoneComponent::DisplayPopupDlgL() +// It is used to display generic popup dialog. +// @ret index of item selected if OK is pressed +// KErrCancel if Cancel is pressed +// ----------------------------------------------------------------------------- +TInt CEvtMgmtUiRingtoneComponent::DisplayPopupDlgL() + { + TInt index = 0; + const TInt KToneIconIndex = 0; + const TInt KRecordNewIconIndex = 1; + const TInt KIconTextLength = 1; + const TInt KAssignToneGranularity =2; + _LIT(KTab, "\t"); + HBufC* dummy = NULL; + + //title text + HBufC* title = StringLoader::LoadLC( R_EVTUI_CREATENEW_FORM_ASSIGNTONEPOPUP_TITLE ); + + //Tone + dummy = StringLoader::LoadLC(R_EVTUI_CREATENEW_FORM_ASSIGNTONEPOPUPOPTIONS_TONE); + HBufC* tone = HBufC::NewL( KIconTextLength + KTab().Length() + + dummy->Length() + KTab().Length( )+ KTab().Length() ); + TPtr ptrDummy = tone->Des(); + ptrDummy.Num(KToneIconIndex); + ptrDummy.Append(KTab); + ptrDummy.Append(*dummy); + ptrDummy.Append(KTab); + ptrDummy.Append(KTab); + CleanupStack::PopAndDestroy(dummy); + CleanupStack::PushL(tone); + + // Record new + dummy = StringLoader::LoadLC(R_EVTUI_CREATENEW_FORM_ASSIGNTONEPOPUPOPTIONS_RECORDNEW); + HBufC* recordNew = HBufC::NewL( KIconTextLength + KTab().Length() + + dummy->Length() + KTab().Length( )+ KTab().Length() ); + ptrDummy.Set( recordNew->Des() ); + ptrDummy.Num(KRecordNewIconIndex); + ptrDummy.Append(KTab); + ptrDummy.Append(*dummy); + ptrDummy.Append(KTab); + ptrDummy.Append(KTab); + CleanupStack::PopAndDestroy(dummy); + CleanupStack::PushL(recordNew); + + //array + CDesCArrayFlat* array = new(ELeave)CDesCArrayFlat( KAssignToneGranularity ); + CleanupStack::PushL(array); + array->AppendL(*tone); + array->AppendL(*recordNew); + + //launch dialog + CAknListQueryDialog* dlg = new( ELeave ) CAknListQueryDialog( &index ); + dlg->PrepareLC( R_EVTMGMTUI_LIST_QUERY ); + UpdateIconsL( *dlg ); + dlg->SetItemTextArray( array ); + dlg->SetOwnershipType( ELbmOwnsItemArray ); + dlg->QueryHeading()->SetTextL( *title ); + if ( !dlg->RunLD() ) // if dialog is cancelled + index = KErrCancel; + + CleanupStack::Pop(array); //ownership was transferred to dialog + + CleanupStack::PopAndDestroy( 3 ); //recordNew, tone, title + return index; + } + +// ----------------------------------------------------------------------------- +// CEvtMgmtUiRingtoneComponent::RecordNewToneL() +// It is used to record new ringtone. +// @ret KErrNone if recording is succesful. +// error code if it is failed. +// ----------------------------------------------------------------------------- +TInt CEvtMgmtUiRingtoneComponent::RecordNewToneL() + { + TInt err = KErrNone; + + TFileName fileName; + err = FileNameForRecordingL( fileName ); + if(err!=KErrNone) + { + Debug( _L("Error while generating filename for recording =%d"), err ); + return err; + } + + Debug( _L("Recording filename = ") ); + Debug( fileName ); + + RFs fs; + User::LeaveIfError( fs.Connect() ); + CleanupClosePushL(fs); + fs.ShareProtected(); // The file server session must be in this mode + + + // Record Audio Clip + if(!iRecorderClient) + iRecorderClient = NewFileServiceFactory::NewClientL(); + + //create empty audio file + RFile file; + file.Replace( fs, fileName, EFileShareAny|EFileWrite ); + CleanupClosePushL(file); + + + // launch recorder application to record tone. + TBool response = EFalse; + CAiwGenericParamList* params = CAiwGenericParamList::NewLC(); + TAiwVariant variant; + variant.Set( _L("file" ) ); + TAiwGenericParam param( EGenericParamURL, variant ); + params->AppendL( param ); + TRAP(err, response = iRecorderClient->NewFileL( file, params, ENewFileServiceAudio ) ); + Debug( _L( "Error while recording =%d, response =%d" ), err, response ); + CleanupStack::PopAndDestroy( 2 ); // params, file + delete iRecorderClient; + iRecorderClient = NULL; + //if recording is successful, set ringtone. + if( response && err == KErrNone) + { + delete iRingtone; + iRingtone = NULL; + iRingtone = fileName.AllocL(); + } + + //if recording is cancelled, set err to KErrCancel + if( !response ) + err = KErrCancel; + + //if there is error in recording or recording is cancelled, delete the file. + if( err!=KErrNone ) + fs.Delete( fileName ); + + CleanupStack::PopAndDestroy(); //fs + + return err; + } + +// ----------------------------------------------------------------------------- +// CEvtMgmtUiRingtoneComponent::RecordNewToneL() +// It is used to generate filename for recording new file. +// @param[out] aFileName - it will contain generated file-name +// @ret KErrNone if recording is succesful. +// error code if it is failed. +// ----------------------------------------------------------------------------- +TInt CEvtMgmtUiRingtoneComponent:: FileNameForRecordingL( TDes& aFileName ) + { + PathInfo::GetFullPath(aFileName, EDriveC, PathInfo::ESoundsPath ); + + HBufC* recStr = StringLoader::LoadLC( R_LOCEV_LIST_VOREC_CLIP_NAME ); + + //Open sound directory + RDir directory; + TInt err = directory.Open(CEikonEnv::Static()->FsSession(), aFileName, KEntryAttNormal); + if( err!=KErrNone ) + { + return err; + } + CleanupClosePushL(directory); + + //Retrieve files from directory + TEntryArray fileList; + err = directory.Read(fileList); + + TInt maxValue = 0; + + if ( err == KErrNone || err == KErrEof ) + { + err = KErrNone; + //Check folder's files and find last recent audio file + for (TInt i = 0; i < fileList.Count(); ++i) + { + TEntry fileEntry = fileList[i]; + + TCollationMethod cm = *Mem::CollationMethodByIndex( 0 ); // default collation method + cm.iFlags |= TCollationMethod::EIgnoreNone; + + //Check that file is valid audiofile + if (!fileEntry.IsReadOnly() && + !fileEntry.IsHidden() && + !fileEntry.IsSystem() && + !fileEntry.IsDir() && + TDesC::EIsPrefix == fileEntry.iName.HasPrefixC(*recStr, 0, &cm) && + fileEntry.iName.Find(*recStr) != KErrNotFound) + { + //Find out running number + TParse parser; + parser.Set( fileEntry.iName, NULL, NULL ); + TFileName fileName = parser.Name(); + fileName.Delete(0,recStr->Length()); + fileName.Trim(); + + //Convert digits from any digit format to european digit format. + AknTextUtils::ConvertDigitsTo( fileName, EDigitTypeWestern ); + + TInt multiplier = 1; + TInt count = 0; + for (TInt i = fileName.Length() - 1; i != -1; --i) + { + TChar numberchar = fileName[i]; + //Check if the character is digit + if( numberchar.IsDigit() ) + { + TInt number = numberchar.GetNumericValue(); + + count += number * multiplier; + multiplier = multiplier * 10; + } + else + { + break; + } + } + + //Save current number of audio files + if (count > maxValue) + { + maxValue = count; + } + } + } + } + + //Create a text containing the count to localize + TFileName num; + num.Zero(); + num.AppendNum(maxValue+1); + + //Converts between arabic-indic digits and european digits + //based on existing language setting. + AknTextUtils::LanguageSpecificNumberConversion( num ); + + //set recording filename + aFileName.Append(*recStr); + aFileName.Append(num); + aFileName.Append(KRecorderFileEnd); + + CleanupStack::PopAndDestroy(2); // dir, recStr + + return err; + } + +// ----------------------------------------------------------------------------- +// CEvtMgmtUiRingtoneComponent::UpdateIconsL +// It update icons +// ----------------------------------------------------------------------------- +void CEvtMgmtUiRingtoneComponent::UpdateIconsL( CAknListQueryDialog& aDialog ) + { + Debug(_L("start CEvtMgmtUiPlaceComponent::UpdateIconsL()")); + + CAknIconArray* icons = new( ELeave ) CAknIconArray( KSetToneGranularity ); + CleanupStack::PushL( icons ); + + TFileName *iconFile = IconFileNameLC(); + + AddIconL( *icons, + *iconFile, + KAknsIIDQgnPropFmgrFileSound, + EMbmEvteditorQgn_prop_fmgr_file_sound, EMbmEvteditorQgn_prop_fmgr_file_sound_mask); + + AddIconL( *icons, + *iconFile, + KAknsIIDQgnPropFmgrFileVoicerec, + EMbmEvteditorQgn_prop_fmgr_file_voicerec, EMbmEvteditorQgn_prop_fmgr_file_voicerec_mask); + + CleanupStack::PopAndDestroy(iconFile); + + //set new icons to array + aDialog.SetIconArrayL( icons ); + CleanupStack::Pop(icons); + + Debug(_L("end CEvtMgmtUiPlaceComponent::UpdateIconsL()")); + + } + +// ----------------------------------------------------------------------------- +// CEvtMgmtUiRingtoneComponent::AddIconL +// Append icon to icon array. CAknIconArray owns icons so it is +// easier to it leave safely. +// @param aIcons icon array +// @param aIconFileWithPath icon file name with path +// @param aSkinID skin id of the icon +// @param aIconGraphicsIndex picture index +// @param aIconGraphicsMaskIndex mask index +// ----------------------------------------------------------------------------- +void CEvtMgmtUiRingtoneComponent::AddIconL( CAknIconArray& aIcons, + const TDesC& aIconFileWithPath, + TAknsItemID aSkinID, + TInt aIconGraphicsIndex, + TInt aIconGraphicsMaskIndex ) + { + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + + EVTUIDEBUG( "AknsUtils::SkinInstance" ); + + CFbsBitmap* bitmap = NULL; + CFbsBitmap* bitmapMask = NULL; + TRAPD( err, AknsUtils::CreateIconL( skin, + aSkinID, + bitmap, + bitmapMask, + aIconFileWithPath, + aIconGraphicsIndex, + aIconGraphicsMaskIndex ) ); + + + EVTUIDEBUG1( "AknsUtils::CreateIconL - %d", err ); + if(err != KErrNone) + { + TRAP( err, AknIconUtils::CreateIconL( bitmap, + bitmapMask, + aIconFileWithPath, + aIconGraphicsIndex, + aIconGraphicsMaskIndex ) ); + EVTUIDEBUG1( "AknIconUtils::CreateIconL - %d", err ); + } + User::LeaveIfError( err ); + + CleanupStack::PushL( bitmap ); + CleanupStack::PushL( bitmapMask ); + + CGulIcon* icon = CGulIcon::NewL( bitmap, bitmapMask ); + + // Remove the Bitmap and the Bitmap Icon from the Clean up stack since + // the ownership is taken over by the icon + CleanupStack::Pop( bitmapMask ); + CleanupStack::Pop( bitmap ); + + CleanupStack::PushL( icon ); + aIcons.AppendL( icon ); + CleanupStack::Pop( icon ); // icon + } + +// ----------------------------------------------------------------------------- +// CEvtMgmtUiRingtoneComponent::IconFileNameLC +// Gets Events Management UI icon file path and name. Ownership +// is transferred, item is left in the cleanup stack. +// @return TFileName* The full name of the Events UI icon file. +// ----------------------------------------------------------------------------- +TFileName* CEvtMgmtUiRingtoneComponent::IconFileNameLC() const + { + TFileName* fileName = new(ELeave) TFileName; + CleanupStack::PushL( fileName ); + + TFileName* tmpName = new(ELeave) TFileName; + CleanupStack::PushL( tmpName ); + + tmpName->Append( KDC_BITMAP_DIR ); + tmpName->Append( KEvtMgmtUiIconFileName ); + + CEikAppUi *appUi = ( CEikAppUi *)( CEikonEnv::Static()->AppUi()); + TFileName appDrive = appUi->Application()->AppFullName(); + + TParse parse; + User::LeaveIfError( parse.Set( appDrive, NULL, NULL ) ); + User::LeaveIfError( parse.Set( parse.Drive(), tmpName, NULL ) ); + + fileName->Copy(parse.FullName()); + + CleanupStack::PopAndDestroy( tmpName ); + + return fileName; + } +//end of file