--- a/eventsui/eventseditor/src/evtmgmtuiringtonecomponent.cpp Tue Feb 02 00:16:03 2010 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,591 +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 "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 <evtmgmteditorui.rsg>
-#include <StringLoader.h>
-#include <CFLDFileListContainer.h> // Audio File List
-#include <DRMHelper.h> // DRM
-#include <eikenv.h>
-#include <aknlistquerydialog.h>
-#include <pathinfo.h>
-#include <driveinfo.h>
-#include <f32file.h>
-#include <NewFileServiceClient.h> // Voice Recorder
-#include <AiwGenericParam.h>
-#include <AknIconArray.h> // Icon Array
-#include <evteditor.mbg>
-#include <avkon.mbg>
-#include <AknsUtils.h>
-#include <AknsSkinInstance.h>
-#include <data_caging_path_literals.hrh>
-#include <gulicon.h> // Gul Icon
-#include <eikapp.h>
-#include <eikappui.h>
-#include <CalendarDomainCRKeys.h>
-#include <centralrepository.h>
-#include <AknUtils.h>
-#include <collate.h>
-
-#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