phonebookui/Phonebook2/UIControls/src/Pbk2RingtoneCommands.cpp
changeset 0 e686773b3f54
child 68 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/UIControls/src/Pbk2RingtoneCommands.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,254 @@
+/*
+* Copyright (c) 2005-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:  Phonebook 2 ringing tone commands.
+*
+*/
+
+
+// INCLUDES
+#include <e32base.h>
+#include "Pbk2RingtoneCommands.h"
+
+// Phonebook 2
+#include <CPbk2RingingToneFetch.h>
+#include "MPbk2BaseCommand.h"
+
+#include <MVPbkContactFieldTextData.h>
+#include <CPbk2AppUiBase.h>
+#include <MPbk2ApplicationServices.h>
+#include <TPbk2StoreContactAnalyzer.h>
+
+#include <Pbk2CommonUi.rsg>
+#include <Pbk2UIControls.rsg>
+#include <Pbk2Commands.rsg>
+
+// VPbk includes
+#include <MVPbkStoreContact.h>
+#include <MVPbkStoreContactField.h>
+#include <CVPbkContactManager.h>
+#include <TVPbkFieldTypeMapping.h>
+#include <MVPbkFieldType.h>
+#include <VPbkEng.rsg>
+
+// System includes
+#include <AknQueryDialog.h>
+#include <barsread.h>
+#include <coemain.h>
+#include <sysutil.h>
+
+/// Unnamed namespace for local definitions
+namespace {
+
+#ifdef _DEBUG
+
+enum TPanicCode
+    {
+    EPanicPreCond_NULL_Contact = 1
+    };
+
+void Panic( TPanicCode aPanic )
+    {
+    _LIT( KPanicCat, "MPbk2RingtoneCommands" );
+    User::Panic( KPanicCat, aPanic );
+    }
+#endif // _DEBUG    
+
+// local functions
+
+// --------------------------------------------------------------------------
+// ReadFieldTypeL
+// --------------------------------------------------------------------------
+const MVPbkFieldType* ReadFieldTypeL()
+    {
+    return Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager().
+    		FieldTypes().Find( R_VPBK_FIELD_TYPE_RINGTONE );
+    }
+
+// --------------------------------------------------------------------------
+// Copies to aFilename ringtone field content if the field exists
+// in the store contact.
+// --------------------------------------------------------------------------
+inline void RetrieveExistingRingingToneFilenameL( 
+        TFileName& aFilename,
+        const MVPbkStoreContact& aContact )
+    {
+    TPbk2StoreContactAnalyzer analyzer(
+        Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager(),
+        &aContact );
+    TInt fieldIndex = analyzer.HasFieldL( R_PHONEBOOK2_RINGTONE_SELECTOR );
+    if ( fieldIndex != KErrNotFound )
+    	{
+    	const MVPbkStoreContactField& field =
+    		aContact.Fields().FieldAt( fieldIndex );
+    	aFilename.Copy(
+    			MVPbkContactFieldTextData::Cast( field.FieldData() ).Text() );    	
+    	}
+    }
+
+// --------------------------------------------------------------------------
+// Shows select ringtone dialog. aContact is used to preselect assigned
+// ringtone file.
+// Returns ETrue if user selected a ringtone file.
+// It is returned in aToneFilename. If user selects default ringtone,
+// than aToneFilename will be empty
+// --------------------------------------------------------------------------
+//
+inline TBool FetchRingingToneL( TFileName& aToneFilename,
+		const MVPbkStoreContact& aContact )
+    {
+    TBool retval = EFalse;
+    RetrieveExistingRingingToneFilenameL( aToneFilename, aContact );
+    CPbk2RingingToneFetch* toneFetch = CPbk2RingingToneFetch::NewL();
+    CleanupStack::PushL( toneFetch );
+    // Run select ringtone dialog
+    if ( toneFetch->FetchRingingToneL( aToneFilename ) )
+        {
+        retval = ETrue;
+        }
+    CleanupStack::PopAndDestroy( toneFetch );
+    return retval;
+    }
+
+} /// namespace
+
+// --------------------------------------------------------------------------
+// MPbk2RingtoneCommands::SetRingtoneL
+// --------------------------------------------------------------------------
+//
+MPbk2BaseCommand* Pbk2RingtoneCommands::SetRingtoneL(
+		MVPbkStoreContact* aContact )
+	{
+	__ASSERT_DEBUG( aContact, Panic( EPanicPreCond_NULL_Contact ) );
+	
+    TBool retval =  EFalse;
+    TFileName ringtoneFilename;
+
+    RFs fs = CCoeEnv::Static()->FsSession();
+    if ( SysUtil::FFSSpaceBelowCriticalLevelL( &fs ) )
+        {
+        User::Leave( KErrDiskFull );
+        }
+    
+    retval = FetchRingingToneL( ringtoneFilename, *aContact );
+    if ( retval )
+        {
+        MVPbkStoreContactField* field = NULL;
+        // First check if the field is available already
+        TPbk2StoreContactAnalyzer analyzer(
+            Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager(),
+            aContact );
+        TInt fieldIndex = analyzer.HasFieldL( R_PHONEBOOK2_RINGTONE_SELECTOR );
+
+        if ( fieldIndex != KErrNotFound)
+            {
+            // Check if the iToneFilename is set
+            if (ringtoneFilename.Length() <= 0)
+                {
+                // If filename is not set and the contact has the field
+                // field can be removed.
+                //aContact->RemoveField( fieldIndex );
+                //Instead of above we don't remove the field, just zero it's data
+                MVPbkContactFieldData& data(aContact->Fields().
+                    FieldAt( fieldIndex ).FieldData());
+                MVPbkContactFieldTextData::Cast( data ).SetTextL(KNullDesC);
+                }
+            else
+                {
+                // If filename has been set and the contact has the field
+                // field should be updated.
+                field = &aContact->Fields().FieldAt( fieldIndex );
+                MVPbkContactFieldTextData::Cast( field->FieldData() ).
+                    SetTextL( ringtoneFilename );
+                }
+            }
+        else
+            {
+            // Contact does not have the field, so create new one.
+            if ( ringtoneFilename.Length() > 0 )
+                {
+                const MVPbkFieldType* fieldType = ReadFieldTypeL();
+                if ( !fieldType )
+                    {
+                    ReadFieldTypeL();
+                    }
+                User::LeaveIfNull( fieldType );
+                // iToneFilename is set
+                field = aContact->CreateFieldLC( *fieldType );
+                MVPbkContactFieldTextData::Cast( field->FieldData() ).
+                    SetTextL( ringtoneFilename );
+                aContact->AddFieldL( field );
+                CleanupStack::Pop(); // field
+                }
+            }
+        }
+    return NULL; // synchronous operation
+	}
+
+// --------------------------------------------------------------------------
+// MPbk2RingtoneCommands::RemoveRingtoneL
+// --------------------------------------------------------------------------
+//
+MPbk2BaseCommand* Pbk2RingtoneCommands::RemoveRingtoneL(
+		MVPbkStoreContact* aContact )
+	{
+	__ASSERT_DEBUG( aContact, Panic( EPanicPreCond_NULL_Contact ) );
+	
+    if( CAknQueryDialog::NewL()->ExecuteLD(
+            R_PHONEBOOK2_REMOVE_RINGTONE_CONFIRMATION_DIALOG ) )
+        {
+        TPbk2StoreContactAnalyzer analyzer
+        	( Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager(),
+        			aContact );
+        TInt fieldIndex( KErrNotFound );
+        fieldIndex = analyzer.HasFieldL( R_PHONEBOOK2_RINGTONE_SELECTOR );
+	    if ( fieldIndex != KErrNotFound )
+			{
+		    // aContact->RemoveField (fieldIndex);
+			//Instead of above we don't remove the field, just zero it's data
+			MVPbkContactFieldData& data(aContact->Fields().
+			    FieldAt( fieldIndex ).FieldData());
+            MVPbkContactFieldTextData::Cast( data ).SetTextL(KNullDesC);
+			}
+        }
+    return NULL; // synchronous operation
+	}
+
+// --------------------------------------------------------------------------
+// MPbk2RingtoneCommands::IsRingtoneFieldL
+// --------------------------------------------------------------------------
+//
+TBool Pbk2RingtoneCommands::IsRingtoneFieldL(
+		const MVPbkStoreContactField& aField )
+	{
+    TPbk2StoreContactAnalyzer analyzer(
+    		Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager(),
+    		NULL );
+    return analyzer.IsFieldTypeIncludedL(
+    		aField, R_PHONEBOOK2_RINGTONE_SELECTOR );    
+	}
+
+// --------------------------------------------------------------------------
+// MPbk2RingtoneCommands::IsRingtoneFieldValidL
+// --------------------------------------------------------------------------
+//
+TBool Pbk2RingtoneCommands::IsRingtoneFieldValidL(
+		const MVPbkStoreContactField& aField )
+	{
+    const MVPbkContactFieldTextData& textData = 
+        MVPbkContactFieldTextData::Cast( aField.FieldData() );
+    TEntry ignore;
+    return CCoeEnv::Static()->FsSession().Entry( textData.Text(), ignore ) == KErrNone;
+	}
+
+// End of File