--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/msgeditor/appuisrc/MsgCheckNames.cpp Wed Sep 01 12:31:54 2010 +0100
@@ -0,0 +1,1061 @@
+/*
+* Copyright (c) 2002 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: Alias name matching functionality.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "MsgCheckNames.h"
+
+#include <eiklbv.h>
+#include <aknlistquerydialog.h>
+#include <CPbkContactEngine.h> // CPbkContactEngine
+#include <CPbkIdleFinder.h> // CPbkIdleFinder
+#include <CPbkContactItem.h> // Phonebook Contact
+#include <cntdef.h> //CheckNames
+#include <CPbkSmsAddressSelect.h> //CheckNames
+#include <CPbkEmailAddressSelect.h> //CheckNames
+#include <CPbkMmsAddressSelect.h> //CheckNames
+#include <MsgAddressControl.h> // CMsgRecipientArray/CheckNames
+
+#include <MsgEditorAppUi.rsg> // resource identifiers
+
+#include <VPbkContactStoreUris.h>
+#include <TVPbkFieldVersitProperty.h>
+#include <MVPbkContactFieldTextData.h>
+#include <MVPbkStoreContact.h>
+#include <RVPbkContactFieldDefaultPriorities.h>
+#include <TVPbkContactStoreUriPtr.h>
+#include <CPbk2StoreConfiguration.h>
+#include <MVPbkContactLink.h>
+#include <CVPbkFieldTypeRefsList.h>
+#include <CVPbkContactStoreUriArray.h>
+
+#include <CVPbkFieldTypeSelector.h>
+#include <VPbkContactViewFilterBuilder.h>
+#include <AiwContactSelectionDataTypes.h>
+
+#include <TVPbkWordParserCallbackParam.h>
+#include <AiwContactSelectionDataTypes.h>
+#include <RVPbkContactFieldDefaultPriorities.h>
+
+#include <featmgr.h>
+
+// MACROS
+_LIT( KItemStart, "1\t" ); //For creation of checkbox list
+
+const TUint KLatinCharEnd = 0xFF;
+
+_LIT( KPanicText, "Check names -panic" );
+
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ---------------------------------------------------------
+// FindWordSplitterL
+// ---------------------------------------------------------
+//
+TInt FindWordSplitterL( TAny* aParams )
+ {
+ TVPbkWordParserCallbackParam* parser =
+ static_cast<TVPbkWordParserCallbackParam*>( aParams );
+
+ const TText* ptr = parser->iStringToParse->Ptr();
+ const TText* end = ptr + parser->iStringToParse->Length();
+
+ const TText* startOfWord=NULL;
+ FOREVER
+ {
+ if ( ptr==end || TChar(*ptr).IsSpace() )
+ {
+ if ( startOfWord )
+ {
+ TPtrC addWord( startOfWord,ptr - startOfWord );
+ parser->iWordArray->AppendL( addWord );
+ startOfWord = NULL;
+ }
+ if ( ptr == end )
+ {
+ break;
+ }
+ }
+ else if ( !startOfWord )
+ {
+ startOfWord = ptr;
+ }
+ ptr++;
+ }
+ return( KErrNone );
+ }
+
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMsgCheckNames::CMsgCheckNames
+//
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CMsgCheckNames::CMsgCheckNames()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgCheckNames::ConstructL
+//
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CMsgCheckNames::ConstructL()
+ {
+ iFoundContacts = CVPbkContactLinkArray::NewL();
+
+ iStoreConfiguration = CPbk2StoreConfiguration::NewL();
+
+ CVPbkContactStoreUriArray* storeArray = iStoreConfiguration->SearchStoreConfigurationL();
+ CleanupStack::PushL( storeArray );
+
+ iCommonUtils = CContactMatcher::NewL( &CCoeEnv::Static()->FsSession() );//parameter for RFs&
+ iCommonUtils->OpenStoreL( *storeArray );
+ iServiceHandler = CAiwServiceHandler::NewL();
+ iServiceHandler->AttachL ( R_CHECKNAMES_FETCH_INTEREST );
+
+ iStoreConfiguration->AddObserverL( *this );
+
+ CleanupStack::PopAndDestroy( storeArray );
+
+ FeatureManager::InitializeLibL();
+
+ if ( FeatureManager::FeatureSupported( KFeatureIdChinese ) )
+ {
+ iUseAdvancedMatch = ETrue;
+ }
+
+ FeatureManager::UnInitializeLib();
+ }
+
+
+// -----------------------------------------------------------------------------
+// CMsgCheckNames::NewL
+//
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMsgCheckNames* CMsgCheckNames::NewL()
+ {
+ CMsgCheckNames* self = CMsgCheckNames::NewLC();
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgCheckNames::NewLC
+//
+// Factory method
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMsgCheckNames* CMsgCheckNames::NewLC()
+ {
+ CMsgCheckNames* self = new (ELeave) CMsgCheckNames();
+ CleanupStack::PushL(self);
+
+ self->ConstructL();
+
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgCheckNames::~CMsgCheckNames
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMsgCheckNames::~CMsgCheckNames()
+ {
+ delete iFoundContacts;
+ delete iCommonUtils;
+
+ if ( iWait.IsStarted() )
+ {
+ iWait.AsyncStop();
+ }
+
+ delete iServiceHandler;
+ delete iStoreConfiguration;
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgCheckNames::FindAndCheckByNameL
+//
+// Finds the contact items that match the given search string, checks if they
+// are valid and if there are more than one valid matches shows them in a dialog
+// where user can select one or more of the contacts. If shudown flag is set
+// leaves with KLeaveExit code to make the application to shutdown
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CMsgCheckNames::FindAndCheckByNameL( const TDesC& aText,
+ TMsgAddressSelectType aAddressSelectType,
+ CMsgRecipientArray& aRecipientArray,
+ TInt aIndex )
+ {
+ TBool returnValue = EFalse;
+
+ TAiwAddressSelectType addressType = ConvertToPbk2Type( aAddressSelectType );
+
+ CVPbkFieldTypeRefsList* fieldTypes = CVPbkFieldTypeRefsList::NewL();
+ CleanupStack::PushL( fieldTypes );
+
+ DefineSearchFieldsL( *fieldTypes );
+
+ iFoundContacts->ResetAndDestroy();
+
+ //search the given string from the fields
+ CDesCArray* wordArray = SplitFindStringL( aText );
+ CleanupStack::PushL( wordArray );
+ TCallBack findParser( FindWordSplitterL );
+
+ iCommonUtils->MatchDataL( *wordArray, *fieldTypes, *iFoundContacts, findParser );
+
+ CleanupStack::PopAndDestroy( wordArray );
+
+ // If simple matching did not find any result and advanced flag is
+ // on perform advanced matching.
+ if ( iUseAdvancedMatch &&
+ iFoundContacts &&
+ iFoundContacts->Count() == 0 &&
+ UseAdvancedMatch( aText ) )
+ {
+ PerformAdvancedMatchL( aText, fieldTypes );
+ }
+ // Coverty fix, Forward NULL , http://ousrv057/cov.cgi?cid=35690
+ TInt contactAmount = 0;
+ if(iFoundContacts)
+ {
+ contactAmount = iFoundContacts->Count();
+ }
+
+ // Offer the user a list of matching contacts
+ if ( contactAmount > 1 )
+ {
+ CDesCArray* items = new ( ELeave ) CDesCArrayFlat(4);
+ CleanupStack::PushL( items );
+
+ CVPbkContactLinkArray* helperArray = CVPbkContactLinkArray::NewL();
+ CleanupStack::PushL( helperArray );
+
+ //go through every contact, search the names for them and insert into items array
+ for ( TInt i = 0; i<contactAmount; i++ )
+ {
+ MVPbkStoreContact* storeContact = NULL;
+ iCommonUtils->GetStoreContactL( iFoundContacts->At(i), &storeContact );
+ storeContact->PushL();
+
+ if ( KErrNotFound != iCommonUtils->ContactHasFieldOfTypeL( addressType, *storeContact ) )
+ {
+ MVPbkStoreContactFieldCollection& fieldCollection = storeContact->Fields();
+
+ HBufC* contactName = iCommonUtils->GetNameL( fieldCollection );
+ if ( contactName )
+ {
+ contactName = contactName->ReAllocL( contactName->Des().Length()+2 );
+ CleanupStack::PushL( contactName );
+
+ TPtr contactNamePtr = contactName->Des();
+
+ /*
+ * Fix the split contact name issue::ECYU-7FPC93.
+ * Replace any enter-key characters with space characters.
+ * Start
+ */
+
+ TInt enterKeyPos;
+ TChar enterChar( CEditableText::EParagraphDelimiter );
+ TChar spaceChar( CEditableText::ESpace );
+ TInt nameLength = contactNamePtr.Length();
+
+ enterKeyPos = contactNamePtr.Locate(enterChar);
+ while( enterKeyPos != KErrNotFound && enterKeyPos < nameLength )
+ {
+ contactNamePtr[enterKeyPos] = spaceChar;
+ enterKeyPos = contactNamePtr.Locate(enterChar);
+ }
+ // Fix: End
+ // We need to add the checkbox
+ contactNamePtr.Insert( 0, KItemStart );
+
+ // Pay attention to the order of the items
+ TInt pos = items->InsertIsqAllowDuplicatesL( contactNamePtr, ECmpCollated );
+ CleanupStack::PopAndDestroy( contactName );
+
+ const MVPbkContactLink& preservedLink = iFoundContacts->At( i );
+
+ MVPbkContactLink* link = preservedLink.CloneLC();
+ helperArray->InsertL( link, pos );
+
+ CleanupStack::Pop();
+ }
+ }
+
+ CleanupStack::PopAndDestroy( storeContact );
+ }
+
+ iFoundContacts->ResetAndDestroy();
+
+ if ( items->Count() )
+ {
+ CListBoxView::CSelectionIndexArray* matchingRecipients =
+ new ( ELeave ) CArrayFixFlat<TInt>( contactAmount );
+ CleanupStack::PushL( matchingRecipients );
+
+ CAknListQueryDialog* dlg = new (ELeave) CAknListQueryDialog( matchingRecipients );
+ dlg->PrepareLC( R_MEB_CHECKNAMES_QUERY );
+ dlg->SetItemTextArray( items );
+ dlg->SetOwnershipType( ELbmDoesNotOwnItemArray );
+
+ if ( dlg->RunLD() )
+ {
+ // We must now read which one / ones of the contacts the user selected
+ const TInt recipientCount = matchingRecipients->Count();
+ MVPbkContactLink* link = NULL;
+
+ for ( TInt i = 0; i < recipientCount; ++i )
+ {
+ // Copying entries
+ link = helperArray->At( matchingRecipients->At( i ) ).CloneLC();
+
+ // Inserts entry, shifts original items
+ iFoundContacts->InsertL( link, i );
+ CleanupStack::Pop();
+ }
+ }
+ CleanupStack::PopAndDestroy(); // matchingRecipients
+ }
+ CleanupStack::PopAndDestroy( 2, items);//helperArray
+ }
+
+ CleanupStack::PopAndDestroy( fieldTypes ); // fieldtypes
+
+ if ( iFoundContacts->Count() > 0 )
+ {
+ ExecuteSingleItemFetchL(
+ TAiwSingleItemSelectionDataV1().SetAddressSelectType( addressType ) );
+
+ CAknInputBlock* inputBlock = CAknInputBlock::NewCancelHandlerLC( this );
+
+ iWait.Start(); // Make this whole op look like synchronous
+
+ CleanupStack::PopAndDestroy( inputBlock );
+
+ if ( iShutdown )
+ {
+ User::Leave( KLeaveExit );
+ }
+
+ if ( iFoundContacts->Count() > 0 )//the process might have been cancelled
+ {
+ PutContactsToArrayL( aRecipientArray, aIndex );
+ returnValue = ETrue;
+ }
+ }
+
+ //return false if no contacts
+ return returnValue;
+ }
+
+// ----------------------------------------------------------------------------
+// CMsgCheckNames::FetchRecipientsL
+//
+// Fetches the recipients, and searches the address from the selected recipients
+// Starts input blocker to "eat" all key press events to editor during
+// phonebook operations. If shudown flag is set leaves with KLeaveExit code
+// to make the application to shutdown
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CMsgCheckNames::FetchRecipientsL( CMsgRecipientArray& aRecipientList,
+ TMsgAddressSelectType aAddressSelectType )
+ {
+ TAiwAddressSelectType addressType = ConvertToPbk2Type( aAddressSelectType );
+
+ // Construct empty filter
+ CVPbkFieldTypeSelector* contactViewFilter =
+ CVPbkFieldTypeSelector::NewL( iCommonUtils->FieldTypes() );
+ CleanupStack::PushL( contactViewFilter );
+
+ // Append the filter object with suitable criteria
+ if ( addressType == EAiwEMailSelect )
+ {
+ VPbkContactViewFilterBuilder::BuildContactViewFilterL( *contactViewFilter,
+ EVPbkContactViewFilterEmail,
+ iCommonUtils->GetContactManager() );
+ }
+
+ else if ( addressType == EAiwMMSSelect )
+ {
+ VPbkContactViewFilterBuilder::BuildContactViewFilterL( *contactViewFilter,
+ EVPbkContactViewFilterPhoneNumber,
+ iCommonUtils->GetContactManager() );
+
+ VPbkContactViewFilterBuilder::BuildContactViewFilterL( *contactViewFilter,
+ EVPbkContactViewFilterEmail,
+ iCommonUtils->GetContactManager() );
+ }
+
+ else
+ {
+ VPbkContactViewFilterBuilder::BuildContactViewFilterL( *contactViewFilter,
+ EVPbkContactViewFilterPhoneNumber,
+ iCommonUtils->GetContactManager() );
+ }
+
+ iFoundContacts->ResetAndDestroy();
+
+ TAiwMultipleItemSelectionDataV1 selectionData;
+ selectionData.SetFetchFilter( contactViewFilter );
+ selectionData.SetAddressSelectType( addressType );
+
+ ExecuteMultipleItemFetchL( selectionData );
+
+ CleanupStack::PopAndDestroy( contactViewFilter );
+
+ CAknInputBlock* inputBlock = CAknInputBlock::NewCancelHandlerLC( this );
+
+ iWait.Start();
+
+ if ( iFoundContacts->Count() > 0 )
+ {
+ // The process might have been cancelled in which case there
+ // will not be any contacts.
+ PutContactsToArrayL( aRecipientList, -1 );
+ }
+
+ CleanupStack::PopAndDestroy( inputBlock );
+
+ if ( iShutdown )
+ {
+ User::Leave( KLeaveExit );
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CMsgCheckNames::FetchRecipientsL
+//
+// Fetches the recipients. If shudown flag is set leaves with KLeaveExit code
+// to make the application to shutdown
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CMsgCheckNames::FetchRecipientsL( CVPbkContactLinkArray& aContactLinkArray,
+ TMsgAddressSelectType /*aAddressSelectType*/ )
+ {
+ ExecuteMultipleEntryFetchL( TAiwMultipleEntrySelectionDataV2().SetFetchFilter( NULL ).SetFlags( 0 ) );
+
+ CAknInputBlock* inputBlock = CAknInputBlock::NewCancelHandlerLC( this );
+
+ iWait.Start(); // Wait for the user to check off the names.
+
+ CleanupStack::PopAndDestroy( inputBlock );
+
+ if ( iShutdown )
+ {
+ User::Leave( KLeaveExit );
+ }
+
+ if ( iFoundContacts->Count() )
+ {
+ for ( TInt n = 0; n < iFoundContacts->Count(); n++ )
+ {
+ aContactLinkArray.AppendL( iFoundContacts->At( n ).CloneLC() );
+ CleanupStack::Pop(); // Cloned link.
+ }
+ }
+ }
+
+// ----------------------------------------------------
+// CMsgCheckNames::GetAlias
+// ----------------------------------------------------
+//
+
+EXPORT_C void CMsgCheckNames::GetAliasL(const TDesC& aNumber,TDes& aAlias,TInt aMaxLength)
+ {
+ // Match contacts to the from address
+ CVPbkContactLinkArray* linkArray = CVPbkContactLinkArray::NewLC();
+ iCommonUtils->MatchPhoneNumberL(aNumber,7,CVPbkPhoneNumberMatchStrategy::EVPbkStopOnFirstMatchFlag,*linkArray );
+ TInt tmpcnt = linkArray->Count();
+ if ( linkArray->Count() > 0 )
+ {
+ MVPbkStoreContact* contact;
+ iCommonUtils->GetStoreContactL(linkArray->At(0), &contact);
+ contact->PushL();
+
+ MVPbkStoreContactFieldCollection& coll = contact->Fields();
+ HBufC* alias = iCommonUtils->GetNameL( coll );
+
+ if ( alias )
+ {
+ if ( alias->Length() > aMaxLength )
+ {
+ aAlias = alias->Left( aMaxLength );
+ }
+ else
+ {
+ aAlias = *alias;
+ }
+ delete alias;
+ alias = NULL;
+ }
+ CleanupStack::PopAndDestroy( contact ); // contact
+ }
+ else
+ {
+ aAlias = KNullDesC();
+ }
+ CleanupStack::PopAndDestroy( 1); // linkArray, ,
+ }
+
+// ----------------------------------------------------------------------------
+// CMsgCheckNames::HandleNotifyL
+// ----------------------------------------------------------------------------
+//
+TInt CMsgCheckNames::HandleNotifyL( TInt aCmdId,
+ TInt aEventId,
+ CAiwGenericParamList& aEventParamList,
+ const CAiwGenericParamList& /*aInParamList*/ )
+ {
+ // the trapd is to enable stopping the iWait in case of a leave
+ // trapping a lot of code to make future extensions easier
+ __ASSERT_ALWAYS( iFoundContacts, User::Panic(KPanicText,0) );
+
+ TInt retVal = KErrNone;
+
+ TRAPD( err,
+ {
+ iFoundContacts->ResetAndDestroy();
+ if ( aEventId == KAiwEventCompleted )
+ {
+ TInt index = 0;
+ const TAiwGenericParam* param =
+ aEventParamList.FindFirst( index, EGenericParamContactLinkArray );
+ if ( param )
+ {
+ TPtrC8 contactLinks = param->Value().AsData();
+ if ( contactLinks.Length() ) // If the event was cancelled
+ {
+ CVPbkContactLinkArray* links =
+ CVPbkContactLinkArray::NewLC( contactLinks,
+ iCommonUtils->GetContactStoresL() );
+ CleanupStack::Pop(); //links
+
+ // Replace iFoundContacts
+ delete iFoundContacts;
+ iFoundContacts = links;
+ }
+ else
+ {
+ retVal = KErrArgument;
+ }
+ }
+ else
+ {
+ retVal = KErrArgument;
+ }
+ }
+ else if ( aEventId == KAiwEventOutParamCheck )
+ {
+ if ( aCmdId == KAiwCmdSelect )
+ {
+ retVal = 1;//this value going back to aiw-component to inform param to be ok
+ }
+ }
+
+ else
+ {
+ retVal = KErrCompletion;
+ }
+
+ if ( retVal != 1 && iWait.IsStarted() )
+ {
+ iWait.AsyncStop();
+ }
+ } );
+
+ if ( err != KErrNone )
+ {
+ if ( iWait.IsStarted() )
+ {
+ iWait.AsyncStop();
+ }
+ User::Leave( err );
+ }
+
+ return retVal;
+ }
+
+
+// ----------------------------------------------------
+// CMsgCheckNames::ExecuteMultipleEntryFetchL
+//
+// Uses aiw to fetch contact(s) from vpbk
+// ----------------------------------------------------
+//
+void CMsgCheckNames::ExecuteMultipleEntryFetchL( TAiwMultipleEntrySelectionDataV2 aData )
+ {
+ CAiwGenericParamList& inParamList = iServiceHandler->InParamListL();
+ inParamList.AppendL( TAiwGenericParam(
+ EGenericParamContactSelectionData,
+ TAiwVariant( TAiwMultipleEntrySelectionDataV2Pckg( aData ) ) ) );
+
+ iServiceHandler->ExecuteServiceCmdL( KAiwCmdSelect,
+ inParamList,
+ iServiceHandler->OutParamListL(),
+ 0,
+ this );
+ }
+
+// ----------------------------------------------------------------------------
+// CMsgCheckNames::ExecuteSingleItemFetchL
+// ----------------------------------------------------------------------------
+//
+void CMsgCheckNames::ExecuteSingleItemFetchL( TAiwSingleItemSelectionDataV1 aData )
+ {
+ RVPbkContactFieldDefaultPriorities defaultPriorities;
+ CleanupClosePushL( defaultPriorities );
+
+ SetDefaultPrioritiesL( aData.AddressSelectType(), defaultPriorities );
+
+ aData.SetDefaultPriorities( defaultPriorities );
+
+ CAiwGenericParamList& inParamList = iServiceHandler->InParamListL();
+ inParamList.AppendL( TAiwGenericParam(
+ EGenericParamContactSelectionData,
+ TAiwVariant( TAiwSingleItemSelectionDataV1Pckg( aData ) ) ) );
+
+ // the validity of iFoundContacts is checkeck by the calling function
+ HBufC8* packedLinks = iFoundContacts->PackLC();
+
+ inParamList.AppendL( TAiwGenericParam( EGenericParamContactLinkArray,
+ TAiwVariant( *packedLinks ) ) );
+
+ iServiceHandler->ExecuteServiceCmdL( KAiwCmdSelect,
+ inParamList,
+ iServiceHandler->OutParamListL(),
+ 0,
+ this );
+ CleanupStack::PopAndDestroy( 2, &defaultPriorities );
+ }
+
+// ----------------------------------------------------------------------------
+// CMsgCheckNames::ExecuteMultipleItemFetchL
+// ----------------------------------------------------------------------------
+//
+void CMsgCheckNames::ExecuteMultipleItemFetchL( TAiwMultipleItemSelectionDataV1& aData )
+ {
+ RVPbkContactFieldDefaultPriorities defaultPriorities;
+ CleanupClosePushL( defaultPriorities );
+
+ SetDefaultPrioritiesL( aData.AddressSelectType(), defaultPriorities );
+
+ aData.SetDefaultPriorities( defaultPriorities );
+
+ CAiwGenericParamList& inParamList = iServiceHandler->InParamListL();
+ inParamList.AppendL( TAiwGenericParam(
+ EGenericParamContactSelectionData,
+ TAiwVariant( TAiwMultipleItemSelectionDataV1Pckg( aData ) ) ) );
+
+ // the validity of iFoundContacts is checkeck by the calling function
+ HBufC8* packedLinks = iFoundContacts->PackLC();
+
+ inParamList.AppendL( TAiwGenericParam( EGenericParamContactLinkArray,
+ TAiwVariant( *packedLinks ) ) );
+
+ iServiceHandler->ExecuteServiceCmdL( KAiwCmdSelect,
+ inParamList,
+ iServiceHandler->OutParamListL(),
+ 0,
+ this );
+ CleanupStack::PopAndDestroy( 2, &defaultPriorities );
+ }
+
+// ----------------------------------------------------------------------------
+// CMsgCheckNames::PutContactsToArrayL
+// ----------------------------------------------------------------------------
+//
+void CMsgCheckNames::PutContactsToArrayL( CMsgRecipientArray& aRecipientArray, TInt aIndex )
+ {
+ __ASSERT_ALWAYS( iFoundContacts, User::Panic(KPanicText,0) );
+ //delete the original entry, if there was one
+ if ( aIndex > -1 &&
+ aIndex < aRecipientArray.Count() )
+ {
+ delete aRecipientArray.At( aIndex );
+ aRecipientArray.Delete( aIndex );
+ }
+ else
+ {
+ aIndex = 0;
+ }
+
+ MVPbkStoreContact* storeContact = NULL;
+ MVPbkStoreContactField* selectedField = NULL;
+ TInt recipientsNotHandled = iFoundContacts->Count();
+
+ for ( TInt i = 0; recipientsNotHandled > i; i++ )
+ {
+ const MVPbkContactLink& changedContactLink = iFoundContacts->At( i );
+ iCommonUtils->GetStoreContactL( changedContactLink, &storeContact );
+ storeContact->PushL();
+ MVPbkStoreContactFieldCollection& fieldCollection = storeContact->Fields();
+
+ selectedField = fieldCollection.RetrieveField( iFoundContacts->At(i) );
+
+ if ( selectedField )//gets the selected field and writes it to the reciItem
+ {
+ CMsgRecipientItem* reciItem = CMsgRecipientItem::NewLC( KNullDesC, KNullDesC );
+
+ // Set field data
+ const MVPbkContactFieldTextData* textData =
+ &MVPbkContactFieldTextData::Cast( selectedField->FieldData() );
+
+ reciItem->SetAddressL( textData->Text() );
+
+ HBufC* contactName = iCommonUtils->GetNameL( fieldCollection );
+ if ( contactName )
+ {
+ reciItem->SetNameL( contactName->Des() );
+ delete contactName;
+ }
+
+ reciItem->SetContactLink( &changedContactLink );
+ aRecipientArray.InsertL( aIndex, reciItem );
+
+ CleanupStack::Pop( reciItem );
+ aIndex++;
+ }
+ CleanupStack::PopAndDestroy( storeContact );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgCheckNames::SplitFindStringL
+//
+// Divides search string into several pieces if it includes spaces.
+// -----------------------------------------------------------------------------
+//
+CDesCArray* CMsgCheckNames::SplitFindStringL(const TDesC& aFindString)
+ {
+ CDesCArray* wordArray = new ( ELeave ) CDesCArrayFlat( 10 );
+ CleanupStack::PushL( wordArray );
+
+ TVPbkWordParserCallbackParam parser( &aFindString, wordArray );
+ FindWordSplitterL( &parser );
+
+ CleanupStack::Pop(); // wordArray
+ return parser.iWordArray;
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgCheckNames::IdleFindCallback
+//
+// Asynchronous find observer callback.
+// -----------------------------------------------------------------------------
+//
+void CMsgCheckNames::IdleFindCallback()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgCheckNames::DefineSearchFieldsL
+//
+// Defines that from which fiels the data is searched from
+// -----------------------------------------------------------------------------
+//
+void CMsgCheckNames::DefineSearchFieldsL( CVPbkFieldTypeRefsList& aOwnList )
+ {
+ const MVPbkFieldTypeList& refList = iCommonUtils->FieldTypes();
+ TVPbkFieldVersitProperty prop;
+ prop.SetName( EVPbkVersitNameN );
+ prop.SetSubField( EVPbkVersitSubFieldFamilyName );
+ const MVPbkFieldType* foundType = refList.FindMatch( prop, 0 );
+
+ if ( foundType )
+ {
+ aOwnList.AppendL( *foundType );
+ }
+
+ prop.SetSubField( EVPbkVersitSubFieldGivenName );
+
+ foundType = refList.FindMatch( prop, 0 );
+ if ( foundType )
+ {
+ aOwnList.AppendL( *foundType );
+ }
+
+ prop.SetName( EVPbkVersitNameORG );
+ prop.SetSubField( EVPbkVersitSubFieldOrgName );
+
+ foundType = refList.FindMatch( prop, 0 );
+ if ( foundType )
+ {
+ aOwnList.AppendL( *foundType );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgCheckNames::ConvertToPbk2Type
+//
+// Defines that from which fiels the data is searched from
+// -----------------------------------------------------------------------------
+//
+TAiwAddressSelectType CMsgCheckNames::ConvertToPbk2Type(
+ TMsgAddressSelectType aAddressSelectType )
+
+ {
+ TAiwAddressSelectType addressType = EAiwPhoneNumberSelect;
+
+ switch ( aAddressSelectType )
+ {
+ case EMsgTypeSms:
+ {
+ addressType = EAiwPhoneNumberSelect;
+ break;
+ }
+ case EMsgTypeMms:
+ {
+ addressType = EAiwMMSSelect;
+ break;
+ }
+ case EMsgTypeMail:
+ {
+ addressType = EAiwEMailSelect;
+ break;
+ }
+ case EMsgTypeAll:
+ {
+ addressType = EAiwAllItemsSelect;
+ break;
+ }
+ default:
+ {
+ addressType = EAiwPhoneNumberSelect;
+ break;
+ }
+ }
+
+ return addressType;
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgCheckNames::SetDefaultPrioritiesL
+// -----------------------------------------------------------------------------
+//
+void CMsgCheckNames::SetDefaultPrioritiesL( TAiwAddressSelectType aAddressType,
+ RVPbkContactFieldDefaultPriorities& aPriorities ) const
+ {
+ switch ( aAddressType )
+ {
+ case EAiwMMSSelect:
+ {
+ User::LeaveIfError( aPriorities.Append( EVPbkDefaultTypeMms ) );
+ User::LeaveIfError( aPriorities.Append( EVPbkDefaultTypeSms ) );
+ User::LeaveIfError( aPriorities.Append( EVPbkDefaultTypeEmailOverSms ) );
+ break;
+ }
+ case EAiwPhoneNumberSelect:
+ {
+ User::LeaveIfError( aPriorities.Append( EVPbkDefaultTypeSms ) );
+ break;
+ }
+ case EAiwEMailSelect:
+ {
+ User::LeaveIfError( aPriorities.Append( EVPbkDefaultTypeEmail ) );
+ break;
+ }
+ case EAiwAllItemsSelect:
+ {
+ User::LeaveIfError( aPriorities.Append( EVPbkDefaultTypeMms ) );
+ User::LeaveIfError( aPriorities.Append( EVPbkDefaultTypeSms ) );
+ User::LeaveIfError( aPriorities.Append( EVPbkDefaultTypeEmail ) );
+ User::LeaveIfError( aPriorities.Append( EVPbkDefaultTypeEmailOverSms ) );
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgCheckNames::UseAdvancedMatch
+//
+// If string does not contain spaces and contains only non-latin characters
+// perform matching advanced match algorithm.
+// -----------------------------------------------------------------------------
+//
+TBool CMsgCheckNames::UseAdvancedMatch( const TDesC& aFindString )
+ {
+ TBool containsSpace( EFalse );
+ TBool nonLatinString( ETrue );
+
+ for ( TInt current = 0; current < aFindString.Length(); current++ )
+ {
+ TUint currentChar( aFindString[current] );
+ if ( TChar( currentChar ).IsSpace() )
+ {
+ containsSpace = ETrue;
+ }
+
+ if ( currentChar < KLatinCharEnd )
+ {
+ nonLatinString = EFalse;
+ break;
+ }
+ }
+
+ return !containsSpace && nonLatinString;
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgCheckNames::PerformAdvancedMatchL
+//
+// Perform matching by trying to set space between every character.
+// This is done because in written chinese it is common to write contact names without spaces and
+// symbian's contact DB requires search text as a word list.
+// -----------------------------------------------------------------------------
+//
+void CMsgCheckNames::PerformAdvancedMatchL( const TDesC& aFindString,
+ CVPbkFieldTypeRefsList* aFieldTypes )
+ {
+ HBufC* firstBuffer = HBufC::NewLC( aFindString.Length() );
+ HBufC* secondBuffer = HBufC::NewLC( aFindString.Length() );
+
+ TPtr firstBufferPtr = firstBuffer->Des();
+ TPtr secondBufferPtr = secondBuffer->Des();
+
+ CDesCArray* wordArray = new( ELeave ) CDesCArrayFlat( 2 );
+ CleanupStack::PushL( wordArray );
+
+ TCallBack findParser( FindWordSplitterL );
+
+ TInt count( Min( aFindString.Length(), 4) );
+
+ for ( TInt index = 1; index < count; index++ )
+ {
+ firstBufferPtr.Insert( 0, aFindString.Mid( 0, index ) );
+ secondBufferPtr.Insert( 0, aFindString.Mid( index,
+ aFindString.Length() - index ) );
+
+ wordArray->AppendL( firstBufferPtr );
+ wordArray->AppendL( secondBufferPtr );
+
+ iCommonUtils->MatchDataL( *wordArray,
+ *aFieldTypes,
+ *iFoundContacts,
+ findParser );
+
+ wordArray->Reset();
+
+ if ( iFoundContacts->Count() != 0 )
+ {
+ break;
+ }
+
+ firstBufferPtr.Zero();
+ secondBufferPtr.Zero();
+ }
+
+ CleanupStack::PopAndDestroy( wordArray );
+
+ CleanupStack::PopAndDestroy( secondBuffer );
+ CleanupStack::PopAndDestroy( firstBuffer );
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgCheckNames::AknInputBlockCancel
+//
+// Cancels the AIW service and sets the shutdown flag. This is needed since
+// we must wait for the AIW service to notify us about the cancel before
+// application can be shutdown. Otherwise AIW service might try to use
+// freed resources.
+// -----------------------------------------------------------------------------
+//
+void CMsgCheckNames::AknInputBlockCancel()
+ {
+ if ( iWait.IsStarted() )
+ {
+ TRAPD( error, iServiceHandler->ExecuteServiceCmdL( KAiwCmdSelect,
+ iServiceHandler->InParamListL(),
+ iServiceHandler->OutParamListL(),
+ KAiwOptCancel,
+ this ) );
+ if ( error == KErrNone )
+ {
+ iShutdown = ETrue;
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// CMsgCheckNames::CleanupResetAndDestroy
+// ---------------------------------------------------------
+//
+void CMsgCheckNames::CleanupResetAndDestroy( TAny* aMatchedRecips )
+ {
+ CMsgRecipientArray* matches = NULL;
+
+ matches = STATIC_CAST( CMsgRecipientArray*, aMatchedRecips );
+ matches->ResetAndDestroy();
+
+ delete matches;
+ matches = NULL;
+ }
+
+// ---------------------------------------------------------
+// CMsgCheckNames::ConfigurationChanged
+// ---------------------------------------------------------
+//
+void CMsgCheckNames::ConfigurationChanged()
+ {
+ }
+
+// ---------------------------------------------------------
+// CMsgCheckNames::ConfigurationChangedComplete
+// ---------------------------------------------------------
+//
+void CMsgCheckNames::ConfigurationChangedComplete()
+ {
+ TRAP_IGNORE( DoConfigurationChangedCompleteL() );
+ }
+
+// ---------------------------------------------------------
+// CMsgCheckNames::DoConfigurationChangedCompleteL
+//
+// If store configuration has changed (i.e. used memories (phone, SIM etc.)).
+// open the currently selected stores.
+// ---------------------------------------------------------
+//
+void CMsgCheckNames::DoConfigurationChangedCompleteL()
+ {
+ CVPbkContactStoreUriArray* storeArray = iStoreConfiguration->SearchStoreConfigurationL();
+ CleanupStack::PushL( storeArray );
+
+ iCommonUtils->CloseStoresL();
+ iCommonUtils->OpenStoreL( *storeArray );
+
+ CleanupStack::PopAndDestroy( storeArray );
+ }
+
+// End of File