diff -r 5b6f26637ad3 -r f4a778e096c2 phonebookui/Phonebook2/ServerApplication/src/Pbk2AssignValidateField.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/ServerApplication/src/Pbk2AssignValidateField.cpp Wed Sep 01 12:29:52 2010 +0100 @@ -0,0 +1,179 @@ +/* +* 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 assign service field validator. +* +*/ + + +#include "Pbk2AssignValidateField.h" + +// Phonebook 2 +#include +#include + +// Virtual Phonebook +#include +#include +#include +#include +#include + + +/// Unnamed namespace for local definitions +namespace { + +const TInt KOne = 1; + +/** + * Checks does a given file exist. + * + * @param aFs File server session. + * @param aFileName Name of the file to check. + * @return ETrue if file exists. + */ +inline TBool FileExists( RFs& aFs, const TDesC& aFileName ) + { + TEntry ignore; + return ( aFs.Entry( aFileName, ignore ) == KErrNone ); + } + +/** + * Returns the amount of fields of given type in given contact. + * + * @param aContact The contact to inspect. + * @param aFieldType The field type to inspect. + * @return Amount of fields of given type in the given contact. + */ +TInt CurrentAmountOfFieldTypeInContact + ( CPbk2PresentationContact& aContact, + const MVPbkFieldType& aFieldType ) + { + TInt res = 0; + + // Count of contact fields + const TInt count = aContact.Fields().FieldCount(); + + const TInt maxMatchPriority = aContact.ContactStore(). + StoreProperties().SupportedFields().MaxMatchPriority(); + + for ( TInt i = 0; i < count; ++i ) + { + const MVPbkFieldType* type = NULL; + const MVPbkStoreContactField& field = aContact.Fields().FieldAt( i ); + + for ( TInt j = 0; j < maxMatchPriority && !type; ++j ) + { + type = field.MatchFieldType( j ); + } + + if ( (aFieldType.IsSame( *type ) ) ) + { + ++res; + } + } + + return res; + } + +} /// namespace + +// -------------------------------------------------------------------------- +// Pbk2AssignValidateField::ValidateFieldTypeUsageInContactL +// -------------------------------------------------------------------------- +// +TInt Pbk2AssignValidateField::ValidateFieldTypeUsageInContactL + ( CPbk2PresentationContact& aContact, + const MVPbkFieldType& aFieldType, RFs& aFsSession, + TInt& aFieldIndex ) + { + TInt ret = KErrNotFound; + + const MVPbkStoreContactFieldCollection& fields = aContact.Fields(); + const MVPbkStoreContactField* field = NULL; + const TInt fieldCount = fields.FieldCount(); + + for ( TInt i( 0 ); i < fieldCount; ++i) + { + field = &fields.FieldAt(i); + const MVPbkFieldType* fieldType = field->BestMatchingFieldType(); + + if ( fieldType && fieldType->IsSame( aFieldType ) ) + { + // Field type was found from contact + ret = KErrNone; + aFieldIndex = aContact.PresentationFields().StoreIndexOfField( i ); + break; + } + } + + if ( ret == KErrNone ) + { + // Field was found from contact but if it was a ringing tone or an + // image field do a file exist check. If the file those fields are + // referencing is not found from the file system, the field is + // hidden in Phonebook UI. It is not removed, but hidden because + // the file might reside on a removable media and come back later on. + // + // The logic here is to not to ask overwrite contact field + // confirmation from the user if the file does not currently exist. + + TInt fieldTypeResId = aFieldType.FieldTypeResId(); + if ( fieldTypeResId == R_VPBK_FIELD_TYPE_RINGTONE || + fieldTypeResId == R_VPBK_FIELD_TYPE_CALLEROBJIMG ) + { + const MVPbkContactFieldTextData& textData = + MVPbkContactFieldTextData::Cast( field->FieldData() ); + + if ( !FileExists( aFsSession, textData.Text() ) ) + { + // The file the contact field indicates is not + // on the file system, return KErrPathNotFound to indicate + // that the contact haves this field but the file refenced + // is not found + ret = KErrPathNotFound; + // Do not change the aFieldIndex value here though. + } + } + } + + if ( ret == KErrNone ) + { + // Get maximum number of fields of given type in the contact + const TInt max = aContact.MaxNumberOfFieldL( aFieldType ); + + if ( max != KVPbkStoreContactUnlimitedNumber ) + { + // Get current amount of fields of given type in the contact + TInt current = CurrentAmountOfFieldTypeInContact + ( aContact, aFieldType ); + + if ( current >= max ) + { + // Return code depends on multiplicity + if ( max == KOne ) + { + ret = KErrAlreadyExists; + } + else + { + ret = KErrNotSupported; + } + } + } + } + + return ret; + } + +// End of File