# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1282200067 -10800 # Node ID d4f567ce2e7cc01807eb3c8586e8abede9f6114a # Parent 2666d9724c768bd0729f31097603a3912f3ffc09 Revision: 201031 Kit: 201033 diff -r 2666d9724c76 -r d4f567ce2e7c contacts_plat/virtual_phonebook_configuration_api/inc/phonebook/VPbkVariant.hrh --- a/contacts_plat/virtual_phonebook_configuration_api/inc/phonebook/VPbkVariant.hrh Thu Jul 15 18:22:55 2010 +0300 +++ b/contacts_plat/virtual_phonebook_configuration_api/inc/phonebook/VPbkVariant.hrh Thu Aug 19 09:41:07 2010 +0300 @@ -131,7 +131,12 @@ /** * Show email addresses in Send Message address selection. */ - EVPbkLVShowEmailInSendMsg = 0x00100000 + EVPbkLVShowEmailInSendMsg = 0x00100000, + + /** + * Sync contact group during vCard sync. + */ + EVPbkLVSyncGroupEnabled = 0x00200000 }; diff -r 2666d9724c76 -r d4f567ce2e7c contacts_plat/virtual_phonebook_store_api/inc/CVPbkContactOperationFactory.h --- a/contacts_plat/virtual_phonebook_store_api/inc/CVPbkContactOperationFactory.h Thu Jul 15 18:22:55 2010 +0300 +++ b/contacts_plat/virtual_phonebook_store_api/inc/CVPbkContactOperationFactory.h Thu Aug 19 09:41:07 2010 +0300 @@ -22,8 +22,8 @@ #define CVPBKCONTACTOPERATIONFACTORY_H #include -#include -#include +#include +#include class MVPbkContactStoreList; diff -r 2666d9724c76 -r d4f567ce2e7c logsui/AppSrc/CLogsAppListView.cpp --- a/logsui/AppSrc/CLogsAppListView.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/logsui/AppSrc/CLogsAppListView.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -160,6 +160,17 @@ // Just to make sure the inputblocker is not on RemoveInputBlocker(); + + // Avoid the flicking when transfer to foreground from background. + if(LogsAppUi()->IsBackground()) + { + iContainer->DrawNow(); + iEikonEnv->AppUiFactory()->StatusPane()->DrawNow(); + LogsAppUi()->SetCustomControl(0); + + CCoeEnv * env = CCoeEnv::Static(); + env->WsSession().SetWindowGroupOrdinalPosition(env->RootWin().Identifier(),0); + } } // ---------------------------------------------------------------------------- @@ -198,5 +209,17 @@ } +void CLogsAppListView::ViewActivatedL(const TVwsViewId& aPrevViewId,TUid aCustomMessageId,const TDesC8& aCustomMessage) + { + // To avoid the flicking when transfer to foreground from background,we control the view show manually. + if(LogsAppUi()->IsBackground() && + LogsAppUi()->ActiveViewId() != ELogAppListViewId) + { + LogsAppUi()->SetCustomControl(1); + } + CLogsBaseView::ViewActivatedL(aPrevViewId,aCustomMessageId,aCustomMessage); + } + + // End of File diff -r 2666d9724c76 -r d4f567ce2e7c logsui/AppSrc/CLogsAppListView.h --- a/logsui/AppSrc/CLogsAppListView.h Thu Jul 15 18:22:55 2010 +0300 +++ b/logsui/AppSrc/CLogsAppListView.h Thu Aug 19 09:41:07 2010 +0300 @@ -97,6 +97,13 @@ */ void DoDeactivate(); + /** + * Early detection of view activation. + * Overrides the baseclass implementation calls CAknView::ViewActivatedL(). + */ + void ViewActivatedL(const TVwsViewId& aPrevViewId,TUid aCustomMessageId,const TDesC8& aCustomMessage); + + public: // from MEikCommandObserver /** * HandleCommandL. Generic view commands. diff -r 2666d9724c76 -r d4f567ce2e7c logsui/AppSrc/CLogsAppUi.cpp --- a/logsui/AppSrc/CLogsAppUi.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/logsui/AppSrc/CLogsAppUi.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -1211,5 +1211,13 @@ return 0; } + // If Logs is background,returns is True,otherwise False. + TBool CLogsAppUi::IsBackground() const + { + CCoeEnv * env = CCoeEnv::Static(); + TInt ordinal = env->RootWin().OrdinalPosition(); + return ordinal != 0; + } + // End of File diff -r 2666d9724c76 -r d4f567ce2e7c logsui/AppSrc/CLogsAppUi.h --- a/logsui/AppSrc/CLogsAppUi.h Thu Jul 15 18:22:55 2010 +0300 +++ b/logsui/AppSrc/CLogsAppUi.h Thu Aug 19 09:41:07 2010 +0300 @@ -315,6 +315,11 @@ */ void SetLogsOpenedWithSendKey(TBool aLogsOpenedWithSendKey); + /** + * Returns whether Logs is background. + */ + TBool IsBackground() const; + public: // from MAknTabObserver void TabChangedL(TInt aIndex); diff -r 2666d9724c76 -r d4f567ce2e7c logsui/AppSrc/CLogsBaseView.cpp --- a/logsui/AppSrc/CLogsBaseView.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/logsui/AppSrc/CLogsBaseView.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -587,8 +587,18 @@ aViewIdToBeDeactivated.iAppUid != TUid::Uid(KLogsAppUID3) ) { // Reset array, will call StateChangedL with state EStateArrayReseted and update the listbox. - CurrentModel()->DoDeactivate( MLogsModel::ESkipClearing, - MLogsModel::EResetOnlyArray ); + if ( (aNewlyActivatedViewId.iViewUid.iUid == EStmDialledListViewId )|| + (aNewlyActivatedViewId.iViewUid.iUid == EStmMissedListViewId )|| + (aNewlyActivatedViewId.iViewUid.iUid == EStmReceivedListViewId )) + { + CurrentModel()->DoDeactivate( MLogsModel::ESkipClearing, + MLogsModel::EKeepDBConnection ); + } + else + { + CurrentModel()->DoDeactivate( MLogsModel::ESkipClearing, + MLogsModel::EResetOnlyArray ); + } DrawComponents(); TRAP(err, CancelSaveToPbkL()); } diff -r 2666d9724c76 -r d4f567ce2e7c logsui/AppSrc/CLogsRecentListView.cpp --- a/logsui/AppSrc/CLogsRecentListView.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/logsui/AppSrc/CLogsRecentListView.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -428,11 +428,10 @@ // Reset array and set dirty which means refresh requested, // will call StateChangedL with state EStateArrayReseted and update the listbox. + // Keep db connection. CurrentModel()->DoDeactivate( MLogsModel::ESkipClearing, - MLogsModel::EResetOnlyArrayWithDirty ); + MLogsModel::EKeepDBConnection ); - // On gaining foreground, do a clean read of events - iResetAndRefreshOnGainingForeground = MLogsModel::EResetAndRefresh; } CAknView::ViewDeactivated(); @@ -513,14 +512,22 @@ // With MLogsModel::ECloseDBConnectionAndResetArray the connection to the database is // closed and event array will be deleted. Calls StateChangedL with state EStateArrayReseted // which will update the listbox to empty state. + // Keep db connection CurrentModel()->DoDeactivate( MLogsModel::ENormalOperation, - MLogsModel::ECloseDBConnectionAndResetArray ); + MLogsModel::EKeepDBConnection ); + CurrentModel()->DoActivateL( MLogsModel::EResetAndRefresh ); // Now we can enable bring-to-foreground on view activation: AppUi()->SetCustomControl(0); AppUi()->HideInBackground(); - // When coming back to foreground, do a clean read of events - iResetAndRefreshOnGainingForeground = MLogsModel::EResetAndRefresh; + // If listbox needs to redraw,do it. + if( CurrentModel()->Count()>0 && + ( iContainer->ListBox()->TopItemIndex() != EventListTop() || + iContainer->ListBox()->CurrentItemIndex() != EventListCurrent())) + { + iContainer->ListBox()->DrawDeferred(); + } + } else { @@ -540,11 +547,19 @@ logsui.KillTask(); return; } - - // By default on gaining foreground, just refresh the list. So when active applications list, - // keylock or some note (like when plugin in the charger) is shown the list doesn't flicker. - // When view is deactivated this is set to MLogsModel::EResetAndRefresh. - iResetAndRefreshOnGainingForeground = MLogsModel::ERefresh; + + // Avoid the flicking when transfer to foreground from background. + if(LogsAppUi()->IsBackground()) + { + iContainer->DrawNow(); + iEikonEnv->AppUiFactory()->StatusPane()->DrawNow(); + LogsAppUi()->SetCustomControl(0); + + CCoeEnv * env = CCoeEnv::Static(); + env->WsSession().SetWindowGroupOrdinalPosition(env->RootWin().Identifier(),0); + + } + } @@ -644,8 +659,9 @@ LOGS_DEBUG_PRINT(LOGS_DEBUG_STRING ( "CLogsRecentListView::DoDeactivate - ReadingFinished" )); ClearMissedCallNotifications(); //Clear cenrep new missed calls counter + notifications + // Keep db connection CurrentModel()->DoDeactivate( MLogsModel::ENormalOperation, - MLogsModel::ECloseDBConnection );//ETrue: disconnect from db. This helps for EMSH-6JDFBV but + MLogsModel::EKeepDBConnection );//ETrue: disconnect from db. This helps for EMSH-6JDFBV but //reduces user's perceived performance for other views //(seems to keep clearing of missed duplicates process alive // so no need for EFalse here as it would increase probability of @@ -657,14 +673,15 @@ { LOGS_DEBUG_PRINT(LOGS_DEBUG_STRING ( "CLogsRecentListView::DoDeactivate - Reading interrupted" )); + // Keep db connection CurrentModel()->DoDeactivate( MLogsModel::ESkipClearing, - MLogsModel::ECloseDBConnection ); + MLogsModel::EKeepDBConnection ); } } else { CurrentModel()->DoDeactivate( MLogsModel::ENormalOperation, - MLogsModel::ECloseDBConnection );//ETrue: disconnect from db. This helps for EMSH-6JDFBV but + MLogsModel::EKeepDBConnection );//ETrue: disconnect from db. This helps for EMSH-6JDFBV but //reduces user's perceived performance for other views //EFalse: don't disconnect from db. This keeps read data cached in Logs. } @@ -854,28 +871,7 @@ { MenuBar()->StopDisplayingMenuBar(); } - - SetEventListCurrent( KErrNotFound );//just to make sure that UI does not try to read anything from eventarray - TRAPD( err, model->DoActivateL( iResetAndRefreshOnGainingForeground ) ); - if( err ) - { - iCoeEnv->HandleError( err ); - } - if( err == KErrDiskFull ) - { - RWsSession& wsSession = CCoeEnv::Static()->WsSession(); - TApaTask logsui( wsSession ); - TInt wgId = CCoeEnv::Static()->RootWin().WindowGroupId(); - logsui.SetWgId( wgId ); - logsui.KillTask(); - return; - } - - // By default on gaining foreground, just refresh the list. So when active applications list, - // keylock or some note (like when plugin in the charger) is shown the list doesn't flicker. - // When view is deactivated this is set to MLogsModel::EResetAndRefresh. - iResetAndRefreshOnGainingForeground = MLogsModel::ERefresh; - } + } else { // Change ELogsNoChange_PbkUpdPending to ELogsNoChange now so there is no need to @@ -883,6 +879,8 @@ iFocusChangeControl = ELogsNoChange; } } + // Sure "ClearMissedCallNotificationsL" is called. + ClearMissedCallNotificationsL(); RemoveInputBlocker(); //just in case } @@ -993,16 +991,18 @@ { LOGS_DEBUG_PRINT(LOGS_DEBUG_STRING ( "CLogsRecentListView::HandleLosingForeground - clear duplicates" )); + // Keep db connection model->DoDeactivate( MLogsModel::ENormalOperation, - MLogsModel::ECloseDBConnection ); //EFalse: don't disconnect from db + MLogsModel::EKeepDBConnection ); //EFalse: don't disconnect from db } else { LOGS_DEBUG_PRINT(LOGS_DEBUG_STRING ( "CLogsRecentListView::HandleLosingForeground - skip clearing" )); //Other loss of foreground (call or AppKey). We'll not touch duplicate counters + // Keep db connection model->DoDeactivate( MLogsModel::ESkipClearing, //Don't update db (for missed view) - MLogsModel::ECloseDBConnection ); //ETrue: disconnect from db in order to immediately to stop + MLogsModel::EKeepDBConnection ); //ETrue: disconnect from db in order to immediately to stop //EFalse: don't disconnect from db } } @@ -1094,7 +1094,9 @@ iContainer->ControlExtension()->HandleAdditionalData( *CurrentModel(), *iContainer->ListBox() ); - ClearMissedCallNotificationsL(); + // Add condition check: To avoid Missing Call Note don't display ,do not call "ClearMissedCallNotificationsL" when logs is in background. + if(!LogsAppUi()->IsBackground()) + ClearMissedCallNotificationsL(); // When event reading is finished, remove inputblocker RemoveInputBlocker(); } @@ -1271,5 +1273,17 @@ return result; } +void CLogsRecentListView::ViewActivatedL(const TVwsViewId& aPrevViewId,TUid aCustomMessageId,const TDesC8& aCustomMessage) + { + //To avoid the flicking when transfer to foreground from background,we control the view show manually. + if(LogsAppUi()->IsBackground() && + LogsAppUi()->ActiveViewId() != LogsCurrentRecentViewId() ) + { + LogsAppUi()->SetCustomControl(1); + } + + CLogsBaseView::ViewActivatedL(aPrevViewId,aCustomMessageId,aCustomMessage); + + } // End of File diff -r 2666d9724c76 -r d4f567ce2e7c logsui/AppSrc/CLogsRecentListView.h --- a/logsui/AppSrc/CLogsRecentListView.h Thu Jul 15 18:22:55 2010 +0300 +++ b/logsui/AppSrc/CLogsRecentListView.h Thu Aug 19 09:41:07 2010 +0300 @@ -227,6 +227,11 @@ */ TBool IgnoreViewDeactivatedOperation(); + /** + * Early detection of view activation. + * Overrides the baseclass implementation calls CAknView::ViewActivatedL(). + */ + void ViewActivatedL(const TVwsViewId& aPrevViewId,TUid aCustomMessageId,const TDesC8& aCustomMessage); private: // Data /// Own: view's control container diff -r 2666d9724c76 -r d4f567ce2e7c logsui/group/Logs.mmp --- a/logsui/group/Logs.mmp Thu Jul 15 18:22:55 2010 +0300 +++ b/logsui/group/Logs.mmp Thu Aug 19 09:41:07 2010 +0300 @@ -31,6 +31,7 @@ TARGETTYPE exe EPOCSTACKSIZE 0x2710 //10000dec (default is 8000dec). In new architecture we need some more stack to //facilitate succesfull launching of editors (e.g. prepend number and send sms editors) +EPOCHEAPSIZE 0x1000 0x200000 UID 0x100039CE KLogsAppUID3 VENDORID VID_DEFAULT diff -r 2666d9724c76 -r d4f567ce2e7c logsui/help/data/xhtml.zip Binary file logsui/help/data/xhtml.zip has changed diff -r 2666d9724c76 -r d4f567ce2e7c phonebookengines/VirtualPhonebook/VPbkCntModel/src/CCustomFilteredGroupView.cpp --- a/phonebookengines/VirtualPhonebook/VPbkCntModel/src/CCustomFilteredGroupView.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookengines/VirtualPhonebook/VPbkCntModel/src/CCustomFilteredGroupView.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -195,7 +195,7 @@ { TBool ret = EFalse; - for ( TInt i=0; i < aMemberCount; ++i ) + for ( TInt i=0; i < aMemberCount && !ret; ++i ) { const TContactItemId contactId = ( *aGroupMembers )[i]; CContactItem* item = iContactStore.NativeDatabase(). diff -r 2666d9724c76 -r d4f567ce2e7c phonebookengines/VirtualPhonebook/VPbkCntModel/src/CFilteredContactView.cpp --- a/phonebookengines/VirtualPhonebook/VPbkCntModel/src/CFilteredContactView.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookengines/VirtualPhonebook/VPbkCntModel/src/CFilteredContactView.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -145,14 +145,8 @@ for ( TInt matchPriority = 0; matchPriority <= maxMatchPriority; ++matchPriority ) { - TBool versitIsMatched = matchingProperty->Matches( - aFilterType->VersitProperties()[matchPriority]); - TBool excludedParmaterIsMatched = - aFilterType->ExcludedParameters(). - ContainsAll(aFieldType.ExcludedParameters()); - // if the FilterType is matched the Versit Property and - // the excludeParameter of FiledType, it needn't custom filter. - if ( versitIsMatched && excludedParmaterIsMatched ) + if ( matchingProperty->Matches( + aFilterType->VersitProperties()[matchPriority]) ) { ret = EFalse; break; diff -r 2666d9724c76 -r d4f567ce2e7c phonebookengines/VirtualPhonebook/VPbkCntModel/src/CViewContact.cpp --- a/phonebookengines/VirtualPhonebook/VPbkCntModel/src/CViewContact.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookengines/VirtualPhonebook/VPbkCntModel/src/CViewContact.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -200,7 +200,8 @@ void CViewContactFieldCollection::SetFieldsData( const ::CViewContact& aViewContact ) { - const TInt count = aViewContact.FieldCount(); + const TInt count = aViewContact.FieldCount()TextStorage()->SetTextL(aUri); } diff -r 2666d9724c76 -r d4f567ce2e7c phonebookengines/VirtualPhonebook/VPbkEng/src/CVPbkPhoneNumberMatchStrategy.cpp --- a/phonebookengines/VirtualPhonebook/VPbkEng/src/CVPbkPhoneNumberMatchStrategy.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookengines/VirtualPhonebook/VPbkEng/src/CVPbkPhoneNumberMatchStrategy.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -42,7 +42,14 @@ #include "CVPbkPhoneNumberSequentialMatchStrategy.h" #include "CVPbkPhoneNumberParallelMatchStrategy.h" +#include "CVPbkETelCntConverter.h" +#include +#include + +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif // CONSTANTS // Unnamed namespace for local definitions namespace { @@ -162,6 +169,11 @@ */ void RefineDuplicatedNumbersL(); + /** + * Load number parser plugin. + */ + void LoadNumberParserPluginL(); + private: // Data CVPbkPhoneNumberMatchStrategy& iParent; /// Ref: The contact manager instance to be used for searching. @@ -210,6 +222,8 @@ TBool iDoubledContacts; /// type of iPhoneNumber TNumberType iPhoneNumberType; + // Own: parser + CContactPhoneNumberParser* iParser; }; CVPbkPhoneNumberMatchStrategyImpl::CVPbkPhoneNumberMatchStrategyImpl( @@ -268,6 +282,8 @@ } CleanupStack::PopAndDestroy( &resFile ); + + LoadNumberParserPluginL(); } CVPbkPhoneNumberMatchStrategyImpl* CVPbkPhoneNumberMatchStrategyImpl::NewL( @@ -300,6 +316,8 @@ iNameTokensArray.ResetAndDestroy(); iTempNameTokensArray.ResetAndDestroy(); iStoresToMatch.Close(); + delete iParser; + REComSession::FinalClose(); } void CVPbkPhoneNumberMatchStrategyImpl::MatchL(const TDesC& aPhoneNumber) @@ -762,21 +780,30 @@ _LIT( KOneZeroPattern, "0*" ); _LIT( KTwoZerosPattern, "00*" ); _LIT( KPlusPattern, "+*" ); + _LIT( KPlusString, "+" ); const TChar KPlus = TChar('+'); const TChar KZero = TChar('0'); const TChar KAsterisk = TChar('*'); const TChar KHash = TChar('#'); - for( TInt pos = 0; pos < aNumber.Length(); ++pos ) + HBufC* numberBuf = HBufC::NewL( aNumber.Length() ); + TPtr number = numberBuf->Des(); + if ( iParser ) { - TChar chr = aNumber[pos]; - if ( !chr.IsDigit() && !( pos == 0 && chr == KPlus ) - && !( chr == KAsterisk ) && !( chr == KHash ) ) - { - aNumber.Delete( pos, 1 ); - --pos; - } + iParser->ExtractRawNumber( aNumber, number ); } + TInt pos = aNumber.Find( number ); + + if ( pos > 0 && aNumber[pos-1] == KPlus ) + { + number.Insert( 0, KPlusString ); + } + + if ( number.Length() > 0) + { + aNumber.Copy( number ); + } + delete numberBuf; TInt format; @@ -1108,6 +1135,21 @@ return EFalse; } +void CVPbkPhoneNumberMatchStrategyImpl::LoadNumberParserPluginL() + { + RImplInfoPtrArray implInfoArray; + CleanupResetAndDestroyPushL( implInfoArray ); + REComSession::ListImplementationsL( KUidEcomCntPhoneNumberParserInterface, + implInfoArray ); + // Load the first implementation found for KUidEcomCntPhoneNumberParserInterface + const TInt count = implInfoArray.Count(); + __ASSERT_ALWAYS( count > 0, User::Leave( KErrNotFound ) ); + const TUid firstImplementationFound = implInfoArray[0]->ImplementationUid(); + iParser = reinterpret_cast + ( CContactEcomPhoneNumberParser::NewL( firstImplementationFound ) ); + CleanupStack::PopAndDestroy( &implInfoArray ); + } + CVPbkPhoneNumberMatchStrategy::CVPbkPhoneNumberMatchStrategy() { } diff -r 2666d9724c76 -r d4f567ce2e7c phonebookengines/VirtualPhonebook/VPbkSimStore/inc/CContact.h --- a/phonebookengines/VirtualPhonebook/VPbkSimStore/inc/CContact.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookengines/VirtualPhonebook/VPbkSimStore/inc/CContact.h Thu Aug 19 09:41:07 2010 +0300 @@ -233,6 +233,20 @@ /// Resets the contact state after contact operation void ResetContactOperationState(); + /** + * Remove empty field from aSimContact, these empty field was added + * in the sim contact before save it to keep the order of additional + * numbers in the USIM card. + */ + void RemoveAllEmptyFields( CVPbkSimContact& aSimContact ); + + /** + * Fill some empty field in the sim contact. hese empty field was added + * in the sim contact before save it to keep the order of additional + * numbers in the USIM card. + */ + void FillWithEmptyFieldsL() const; + private: // Data TStoreContactFieldCollection iFields; diff -r 2666d9724c76 -r d4f567ce2e7c phonebookengines/VirtualPhonebook/VPbkSimStore/inc/CSupportedFieldTypes.h --- a/phonebookengines/VirtualPhonebook/VPbkSimStore/inc/CSupportedFieldTypes.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookengines/VirtualPhonebook/VPbkSimStore/inc/CSupportedFieldTypes.h Thu Aug 19 09:41:07 2010 +0300 @@ -26,6 +26,7 @@ // FORWARD DECLARATIONS struct TVPbkGsmStoreProperty; +struct TVPbkUSimStoreProperty; namespace VPbkSimStore { @@ -52,6 +53,15 @@ static CSupportedFieldTypes* NewL( const CFieldTypeMappings& aFieldTypeMappings, TVPbkGsmStoreProperty& aSimStoreProperty ); + /** + * Two-phased constructor. + * @param aSimStoreProperty sim store properties + * @return a new instance of this class + */ + static CSupportedFieldTypes* NewL( + const CFieldTypeMappings& aFieldTypeMappings, + TVPbkGsmStoreProperty& aSimStoreProperty, + TVPbkUSimStoreProperty& aUSimStoreProperty ); /** * Destructor. @@ -109,7 +119,8 @@ * By default Symbian 2nd phase constructor is private. */ void ConstructL( const CFieldTypeMappings& aFieldTypeMappings, - TVPbkGsmStoreProperty& aSimStoreProperty ); + TVPbkGsmStoreProperty& aSimStoreProperty, + TVPbkUSimStoreProperty* aUSimStoreProperty = NULL ); private: // Data ///Ref: An array for the supported types. Doesn't own types diff -r 2666d9724c76 -r d4f567ce2e7c phonebookengines/VirtualPhonebook/VPbkSimStore/rss/VPbkSimStoreRes.rss --- a/phonebookengines/VirtualPhonebook/VPbkSimStore/rss/VPbkSimStoreRes.rss Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookengines/VirtualPhonebook/VPbkSimStore/rss/VPbkSimStoreRes.rss Thu Aug 19 09:41:07 2010 +0300 @@ -105,4 +105,107 @@ }; } +// For USIM with additional numbers +RESOURCE FIELDTYPE_MAPPINGS r_vpbk_usim_versit_field_type_mappings + { + items = + { + // SIM name = Last name + VERSIT_FIELDTYPE_MAPPING + { + simFieldId = EVPbkSimName; + versitProperty = VBK_FIELD_VERSIT_PROPERTY + { + name = EVPbkVersitNameN; + subField = EVPbkVersitSubFieldFamilyName; + }; + }, + // USIM second name = reading in japanese variant + VERSIT_FIELDTYPE_MAPPING + { + simFieldId = EVPbkSimReading; + versitProperty = VBK_FIELD_VERSIT_PROPERTY + { + name = EVPbkVersitNameSOUND; + subField = EVPbkVersitSubFieldFamilyNamePronunciation; + }; + }, + // SIM GSM number = general mobile + VERSIT_FIELDTYPE_MAPPING + { + simFieldId = EVPbkSimGsmNumber; + versitProperty = VBK_FIELD_VERSIT_PROPERTY + { + name = EVPbkVersitNameTEL; + parameters = { EVPbkVersitParamCELL }; + }; + }, + // USIM additional numbers = general mobile + VERSIT_FIELDTYPE_MAPPING + { + simFieldId = EVPbkSimAdditionalNumber; + versitProperty = VBK_FIELD_VERSIT_PROPERTY + { + name = EVPbkVersitNameTEL; + parameters = { EVPbkVersitParamCELL }; + }; + }, + // USIM additional numbers = home landphone + VERSIT_FIELDTYPE_MAPPING + { + simFieldId = EVPbkSimAdditionalNumber1; + versitProperty = VBK_FIELD_VERSIT_PROPERTY + { + name = EVPbkVersitNameTEL; + parameters = { EVPbkVersitParamHOME }; + }; + }, + // USIM additional numbers = work landphone + VERSIT_FIELDTYPE_MAPPING + { + simFieldId = EVPbkSimAdditionalNumber2; + versitProperty = VBK_FIELD_VERSIT_PROPERTY + { + name = EVPbkVersitNameTEL; + parameters = { EVPbkVersitParamWORK }; + }; + }, + // USIM additional numbers = general fax + VERSIT_FIELDTYPE_MAPPING + { + simFieldId = EVPbkSimAdditionalNumber3; + versitProperty = VBK_FIELD_VERSIT_PROPERTY + { + name = EVPbkVersitNameTEL; + parameters = { EVPbkVersitParamFAX }; + }; + }, + /*you can define more field type mappings here to adapt the + * increase of the additional number field of USIM card.*/ + // USIM email = general email + VERSIT_FIELDTYPE_MAPPING + { + simFieldId = EVPbkSimEMailAddress; + versitProperty = VBK_FIELD_VERSIT_PROPERTY + { + name = EVPbkVersitNameEMAIL; + parameters = + { + EVPbkVersitParamINTERNET + }; + }; + }, + // USIM second name = nick name in variants other than japan + VERSIT_FIELDTYPE_MAPPING + { + simFieldId = EVPbkSimNickName; + versitProperty = VBK_FIELD_VERSIT_PROPERTY + { + name = EVPbkVersitNameX; + extensionName = "X-NICKNAME"; + }; + } + }; + } + // End of File diff -r 2666d9724c76 -r d4f567ce2e7c phonebookengines/VirtualPhonebook/VPbkSimStore/src/CContact.cpp --- a/phonebookengines/VirtualPhonebook/VPbkSimStore/src/CContact.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookengines/VirtualPhonebook/VPbkSimStore/src/CContact.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -30,6 +30,8 @@ #include #include #include +#include +#include #include #include #include @@ -48,6 +50,8 @@ KNewContact = 1 }; +const TInt KDefinedAnrFieldTypeCount = 3; // count of defined additional number types + // ============================= LOCAL FUNCTIONS =============================== MVPbkContactObserver::TContactOp ConvertContactOperation( @@ -98,15 +102,35 @@ break; } case EVPbkSimGsmNumber: // FALLTHROUGH - case EVPbkSimAdditionalNumber: + case EVPbkSimAdditionalNumberLast: // the EVPbkSimAdditionalNumber { ++result; // always at least one number if ( aUsimProp.iMaxNumOfAnrs != KVPbkSimStorePropertyUndefined ) { - result += aUsimProp.iMaxNumOfAnrs; + if ( !FeatureManager::FeatureSupported( + KFeatureIdFfTdClmcontactreplicationfromphonebooktousimcard ) ) + { + result += aUsimProp.iMaxNumOfAnrs; + } + else + { + if ( aUsimProp.iMaxNumOfAnrs - KDefinedAnrFieldTypeCount > 0 ) + { + result += (aUsimProp.iMaxNumOfAnrs - KDefinedAnrFieldTypeCount); + } + } } break; } + case EVPbkSimAdditionalNumber1: + result = aUsimProp.iMaxNumOfAnrs >= 1 ? 1 : 0; // according the max number of anrs. + break; + case EVPbkSimAdditionalNumber2: + result = aUsimProp.iMaxNumOfAnrs >= 2 ? 1 : 0; + break; + case EVPbkSimAdditionalNumber3: + result = aUsimProp.iMaxNumOfAnrs >= 3 ? 1 : 0; + break; default: { // Do nothing @@ -119,6 +143,7 @@ namespace VPbkSimStore { +_LIT( KEmptyData, "+" ); //the empty data, modifiy this string to keep its a special string. // ============================ MEMBER FUNCTIONS =============================== // ----------------------------------------------------------------------------- @@ -144,6 +169,11 @@ { iFlags.Set( KNewContact ); } + if( FeatureManager::FeatureSupported( + KFeatureIdFfTdClmcontactreplicationfromphonebooktousimcard ) ) + { + RemoveAllEmptyFields( aSimContact ); // remove the empty contacts where added before save. + } iFields.SetContact( *this, aSimContact ); iAsyncOp = new( ELeave ) VPbkEngUtils::CVPbkAsyncOperation; } @@ -174,6 +204,126 @@ } // ----------------------------------------------------------------------------- +// CContact::RemoveAllEmptyFields +// ----------------------------------------------------------------------------- +// +void CContact::RemoveAllEmptyFields( CVPbkSimContact& aSimContact ) + { + TInt i = aSimContact.FieldCount() - 1 ; + while( i >= 0 ) + { + CVPbkSimCntField& cntField = aSimContact.FieldAt( i ); + TVPbkSimCntFieldType simCntType = cntField.Type(); + if( simCntType == EVPbkSimGsmNumber + || simCntType == EVPbkSimAdditionalNumber1 + || simCntType == EVPbkSimAdditionalNumber2 + || simCntType == EVPbkSimAdditionalNumber3 + || simCntType == EVPbkSimAdditionalNumberLast ) + { + if( cntField. Data().Compare( KEmptyData ) == 0 ) + { + aSimContact.DeleteField( i ); + } + } + i --; + } + } + +// ----------------------------------------------------------------------------- +// CContact::FillWithEmptyFieldsL +// ----------------------------------------------------------------------------- +// +void CContact::FillWithEmptyFieldsL() const + { + RPointerArray & contactFieldArray = iSimContact->FieldArray(); + TInt i = contactFieldArray.Count() - 1 ; + while( i >= 0 ) // remove all empty content. + { + CVPbkSimCntField& cntField = iSimContact->FieldAt( i ); + TVPbkSimCntFieldType type = cntField.Type(); + if( cntField. Data().Length() == 0 ) + { + iSimContact->DeleteField( i ); + } + i --; + } + + if( contactFieldArray.Count() == 0 ) // no un-empty fields. + { + return; + } + CVPbkSimContact::TFieldLookup lookupAdnNumber = + iSimContact->FindField( EVPbkSimAdditionalNumber ); + if( lookupAdnNumber.EndOfLookup()) // if there is no additional number in the contact then no need to add placeholder + { + return; + } + RPointerArray tempFieldArray; + CleanupClosePushL( tempFieldArray ); + // mappings + CFieldTypeMappings & mappings = iParentStore.FieldTypeMappings(); + // supported types. + const CSupportedFieldTypes& supportedTypes = iParentStore.SupportedFieldTypes(); + + // check all supported field types in the fields list. If not exist created new. + // if data length is 0, set data to empty data. + for( int i = 0; i < supportedTypes.FieldTypeCount(); i ++ ) + { + const MVPbkFieldType& fieldType = supportedTypes.FieldTypeAt( i ); + TVPbkSimCntFieldType simCntType = mappings.Match( fieldType ); + if( simCntType == EVPbkSimGsmNumber + || simCntType == EVPbkSimAdditionalNumber1 + || simCntType == EVPbkSimAdditionalNumber2 + || simCntType == EVPbkSimAdditionalNumber3 + || simCntType == EVPbkSimAdditionalNumberLast ) + { + CVPbkSimCntField * field = NULL; + CVPbkSimContact::TFieldLookup lookup = + iSimContact->FindField( simCntType ); + + if( lookup.EndOfLookup() ) + { + field= iSimContact->CreateFieldLC( simCntType ); + field->SetDataL( KEmptyData ); + tempFieldArray.Append( field ); + CleanupStack::Pop(); + } + else + { + field = contactFieldArray[lookup.Index()]; + if( field->Data().Length() == 0 ) + { + field->SetDataL( KEmptyData ); + } + if( simCntType == EVPbkSimAdditionalNumber1 + || simCntType == EVPbkSimAdditionalNumber2 + || simCntType == EVPbkSimAdditionalNumber3 ) + { + contactFieldArray.Remove( lookup.Index() ); + tempFieldArray.AppendL( field ); + } + } + } + } + TInt j = contactFieldArray.Count() - 1; + while( j >= 0 ) // EVPbkSimAdditionalNumberLast type field will append at last. + { + if( contactFieldArray[j]->Type() == EVPbkSimAdditionalNumberLast ) + { + tempFieldArray.AppendL( contactFieldArray[ j ] ); + contactFieldArray.Remove( j ); + } + j --; + } + for( int i = 0; i < tempFieldArray.Count(); i ++ ) + { + contactFieldArray.AppendL( tempFieldArray[i]); + } + tempFieldArray.Reset(); + CleanupStack::Pop(); + } + +// ----------------------------------------------------------------------------- // CContact::ParentObject // ----------------------------------------------------------------------------- // @@ -301,7 +451,7 @@ VPbkSimStore::Panic( ESimFieldTypeNotFound ) ); if ( simType == EVPbkSimGsmNumber || - simType == EVPbkSimAdditionalNumber ) + simType == EVPbkSimAdditionalNumberLast ) //the same field type as EVPbkSimGsmNumber { // EVPbkSimGsmNumber and EVPbkSimAdditionalNumber maps to same // VPbk field type. A sim contact can have only one EVPbkSimGsmNumber @@ -320,7 +470,7 @@ } else { - simType = EVPbkSimAdditionalNumber; + simType = EVPbkSimAdditionalNumberLast; } } @@ -421,6 +571,10 @@ } // From the client point of view the MVPbkStoreContact is constant but // implementation needs a non const contact. + if( FeatureManager::FeatureSupported( KFeatureIdFfTdClmcontactreplicationfromphonebooktousimcard ) ) + { + FillWithEmptyFieldsL(); + } iStoreOperation = iSimContact->SaveL( const_cast( *this )); iObserver = &aObserver; } @@ -498,6 +652,12 @@ MVPbkContactObserver* observer = iObserver; ResetContactOperationState(); + + // remove filled placeholder fields. + if( vpbkOpResult.iOpCode == MVPbkContactObserver::EContactCommit ) + { + RemoveAllEmptyFields( *iSimContact ); + } observer->ContactOperationCompleted( vpbkOpResult ); } @@ -516,6 +676,12 @@ MVPbkContactObserver* observer = iObserver; ResetContactOperationState(); MVPbkContactObserver::TContactOp op = ConvertContactOperation( aEvent ); + + // remove filled placeholder fields. + if( op == MVPbkContactObserver::EContactCommit ) + { + RemoveAllEmptyFields( *iSimContact ); + } observer->ContactOperationFailed( op, aError, EFalse ); } diff -r 2666d9724c76 -r d4f567ce2e7c phonebookengines/VirtualPhonebook/VPbkSimStore/src/CContactStore.cpp --- a/phonebookengines/VirtualPhonebook/VPbkSimStore/src/CContactStore.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookengines/VirtualPhonebook/VPbkSimStore/src/CContactStore.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -48,6 +48,7 @@ #include #include +#include namespace VPbkSimStore { // LOCAL @@ -580,17 +581,38 @@ void CContactStore::StoreReady( MVPbkSimCntStore& /*aStore*/ ) { TVPbkGsmStoreProperty gsmProperties; - TInt res = iNativeStore->GetGsmStoreProperties( gsmProperties ); - - if ( res == KErrNone ) + TInt res = KErrNone; + if( !FeatureManager::FeatureSupported( KFeatureIdFfTdClmcontactreplicationfromphonebooktousimcard ) ) + { + res= iNativeStore->GetGsmStoreProperties( gsmProperties ); + if ( res == KErrNone ) + { + delete iSupportedFieldTypes; + iSupportedFieldTypes = NULL; + TRAP( res, iSupportedFieldTypes = CSupportedFieldTypes::NewL( + iStoreDomain.FieldTypeMappings(), gsmProperties ) ); + iSimStoreCapabilities = gsmProperties.iCaps; + } + } + else // if contact replication from phonebook to usim card. { - delete iSupportedFieldTypes; - iSupportedFieldTypes = NULL; - TRAP( res, iSupportedFieldTypes = CSupportedFieldTypes::NewL( - iStoreDomain.FieldTypeMappings(), gsmProperties ) ); - iSimStoreCapabilities = gsmProperties.iCaps; + TInt resGsm = iNativeStore->GetGsmStoreProperties( gsmProperties ); + TVPbkUSimStoreProperty usimProperties; + TInt resUsim = iNativeStore->GetUSimStoreProperties( usimProperties ); + if( resGsm == KErrNone && resUsim == KErrNone ) + { + delete iSupportedFieldTypes; + iSupportedFieldTypes = NULL; + TRAP( res, iSupportedFieldTypes = CSupportedFieldTypes::NewL( + iStoreDomain.FieldTypeMappings(), gsmProperties, usimProperties ) ); + iSimStoreCapabilities = gsmProperties.iCaps; + } + else + { + res = ( resGsm != KErrNone ? resGsm : resUsim ); + } } - + if ( res != KErrNone ) { iStoreState = EStoreNotAvailable; diff -r 2666d9724c76 -r d4f567ce2e7c phonebookengines/VirtualPhonebook/VPbkSimStore/src/CContactStoreDomain.cpp --- a/phonebookengines/VirtualPhonebook/VPbkSimStore/src/CContactStoreDomain.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookengines/VirtualPhonebook/VPbkSimStore/src/CContactStoreDomain.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -36,6 +36,7 @@ #include #include +#include namespace VPbkSimStore { @@ -80,10 +81,20 @@ VPbkEngUtils::RLocalizedResourceFile resFile; resFile.OpenLC( iFs, KVPbkRomFileDrive, KDC_RESOURCE_FILES_DIR, KResFile ); - + FeatureManager::InitializeLibL(); TResourceReader resReader; - resReader.SetBuffer( resFile.AllocReadLC( - R_VPBK_VERSIT_FIELD_TYPE_MAPPINGS ) ); + + if ( !FeatureManager::FeatureSupported( + KFeatureIdFfTdClmcontactreplicationfromphonebooktousimcard ) ) + { + resReader.SetBuffer( resFile.AllocReadLC( + R_VPBK_VERSIT_FIELD_TYPE_MAPPINGS ) ); + } + else + { + resReader.SetBuffer( resFile.AllocReadLC( + R_VPBK_USIM_VERSIT_FIELD_TYPE_MAPPINGS ) ); + } // Read versit types iFieldTypeMappings->InitVersitMappingsL( resReader ); resReader.SetBuffer( resFile.AllocReadLC( @@ -153,6 +164,7 @@ delete iContactStoreList; delete iTextStore; iFs.Close(); + FeatureManager::UnInitializeLib(); } // ----------------------------------------------------------------------------- diff -r 2666d9724c76 -r d4f567ce2e7c phonebookengines/VirtualPhonebook/VPbkSimStore/src/CSupportedFieldTypes.cpp --- a/phonebookengines/VirtualPhonebook/VPbkSimStore/src/CSupportedFieldTypes.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookengines/VirtualPhonebook/VPbkSimStore/src/CSupportedFieldTypes.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -44,23 +44,55 @@ // void CSupportedFieldTypes::ConstructL( const CFieldTypeMappings& aFieldTypeMappings, - TVPbkGsmStoreProperty& aSimStoreProperty ) + TVPbkGsmStoreProperty& aSimStoreProperty, + TVPbkUSimStoreProperty* aUSimStoreProperty ) { // SIM supports always the name field const MVPbkFieldType* vpbkType = aFieldTypeMappings.Match( EVPbkSimName ); iSupportedTypes.AppendL( vpbkType ); // SIM supports always one number field vpbkType = aFieldTypeMappings.Match( EVPbkSimGsmNumber ); + const MVPbkFieldType* vpbkGsmType = vpbkType; iSupportedTypes.AppendL( vpbkType ); // USIM can support additional numbers if ( aSimStoreProperty.iCaps & VPbkSimStoreImpl::KAdditionalNumUsed ) { - vpbkType = aFieldTypeMappings.Match( EVPbkSimAdditionalNumber ); - // Check if the VPbk type is different than the type for - // already added EVPbkSimGsmNumber - if ( iSupportedTypes.Find( vpbkType ) == KErrNotFound ) + if( aUSimStoreProperty ) { - iSupportedTypes.AppendL( vpbkType ); + for( TInt i = 1; i <= aUSimStoreProperty->iMaxNumOfAnrs; i ++ ) + { + TVPbkSimCntFieldType type; + switch( i ) + { + case 1: // first additional number field type + type = EVPbkSimAdditionalNumber1; + break; + case 2: // second additional number field type + type = EVPbkSimAdditionalNumber2; + break; + case 3: // third additional number field type + type = EVPbkSimAdditionalNumber3; + break; + default: // four and so on + type = EVPbkSimAdditionalNumberLast; + break; + } + vpbkType = aFieldTypeMappings.Match( type ); + if( !( vpbkGsmType->IsSame( *vpbkType ) ) ) // if not the same as GSM type. + { + iSupportedTypes.AppendL( vpbkType ); + } + } + } + else + { + vpbkType = aFieldTypeMappings.Match( EVPbkSimAdditionalNumber ); + // Check if the VPbk type is different than the type for + // already added EVPbkSimGsmNumber + if ( iSupportedTypes.Find( vpbkType ) == KErrNotFound ) + { + iSupportedTypes.AppendL( vpbkType ); + } } } if ( aSimStoreProperty.iCaps & VPbkSimStoreImpl::KSecondNameUsed ) @@ -93,6 +125,23 @@ return self; } +// ----------------------------------------------------------------------------- +// CSupportedFieldTypes::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CSupportedFieldTypes* CSupportedFieldTypes::NewL( + const CFieldTypeMappings& aFieldTypeMappings, + TVPbkGsmStoreProperty& aSimStoreProperty, + TVPbkUSimStoreProperty& aUSimStoreProperty ) + { + CSupportedFieldTypes* self = new( ELeave ) CSupportedFieldTypes; + CleanupStack::PushL( self ); + self->ConstructL( aFieldTypeMappings, aSimStoreProperty, &aUSimStoreProperty ); + CleanupStack::Pop( self ); + return self; + } + // Destructor CSupportedFieldTypes::~CSupportedFieldTypes() { diff -r 2666d9724c76 -r d4f567ce2e7c phonebookengines/VirtualPhonebook/VPbkSimStoreCommon/src/CVPbkSimFieldTypeFilter.cpp --- a/phonebookengines/VirtualPhonebook/VPbkSimStoreCommon/src/CVPbkSimFieldTypeFilter.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookengines/VirtualPhonebook/VPbkSimStoreCommon/src/CVPbkSimFieldTypeFilter.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -112,8 +112,11 @@ ret = ESimFilterCriteriaGsmNumber; break; } - - case EVPbkSimAdditionalNumber: + + case EVPbkSimAdditionalNumber1: // FALLTHROUGH + case EVPbkSimAdditionalNumber2: // FALLTHROUGH + case EVPbkSimAdditionalNumber3: // FALLTHROUGH + case EVPbkSimAdditionalNumberLast: // the same as EVPbkSimAdditionalNumber. { ret = ESimFilterCriteriaAdditionalNumber; break; diff -r 2666d9724c76 -r d4f567ce2e7c phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CVPbkETelCntConverter.cpp --- a/phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CVPbkETelCntConverter.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CVPbkETelCntConverter.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -61,7 +61,10 @@ break; } case EVPbkSimGsmNumber: // FALLTHROUGH - case EVPbkSimAdditionalNumber: + case EVPbkSimAdditionalNumber1: // FALLTHROUGH + case EVPbkSimAdditionalNumber2: // FALLTHROUGH + case EVPbkSimAdditionalNumber3: // FALLTHROUGH + case EVPbkSimAdditionalNumberLast: // same as EVPbkSimAdditionalNumber { result = RMobilePhoneBookStore::ETagPBNumber; break; @@ -187,7 +190,10 @@ const TDesC& data = aField.Data(); if ( data.Length() > 0 ) { - if ( aField.Type() == EVPbkSimAdditionalNumber ) + if( aField.Type() == EVPbkSimAdditionalNumber1 + || aField.Type() == EVPbkSimAdditionalNumber2 + || aField.Type() == EVPbkSimAdditionalNumber3 + || aField.Type()== EVPbkSimAdditionalNumberLast ) // all these four types are all additional field types. { // Additional number needs own tag that must be added before data aETelBuffer.AddNewNumberTag(); diff -r 2666d9724c76 -r d4f567ce2e7c phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CVPbkSimCntField.cpp --- a/phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CVPbkSimCntField.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CVPbkSimCntField.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -77,36 +77,39 @@ TVPbkUSimStoreProperty uprop; TInt err = aStore.GetUSimStoreProperties( uprop ); if( err == KErrNone ) - { - switch ( aType ) - { - case EVPbkSimAdditionalNumber: - { - result = uprop.iMaxAnrLength; - break; - } - case EVPbkSimReading: - case EVPbkSimNickName: - { - result = uprop.iMaxScndNameLength; - break; - } - case EVPbkSimEMailAddress: - { - result = uprop.iMaxEmailLength; - break; - } - case EVPbkSimGroupName: - { - result = uprop.iMaxGroupNameLength; - break; - } - default: - { - break; - } - } - } + { + switch ( aType ) + { + case EVPbkSimAdditionalNumber1: // FALLTHROUGH + case EVPbkSimAdditionalNumber2: // FALLTHROUGH + case EVPbkSimAdditionalNumber3: // FALLTHROUGH + case EVPbkSimAdditionalNumberLast: // same as EVPbkSimAdditionalNumber + { + result = uprop.iMaxAnrLength; + break; + } + case EVPbkSimReading: // FALLTHROUGH + case EVPbkSimNickName: + { + result = uprop.iMaxScndNameLength; + break; + } + case EVPbkSimEMailAddress: + { + result = uprop.iMaxEmailLength; + break; + } + case EVPbkSimGroupName: + { + result = uprop.iMaxGroupNameLength; + break; + } + default: + { + break; + } + } + } } return (TInt16)result; } @@ -289,7 +292,11 @@ // Max length must be calculated for number types only because other // types are not splitted in several records in SIM card. - if ( iType == EVPbkSimGsmNumber || iType == EVPbkSimAdditionalNumber ) + if ( iType == EVPbkSimGsmNumber + || iType == EVPbkSimAdditionalNumber1 + || iType == EVPbkSimAdditionalNumber2 + || iType == EVPbkSimAdditionalNumber3 + || iType == EVPbkSimAdditionalNumberLast ) // same as EVPbkSimAdditionalNumber { TInt currentMaxLength = MaxLength( iType, iParentContact.ParentStore() ); diff -r 2666d9724c76 -r d4f567ce2e7c phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CVPbkSimContact.cpp --- a/phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CVPbkSimContact.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CVPbkSimContact.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -18,6 +18,7 @@ // INCLUDE FILES +#include #include "CVPbkSimContact.h" #include "CVPbkSimCntField.h" @@ -50,6 +51,10 @@ if ( aETelContact ) { SetL( *aETelContact ); + if( FeatureManager::FeatureSupported( KFeatureIdFfTdClmcontactreplicationfromphonebooktousimcard ) ) + { + IndentifyAdditionalFields(); + } } } @@ -234,6 +239,37 @@ } // ----------------------------------------------------------------------------- +// CVPbkSimContact::IndentifyAdditionalFields() +// ----------------------------------------------------------------------------- +// +void CVPbkSimContact::IndentifyAdditionalFields() + { + TInt anrNumberFieldCount = 0; + for( int i = 0; i < iFieldArray.Count(); i ++ ) + { + if( iFieldArray[i]->Type() == EVPbkSimAdditionalNumber ) + { + anrNumberFieldCount ++; + switch( anrNumberFieldCount ) + { + case 1: + iFieldArray[i]->SetType( EVPbkSimAdditionalNumber1 ); + break; + case 2: + iFieldArray[i]->SetType( EVPbkSimAdditionalNumber2 ); + break; + case 3: + iFieldArray[i]->SetType( EVPbkSimAdditionalNumber3 ); + break; + default: + iFieldArray[i]->SetType( EVPbkSimAdditionalNumberLast ); + break; + } + } + } + } + +// ----------------------------------------------------------------------------- // CVPbkSimContact::CreateETelContactL // ----------------------------------------------------------------------------- // diff -r 2666d9724c76 -r d4f567ce2e7c phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CVPbkSimContactBase.cpp --- a/phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CVPbkSimContactBase.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CVPbkSimContactBase.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -88,11 +88,27 @@ aLookup.SetPos( KErrNotFound ); for ( ; i < count; ++i ) { - if ( ConstFieldAt( i ).Type() == aLookup.Type() ) + if( aLookup.Type() == EVPbkSimAdditionalNumber ) { - aLookup.SetIndex( i ); - aLookup.SetPos( i + 1 ); - break; + const CVPbkSimCntField& field = ConstFieldAt( i ); + if ( field.Type() == EVPbkSimAdditionalNumber1 + || field.Type() == EVPbkSimAdditionalNumber2 + || field.Type() == EVPbkSimAdditionalNumber3 + || field.Type() == EVPbkSimAdditionalNumberLast ) // the same as EVPbkSimAdditionalNumber + { + aLookup.SetIndex( i ); + aLookup.SetPos( i + 1 ); + break; + } + } + else + { + if ( ConstFieldAt( i ).Type() == aLookup.Type() ) + { + aLookup.SetIndex( i ); + aLookup.SetPos( i + 1 ); + break; + } } } } diff -r 2666d9724c76 -r d4f567ce2e7c phonebookengines/VirtualPhonebook/VPbkVCardEng/inc/CVPbkVCardImporter.h --- a/phonebookengines/VirtualPhonebook/VPbkVCardEng/inc/CVPbkVCardImporter.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookengines/VirtualPhonebook/VPbkVCardEng/inc/CVPbkVCardImporter.h Thu Aug 19 09:41:07 2010 +0300 @@ -119,7 +119,6 @@ void IssueRequest(); CParserProperty* NextProperty(); - CParserProperty* GetCurrentProperty(); void ParseNextL(); TInt FindContactFieldL( MVPbkStoreContact* aContact, diff -r 2666d9724c76 -r d4f567ce2e7c phonebookengines/VirtualPhonebook/VPbkVCardEng/src/CVPbkImportToContactsMergeOperation.cpp --- a/phonebookengines/VirtualPhonebook/VPbkVCardEng/src/CVPbkImportToContactsMergeOperation.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookengines/VirtualPhonebook/VPbkVCardEng/src/CVPbkImportToContactsMergeOperation.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -19,6 +19,8 @@ #include "CVPbkImportToContactsMergeOperation.h" #include "VPbkVCardEngError.h" #include "CVPbkVCardImporter.h" +#include "CVPbkDefaultAttribute.h" +#include "CVPbkLocalVariationManager.h" // Virtual Phonebook #include @@ -31,7 +33,6 @@ #include #include #include -#include "CVPbkDefaultAttribute.h" const TInt KGranularity = 4; namespace{ @@ -223,7 +224,8 @@ } case EComplete: { - if(iGroupcardHandler && ((CVPbkVCardImporter *)iOperationImpl)->IsGroupcard()) + TBool isGroupCard = ((CVPbkVCardImporter *)iOperationImpl)->IsGroupcard(); + if(iGroupcardHandler && isGroupCard) { iGroupcardHandler->BuildContactGroupsHashMapL(iContact->ParentStore()); const MVPbkContactLink* contact = iContact->CreateLinkLC(); @@ -231,6 +233,19 @@ CleanupStack::PopAndDestroy(); // For contact iGroupcardHandler->DecodeContactGroupInVCardL(((CVPbkVCardImporter *)iOperationImpl)->GetGroupcardvalue()); } + + CVPbkLocalVariationManager* lvm = CVPbkLocalVariationManager::NewL(); + TBool supportSyncGroupVcard = lvm->LocallyVariatedFeatureEnabled( EVPbkLVSyncGroupEnabled ); + delete lvm; + if (supportSyncGroupVcard && iGroupcardHandler && !isGroupCard) + { + iGroupcardHandler->BuildContactGroupsHashMapL(iContact->ParentStore()); + const MVPbkContactLink *aContact = iContact->CreateLinkLC(); + iGroupcardHandler->GetContactGroupStoreL(*aContact); + CleanupStack::PopAndDestroy(); + iGroupcardHandler->DeleteContactFromGroupsL(); + } + iObserver.VPbkSingleContactOperationComplete( *this, iContact ); iContact = NULL; break; diff -r 2666d9724c76 -r d4f567ce2e7c phonebookengines/VirtualPhonebook/VPbkVCardEng/src/CVPbkImportToStoreOperation.cpp --- a/phonebookengines/VirtualPhonebook/VPbkVCardEng/src/CVPbkImportToStoreOperation.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookengines/VirtualPhonebook/VPbkVCardEng/src/CVPbkImportToStoreOperation.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -22,6 +22,7 @@ #include "CVPbkVCardImporter.h" #include "CVPbkVCardData.h" #include "VPbkVCardEngError.h" +#include "CVPbkLocalVariationManager.h" // From Virtual Phonebook #include @@ -371,7 +372,8 @@ } TBool destroyed = EFalse; - if(iGroupcardHandler && ((CVPbkVCardImporter *)iOperationImpl)->IsGroupcard()) + TBool isGroupCard = ((CVPbkVCardImporter *)iOperationImpl)->IsGroupcard(); + if(iGroupcardHandler && isGroupCard ) { // CVPbkGroupCardHandler uses nested activescheduler loop to make // async requests synchronous (why?). Hence it is possible that when @@ -398,6 +400,17 @@ destroyed = ETrue; } } + + CVPbkLocalVariationManager* lvm = CVPbkLocalVariationManager::NewL(); + TBool supportSyncGroupVcard = lvm->LocallyVariatedFeatureEnabled( EVPbkLVSyncGroupEnabled ); + delete lvm; + if (supportSyncGroupVcard && iGroupcardHandler && !isGroupCard) + { + iGroupcardHandler->BuildContactGroupsHashMapL(iTargetStore); + iGroupcardHandler->GetContactGroupStoreL(aResults->At(0)); + iGroupcardHandler->DeleteContactFromGroupsL(); + } + CleanupStack::PopAndDestroy(); // aResults if ( !destroyed ) diff -r 2666d9724c76 -r d4f567ce2e7c phonebookengines/VirtualPhonebook/VPbkVCardEng/src/CVPbkVCardImporter.cpp --- a/phonebookengines/VirtualPhonebook/VPbkVCardEng/src/CVPbkVCardImporter.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookengines/VirtualPhonebook/VPbkVCardEng/src/CVPbkVCardImporter.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -205,19 +205,6 @@ iObserver = &aObserver; } -CParserProperty* CVPbkVCardImporter::GetCurrentProperty() - { - // Get current property from parser array - CParserProperty* property = NULL; - TInt elementCount = iParser->ArrayOfProperties( EFalse )->Count(); - if ( iArrayElementIndex < elementCount ) - { - property = - iParser->ArrayOfProperties( EFalse )->At( iArrayElementIndex ); - } - return property; - } - CParserProperty* CVPbkVCardImporter::NextProperty() { // Get next property from parser array @@ -346,15 +333,17 @@ aData.Uid() == TUid::Uid( KVersitPropertyCDesCArrayUid ) ) { const TDesC& value = converter.GetDesCData( aData ); + // If it is an IMPP field if ( aData.FieldType().FieldTypeResId() == R_VPBK_FIELD_TYPE_IMPP ) { TInt pos = value.Find(KColon); - if( 0 == pos ) + if( 0 == pos || KErrNotFound == pos ) { - // If the service name is NULL and it's a IMPP field, don't save the data. + // If the service name or the colon doesn't exist, don't save the data. // e.g.: // (1) If the value is YAHOO:peterpan@yahoo.com, YAHOO is the service name // (2) If the value is :peterpan@yahoo.com, the service name is NULL + // (3) If the value is peterpan@yahoo.com, neither the service name and the colon exists isSaved = EFalse; } } @@ -479,13 +468,17 @@ { delete iAddFieldOperation; iAddFieldOperation = NULL; - StartAsync( ESaveField ); } if (&aOperation == iAddCntContactFieldOperation) { delete iAddCntContactFieldOperation; iAddCntContactFieldOperation = NULL; } + // When both operations have completed + if ( !iAddFieldOperation && !iAddCntContactFieldOperation ) + { + StartAsync( ESaveField ); + } } void CVPbkVCardImporter::FieldAddingFailed( diff -r 2666d9724c76 -r d4f567ce2e7c phonebookengines/VirtualPhonebook/inc/CVPbkSimContact.h --- a/phonebookengines/VirtualPhonebook/inc/CVPbkSimContact.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookengines/VirtualPhonebook/inc/CVPbkSimContact.h Thu Aug 19 09:41:07 2010 +0300 @@ -178,6 +178,12 @@ private: // New functions /// Creates ETel contact from native fields void CreateETelContactL() const; + + /* + * Used to indentify the different additional number field types + * according the order in the field array. + */ + void IndentifyAdditionalFields(); private: // Data /// The array for the fields diff -r 2666d9724c76 -r d4f567ce2e7c phonebookengines/VirtualPhonebook/inc/VPbkSimCntFieldTypes.hrh --- a/phonebookengines/VirtualPhonebook/inc/VPbkSimCntFieldTypes.hrh Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookengines/VirtualPhonebook/inc/VPbkSimCntFieldTypes.hrh Thu Aug 19 09:41:07 2010 +0300 @@ -30,7 +30,11 @@ EVPbkSimReading = 5, // ETel ETagPBSecondName EVPbkSimEMailAddress = 6, // ETagPBEmailAddress EVPbkSimGroupName = 7, // ETel ETagPBGroupName - EVPbkSimUnknownType = 8 + EVPbkSimUnknownType = 8, + EVPbkSimAdditionalNumber1 = 9, // ETagPBAnrStart the first additional number + EVPbkSimAdditionalNumber2 = 10, // ETagPBAnrStart the second additional number + EVPbkSimAdditionalNumber3 = 11, // ETagPBAnrStart the third additional number + EVPbkSimAdditionalNumberLast = EVPbkSimAdditionalNumber // ETagPBAnrStart the fourth additional number and so on. }; diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook/View/src/CPbkFFSCheck.cpp --- a/phonebookui/Phonebook/View/src/CPbkFFSCheck.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook/View/src/CPbkFFSCheck.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -59,7 +59,12 @@ EXPORT_C TBool CPbkFFSCheck::FFSClCheckL(TInt aBytesToWrite/*=0*/) { - if (SysUtil::FFSSpaceBelowCriticalLevelL(&iConeEnv->FsSession(),aBytesToWrite) || + RFs* rfSession = NULL; + if ( iConeEnv ) + { + rfSession = &iConeEnv->FsSession(); + } + if (SysUtil::FFSSpaceBelowCriticalLevelL( rfSession, aBytesToWrite ) || DebugFailNext()) { // Show not enough memory note diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/Application/rss/Pbk2MenuResources.rss --- a/phonebookui/Phonebook2/Application/rss/Pbk2MenuResources.rss Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/Application/rss/Pbk2MenuResources.rss Thu Aug 19 09:41:07 2010 +0300 @@ -106,7 +106,7 @@ }, MENU_TITLE { - menu_pane = R_AVKON_MENUPANE_MARKABLE_LIST; + menu_pane = R_AVKON_MENUPANE_MARK_MULTIPLE; }, MENU_TITLE { @@ -194,37 +194,6 @@ }; } -// -------------------------------------------------------------------------- -// Names List View's Context sensitive menu bar -// when items are marked -// -------------------------------------------------------------------------- -// -RESOURCE MENU_BAR r_phonebook2_nameslist_context_menubar_items_marked - { - titles = - { - MENU_TITLE - { - menu_pane = R_PHONEBOOK2_MARKABLE_LIST_CONTEXT_MENU; - }, - MENU_TITLE - { - menu_pane = R_PHONEBOOK2_NAMESLIST_COPY_CONTEXT_MENU; - }, - MENU_TITLE - { - menu_pane = R_PHONEBOOK2_NAMESLIST_CONTEXT_MENU_MARKED_ITEMS; - }, - MENU_TITLE - { - menu_pane = R_PHONEBOOK2_BCARD_SEND_MENU; - }, - MENU_TITLE - { - menu_pane = R_PHONEBOOK2_NAMELIST_CREATE_MESSAGE_MENU; - } - }; - } // -------------------------------------------------------------------------- // Contact Info View's menu bar diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/BWINS/Pbk2UiControlsU.DEF --- a/phonebookui/Phonebook2/BWINS/Pbk2UiControlsU.DEF Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/BWINS/Pbk2UiControlsU.DEF Thu Aug 19 09:41:07 2010 +0300 @@ -1,124 +1,124 @@ EXPORTS - ??0CPbk2NamesListControl@@QAE@PBVCCoeControl@@AAVCVPbkContactManager@@AAVMVPbkContactViewBase@@AAVMPbk2ContactNameFormatter@@AAVCPbk2StorePropertyArray@@@Z @ 1 NONAME ; CPbk2NamesListControl::CPbk2NamesListControl(class CCoeControl const *, class CVPbkContactManager &, class MVPbkContactViewBase &, class MPbk2ContactNameFormatter &, class CPbk2StorePropertyArray &) - ??0TParams@CPbk2FetchDlg@@QAE@XZ @ 2 NONAME ; CPbk2FetchDlg::TParams::TParams(void) - ??0TPbk2AddItemWrapper@@QAE@ABVCPbk2FieldPropertyGroup@@@Z @ 3 NONAME ; TPbk2AddItemWrapper::TPbk2AddItemWrapper(class CPbk2FieldPropertyGroup const &) - ??0TPbk2AddItemWrapper@@QAE@ABVMPbk2FieldProperty@@@Z @ 4 NONAME ; TPbk2AddItemWrapper::TPbk2AddItemWrapper(class MPbk2FieldProperty const &) - ??0TPbk2AddressSelectParams@@QAE@AAVMVPbkStoreContact@@ABVCVPbkContactManager@@AAVMPbk2ContactNameFormatter@@ABVCPbk2FieldPropertyArray@@AAVTResourceReader@@H@Z @ 5 NONAME ; TPbk2AddressSelectParams::TPbk2AddressSelectParams(class MVPbkStoreContact &, class CVPbkContactManager const &, class MPbk2ContactNameFormatter &, class CPbk2FieldPropertyArray const &, class TResourceReader &, int) - ??1CPbk2AddressSelect@@UAE@XZ @ 6 NONAME ; CPbk2AddressSelect::~CPbk2AddressSelect(void) - ??1CPbk2ContactUiControlSubstitute@@UAE@XZ @ 7 NONAME ; CPbk2ContactUiControlSubstitute::~CPbk2ContactUiControlSubstitute(void) - ??BTParams@CPbk2FetchDlg@@QAE?AVTCleanupItem@@XZ @ 8 NONAME ; CPbk2FetchDlg::TParams::operator class TCleanupItem(void) - ?AcceptDelayedFetchL@CPbk2FetchDlg@@QAEXABVTDesC8@@@Z @ 9 NONAME ; void CPbk2FetchDlg::AcceptDelayedFetchL(class TDesC8 const &) - ?AddObserverL@CPbk2ContactInfoControl@@QAEXAAVMPbk2ControlObserver@@@Z @ 10 NONAME ; void CPbk2ContactInfoControl::AddObserverL(class MPbk2ControlObserver &) - ?AddObserverL@CPbk2NamesListControl@@QAEXAAVMPbk2ControlObserver@@@Z @ 11 NONAME ; void CPbk2NamesListControl::AddObserverL(class MPbk2ControlObserver &) - ?AttemptExitL@CPbk2AddressSelect@@QAEXH@Z @ 12 NONAME ; void CPbk2AddressSelect::AttemptExitL(int) - ?CommitSettingsL@CPbk2SettingsListControl@@QAEXXZ @ 13 NONAME ; void CPbk2SettingsListControl::CommitSettingsL(void) - ?CreatePhoneNumberFormatterL@Pbk2PhoneNumberFormatterFactory@@SAPAVMPbk2PhoneNumberFormatter@@H@Z @ 14 NONAME ; class MPbk2PhoneNumberFormatter * Pbk2PhoneNumberFormatterFactory::CreatePhoneNumberFormatterL(int) - ?ExecuteLD@CPbk2AddItemToContactDlg@@QAEHAAV?$RArray@VTPbk2AddItemWrapper@@@@PBVTPbk2AddItemDialogParams@@@Z @ 15 NONAME ; int CPbk2AddItemToContactDlg::ExecuteLD(class RArray &, class TPbk2AddItemDialogParams const *) - ?ExecuteLD@CPbk2AddressSelect@@QAEPAVMVPbkStoreContactField@@XZ @ 16 NONAME ; class MVPbkStoreContactField * CPbk2AddressSelect::ExecuteLD(void) - ?ExecuteLD@CPbk2ContactEditorDlg@@QAEXXZ @ 17 NONAME ; void CPbk2ContactEditorDlg::ExecuteLD(void) - ?ExecuteLD@CPbk2FetchDlg@@QAEHXZ @ 18 NONAME ; int CPbk2FetchDlg::ExecuteLD(void) - ?ExecuteLD@CPbk2GeneralConfirmationQuery@@QAEHABVMVPbkBaseContact@@H@Z @ 19 NONAME ; int CPbk2GeneralConfirmationQuery::ExecuteLD(class MVPbkBaseContact const &, int) - ?ExecuteLD@CPbk2GeneralConfirmationQuery@@QAEHHH@Z @ 20 NONAME ; int CPbk2GeneralConfirmationQuery::ExecuteLD(int, int) - ?ExecuteLD@CPbk2MemoryEntryDefaultsAssignDlg@@QAEHABVCPbk2PresentationContactFieldCollection@@ABVCVPbkContactManager@@ABVMPbk2FieldPropertyArray@@@Z @ 21 NONAME ABSENT ; int CPbk2MemoryEntryDefaultsAssignDlg::ExecuteLD(class CPbk2PresentationContactFieldCollection const &, class CVPbkContactManager const &, class MPbk2FieldPropertyArray const &) - ?ExecuteLD@CPbk2MemoryEntryDefaultsDlg@@QAEXXZ @ 22 NONAME ; void CPbk2MemoryEntryDefaultsDlg::ExecuteLD(void) - ?ExecuteLD@CPbk2PhonebookInfoDlg@@QAEXAAVCVPbkContactStoreUriArray@@@Z @ 23 NONAME ; void CPbk2PhonebookInfoDlg::ExecuteLD(class CVPbkContactStoreUriArray &) - ?ExecuteLD@CPbk2StoreListQuery@@QAEHABVTDesC16@@AAVCVPbkContactStoreUriArray@@@Z @ 24 NONAME ; int CPbk2StoreListQuery::ExecuteLD(class TDesC16 const &, class CVPbkContactStoreUriArray &) - ?FormatFieldContentL@CPbk2FieldFormatter@@QAE?AVTPtrC16@@ABVMVPbkBaseContactField@@ABVMVPbkFieldType@@@Z @ 25 NONAME ; class TPtrC16 CPbk2FieldFormatter::FormatFieldContentL(class MVPbkBaseContactField const &, class MVPbkFieldType const &) - ?HideThumbnail@CPbk2ThumbnailLoader@@QAEXXZ @ 26 NONAME ; void CPbk2ThumbnailLoader::HideThumbnail(void) - ?IsWaiting@CPbk2InputAbsorber@@QBEHXZ @ 27 NONAME ; int CPbk2InputAbsorber::IsWaiting(void) const - ?LoadThumbnail@CPbk2ThumbnailLoader@@QAEXPAVMVPbkStoreContact@@PBVCEikListBox@@W4TPbk2ThumbnailLocation@@@Z @ 28 NONAME ; void CPbk2ThumbnailLoader::LoadThumbnail(class MVPbkStoreContact *, class CEikListBox const *, enum TPbk2ThumbnailLocation) - ?LoadThumbnailL@CPbk2ThumbnailLoader@@QAEXPAVMVPbkContactLink@@PBVCEikListBox@@W4TPbk2ThumbnailLocation@@@Z @ 29 NONAME ; void CPbk2ThumbnailLoader::LoadThumbnailL(class MVPbkContactLink *, class CEikListBox const *, enum TPbk2ThumbnailLocation) - ?NewL@CPbk2AddItemToContactDlg@@SAPAV1@XZ @ 30 NONAME ; class CPbk2AddItemToContactDlg * CPbk2AddItemToContactDlg::NewL(void) - ?NewL@CPbk2AddressSelect@@SAPAV1@AAVTPbk2AddressSelectParams@@@Z @ 31 NONAME ; class CPbk2AddressSelect * CPbk2AddressSelect::NewL(class TPbk2AddressSelectParams &) - ?NewL@CPbk2ContactEditorDlg@@SAPAV1@AAVTPbk2ContactEditorParams@@PAVMVPbkStoreContact@@AAVMPbk2EditedContactObserver@@@Z @ 32 NONAME ; class CPbk2ContactEditorDlg * CPbk2ContactEditorDlg::NewL(class TPbk2ContactEditorParams &, class MVPbkStoreContact *, class MPbk2EditedContactObserver &) - ?NewL@CPbk2ContactInfoControl@@SAPAV1@PBVCCoeControl@@AAVCVPbkContactManager@@AAVMPbk2ContactNameFormatter@@AAVMPbk2FieldPropertyArray@@AAVCPbk2StorePropertyArray@@PAVMPbk2ContactNavigation@@@Z @ 33 NONAME ; class CPbk2ContactInfoControl * CPbk2ContactInfoControl::NewL(class CCoeControl const *, class CVPbkContactManager &, class MPbk2ContactNameFormatter &, class MPbk2FieldPropertyArray &, class CPbk2StorePropertyArray &, class MPbk2ContactNavigation *) - ?NewL@CPbk2ContactUiControlSubstitute@@SAPAV1@XZ @ 34 NONAME ; class CPbk2ContactUiControlSubstitute * CPbk2ContactUiControlSubstitute::NewL(void) - ?NewL@CPbk2FetchDlg@@SAPAV1@VTParams@1@AAVMPbk2FetchDlgObserver@@@Z @ 35 NONAME ; class CPbk2FetchDlg * CPbk2FetchDlg::NewL(class CPbk2FetchDlg::TParams, class MPbk2FetchDlgObserver &) - ?NewL@CPbk2FieldFormatter@@SAPAV1@ABVMPbk2FieldPropertyArray@@ABVMVPbkFieldTypeList@@@Z @ 36 NONAME ; class CPbk2FieldFormatter * CPbk2FieldFormatter::NewL(class MPbk2FieldPropertyArray const &, class MVPbkFieldTypeList const &) - ?NewL@CPbk2GeneralConfirmationQuery@@SAPAV1@XZ @ 37 NONAME ; class CPbk2GeneralConfirmationQuery * CPbk2GeneralConfirmationQuery::NewL(void) - ?NewL@CPbk2InputAbsorber@@SAPAV1@H@Z @ 38 NONAME ; class CPbk2InputAbsorber * CPbk2InputAbsorber::NewL(int) - ?NewL@CPbk2MemoryEntryDefaultsAssignDlg@@SAPAV1@XZ @ 39 NONAME ; class CPbk2MemoryEntryDefaultsAssignDlg * CPbk2MemoryEntryDefaultsAssignDlg::NewL(void) - ?NewL@CPbk2MemoryEntryDefaultsDlg@@SAPAV1@AAVCPbk2PresentationContact@@AAVCVPbkContactManager@@@Z @ 40 NONAME ; class CPbk2MemoryEntryDefaultsDlg * CPbk2MemoryEntryDefaultsDlg::NewL(class CPbk2PresentationContact &, class CVPbkContactManager &) - ?NewL@CPbk2NamesListControl@@SAPAV1@HPBVCCoeControl@@AAVCVPbkContactManager@@AAVMVPbkContactViewBase@@AAVMPbk2ContactNameFormatter@@AAVCPbk2StorePropertyArray@@@Z @ 41 NONAME ; class CPbk2NamesListControl * CPbk2NamesListControl::NewL(int, class CCoeControl const *, class CVPbkContactManager &, class MVPbkContactViewBase &, class MPbk2ContactNameFormatter &, class CPbk2StorePropertyArray &) - ?NewL@CPbk2PhonebookInfoDlg@@SAPAV1@XZ @ 42 NONAME ; class CPbk2PhonebookInfoDlg * CPbk2PhonebookInfoDlg::NewL(void) - ?NewL@CPbk2PrependDlg@@SAPAV1@AAVTDes16@@@Z @ 43 NONAME ; class CPbk2PrependDlg * CPbk2PrependDlg::NewL(class TDes16 &) - ?NewL@CPbk2SettingsListControl@@SAPAV1@PBVCCoeControl@@AAVCPbk2SortOrderManager@@AAVMPbk2SettingsControlExtension@@@Z @ 44 NONAME ; class CPbk2SettingsListControl * CPbk2SettingsListControl::NewL(class CCoeControl const *, class CPbk2SortOrderManager &, class MPbk2SettingsControlExtension &) - ?NewL@CPbk2StoreListQuery@@SAPAV1@XZ @ 45 NONAME ; class CPbk2StoreListQuery * CPbk2StoreListQuery::NewL(void) - ?NewL@CPbk2ThumbnailLoader@@SAPAV1@AAVCVPbkContactManager@@@Z @ 46 NONAME ; class CPbk2ThumbnailLoader * CPbk2ThumbnailLoader::NewL(class CVPbkContactManager &) - ?NewLC@CPbk2InputAbsorber@@SAPAV1@H@Z @ 47 NONAME ; class CPbk2InputAbsorber * CPbk2InputAbsorber::NewLC(int) - ?Pbk2ControlKeyEventL@CPbk2AddressSelect@@UAE?AW4TKeyResponse@@ABUTKeyEvent@@W4TEventCode@@@Z @ 48 NONAME ; enum TKeyResponse CPbk2AddressSelect::Pbk2ControlKeyEventL(struct TKeyEvent const &, enum TEventCode) - ?PropertyAt@TPbk2AddItemWrapper@@QBEABVMPbk2FieldProperty@@H@Z @ 49 NONAME ; class MPbk2FieldProperty const & TPbk2AddItemWrapper::PropertyAt(int) const - ?PropertyCount@TPbk2AddItemWrapper@@QBEHXZ @ 50 NONAME ; int TPbk2AddItemWrapper::PropertyCount(void) const - ?Refresh@CPbk2ThumbnailLoader@@QAEXXZ @ 51 NONAME ; void CPbk2ThumbnailLoader::Refresh(void) - ?RemoveObserver@CPbk2ContactInfoControl@@QAEXAAVMPbk2ControlObserver@@@Z @ 52 NONAME ; void CPbk2ContactInfoControl::RemoveObserver(class MPbk2ControlObserver &) - ?RemoveObserver@CPbk2NamesListControl@@QAEXAAVMPbk2ControlObserver@@@Z @ 53 NONAME ; void CPbk2NamesListControl::RemoveObserver(class MPbk2ControlObserver &) - ?Reset@CPbk2NamesListControl@@QAEXXZ @ 54 NONAME ; void CPbk2NamesListControl::Reset(void) - ?Reset@CPbk2ThumbnailLoader@@QAEXXZ @ 55 NONAME ; void CPbk2ThumbnailLoader::Reset(void) - ?SetAllItemTextL@CPbk2StoreListQuery@@QAEXABVTDesC16@@H@Z @ 56 NONAME ; void CPbk2StoreListQuery::SetAllItemTextL(class TDesC16 const &, int) - ?SetCba@CPbk2AddressSelect@@QAEXH@Z @ 57 NONAME ; void CPbk2AddressSelect::SetCba(int) - ?SetCommandObserver@CPbk2InputAbsorber@@QAEXPAVMEikCommandObserver@@@Z @ 58 NONAME ; void CPbk2InputAbsorber::SetCommandObserver(class MEikCommandObserver *) - ?SetDefaultPriorities@TPbk2AddressSelectParams@@QAEXABVRVPbkContactFieldDefaultPriorities@@@Z @ 59 NONAME ; void TPbk2AddressSelectParams::SetDefaultPriorities(class RVPbkContactFieldDefaultPriorities const &) - ?SetFocusedField@CPbk2ContactUiControlSubstitute@@QAEXABVMVPbkBaseContactField@@@Z @ 60 NONAME ; void CPbk2ContactUiControlSubstitute::SetFocusedField(class MVPbkBaseContactField const &) - ?SetFocusedField@TPbk2AddressSelectParams@@QAEXPBVMVPbkStoreContactField@@@Z @ 61 NONAME ; void TPbk2AddressSelectParams::SetFocusedField(class MVPbkStoreContactField const *) - ?SetFocusedFieldIndex@CPbk2ContactUiControlSubstitute@@UAEXH@Z @ 62 NONAME ; void CPbk2ContactUiControlSubstitute::SetFocusedFieldIndex(int) - ?SetFocusedStoreContact@CPbk2ContactUiControlSubstitute@@QAEXABVMVPbkStoreContact@@@Z @ 63 NONAME ; void CPbk2ContactUiControlSubstitute::SetFocusedStoreContact(class MVPbkStoreContact const &) - ?SetParentUiControl@CPbk2ContactUiControlSubstitute@@QAEXAAVMPbk2ContactUiControl@@@Z @ 64 NONAME ; void CPbk2ContactUiControlSubstitute::SetParentUiControl(class MPbk2ContactUiControl &) - ?SetQueryAlways@TPbk2AddressSelectParams@@QAEXH@Z @ 65 NONAME ; void TPbk2AddressSelectParams::SetQueryAlways(int) - ?SetSelectedStore@CPbk2ContactUiControlSubstitute@@QAEXAAVMVPbkContactStore@@@Z @ 66 NONAME ; void CPbk2ContactUiControlSubstitute::SetSelectedStore(class MVPbkContactStore &) - ?SetTimeFormatL@CPbk2FieldFormatter@@QAEXABVTDesC16@@@Z @ 67 NONAME ; void CPbk2FieldFormatter::SetTimeFormatL(class TDesC16 const &) - ?SetUseDefaultDirectly@TPbk2AddressSelectParams@@QAEXH@Z @ 68 NONAME ; void TPbk2AddressSelectParams::SetUseDefaultDirectly(int) - ?SetViewL@CPbk2NamesListControl@@QAEXAAVMVPbkContactViewBase@@@Z @ 69 NONAME ; void CPbk2NamesListControl::SetViewL(class MVPbkContactViewBase &) - ?StopWait@CPbk2InputAbsorber@@QAEXXZ @ 70 NONAME ; void CPbk2InputAbsorber::StopWait(void) - ?Wait@CPbk2InputAbsorber@@QAEXXZ @ 71 NONAME ; void CPbk2InputAbsorber::Wait(void) - ?CreateTitlePanePictureLC@Pbk2TitlePanePictureFactory@@SAPAVCEikImage@@PBVMVPbkStoreContact@@AAVCPbk2StorePropertyArray@@@Z @ 72 NONAME ; class CEikImage * Pbk2TitlePanePictureFactory::CreateTitlePanePictureLC(class MVPbkStoreContact const *, class CPbk2StorePropertyArray &) - ?NewL@CPbk2DefaultAttributeProcess@@SAPAV1@AAVCVPbkContactManager@@AAVMVPbkStoreContact@@AAVMPbk2DefaultAttributeProcessObserver@@@Z @ 73 NONAME ; class CPbk2DefaultAttributeProcess * CPbk2DefaultAttributeProcess::NewL(class CVPbkContactManager &, class MVPbkStoreContact &, class MPbk2DefaultAttributeProcessObserver &) - ?RemoveDefaultL@CPbk2DefaultAttributeProcess@@QAEXW4TVPbkDefaultType@@@Z @ 74 NONAME ; void CPbk2DefaultAttributeProcess::RemoveDefaultL(enum TVPbkDefaultType) - ?RemoveDefaultsL@CPbk2DefaultAttributeProcess@@QAEXPAV?$CArrayFixFlat@W4TVPbkDefaultType@@@@@Z @ 75 NONAME ; void CPbk2DefaultAttributeProcess::RemoveDefaultsL(class CArrayFixFlat *) - ?SetDefaultL@CPbk2DefaultAttributeProcess@@QAEXW4TVPbkDefaultType@@AAVMVPbkStoreContactField@@@Z @ 76 NONAME ; void CPbk2DefaultAttributeProcess::SetDefaultL(enum TVPbkDefaultType, class MVPbkStoreContactField &) - ?SetDefaultsL@CPbk2DefaultAttributeProcess@@QAEXPAV?$CArrayFixFlat@W4TVPbkDefaultType@@@@AAVMVPbkStoreContactField@@@Z @ 77 NONAME ; void CPbk2DefaultAttributeProcess::SetDefaultsL(class CArrayFixFlat *, class MVPbkStoreContactField &) - ?SetTitleToIncludeContactName@TPbk2AddressSelectParams@@QAEXH@Z @ 78 NONAME ; void TPbk2AddressSelectParams::SetTitleToIncludeContactName(int) - ?GiveViewL@CPbk2NamesListControl@@QAEXPAVMVPbkContactViewBase@@@Z @ 79 NONAME ; void CPbk2NamesListControl::GiveViewL(class MVPbkContactViewBase *) - ?SetSuppressWarnings@TPbk2AddressSelectParams@@QAEXH@Z @ 80 NONAME ; void TPbk2AddressSelectParams::SetSuppressWarnings(int) - ?AllowPointerEvents@CPbk2NamesListControl@@QAEXH@Z @ 81 NONAME ; void CPbk2NamesListControl::AllowPointerEvents(int) - ?CreateListboxIconArrayL@CPbk2ContactIconsUtils@@SAPAVCPbk2IconArray@@H@Z @ 82 NONAME ; class CPbk2IconArray * CPbk2ContactIconsUtils::CreateListboxIconArrayL(int) - ?GetIconIdsForContactL@CPbk2ContactIconsUtils@@QBEXABVMVPbkViewContact@@AAV?$RArray@VTPbk2IconId@@@@@Z @ 83 NONAME ; void CPbk2ContactIconsUtils::GetIconIdsForContactL(class MVPbkViewContact const &, class RArray &) const - ?NewL@CPbk2ContactIconsUtils@@SAPAV1@AAVCPbk2StorePropertyArray@@PAVMPbk2ContactUiControlExtension@@@Z @ 84 NONAME ; class CPbk2ContactIconsUtils * CPbk2ContactIconsUtils::NewL(class CPbk2StorePropertyArray &, class MPbk2ContactUiControlExtension *) - ?NewL@CPbk2AddressSelect@@SAPAV1@AAVTPbk2AddressSelectParams@@AAVCVPbkFieldTypeSelector@@PBV?$TArray@PAVMVPbkStoreContact@@@@PBV?$TArray@PAVCPbk2PresenceIconInfo@@@@@Z @ 85 NONAME ; class CPbk2AddressSelect * CPbk2AddressSelect::NewL(class TPbk2AddressSelectParams &, class CVPbkFieldTypeSelector &, class TArray const *, class TArray const *) - ?MapViewTypeToAddress@Pbk2AddressTools@@SA?AW4TPbk2FieldGroupId@@W4TActiveView@TPbk2ContactEditorParams@@@Z @ 86 NONAME ; enum TPbk2FieldGroupId Pbk2AddressTools::MapViewTypeToAddress(enum TPbk2ContactEditorParams::TActiveView) - ?GetAddressShortPreviewLC@Pbk2AddressTools@@SAXAAVMVPbkStoreContact@@W4TPbk2FieldGroupId@@AAVRBuf16@@@Z @ 87 NONAME ; void Pbk2AddressTools::GetAddressShortPreviewLC(class MVPbkStoreContact &, enum TPbk2FieldGroupId, class RBuf16 &) - ?InitializeL@CPbk2ContactEditorReadonlyField@@QAEXPAVMPbk2ContactEditorUIField@@@Z @ 88 NONAME ; void CPbk2ContactEditorReadonlyField::InitializeL(class MPbk2ContactEditorUIField *) - ?SetTextL@CPbk2ContactEditorReadonlyField@@QAEXPBVTDesC16@@@Z @ 89 NONAME ; void CPbk2ContactEditorReadonlyField::SetTextL(class TDesC16 const *) - ?FieldLabel@CPbk2ContactEditorUIFieldBase@@UBEABVTDesC16@@XZ @ 90 NONAME ; class TDesC16 const & CPbk2ContactEditorUIFieldBase::FieldLabel(void) const - ?MapAddressToVersitParam@Pbk2AddressTools@@SA?AW4TVPbkFieldTypeParameter@@W4TPbk2FieldGroupId@@@Z @ 91 NONAME ; enum TVPbkFieldTypeParameter Pbk2AddressTools::MapAddressToVersitParam(enum TPbk2FieldGroupId) - ?HandleCustomFieldCommandL@CPbk2ContactEditorUIFieldBase@@UAEHH@Z @ 92 NONAME ; int CPbk2ContactEditorUIFieldBase::HandleCustomFieldCommandL(int) - ?SetFieldLabelL@CPbk2ContactEditorUIFieldBase@@UAEXABVTDesC16@@@Z @ 93 NONAME ; void CPbk2ContactEditorUIFieldBase::SetFieldLabelL(class TDesC16 const &) - ?SetFocus@CPbk2ContactEditorUIFieldBase@@UAEXXZ @ 94 NONAME ; void CPbk2ContactEditorUIFieldBase::SetFocus(void) - ?NewL@CPbk2UIFieldArray@@SAPAV1@ABVTDesC16@@AAVRFs@@AAVMPbk2UIFieldFactory@@@Z @ 95 NONAME ; class CPbk2UIFieldArray * CPbk2UIFieldArray::NewL(class TDesC16 const &, class RFs &, class MPbk2UIFieldFactory &) - ?ControlId@CPbk2ContactEditorUIFieldBase@@UAEHXZ @ 96 NONAME ; int CPbk2ContactEditorUIFieldBase::ControlId(void) - ??1CPbk2ContactEditorUIFieldBase@@UAE@XZ @ 97 NONAME ; CPbk2ContactEditorUIFieldBase::~CPbk2ContactEditorUIFieldBase(void) - ?GetAddressPreviewLC@Pbk2AddressTools@@SAXAAVMVPbkStoreContact@@W4TPbk2FieldGroupId@@AAVRBuf16@@@Z @ 98 NONAME ; void Pbk2AddressTools::GetAddressPreviewLC(class MVPbkStoreContact &, enum TPbk2FieldGroupId, class RBuf16 &) - ?GetAddressFieldsLC@Pbk2AddressTools@@SAXAAVMVPbkStoreContact@@W4TPbk2FieldGroupId@@AAV?$RHashMap@HVTPtrC16@@@@@Z @ 99 NONAME ; void Pbk2AddressTools::GetAddressFieldsLC(class MVPbkStoreContact &, enum TPbk2FieldGroupId, class RHashMap &) - ??0CPbk2ContactEditorUIFieldBase@@IAE@PAVMPbk2UIField@@AAVMPbk2ContactEditorUiBuilder@@AAVCPbk2IconInfoContainer@@H@Z @ 100 NONAME ; CPbk2ContactEditorUIFieldBase::CPbk2ContactEditorUIFieldBase(class MPbk2UIField *, class MPbk2ContactEditorUiBuilder &, class CPbk2IconInfoContainer &, int) - ?LoadBitmapToFieldL@CPbk2ContactEditorUIFieldBase@@UAEXABVTPbk2IconId@@@Z @ 101 NONAME ; void CPbk2ContactEditorUIFieldBase::LoadBitmapToFieldL(class TPbk2IconId const &) - ?MapCtrlTypeToAddress@Pbk2AddressTools@@SA?AW4TPbk2FieldGroupId@@H@Z @ 102 NONAME ; enum TPbk2FieldGroupId Pbk2AddressTools::MapCtrlTypeToAddress(int) - ?ConsumesKeyEvent@CPbk2ContactEditorUIFieldBase@@UAEHABUTKeyEvent@@W4TEventCode@@@Z @ 103 NONAME ; int CPbk2ContactEditorUIFieldBase::ConsumesKeyEvent(struct TKeyEvent const &, enum TEventCode) - ?MapCtrlTypeToViewType@Pbk2AddressTools@@SA?AW4TActiveView@TPbk2ContactEditorParams@@H@Z @ 104 NONAME ; enum TPbk2ContactEditorParams::TActiveView Pbk2AddressTools::MapCtrlTypeToViewType(int) - ?UIField@CPbk2ContactEditorUIFieldBase@@UBEPAVMPbk2UIField@@XZ @ 105 NONAME ; class MPbk2UIField * CPbk2ContactEditorUIFieldBase::UIField(void) const - ?MapAddressToOrdering@Pbk2AddressTools@@SAHW4TPbk2FieldGroupId@@@Z @ 106 NONAME ; int Pbk2AddressTools::MapAddressToOrdering(enum TPbk2FieldGroupId) - ?ControlText@CPbk2ContactEditorUIFieldBase@@UBEABVTDesC16@@XZ @ 107 NONAME ; class TDesC16 const & CPbk2ContactEditorUIFieldBase::ControlText(void) const - ?ExecuteLD@CPbk2GeneralConfirmationQuery@@QAEHABVMVPbkBaseContact@@HH@Z @ 108 NONAME ; int CPbk2GeneralConfirmationQuery::ExecuteLD(class MVPbkBaseContact const &, int, int) - ?SetCurrentGroupLinkL@CPbk2NamesListControl@@QAEXPAVMVPbkContactLink@@@Z @ 109 NONAME ; void CPbk2NamesListControl::SetCurrentGroupLinkL(class MVPbkContactLink *) - ?NewL@CPbk2ThumbnailManager@@SAPAV1@AAVCVPbkContactManager@@@Z @ 110 NONAME ; class CPbk2ThumbnailManager * CPbk2ThumbnailManager::NewL(class CVPbkContactManager &) - ?NewL@CPbk2NamesListControl@@SAPAV1@HPBVCCoeControl@@AAVCVPbkContactManager@@AAVMVPbkContactViewBase@@AAVMPbk2ContactNameFormatter@@AAVCPbk2StorePropertyArray@@PAVCPbk2ThumbnailManager@@@Z @ 111 NONAME ; class CPbk2NamesListControl * CPbk2NamesListControl::NewL(int, class CCoeControl const *, class CVPbkContactManager &, class MVPbkContactViewBase &, class MPbk2ContactNameFormatter &, class CPbk2StorePropertyArray &, class CPbk2ThumbnailManager *) - ?ExecuteLD@CPbk2MemoryEntryDefaultsAssignDlg@@QAEHABVCPbk2PresentationContactFieldCollection@@ABVCVPbkContactManager@@ABVMPbk2FieldPropertyArray@@W4TVPbkContactActionTypeSelector@VPbkFieldTypeSelectorFactory@@@Z @ 112 NONAME ; int CPbk2MemoryEntryDefaultsAssignDlg::ExecuteLD(class CPbk2PresentationContactFieldCollection const &, class CVPbkContactManager const &, class MPbk2FieldPropertyArray const &, enum VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector) - ?NewL@CPbk2ContactEditorDlg@@SAPAV1@AAVTPbk2ContactEditorParams@@PAVMVPbkStoreContact@@AAVMPbk2EditedContactObserver@@PAVMPbk2ApplicationServices@@PAVHBufC16@@H@Z @ 113 NONAME ; class CPbk2ContactEditorDlg * CPbk2ContactEditorDlg::NewL(class TPbk2ContactEditorParams &, class MVPbkStoreContact *, class MPbk2EditedContactObserver &, class MPbk2ApplicationServices *, class HBufC16 *, int) - ?NewL@CPbk2AddItemToContactDlg@@SAPAV1@PAVMPbk2ApplicationServices@@@Z @ 114 NONAME ; class CPbk2AddItemToContactDlg * CPbk2AddItemToContactDlg::NewL(class MPbk2ApplicationServices *) - ?NewL@CPbk2MergeConflictsDlg@@SAPAV1@PAVMPbk2MergeResolver@@H@Z @ 115 NONAME ; class CPbk2MergeConflictsDlg * CPbk2MergeConflictsDlg::NewL(class MPbk2MergeResolver *, int) - ?NewL@CPbk2MergePhotoConflictDlg@@SAPAV1@PAVMVPbkBaseContact@@0PAH@Z @ 116 NONAME ; class CPbk2MergePhotoConflictDlg * CPbk2MergePhotoConflictDlg::NewL(class MVPbkBaseContact *, class MVPbkBaseContact *, int *) - ?StopQuery@CPbk2GeneralConfirmationQuery@@QAEXXZ @ 117 NONAME ; void CPbk2GeneralConfirmationQuery::StopQuery(void) - ?HandleViewForegroundEventL@CPbk2NamesListControl@@QAEXH@Z @ 118 NONAME ; void CPbk2NamesListControl::HandleViewForegroundEventL(int) - ?MapVPbkFieldTypeToAddressGroupId@Pbk2AddressTools@@SA?AW4TPbk2FieldGroupId@@PBVMVPbkFieldType@@@Z @ 119 NONAME ; enum TPbk2FieldGroupId Pbk2AddressTools::MapVPbkFieldTypeToAddressGroupId(class MVPbkFieldType const *) - ?IsAddressPreviewEmptyL@Pbk2AddressTools@@SAHAAVMVPbkStoreContact@@W4TPbk2FieldGroupId@@@Z @ 120 NONAME ; int Pbk2AddressTools::IsAddressPreviewEmptyL(class MVPbkStoreContact &, enum TPbk2FieldGroupId) - ?MassUpdateSkipProgressNote@CPbk2NamesListControl@@QAEXH@Z @ 121 NONAME ; void CPbk2NamesListControl::MassUpdateSkipProgressNote(int) - ?SetOpeningCca@CPbk2NamesListControl@@QAEXH@Z @ 122 NONAME ; void CPbk2NamesListControl::SetOpeningCca(int) + ?ExecuteLD@CPbk2GeneralConfirmationQuery@@QAEHABVMVPbkBaseContact@@H@Z @ 1 NONAME ; int CPbk2GeneralConfirmationQuery::ExecuteLD(class MVPbkBaseContact const &, int) + ?NewL@CPbk2ContactInfoControl@@SAPAV1@PBVCCoeControl@@AAVCVPbkContactManager@@AAVMPbk2ContactNameFormatter@@AAVMPbk2FieldPropertyArray@@AAVCPbk2StorePropertyArray@@PAVMPbk2ContactNavigation@@@Z @ 2 NONAME ; class CPbk2ContactInfoControl * CPbk2ContactInfoControl::NewL(class CCoeControl const *, class CVPbkContactManager &, class MPbk2ContactNameFormatter &, class MPbk2FieldPropertyArray &, class CPbk2StorePropertyArray &, class MPbk2ContactNavigation *) + ?MapViewTypeToAddress@Pbk2AddressTools@@SA?AW4TPbk2FieldGroupId@@W4TActiveView@TPbk2ContactEditorParams@@@Z @ 3 NONAME ; enum TPbk2FieldGroupId Pbk2AddressTools::MapViewTypeToAddress(enum TPbk2ContactEditorParams::TActiveView) + ??0TParams@CPbk2FetchDlg@@QAE@XZ @ 4 NONAME ; CPbk2FetchDlg::TParams::TParams(void) + ?SetAllItemTextL@CPbk2StoreListQuery@@QAEXABVTDesC16@@H@Z @ 5 NONAME ; void CPbk2StoreListQuery::SetAllItemTextL(class TDesC16 const &, int) + ??0TPbk2AddItemWrapper@@QAE@ABVMPbk2FieldProperty@@@Z @ 6 NONAME ; TPbk2AddItemWrapper::TPbk2AddItemWrapper(class MPbk2FieldProperty const &) + ?ExecuteLD@CPbk2PhonebookInfoDlg@@QAEXAAVCVPbkContactStoreUriArray@@@Z @ 7 NONAME ; void CPbk2PhonebookInfoDlg::ExecuteLD(class CVPbkContactStoreUriArray &) + ?SetTimeFormatL@CPbk2FieldFormatter@@QAEXABVTDesC16@@@Z @ 8 NONAME ; void CPbk2FieldFormatter::SetTimeFormatL(class TDesC16 const &) + ?StopWait@CPbk2InputAbsorber@@QAEXXZ @ 9 NONAME ; void CPbk2InputAbsorber::StopWait(void) + ??0TPbk2AddItemWrapper@@QAE@ABVCPbk2FieldPropertyGroup@@@Z @ 10 NONAME ; TPbk2AddItemWrapper::TPbk2AddItemWrapper(class CPbk2FieldPropertyGroup const &) + ?RemoveDefaultsL@CPbk2DefaultAttributeProcess@@QAEXPAV?$CArrayFixFlat@W4TVPbkDefaultType@@@@@Z @ 11 NONAME ; void CPbk2DefaultAttributeProcess::RemoveDefaultsL(class CArrayFixFlat *) + ?NewL@CPbk2DefaultAttributeProcess@@SAPAV1@AAVCVPbkContactManager@@AAVMVPbkStoreContact@@AAVMPbk2DefaultAttributeProcessObserver@@@Z @ 12 NONAME ; class CPbk2DefaultAttributeProcess * CPbk2DefaultAttributeProcess::NewL(class CVPbkContactManager &, class MVPbkStoreContact &, class MPbk2DefaultAttributeProcessObserver &) + ?SetDefaultL@CPbk2DefaultAttributeProcess@@QAEXW4TVPbkDefaultType@@AAVMVPbkStoreContactField@@@Z @ 13 NONAME ; void CPbk2DefaultAttributeProcess::SetDefaultL(enum TVPbkDefaultType, class MVPbkStoreContactField &) + ?ExecuteLD@CPbk2AddItemToContactDlg@@QAEHAAV?$RArray@VTPbk2AddItemWrapper@@@@PBVTPbk2AddItemDialogParams@@@Z @ 14 NONAME ; int CPbk2AddItemToContactDlg::ExecuteLD(class RArray &, class TPbk2AddItemDialogParams const *) + ?SetFocusedStoreContact@CPbk2ContactUiControlSubstitute@@QAEXABVMVPbkStoreContact@@@Z @ 15 NONAME ; void CPbk2ContactUiControlSubstitute::SetFocusedStoreContact(class MVPbkStoreContact const &) + ?NewL@CPbk2ThumbnailManager@@SAPAV1@AAVCVPbkContactManager@@@Z @ 16 NONAME ; class CPbk2ThumbnailManager * CPbk2ThumbnailManager::NewL(class CVPbkContactManager &) + ?NewL@CPbk2SettingsListControl@@SAPAV1@PBVCCoeControl@@AAVCPbk2SortOrderManager@@AAVMPbk2SettingsControlExtension@@@Z @ 17 NONAME ; class CPbk2SettingsListControl * CPbk2SettingsListControl::NewL(class CCoeControl const *, class CPbk2SortOrderManager &, class MPbk2SettingsControlExtension &) + ?NewL@CPbk2ContactUiControlSubstitute@@SAPAV1@XZ @ 18 NONAME ; class CPbk2ContactUiControlSubstitute * CPbk2ContactUiControlSubstitute::NewL(void) + ?ExecuteLD@CPbk2GeneralConfirmationQuery@@QAEHHH@Z @ 19 NONAME ; int CPbk2GeneralConfirmationQuery::ExecuteLD(int, int) + ?Wait@CPbk2InputAbsorber@@QAEXXZ @ 20 NONAME ; void CPbk2InputAbsorber::Wait(void) + ?StopQuery@CPbk2GeneralConfirmationQuery@@QAEXXZ @ 21 NONAME ; void CPbk2GeneralConfirmationQuery::StopQuery(void) + ?SetCba@CPbk2AddressSelect@@QAEXH@Z @ 22 NONAME ; void CPbk2AddressSelect::SetCba(int) + ?LoadThumbnailL@CPbk2ThumbnailLoader@@QAEXPAVMVPbkContactLink@@PBVCEikListBox@@W4TPbk2ThumbnailLocation@@@Z @ 23 NONAME ; void CPbk2ThumbnailLoader::LoadThumbnailL(class MVPbkContactLink *, class CEikListBox const *, enum TPbk2ThumbnailLocation) + ?NewL@CPbk2MemoryEntryDefaultsAssignDlg@@SAPAV1@XZ @ 24 NONAME ; class CPbk2MemoryEntryDefaultsAssignDlg * CPbk2MemoryEntryDefaultsAssignDlg::NewL(void) + ?ExecuteLD@CPbk2GeneralConfirmationQuery@@QAEHABVMVPbkBaseContact@@HH@Z @ 25 NONAME ; int CPbk2GeneralConfirmationQuery::ExecuteLD(class MVPbkBaseContact const &, int, int) + ??1CPbk2AddressSelect@@UAE@XZ @ 26 NONAME ; CPbk2AddressSelect::~CPbk2AddressSelect(void) + ?MapVPbkFieldTypeToAddressGroupId@Pbk2AddressTools@@SA?AW4TPbk2FieldGroupId@@PBVMVPbkFieldType@@@Z @ 27 NONAME ; enum TPbk2FieldGroupId Pbk2AddressTools::MapVPbkFieldTypeToAddressGroupId(class MVPbkFieldType const *) + ?GetAddressShortPreviewLC@Pbk2AddressTools@@SAXAAVMVPbkStoreContact@@W4TPbk2FieldGroupId@@AAVRBuf16@@@Z @ 28 NONAME ; void Pbk2AddressTools::GetAddressShortPreviewLC(class MVPbkStoreContact &, enum TPbk2FieldGroupId, class RBuf16 &) + ?NewL@CPbk2NamesListControl@@SAPAV1@HPBVCCoeControl@@AAVCVPbkContactManager@@AAVMVPbkContactViewBase@@AAVMPbk2ContactNameFormatter@@AAVCPbk2StorePropertyArray@@PAVCPbk2ThumbnailManager@@@Z @ 29 NONAME ; class CPbk2NamesListControl * CPbk2NamesListControl::NewL(int, class CCoeControl const *, class CVPbkContactManager &, class MVPbkContactViewBase &, class MPbk2ContactNameFormatter &, class CPbk2StorePropertyArray &, class CPbk2ThumbnailManager *) + ?AcceptDelayedFetchL@CPbk2FetchDlg@@QAEXABVTDesC8@@@Z @ 30 NONAME ; void CPbk2FetchDlg::AcceptDelayedFetchL(class TDesC8 const &) + ?SetViewL@CPbk2NamesListControl@@QAEXAAVMVPbkContactViewBase@@@Z @ 31 NONAME ; void CPbk2NamesListControl::SetViewL(class MVPbkContactViewBase &) + ?CreateTitlePanePictureLC@Pbk2TitlePanePictureFactory@@SAPAVCEikImage@@PBVMVPbkStoreContact@@AAVCPbk2StorePropertyArray@@@Z @ 32 NONAME ; class CEikImage * Pbk2TitlePanePictureFactory::CreateTitlePanePictureLC(class MVPbkStoreContact const *, class CPbk2StorePropertyArray &) + ?SetCommandObserver@CPbk2InputAbsorber@@QAEXPAVMEikCommandObserver@@@Z @ 33 NONAME ; void CPbk2InputAbsorber::SetCommandObserver(class MEikCommandObserver *) + ?InitializeL@CPbk2ContactEditorReadonlyField@@QAEXPAVMPbk2ContactEditorUIField@@@Z @ 34 NONAME ; void CPbk2ContactEditorReadonlyField::InitializeL(class MPbk2ContactEditorUIField *) + ?SetCurrentGroupLinkL@CPbk2NamesListControl@@QAEXPAVMVPbkContactLink@@@Z @ 35 NONAME ; void CPbk2NamesListControl::SetCurrentGroupLinkL(class MVPbkContactLink *) + ?Reset@CPbk2NamesListControl@@QAEXXZ @ 36 NONAME ; void CPbk2NamesListControl::Reset(void) + ?RemoveObserver@CPbk2ContactInfoControl@@QAEXAAVMPbk2ControlObserver@@@Z @ 37 NONAME ; void CPbk2ContactInfoControl::RemoveObserver(class MPbk2ControlObserver &) + ?NewL@CPbk2StoreListQuery@@SAPAV1@XZ @ 38 NONAME ; class CPbk2StoreListQuery * CPbk2StoreListQuery::NewL(void) + ?NewLC@CPbk2InputAbsorber@@SAPAV1@H@Z @ 39 NONAME ; class CPbk2InputAbsorber * CPbk2InputAbsorber::NewLC(int) + ?NewL@CPbk2MergePhotoConflictDlg@@SAPAV1@PAVMVPbkBaseContact@@0PAH@Z @ 40 NONAME ; class CPbk2MergePhotoConflictDlg * CPbk2MergePhotoConflictDlg::NewL(class MVPbkBaseContact *, class MVPbkBaseContact *, int *) + ??0CPbk2NamesListControl@@QAE@PBVCCoeControl@@AAVCVPbkContactManager@@AAVMVPbkContactViewBase@@AAVMPbk2ContactNameFormatter@@AAVCPbk2StorePropertyArray@@@Z @ 41 NONAME ; CPbk2NamesListControl::CPbk2NamesListControl(class CCoeControl const *, class CVPbkContactManager &, class MVPbkContactViewBase &, class MPbk2ContactNameFormatter &, class CPbk2StorePropertyArray &) + ?SetTextL@CPbk2ContactEditorReadonlyField@@QAEXPBVTDesC16@@@Z @ 42 NONAME ; void CPbk2ContactEditorReadonlyField::SetTextL(class TDesC16 const *) + ?GiveViewL@CPbk2NamesListControl@@QAEXPAVMVPbkContactViewBase@@@Z @ 43 NONAME ; void CPbk2NamesListControl::GiveViewL(class MVPbkContactViewBase *) + ?FieldLabel@CPbk2ContactEditorUIFieldBase@@UBEABVTDesC16@@XZ @ 44 NONAME ; class TDesC16 const & CPbk2ContactEditorUIFieldBase::FieldLabel(void) const + ?RemoveDefaultL@CPbk2DefaultAttributeProcess@@QAEXW4TVPbkDefaultType@@@Z @ 45 NONAME ; void CPbk2DefaultAttributeProcess::RemoveDefaultL(enum TVPbkDefaultType) + ?MassUpdateSkipProgressNote@CPbk2NamesListControl@@QAEXH@Z @ 46 NONAME ; void CPbk2NamesListControl::MassUpdateSkipProgressNote(int) + ?MapAddressToVersitParam@Pbk2AddressTools@@SA?AW4TVPbkFieldTypeParameter@@W4TPbk2FieldGroupId@@@Z @ 47 NONAME ; enum TVPbkFieldTypeParameter Pbk2AddressTools::MapAddressToVersitParam(enum TPbk2FieldGroupId) + ??0TPbk2AddressSelectParams@@QAE@AAVMVPbkStoreContact@@ABVCVPbkContactManager@@AAVMPbk2ContactNameFormatter@@ABVCPbk2FieldPropertyArray@@AAVTResourceReader@@H@Z @ 48 NONAME ; TPbk2AddressSelectParams::TPbk2AddressSelectParams(class MVPbkStoreContact &, class CVPbkContactManager const &, class MPbk2ContactNameFormatter &, class CPbk2FieldPropertyArray const &, class TResourceReader &, int) + ?NewL@CPbk2MergeConflictsDlg@@SAPAV1@PAVMPbk2MergeResolver@@H@Z @ 49 NONAME ; class CPbk2MergeConflictsDlg * CPbk2MergeConflictsDlg::NewL(class MPbk2MergeResolver *, int) + ?NewL@CPbk2ContactIconsUtils@@SAPAV1@AAVCPbk2StorePropertyArray@@PAVMPbk2ContactUiControlExtension@@@Z @ 50 NONAME ; class CPbk2ContactIconsUtils * CPbk2ContactIconsUtils::NewL(class CPbk2StorePropertyArray &, class MPbk2ContactUiControlExtension *) + ?HandleCustomFieldCommandL@CPbk2ContactEditorUIFieldBase@@UAEHH@Z @ 51 NONAME ; int CPbk2ContactEditorUIFieldBase::HandleCustomFieldCommandL(int) + ?NewL@CPbk2InputAbsorber@@SAPAV1@H@Z @ 52 NONAME ; class CPbk2InputAbsorber * CPbk2InputAbsorber::NewL(int) + ??BTParams@CPbk2FetchDlg@@QAE?AVTCleanupItem@@XZ @ 53 NONAME ; CPbk2FetchDlg::TParams::operator class TCleanupItem(void) + ?SetDefaultPriorities@TPbk2AddressSelectParams@@QAEXABVRVPbkContactFieldDefaultPriorities@@@Z @ 54 NONAME ; void TPbk2AddressSelectParams::SetDefaultPriorities(class RVPbkContactFieldDefaultPriorities const &) + ?CreatePhoneNumberFormatterL@Pbk2PhoneNumberFormatterFactory@@SAPAVMPbk2PhoneNumberFormatter@@H@Z @ 55 NONAME ; class MPbk2PhoneNumberFormatter * Pbk2PhoneNumberFormatterFactory::CreatePhoneNumberFormatterL(int) + ?RemoveObserver@CPbk2NamesListControl@@QAEXAAVMPbk2ControlObserver@@@Z @ 56 NONAME ; void CPbk2NamesListControl::RemoveObserver(class MPbk2ControlObserver &) + ?HideThumbnail@CPbk2ThumbnailLoader@@QAEXXZ @ 57 NONAME ; void CPbk2ThumbnailLoader::HideThumbnail(void) + ?CreateListboxIconArrayL@CPbk2ContactIconsUtils@@SAPAVCPbk2IconArray@@H@Z @ 58 NONAME ; class CPbk2IconArray * CPbk2ContactIconsUtils::CreateListboxIconArrayL(int) + ?SetFieldLabelL@CPbk2ContactEditorUIFieldBase@@UAEXABVTDesC16@@@Z @ 59 NONAME ; void CPbk2ContactEditorUIFieldBase::SetFieldLabelL(class TDesC16 const &) + ?NewL@CPbk2ThumbnailLoader@@SAPAV1@AAVCVPbkContactManager@@@Z @ 60 NONAME ; class CPbk2ThumbnailLoader * CPbk2ThumbnailLoader::NewL(class CVPbkContactManager &) + ?NewL@CPbk2PhonebookInfoDlg@@SAPAV1@XZ @ 61 NONAME ; class CPbk2PhonebookInfoDlg * CPbk2PhonebookInfoDlg::NewL(void) + ?NewL@CPbk2NamesListControl@@SAPAV1@HPBVCCoeControl@@AAVCVPbkContactManager@@AAVMVPbkContactViewBase@@AAVMPbk2ContactNameFormatter@@AAVCPbk2StorePropertyArray@@@Z @ 62 NONAME ; class CPbk2NamesListControl * CPbk2NamesListControl::NewL(int, class CCoeControl const *, class CVPbkContactManager &, class MVPbkContactViewBase &, class MPbk2ContactNameFormatter &, class CPbk2StorePropertyArray &) + ?AllowPointerEvents@CPbk2NamesListControl@@QAEXH@Z @ 63 NONAME ; void CPbk2NamesListControl::AllowPointerEvents(int) + ?GetIconIdsForContactL@CPbk2ContactIconsUtils@@QBEXABVMVPbkViewContact@@AAV?$RArray@VTPbk2IconId@@@@@Z @ 64 NONAME ; void CPbk2ContactIconsUtils::GetIconIdsForContactL(class MVPbkViewContact const &, class RArray &) const + ?ExecuteLD@CPbk2MemoryEntryDefaultsDlg@@QAEXXZ @ 65 NONAME ; void CPbk2MemoryEntryDefaultsDlg::ExecuteLD(void) + ?NewL@CPbk2GeneralConfirmationQuery@@SAPAV1@XZ @ 66 NONAME ; class CPbk2GeneralConfirmationQuery * CPbk2GeneralConfirmationQuery::NewL(void) + ?SetDefaultsL@CPbk2DefaultAttributeProcess@@QAEXPAV?$CArrayFixFlat@W4TVPbkDefaultType@@@@AAVMVPbkStoreContactField@@@Z @ 67 NONAME ; void CPbk2DefaultAttributeProcess::SetDefaultsL(class CArrayFixFlat *, class MVPbkStoreContactField &) + ?NewL@CPbk2MemoryEntryDefaultsDlg@@SAPAV1@AAVCPbk2PresentationContact@@AAVCVPbkContactManager@@@Z @ 68 NONAME ; class CPbk2MemoryEntryDefaultsDlg * CPbk2MemoryEntryDefaultsDlg::NewL(class CPbk2PresentationContact &, class CVPbkContactManager &) + ?AttemptExitL@CPbk2AddressSelect@@QAEXH@Z @ 69 NONAME ; void CPbk2AddressSelect::AttemptExitL(int) + ?SetFocusedFieldIndex@CPbk2ContactUiControlSubstitute@@UAEXH@Z @ 70 NONAME ; void CPbk2ContactUiControlSubstitute::SetFocusedFieldIndex(int) + ?SetUseDefaultDirectly@TPbk2AddressSelectParams@@QAEXH@Z @ 71 NONAME ; void TPbk2AddressSelectParams::SetUseDefaultDirectly(int) + ?ExecuteLD@CPbk2ContactEditorDlg@@QAEXXZ @ 72 NONAME ; void CPbk2ContactEditorDlg::ExecuteLD(void) + ?SetFocus@CPbk2ContactEditorUIFieldBase@@UAEXXZ @ 73 NONAME ; void CPbk2ContactEditorUIFieldBase::SetFocus(void) + ?Refresh@CPbk2ThumbnailLoader@@QAEXXZ @ 74 NONAME ; void CPbk2ThumbnailLoader::Refresh(void) + ?ExecuteLD@CPbk2FetchDlg@@QAEHXZ @ 75 NONAME ; int CPbk2FetchDlg::ExecuteLD(void) + ?NewL@CPbk2UIFieldArray@@SAPAV1@ABVTDesC16@@AAVRFs@@AAVMPbk2UIFieldFactory@@@Z @ 76 NONAME ; class CPbk2UIFieldArray * CPbk2UIFieldArray::NewL(class TDesC16 const &, class RFs &, class MPbk2UIFieldFactory &) + ?CommitSettingsL@CPbk2SettingsListControl@@QAEXXZ @ 77 NONAME ; void CPbk2SettingsListControl::CommitSettingsL(void) + ?NewL@CPbk2AddressSelect@@SAPAV1@AAVTPbk2AddressSelectParams@@@Z @ 78 NONAME ; class CPbk2AddressSelect * CPbk2AddressSelect::NewL(class TPbk2AddressSelectParams &) + ?Reset@CPbk2ThumbnailLoader@@QAEXXZ @ 79 NONAME ; void CPbk2ThumbnailLoader::Reset(void) + ?ExecuteLD@CPbk2MemoryEntryDefaultsAssignDlg@@QAEHABVCPbk2PresentationContactFieldCollection@@ABVCVPbkContactManager@@ABVMPbk2FieldPropertyArray@@W4TVPbkContactActionTypeSelector@VPbkFieldTypeSelectorFactory@@@Z @ 80 NONAME ; int CPbk2MemoryEntryDefaultsAssignDlg::ExecuteLD(class CPbk2PresentationContactFieldCollection const &, class CVPbkContactManager const &, class MPbk2FieldPropertyArray const &, enum VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector) + ?NewL@CPbk2AddressSelect@@SAPAV1@AAVTPbk2AddressSelectParams@@AAVCVPbkFieldTypeSelector@@PBV?$TArray@PAVMVPbkStoreContact@@@@PBV?$TArray@PAVCPbk2PresenceIconInfo@@@@@Z @ 81 NONAME ; class CPbk2AddressSelect * CPbk2AddressSelect::NewL(class TPbk2AddressSelectParams &, class CVPbkFieldTypeSelector &, class TArray const *, class TArray const *) + ?PropertyCount@TPbk2AddItemWrapper@@QBEHXZ @ 82 NONAME ; int TPbk2AddItemWrapper::PropertyCount(void) const + ?ExecuteLD@CPbk2AddressSelect@@QAEPAVMVPbkStoreContactField@@XZ @ 83 NONAME ; class MVPbkStoreContactField * CPbk2AddressSelect::ExecuteLD(void) + ?ControlId@CPbk2ContactEditorUIFieldBase@@UAEHXZ @ 84 NONAME ; int CPbk2ContactEditorUIFieldBase::ControlId(void) + ?IsWaiting@CPbk2InputAbsorber@@QBEHXZ @ 85 NONAME ; int CPbk2InputAbsorber::IsWaiting(void) const + ??1CPbk2ContactEditorUIFieldBase@@UAE@XZ @ 86 NONAME ; CPbk2ContactEditorUIFieldBase::~CPbk2ContactEditorUIFieldBase(void) + ?SetFocusedField@CPbk2ContactUiControlSubstitute@@QAEXABVMVPbkBaseContactField@@@Z @ 87 NONAME ; void CPbk2ContactUiControlSubstitute::SetFocusedField(class MVPbkBaseContactField const &) + ?GetAddressPreviewLC@Pbk2AddressTools@@SAXAAVMVPbkStoreContact@@W4TPbk2FieldGroupId@@AAVRBuf16@@@Z @ 88 NONAME ; void Pbk2AddressTools::GetAddressPreviewLC(class MVPbkStoreContact &, enum TPbk2FieldGroupId, class RBuf16 &) + ?NewL@CPbk2AddItemToContactDlg@@SAPAV1@XZ @ 89 NONAME ; class CPbk2AddItemToContactDlg * CPbk2AddItemToContactDlg::NewL(void) + ?NewL@CPbk2FieldFormatter@@SAPAV1@ABVMPbk2FieldPropertyArray@@ABVMVPbkFieldTypeList@@@Z @ 90 NONAME ; class CPbk2FieldFormatter * CPbk2FieldFormatter::NewL(class MPbk2FieldPropertyArray const &, class MVPbkFieldTypeList const &) + ?NewL@CPbk2PrependDlg@@SAPAV1@AAVTDes16@@@Z @ 91 NONAME ; class CPbk2PrependDlg * CPbk2PrependDlg::NewL(class TDes16 &) + ?AddObserverL@CPbk2NamesListControl@@QAEXAAVMPbk2ControlObserver@@@Z @ 92 NONAME ; void CPbk2NamesListControl::AddObserverL(class MPbk2ControlObserver &) + ?FormatFieldContentL@CPbk2FieldFormatter@@QAE?AVTPtrC16@@ABVMVPbkBaseContactField@@ABVMVPbkFieldType@@@Z @ 93 NONAME ; class TPtrC16 CPbk2FieldFormatter::FormatFieldContentL(class MVPbkBaseContactField const &, class MVPbkFieldType const &) + ?SetTitleToIncludeContactName@TPbk2AddressSelectParams@@QAEXH@Z @ 94 NONAME ; void TPbk2AddressSelectParams::SetTitleToIncludeContactName(int) + ?SetSelectedStore@CPbk2ContactUiControlSubstitute@@QAEXAAVMVPbkContactStore@@@Z @ 95 NONAME ; void CPbk2ContactUiControlSubstitute::SetSelectedStore(class MVPbkContactStore &) + ?SetFocusedField@TPbk2AddressSelectParams@@QAEXPBVMVPbkStoreContactField@@@Z @ 96 NONAME ; void TPbk2AddressSelectParams::SetFocusedField(class MVPbkStoreContactField const *) + ?GetAddressFieldsLC@Pbk2AddressTools@@SAXAAVMVPbkStoreContact@@W4TPbk2FieldGroupId@@AAV?$RHashMap@HVTPtrC16@@@@@Z @ 97 NONAME ; void Pbk2AddressTools::GetAddressFieldsLC(class MVPbkStoreContact &, enum TPbk2FieldGroupId, class RHashMap &) + ?SetParentUiControl@CPbk2ContactUiControlSubstitute@@QAEXAAVMPbk2ContactUiControl@@@Z @ 98 NONAME ; void CPbk2ContactUiControlSubstitute::SetParentUiControl(class MPbk2ContactUiControl &) + ?ExecuteLD@CPbk2StoreListQuery@@QAEHABVTDesC16@@AAVCVPbkContactStoreUriArray@@@Z @ 99 NONAME ; int CPbk2StoreListQuery::ExecuteLD(class TDesC16 const &, class CVPbkContactStoreUriArray &) + ?DenyDelayedFetchL@CPbk2FetchDlg@@QAEXABVTDesC8@@@Z @ 100 NONAME ; void CPbk2FetchDlg::DenyDelayedFetchL(class TDesC8 const &) + ??0CPbk2ContactEditorUIFieldBase@@IAE@PAVMPbk2UIField@@AAVMPbk2ContactEditorUiBuilder@@AAVCPbk2IconInfoContainer@@H@Z @ 101 NONAME ; CPbk2ContactEditorUIFieldBase::CPbk2ContactEditorUIFieldBase(class MPbk2UIField *, class MPbk2ContactEditorUiBuilder &, class CPbk2IconInfoContainer &, int) + ?LoadThumbnail@CPbk2ThumbnailLoader@@QAEXPAVMVPbkStoreContact@@PBVCEikListBox@@W4TPbk2ThumbnailLocation@@@Z @ 102 NONAME ; void CPbk2ThumbnailLoader::LoadThumbnail(class MVPbkStoreContact *, class CEikListBox const *, enum TPbk2ThumbnailLocation) + ?LoadBitmapToFieldL@CPbk2ContactEditorUIFieldBase@@UAEXABVTPbk2IconId@@@Z @ 103 NONAME ; void CPbk2ContactEditorUIFieldBase::LoadBitmapToFieldL(class TPbk2IconId const &) + ?MapCtrlTypeToAddress@Pbk2AddressTools@@SA?AW4TPbk2FieldGroupId@@H@Z @ 104 NONAME ; enum TPbk2FieldGroupId Pbk2AddressTools::MapCtrlTypeToAddress(int) + ?MapAddressToOrdering@Pbk2AddressTools@@SAHW4TPbk2FieldGroupId@@@Z @ 105 NONAME ; int Pbk2AddressTools::MapAddressToOrdering(enum TPbk2FieldGroupId) + ?SetOpeningCca@CPbk2NamesListControl@@QAEXH@Z @ 106 NONAME ; void CPbk2NamesListControl::SetOpeningCca(int) + ?ConsumesKeyEvent@CPbk2ContactEditorUIFieldBase@@UAEHABUTKeyEvent@@W4TEventCode@@@Z @ 107 NONAME ; int CPbk2ContactEditorUIFieldBase::ConsumesKeyEvent(struct TKeyEvent const &, enum TEventCode) + ?IsAddressPreviewEmptyL@Pbk2AddressTools@@SAHAAVMVPbkStoreContact@@W4TPbk2FieldGroupId@@@Z @ 108 NONAME ; int Pbk2AddressTools::IsAddressPreviewEmptyL(class MVPbkStoreContact &, enum TPbk2FieldGroupId) + ?MapCtrlTypeToViewType@Pbk2AddressTools@@SA?AW4TActiveView@TPbk2ContactEditorParams@@H@Z @ 109 NONAME ; enum TPbk2ContactEditorParams::TActiveView Pbk2AddressTools::MapCtrlTypeToViewType(int) + ?NewL@CPbk2AddItemToContactDlg@@SAPAV1@PAVMPbk2ApplicationServices@@@Z @ 110 NONAME ; class CPbk2AddItemToContactDlg * CPbk2AddItemToContactDlg::NewL(class MPbk2ApplicationServices *) + ?SetQueryAlways@TPbk2AddressSelectParams@@QAEXH@Z @ 111 NONAME ; void TPbk2AddressSelectParams::SetQueryAlways(int) + ?PropertyAt@TPbk2AddItemWrapper@@QBEABVMPbk2FieldProperty@@H@Z @ 112 NONAME ; class MPbk2FieldProperty const & TPbk2AddItemWrapper::PropertyAt(int) const + ?Pbk2ControlKeyEventL@CPbk2AddressSelect@@UAE?AW4TKeyResponse@@ABUTKeyEvent@@W4TEventCode@@@Z @ 113 NONAME ; enum TKeyResponse CPbk2AddressSelect::Pbk2ControlKeyEventL(struct TKeyEvent const &, enum TEventCode) + ?AddObserverL@CPbk2ContactInfoControl@@QAEXAAVMPbk2ControlObserver@@@Z @ 114 NONAME ; void CPbk2ContactInfoControl::AddObserverL(class MPbk2ControlObserver &) + ?HandleViewForegroundEventL@CPbk2NamesListControl@@QAEXH@Z @ 115 NONAME ; void CPbk2NamesListControl::HandleViewForegroundEventL(int) + ?NewL@CPbk2ContactEditorDlg@@SAPAV1@AAVTPbk2ContactEditorParams@@PAVMVPbkStoreContact@@AAVMPbk2EditedContactObserver@@PAVMPbk2ApplicationServices@@PAVHBufC16@@H@Z @ 116 NONAME ; class CPbk2ContactEditorDlg * CPbk2ContactEditorDlg::NewL(class TPbk2ContactEditorParams &, class MVPbkStoreContact *, class MPbk2EditedContactObserver &, class MPbk2ApplicationServices *, class HBufC16 *, int) + ?UIField@CPbk2ContactEditorUIFieldBase@@UBEPAVMPbk2UIField@@XZ @ 117 NONAME ; class MPbk2UIField * CPbk2ContactEditorUIFieldBase::UIField(void) const + ?SetSuppressWarnings@TPbk2AddressSelectParams@@QAEXH@Z @ 118 NONAME ; void TPbk2AddressSelectParams::SetSuppressWarnings(int) + ?NewL@CPbk2FetchDlg@@SAPAV1@VTParams@1@AAVMPbk2FetchDlgObserver@@@Z @ 119 NONAME ; class CPbk2FetchDlg * CPbk2FetchDlg::NewL(class CPbk2FetchDlg::TParams, class MPbk2FetchDlgObserver &) + ??1CPbk2ContactUiControlSubstitute@@UAE@XZ @ 120 NONAME ; CPbk2ContactUiControlSubstitute::~CPbk2ContactUiControlSubstitute(void) + ?ControlText@CPbk2ContactEditorUIFieldBase@@UBEABVTDesC16@@XZ @ 121 NONAME ; class TDesC16 const & CPbk2ContactEditorUIFieldBase::ControlText(void) const + ?NewL@CPbk2ContactEditorDlg@@SAPAV1@AAVTPbk2ContactEditorParams@@PAVMVPbkStoreContact@@AAVMPbk2EditedContactObserver@@@Z @ 122 NONAME ; class CPbk2ContactEditorDlg * CPbk2ContactEditorDlg::NewL(class TPbk2ContactEditorParams &, class MVPbkStoreContact *, class MPbk2EditedContactObserver &) diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/Commands/inc/MPbk2CommandResourceRelease.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/Commands/inc/MPbk2CommandResourceRelease.h Thu Aug 19 09:41:07 2010 +0300 @@ -0,0 +1,39 @@ +/* +* 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: A command extension interface for release resource. +* +*/ + +#ifndef MPBK2COMMANDRESOURCERELEASE_H_ +#define MPBK2COMMANDRESOURCERELEASE_H_ + +/// Phonebook 2 Command MPbk2ResourceRelease interface UID +#define MPbk2ResourceReleaseUID 0xE9D61489 + +// CLASS DECLARATIONS + +/** + * Phonebook 2 command release resource interface. + */ +class MPbk2ResourceRelease + { + public: + /** + * Release resource. + */ + virtual void ReleaseResource() = 0; + + }; + +#endif /* MPBK2COMMANDRESOURCERELEASE_H_ */ diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/Commands/src/CPbk2CommandHandler.cpp --- a/phonebookui/Phonebook2/Commands/src/CPbk2CommandHandler.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/Commands/src/CPbk2CommandHandler.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -511,13 +511,9 @@ { aMenuPane->SetItemDimmed( EPbk2CmdDeleteMe, ETrue ); } - if ( aControl.ContactsMarked() ) - { - aMenuPane->SetItemSpecific( EPbk2CmdDeleteMe, EFalse ); - } break; } - + case R_PHONEBOOK2_NAMELIST_CALL_CONTACT_MENU: { // Weed out commands not meant to be used with marked items @@ -548,7 +544,6 @@ if ( aControl.ContactsMarked() ) { - aMenuPane->SetItemDimmed( EPbk2CmdSend, ETrue ); aMenuPane->SetItemDimmed( EPbk2CmdGoToURL, ETrue ); } break; diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/Commands/src/CPbk2CommandStore.cpp --- a/phonebookui/Phonebook2/Commands/src/CPbk2CommandStore.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/Commands/src/CPbk2CommandStore.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -18,6 +18,7 @@ // INCLUDE FILES #include "CPbk2CommandStore.h" +#include "MPbk2CommandResourceRelease.h" // Phonebook 2 #include @@ -222,11 +223,25 @@ MPbk2Command* arrayCmd = iCommandArray[j]; if (idleDestCmd == arrayCmd) { + iIdleDestructableCommands.Remove(i); + + // Try to get MPbk2ResourceRelease interface. + TUid uid; + uid.iUid = MPbk2ResourceReleaseUID; + MPbk2ResourceRelease* release = static_cast(idleDestCmd->CommandExtension(uid)); + if (release) + { + // Call ReleaseResource before delete. + release->ReleaseResource(); + } + // Remove from command array - iCommandArray.Remove(j); - iIdleDestructableCommands.Remove(i); + iCommandArray.Remove(j); + delete idleDestCmd; idleDestCmd = NULL; + + break; } } } diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/Commands/src/cpbk2commandactivator.cpp --- a/phonebookui/Phonebook2/Commands/src/cpbk2commandactivator.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/Commands/src/cpbk2commandactivator.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -188,5 +188,20 @@ iObserver->CommandFinished( *this ); } +// -------------------------------------------------------------------------- +// CPbk2CommandActivator::CommandExtension +// -------------------------------------------------------------------------- +// +TAny* CPbk2CommandActivator::CommandExtension(TUid aExtensionUid ) + { + if( iCommand ) + { + return iCommand->CommandExtension(aExtensionUid); + } + else + { + return NULL; + } + } // End of File diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/CommandsExtension/inc/CPbk2SendContactCmd.h --- a/phonebookui/Phonebook2/CommandsExtension/inc/CPbk2SendContactCmd.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/CommandsExtension/inc/CPbk2SendContactCmd.h Thu Aug 19 09:41:07 2010 +0300 @@ -20,6 +20,9 @@ #define CPBK2SENDCONTACTCMD_H // INCLUDES + +#include "MPbk2CommandResourceRelease.h" + #include #include #include @@ -60,7 +63,8 @@ public MPbk2Command, public MPbk2vCardConverterObserver, public MVPbkSingleContactOperationObserver, - private MPbk2ProcessDecoratorObserver + private MPbk2ProcessDecoratorObserver, + public MPbk2ResourceRelease { public: // Construction and destruction /** @@ -81,7 +85,14 @@ void AddObserver( MPbk2CommandObserver& aObserver ); void ResetUiControl(MPbk2ContactUiControl& aUiControl); - + TAny* CommandExtension(TUid /*aExtensionUid*/); + public: // From MPbk2ResourceRelease + /*- + * Delete all temp files. + * @Remark It not return until finish deleting all files. + * It is non-reentrant. + */ + void ReleaseResource(); private: // From CActive void RunL(); TInt RunError( @@ -134,7 +145,7 @@ void SendMsgUsingSendUI( CMessageData* aMsgData ); TBool IsMoreThanOneContact(); - + private: // Data structures /// Process states enum TState @@ -143,7 +154,8 @@ ERetrievingContact, ESelectingSentData, EStopping, - ECancelling + ECancelling, + EReleaseResource }; private: // Data @@ -185,6 +197,9 @@ CPbk2ApplicationServices* iAppServices; /// Own: Send UI CSendUi* iSendUi; + /// Own: + CActiveSchedulerWait* iWaiter; + }; #endif // CPBK2SENDCONTACTCMD_H diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/CommandsExtension/src/CPbk2SendContactCmd.cpp --- a/phonebookui/Phonebook2/CommandsExtension/src/CPbk2SendContactCmd.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/CommandsExtension/src/CPbk2SendContactCmd.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -369,6 +369,7 @@ iUiControl->RegisterCommand( NULL ); } + delete iWaiter; delete iSelectedContacts; delete iConverter; delete iVCardSender; @@ -546,6 +547,25 @@ ProcessDone( KErrCancel ); break; } + case EReleaseResource: + { + CPbk2AttachmentFileArray& fileArray = iConverter->AttachmentFileArray(); + TInt count = fileArray.Count(); + TInt deleteIndex = count -1; + CPbk2AttachmentFile * file = fileArray.At(deleteIndex); + fileArray.Delete(deleteIndex); + delete file; + + if ( count > 1) + { + IssueRequest(); + } + else + { + iWaiter->AsyncStop(); + } + break; + } } } @@ -555,6 +575,9 @@ // TInt CPbk2SendContactCmd::RunError(TInt aError) { + if( iWaiter && iWaiter->IsStarted() ) + iWaiter->AsyncStop(); + return FilterErrors(aError); } @@ -564,6 +587,9 @@ // void CPbk2SendContactCmd::DoCancel() { + if( iWaiter && iWaiter->IsStarted() ) + iWaiter->AsyncStop(); + delete iRetrieveOperation; iRetrieveOperation = NULL; } @@ -1259,4 +1285,51 @@ return result; } +// -------------------------------------------------------------------------- +// CPbk2SendContactCmd::CommandExtension +// -------------------------------------------------------------------------- +// +TAny* CPbk2SendContactCmd::CommandExtension(TUid aExtensionUid ) + { + if( aExtensionUid == TUid::Uid(MPbk2ResourceReleaseUID) ) + { + return static_cast(this); + } + else + { + return NULL; + } + } + +// -------------------------------------------------------------------------- +// CPbk2SendContactCmd::ReleaseResource +// -------------------------------------------------------------------------- +// +void CPbk2SendContactCmd::ReleaseResource() + { + Cancel(); + if (iConverter) + { + iConverter->Cancel(); + CPbk2AttachmentFileArray& fileArray = iConverter->AttachmentFileArray(); + if (fileArray.Count() > 0) + { + if ( !iWaiter ) + { + TInt err( KErrNone ); + TRAP( err,iWaiter = new (ELeave) CActiveSchedulerWait()); + if ( err != KErrNone ) + { + fileArray.ResetAndDestroy(); + return; + } + } + + iState = EReleaseResource; + IssueRequest(); + iWaiter->Start(); + } + } + } + // End of File diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/CommandsExtension/src/CPbk2vCardConverter.cpp --- a/phonebookui/Phonebook2/CommandsExtension/src/CPbk2vCardConverter.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/CommandsExtension/src/CPbk2vCardConverter.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -138,6 +138,7 @@ delete iVcardFiles; } delete iVCardFile; + delete iRetrieveOperation; delete iVCardContact; iFileWriteStream.Close(); delete iContactOperation; diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/CommonUI/src/CPbk2ContactNavigation.cpp --- a/phonebookui/Phonebook2/CommonUI/src/CPbk2ContactNavigation.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/CommonUI/src/CPbk2ContactNavigation.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -141,7 +141,14 @@ { decorator->SetNaviDecoratorObserver ( const_cast( this ) ); - decorator->MakeScrollButtonVisible( ETrue ); + CAknNavigationDecorator::TControlType controlType = + decorator->ControlType(); + // Set ScrollButtonVisible to ETrue except + // the controlType is CAknNavigationDecorator::ENaviLabel + if( CAknNavigationDecorator::ENaviLabel != controlType ) + { + decorator->MakeScrollButtonVisible( ETrue ); + } } TInt index = 0; diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/EABI/Pbk2UiControlsU.DEF --- a/phonebookui/Phonebook2/EABI/Pbk2UiControlsU.DEF Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/EABI/Pbk2UiControlsU.DEF Thu Aug 19 09:41:07 2010 +0300 @@ -1,206 +1,207 @@ EXPORTS - _ZN13CPbk2FetchDlg19AcceptDelayedFetchLERK6TDesC8 @ 1 NONAME - _ZN13CPbk2FetchDlg4NewLENS_7TParamsER21MPbk2FetchDlgObserver @ 2 NONAME - _ZN13CPbk2FetchDlg7TParamsC1Ev @ 3 NONAME - _ZN13CPbk2FetchDlg7TParamsC2Ev @ 4 NONAME - _ZN13CPbk2FetchDlg7TParamscv12TCleanupItemEv @ 5 NONAME - _ZN13CPbk2FetchDlg9ExecuteLDEv @ 6 NONAME - _ZN15CPbk2PrependDlg4NewLER6TDes16 @ 7 NONAME - _ZN18CPbk2AddressSelect12AttemptExitLEi @ 8 NONAME - _ZN18CPbk2AddressSelect20Pbk2ControlKeyEventLERK9TKeyEvent10TEventCode @ 9 NONAME - _ZN18CPbk2AddressSelect4NewLER24TPbk2AddressSelectParams @ 10 NONAME - _ZN18CPbk2AddressSelect6SetCbaEi @ 11 NONAME - _ZN18CPbk2AddressSelect9ExecuteLDEv @ 12 NONAME - _ZN18CPbk2AddressSelectD0Ev @ 13 NONAME - _ZN18CPbk2AddressSelectD1Ev @ 14 NONAME - _ZN18CPbk2AddressSelectD2Ev @ 15 NONAME - _ZN18CPbk2InputAbsorber18SetCommandObserverEP19MEikCommandObserver @ 16 NONAME - _ZN18CPbk2InputAbsorber4NewLEi @ 17 NONAME - _ZN18CPbk2InputAbsorber4WaitEv @ 18 NONAME - _ZN18CPbk2InputAbsorber5NewLCEi @ 19 NONAME - _ZN18CPbk2InputAbsorber8StopWaitEv @ 20 NONAME - _ZN19CPbk2FieldFormatter14SetTimeFormatLERK7TDesC16 @ 21 NONAME - _ZN19CPbk2FieldFormatter19FormatFieldContentLERK21MVPbkBaseContactFieldRK14MVPbkFieldType @ 22 NONAME - _ZN19CPbk2FieldFormatter4NewLERK23MPbk2FieldPropertyArrayRK18MVPbkFieldTypeList @ 23 NONAME - _ZN19CPbk2StoreListQuery15SetAllItemTextLERK7TDesC16i @ 24 NONAME - _ZN19CPbk2StoreListQuery4NewLEv @ 25 NONAME - _ZN19CPbk2StoreListQuery9ExecuteLDERK7TDesC16R25CVPbkContactStoreUriArray @ 26 NONAME - _ZN19TPbk2AddItemWrapperC1ERK18MPbk2FieldProperty @ 27 NONAME - _ZN19TPbk2AddItemWrapperC1ERK23CPbk2FieldPropertyGroup @ 28 NONAME - _ZN19TPbk2AddItemWrapperC2ERK18MPbk2FieldProperty @ 29 NONAME - _ZN19TPbk2AddItemWrapperC2ERK23CPbk2FieldPropertyGroup @ 30 NONAME - _ZN20CPbk2ThumbnailLoader13HideThumbnailEv @ 31 NONAME - _ZN20CPbk2ThumbnailLoader13LoadThumbnailEP17MVPbkStoreContactPK11CEikListBox22TPbk2ThumbnailLocation @ 32 NONAME - _ZN20CPbk2ThumbnailLoader14LoadThumbnailLEP16MVPbkContactLinkPK11CEikListBox22TPbk2ThumbnailLocation @ 33 NONAME - _ZN20CPbk2ThumbnailLoader4NewLER19CVPbkContactManager @ 34 NONAME - _ZN20CPbk2ThumbnailLoader5ResetEv @ 35 NONAME - _ZN20CPbk2ThumbnailLoader7RefreshEv @ 36 NONAME - _ZN21CPbk2ContactEditorDlg4NewLER24TPbk2ContactEditorParamsP17MVPbkStoreContactR26MPbk2EditedContactObserver @ 37 NONAME - _ZN21CPbk2ContactEditorDlg9ExecuteLDEv @ 38 NONAME - _ZN21CPbk2NamesListControl12AddObserverLER20MPbk2ControlObserver @ 39 NONAME - _ZN21CPbk2NamesListControl14RemoveObserverER20MPbk2ControlObserver @ 40 NONAME - _ZN21CPbk2NamesListControl4NewLEiPK11CCoeControlR19CVPbkContactManagerR20MVPbkContactViewBaseR25MPbk2ContactNameFormatterR23CPbk2StorePropertyArray @ 41 NONAME - _ZN21CPbk2NamesListControl5ResetEv @ 42 NONAME - _ZN21CPbk2NamesListControl8SetViewLER20MVPbkContactViewBase @ 43 NONAME - _ZN21CPbk2NamesListControlC1EPK11CCoeControlR19CVPbkContactManagerR20MVPbkContactViewBaseR25MPbk2ContactNameFormatterR23CPbk2StorePropertyArray @ 44 NONAME - _ZN21CPbk2NamesListControlC2EPK11CCoeControlR19CVPbkContactManagerR20MVPbkContactViewBaseR25MPbk2ContactNameFormatterR23CPbk2StorePropertyArray @ 45 NONAME - _ZN21CPbk2PhonebookInfoDlg4NewLEv @ 46 NONAME - _ZN21CPbk2PhonebookInfoDlg9ExecuteLDER25CVPbkContactStoreUriArray @ 47 NONAME - _ZN23CPbk2ContactInfoControl12AddObserverLER20MPbk2ControlObserver @ 48 NONAME - _ZN23CPbk2ContactInfoControl14RemoveObserverER20MPbk2ControlObserver @ 49 NONAME - _ZN23CPbk2ContactInfoControl4NewLEPK11CCoeControlR19CVPbkContactManagerR25MPbk2ContactNameFormatterR23MPbk2FieldPropertyArrayR23CPbk2StorePropertyArrayP22MPbk2ContactNavigation @ 50 NONAME - _ZN24CPbk2AddItemToContactDlg4NewLEv @ 51 NONAME - _ZN24CPbk2AddItemToContactDlg9ExecuteLDER6RArrayI19TPbk2AddItemWrapperEPK24TPbk2AddItemDialogParams @ 52 NONAME - _ZN24CPbk2SettingsListControl15CommitSettingsLEv @ 53 NONAME - _ZN24CPbk2SettingsListControl4NewLEPK11CCoeControlR21CPbk2SortOrderManagerR29MPbk2SettingsControlExtension @ 54 NONAME - _ZN24TPbk2AddressSelectParams14SetQueryAlwaysEi @ 55 NONAME - _ZN24TPbk2AddressSelectParams15SetFocusedFieldEPK22MVPbkStoreContactField @ 56 NONAME - _ZN24TPbk2AddressSelectParams20SetDefaultPrioritiesERK34RVPbkContactFieldDefaultPriorities @ 57 NONAME - _ZN24TPbk2AddressSelectParams21SetUseDefaultDirectlyEi @ 58 NONAME - _ZN24TPbk2AddressSelectParamsC1ER17MVPbkStoreContactRK19CVPbkContactManagerR25MPbk2ContactNameFormatterRK23CPbk2FieldPropertyArrayR15TResourceReaderi @ 59 NONAME - _ZN24TPbk2AddressSelectParamsC2ER17MVPbkStoreContactRK19CVPbkContactManagerR25MPbk2ContactNameFormatterRK23CPbk2FieldPropertyArrayR15TResourceReaderi @ 60 NONAME - _ZN27CPbk2MemoryEntryDefaultsDlg4NewLER24CPbk2PresentationContactR19CVPbkContactManager @ 61 NONAME - _ZN27CPbk2MemoryEntryDefaultsDlg9ExecuteLDEv @ 62 NONAME - _ZN29CPbk2GeneralConfirmationQuery4NewLEv @ 63 NONAME - _ZN29CPbk2GeneralConfirmationQuery9ExecuteLDERK16MVPbkBaseContacti @ 64 NONAME - _ZN29CPbk2GeneralConfirmationQuery9ExecuteLDEii @ 65 NONAME - _ZN31CPbk2ContactUiControlSubstitute15SetFocusedFieldERK21MVPbkBaseContactField @ 66 NONAME - _ZN31CPbk2ContactUiControlSubstitute16SetSelectedStoreER17MVPbkContactStore @ 67 NONAME - _ZN31CPbk2ContactUiControlSubstitute18SetParentUiControlER21MPbk2ContactUiControl @ 68 NONAME - _ZN31CPbk2ContactUiControlSubstitute20SetFocusedFieldIndexEi @ 69 NONAME - _ZN31CPbk2ContactUiControlSubstitute22SetFocusedStoreContactERK17MVPbkStoreContact @ 70 NONAME - _ZN31CPbk2ContactUiControlSubstitute4NewLEv @ 71 NONAME - _ZN31CPbk2ContactUiControlSubstituteD0Ev @ 72 NONAME - _ZN31CPbk2ContactUiControlSubstituteD1Ev @ 73 NONAME - _ZN31CPbk2ContactUiControlSubstituteD2Ev @ 74 NONAME - _ZN31Pbk2PhoneNumberFormatterFactory27CreatePhoneNumberFormatterLEi @ 75 NONAME - _ZN33CPbk2MemoryEntryDefaultsAssignDlg4NewLEv @ 76 NONAME - _ZN33CPbk2MemoryEntryDefaultsAssignDlg9ExecuteLDERK39CPbk2PresentationContactFieldCollectionRK19CVPbkContactManagerRK23MPbk2FieldPropertyArrayN28VPbkFieldTypeSelectorFactory30TVPbkContactActionTypeSelectorE @ 77 NONAME - _ZNK18CPbk2InputAbsorber9IsWaitingEv @ 78 NONAME - _ZNK19TPbk2AddItemWrapper10PropertyAtEi @ 79 NONAME - _ZNK19TPbk2AddItemWrapper13PropertyCountEv @ 80 NONAME - _ZTI13CPbk2FetchDlg @ 81 NONAME ; ## - _ZTI15CPbk2PrependDlg @ 82 NONAME ; ## - _ZTI18CPbk2AddressSelect @ 83 NONAME ; ## - _ZTI18CPbk2InputAbsorber @ 84 NONAME ; ## - _ZTI19CPbk2StoreListQuery @ 85 NONAME ; ## - _ZTI19CPbk2ThumbnailPopup @ 86 NONAME ; ## - _ZTI21CPbk2ContactEditorDlg @ 87 NONAME ; ## - _ZTI21CPbk2NamesListControl @ 88 NONAME ; ## - _ZTI21CPbk2PhonebookInfoDlg @ 89 NONAME ; ## - _ZTI23CPbk2ContactInfoControl @ 90 NONAME ; ## - _ZTI24CPbk2AddItemToContactDlg @ 91 NONAME ; ## - _ZTI24CPbk2SettingsListControl @ 92 NONAME ; ## - _ZTI25CPbk2ContactEditorDlgImpl @ 93 NONAME ; ## - _ZTI25CPbk2StoreInfoItemBuilder @ 94 NONAME ; ## - _ZTI27CPbk2MemoryEntryDefaultsDlg @ 95 NONAME ; ## - _ZTI29CPbk2GeneralConfirmationQuery @ 96 NONAME ; ## - _ZTI31CPbk2ContactUiControlSubstitute @ 97 NONAME ; ## - _ZTV13CPbk2FetchDlg @ 98 NONAME ; ## - _ZTV15CPbk2PrependDlg @ 99 NONAME ; ## - _ZTV18CPbk2AddressSelect @ 100 NONAME ; ## - _ZTV18CPbk2InputAbsorber @ 101 NONAME ; ## - _ZTV19CPbk2StoreListQuery @ 102 NONAME ; ## - _ZTV19CPbk2ThumbnailPopup @ 103 NONAME ; ## - _ZTV21CPbk2ContactEditorDlg @ 104 NONAME ; ## - _ZTV21CPbk2NamesListControl @ 105 NONAME ; ## - _ZTV21CPbk2PhonebookInfoDlg @ 106 NONAME ; ## - _ZTV23CPbk2ContactInfoControl @ 107 NONAME ; ## - _ZTV24CPbk2AddItemToContactDlg @ 108 NONAME ; ## - _ZTV24CPbk2SettingsListControl @ 109 NONAME ; ## - _ZTV25CPbk2ContactEditorDlgImpl @ 110 NONAME ; ## - _ZTV25CPbk2StoreInfoItemBuilder @ 111 NONAME ; ## - _ZTV27CPbk2MemoryEntryDefaultsDlg @ 112 NONAME ; ## - _ZTV29CPbk2GeneralConfirmationQuery @ 113 NONAME ; ## - _ZTV31CPbk2ContactUiControlSubstitute @ 114 NONAME ; ## - _ZThn52_N31CPbk2ContactUiControlSubstitute20SetFocusedFieldIndexEi @ 115 NONAME ; ## - _ZThn52_N31CPbk2ContactUiControlSubstituteD0Ev @ 116 NONAME ; ## - _ZThn52_N31CPbk2ContactUiControlSubstituteD1Ev @ 117 NONAME ; ## - _ZN27Pbk2TitlePanePictureFactory24CreateTitlePanePictureLCEPK17MVPbkStoreContactR23CPbk2StorePropertyArray @ 118 NONAME - _ZN28CPbk2DefaultAttributeProcess11SetDefaultLE16TVPbkDefaultTypeR22MVPbkStoreContactField @ 119 NONAME - _ZN28CPbk2DefaultAttributeProcess12SetDefaultsLEP13CArrayFixFlatI16TVPbkDefaultTypeER22MVPbkStoreContactField @ 120 NONAME - _ZN28CPbk2DefaultAttributeProcess14RemoveDefaultLE16TVPbkDefaultType @ 121 NONAME - _ZN28CPbk2DefaultAttributeProcess15RemoveDefaultsLEP13CArrayFixFlatI16TVPbkDefaultTypeE @ 122 NONAME - _ZN28CPbk2DefaultAttributeProcess4NewLER19CVPbkContactManagerR17MVPbkStoreContactR36MPbk2DefaultAttributeProcessObserver @ 123 NONAME - _ZN24TPbk2AddressSelectParams28SetTitleToIncludeContactNameEi @ 124 NONAME - _ZN21CPbk2NamesListControl9GiveViewLEP20MVPbkContactViewBase @ 125 NONAME - _ZN24TPbk2AddressSelectParams19SetSuppressWarningsEi @ 126 NONAME - _ZN21CPbk2NamesListControl18AllowPointerEventsEi @ 127 NONAME - _ZN22CPbk2ContactIconsUtils23CreateListboxIconArrayLEi @ 128 NONAME - _ZN22CPbk2ContactIconsUtils4NewLER23CPbk2StorePropertyArrayP30MPbk2ContactUiControlExtension @ 129 NONAME + _ZN13CPbk2FetchDlg17DenyDelayedFetchLERK6TDesC8 @ 1 NONAME + _ZN13CPbk2FetchDlg19AcceptDelayedFetchLERK6TDesC8 @ 2 NONAME + _ZN13CPbk2FetchDlg4NewLENS_7TParamsER21MPbk2FetchDlgObserver @ 3 NONAME + _ZN13CPbk2FetchDlg7TParamsC1Ev @ 4 NONAME + _ZN13CPbk2FetchDlg7TParamsC2Ev @ 5 NONAME + _ZN13CPbk2FetchDlg7TParamscv12TCleanupItemEv @ 6 NONAME + _ZN13CPbk2FetchDlg9ExecuteLDEv @ 7 NONAME + _ZN15CPbk2PrependDlg4NewLER6TDes16 @ 8 NONAME + _ZN16Pbk2AddressTools18GetAddressFieldsLCER17MVPbkStoreContact17TPbk2FieldGroupIdR8RHashMapIi7TPtrC16E @ 9 NONAME + _ZN16Pbk2AddressTools19GetAddressPreviewLCER17MVPbkStoreContact17TPbk2FieldGroupIdR6RBuf16 @ 10 NONAME + _ZN16Pbk2AddressTools20MapAddressToOrderingE17TPbk2FieldGroupId @ 11 NONAME + _ZN16Pbk2AddressTools20MapCtrlTypeToAddressEi @ 12 NONAME + _ZN16Pbk2AddressTools20MapViewTypeToAddressEN24TPbk2ContactEditorParams11TActiveViewE @ 13 NONAME + _ZN16Pbk2AddressTools21MapCtrlTypeToViewTypeEi @ 14 NONAME + _ZN16Pbk2AddressTools22IsAddressPreviewEmptyLER17MVPbkStoreContact17TPbk2FieldGroupId @ 15 NONAME + _ZN16Pbk2AddressTools23MapAddressToVersitParamE17TPbk2FieldGroupId @ 16 NONAME + _ZN16Pbk2AddressTools24GetAddressShortPreviewLCER17MVPbkStoreContact17TPbk2FieldGroupIdR6RBuf16 @ 17 NONAME + _ZN16Pbk2AddressTools32MapVPbkFieldTypeToAddressGroupIdEPK14MVPbkFieldType @ 18 NONAME + _ZN17CPbk2UIFieldArray4NewLERK7TDesC16R3RFsR19MPbk2UIFieldFactory @ 19 NONAME + _ZN18CPbk2AddressSelect12AttemptExitLEi @ 20 NONAME + _ZN18CPbk2AddressSelect20Pbk2ControlKeyEventLERK9TKeyEvent10TEventCode @ 21 NONAME + _ZN18CPbk2AddressSelect4NewLER24TPbk2AddressSelectParams @ 22 NONAME + _ZN18CPbk2AddressSelect4NewLER24TPbk2AddressSelectParamsR22CVPbkFieldTypeSelectorPK6TArrayIP17MVPbkStoreContactEPKS4_IP21CPbk2PresenceIconInfoE @ 23 NONAME + _ZN18CPbk2AddressSelect6SetCbaEi @ 24 NONAME + _ZN18CPbk2AddressSelect9ExecuteLDEv @ 25 NONAME + _ZN18CPbk2AddressSelectD0Ev @ 26 NONAME + _ZN18CPbk2AddressSelectD1Ev @ 27 NONAME + _ZN18CPbk2AddressSelectD2Ev @ 28 NONAME + _ZN18CPbk2InputAbsorber18SetCommandObserverEP19MEikCommandObserver @ 29 NONAME + _ZN18CPbk2InputAbsorber4NewLEi @ 30 NONAME + _ZN18CPbk2InputAbsorber4WaitEv @ 31 NONAME + _ZN18CPbk2InputAbsorber5NewLCEi @ 32 NONAME + _ZN18CPbk2InputAbsorber8StopWaitEv @ 33 NONAME + _ZN19CPbk2FieldFormatter14SetTimeFormatLERK7TDesC16 @ 34 NONAME + _ZN19CPbk2FieldFormatter19FormatFieldContentLERK21MVPbkBaseContactFieldRK14MVPbkFieldType @ 35 NONAME + _ZN19CPbk2FieldFormatter4NewLERK23MPbk2FieldPropertyArrayRK18MVPbkFieldTypeList @ 36 NONAME + _ZN19CPbk2StoreListQuery15SetAllItemTextLERK7TDesC16i @ 37 NONAME + _ZN19CPbk2StoreListQuery4NewLEv @ 38 NONAME + _ZN19CPbk2StoreListQuery9ExecuteLDERK7TDesC16R25CVPbkContactStoreUriArray @ 39 NONAME + _ZN19TPbk2AddItemWrapperC1ERK18MPbk2FieldProperty @ 40 NONAME + _ZN19TPbk2AddItemWrapperC1ERK23CPbk2FieldPropertyGroup @ 41 NONAME + _ZN19TPbk2AddItemWrapperC2ERK18MPbk2FieldProperty @ 42 NONAME + _ZN19TPbk2AddItemWrapperC2ERK23CPbk2FieldPropertyGroup @ 43 NONAME + _ZN20CPbk2ThumbnailLoader13HideThumbnailEv @ 44 NONAME + _ZN20CPbk2ThumbnailLoader13LoadThumbnailEP17MVPbkStoreContactPK11CEikListBox22TPbk2ThumbnailLocation @ 45 NONAME + _ZN20CPbk2ThumbnailLoader14LoadThumbnailLEP16MVPbkContactLinkPK11CEikListBox22TPbk2ThumbnailLocation @ 46 NONAME + _ZN20CPbk2ThumbnailLoader4NewLER19CVPbkContactManager @ 47 NONAME + _ZN20CPbk2ThumbnailLoader5ResetEv @ 48 NONAME + _ZN20CPbk2ThumbnailLoader7RefreshEv @ 49 NONAME + _ZN21CPbk2ContactEditorDlg4NewLER24TPbk2ContactEditorParamsP17MVPbkStoreContactR26MPbk2EditedContactObserver @ 50 NONAME + _ZN21CPbk2ContactEditorDlg4NewLER24TPbk2ContactEditorParamsP17MVPbkStoreContactR26MPbk2EditedContactObserverP24MPbk2ApplicationServicesP7HBufC16i @ 51 NONAME + _ZN21CPbk2ContactEditorDlg9ExecuteLDEv @ 52 NONAME + _ZN21CPbk2NamesListControl12AddObserverLER20MPbk2ControlObserver @ 53 NONAME + _ZN21CPbk2NamesListControl13SetOpeningCcaEi @ 54 NONAME + _ZN21CPbk2NamesListControl14RemoveObserverER20MPbk2ControlObserver @ 55 NONAME + _ZN21CPbk2NamesListControl18AllowPointerEventsEi @ 56 NONAME + _ZN21CPbk2NamesListControl20SetCurrentGroupLinkLEP16MVPbkContactLink @ 57 NONAME + _ZN21CPbk2NamesListControl26HandleViewForegroundEventLEi @ 58 NONAME + _ZN21CPbk2NamesListControl26MassUpdateSkipProgressNoteEi @ 59 NONAME + _ZN21CPbk2NamesListControl4NewLEiPK11CCoeControlR19CVPbkContactManagerR20MVPbkContactViewBaseR25MPbk2ContactNameFormatterR23CPbk2StorePropertyArray @ 60 NONAME + _ZN21CPbk2NamesListControl4NewLEiPK11CCoeControlR19CVPbkContactManagerR20MVPbkContactViewBaseR25MPbk2ContactNameFormatterR23CPbk2StorePropertyArrayP21CPbk2ThumbnailManager @ 61 NONAME + _ZN21CPbk2NamesListControl5ResetEv @ 62 NONAME + _ZN21CPbk2NamesListControl8SetViewLER20MVPbkContactViewBase @ 63 NONAME + _ZN21CPbk2NamesListControl9GiveViewLEP20MVPbkContactViewBase @ 64 NONAME + _ZN21CPbk2NamesListControlC1EPK11CCoeControlR19CVPbkContactManagerR20MVPbkContactViewBaseR25MPbk2ContactNameFormatterR23CPbk2StorePropertyArray @ 65 NONAME + _ZN21CPbk2NamesListControlC2EPK11CCoeControlR19CVPbkContactManagerR20MVPbkContactViewBaseR25MPbk2ContactNameFormatterR23CPbk2StorePropertyArray @ 66 NONAME + _ZN21CPbk2PhonebookInfoDlg4NewLEv @ 67 NONAME + _ZN21CPbk2PhonebookInfoDlg9ExecuteLDER25CVPbkContactStoreUriArray @ 68 NONAME + _ZN21CPbk2ThumbnailManager4NewLER19CVPbkContactManager @ 69 NONAME + _ZN22CPbk2ContactIconsUtils23CreateListboxIconArrayLEi @ 70 NONAME + _ZN22CPbk2ContactIconsUtils4NewLER23CPbk2StorePropertyArrayP30MPbk2ContactUiControlExtension @ 71 NONAME + _ZN22CPbk2MergeConflictsDlg4NewLEP18MPbk2MergeResolveri @ 72 NONAME + _ZN23CPbk2ContactInfoControl12AddObserverLER20MPbk2ControlObserver @ 73 NONAME + _ZN23CPbk2ContactInfoControl14RemoveObserverER20MPbk2ControlObserver @ 74 NONAME + _ZN23CPbk2ContactInfoControl4NewLEPK11CCoeControlR19CVPbkContactManagerR25MPbk2ContactNameFormatterR23MPbk2FieldPropertyArrayR23CPbk2StorePropertyArrayP22MPbk2ContactNavigation @ 75 NONAME + _ZN24CPbk2AddItemToContactDlg4NewLEP24MPbk2ApplicationServices @ 76 NONAME + _ZN24CPbk2AddItemToContactDlg4NewLEv @ 77 NONAME + _ZN24CPbk2AddItemToContactDlg9ExecuteLDER6RArrayI19TPbk2AddItemWrapperEPK24TPbk2AddItemDialogParams @ 78 NONAME + _ZN24CPbk2SettingsListControl15CommitSettingsLEv @ 79 NONAME + _ZN24CPbk2SettingsListControl4NewLEPK11CCoeControlR21CPbk2SortOrderManagerR29MPbk2SettingsControlExtension @ 80 NONAME + _ZN24TPbk2AddressSelectParams14SetQueryAlwaysEi @ 81 NONAME + _ZN24TPbk2AddressSelectParams15SetFocusedFieldEPK22MVPbkStoreContactField @ 82 NONAME + _ZN24TPbk2AddressSelectParams19SetSuppressWarningsEi @ 83 NONAME + _ZN24TPbk2AddressSelectParams20SetDefaultPrioritiesERK34RVPbkContactFieldDefaultPriorities @ 84 NONAME + _ZN24TPbk2AddressSelectParams21SetUseDefaultDirectlyEi @ 85 NONAME + _ZN24TPbk2AddressSelectParams28SetTitleToIncludeContactNameEi @ 86 NONAME + _ZN24TPbk2AddressSelectParamsC1ER17MVPbkStoreContactRK19CVPbkContactManagerR25MPbk2ContactNameFormatterRK23CPbk2FieldPropertyArrayR15TResourceReaderi @ 87 NONAME + _ZN24TPbk2AddressSelectParamsC2ER17MVPbkStoreContactRK19CVPbkContactManagerR25MPbk2ContactNameFormatterRK23CPbk2FieldPropertyArrayR15TResourceReaderi @ 88 NONAME + _ZN26CPbk2MergePhotoConflictDlg4NewLEP16MVPbkBaseContactS1_Pi @ 89 NONAME + _ZN27CPbk2MemoryEntryDefaultsDlg4NewLER24CPbk2PresentationContactR19CVPbkContactManager @ 90 NONAME + _ZN27CPbk2MemoryEntryDefaultsDlg9ExecuteLDEv @ 91 NONAME + _ZN27Pbk2TitlePanePictureFactory24CreateTitlePanePictureLCEPK17MVPbkStoreContactR23CPbk2StorePropertyArray @ 92 NONAME + _ZN28CPbk2DefaultAttributeProcess11SetDefaultLE16TVPbkDefaultTypeR22MVPbkStoreContactField @ 93 NONAME + _ZN28CPbk2DefaultAttributeProcess12SetDefaultsLEP13CArrayFixFlatI16TVPbkDefaultTypeER22MVPbkStoreContactField @ 94 NONAME + _ZN28CPbk2DefaultAttributeProcess14RemoveDefaultLE16TVPbkDefaultType @ 95 NONAME + _ZN28CPbk2DefaultAttributeProcess15RemoveDefaultsLEP13CArrayFixFlatI16TVPbkDefaultTypeE @ 96 NONAME + _ZN28CPbk2DefaultAttributeProcess4NewLER19CVPbkContactManagerR17MVPbkStoreContactR36MPbk2DefaultAttributeProcessObserver @ 97 NONAME + _ZN29CPbk2ContactEditorUIFieldBase14SetFieldLabelLERK7TDesC16 @ 98 NONAME + _ZN29CPbk2ContactEditorUIFieldBase16ConsumesKeyEventERK9TKeyEvent10TEventCode @ 99 NONAME + _ZN29CPbk2ContactEditorUIFieldBase18LoadBitmapToFieldLERK11TPbk2IconId @ 100 NONAME + _ZN29CPbk2ContactEditorUIFieldBase25HandleCustomFieldCommandLEi @ 101 NONAME + _ZN29CPbk2ContactEditorUIFieldBase8SetFocusEv @ 102 NONAME + _ZN29CPbk2ContactEditorUIFieldBase9ControlIdEv @ 103 NONAME + _ZN29CPbk2ContactEditorUIFieldBaseC2EP12MPbk2UIFieldR27MPbk2ContactEditorUiBuilderR22CPbk2IconInfoContaineri @ 104 NONAME + _ZN29CPbk2ContactEditorUIFieldBaseD0Ev @ 105 NONAME + _ZN29CPbk2ContactEditorUIFieldBaseD1Ev @ 106 NONAME + _ZN29CPbk2ContactEditorUIFieldBaseD2Ev @ 107 NONAME + _ZN29CPbk2GeneralConfirmationQuery4NewLEv @ 108 NONAME + _ZN29CPbk2GeneralConfirmationQuery9ExecuteLDERK16MVPbkBaseContacti @ 109 NONAME + _ZN29CPbk2GeneralConfirmationQuery9ExecuteLDERK16MVPbkBaseContactii @ 110 NONAME + _ZN29CPbk2GeneralConfirmationQuery9ExecuteLDEii @ 111 NONAME + _ZN29CPbk2GeneralConfirmationQuery9StopQueryEv @ 112 NONAME + _ZN31CPbk2ContactEditorReadonlyField11InitializeLEP25MPbk2ContactEditorUIField @ 113 NONAME + _ZN31CPbk2ContactEditorReadonlyField8SetTextLEPK7TDesC16 @ 114 NONAME + _ZN31CPbk2ContactUiControlSubstitute15SetFocusedFieldERK21MVPbkBaseContactField @ 115 NONAME + _ZN31CPbk2ContactUiControlSubstitute16SetSelectedStoreER17MVPbkContactStore @ 116 NONAME + _ZN31CPbk2ContactUiControlSubstitute18SetParentUiControlER21MPbk2ContactUiControl @ 117 NONAME + _ZN31CPbk2ContactUiControlSubstitute20SetFocusedFieldIndexEi @ 118 NONAME + _ZN31CPbk2ContactUiControlSubstitute22SetFocusedStoreContactERK17MVPbkStoreContact @ 119 NONAME + _ZN31CPbk2ContactUiControlSubstitute4NewLEv @ 120 NONAME + _ZN31CPbk2ContactUiControlSubstituteD0Ev @ 121 NONAME + _ZN31CPbk2ContactUiControlSubstituteD1Ev @ 122 NONAME + _ZN31CPbk2ContactUiControlSubstituteD2Ev @ 123 NONAME + _ZN31Pbk2PhoneNumberFormatterFactory27CreatePhoneNumberFormatterLEi @ 124 NONAME + _ZN33CPbk2MemoryEntryDefaultsAssignDlg4NewLEv @ 125 NONAME + _ZN33CPbk2MemoryEntryDefaultsAssignDlg9ExecuteLDERK39CPbk2PresentationContactFieldCollectionRK19CVPbkContactManagerRK23MPbk2FieldPropertyArrayN28VPbkFieldTypeSelectorFactory30TVPbkContactActionTypeSelectorE @ 126 NONAME + _ZNK18CPbk2InputAbsorber9IsWaitingEv @ 127 NONAME + _ZNK19TPbk2AddItemWrapper10PropertyAtEi @ 128 NONAME + _ZNK19TPbk2AddItemWrapper13PropertyCountEv @ 129 NONAME _ZNK22CPbk2ContactIconsUtils21GetIconIdsForContactLERK16MVPbkViewContactR6RArrayI11TPbk2IconIdE @ 130 NONAME - _ZTI22CPbk2ContactIconsUtils @ 131 NONAME ; ## - _ZTV22CPbk2ContactIconsUtils @ 132 NONAME ; ## - _ZN18CPbk2AddressSelect4NewLER24TPbk2AddressSelectParamsR22CVPbkFieldTypeSelectorPK6TArrayIP17MVPbkStoreContactEPKS4_IP21CPbk2PresenceIconInfoE @ 133 NONAME - _ZTIN17CPbk2FetchResults20CFRConatactOperationE @ 134 NONAME ; ## - _ZTVN17CPbk2FetchResults20CFRConatactOperationE @ 135 NONAME ; ## - _ZThn56_N31CPbk2ContactUiControlSubstituteD0Ev @ 136 NONAME ; ## - _ZThn56_N31CPbk2ContactUiControlSubstituteD1Ev @ 137 NONAME ; ## - _ZN16Pbk2AddressTools18GetAddressFieldsLCER17MVPbkStoreContact17TPbk2FieldGroupIdR8RHashMapIi7TPtrC16E @ 138 NONAME - _ZN16Pbk2AddressTools19GetAddressPreviewLCER17MVPbkStoreContact17TPbk2FieldGroupIdR6RBuf16 @ 139 NONAME - _ZN16Pbk2AddressTools20MapAddressToOrderingE17TPbk2FieldGroupId @ 140 NONAME - _ZN16Pbk2AddressTools20MapCtrlTypeToAddressEi @ 141 NONAME - _ZN16Pbk2AddressTools20MapViewTypeToAddressEN24TPbk2ContactEditorParams11TActiveViewE @ 142 NONAME - _ZN16Pbk2AddressTools21MapCtrlTypeToViewTypeEi @ 143 NONAME - _ZN16Pbk2AddressTools23MapAddressToVersitParamE17TPbk2FieldGroupId @ 144 NONAME - _ZN16Pbk2AddressTools24GetAddressShortPreviewLCER17MVPbkStoreContact17TPbk2FieldGroupIdR6RBuf16 @ 145 NONAME - _ZN17CPbk2UIFieldArray4NewLERK7TDesC16R3RFsR19MPbk2UIFieldFactory @ 146 NONAME - _ZN29CPbk2ContactEditorUIFieldBase14SetFieldLabelLERK7TDesC16 @ 147 NONAME - _ZN29CPbk2ContactEditorUIFieldBase16ConsumesKeyEventERK9TKeyEvent10TEventCode @ 148 NONAME - _ZN29CPbk2ContactEditorUIFieldBase18LoadBitmapToFieldLERK11TPbk2IconId @ 149 NONAME - _ZN29CPbk2ContactEditorUIFieldBase25HandleCustomFieldCommandLEi @ 150 NONAME - _ZN29CPbk2ContactEditorUIFieldBase8SetFocusEv @ 151 NONAME - _ZN29CPbk2ContactEditorUIFieldBase9ControlIdEv @ 152 NONAME - _ZN29CPbk2ContactEditorUIFieldBaseC2EP12MPbk2UIFieldR27MPbk2ContactEditorUiBuilderR22CPbk2IconInfoContaineri @ 153 NONAME - _ZN29CPbk2ContactEditorUIFieldBaseD0Ev @ 154 NONAME - _ZN29CPbk2ContactEditorUIFieldBaseD1Ev @ 155 NONAME - _ZN29CPbk2ContactEditorUIFieldBaseD2Ev @ 156 NONAME - _ZN31CPbk2ContactEditorReadonlyField11InitializeLEP25MPbk2ContactEditorUIField @ 157 NONAME - _ZN31CPbk2ContactEditorReadonlyField8SetTextLEPK7TDesC16 @ 158 NONAME - _ZNK29CPbk2ContactEditorUIFieldBase10FieldLabelEv @ 159 NONAME - _ZNK29CPbk2ContactEditorUIFieldBase11ControlTextEv @ 160 NONAME - _ZNK29CPbk2ContactEditorUIFieldBase7UIFieldEv @ 161 NONAME - _ZTI12CPbk2UIField @ 162 NONAME ; ## - _ZTI17CPbk2UIFieldArray @ 163 NONAME ; ## - _ZTI27CPbk2ContactEditorArrayItem @ 164 NONAME ; ## - _ZTI29CPbk2ContactEditorUIFieldBase @ 165 NONAME ; ## - _ZTI30CPbk2ContactEditorFieldFactory @ 166 NONAME ; ## - _ZTI31CPbk2ContactEditorReadonlyField @ 167 NONAME ; ## - _ZTV12CPbk2UIField @ 168 NONAME ; ## - _ZTV17CPbk2UIFieldArray @ 169 NONAME ; ## - _ZTV27CPbk2ContactEditorArrayItem @ 170 NONAME ; ## - _ZTV29CPbk2ContactEditorUIFieldBase @ 171 NONAME ; ## - _ZTV30CPbk2ContactEditorFieldFactory @ 172 NONAME ; ## - _ZTV31CPbk2ContactEditorReadonlyField @ 173 NONAME ; ## - _ZThn4_N29CPbk2ContactEditorUIFieldBase14SetFieldLabelLERK7TDesC16 @ 174 NONAME ; ## - _ZThn4_N29CPbk2ContactEditorUIFieldBase16ConsumesKeyEventERK9TKeyEvent10TEventCode @ 175 NONAME ; ## - _ZThn4_N29CPbk2ContactEditorUIFieldBase18LoadBitmapToFieldLERK11TPbk2IconId @ 176 NONAME ; ## - _ZThn4_N29CPbk2ContactEditorUIFieldBase25HandleCustomFieldCommandLEi @ 177 NONAME ; ## - _ZThn4_N29CPbk2ContactEditorUIFieldBase8SetFocusEv @ 178 NONAME ; ## - _ZThn4_N29CPbk2ContactEditorUIFieldBase9ControlIdEv @ 179 NONAME ; ## - _ZThn4_N29CPbk2ContactEditorUIFieldBaseD0Ev @ 180 NONAME ; ## - _ZThn4_N29CPbk2ContactEditorUIFieldBaseD1Ev @ 181 NONAME ; ## - _ZThn4_NK29CPbk2ContactEditorUIFieldBase10FieldLabelEv @ 182 NONAME ; ## - _ZThn4_NK29CPbk2ContactEditorUIFieldBase11ControlTextEv @ 183 NONAME ; ## - _ZThn4_NK29CPbk2ContactEditorUIFieldBase7UIFieldEv @ 184 NONAME ; ## - _ZTI30CPbk2FilteredViewStackObserver @ 185 NONAME ; ## - _ZTV30CPbk2FilteredViewStackObserver @ 186 NONAME ; ## - _ZN29CPbk2GeneralConfirmationQuery9ExecuteLDERK16MVPbkBaseContactii @ 187 NONAME - _ZTI33CPbk2ContactViewCustomListBoxData @ 188 NONAME - _ZTI39CPbk2ContactViewCustomListBoxItemDrawer @ 189 NONAME - _ZTV33CPbk2ContactViewCustomListBoxData @ 190 NONAME - _ZTV39CPbk2ContactViewCustomListBoxItemDrawer @ 191 NONAME - _ZN21CPbk2NamesListControl20SetCurrentGroupLinkLEP16MVPbkContactLink @ 192 NONAME - _ZN21CPbk2NamesListControl4NewLEiPK11CCoeControlR19CVPbkContactManagerR20MVPbkContactViewBaseR25MPbk2ContactNameFormatterR23CPbk2StorePropertyArrayP21CPbk2ThumbnailManager @ 193 NONAME - _ZN21CPbk2ThumbnailManager4NewLER19CVPbkContactManager @ 194 NONAME - _ZN21CPbk2ContactEditorDlg4NewLER24TPbk2ContactEditorParamsP17MVPbkStoreContactR26MPbk2EditedContactObserverP24MPbk2ApplicationServicesP7HBufC16i @ 195 NONAME - _ZN24CPbk2AddItemToContactDlg4NewLEP24MPbk2ApplicationServices @ 196 NONAME - _ZN22CPbk2MergeConflictsDlg4NewLEP18MPbk2MergeResolveri @ 197 NONAME - _ZN26CPbk2MergePhotoConflictDlg4NewLEP16MVPbkBaseContactS1_Pi @ 198 NONAME - _ZN29CPbk2GeneralConfirmationQuery9StopQueryEv @ 199 NONAME - _ZN21CPbk2NamesListControl26HandleViewForegroundEventLEi @ 200 NONAME - _ZN16Pbk2AddressTools22IsAddressPreviewEmptyLER17MVPbkStoreContact17TPbk2FieldGroupId @ 201 NONAME - _ZN16Pbk2AddressTools32MapVPbkFieldTypeToAddressGroupIdEPK14MVPbkFieldType @ 202 NONAME - _ZN21CPbk2NamesListControl26MassUpdateSkipProgressNoteEi @ 203 NONAME - _ZN21CPbk2NamesListControl13SetOpeningCcaEi @ 204 NONAME + _ZNK29CPbk2ContactEditorUIFieldBase10FieldLabelEv @ 131 NONAME + _ZNK29CPbk2ContactEditorUIFieldBase11ControlTextEv @ 132 NONAME + _ZNK29CPbk2ContactEditorUIFieldBase7UIFieldEv @ 133 NONAME + _ZTI12CPbk2UIField @ 134 NONAME + _ZTI13CPbk2FetchDlg @ 135 NONAME + _ZTI15CPbk2PrependDlg @ 136 NONAME + _ZTI17CPbk2UIFieldArray @ 137 NONAME + _ZTI18CPbk2AddressSelect @ 138 NONAME + _ZTI18CPbk2InputAbsorber @ 139 NONAME + _ZTI19CPbk2StoreListQuery @ 140 NONAME + _ZTI19CPbk2ThumbnailPopup @ 141 NONAME + _ZTI21CPbk2ContactEditorDlg @ 142 NONAME + _ZTI21CPbk2NamesListControl @ 143 NONAME + _ZTI21CPbk2PhonebookInfoDlg @ 144 NONAME + _ZTI22CPbk2ContactIconsUtils @ 145 NONAME + _ZTI23CPbk2ContactInfoControl @ 146 NONAME + _ZTI24CPbk2AddItemToContactDlg @ 147 NONAME + _ZTI24CPbk2SettingsListControl @ 148 NONAME + _ZTI25CPbk2ContactEditorDlgImpl @ 149 NONAME + _ZTI25CPbk2StoreInfoItemBuilder @ 150 NONAME + _ZTI27CPbk2ContactEditorArrayItem @ 151 NONAME + _ZTI27CPbk2MemoryEntryDefaultsDlg @ 152 NONAME + _ZTI29CPbk2ContactEditorUIFieldBase @ 153 NONAME + _ZTI29CPbk2GeneralConfirmationQuery @ 154 NONAME + _ZTI30CPbk2ContactEditorFieldFactory @ 155 NONAME + _ZTI30CPbk2FilteredViewStackObserver @ 156 NONAME + _ZTI31CPbk2ContactEditorReadonlyField @ 157 NONAME + _ZTI31CPbk2ContactUiControlSubstitute @ 158 NONAME + _ZTI33CPbk2ContactViewCustomListBoxData @ 159 NONAME + _ZTI39CPbk2ContactViewCustomListBoxItemDrawer @ 160 NONAME + _ZTIN17CPbk2FetchResults20CFRConatactOperationE @ 161 NONAME + _ZTV12CPbk2UIField @ 162 NONAME + _ZTV13CPbk2FetchDlg @ 163 NONAME + _ZTV15CPbk2PrependDlg @ 164 NONAME + _ZTV17CPbk2UIFieldArray @ 165 NONAME + _ZTV18CPbk2AddressSelect @ 166 NONAME + _ZTV18CPbk2InputAbsorber @ 167 NONAME + _ZTV19CPbk2StoreListQuery @ 168 NONAME + _ZTV19CPbk2ThumbnailPopup @ 169 NONAME + _ZTV21CPbk2ContactEditorDlg @ 170 NONAME + _ZTV21CPbk2NamesListControl @ 171 NONAME + _ZTV21CPbk2PhonebookInfoDlg @ 172 NONAME + _ZTV22CPbk2ContactIconsUtils @ 173 NONAME + _ZTV23CPbk2ContactInfoControl @ 174 NONAME + _ZTV24CPbk2AddItemToContactDlg @ 175 NONAME + _ZTV24CPbk2SettingsListControl @ 176 NONAME + _ZTV25CPbk2ContactEditorDlgImpl @ 177 NONAME + _ZTV25CPbk2StoreInfoItemBuilder @ 178 NONAME + _ZTV27CPbk2ContactEditorArrayItem @ 179 NONAME + _ZTV27CPbk2MemoryEntryDefaultsDlg @ 180 NONAME + _ZTV29CPbk2ContactEditorUIFieldBase @ 181 NONAME + _ZTV29CPbk2GeneralConfirmationQuery @ 182 NONAME + _ZTV30CPbk2ContactEditorFieldFactory @ 183 NONAME + _ZTV30CPbk2FilteredViewStackObserver @ 184 NONAME + _ZTV31CPbk2ContactEditorReadonlyField @ 185 NONAME + _ZTV31CPbk2ContactUiControlSubstitute @ 186 NONAME + _ZTV33CPbk2ContactViewCustomListBoxData @ 187 NONAME + _ZTV39CPbk2ContactViewCustomListBoxItemDrawer @ 188 NONAME + _ZTVN17CPbk2FetchResults20CFRConatactOperationE @ 189 NONAME + _ZThn4_N29CPbk2ContactEditorUIFieldBase14SetFieldLabelLERK7TDesC16 @ 190 NONAME + _ZThn4_N29CPbk2ContactEditorUIFieldBase16ConsumesKeyEventERK9TKeyEvent10TEventCode @ 191 NONAME + _ZThn4_N29CPbk2ContactEditorUIFieldBase18LoadBitmapToFieldLERK11TPbk2IconId @ 192 NONAME + _ZThn4_N29CPbk2ContactEditorUIFieldBase25HandleCustomFieldCommandLEi @ 193 NONAME + _ZThn4_N29CPbk2ContactEditorUIFieldBase8SetFocusEv @ 194 NONAME + _ZThn4_N29CPbk2ContactEditorUIFieldBase9ControlIdEv @ 195 NONAME + _ZThn4_N29CPbk2ContactEditorUIFieldBaseD0Ev @ 196 NONAME + _ZThn4_N29CPbk2ContactEditorUIFieldBaseD1Ev @ 197 NONAME + _ZThn4_NK29CPbk2ContactEditorUIFieldBase10FieldLabelEv @ 198 NONAME + _ZThn4_NK29CPbk2ContactEditorUIFieldBase11ControlTextEv @ 199 NONAME + _ZThn4_NK29CPbk2ContactEditorUIFieldBase7UIFieldEv @ 200 NONAME + _ZThn52_N31CPbk2ContactUiControlSubstitute20SetFocusedFieldIndexEi @ 201 NONAME + _ZThn52_N31CPbk2ContactUiControlSubstituteD0Ev @ 202 NONAME + _ZThn52_N31CPbk2ContactUiControlSubstituteD1Ev @ 203 NONAME + _ZThn56_N31CPbk2ContactUiControlSubstituteD0Ev @ 204 NONAME + _ZThn56_N31CPbk2ContactUiControlSubstituteD1Ev @ 205 NONAME diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/GroupExtension/inc/CPguGroupMembersView.h --- a/phonebookui/Phonebook2/GroupExtension/inc/CPguGroupMembersView.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/GroupExtension/inc/CPguGroupMembersView.h Thu Aug 19 09:41:07 2010 +0300 @@ -24,6 +24,7 @@ #include #include #include +#include // FORWARD DECLARATIONS class CPbk2UIExtensionView; @@ -82,7 +83,8 @@ class CPguGroupMembersView : public CBase, public MPbk2UIExtensionView, public MEikListBoxObserver, - private MPbk2GroupMembersViewActivationCallback + private MPbk2GroupMembersViewActivationCallback, + public MAknMarkingModeObserver { @@ -125,6 +127,23 @@ const TPoint& aPenEventLocation, const TPoint& aPenEventScreenLocation ); + public: // From MAknMarkingModeObserver + + /** + * This method is called when marking mode is activated or deactivated. + * + * @param aActivated @c ETrue if marking mode was activate, @c EFalse + * if marking mode was deactivated. + */ + void MarkingModeStatusChanged( TBool aActivated ); + + /** + * This method is called just before marking mode is closed. Client can + * either accept or decline closing. + * + * @return @c ETrue if marking mode should be closed, otherwise @c EFalse. + */ + TBool ExitMarkingMode() const; protected: // from MEikListBoxObserver @@ -152,7 +171,6 @@ void ReturnToPreviousViewL() const; void ShowContextMenuL(); - private: // Data /// Ref: View that contains this extension view CPbk2UIExtensionView& iView; diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/GroupExtension/inc/CPguSendMessageGroupCmd.h --- a/phonebookui/Phonebook2/GroupExtension/inc/CPguSendMessageGroupCmd.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/GroupExtension/inc/CPguSendMessageGroupCmd.h Thu Aug 19 09:41:07 2010 +0300 @@ -151,6 +151,8 @@ TProcessState iState; /// Ref: Group UI extension CPguUIExtensionPlugin* iPguUIExtensionPlugin; + /// Own: Send Message indicator + TBool iSendMessage; }; #endif // CPGUSENDMESSAGEGROUPCMD_H diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/GroupExtension/rss/PguMembersListViewBase.rss --- a/phonebookui/Phonebook2/GroupExtension/rss/PguMembersListViewBase.rss Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/GroupExtension/rss/PguMembersListViewBase.rss Thu Aug 19 09:41:07 2010 +0300 @@ -54,38 +54,6 @@ }; } -// --------------------------------------------------------- -// Groups Members View's context menu bar -// --------------------------------------------------------- -// -RESOURCE MENU_PANE r_phonebook2_groupmembers_markable_list_menu - { - items = - { - MENU_ITEM - { - command = EAknCmdMark; - txt = qtn_options_list_mark_one; - flags = EEikMenuItemSpecific; - }, - MENU_ITEM - { - command = EAknCmdUnmark; - txt = qtn_options_list_unmark_one; - flags = EEikMenuItemSpecific; - }, - MENU_ITEM - { - command = EAknMarkAll; - txt = qtn_options_list_mark_all; - }, - MENU_ITEM - { - command = EAknUnmarkAll; - txt = qtn_options_list_unmark_all; - } - }; - } // --------------------------------------------------------- // Groups Members View's menu bar @@ -101,7 +69,7 @@ }, MENU_TITLE { - menu_pane = R_AVKON_MENUPANE_MARKABLE_LIST; + menu_pane = R_AVKON_MENUPANE_MARK_MULTIPLE; }, MENU_TITLE { @@ -140,27 +108,5 @@ }; } -// --------------------------------------------------------- -// Groups Members View's context menu bar -// --------------------------------------------------------- -// -RESOURCE MENU_BAR r_phonebook2_groupmembers_context_menubar - { - titles = - { - MENU_TITLE - { - menu_pane = R_PHONEBOOK2_MARKABLE_LIST_CONTEXT_MENU; - }, - MENU_TITLE - { - menu_pane = R_PHONEBOOK2_BCARD_SEND_MENU; - }, - MENU_TITLE - { - menu_pane = r_phonebook2_groupmembers_context_menu; - } - }; - } // End of File diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/GroupExtension/src/CPguGroupMembersView.cpp --- a/phonebookui/Phonebook2/GroupExtension/src/CPguGroupMembersView.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/GroupExtension/src/CPguGroupMembersView.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -468,10 +468,26 @@ */ virtual ~CGroupMembersViewImpl() {} + + public: + + void SetMarkingModeOn( TBool aMarkingModeOn ) + { + iMarkingModeOn = aMarkingModeOn; + } + + TBool IsMarkingModeOn() + { + return iMarkingModeOn; + } protected: // Implementation - CGroupMembersViewImpl() + CGroupMembersViewImpl() : iMarkingModeOn( EFalse ) {} + + protected: + // Flag to indicate whether Marking mode is active + TBool iMarkingModeOn; }; @@ -1119,7 +1135,7 @@ iCommandHandler.AddMenuCommandObserver(*this); iStoreConf = &( Phonebook2::Pbk2AppUi()->ApplicationServices(). - StoreConfiguration() ); + StoreConfiguration() ); iStoreConf->AddObserverL( *this ); // Expand the group members view from the all groups view @@ -1426,17 +1442,15 @@ case EKeyOK: { if ( !ShiftDown(aKeyEvent) ) // pure OK or ENTER key - { + { if ( iControl->ContactsMarked() && itemSpecEnabled ) - { - iView.LaunchPopupMenuL( - R_PHONEBOOK2_GROUPMEMBERS_CONTEXT_MENUBAR); - result = ETrue; - } - else if ( iControl->NumberOfContacts() == 0 ) - { - result = ETrue; - } + { + result = ETrue; + } + else if ( iControl->NumberOfContacts() == 0 ) + { + result = ETrue; + } } break; } @@ -1531,7 +1545,6 @@ { aMenuPane->SetItemDimmed( EPbk2CmdBelongsToGroups, ETrue ); aMenuPane->SetItemDimmed( EPbk2CmdAddMembers, ETrue ); - aMenuPane->SetItemSpecific( EPbk2CmdRemoveFromGroup, EFalse ); } // Weed out commands not meant to be if names list is empty if ( Phonebook2::Pbk2AppUi()->ApplicationServices(). @@ -1549,9 +1562,12 @@ { aMenuPane->SetItemDimmed( EPbk2CmdSend, ETrue ); } - if ( iControl->ContactsMarked() ) + + // When Marking mode is active, + // Send as business card item should be shown in pop up menu. + if( iMarkingModeOn ) { - aMenuPane->SetItemSpecific( EPbk2CmdSend, EFalse ); + aMenuPane->SetItemSpecific( EPbk2CmdSend, ETrue ); } break; } @@ -1786,9 +1802,6 @@ R_PBK2_SOFTKEYS_OPTIONS_BACK_CONTEXT); } iView.Cba()->DrawDeferred(); - // Change context menu when marked items - iView.MenuBar()->SetContextMenuTitleResourceId - ( R_PHONEBOOK2_GROUPMEMBERS_CONTEXT_MENUBAR ); } } } @@ -1900,11 +1913,6 @@ // Select key is mapped to "Open Contact" command HandleCommandL( EPbk2CmdOpenCca ); } - else - { - iView.LaunchPopupMenuL( - R_PHONEBOOK2_GROUPMEMBERS_CONTEXT_MENUBAR); - } break; } default: @@ -1953,12 +1961,7 @@ if ( iControl->NumberOfContacts() > 0 && iPointerEventInspector->FocusedItemPointed() ) { - if ( iControl->ContactsMarked() ) - { - iView.LaunchPopupMenuL( - R_PHONEBOOK2_GROUPMEMBERS_CONTEXT_MENUBAR ); - } - else + if ( !iControl->ContactsMarked() ) { // Open contact HandleCommandL(EPbk2CmdOpenCca); @@ -2187,11 +2190,15 @@ } iViewImpl->CreateControlL(iView.ClientRect()); - + CPbk2NamesListControl* nlctrl=static_cast (iViewImpl->Control()); + + // It will return the listbox by calling nlctrl->ComponentControl(0), + // which is defined in CPbk2NamesListControl::ComponentControl(TInt aIndex). CCoeControl* ctrl=nlctrl->ComponentControl(0); CEikListBox* listbox=static_cast (ctrl); - listbox->SetListBoxObserver( this ); + listbox->SetListBoxObserver( this ); + listbox->SetMarkingModeObserver( this ); iPreviousViewId = aPrevViewId; @@ -2277,7 +2284,7 @@ { case EEventItemDoubleClicked: case EEventItemSingleClicked: - case EEventEnterKeyPressed: + case EEventEnterKeyPressed: { if ( iViewImpl ) @@ -2306,10 +2313,11 @@ void CPguGroupMembersView::HandlePointerEventL( const TPointerEvent& aPointerEvent) { - if ( iViewImpl ) + if ( iViewImpl && !iViewImpl->IsMarkingModeOn() ) { - // route the pointer events to the view implementing the application - // view currently + // Route the pointer events to the view implementing the application + // view currently except the Marking mode is active, + // because the event is handled by avkon when marking mode is active. iViewImpl->HandlePointerEventL(aPointerEvent); } } @@ -2331,6 +2339,46 @@ } } +// ----------------------------------------------------------------------------- +// CPguGroupMembersView::MarkingModeStatusChanged +// ----------------------------------------------------------------------------- +// +void CPguGroupMembersView::MarkingModeStatusChanged( TBool aActivated ) + { + if( iViewImpl ) + { + iViewImpl->SetMarkingModeOn( aActivated ); + CPbk2NamesListControl* nlctrl = + static_cast (iViewImpl->Control()); + if( !aActivated ) + { + // It will return the findbox by calling + // nlctrl->ComponentControl(1), which is defined in + // CPbk2NamesListControl::ComponentControl(TInt aIndex). + CCoeControl* ctrl=nlctrl->ComponentControl(1); + if( ctrl->IsVisible() ) + { + // Clear the text of the FindBox + // when canceling from Marking mode. + TRAP_IGNORE( nlctrl->ResetFindL() ); + } + } + nlctrl->SetMarkingMode( aActivated ); + } + } + +// ----------------------------------------------------------------------------- +// CPguGroupMembersView::ExitMarkingMode +// Called by avkon, if the return value is ETrue, +// the Marking mode will be canceled after any operation, +// otherwise the Marking mode keep active. +// ----------------------------------------------------------------------------- +// +TBool CPguGroupMembersView::ExitMarkingMode() const + { + return EFalse; + } + // -------------------------------------------------------------------------- // CPguGroupMembersView::TransformViewActivationStateToReady // -------------------------------------------------------------------------- diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/GroupExtension/src/CPguSendMessageGroupCmd.cpp --- a/phonebookui/Phonebook2/GroupExtension/src/CPguSendMessageGroupCmd.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/GroupExtension/src/CPguSendMessageGroupCmd.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -262,6 +262,7 @@ } case EStopping: { + iSendMessage = EFalse; ProcessDismissed( KErrNone ); break; } @@ -369,32 +370,35 @@ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING ("CPguSendMessageGroupCmd::DoSendMessageL() start") ); - // Gets current tile pane and saves it to title - HBufC* title = NULL; - CAknTitlePane* titlePane = NULL; - CEikStatusPane *sp = CEikonEnv::Static()->AppUiFactory()->StatusPane(); - titlePane = STATIC_CAST( CAknTitlePane*, - sp->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) ); - title = titlePane->Text()->AllocLC(); - - Phonebook2::Pbk2AppUi()->ApplicationServices().SendUiL()-> - CreateAndSendMessageL( iMtmUid, iMessageData ); - - if( !Layout_Meta_Data::IsLandscapeOrientation() ) + if ( iSendMessage ) { - sp->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_USUAL ); - sp->MakeVisible( ETrue ); - - // Sets title pane for tile which was save - titlePane->SetText( title ); - sp->DrawNow(); + // Gets current tile pane and saves it to title + HBufC* title = NULL; + CAknTitlePane* titlePane = NULL; + CEikStatusPane *sp = CEikonEnv::Static()->AppUiFactory()->StatusPane(); + titlePane = STATIC_CAST( CAknTitlePane*, + sp->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) ); + title = titlePane->Text()->AllocLC(); + + Phonebook2::Pbk2AppUi()->ApplicationServices().SendUiL()-> + CreateAndSendMessageL( iMtmUid, iMessageData ); + + if( !Layout_Meta_Data::IsLandscapeOrientation() ) + { + sp->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_USUAL ); + sp->MakeVisible( ETrue ); + + // Sets title pane for tile which was save + titlePane->SetText( title ); + sp->DrawNow(); + } + else + { + // Sets title pane for tile which was save + titlePane->SetText( title ); + } + CleanupStack::Pop(); } - else - { - // Sets title pane for tile which was save - titlePane->SetText( title ); - } - CleanupStack::Pop(); iState = EStopping; IssueRequest(); @@ -456,6 +460,7 @@ SetAddressFromFieldL( *selectedField ); CleanupStack::PopAndDestroy(); // selectedField iState = ERetrieving; + iSendMessage = ETrue; } else { diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/MMCExtension/src/CPmuCopyFromDriveCmd.cpp --- a/phonebookui/Phonebook2/MMCExtension/src/CPmuCopyFromDriveCmd.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/MMCExtension/src/CPmuCopyFromDriveCmd.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -402,9 +402,14 @@ // -------------------------------------------------------------------------- // void CPmuCopyFromMmcCmd::ContactsSavingFailed - ( MVPbkContactOperationBase& aOperation, TInt /*aError*/ ) + ( MVPbkContactOperationBase& aOperation, TInt aError ) { - if ( &aOperation == iImportOperation ) + // Stop copying if the disk is full + if ( aError == KErrDiskFull ) + { + RunError( aError ); + } + else if ( &aOperation == iImportOperation ) { delete iImportOperation; iImportOperation = NULL; diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/MapExtension/src/cpmapcmd.cpp --- a/phonebookui/Phonebook2/MapExtension/src/cpmapcmd.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/MapExtension/src/cpmapcmd.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -909,16 +909,7 @@ iMapView->AddLandmarksToShowL( landmarks ); iNoAddress = EFalse; } - else - { - landmark->SetPositionFieldL(EPositionFieldCity,KNullDesC16); - TLocality tempLoc; - tempLoc.SetCoordinate(-0.0,-0.0); - landmark->SetPositionL(tempLoc); - - landmarks.AppendL( landmark ); - iMapView->AddLandmarksToShowL( landmarks ); - } + iMapView->SelectFromMapL( iStatus ); iCurrentMapLaunchedByState = EMapAssignFromMaps; diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/NamesListExtension/inc/Pbk2NamesListExView.h --- a/phonebookui/Phonebook2/NamesListExtension/inc/Pbk2NamesListExView.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/NamesListExtension/inc/Pbk2NamesListExView.h Thu Aug 19 09:41:07 2010 +0300 @@ -32,6 +32,7 @@ #include #include +#include // FORWARD DECLARATIONS template class CPbk2ControlContainer; @@ -70,7 +71,8 @@ public MCoeControlObserver, public MEikListBoxObserver, private MCoeForegroundObserver, - public MPbk2UIExtensionView2 + public MPbk2UIExtensionView2, + public MAknMarkingModeObserver { public: // Construction and destruction @@ -162,6 +164,24 @@ CCoeControl* aControl, TCoeEvent aEventType ); + public: // From MAknMarkingModeObserver + + /** + * This method is called when marking mode is activated or deactivated. + * + * @param aActivated @c ETrue if marking mode was activate, @c EFalse + * if marking mode was deactivated. + */ + void MarkingModeStatusChanged( TBool aActivated ); + + /** + * This method is called just before marking mode is closed. Client can + * either accept or decline closing. + * + * @return @c ETrue if marking mode should be closed, otherwise @c EFalse. + */ + TBool ExitMarkingMode() const; + private: // Implementation CPbk2NamesListExView( CPbk2UIExtensionView& aView, @@ -262,8 +282,10 @@ CSpbContentProvider& iContentProvider; // Not own. CCA launcher connection MCCAConnection*& iCCAConnection; - /// Own: Context launcher + // Own: Context launcher CPbk2ContextLaunch* iContextLauncher; + // Flag to indicate whether Marking mode is active + TBool iMarkingModeOn; }; #endif // CPBK2NAMESLISTEXVIEW_H diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/NamesListExtension/rss/Pbk2ExNamesListRes.rss --- a/phonebookui/Phonebook2/NamesListExtension/rss/Pbk2ExNamesListRes.rss Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/NamesListExtension/rss/Pbk2ExNamesListRes.rss Thu Aug 19 09:41:07 2010 +0300 @@ -367,8 +367,8 @@ KPbk2ContactViewListControlDoubleRow; listbox = LISTBOX { - flags = EAknListBoxMarkableList | EAknListBoxLoopScrolling | - EAknListBoxShiftEnterMarks; + flags = EAknListBoxStylusMarkableList | EAknListBoxLoopScrolling | + EAknListBoxPointerMarkableList; }; iconArray = R_PBK2_CONTACT_LIST_ICONS; emptyIconId = PHONEBOOK2_ICON_ID diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/NamesListExtension/src/CPbk2NameslistUiControlExtension.cpp --- a/phonebookui/Phonebook2/NamesListExtension/src/CPbk2NameslistUiControlExtension.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/NamesListExtension/src/CPbk2NameslistUiControlExtension.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -371,6 +371,13 @@ TRAP_IGNORE( AddMyCardThumbnailToIconArrayL() ); } } + // Refresh mycard list item if thumbnail has changed + if( iCommandUpdater && + ( aEvent == EStateThumbnailLoaded || + aEvent == EStateThumbnailNotFound ) ) + { + iCommandUpdater->UpdateCommandItem( EPbk2CmdOpenMyCard ); + } } // ----------------------------------------------------------------------------- diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/NamesListExtension/src/NamesListExView.cpp --- a/phonebookui/Phonebook2/NamesListExtension/src/NamesListExView.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/NamesListExtension/src/NamesListExView.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -62,6 +62,7 @@ #include #include "Pbk2InternalCommands.hrh" #include "CPbk2ContactViewListBox.h" +#include #include "CVPbkContactManager.h" #include "MVPbkContactStoreList.h" @@ -111,6 +112,7 @@ #include #include #include +#include /// Unnamed namespace for local definitions namespace { @@ -201,7 +203,8 @@ iCtrlVisibleStateBeforeLosingForground( ETrue ), iFirstTimeActivated( ETrue ), iContentProvider( aStatusProvider ), - iCCAConnection( aCCAConnection ) + iCCAConnection( aCCAConnection ), + iMarkingModeOn( EFalse ) { } @@ -416,9 +419,9 @@ } if ( EPbk2CmdOpenCca == aCommandId ) - { + { iControl->SetOpeningCca( ETrue ); - } + } // Set focus, keep current focus on the area of the client screen // when scoll to the bottom of Names list view. @@ -563,7 +566,7 @@ // The application is set here to background if application exit occurs PBK2_PROFILE_START ( Pbk2Profile::ENamesListViewDoActivateNotifyViewActivatation ); - + // The application is set here to background if application exit occurs // When the device is powered on, Phonebook will start up automatically and // hide itself in the background. At the first time of names list view activation, @@ -595,9 +598,12 @@ PBK2_PROFILE_END(Pbk2Profile::ENamesListViewDoActivateL); + // It will return the listbox by calling iControl->ComponentControl(0), + // which is defined in CPbk2NamesListControl::ComponentControl(TInt aIndex). CCoeControl* ctrl=iControl->ComponentControl(0); CEikListBox* listbox=static_cast (ctrl); listbox->SetListBoxObserver( this ); + listbox->SetMarkingModeObserver( this ); // iCtrlVisibleStateBeforeLosingForground records the names list control states before // losing foreground during a command execution. Set the iCtrlVisibleStateBeforeLosingForground @@ -620,17 +626,17 @@ // Check if there is need to create MyCard if( FeatureManager::FeatureSupported( KFeatureIdffContactsMycard ) && ( !iMyCard && IsPhoneMemoryUsedL() ) ) - { - // Get the phoneStore for MyCard - MVPbkContactStore* phoneStore = iContactManager->ContactStoresL() - .Find(VPbkContactStoreUris::DefaultCntDbUri() ); - - if( phoneStore ) - { - // Create MyCard if not already exist and the phone memory selected - iMyCard = CPbk2MyCard::NewL( *phoneStore ); - } - } + { + // Get the phoneStore for MyCard + MVPbkContactStore* phoneStore = iContactManager->ContactStoresL() + .Find(VPbkContactStoreUris::DefaultCntDbUri() ); + + if( phoneStore ) + { + // Create MyCard if not already exist and the phone memory selected + iMyCard = CPbk2MyCard::NewL( *phoneStore ); + } + } // Add the MyCard item to the top of the list if( iMyCard && IsPhoneMemoryUsedL() ) @@ -652,13 +658,13 @@ // promotion item disabled until we can support command items at the bottom of the list // if ( IsRclOnL() ) if( 0 ) - { + { CPbk2CmdItemRemoteContactLookup* rclCmd = CPbk2CmdItemRemoteContactLookup::NewLC(); // Add the command item to the bottom of the command list iControl->AddCommandItemL( rclCmd, commandCount ); // ownership transferred CleanupStack::Pop( rclCmd ); commandCount++; - } + } } // -------------------------------------------------------------------------- @@ -698,17 +704,17 @@ // -------------------------------------------------------------------------- // CPbk2MyCard* CPbk2NamesListExView::MyCard() const - { - TBool phoneMemory = EFalse; - - TRAP_IGNORE( phoneMemory = IsPhoneMemoryUsedL() ); - - if( phoneMemory ) - { - return iMyCard; - } - - return NULL; + { + TBool phoneMemory = EFalse; + + TRAP_IGNORE( phoneMemory = IsPhoneMemoryUsedL() ); + + if( phoneMemory ) + { + return iMyCard; + } + + return NULL; } // -------------------------------------------------------------------------- @@ -758,6 +764,15 @@ if (iContainer) { CCoeEnv::Static()->AppUi()->RemoveFromStack(iContainer); + if( iMarkingModeOn ) + { + // It will return the listbox by calling + // iControl->ComponentControl(0), which is defined + // in CPbk2NamesListControl::ComponentControl(TInt aIndex). + CCoeControl* ctrl=iControl->ComponentControl(0); + CEikListBox* listbox=static_cast (ctrl); + listbox->SetMarkingMode(EFalse); + } // Store current state, safe to ignore. There's no real harm, // if theres no stored state when activating this view again TRAP_IGNORE(StoreStateL()); @@ -790,17 +805,35 @@ //there. switch (aResourceId) { + case R_AVKON_MENUPANE_MARK_MULTIPLE: + { + TInt pos; + if ( aMenuPane->MenuItemExists( EAknCmdMarkingModeEnter, pos ) && + iControl->NumberOfContacts() <= 0 ) + { + aMenuPane->SetItemDimmed( EAknCmdMarkingModeEnter, ETrue ); + } + break; + } case R_PHONEBOOK2_NAMESLIST_SEND_URL_MENU: { DimItem( aMenuPane, EPbk2CmdGoToURL ); + if ( iControl->ContactsMarked() && iMarkingModeOn ) + { + aMenuPane->SetItemDimmed( EPbk2CmdSend, EFalse ); + } break; } - case R_PHONEBOOK2_NAMELIST_CREATE_MESSAGE_MENU: + case R_PHONEBOOK2_NAMESLIST_COPY_MENU: { TInt pos; - if ( aMenuPane->MenuItemExists( EPbk2CmdWriteNoQuery, pos ) ) + if ( aMenuPane->MenuItemExists( EPbk2CmdCopy, pos ) && iMarkingModeOn + && iControl->NumberOfContacts() > 0 ) { - aMenuPane->SetItemSpecific( EPbk2CmdWriteNoQuery, !iControl->ContactsMarked() ); + // Show Copy item both in pop up menu and Options + // when Marking mode is active. + aMenuPane->SetItemSpecific( EPbk2CmdCopy, ETrue ); + aMenuPane->SetItemDimmed( EPbk2CmdCopy, EFalse ); } break; } @@ -900,14 +933,44 @@ } case EKeyBackspace: { - if ( (itemSpecEnabled && (iControl->NumberOfContacts() > 0)) - || iControl->ContactsMarked() ) + if ( itemSpecEnabled && ( iControl->FindTextL() == KNullDesC ) ) { - if (iControl->FindTextL() == KNullDesC) + TBool contactsMarked( iControl->ContactsMarked() ); + + MPbk2UiControlCmdItem* cmdItem = const_cast ( iControl->FocusedCommandItem() ); + + TBool onMyCard = cmdItem && ( EPbk2CmdOpenMyCard == cmdItem->CommandId() ); + + if ( !contactsMarked && onMyCard ) { + //Check to see whether the current focus is on MyCard or not + //When none of the contacts are marked and with focus on MyCard, + // pressing BackSpace/Del key leads to deletion of MyCard + + // get extension point and my card link + TAny* object = cmdItem->ControlCmdItemExtension( TUid::Uid( KPbk2ControlCmdItemExtensionUID ) ); + if( object ) + { + MPbk2DoubleListboxCmdItemExtension* extension = + static_cast( object ); + // if extension exists + if( extension ) + { + const MVPbkContactLink* link = extension->Link(); + // if link exists, then MyCard has been Assigned + if( link ) + { + HandleCommandL( EPbk2CmdDeleteMyCard ); + result = ETrue; + } + } + } + } + else if( ( contactsMarked ) || (iControl->NumberOfContacts() > 0) ) + { HandleCommandL(EPbk2CmdDeleteMe); result = ETrue; - } + } } break; } @@ -916,18 +979,12 @@ case EKeyOK: { if ( !ShiftDown(aKeyEvent) ) // pure OK key - { - if ( iControl->ContactsMarked() && itemSpecEnabled ) - { - iView.LaunchPopupMenuL( - R_PHONEBOOK2_NAMESLIST_CONTEXT_MENUBAR_ITEMS_MARKED); - result = ETrue; - } - else if ( iControl->NumberOfContacts() == 0 ) - { - result = ETrue; - } - } + { + if ( iControl->ContactsMarked() && itemSpecEnabled ) + { + result = EFalse; + } + } break; } default: @@ -958,11 +1015,11 @@ switch ( aEventType ) { case EEventItemSingleClicked: - { + { ShowContextMenuL(); break; } -#if 0 +#if 0 case EEventEmptyAreaClicked: //An empty area of non-empty listbox was clicked case EEventEmptyListClicked: //An empty listbox was clicked { @@ -995,11 +1052,6 @@ // Select key is mapped to "Open Contact" command HandleCommandL(EPbk2CmdOpenCca); } - else if (iControl->ContactsMarked()) - { - iView.LaunchPopupMenuL( - R_PHONEBOOK2_NAMESLIST_CONTEXT_MENUBAR_ITEMS_MARKED); - } break; } default: @@ -1082,13 +1134,7 @@ { if ( iPointerEventInspector->FocusedItemPointed() ) { - if ( iControl->ContactsMarked() ) - { - // Display marked items context menu - iView.LaunchPopupMenuL - ( R_PHONEBOOK2_NAMESLIST_CONTEXT_MENUBAR_ITEMS_MARKED ); - } - else + if ( !iControl->ContactsMarked() ) { // cancel the long tap animation with pointer up event TPointerEvent event; @@ -1131,9 +1177,9 @@ { MTouchFeedback* feedback = MTouchFeedback::Instance(); if ( feedback ) - { - feedback->InstantFeedback( ETouchFeedbackBasic ); - } + { + feedback->InstantFeedback( ETouchFeedbackBasic ); + } HandleCommandL( EPbk2CmdCreateNew ); } } @@ -1243,22 +1289,22 @@ Reset(); if( iMyCard ) - { - return; - } + { + return; + } if( FeatureManager::FeatureSupported( KFeatureIdffContactsMycard ) ) - { - // Get the phoneStore for MyCard - TRAP_IGNORE( phoneStore = iContactManager->ContactStoresL(). - Find( VPbkContactStoreUris::DefaultCntDbUri() ) ); - } + { + // Get the phoneStore for MyCard + TRAP_IGNORE( phoneStore = iContactManager->ContactStoresL(). + Find( VPbkContactStoreUris::DefaultCntDbUri() ) ); + } if( !phoneStore ) - { + { TRAP_IGNORE( iContactManager->LoadContactStoreL( VPbkContactStoreUris::DefaultCntDbUri() ) ); - } + } } // -------------------------------------------------------------------------- @@ -1515,13 +1561,51 @@ } } +// ----------------------------------------------------------------------------- +// CPbk2NamesListExView::MarkingModeStatusChanged +// ----------------------------------------------------------------------------- +// +void CPbk2NamesListExView::MarkingModeStatusChanged( TBool aActivated ) + { + iMarkingModeOn = aActivated; + + // It will return the control findbox by calling + // iControl->ComponentControl(1), which is defined + // in CPbk2NamesListControl::ComponentControl(TInt aIndex). + if ( !iMarkingModeOn && iControl->ComponentControl(1)->IsVisible() ) + { + // Clear the text of the FindBox, when canceling from Marking mode. + TRAP_IGNORE( iControl->ResetFindL() ); + } + iControl->SetMarkingMode( aActivated ); + + // It will return the control listbox by calling + // iControl->ComponentControl(0), which is defined + // in CPbk2NamesListControl::ComponentControl(TInt aIndex). + CPbk2ContactViewListBox* listbox = + static_cast(iControl->ComponentControl(0)); + listbox->SetMarkingModeState( aActivated ); + } + +// ----------------------------------------------------------------------------- +// CPbk2NamesListExView::ExitMarkingMode +// Called by avkon, if the return value is ETrue, +// the Marking mode will be canceled after any operation, +// otherwise the Marking mode keep active. +// ----------------------------------------------------------------------------- +// +TBool CPbk2NamesListExView::ExitMarkingMode() const + { + return EFalse; + } + //--------------------------------------------------------------------------- // CPbk2NamesListExView::CreateControlsL // -------------------------------------------------------------------------- // inline void CPbk2NamesListExView::CreateControlsL() { - + if (!iContainer) { PBK2_PROFILE_START(Pbk2Profile::ENamesListViewCreateControls); @@ -1628,9 +1712,6 @@ { // Set middle softkey as Context Icon iView.Cba()->SetCommandSetL( R_PBK2_SOFTKEYS_OPTIONS_EXIT_CONTEXT ); - // Change context menu when marked items - iView.MenuBar()->SetContextMenuTitleResourceId - ( R_PHONEBOOK2_NAMESLIST_CONTEXT_MENUBAR_ITEMS_MARKED ); } else // not listContainsContacts && not contactsMarked { @@ -1856,25 +1937,25 @@ // -------------------------------------------------------------------------- // TBool CPbk2NamesListExView::IsPhoneMemoryUsedL() const - { - CPbk2ApplicationServices* appServices = CPbk2ApplicationServices::InstanceL(); - - // Get current configuration - CPbk2StoreConfiguration& storeConfig = appServices->StoreConfiguration(); - - CVPbkContactStoreUriArray* uriArray = storeConfig.CurrentConfigurationL(); - - TVPbkContactStoreUriPtr contactUri( VPbkContactStoreUris::DefaultCntDbUri() ); - - // Check is phone memory included - TBool phoneMemory = uriArray->IsIncluded( contactUri ); - - delete uriArray; - Release( appServices ); - - return phoneMemory; - } - + { + CPbk2ApplicationServices* appServices = CPbk2ApplicationServices::InstanceL(); + + // Get current configuration + CPbk2StoreConfiguration& storeConfig = appServices->StoreConfiguration(); + + CVPbkContactStoreUriArray* uriArray = storeConfig.CurrentConfigurationL(); + + TVPbkContactStoreUriPtr contactUri( VPbkContactStoreUris::DefaultCntDbUri() ); + + // Check is phone memory included + TBool phoneMemory = uriArray->IsIncluded( contactUri ); + + delete uriArray; + Release( appServices ); + + return phoneMemory; + } + // -------------------------------------------------------------------------- // CPbk2NamesListExView::HandleGainingForeground // -------------------------------------------------------------------------- diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/NamesListExtension/src/NamesListUiExtensionPlugin.cpp --- a/phonebookui/Phonebook2/NamesListExtension/src/NamesListUiExtensionPlugin.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/NamesListExtension/src/NamesListUiExtensionPlugin.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -371,41 +371,7 @@ break; } #endif - case R_AVKON_MENUPANE_MARKABLE_LIST_IMPLEMENTATION: - { - - if ( Pbk2NlxMenuFiltering::AddToFavoritesCmdSelected( aControl ) ) - { - DimItem( aMenuPane, EAknCmdMark ); - } - if ( Pbk2NlxMenuFiltering::MyCardCmdSelected( aControl ) ) - { - DimItem( aMenuPane, EAknCmdMark ); - } - break; - } - case R_PHONEBOOK2_MARKABLE_LIST_CONTEXT_MENU: - { - if ( Pbk2NlxMenuFiltering::AddToFavoritesCmdSelected( aControl ) ) - { - DimItem( aMenuPane, EAknCmdMark ); - DimItem( aMenuPane, EAknCmdUnmark ); - } - if ( Pbk2NlxMenuFiltering::MyCardCmdSelected( aControl ) ) - { - DimItem( aMenuPane, EAknCmdMark ); - DimItem( aMenuPane, EAknCmdUnmark ); - } - break; - } - case R_AVKON_MENUPANE_MARKABLE_LIST: - { - if ( !aControl.NumberOfContacts() ) - { - DimItem( aMenuPane, EAknCmdEditListMenu ); - } - break; - } + case R_PHONEBOOK2_NAMESLIST_COPY_MENU: { MPbk2ContactUiControl2* tempControl = diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/NamesListExtension/src/cpbk2cmditemmycard.cpp --- a/phonebookui/Phonebook2/NamesListExtension/src/cpbk2cmditemmycard.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/NamesListExtension/src/cpbk2cmditemmycard.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -118,23 +118,10 @@ return NULL; } -void CPbk2CmdItemMyCard::MyCardEvent( MPbk2MyCardObserver::TMyCardStatusEvent aEvent ) +void CPbk2CmdItemMyCard::MyCardEvent( MPbk2MyCardObserver::TMyCardStatusEvent /*aEvent*/ ) { - // always inform these - if( aEvent == EStateThumbnailLoaded || - aEvent == EStateThumbnailNotFound ) - { - if( iObserver ) - { - iObserver->CmdItemVisibilityChanged( CommandId(), ETrue ); - } - } - // status change - else - { - NotifyVisibiltyChange( IsEnabled() ) ; - } - } + NotifyVisibiltyChange( IsEnabled() ); + } void CPbk2CmdItemMyCard::FormatDataL( MPbk2DoubleListboxDataElement& aDataElement ) diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/inc/CPbk2AddressSelectPhase.h --- a/phonebookui/Phonebook2/ServerApplication/inc/CPbk2AddressSelectPhase.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/inc/CPbk2AddressSelectPhase.h Thu Aug 19 09:41:07 2010 +0300 @@ -81,6 +81,8 @@ TInt aExitCommandId ); void AcceptDelayedL( const TDesC8& aContactLinkBuffer ); + void DenyDelayedL( + const TDesC8& aContactLinkBuffer ); MVPbkContactLinkArray* Results() const; TInt ExtraResultData() const; MVPbkStoreContact* TakeStoreContact(); diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/inc/CPbk2AssignAttributePhase.h --- a/phonebookui/Phonebook2/ServerApplication/inc/CPbk2AssignAttributePhase.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/inc/CPbk2AssignAttributePhase.h Thu Aug 19 09:41:07 2010 +0300 @@ -79,6 +79,8 @@ TInt aExitCommandId ); void AcceptDelayedL( const TDesC8& aContactLinkBuffer ); + void DenyDelayedL( + const TDesC8& aContactLinkBuffer ); MVPbkContactLinkArray* Results() const; TInt ExtraResultData() const; MVPbkStoreContact* TakeStoreContact(); diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/inc/CPbk2AttributeAddressSelectPhase.h --- a/phonebookui/Phonebook2/ServerApplication/inc/CPbk2AttributeAddressSelectPhase.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/inc/CPbk2AttributeAddressSelectPhase.h Thu Aug 19 09:41:07 2010 +0300 @@ -82,6 +82,8 @@ TInt aExitCommandId ); void AcceptDelayedL( const TDesC8& aContactLinkBuffer ); + void DenyDelayedL( + const TDesC8& aContactLinkBuffer ); MVPbkContactLinkArray* Results() const; TInt ExtraResultData() const; MVPbkStoreContact* TakeStoreContact(); diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/inc/CPbk2CommAddressSelectPhase.h --- a/phonebookui/Phonebook2/ServerApplication/inc/CPbk2CommAddressSelectPhase.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/inc/CPbk2CommAddressSelectPhase.h Thu Aug 19 09:41:07 2010 +0300 @@ -127,6 +127,8 @@ TInt aExitCommandId ); void AcceptDelayedL( const TDesC8& aContactLinkBuffer ); + void DenyDelayedL( + const TDesC8& aContactLinkBuffer ); MVPbkContactLinkArray* Results() const; TInt ExtraResultData() const; MVPbkStoreContact* TakeStoreContact(); diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/inc/CPbk2ContactAttributeAssigner.h --- a/phonebookui/Phonebook2/ServerApplication/inc/CPbk2ContactAttributeAssigner.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/inc/CPbk2ContactAttributeAssigner.h Thu Aug 19 09:41:07 2010 +0300 @@ -67,6 +67,8 @@ void CancelService(); void AcceptDelayedContactsL( const TDesC8& aContactLinkBuffer ); + void DenyDelayedContactsL( + const TDesC8& aContactLinkBuffer ); void ExitServiceL( TInt aExitCommandId ); void ServiceResults(TServiceResults* aResults) const; diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/inc/CPbk2ContactFetchPhase.h --- a/phonebookui/Phonebook2/ServerApplication/inc/CPbk2ContactFetchPhase.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/inc/CPbk2ContactFetchPhase.h Thu Aug 19 09:41:07 2010 +0300 @@ -89,6 +89,8 @@ TInt aExitCommandId ); void AcceptDelayedL( const TDesC8& aContactLinkBuffer ); + void DenyDelayedL( + const TDesC8& aContactLinkBuffer ); MVPbkContactLinkArray* Results() const; TInt ExtraResultData() const; MVPbkStoreContact* TakeStoreContact(); diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/inc/CPbk2EntryFetcher.h --- a/phonebookui/Phonebook2/ServerApplication/inc/CPbk2EntryFetcher.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/inc/CPbk2EntryFetcher.h Thu Aug 19 09:41:07 2010 +0300 @@ -68,6 +68,8 @@ void CancelService(); void AcceptDelayedContactsL( const TDesC8& aContactLinkBuffer ); + void DenyDelayedContactsL( + const TDesC8& aContactLinkBuffer ); void ExitServiceL( TInt aExitCommandId ); void ServiceResults(TServiceResults* aResults) const; diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/inc/CPbk2ItemFetcher.h --- a/phonebookui/Phonebook2/ServerApplication/inc/CPbk2ItemFetcher.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/inc/CPbk2ItemFetcher.h Thu Aug 19 09:41:07 2010 +0300 @@ -71,6 +71,8 @@ void CancelService(); void AcceptDelayedContactsL( const TDesC8& aContactLinkBuffer ); + void DenyDelayedContactsL( + const TDesC8& aContactLinkBuffer ); void ExitServiceL( TInt aExitCommandId ); void ServiceResults(TServiceResults* aResults) const; diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/inc/CPbk2MultiAssignDataPhase.h --- a/phonebookui/Phonebook2/ServerApplication/inc/CPbk2MultiAssignDataPhase.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/inc/CPbk2MultiAssignDataPhase.h Thu Aug 19 09:41:07 2010 +0300 @@ -86,6 +86,8 @@ TInt aExitCommandId ); void AcceptDelayedL( const TDesC8& aContactLinkBuffer ); + void DenyDelayedL( + const TDesC8& aContactLinkBuffer ); MVPbkContactLinkArray* Results() const; TInt ExtraResultData() const; MVPbkStoreContact* TakeStoreContact(); diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/inc/CPbk2MultiContactDataAssigner.h --- a/phonebookui/Phonebook2/ServerApplication/inc/CPbk2MultiContactDataAssigner.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/inc/CPbk2MultiContactDataAssigner.h Thu Aug 19 09:41:07 2010 +0300 @@ -68,6 +68,8 @@ void CancelService(); void AcceptDelayedContactsL( const TDesC8& aContactLinkBuffer ); + void DenyDelayedContactsL( + const TDesC8& aContactLinkBuffer ); void ExitServiceL( TInt aExitCommandId ); void ServiceResults(TServiceResults* aResults) const; diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/inc/CPbk2PrepareAttributeAssignPhase.h --- a/phonebookui/Phonebook2/ServerApplication/inc/CPbk2PrepareAttributeAssignPhase.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/inc/CPbk2PrepareAttributeAssignPhase.h Thu Aug 19 09:41:07 2010 +0300 @@ -78,6 +78,8 @@ TInt aExitCommandId ); void AcceptDelayedL( const TDesC8& aContactLinkBuffer ); + void DenyDelayedL( + const TDesC8& aContactLinkBuffer ); MVPbkContactLinkArray* Results() const; TInt ExtraResultData() const; MVPbkStoreContact* TakeStoreContact(); diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/inc/CPbk2PrepareMultipleAssignPhase.h --- a/phonebookui/Phonebook2/ServerApplication/inc/CPbk2PrepareMultipleAssignPhase.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/inc/CPbk2PrepareMultipleAssignPhase.h Thu Aug 19 09:41:07 2010 +0300 @@ -81,6 +81,8 @@ TInt aExitCommandId ); void AcceptDelayedL( const TDesC8& aContactLinkBuffer ); + void DenyDelayedL( + const TDesC8& aContactLinkBuffer ); MVPbkContactLinkArray* Results() const; TInt ExtraResultData() const; MVPbkStoreContact* TakeStoreContact(); diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/inc/CPbk2PrepareSingleAssignPhase.h --- a/phonebookui/Phonebook2/ServerApplication/inc/CPbk2PrepareSingleAssignPhase.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/inc/CPbk2PrepareSingleAssignPhase.h Thu Aug 19 09:41:07 2010 +0300 @@ -83,6 +83,8 @@ TInt aExitCommandId ); void AcceptDelayedL( const TDesC8& aContactLinkBuffer ); + void DenyDelayedL( + const TDesC8& aContactLinkBuffer ); MVPbkContactLinkArray* Results() const; TInt ExtraResultData() const; MVPbkStoreContact* TakeStoreContact(); diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/inc/CPbk2SelectCreateEmptyPropertyPhase.h --- a/phonebookui/Phonebook2/ServerApplication/inc/CPbk2SelectCreateEmptyPropertyPhase.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/inc/CPbk2SelectCreateEmptyPropertyPhase.h Thu Aug 19 09:41:07 2010 +0300 @@ -72,6 +72,8 @@ TInt aExitCommandId ); void AcceptDelayedL( const TDesC8& aContactLinkBuffer ); + void DenyDelayedL( + const TDesC8& aContactLinkBuffer ); MVPbkContactLinkArray* Results() const; MVPbkStoreContact* TakeStoreContact(); TInt ExtraResultData() const; diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/inc/CPbk2SelectCreateNewPropertyPhase.h --- a/phonebookui/Phonebook2/ServerApplication/inc/CPbk2SelectCreateNewPropertyPhase.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/inc/CPbk2SelectCreateNewPropertyPhase.h Thu Aug 19 09:41:07 2010 +0300 @@ -78,6 +78,8 @@ TInt aExitCommandId ); void AcceptDelayedL( const TDesC8& aContactLinkBuffer ); + void DenyDelayedL( + const TDesC8& aContactLinkBuffer ); MVPbkContactLinkArray* Results() const; TInt ExtraResultData() const; MVPbkStoreContact* TakeStoreContact(); diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/inc/CPbk2SelectMultiplePropertyPhase.h --- a/phonebookui/Phonebook2/ServerApplication/inc/CPbk2SelectMultiplePropertyPhase.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/inc/CPbk2SelectMultiplePropertyPhase.h Thu Aug 19 09:41:07 2010 +0300 @@ -73,6 +73,8 @@ TInt aExitCommandId ); void AcceptDelayedL( const TDesC8& aContactLinkBuffer ); + void DenyDelayedL( + const TDesC8& aContactLinkBuffer ); MVPbkContactLinkArray* Results() const; TInt ExtraResultData() const; MVPbkStoreContact* TakeStoreContact(); diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/inc/CPbk2SelectSinglePropertyPhase.h --- a/phonebookui/Phonebook2/ServerApplication/inc/CPbk2SelectSinglePropertyPhase.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/inc/CPbk2SelectSinglePropertyPhase.h Thu Aug 19 09:41:07 2010 +0300 @@ -79,6 +79,8 @@ TInt aExitCommandId ); void AcceptDelayedL( const TDesC8& aContactLinkBuffer ); + void DenyDelayedL( + const TDesC8& aContactLinkBuffer ); MVPbkContactLinkArray* Results() const; TInt ExtraResultData() const; MVPbkStoreContact* TakeStoreContact(); diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/inc/CPbk2SelectUpdateEmptyPropertyPhase.h --- a/phonebookui/Phonebook2/ServerApplication/inc/CPbk2SelectUpdateEmptyPropertyPhase.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/inc/CPbk2SelectUpdateEmptyPropertyPhase.h Thu Aug 19 09:41:07 2010 +0300 @@ -76,6 +76,8 @@ TInt aExitCommandId ); void AcceptDelayedL( const TDesC8& aContactLinkBuffer ); + void DenyDelayedL( + const TDesC8& aContactLinkBuffer ); MVPbkContactLinkArray* Results() const; MVPbkStoreContact* TakeStoreContact(); TInt ExtraResultData() const; diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/inc/CPbk2SingleAssignDataPhase.h --- a/phonebookui/Phonebook2/ServerApplication/inc/CPbk2SingleAssignDataPhase.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/inc/CPbk2SingleAssignDataPhase.h Thu Aug 19 09:41:07 2010 +0300 @@ -91,6 +91,8 @@ TInt aExitCommandId ); void AcceptDelayedL( const TDesC8& aContactLinkBuffer ); + void DenyDelayedL( + const TDesC8& aContactLinkBuffer ); MVPbkContactLinkArray* Results() const; TInt ExtraResultData() const; MVPbkStoreContact* TakeStoreContact(); diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/inc/CPbk2SingleContactDataAssigner.h --- a/phonebookui/Phonebook2/ServerApplication/inc/CPbk2SingleContactDataAssigner.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/inc/CPbk2SingleContactDataAssigner.h Thu Aug 19 09:41:07 2010 +0300 @@ -70,6 +70,8 @@ void CancelService(); void AcceptDelayedContactsL( const TDesC8& aContactLinkBuffer ); + void DenyDelayedContactsL( + const TDesC8& aContactLinkBuffer ); void ExitServiceL( TInt aExitCommandId ); void ServiceResults(TServiceResults* aResults) const; diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/inc/MPbk2ServicePhase.h --- a/phonebookui/Phonebook2/ServerApplication/inc/MPbk2ServicePhase.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/inc/MPbk2ServicePhase.h Thu Aug 19 09:41:07 2010 +0300 @@ -68,6 +68,18 @@ const TDesC8& aContactLinkBuffer ) = 0; /** + * Notifies of delayed acception. + * + * Purpose: Sometimes client maybe deny the selected contact, + * the function is used to deliver the client's feedback to phonebook. + * + * @param aContactLinkBuffer Buffer containing denied + * contact links. + */ + virtual void DenyDelayedL( + const TDesC8& aContactLinkBuffer ) = 0; + + /** * Returns the results. * * @return Results. diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/inc/MPbk2UiService.h --- a/phonebookui/Phonebook2/ServerApplication/inc/MPbk2UiService.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/inc/MPbk2UiService.h Thu Aug 19 09:41:07 2010 +0300 @@ -68,6 +68,18 @@ const TDesC8& aContactLinkBuffer ) = 0; /** + * Deny the delayed contacts as part of + * the contact set used in the service. + * + * Purpose: Sometimes client maybe deny the selected contact, + * the function is used to deliver the client's feedback to phonebook. + * + * @param aContactLinkBuffer Denied contacts. + */ + virtual void DenyDelayedContactsL( + const TDesC8& aContactLinkBuffer) = 0; + + /** * Exits the service. * * @param aExitCommandId The id of the exit command. diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/src/CPbk2AddressSelectPhase.cpp --- a/phonebookui/Phonebook2/ServerApplication/src/CPbk2AddressSelectPhase.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2AddressSelectPhase.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -206,6 +206,16 @@ } // -------------------------------------------------------------------------- +// CPbk2AddressSelectPhase::DenyDelayed +// -------------------------------------------------------------------------- +// +void CPbk2AddressSelectPhase::DenyDelayedL + ( const TDesC8& /*aContactLinkBuffer*/ ) + { + // Nothing to deny + } + +// -------------------------------------------------------------------------- // CPbk2AddressSelectPhase::Results // -------------------------------------------------------------------------- // diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/src/CPbk2AssignAttributePhase.cpp --- a/phonebookui/Phonebook2/ServerApplication/src/CPbk2AssignAttributePhase.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2AssignAttributePhase.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -164,6 +164,16 @@ } // -------------------------------------------------------------------------- +// CPbk2AssignAttributePhase::DenyDelayed +// -------------------------------------------------------------------------- +// +void CPbk2AssignAttributePhase::DenyDelayedL + ( const TDesC8& /*aContactLinkBuffer*/ ) + { + // Nothing to do + } + +// -------------------------------------------------------------------------- // CPbk2AssignAttributePhase::Results // -------------------------------------------------------------------------- // diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/src/CPbk2AttributeAddressSelectPhase.cpp --- a/phonebookui/Phonebook2/ServerApplication/src/CPbk2AttributeAddressSelectPhase.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2AttributeAddressSelectPhase.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -199,6 +199,16 @@ } // -------------------------------------------------------------------------- +// CPbk2AttributeAddressSelectPhase::DenyDelayed +// -------------------------------------------------------------------------- +// +void CPbk2AttributeAddressSelectPhase::DenyDelayedL + ( const TDesC8& /*aContactLinkBuffer*/ ) + { + // Nothing to deny + } + +// -------------------------------------------------------------------------- // CPbk2AttributeAddressSelectPhase::Results // -------------------------------------------------------------------------- // diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/src/CPbk2CommAddressSelectPhase.cpp --- a/phonebookui/Phonebook2/ServerApplication/src/CPbk2CommAddressSelectPhase.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2CommAddressSelectPhase.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -307,6 +307,16 @@ } // -------------------------------------------------------------------------- +// CPbk2CommAddressSelectPhase::DenyDelayed +// -------------------------------------------------------------------------- +// +void CPbk2CommAddressSelectPhase::DenyDelayedL + ( const TDesC8& /*aContactLinkBuffer*/ ) + { + // Nothing to deny + } + +// -------------------------------------------------------------------------- // CPbk2CommAddressSelectPhase::Results // -------------------------------------------------------------------------- // diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/src/CPbk2ContactAttributeAssigner.cpp --- a/phonebookui/Phonebook2/ServerApplication/src/CPbk2ContactAttributeAssigner.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2ContactAttributeAssigner.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -268,6 +268,16 @@ } // -------------------------------------------------------------------------- +// CPbk2ContactAttributeAssigner::DenyDelayedContactsL +// -------------------------------------------------------------------------- +// +void CPbk2ContactAttributeAssigner::DenyDelayedContactsL + ( const TDesC8& /*aContactLinkBuffer*/ ) + { + // Do nothing + } + +// -------------------------------------------------------------------------- // CPbk2ContactAttributeAssigner::ExitServiceL // -------------------------------------------------------------------------- // diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/src/CPbk2ContactFetchPhase.cpp --- a/phonebookui/Phonebook2/ServerApplication/src/CPbk2ContactFetchPhase.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2ContactFetchPhase.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -186,6 +186,19 @@ } // -------------------------------------------------------------------------- +// CPbk2ContactFetchPhase::DenyDelayed +// -------------------------------------------------------------------------- +// +void CPbk2ContactFetchPhase::DenyDelayedL + ( const TDesC8& aContactLinkBuffer ) + { + if ( iFetchDlg ) + { + iFetchDlg->DenyDelayedFetchL( aContactLinkBuffer ); + } + } + +// -------------------------------------------------------------------------- // CPbk2ContactFetchPhase::Results // -------------------------------------------------------------------------- // diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/src/CPbk2EntryFetcher.cpp --- a/phonebookui/Phonebook2/ServerApplication/src/CPbk2EntryFetcher.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2EntryFetcher.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -190,6 +190,22 @@ } // -------------------------------------------------------------------------- +// CPbk2EntryFetcher::DenyDelayedContactsL +// -------------------------------------------------------------------------- +// +void CPbk2EntryFetcher::DenyDelayedContactsL + ( const TDesC8& aContactLinkBuffer ) + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING + ("CPbk2EntryFetcher::DenyDelayedContactsL()") ); + + if ( iFetchPhase ) + { + iFetchPhase->DenyDelayedL( aContactLinkBuffer ); + } + } + +// -------------------------------------------------------------------------- // CPbk2EntryFetcher::ExitServiceL // -------------------------------------------------------------------------- // diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/src/CPbk2FetchService.cpp --- a/phonebookui/Phonebook2/ServerApplication/src/CPbk2FetchService.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2FetchService.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -276,13 +276,23 @@ TPckg acceptedPkg( accepted ); aMessage.ReadL( KAcceptServiceSlot, acceptedPkg ); - if ( iUiService && accepted ) + if ( iUiService ) { HBufC8* buffer = HBufC8::NewLC( aMessage.GetDesMaxLengthL( KSelectedContactSlot ) ); TPtr8 ptr = buffer->Des(); aMessage.ReadL( KSelectedContactSlot, ptr ); - iUiService->AcceptDelayedContactsL( *buffer ); + + // If client accepts selected contact, call AcceptDelayedContacts + // Otherwise call DenyDelayedContactsL + if( accepted ) + { + iUiService->AcceptDelayedContactsL( *buffer ); + } + else + { + iUiService->DenyDelayedContactsL( *buffer ); + } CleanupStack::PopAndDestroy(); // buffer } diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/src/CPbk2ItemFetcher.cpp --- a/phonebookui/Phonebook2/ServerApplication/src/CPbk2ItemFetcher.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2ItemFetcher.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -409,6 +409,31 @@ iFetchPhase->AcceptDelayedL( aContactLinkBuffer ); } } +// -------------------------------------------------------------------------- +// CPbk2ItemFetcher::DenyDelayedContactsL +// -------------------------------------------------------------------------- +// +void CPbk2ItemFetcher::DenyDelayedContactsL + ( const TDesC8& aContactLinkBuffer ) + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING + ("CPbk2ItemFetcher::DenyDelayedContactsL()") ); + + if ( iAddressSelectPhase ) + { + iAddressSelectPhase->DenyDelayedL( aContactLinkBuffer ); + } + + if ( iCommAddressSelectPhase ) + { + iCommAddressSelectPhase->DenyDelayedL( aContactLinkBuffer ); + } + + if ( iFetchPhase ) + { + iFetchPhase->DenyDelayedL( aContactLinkBuffer ); + } + } // -------------------------------------------------------------------------- // CPbk2ItemFetcher::ExitServiceL diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/src/CPbk2MultiAssignDataPhase.cpp --- a/phonebookui/Phonebook2/ServerApplication/src/CPbk2MultiAssignDataPhase.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2MultiAssignDataPhase.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -206,6 +206,16 @@ } // -------------------------------------------------------------------------- +// CPbk2MultiAssignDataPhase::DenyDelayed +// -------------------------------------------------------------------------- +// +void CPbk2MultiAssignDataPhase::DenyDelayedL + ( const TDesC8& /*aContactLinkBuffer*/ ) + { + // Nothing to do + } + +// -------------------------------------------------------------------------- // CPbk2MultiAssignDataPhase::Results // -------------------------------------------------------------------------- // diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/src/CPbk2MultiContactDataAssigner.cpp --- a/phonebookui/Phonebook2/ServerApplication/src/CPbk2MultiContactDataAssigner.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2MultiContactDataAssigner.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -231,6 +231,16 @@ } // -------------------------------------------------------------------------- +// CPbk2MultiContactDataAssigner::AcceptDelayedContactsL +// -------------------------------------------------------------------------- +// +void CPbk2MultiContactDataAssigner::DenyDelayedContactsL + ( const TDesC8& /*aContactLinkBuffer*/ ) + { + // Do nothing + } + +// -------------------------------------------------------------------------- // CPbk2MultiContactDataAssigner::ExitServiceL // -------------------------------------------------------------------------- // diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/src/CPbk2PrepareAttributeAssignPhase.cpp --- a/phonebookui/Phonebook2/ServerApplication/src/CPbk2PrepareAttributeAssignPhase.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2PrepareAttributeAssignPhase.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -204,6 +204,16 @@ } // -------------------------------------------------------------------------- +// CPbk2PrepareAttributeAssignPhase::DenyDelayed +// -------------------------------------------------------------------------- +// +void CPbk2PrepareAttributeAssignPhase::DenyDelayedL + ( const TDesC8& /*aContactLinkBuffer*/ ) + { + // Nothing to do + } + +// -------------------------------------------------------------------------- // CPbk2PrepareAttributeAssignPhase::Results // -------------------------------------------------------------------------- // diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/src/CPbk2PrepareSingleAssignPhase.cpp --- a/phonebookui/Phonebook2/ServerApplication/src/CPbk2PrepareSingleAssignPhase.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2PrepareSingleAssignPhase.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -191,6 +191,16 @@ } // -------------------------------------------------------------------------- +// CPbk2PrepareSingleAssignPhase::DenyDelayed +// -------------------------------------------------------------------------- +// +void CPbk2PrepareSingleAssignPhase::DenyDelayedL + ( const TDesC8& /*aContactLinkBuffer*/ ) + { + // Nothing to do + } + +// -------------------------------------------------------------------------- // CPbk2PrepareSingleAssignPhase::Results // -------------------------------------------------------------------------- // diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/src/CPbk2SelectCreateEmptyPropertyPhase.cpp --- a/phonebookui/Phonebook2/ServerApplication/src/CPbk2SelectCreateEmptyPropertyPhase.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2SelectCreateEmptyPropertyPhase.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -127,6 +127,16 @@ } // -------------------------------------------------------------------------- +// CPbk2SelectCreateEmptyPropertyPhase::DenyDelayed +// -------------------------------------------------------------------------- +// +void CPbk2SelectCreateEmptyPropertyPhase::DenyDelayedL + ( const TDesC8& /*aContactLinkBuffer*/ ) + { + // Nothing to do + } + +// -------------------------------------------------------------------------- // CPbk2SelectCreateEmptyPropertyPhase::Results // -------------------------------------------------------------------------- // diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/src/CPbk2SelectCreateNewPropertyPhase.cpp --- a/phonebookui/Phonebook2/ServerApplication/src/CPbk2SelectCreateNewPropertyPhase.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2SelectCreateNewPropertyPhase.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -153,6 +153,16 @@ } // -------------------------------------------------------------------------- +// CPbk2SelectCreateNewPropertyPhase::DenyDelayed +// -------------------------------------------------------------------------- +// +void CPbk2SelectCreateNewPropertyPhase::DenyDelayedL + ( const TDesC8& /*aContactLinkBuffer*/ ) + { + // Nothing to do + } + +// -------------------------------------------------------------------------- // CPbk2SelectCreateNewPropertyPhase::Results // -------------------------------------------------------------------------- // diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/src/CPbk2SelectMultiplePropertyPhase.cpp --- a/phonebookui/Phonebook2/ServerApplication/src/CPbk2SelectMultiplePropertyPhase.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2SelectMultiplePropertyPhase.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -180,6 +180,16 @@ } // -------------------------------------------------------------------------- +// CPbk2SelectMultiplePropertyPhase::DenyDelayed +// -------------------------------------------------------------------------- +// +void CPbk2SelectMultiplePropertyPhase::DenyDelayedL + ( const TDesC8& /*aContactLinkBuffer*/ ) + { + // Nothing to do + } + +// -------------------------------------------------------------------------- // CPbk2SelectMultiplePropertyPhase::Results // -------------------------------------------------------------------------- // diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/src/CPbk2SelectSinglePropertyPhase.cpp --- a/phonebookui/Phonebook2/ServerApplication/src/CPbk2SelectSinglePropertyPhase.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2SelectSinglePropertyPhase.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -182,6 +182,16 @@ } // -------------------------------------------------------------------------- +// CPbk2SelectSinglePropertyPhase::DenyDelayed +// -------------------------------------------------------------------------- +// +void CPbk2SelectSinglePropertyPhase::DenyDelayedL + ( const TDesC8& /*aContactLinkBuffer*/ ) + { + // Nothing to do + } + +// -------------------------------------------------------------------------- // CPbk2SelectSinglePropertyPhase::Results // -------------------------------------------------------------------------- // diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/src/CPbk2SelectUpdateEmptyPropertyPhase.cpp --- a/phonebookui/Phonebook2/ServerApplication/src/CPbk2SelectUpdateEmptyPropertyPhase.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2SelectUpdateEmptyPropertyPhase.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -162,6 +162,16 @@ } // -------------------------------------------------------------------------- +// CPbk2SelectUpdateEmptyPropertyPhase::DenyDelayed +// -------------------------------------------------------------------------- +// +void CPbk2SelectUpdateEmptyPropertyPhase::DenyDelayedL + ( const TDesC8& /*aContactLinkBuffer*/ ) + { + // Nothing to do + } + +// -------------------------------------------------------------------------- // CPbk2SelectUpdateEmptyPropertyPhase::Results // -------------------------------------------------------------------------- // diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/src/CPbk2SingleAssignDataPhase.cpp --- a/phonebookui/Phonebook2/ServerApplication/src/CPbk2SingleAssignDataPhase.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2SingleAssignDataPhase.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -174,6 +174,16 @@ } // -------------------------------------------------------------------------- +// CPbk2SingleAssignDataPhase::DenyDelayed +// -------------------------------------------------------------------------- +// +void CPbk2SingleAssignDataPhase::DenyDelayedL + ( const TDesC8& /*aContactLinkBuffer*/ ) + { + // Nothing to do + } + +// -------------------------------------------------------------------------- // CPbk2SingleAssignDataPhase::Results // -------------------------------------------------------------------------- // @@ -540,9 +550,16 @@ void CPbk2SingleAssignDataPhase::FinalizeL ( const MVPbkStoreContact* aStoreContact ) { + TBool thisDestroyed = EFalse; + iDestroyedPtr = &thisDestroyed; + AppendResultL( aStoreContact ); - DisplayNotesL(); - iObserver.NextPhase( *this ); + DisplayNotesL(); + + if ( !thisDestroyed ) + { + iObserver.NextPhase( *this ); + } } // End of File diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/src/CPbk2SingleContactDataAssigner.cpp --- a/phonebookui/Phonebook2/ServerApplication/src/CPbk2SingleContactDataAssigner.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2SingleContactDataAssigner.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -236,6 +236,16 @@ } // -------------------------------------------------------------------------- +// CPbk2SingleContactDataAssigner::DenyDelayedContactsL +// -------------------------------------------------------------------------- +// +void CPbk2SingleContactDataAssigner::DenyDelayedContactsL + ( const TDesC8& /*aContactLinkBuffer*/ ) + { + // Do nothing + } + +// -------------------------------------------------------------------------- // CPbk2SingleContactDataAssigner::ExitServiceL // -------------------------------------------------------------------------- // diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ServerApplication/src/cpbk2preparemultipleassignphase.cpp --- a/phonebookui/Phonebook2/ServerApplication/src/cpbk2preparemultipleassignphase.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ServerApplication/src/cpbk2preparemultipleassignphase.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -212,6 +212,16 @@ } // -------------------------------------------------------------------------- +// CPbk2PrepareMultipleAssignPhase::DenyDelayed +// -------------------------------------------------------------------------- +// +void CPbk2PrepareMultipleAssignPhase::DenyDelayedL + ( const TDesC8& /*aContactLinkBuffer*/ ) + { + // Nothing to do + } + +// -------------------------------------------------------------------------- // CPbk2PrepareMultipleAssignPhase::Results // -------------------------------------------------------------------------- // diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/inc/CPbk2ContactEditorDlgImpl.h --- a/phonebookui/Phonebook2/UIControls/inc/CPbk2ContactEditorDlgImpl.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/inc/CPbk2ContactEditorDlgImpl.h Thu Aug 19 09:41:07 2010 +0300 @@ -373,6 +373,8 @@ TEventCode aType ); void RestorePrevNaviDecoratorL(); void RestoreStatusPaneL(); + static TInt DelayDlgDeleteCallBack( TAny* aCallBack ); + void DelayDlgDelete(); private: // Data structures @@ -472,6 +474,8 @@ CAknNavigationDecorator* iPrevNaviDecorator; TInt iCurrentstatuspane; + /// Own: For asynchronously delete editordlg. + CIdle* iDelayDelete; }; #endif // CPBK2CONTACTEDITORDLGIMPL_H diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/inc/CPbk2ContactEditorUIAddressField.h --- a/phonebookui/Phonebook2/UIControls/inc/CPbk2ContactEditorUIAddressField.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/inc/CPbk2ContactEditorUIAddressField.h Thu Aug 19 09:41:07 2010 +0300 @@ -61,6 +61,7 @@ void ActivateL(); TInt ControlId(); TBool HandleCustomFieldCommandL(TInt aCommand); + TBool ConsumesKeyEvent( const TKeyEvent& aKeyEvent, TEventCode aType ); private: diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/inc/CPbk2ContactViewListBox.h --- a/phonebookui/Phonebook2/UIControls/inc/CPbk2ContactViewListBox.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/inc/CPbk2ContactViewListBox.h Thu Aug 19 09:41:07 2010 +0300 @@ -178,6 +178,14 @@ void HandlePopupCharacter( CWindowGc* aGc, const TRect& aRectOfListBoxItem ) const; + /** + * Set the state of the Marking mode + */ + inline void SetMarkingModeState( TBool aActived ) + { + iMarkingModeOn = aActived; + } + public: // From MPbk2ClipListBoxText TBool ClipFromBeginning( TDes& aBuffer, @@ -226,6 +234,9 @@ TBool IsContact( TInt aIndex ) const; + private: + void RecalcWidthInMarkingMode( TInt& aWidth, const CFont& aFont, TChar aChar ); + private: // Data structures /// Data loaded from resources struct TResourceData @@ -266,6 +277,8 @@ CPbk2PredictiveSearchFilter &iSearchFilter; // ref: used fro checking command item count CCoeControl& iContainer; + // Flag to indicate whether Marking mode is active + TBool iMarkingModeOn; }; diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/inc/CPbk2FetchResults.h --- a/phonebookui/Phonebook2/UIControls/inc/CPbk2FetchResults.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/inc/CPbk2FetchResults.h Thu Aug 19 09:41:07 2010 +0300 @@ -35,6 +35,7 @@ class MPbk2FetchDlgPages; class MPbk2FetchDlgObserver; class MPbk2FetchResultsObserver; +class CAknInputBlock; // CLASS DECLARATION @@ -88,7 +89,15 @@ */ void AppendDelayedL( const MVPbkContactLink& aLink ); - + + /** + * Deny to Append a delayed contact link to selection. + * + * @param aLink The link to deny append. + */ + void DenyAppendDelayedL( + const MVPbkContactLink& aLink ); + /** * Appends a contact link to fetch results. * @@ -110,6 +119,10 @@ */ void ResetAndDestroy(); + /** + * Wait operations to complete + */ + void WaitOperationsCompleteL(); public: // From MVPbkContactLinkArray TInt Count() const; const MVPbkContactLink& At( @@ -233,6 +246,12 @@ CArrayFixFlat* iOperationQueue; /// Own: Contact retrieve operation MVPbkContactOperationBase* iRetrieveOperation; + /// Own: Is it waiting the acceptance, initialized to EFalse + TBool iWaitingForDelayedAppend; + /// Own: Wait until finish contact store operation + CActiveSchedulerWait* iWaitForAllOperationComplete; + /// Own: User input blocker + CAknInputBlock* iInputBlock; }; #endif // CPBK2FETCHRESULTS_H diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/inc/CPbk2NamesListEmptyState.h --- a/phonebookui/Phonebook2/UIControls/inc/CPbk2NamesListEmptyState.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/inc/CPbk2NamesListEmptyState.h Thu Aug 19 09:41:07 2010 +0300 @@ -187,7 +187,8 @@ TInt CalculateListboxIndex(TInt aCommandIndex) const; void UnsubscribeCmdItemsVisibility() const; void SubscribeCmdItemsVisibility(); - void HandleListboxEventL(TInt aEvent, TInt aListboxIndex, TBool aMantainFocus); + void HandleListboxEventL(TInt aEvent, TInt aListboxIndex, TBool aMantainFocus); + TInt EnabledCommandCount() const; private: // Data /// Ref: Parent coecontrol diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/inc/CPbk2NamesListFilteredState.h --- a/phonebookui/Phonebook2/UIControls/inc/CPbk2NamesListFilteredState.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/inc/CPbk2NamesListFilteredState.h Thu Aug 19 09:41:07 2010 +0300 @@ -208,7 +208,8 @@ TInt CalculateListboxIndex(TInt aCommandIndex) const; void UnsubscribeCmdItemsVisibility() const; void SubscribeCmdItemsVisibility(); - void HandleListboxEventL(TInt aEvent, TInt aListboxIndex, TBool aMantainFocus); + void HandleListboxEventL(TInt aEvent, TInt aListboxIndex, TBool aMantainFocus); + TInt EnabledCommandCount() const; private: // Data /// Ref: Parent coecontrol diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/inc/CPbk2SettingsListState.h --- a/phonebookui/Phonebook2/UIControls/inc/CPbk2SettingsListState.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/inc/CPbk2SettingsListState.h Thu Aug 19 09:41:07 2010 +0300 @@ -55,6 +55,13 @@ * @return Selection item list. */ CSelectionItemList& SelectionItemList(); + + /** + * Returns a copy of selection item list. + * + * @return old item list state. + */ + CSelectionItemList& ItemListState(); /** * Returns supported store configuration. diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/inc/cpbk2contactviewcustomlistboxdata.h --- a/phonebookui/Phonebook2/UIControls/inc/cpbk2contactviewcustomlistboxdata.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/inc/cpbk2contactviewcustomlistboxdata.h Thu Aug 19 09:41:07 2010 +0300 @@ -102,8 +102,8 @@ */ TRgb iHighlightedBack; }; -//Start of Code Added for PhoneBook2 -public: //Function below are added to suit PhoneBook2 Requirements + +public: /** * Set internal data model to work with special PCS data @@ -148,12 +148,11 @@ */ void SetListCommands( const RPointerArray* aCommands ); -private: TBool IsContactAtListboxIndex( TInt aListboxIndex ) const; + +private: TInt CommandItemCount() const; -//End of Code Added for PhoneBook2 - public: /** diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/inc/cpbk2contactviewcustomlistboxitemdrawer.h --- a/phonebookui/Phonebook2/UIControls/inc/cpbk2contactviewcustomlistboxitemdrawer.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/inc/cpbk2contactviewcustomlistboxitemdrawer.h Thu Aug 19 09:41:07 2010 +0300 @@ -200,17 +200,7 @@ protected: -#ifndef RD_TOUCH2 - /** - * Draw the item background. - * - * Internal member, not intended for use. - * - * @param aRect Drawing area. - */ - void DrawCurrentItemRect(const TRect& aRect) const; -#endif /** * Array of properties. diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/src/CPbk2ContactEditorDlgImpl.cpp --- a/phonebookui/Phonebook2/UIControls/src/CPbk2ContactEditorDlgImpl.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/src/CPbk2ContactEditorDlgImpl.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -207,14 +207,14 @@ } if( iAppServices ) - { - iAppServices->StoreObservationRegister().DeregisterStoreEvents( *this ); - } + { + iAppServices->StoreObservationRegister().DeregisterStoreEvents( *this ); + } else - { - Phonebook2::Pbk2AppUi()->ApplicationServices(). - StoreObservationRegister().DeregisterStoreEvents( *this ); - } + { + Phonebook2::Pbk2AppUi()->ApplicationServices(). + StoreObservationRegister().DeregisterStoreEvents( *this ); + } if ( iEikonEnv && iContextMenuBar ) { @@ -237,12 +237,13 @@ delete iEditorExtension; delete iUiFieldArray; Release(iExtensionManager); - delete iTitleText; + delete iTitleText; iTitleText = NULL; delete iStoredTitlePaneText; iStoredTitlePaneText = NULL; delete iConverter; + delete iDelayDelete; } // -------------------------------------------------------------------------- @@ -256,7 +257,7 @@ MPbk2EditedContactObserver& aContactObserver, MPbk2ContactEditorStrategy& aEditorStrategy, MPbk2ContactEditorContactRelocator& aRelocator) - { + { CPbk2ContactEditorDlgImpl* self = new ( ELeave ) CPbk2ContactEditorDlgImpl(aParams, aContact, aFieldProperties, aContactObserver, @@ -272,24 +273,24 @@ // -------------------------------------------------------------------------- // CPbk2ContactEditorDlgImpl* CPbk2ContactEditorDlgImpl::NewL( - TPbk2ContactEditorParams& aParams, - CPbk2PresentationContact& aContact, - CPbk2FieldPropertyArray& aFieldProperties, - MPbk2EditedContactObserver& aContactObserver, - MPbk2ContactEditorStrategy& aEditorStrategy, - MPbk2ContactEditorContactRelocator& aRelocator, - MPbk2ApplicationServices* aAppServices, - HBufC* aTitleText ) - { - CPbk2ContactEditorDlgImpl* self = - new ( ELeave ) CPbk2ContactEditorDlgImpl(aParams, aContact, - aFieldProperties, aContactObserver, - aEditorStrategy, aRelocator, aAppServices, aTitleText ); - CleanupStack::PushL(self); - self->ConstructL(); - CleanupStack::Pop(self); - return self; - } + TPbk2ContactEditorParams& aParams, + CPbk2PresentationContact& aContact, + CPbk2FieldPropertyArray& aFieldProperties, + MPbk2EditedContactObserver& aContactObserver, + MPbk2ContactEditorStrategy& aEditorStrategy, + MPbk2ContactEditorContactRelocator& aRelocator, + MPbk2ApplicationServices* aAppServices, + HBufC* aTitleText ) + { + CPbk2ContactEditorDlgImpl* self = + new ( ELeave ) CPbk2ContactEditorDlgImpl(aParams, aContact, + aFieldProperties, aContactObserver, + aEditorStrategy, aRelocator, aAppServices, aTitleText ); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } // -------------------------------------------------------------------------- // CPbk2ContactEditorDlgImpl::ConstructL @@ -335,20 +336,20 @@ // iContact's store becomes unavailable. /* - * Use iAppServices if provided. This is to enable editor use outside from pbk2 context - */ + * Use iAppServices if provided. This is to enable editor use outside from pbk2 context + */ if( iAppServices ) - { - iAppServices->StoreObservationRegister().RegisterStoreEventsL( *this ); - iNameFormatter = &iAppServices->NameFormatter(); - } + { + iAppServices->StoreObservationRegister().RegisterStoreEventsL( *this ); + iNameFormatter = &iAppServices->NameFormatter(); + } else - { - Phonebook2::Pbk2AppUi()->ApplicationServices(). - StoreObservationRegister().RegisterStoreEventsL( *this ); - iNameFormatter = - &Phonebook2::Pbk2AppUi()->ApplicationServices().NameFormatter(); - } + { + Phonebook2::Pbk2AppUi()->ApplicationServices(). + StoreObservationRegister().RegisterStoreEventsL( *this ); + iNameFormatter = + &Phonebook2::Pbk2AppUi()->ApplicationServices().NameFormatter(); + } StoreTitlePaneTextL(); @@ -357,24 +358,24 @@ iExtensionManager = CPbk2UIExtensionManager::InstanceL(); /* - * Use iAppServices if provided. This is to enable editor use outside from pbk2 context - */ + * Use iAppServices if provided. This is to enable editor use outside from pbk2 context + */ CVPbkContactManager* manager = NULL; if( iAppServices ) - { - manager = &iAppServices->ContactManager(); - } + { + manager = &iAppServices->ContactManager(); + } else - { - manager = &Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager(); - } + { + manager = &Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager(); + } iEditorExtension = iExtensionManager->FactoryL()-> CreatePbk2ContactEditorExtensionL( *manager, iContact, *this ); iFieldFactory = CPbk2ContactEditorFieldFactory::NewL(*this, *iEditorExtension); iUiFieldArray = CPbk2ContactEditorFieldArray::NewL( - *manager, iContact, *this, *iFieldFactory, iAppServices ); + *manager, iContact, *this, *iFieldFactory, iAppServices ); iUseState = EUseReady; } @@ -781,7 +782,7 @@ iEditorExtension->ModifyButtonGroupContainerL(ButtonGroupContainer()); ConstructNaviPaneL(); - UpdateTitleL(); + UpdateTitleL(); UpdateTitlePictureL(); } @@ -1158,6 +1159,37 @@ iAddressView = NULL; iParams.iActiveView = TPbk2ContactEditorParams::EEditorView; UpdateControlsL(); + + // The if-expression refers to the situation that need to + // delete editor dialog after address dialog exit completely, + // such as the store-unavailable situation + if ( iDelayDelete ) + { + iDelayDelete->Start( TCallBack( &DelayDlgDeleteCallBack, this ) ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2ContactEditorDlgImpl::DelayDlgDeleteCallBack +// -------------------------------------------------------------------------- +// +TInt CPbk2ContactEditorDlgImpl::DelayDlgDeleteCallBack( TAny* aCallBack ) + { + static_cast( aCallBack )->DelayDlgDelete(); + return EFalse; + } + +// -------------------------------------------------------------------------- +// CPbk2ContactEditorDlgImpl::DelayDlgDelete +// -------------------------------------------------------------------------- +// +void CPbk2ContactEditorDlgImpl::DelayDlgDelete() + { + // Need to inform editor-observer that contact editing is + // aborted, at the same time, exit editor dialog directly + // without saving the changes. + iContactObserver.ContactEditingAborted(); + delete this; } // -------------------------------------------------------------------------- @@ -1934,7 +1966,7 @@ // void CPbk2ContactEditorDlgImpl::CloseDialog() { - // Ignor error and close editor without further user interaction + // Ignore error and close editor without further user interaction MVPbkContactObserver::TContactOpResult exitResult; exitResult.iExtension = NULL; exitResult.iStoreContact = NULL; @@ -1957,7 +1989,7 @@ } ContactEditorOperationCompleted(exitResult, exitParams); - } + } // -------------------------------------------------------------------------- // CPbk2ContactEditorDlgImpl::ContactEditorOperationFailed @@ -2329,24 +2361,22 @@ { if ( &aContactStore == &iContact.ParentStore() ) { - /* - * Use iAppServices if provided. This is to enable editor use outside from pbk2 context - */ + // Use iAppServices if provided. This is to enable editor use outside from pbk2 context const CPbk2StoreProperty* property = NULL; if( iAppServices ) - { - property = - iAppServices->StoreProperties().FindProperty - ( aContactStore.StoreProperties().Uri() ); - } + { + property = + iAppServices->StoreProperties().FindProperty + ( aContactStore.StoreProperties().Uri() ); + } else - { - property = - Phonebook2::Pbk2AppUi()->ApplicationServices(). - StoreProperties().FindProperty - ( aContactStore.StoreProperties().Uri() ); - } - + { + property = + Phonebook2::Pbk2AppUi()->ApplicationServices(). + StoreProperties().FindProperty + ( aContactStore.StoreProperties().Uri() ); + } + TPtrC storeName; if ( property ) @@ -2358,11 +2388,26 @@ // Cannot do anything about that TRAP_IGNORE( ShowStoreNotAvailableNoteL( storeName ) ); - // Close editor if store which came unavailable is iContact's store - iContactObserver.ContactEditingAborted(); - // TryExitL is not called because it would call OkToExitL - // which is not wanted - delete this; + // If the address dialog is opened, delete address dialog first, + // then after address dialog exit completely, delete the editor dialog + // via DelayDlgDeleteCallBack; if there isn't the address dialog, + // delete editor dialog directly. + if (iAddressView ) + { + // Create the CIdle object to delete editor dialog later. + if ( !iDelayDelete ) + { + iDelayDelete = CIdle::NewL( CActive::EPriorityStandard ); + } + delete iAddressView; + } + else + { + // At the store unavailable situation, informs editor observer + // that contact editing is aborted without saving the changes. + iContactObserver.ContactEditingAborted(); + delete this; + } } } @@ -2475,24 +2520,24 @@ switch (iParams.iActiveView) { case TPbk2ContactEditorParams::EEditorAddressView: - if( !iTitleText ) - { - title = StringLoader::LoadL(R_QTN_PHOB_HEADER_ADDRESS); - } + if( !iTitleText ) + { + title = StringLoader::LoadL(R_QTN_PHOB_HEADER_ADDRESS); + } break; case TPbk2ContactEditorParams::EEditorAddressHomeView: - if( !iTitleText ) - { - title = StringLoader::LoadL( - R_QTN_PHOB_HEADER_ADDRESS_HOME); - } + if( !iTitleText ) + { + title = StringLoader::LoadL( + R_QTN_PHOB_HEADER_ADDRESS_HOME); + } break; case TPbk2ContactEditorParams::EEditorAddressOfficeView: - if( !iTitleText ) - { - title = StringLoader::LoadL( - R_QTN_PHOB_HEADER_ADDRESS_WORK); - } + if( !iTitleText ) + { + title = StringLoader::LoadL( + R_QTN_PHOB_HEADER_ADDRESS_WORK); + } break; case TPbk2ContactEditorParams::EEditorView: { @@ -2529,10 +2574,10 @@ } } if( !iTitleText ) - { - title = iNameFormatter->GetContactTitleOrNullL(iStoreContact->Fields(), - KEditorNameFormatFlags); - } + { + title = iNameFormatter->GetContactTitleOrNullL(iStoreContact->Fields(), + KEditorNameFormatFlags); + } break; } default: @@ -2541,20 +2586,20 @@ // if custom title text is provided if( iTitleText ) - { - iTitlePane->SetTextL( iTitleText->Des() ); - } + { + iTitlePane->SetTextL( iTitleText->Des() ); + } else - { - if (title) - { - iTitlePane->SetText(title); - } - else - { - iTitlePane->SetTextL(iEditorStrategy.DefaultTitle()); - } - } + { + if (title) + { + iTitlePane->SetText(title); + } + else + { + iTitlePane->SetTextL(iEditorStrategy.DefaultTitle()); + } + } } CEikStatusPane* statusPane = iAvkonAppUi->StatusPane(); @@ -2580,24 +2625,24 @@ // Update picture in title pane /* - * Use iAppServices if provided. This is to enable editor use outside from pbk2 context - */ + * Use iAppServices if provided. This is to enable editor use outside from pbk2 context + */ CEikImage* image = NULL; if( iAppServices ) - { - image = - Pbk2TitlePanePictureFactory::CreateTitlePanePictureLC - ( &iContact.StoreContact(), - iAppServices->StoreProperties() ); - } + { + image = + Pbk2TitlePanePictureFactory::CreateTitlePanePictureLC + ( &iContact.StoreContact(), + iAppServices->StoreProperties() ); + } else - { - image = - Pbk2TitlePanePictureFactory::CreateTitlePanePictureLC - ( &iContact.StoreContact(), - Phonebook2::Pbk2AppUi()->ApplicationServices(). - StoreProperties() ); - } + { + image = + Pbk2TitlePanePictureFactory::CreateTitlePanePictureLC + ( &iContact.StoreContact(), + Phonebook2::Pbk2AppUi()->ApplicationServices(). + StoreProperties() ); + } // ownership of the picture is transfered to title pane @@ -2687,7 +2732,7 @@ // Dialog is closed so there is nothing to do if // HandleCommandL leaves. - TRAP_IGNORE(CEikonEnv::Static()->EikAppUi()->HandleCommandL(aCommandId)); + TRAP_IGNORE(CEikonEnv::Static()->EikAppUi()->HandleCommandL(aCommandId)); } } @@ -2981,9 +3026,9 @@ CloseDialog(); } else - { - iExitRecord.Clear( EExitOrdered ); - } + { + iExitRecord.Clear( EExitOrdered ); + } } } } @@ -3360,8 +3405,8 @@ // void CPbk2ContactEditorDlgImpl::CheckCurrentFieldTextL( CPbk2ContactEditorArrayItem* aCurrentField, - const TKeyEvent& aKeyEvent, - TEventCode aType ) + const TKeyEvent& aKeyEvent, + TEventCode aType ) { MPbk2ContactEditorField* editorField = aCurrentField->ContactEditorField(); if ( editorField ) diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/src/CPbk2ContactEditorImageField.cpp --- a/phonebookui/Phonebook2/UIControls/src/CPbk2ContactEditorImageField.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/src/CPbk2ContactEditorImageField.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -292,8 +292,16 @@ // ----------------------------------------------------------------------------- // TBool CPbk2ContactEditorImageField::ConsumesKeyEvent - ( const TKeyEvent& /*aKeyEvent*/, TEventCode /*aType*/ ) + ( const TKeyEvent& aKeyEvent, TEventCode aType ) { + + TKeyResponse keyResponse = iControl->OfferKeyEventL( aKeyEvent, aType ); + + if ( EKeyWasConsumed == keyResponse ) + { + return ETrue; + } + return EFalse; } diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/src/CPbk2ContactEditorNewContact.cpp --- a/phonebookui/Phonebook2/UIControls/src/CPbk2ContactEditorNewContact.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/src/CPbk2ContactEditorNewContact.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -224,14 +224,14 @@ ( "CPbk2ContactEditorNewContact::HandleIdleDelete(0x%x)" ), this ); iInputAbsorber->StopWait(); - MPbk2ContactEditorEventObserver* observer = iObserver; - iObserver = NULL; - MVPbkContactObserver::TContactOpResult result; - // Disable warnings by nulling the data members - result.iStoreContact = NULL; - result.iExtension = NULL; - result.iOpCode = MVPbkContactObserver::EContactDelete; - observer->ContactEditorOperationCompleted( result, iEditorParams ); + // Notify client asynchronously to let Delete Operation complete firstly and + // then the client will be notified to do the other things in the RunL() function. + iLatestResult.iExtension = NULL; + iLatestResult.iStoreContact = NULL; + iLatestResult.iOpCode = MVPbkContactObserver::EContactDelete; + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + SetActive(); } // -------------------------------------------------------------------------- diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/src/CPbk2ContactEditorReadonlyField.cpp --- a/phonebookui/Phonebook2/UIControls/src/CPbk2ContactEditorReadonlyField.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/src/CPbk2ContactEditorReadonlyField.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -25,6 +25,9 @@ #include #include #include +#include +#include + /// Unnamed namespace for local definitions namespace @@ -127,7 +130,7 @@ case EKeyDelete: case EKeyBackspace: { - if (iPbk2ContactEditorField) + if (iPbk2ContactEditorField && !iPbk2ContactEditorField->ContactField().FieldData().IsEmpty() ) { MPbk2ContactEditorField2* tempContactEditorField = reinterpret_cast (iPbk2ContactEditorField->ContactEditorFieldExtension( diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/src/CPbk2ContactEditorRingtoneField.cpp --- a/phonebookui/Phonebook2/UIControls/src/CPbk2ContactEditorRingtoneField.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/src/CPbk2ContactEditorRingtoneField.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -281,8 +281,15 @@ // ----------------------------------------------------------------------------- // TBool CPbk2ContactEditorRingtoneField::ConsumesKeyEvent - ( const TKeyEvent& /*aKeyEvent*/, TEventCode /*aType*/ ) + ( const TKeyEvent& aKeyEvent, TEventCode aType ) { + TKeyResponse keyResponse = iControl->OfferKeyEventL( aKeyEvent, aType ); + + if ( EKeyWasConsumed == keyResponse ) + { + return ETrue; + } + return EFalse; } diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/src/CPbk2ContactEditorUIAddressField.cpp --- a/phonebookui/Phonebook2/UIControls/src/CPbk2ContactEditorUIAddressField.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/src/CPbk2ContactEditorUIAddressField.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -152,5 +152,22 @@ iControl->SetTextL(&aText); } +// ----------------------------------------------------------------------------- +// CPbk2ContactEditorUIAddressField::ConsumesKeyEvent +// ----------------------------------------------------------------------------- +// +TBool CPbk2ContactEditorUIAddressField::ConsumesKeyEvent + ( const TKeyEvent& aKeyEvent, TEventCode aType ) + { + TKeyResponse keyResponse = iControl->OfferKeyEventL( aKeyEvent, aType ); + + if ( EKeyWasConsumed == keyResponse ) + { + return ETrue; + } + + return EFalse; + } + // End of File diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/src/CPbk2ContactViewListBox.cpp --- a/phonebookui/Phonebook2/UIControls/src/CPbk2ContactViewListBox.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/src/CPbk2ContactViewListBox.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -41,6 +41,7 @@ #include #include +#include // Debugging headers #include @@ -59,6 +60,7 @@ // LOCAL FUNCTIONS _LIT( KTabChar, "\t" ); +const TInt KCheckboxMargin = 1; // Checkbox margin pixels /** * Returns icon array from given list box. @@ -109,7 +111,8 @@ iContainer(aContainer), iChangedIndexes( 1 ), // allocation granularity iUiExtension( aUiExtension ), - iSearchFilter( aSearchFilter ) + iSearchFilter( aSearchFilter ), + iMarkingModeOn( EFalse ) { } @@ -442,9 +445,28 @@ TBool CPbk2ContactViewListBox::ClipFromBeginning ( TDes& aBuffer, TInt aItemIndex, TInt aSubCellNumber ) { - return AknTextUtils::ClipToFit( aBuffer, - AknTextUtils::EClipFromBeginning, this, aItemIndex, - aSubCellNumber ); + CColumnListBoxData *data = ItemDrawer()->ColumnData(); + const CFont *font = + data->Font(ItemDrawer()->Properties(aItemIndex), aSubCellNumber); + // The width of the subcell displaying the characters. + TInt cellWidth = data->ColumnWidthPixel(aSubCellNumber); + // The margin of the subcell. + TMargins margin = data->ColumnMargins(aSubCellNumber); + // The valid width width displaying the characters. + TInt width = cellWidth - margin.iLeft - margin.iRight; + // If Marking mode is active, recalculate the valid width displaying characters. + // contact entry of name list view in marking mode + // + // |checkbox|Icon|name | + // | | |number| + if( iMarkingModeOn ) + { + RecalcWidthInMarkingMode(width, *font, aBuffer[0]); + } + TInt clipGap = data->ColumnTextClipGap(aSubCellNumber); + + return AknTextUtils::ClipToFit( + aBuffer, *font, width, AknTextUtils::EClipFromBeginning, width + clipGap); } // -------------------------------------------------------------------------- @@ -531,9 +553,9 @@ } // Wrap the original model. iListboxModelDecorator = DoCreateDecoratorL( - *IconArray( *this ), - iResourceData.iEmptyIconId, - iResourceData.iDefaultIconId ); + *IconArray( *this ), + iResourceData.iEmptyIconId, + iResourceData.iDefaultIconId ); iListboxModelDecorator->SetDecoratedModel( *iModel ); @@ -557,15 +579,15 @@ // -------------------------------------------------------------------------- // CPbk2ListboxModelCmdDecorator* CPbk2ContactViewListBox::DoCreateDecoratorL( - const CPbk2IconArray& aIconArray, - TPbk2IconId aEmptyIconId, - TPbk2IconId aDefaultIconId ) - { - return CPbk2ListboxModelCmdDecorator::NewL( - aIconArray, - aEmptyIconId, - aDefaultIconId ); - } + const CPbk2IconArray& aIconArray, + TPbk2IconId aEmptyIconId, + TPbk2IconId aDefaultIconId ) + { + return CPbk2ListboxModelCmdDecorator::NewL( + aIconArray, + aEmptyIconId, + aDefaultIconId ); + } // -------------------------------------------------------------------------- @@ -622,7 +644,7 @@ // void CPbk2ContactViewListBox::HandleGainingForeground() { - DrawDeferred(); + DrawDeferred(); } // -------------------------------------------------------------------------- @@ -704,7 +726,7 @@ textLayout.LayoutText(layout.Rect(), AknLayoutScalable_Apps::popup_navstr_preview_pane_t1(0).LayoutLine()); TPtrC desc(Model()->ItemTextArray()->MdcaPoint(View()->TopItemIndex())); - + //Add "if-clause" to avaid the error that argument of Mid() out of range. TInt index = desc.Find( KTabChar ); if ( index != KErrNotFound && index < desc.Length()-1 ) @@ -720,4 +742,56 @@ } } } + +// -------------------------------------------------------------------------- +// CPbk2ContactViewListBox::RecalcWidthInMarkingMode +// Recalculate the width of space displaying the third column of the schema +// below when Marking Mode is active. +// contact entry of name list view in marking mode +// The schema: +// |checkbox|Icon|name | +// | | |number| +// -------------------------------------------------------------------------- +// +void CPbk2ContactViewListBox::RecalcWidthInMarkingMode( + TInt& aWidth, + const CFont& aFont, + TChar aChar ) + { + if( aWidth > 0 ) + { + aWidth -= KCheckboxMargin; + // Get the coordinate for the right margin of the checkbox. + TInt checkBoxRight = AknLayoutScalable_Avkon::list_single_graphic_pane_t1( 0 ).r(); + // Get the coordinate for the left margin of the checkbox. + TInt checkBoxLeft = AknLayoutScalable_Avkon::list_single_graphic_pane_t1( 0 ).l(); + // The width to display one char. + TInt charWidth = aFont.CharWidthInPixels(aChar); + TInt checkBoxWidth = checkBoxRight - checkBoxLeft; + if( 0 > checkBoxWidth ) + { + checkBoxWidth *= -1; // To make sure the value is positive. + } + if( charWidth > 0 && checkBoxWidth > 0 ) + { + // The width of the characters which should be dropped, when marking + // mode is active. + TInt width; + if( 0 == checkBoxWidth%charWidth ) + { + width = checkBoxWidth; + } + else + { + // The width should be divisible by charWidth. + width = ( checkBoxWidth/charWidth + 1 ) * charWidth; + } + // When marking mode is on, + // the width should minus the part of checkbox in the front of + // a listbox item. + aWidth -= width; + } + } + } + // End of File diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/src/CPbk2FetchDlg.cpp --- a/phonebookui/Phonebook2/UIControls/src/CPbk2FetchDlg.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/src/CPbk2FetchDlg.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -149,7 +149,8 @@ inline CPbk2FetchDlg::CPbk2FetchDlg ( TParams aParams, MPbk2FetchDlgObserver& aObserver ) : iParams( aParams ), - iObserver( aObserver ) + iObserver( aObserver ), + iSelectPermitted( ETrue ) { } @@ -258,6 +259,7 @@ ( aContactLink, Phonebook2::Pbk2AppUi()->ApplicationServices(). ContactManager().ContactStoresL() ); + // Append the selected contact to results. if ( linkArray->Count() > 0 ) { const MVPbkContactLink& link = linkArray->At( KFirstElement ); @@ -268,6 +270,28 @@ } // -------------------------------------------------------------------------- +// CPbk2FetchDlg::AcceptDelayedFetchL +// -------------------------------------------------------------------------- +// +EXPORT_C void CPbk2FetchDlg::DenyDelayedFetchL + ( const TDesC8& aContactLink ) + { + CVPbkContactLinkArray* linkArray = CVPbkContactLinkArray::NewLC + ( aContactLink, Phonebook2::Pbk2AppUi()->ApplicationServices(). + ContactManager().ContactStoresL() ); + + // Unmark the selected contact + if ( linkArray->Count() > 0 ) + { + const MVPbkContactLink& link = linkArray->At( KFirstElement ); + iResults->DenyAppendDelayedL( link ); + iPages->SelectContactL( link, EFalse ); + } + + CleanupStack::PopAndDestroy(); // linkArray + } + +// -------------------------------------------------------------------------- // CPbk2FetchDlg::ExecuteLD // -------------------------------------------------------------------------- // @@ -388,6 +412,12 @@ } } + // Only multiple fetch needs to wait buffered operations finished + if ( !canceled && ( iParams.iFlags & EFetchMultiple ) ) + { + iResults->WaitOperationsCompleteL(); + } + // Notify observer if ( canceled ) { @@ -435,6 +465,11 @@ // Reset results iResults->ResetAndDestroy(); } + else + { + // Permit selection again + iSelectPermitted = ETrue; + } iExitRecord.Set( EExitOrdered ); // exit is now ordered and // when client later requests @@ -525,6 +560,12 @@ } else { + // EKeyApplicationF means left softkey is pressed + if ( EKeyApplicationF == aKeyEvent.iCode && + ( iParams.iFlags & EFetchMultiple ) ) + { + iSelectPermitted = EFalse; + } if( !Phonebook2::Pbk2AppUi()->KeyEventHandler().Pbk2ProcessKeyEventL( aKeyEvent, aType ) ) { @@ -788,6 +829,14 @@ } } } +// -------------------------------------------------------------------------- +// CPbk2FetchDlg::IsSelectPermitted +// -------------------------------------------------------------------------- +// +TBool CPbk2FetchDlg::IsSelectPermitted() + { + return iSelectPermitted; + } // -------------------------------------------------------------------------- // CPbk2FetchDlg::HandleControlEventL diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/src/CPbk2FetchResults.cpp --- a/phonebookui/Phonebook2/UIControls/src/CPbk2FetchResults.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/src/CPbk2FetchResults.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -38,6 +38,7 @@ // System includes #include +#include // Debugging headers #include @@ -56,7 +57,9 @@ iFetchDlg( aFetchDlg ), iPages( aPages ), iObserver( aObserver ), - iResultsObserver( aResultsObserver ) + iResultsObserver( aResultsObserver ), + iWaitingForDelayedAppend( EFalse ), + iInputBlock( NULL ) { } @@ -86,6 +89,8 @@ delete iOperationQueue; } + + delete iWaitForAllOperationComplete; } // -------------------------------------------------------------------------- @@ -107,6 +112,8 @@ } iOperationQueue = new (ELeave) CArrayFixFlat(4); + + iWaitForAllOperationComplete = new (ELeave) CActiveSchedulerWait(); } // -------------------------------------------------------------------------- @@ -133,10 +140,17 @@ // -------------------------------------------------------------------------- // void CPbk2FetchResults::AppendL( const MVPbkContactLink& aLink ) - { - CFRConatactOperation* newAppendOperation = CFRConatactOperation::NewL( aLink, CFRConatactOperation::EAppendContact ); - AppendContactOperationL(newAppendOperation); - ProcessNextContactOperationL(); + { + if ( iFetchDlg.IsSelectPermitted() ) + { + CFRConatactOperation* newAppendOperation = CFRConatactOperation::NewL( aLink, CFRConatactOperation::EAppendContact ); + AppendContactOperationL(newAppendOperation); + ProcessNextContactOperationL(); + } + else + { + iPages.SelectContactL( aLink, EFalse ); + } } // -------------------------------------------------------------------------- @@ -145,8 +159,24 @@ // void CPbk2FetchResults::AppendDelayedL( const MVPbkContactLink& aLink ) { + // Add the feedback contact's operation to the head of the queue + // in order to ensure that the checked contact's operation to be + // handled firstly when phonebook receives the client feedback. CFRConatactOperation* newAppendOperation = CFRConatactOperation::NewL( aLink, CFRConatactOperation::EAppendContactDelayed ); - AppendContactOperationL(newAppendOperation); + iOperationQueue->InsertL( 0, newAppendOperation ); + // Waiting is over. + iWaitingForDelayedAppend = EFalse; + ProcessNextContactOperationL(); + } + +// -------------------------------------------------------------------------- +// CPbk2FetchResults::DenyAppendDelayedL +// -------------------------------------------------------------------------- +// +void CPbk2FetchResults::DenyAppendDelayedL( const MVPbkContactLink& aLink ) + { + // Waiting is over, process next contact operation + iWaitingForDelayedAppend = EFalse; ProcessNextContactOperationL(); } @@ -176,6 +206,21 @@ } // -------------------------------------------------------------------------- +// CPbk2FetchResults::WaitOperationsCompleteL +// -------------------------------------------------------------------------- +// +void CPbk2FetchResults::WaitOperationsCompleteL() + { + if ( iWaitingForDelayedAppend || iOperationQueue->Count()>0 ) + { + iInputBlock = CAknInputBlock::NewLC(); + CleanupStack::Pop( iInputBlock ); + + iWaitForAllOperationComplete->Start(); + } + } + +// -------------------------------------------------------------------------- // CPbk2FetchResults::Count // -------------------------------------------------------------------------- // @@ -328,6 +373,13 @@ { // Observer needs to asked accept = iObserver.AcceptFetchSelectionL( count, *link ); + // Determine whether accept query is needed + if ( MPbk2FetchDlgObserver::EFetchDelayed == accept ) + { + // Start to wait client feedback, block the operation queue, + // process next operation until receive client feedback. + iWaitingForDelayedAppend = ETrue; + } } if ( accept == MPbk2FetchDlgObserver::EFetchNo ) @@ -489,8 +541,6 @@ // Remove executed operation from queue RemoveCurrentContactOperation(); - // Initialize next operation from queue - ProcessNextContactOperationL(); /**********************************************************************/ /**************! Dont use class members after SWITCH !*****************/ @@ -505,17 +555,26 @@ case CFRConatactOperation::EAppendContact: { DoAppendContactL( *aContact, EFalse ); + // Check whether next operation can be processed + // after sending check request to client. + ProcessNextContactOperationL(); break; } case CFRConatactOperation::EAppendContactDelayed: { + // Process new contact opretation before appending + // the delayed contact to results. It can save time. + ProcessNextContactOperationL(); DoAppendContactL( *aContact, ETrue ); break; } case CFRConatactOperation::ERemoveContact: { + // Process new contact opretation before removing contact + // from results. It can save time. + ProcessNextContactOperationL(); DoRemoveContactL( *aContact ); break; } @@ -530,7 +589,7 @@ // void CPbk2FetchResults::ProcessNextContactOperationL() { - if( !iRetrieveOperation ) + if( !iRetrieveOperation && !iWaitingForDelayedAppend ) { // No operation is executing -> process next one @@ -538,13 +597,23 @@ { // Start asynchronous contact retrieve operation, which completes // in CPbk2FetchResults::HandleContactOperationCompleteL. - iRetrieveOperation = iContactManager.RetrieveContactL( *( GetCurrentContactOperation()->GetContactLink() ), - *this ); + iRetrieveOperation = iContactManager.RetrieveContactL( + *( GetCurrentContactOperation()->GetContactLink() ), + *this ); } else { - // Empty operation queue -> do nothing - PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING( "CPbk2FetchResults::ProcessNextContactOperationL emtpy queue" )); + if ( !iWaitingForDelayedAppend ) + { + // Every seleced contacts' operation finishes, + // stop the scheduler waiting for every operation. + if (iWaitForAllOperationComplete->IsStarted()) + iWaitForAllOperationComplete->AsyncStop(); + + // Stop blocking input + delete iInputBlock; + iInputBlock = NULL; + } } } else diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/src/CPbk2MergeConflictsDlg.cpp --- a/phonebookui/Phonebook2/UIControls/src/CPbk2MergeConflictsDlg.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/src/CPbk2MergeConflictsDlg.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -212,7 +212,7 @@ { if( AknLayoutUtils::PenEnabled() ) { - if ( aEventType == EEventItemSingleClicked ) + if ( aEventType == EEventItemSingleClicked || aEventType == EEventEnterKeyPressed) { SwitchRadioButtonL(); } diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/src/CPbk2NamesListControl.cpp --- a/phonebookui/Phonebook2/UIControls/src/CPbk2NamesListControl.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/src/CPbk2NamesListControl.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -331,7 +331,7 @@ /** * Call this function to skip the showing of blocking progress note. - * When done MassUpdateSkipProgressNote( EFalse ) must be called to reset. + * When done MassUpdateSkipProgressNote( EFalse ) must be called to reset. */ void MassUpdateSkipProgressNote( TBool aSkip ); @@ -347,14 +347,14 @@ static TInt HandleMassUpdateTimerCallBack(TAny* aAny); private: - CEikListBox& iListBox; + CEikListBox& iListBox; TBool iHandleMassUpdateDetected; TTime iHandleMassUpdateFirst; TTime iHandleMassUpdatePrev; TInt iHandleMassUpdateCount; TBool iHandleMassUpdateSkipDialog; CPeriodic* iHandleMassUpdateTimer; - CAknWaitDialog* iHandleMassUpdateDialog; + CAknWaitDialog* iHandleMassUpdateDialog; }; // -------------------------------------------------------------------------- @@ -714,8 +714,8 @@ // TBool CPbk2HandleMassUpdate::MassUpdateDetected() { - return iHandleMassUpdateDetected; - } + return iHandleMassUpdateDetected; + } // -------------------------------------------------------------------------- // CPbk2HandleMassUpdate::MassUpdateSkipProgressNote @@ -877,7 +877,8 @@ iNameFormatter( aNameFormatter ), iStoreProperties( aStoreProperties ), iAllowPointerEvents( ETrue ), - iOpeningCca( EFalse ) + iOpeningCca( EFalse ), + iMarkingModeOn( EFalse ) { } @@ -935,7 +936,7 @@ } iObservers.Reset(); iCommandItems.ResetAndDestroy(); - delete iCheckMassUpdate; + delete iCheckMassUpdate; delete iListBoxSelectionObserver; delete iStateFactory; delete iListBox; @@ -1111,6 +1112,9 @@ iListBox->SetObserver( this ); iListBox->SetScrollEventObserver( this ); iListBox->SetListBoxObserver(this); + + iListBox->SetMarkingModeObserver( this ); + iUiExtension->SetContactUiControlUpdate( this ); // set command item updater TAny* ext = iUiExtension->ContactUiControlExtensionExtension( @@ -1201,9 +1205,6 @@ PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING("CPbk2NamesListControl::Reset(0x%x) - IN"), this ); - // Unmark all contacts and reset the toolbar so that the Call button - // won't be dimmed - TRAP_IGNORE( ProcessCommandL( EAknUnmarkAll ) ); // Reset find box TRAP_IGNORE( ResetFindL() ); // Destroy all the filtered views from the stack @@ -1220,6 +1221,9 @@ TRAP_IGNORE( iCurrentState->SetFocusedContactIndexL( firstContactIndex ) ); //scroll listbox into beginning (ignore focus that may be below promotion items) iListBox->SetTopItemIndex(firstContactIndex); + + //cancel the marking mode + iListBox->SetMarkingMode( EFalse ); // Switch to the background state. This enables the next state to avtivate fully (ActivateStateL()) once phonebook // comes from the background. @@ -1487,7 +1491,7 @@ { if( !iAllowPointerEvents ) { - //Passing event to listbox needed even if iCurrentState would be skipped (fix for ou1cimx1#316139) + //Passing event to listbox needed even if iCurrentState would be skipped (fix for ou1cimx1#316139) iListBox->HandlePointerEventL( aPointerEvent ); return; } @@ -1685,7 +1689,7 @@ void CPbk2NamesListControl::ClearMarks() { iCurrentState->ClearMarks(); - ClearMarkedContactsInfo(); + ClearMarkedContactsInfo(); } // -------------------------------------------------------------------------- @@ -2089,7 +2093,7 @@ // -------------------------------------------------------------------------- // void CPbk2NamesListControl::FilteredContactRemovedFromView( - MVPbkContactViewBase& /*aView*/ ) + MVPbkContactViewBase& /*aView*/ ) { DrawDeferred(); } @@ -2247,11 +2251,11 @@ // void CPbk2NamesListControl::DoHandleContactAdditionL( TInt aIndex ) { - //Prevent messing with focus with always-on when Phonebook hidden in - //reseted state. Otherwise background-added contacts will change focus. - //This would cause Phonebook not to look like freshly started when opened again. - //And also make sure foreground-added contact will show the new contact - //even though the focus is not seen. + //Prevent messing with focus with always-on when Phonebook hidden in + //reseted state. Otherwise background-added contacts will change focus. + //This would cause Phonebook not to look like freshly started when opened again. + //And also make sure foreground-added contact will show the new contact + //even though the focus is not seen. if( (static_cast( CEikonEnv::Static()->AppUi()))->IsForeground() ) { @@ -2404,7 +2408,7 @@ TRAPD( res, { // This will reset back to base view, however retain original view - //when opening CCA + //when opening CCA if( !iOpeningCca ) { iCurrentState->ResetFindL(); @@ -2428,8 +2432,11 @@ } else { - Reset(); - } + if( !iMarkingModeOn ) + { + Reset(); + } + } } // Do not handle contact addition here (DoHandleContactAdditionL), @@ -2542,9 +2549,29 @@ TRAP_IGNORE(iCurrentState->HandleControlEventL( aSearchField, MCoeControlObserver::EEventStateChanged, ETrue)); } + +// ----------------------------------------------------------------------------- +// CPbk2NamesListControl::MarkingModeStatusChanged +// ----------------------------------------------------------------------------- +// +void CPbk2NamesListControl::MarkingModeStatusChanged( TBool /*aActivated*/ ) + { + } + +// ----------------------------------------------------------------------------- +// CPbk2NamesListControl::ExitMarkingMode +// Called by avkon, if the return value is ETrue, +// the Marking mode will be canceled after any operation, +// otherwise the Marking mode keep active. +// ----------------------------------------------------------------------------- +// +TBool CPbk2NamesListControl::ExitMarkingMode() const + { + return ETrue; + } + // -------------------------------------------------------------------------- // CPbk2NamesListControl::HandleForegroundEventL -// // -------------------------------------------------------------------------- // void CPbk2NamesListControl::HandleForegroundEventL(TBool aForeground) @@ -2628,9 +2655,9 @@ // --------------------------------------------------------------------------- // EXPORT_C void CPbk2NamesListControl::SetOpeningCca( TBool aIsOpening ) - { - iOpeningCca = aIsOpening; - } + { + iOpeningCca = aIsOpening; + } // --------------------------------------------------------------------------- // CPbk2NamesListControlBgTask::CPbk2NamesListControlBgTask diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/src/CPbk2NamesListEmptyState.cpp --- a/phonebookui/Phonebook2/UIControls/src/CPbk2NamesListEmptyState.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/src/CPbk2NamesListEmptyState.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -41,6 +41,10 @@ // Debugging headers #include +#include +#include +#include + /// Unnamed namespace for local definitions namespace { @@ -124,12 +128,35 @@ // void CPbk2NamesListEmptyState::ActivateStateL() { - AllowCommandsToShowThemselves( ETrue ); - - // hide findbox since there is no contact + AllowCommandsToShowThemselves( ETrue ); + CPbk2NamesListControl& namesListControl = + reinterpret_cast(CoeControl()); + if( namesListControl.GetMarkingMode() ) + { + // If NamesListEmptyState and Marking mode are both active, + // the Marking mode should be canceled. + iListBox.SetMarkingMode(EFalse); + CEikonEnv* eikonEnv = CEikonEnv::Static(); + if ( eikonEnv && eikonEnv->AppUiFactory() ) + { + CEikStatusPane* statusPane = eikonEnv->AppUiFactory()->StatusPane(); + if ( statusPane ) + { + + CAknNavigationControlContainer* naviPane = + (CAknNavigationControlContainer *)statusPane->ControlL( + TUid::Uid(EEikStatusPaneUidNavi)); + CAknNavigationDecorator* decorator = naviPane->Top(); + naviPane->Pop( decorator ); + naviPane->DrawDeferred(); + } + } + } + + // hide findbox since there is no contact if ( iFindBox && iFindBox->IsVisible() ) { - iFindBox->MakeVisible( EFalse ); + iFindBox->MakeVisible( EFalse ); } } @@ -140,8 +167,8 @@ // void CPbk2NamesListEmptyState::DeactivateState() { - AllowCommandsToShowThemselves( EFalse ); - + AllowCommandsToShowThemselves( EFalse ); + if ( iFindBox && !iFindBox->IsFocused() ) { iFindBox->SetFocus( ETrue ); @@ -297,7 +324,7 @@ // void CPbk2NamesListEmptyState::HandleListboxEventL (TInt aEvent, TInt aListboxIndex, - TBool /*aMantainFocus*/) + TBool /*aMantainFocus*/) { iListBox.HandleEventL( aEvent, aListboxIndex ); iParent.DrawDeferred(); @@ -349,9 +376,9 @@ // The listbox can also have command items. TInt result = iListBox.NumberOfItems() - CommandItemCount(); if ( result < 0 ) - { - result = KNumberOfContacts; // No contacts - } + { + result = KNumberOfContacts; // No contacts + } return result; } @@ -491,53 +518,53 @@ MVPbkContactLinkArray* CPbk2NamesListEmptyState::SelectedContactsOrFocusedContactL() const { - CVPbkContactLinkArray* array = NULL; - // my card is showing on empty list, check if the wanted contact is it - TInt currentItem = iListBox.CurrentItemIndex(); - // if focused index is command item - if( currentItem < CommandItemCount() ) - { - // check if the command is my card ( this search is copied from CommandItemAt - function to avoid const cast) - // Some of the commands might be disabled. Skip those. - TInt enabledCount = 0; - TInt indexOfResult = KErrNotFound; - for ( TInt n = 0; n < iCommandItems.Count() && indexOfResult == KErrNotFound; ++n ) - { - if ( iCommandItems[ n ]->IsEnabled() ) - { - enabledCount++; - if ( enabledCount-1 == currentItem ) - { - indexOfResult = n; - } - } - } - MPbk2UiControlCmdItem* item = iCommandItems[ indexOfResult ]; - // check if the command item was a my card - if( item->CommandId() == EPbk2CmdOpenMyCard ) - { - // get extension point and my card link - TAny* object = item->ControlCmdItemExtension( TUid::Uid( KPbk2ControlCmdItemExtensionUID ) ); - if( object ) - { - MPbk2DoubleListboxCmdItemExtension* extension = - static_cast( object ); - // if extension exists - if( extension ) - { - const MVPbkContactLink* link = extension->Link(); - // if link exists, add it to the array - if( link ) - { - array = CVPbkContactLinkArray::NewLC(); - array->AppendL( link->CloneLC() ); - CleanupStack::Pop( 2 ); // array, link - } - } - } - } - } - return array; + CVPbkContactLinkArray* array = NULL; + // my card is showing on empty list, check if the wanted contact is it + TInt currentItem = iListBox.CurrentItemIndex(); + // if focused index is command item + if( currentItem < CommandItemCount() ) + { + // check if the command is my card ( this search is copied from CommandItemAt - function to avoid const cast) + // Some of the commands might be disabled. Skip those. + TInt enabledCount = 0; + TInt indexOfResult = KErrNotFound; + for ( TInt n = 0; n < iCommandItems.Count() && indexOfResult == KErrNotFound; ++n ) + { + if ( iCommandItems[ n ]->IsEnabled() ) + { + enabledCount++; + if ( enabledCount-1 == currentItem ) + { + indexOfResult = n; + } + } + } + MPbk2UiControlCmdItem* item = iCommandItems[ indexOfResult ]; + // check if the command item was a my card + if( item->CommandId() == EPbk2CmdOpenMyCard ) + { + // get extension point and my card link + TAny* object = item->ControlCmdItemExtension( TUid::Uid( KPbk2ControlCmdItemExtensionUID ) ); + if( object ) + { + MPbk2DoubleListboxCmdItemExtension* extension = + static_cast( object ); + // if extension exists + if( extension ) + { + const MVPbkContactLink* link = extension->Link(); + // if link exists, add it to the array + if( link ) + { + array = CVPbkContactLinkArray::NewLC(); + array->AppendL( link->CloneLC() ); + CleanupStack::Pop( 2 ); // array, link + } + } + } + } + } + return array; } // -------------------------------------------------------------------------- @@ -607,17 +634,17 @@ // -------------------------------------------------------------------------- // TInt CPbk2NamesListEmptyState::CommandItemCount() const - { + { // Some of the commands might be disabled. Don't count those. - TInt enabledCommandCount = 0; - for ( TInt n = 0; n < iCommandItems.Count(); ++n ) - { - if ( iCommandItems[ n ]->IsEnabled() ) - { - enabledCommandCount++; - } - } - return enabledCommandCount; + TInt enabledCommandCount = 0; + for ( TInt n = 0; n < iCommandItems.Count(); ++n ) + { + if ( iCommandItems[ n ]->IsEnabled() ) + { + enabledCommandCount++; + } + } + return enabledCommandCount; } // -------------------------------------------------------------------------- @@ -626,24 +653,24 @@ // const MPbk2UiControlCmdItem& CPbk2NamesListEmptyState::CommandItemAt( TInt aIndex ) const - { + { // Some of the commands might be disabled. Skip those. - TInt enabledCount = 0; - TInt indexOfResult = KErrNotFound; - for ( TInt n = 0; n < iCommandItems.Count()&& indexOfResult == KErrNotFound; ++n ) - - { - if ( iCommandItems[ n ]->IsEnabled() ) - { - enabledCount++; - if ( enabledCount-1 == aIndex ) - { - indexOfResult = n; - } - } - } - return *iCommandItems[ indexOfResult ]; - } + TInt enabledCount = 0; + TInt indexOfResult = KErrNotFound; + for ( TInt n = 0; n < iCommandItems.Count()&& indexOfResult == KErrNotFound; ++n ) + + { + if ( iCommandItems[ n ]->IsEnabled() ) + { + enabledCount++; + if ( enabledCount-1 == aIndex ) + { + indexOfResult = n; + } + } + } + return *iCommandItems[ indexOfResult ]; + } // -------------------------------------------------------------------------- // CPbk2NamesListEmptyState::FocusedCommandItem @@ -651,9 +678,9 @@ // const MPbk2UiControlCmdItem* CPbk2NamesListEmptyState::FocusedCommandItem() const - { - const MPbk2UiControlCmdItem* cmdItem = NULL; - // Is the focus on a command item: + { + const MPbk2UiControlCmdItem* cmdItem = NULL; + // Is the focus on a command item: TInt focusListIndex = iListBox.CurrentItemIndex(); const TInt commandItemCount = CommandItemCount(); if ( focusListIndex != KErrNotFound && focusListIndex < commandItemCount ) @@ -661,7 +688,7 @@ // Yes it's a command item. cmdItem = &CommandItemAt(focusListIndex); } - return cmdItem; + return cmdItem; } // -------------------------------------------------------------------------- @@ -669,7 +696,7 @@ // -------------------------------------------------------------------------- // void CPbk2NamesListEmptyState::DeleteCommandItemL( TInt /*aIndex*/ ) - { + { // ownership & management of iCommandItems is wasted in names list // control. Do nothing here } @@ -682,7 +709,7 @@ { // ownership & management of iCommandItems is wasted in names list // control. Do nothing here - } + } // -------------------------------------------------------------------------- // CPbk2NamesListEmptyState::DynInitMenuPaneL @@ -698,13 +725,9 @@ TInt pos; // Stores the position of the searched menu item. // This position is not needed or used anywhere - if (aMenuPane->MenuItemExists(EAknUnmarkAll, pos)) + if ( aMenuPane->MenuItemExists ( EAknCmdMarkingModeEnter, pos ) ) { - aMenuPane->SetItemDimmed(EAknUnmarkAll, ETrue); - } - if (aMenuPane->MenuItemExists(EAknMarkAll, pos)) - { - aMenuPane->SetItemDimmed(EAknMarkAll, ETrue); + aMenuPane->SetItemDimmed( EAknCmdMarkingModeEnter, ETrue ); } } @@ -944,9 +967,9 @@ // ownership not transferred iListBox.SetListCommands( &iCommandItems ); SubscribeCmdItemsVisibility(); - UpdateCommandEnabled( EPbk2CmdRcl, ETrue ); + UpdateCommandEnabled( EPbk2CmdRcl, ETrue ); UpdateCommandEnabled( EPbk2CmdAddFavourites, EFalse ); - //MyCard is stored separately and may also contain data + //MyCard is stored separately and may also contain data UpdateCommandEnabled( EPbk2CmdOpenMyCard, ETrue ); } else @@ -962,9 +985,20 @@ void CPbk2NamesListEmptyState::CmdItemVisibilityChanged( TInt aCmdItemId, TBool aVisible ) { TInt cmdItemIndex = FindCommand(aCmdItemId); - TRAP_IGNORE( HandleCommandEventL( + TRAP_IGNORE( + // If command item is changed to be visible, set its hidden selection to ETrue. + if( aVisible ) + { + TInt enableCmdCount = EnabledCommandCount(); + TListItemProperties prop( iListBox.ItemDrawer()->Properties(enableCmdCount) ); + prop.SetHiddenSelection(aVisible); + iListBox.ItemDrawer()->SetPropertiesL(enableCmdCount-1, prop); + } + + HandleCommandEventL( (aVisible ? EItemAdded : EItemRemoved), - cmdItemIndex) ); + cmdItemIndex); + ); } // -------------------------------------------------------------------------- @@ -1049,4 +1083,21 @@ } } +// -------------------------------------------------------------------------- +// CPbk2NamesListEmptyState::EnabledCommandCount +// -------------------------------------------------------------------------- +// +TInt CPbk2NamesListEmptyState::EnabledCommandCount() const + { + TInt result = 0; + for ( TInt i = 0; i < iCommandItems.Count(); ++i ) + { + if(iCommandItems[i]->IsEnabled()) + { + result++; + } + } + return result; + } + // End of File diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/src/CPbk2NamesListFilteredState.cpp --- a/phonebookui/Phonebook2/UIControls/src/CPbk2NamesListFilteredState.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/src/CPbk2NamesListFilteredState.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -1130,9 +1130,21 @@ void CPbk2NamesListFilteredState::CmdItemVisibilityChanged( TInt aCmdItemId, TBool aVisible ) { TInt cmdItemIndex = FindCommand(aCmdItemId); - TRAP_IGNORE( HandleCommandEventL( + TInt cmdListBoxIndex = EnabledCommandCount(); + if( aVisible ) + { + cmdListBoxIndex--; + } + // Update the HiddenSelection property of the command items. + TListItemProperties prop( iListBox.ItemDrawer()->Properties(cmdListBoxIndex) ); + prop.SetHiddenSelection(aVisible); + TRAP_IGNORE( + iListBox.ItemDrawer()->SetPropertiesL(cmdListBoxIndex, prop); + + HandleCommandEventL( (aVisible ? EItemAdded : EItemRemoved), - cmdItemIndex) ); + cmdItemIndex); + ); } // -------------------------------------------------------------------------- @@ -1217,4 +1229,21 @@ } } +// -------------------------------------------------------------------------- +// CPbk2NamesListFilteredState::EnabledCommandCount +// -------------------------------------------------------------------------- +// +TInt CPbk2NamesListFilteredState::EnabledCommandCount() const + { + TInt result = 0; + for ( TInt i = 0; i < iCommandItems.Count(); ++i ) + { + if(iCommandItems[i]->IsEnabled()) + { + result++; + } + } + return result; + } + // End of File diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/src/CPbk2NamesListReadyState.cpp --- a/phonebookui/Phonebook2/UIControls/src/CPbk2NamesListReadyState.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/src/CPbk2NamesListReadyState.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -736,6 +736,7 @@ { // Send selection events based on marking TInt focusIndex = iListBox.CurrentItemIndex(); + TInt commands = CommandItemCount(); const TBool markedAfter = iListBox.View()->ItemIsSelected( focusIndex ); TPbk2ControlEvent event( TPbk2ControlEvent::EContactSelected ); @@ -744,6 +745,10 @@ { event.iEventType = TPbk2ControlEvent::EContactUnselected; } + else if ( focusIndex < commands) + { + UnmarkCommands(); + } iEventSender.SendEventToObserversL( event ); } @@ -1491,56 +1496,21 @@ void CPbk2NamesListReadyState::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane) const { - AknSelectionService::HandleMarkableListDynInitMenuPane - (aResourceId, aMenuPane, &iListBox); - - TInt focusedItem = iListBox.View()->CurrentItemIndex(); - TBool markHidden = iListBox.View()->ItemIsSelected( focusedItem ); - TBool unmarkHidden = !iListBox.View()->ItemIsSelected( focusedItem ); - TBool markAllHidden = ( iListBox.Model()->NumberOfItems() == 0 ) || - ( iListBox.SelectionIndexes()->Count() == iListBox.Model()->NumberOfItems() ); - TBool unmarkAllHidden = ( iListBox.Model()->NumberOfItems() == 0 ) || - ( iListBox.SelectionIndexes()->Count() == 0 ); - - TInt position; - if (aMenuPane->MenuItemExists(EAknCmdMark, position)) - { - aMenuPane->SetItemDimmed(EAknCmdMark, markHidden); - } - if (aMenuPane->MenuItemExists(EAknCmdUnmark, position)) - { - aMenuPane->SetItemDimmed(EAknCmdUnmark, unmarkHidden); - } - if (aMenuPane->MenuItemExists(EAknMarkAll, position)) + TInt commandItemCount = CommandItemCount(); + + // Stores the position of the searched menu item. + // This position is not needed or used anywhere + TInt pos; + + if ((iListBox.SelectionIndexes()->Count() + commandItemCount ) + == iListBox.Model()->NumberOfItems()) { - aMenuPane->SetItemDimmed(EAknMarkAll, markAllHidden); - } - if (aMenuPane->MenuItemExists(EAknUnmarkAll, position)) - { - aMenuPane->SetItemDimmed(EAknUnmarkAll, unmarkAllHidden); - } - - // When all contacts are marked in the listbox, the command items are not marked. - // This code snippet dims out the Mark All menu item which is shown since the - // list box cannot differentiate a command and a contact item - - TInt commandItemCount = CommandItemCount(); - - - if ((iListBox.SelectionIndexes()->Count() + commandItemCount ) == iListBox.Model()->NumberOfItems()) - { - TInt i; // Stores the position of the searched menu item. - // This position is not needed or used anywhere - if (aMenuPane->MenuItemExists(EAknMarkAll, i)) + if (aMenuPane->MenuItemExists( EAknCmdMarkingModeEnter, pos ) ) { - aMenuPane->SetItemDimmed(EAknMarkAll, ETrue); + aMenuPane->SetItemDimmed( EAknCmdMarkingModeEnter, ETrue ); } } - // If there's any, command items are always placed at the top of the list box. - // By comparing the list box current item index with the command item count, we are trying to find out - // if the current focused item is command item or not. - } // -------------------------------------------------------------------------- @@ -2072,9 +2042,22 @@ void CPbk2NamesListReadyState::CmdItemVisibilityChanged( TInt aCmdItemId, TBool aVisible ) { TInt cmdItemIndex = FindCommand(aCmdItemId); - TRAP_IGNORE( HandleCommandEventL( - (aVisible ? EItemAdded : EItemRemoved), - cmdItemIndex) ); + TInt cmdListBoxIndex = EnabledCommandCount(); + if( aVisible ) + { + cmdListBoxIndex--; + } + // Update the HiddenSelection property of the command items. + TListItemProperties prop( iListBox.ItemDrawer()->Properties(cmdListBoxIndex) ); + prop.SetHiddenSelection(aVisible); + + TRAP_IGNORE( + iListBox.ItemDrawer()->SetPropertiesL(cmdListBoxIndex, prop); + + HandleCommandEventL( + (aVisible ? EItemAdded : EItemRemoved), + cmdItemIndex); + ); } // -------------------------------------------------------------------------- diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/src/CPbk2SettingsListControl.cpp --- a/phonebookui/Phonebook2/UIControls/src/CPbk2SettingsListControl.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/src/CPbk2SettingsListControl.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -38,6 +38,8 @@ #include #include #include +#include +#include //Pbk2Debug #include "Pbk2Debug.h" @@ -309,6 +311,26 @@ //Edit selection setting item //result is ETrue if OK pressed result = iSelectionSettingItem->EditItemL(); + + TBool driveSpaceFull( EFalse ); + driveSpaceFull = SysUtil::FFSSpaceBelowCriticalLevelL( &CCoeEnv::Static()->FsSession() ); + if ( driveSpaceFull ) + { + //If the disk is full, a write operation cannot complete. So restore + //the previous state. + iEikonEnv->HandleError(KErrDiskFull); + CSelectionItemList& oldItem( iSettingListState->ItemListState() ); + CSelectionItemList& item( iSettingListState->SelectionItemList() ); + TInt count = item.Count(); + for ( TInt i(0); i < count; ++i ) + { + TBool select = oldItem.At(i)->SelectionStatus(); + item.At(i)->SetSelectionStatus( select ); + } + iSelectionSettingItem->RestoreStateL(); + result = EFalse; + } + if ( result ) { //Is selection setting list changed by user diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/src/CPbk2SettingsListState.cpp --- a/phonebookui/Phonebook2/UIControls/src/CPbk2SettingsListState.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/src/CPbk2SettingsListState.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -135,6 +135,16 @@ } // -------------------------------------------------------------------------- +// CPbk2SettingsListState::ItemListState +// -------------------------------------------------------------------------- +// +CSelectionItemList& CPbk2SettingsListState::ItemListState() + { + __ASSERT_DEBUG( iItemListState, Panic(EPanicItemListStateNULL)); + return *iItemListState; + } + +// -------------------------------------------------------------------------- // CPbk2SettingsListState::SupportedStores // -------------------------------------------------------------------------- // diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/src/Pbk2ImageCommands.cpp --- a/phonebookui/Phonebook2/UIControls/src/Pbk2ImageCommands.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/src/Pbk2ImageCommands.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -619,27 +619,34 @@ services.ContactManager() ); CleanupStack::PushL( imageManager ); - if( CAknQueryDialog::NewL()->ExecuteLD( - R_PHONEBOOK2_REMOVE_IMAGE_CONFIRMATION_DIALOG ) ) - { - TPbk2StoreContactAnalyzer analyzer( - services.ContactManager(), aContact ); - TInt imageIndex = analyzer.HasFieldL( R_PHONEBOOK2_IMAGE_SELECTOR ); + const MVPbkFieldType* thumbType = services.ContactManager().FieldTypes().Find( + R_VPBK_FIELD_TYPE_THUMBNAILPIC ); + + // show a confirmation query if contact has an image + if (thumbType && imageManager->HasImage( *aContact, *thumbType ) ) + { + if ( CAknQueryDialog::NewL()->ExecuteLD( + R_PHONEBOOK2_REMOVE_IMAGE_CONFIRMATION_DIALOG ) ) + { + TPbk2StoreContactAnalyzer analyzer( + services.ContactManager(), aContact ); + TInt imageIndex = analyzer.HasFieldL( R_PHONEBOOK2_IMAGE_SELECTOR ); - if ( imageIndex != KErrNotFound ) - { - //aContact->RemoveField( imageIndex ); - //Instead of above we don't remove the field, just zero it's data - MVPbkContactFieldData& data(aContact->Fields(). - FieldAt( imageIndex ).FieldData()); - MVPbkContactFieldTextData::Cast( data ).SetTextL(KNullDesC); - } + if ( imageIndex != KErrNotFound ) + { + //aContact->RemoveField( imageIndex ); + //Instead of above we don't remove the field, just zero it's data + MVPbkContactFieldData& data(aContact->Fields(). + FieldAt( imageIndex ).FieldData()); + MVPbkContactFieldTextData::Cast( data ).SetTextL(KNullDesC); + } - const MVPbkFieldType* thumbFieldType = ThumbnailFieldTypeL(services); - imageManager->RemoveImage( *aContact, *thumbFieldType ); - } + const MVPbkFieldType* thumbFieldType = ThumbnailFieldTypeL(services); + imageManager->RemoveImage( *aContact, *thumbFieldType ); + } + } + CleanupStack::PopAndDestroy( imageManager ); - CleanupStack::PopAndDestroy(); // services return NULL; // synchronous operation diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/src/cpbk2contacteditornewowncontact.cpp --- a/phonebookui/Phonebook2/UIControls/src/cpbk2contacteditornewowncontact.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/src/cpbk2contacteditornewowncontact.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -224,16 +224,15 @@ { PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING ( "CPbk2ContactEditorNewOwnContact::HandleIdleDelete(0x%x)" ), this ); - - iInputAbsorber->StopWait(); - MPbk2ContactEditorEventObserver* observer = iObserver; - iObserver = NULL; - MVPbkContactObserver::TContactOpResult result; - // Disable warnings by nulling the data members - result.iStoreContact = NULL; - result.iExtension = NULL; - result.iOpCode = MVPbkContactObserver::EContactDelete; - observer->ContactEditorOperationCompleted( result, iEditorParams ); + iInputAbsorber->StopWait(); + // Notify client asynchronously to let Delete Operation complete firstly and + // then the client will be notified to do the other things in the RunL() function. + iLatestResult.iExtension = NULL; + iLatestResult.iStoreContact = NULL; + iLatestResult.iOpCode = MVPbkContactObserver::EContactDelete; + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + SetActive(); } // -------------------------------------------------------------------------- diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/src/cpbk2contactviewcustomlistboxdata.cpp --- a/phonebookui/Phonebook2/UIControls/src/cpbk2contactviewcustomlistboxdata.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/src/cpbk2contactviewcustomlistboxdata.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -364,9 +364,7 @@ iKineticScrolling = CAknPhysics::FeatureEnabled(); -#ifdef PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES LoadMarkingIconsL(); -#endif // PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES } @@ -591,12 +589,10 @@ // void CPbk2ContactViewCustomListBoxDataExtension::SkinChangedL() { -#ifdef PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES DeleteAnim(); TryCreateAnimation(); CreateColorBitmapsL(); LoadMarkingIconsL(); -#endif // PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES } // ----------------------------------------------------------------------------- // CPbk2ContactViewCustomListBoxDataExtension::SkinChanged @@ -1188,7 +1184,6 @@ // void CPbk2ContactViewCustomListBoxDataExtension::LoadMarkingIconsL() { -#ifdef PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES if ( !iMarkingIconArray ) { iMarkingIconArray = new ( ELeave ) CAknIconArray( 2 ); @@ -1217,7 +1212,6 @@ CleanupStack::PushL( icon ); iMarkingIconArray->AppendL( icon ); CleanupStack::Pop( icon ); -#endif // PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES } CCoeControl *CPbk2ContactViewCustomListBoxData::Control() const @@ -2041,7 +2035,6 @@ TRgb aTextColor = aHighlight ? aColors.iHighlightedText : aColors.iText; -#ifdef PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES TBool markingMode = EFalse; TRect itemRect( aRect ); @@ -2057,7 +2050,6 @@ AknLayoutScalable_Avkon::list_single_graphic_pane_t1( 0 ).LayoutLine().il; } } -#endif // PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES MAknsSkinInstance *skin = AknsUtils::SkinInstance(); MAknsControlContext *cc = AknsDrawUtils::ControlContext( Control() ); @@ -2073,13 +2065,8 @@ if ( iExtension->iSubCellsMightIntersect ) { -#ifdef PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES CheckIfSubCellsIntersectL( &textLines[0], &rectClipped[0], *aText, itemRect ); } -#else - CheckIfSubCellsIntersectL( &textLines[0], &rectClipped[0], *aText, aRect ); - } -#endif // PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES #ifdef RD_UI_TRANSITION_EFFECTS_LIST MAknListBoxTfxInternal *transApi = CAknListLoader::TfxApiInternal( &aGc ); #endif // RD_UI_TRANSITION_EFFECTS_LIST @@ -2120,7 +2107,6 @@ } DrawHighLight( aGc, aRect, aHighlight, skin ); -#ifdef PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES if ( markingMode && !aItemProperties.IsSelectionHidden() ) { TAknLayoutRect layoutRect; @@ -2154,7 +2140,6 @@ } } -#endif // PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES // The column draw loop column = 0; @@ -2270,13 +2255,8 @@ } TAknLayoutText textLayout; -#ifdef PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES textLayout.LayoutText( itemRect, textLineLayout, usedFont ); TRect layoutedRect( itemRect); -#else - textLayout.LayoutText( aRect, textLineLayout, usedFont ); - TRect layoutedRect( aRect ); -#endif // PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES // *2 == leave some room for marquee const TInt maxlen( KMaxColumnDataLength * 2 ); @@ -2323,11 +2303,7 @@ { iExtension->iMarquee->UseLogicalToVisualConversion( bidiConv ); -#ifdef PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES if ( iExtension->iMarquee->DrawText( aGc, itemRect, textLineLayout, convBuf, usedFont, textColor ) ) -#else - if ( iExtension->iMarquee->DrawText( aGc, aRect, textLineLayout, convBuf, usedFont, textColor ) ) -#endif // PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES { // all the loops have been executed textLayout.DrawText( aGc, convBuf, bidiConv, textColor ); @@ -2429,11 +2405,7 @@ TAknWindowLineLayout graphicLayout = iExtension->AtSL(subCellIndex).iGraphicLayout; TAknLayoutRect graphicRect; -#ifdef PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES graphicRect.LayoutRect( itemRect,graphicLayout ); -#else - graphicRect.LayoutRect(aRect,graphicLayout); -#endif // PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES TSize graphicSize( graphicRect.Rect().Size() ); if (index>=0 && IconArray()) @@ -2528,7 +2500,6 @@ return; } -#ifdef PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES CEikListBox* listbox = static_cast( iExtension->iControl ); TBool markingMode = EFalse; TRect itemRect( aRect ); @@ -2545,19 +2516,12 @@ AknLayoutScalable_Avkon::list_single_graphic_pane_t1( 0 ).LayoutLine().il; } } -#endif // PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES TInt extraVerticalSpace=(aRect.Height()-font->HeightInPixels()); TInt baseLineOffset=extraVerticalSpace/2+font->AscentInPixels(); -#ifdef PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES TRect textRect( itemRect ); TRect textMRect; // textrect with margins. textRect.iBr.iX = itemRect.iTl.iX; -#else - TRect textRect( aRect ); - TRect textMRect; // textrect with margins. - textRect.iBr.iX=aRect.iTl.iX; -#endif // PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES TInt column=0; TPtrC text; @@ -2567,20 +2531,12 @@ // be too difficult to do without - and this is cleaner solution. // pass 1, figures out x-coordinates for columns. -#ifdef PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES TInt x = itemRect.iTl.iX; -#else - TInt x = aRect.iTl.iX; -#endif // PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES TBool mirror = AknLayoutUtils::LayoutMirrored(); if (mirror) { -#ifdef PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES x = itemRect.iBr.iX; -#else - x = aRect.iBr.iX; -#endif // PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES } TInt maxx = x; while(column <= lastColumn) @@ -2653,15 +2609,6 @@ cc = SkinBackgroundContext(); } -#ifndef PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES - // aRect is list item's rect, width of which is smaller than width of the list - // with a scroll bar. List needs to draw under scroll bar anyway, so we need to - // modify given rect here. - TRect r(aRect); - - CEikListBox* listbox = static_cast( iExtension->iControl ); -#endif // !PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES - #ifdef RD_UI_TRANSITION_EFFECTS_LIST MAknListBoxTfxInternal *transApi = CAknListLoader::TfxApiInternal( &aGc ); @@ -2697,13 +2644,8 @@ #endif // RD_UI_TRANSITION_EFFECTS_LIST } -#ifdef PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES if ( iExtension->iCurrentRow < listbox->BottomItemIndex() ) -#else - CEikListBox* list = static_cast( iExtension->iControl ); - - if ( iExtension->iCurrentRow < list->BottomItemIndex() ) -#endif // PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES + { AknListUtils::DrawSeparator( aGc, aRect, aColors.iText, skin ); } @@ -2720,7 +2662,6 @@ } #endif // RD_UI_TRANSITION_EFFECTS_LIST -#ifdef PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES if ( markingMode && !aItemProperties.IsSelectionHidden() ) { TAknLayoutRect layoutRect; @@ -2761,7 +2702,6 @@ EFalse ); } } -#endif // PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES // The column draw loop column = 0; @@ -3382,11 +3322,8 @@ // too. if( KAknsMessageSkinChange == aType ) { -#ifdef PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES TRAP_IGNORE( iExtension->SkinChangedL() ); -#else - iExtension->SkinChanged(); -#endif // PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES + } else if(aType == KEikDynamicLayoutVariantSwitch) { diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIControls/src/cpbk2contactviewcustomlistboxitemdrawer.cpp --- a/phonebookui/Phonebook2/UIControls/src/cpbk2contactviewcustomlistboxitemdrawer.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIControls/src/cpbk2contactviewcustomlistboxitemdrawer.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -148,19 +148,6 @@ data->SetItemCellSize( iItemCellSize ); } -#ifndef RD_TOUCH2 -void CPbk2ContactViewCustomListBoxItemDrawer::DrawCurrentItemRect(const TRect& aRect) const -// -// Draw the item background -// - { - iGc->SetClippingRect(iViewRect); - iGc->SetBrushStyle(CGraphicsContext::ENullBrush); - iGc->SetPenColor(iHighlightedBackColor); // KDefaultLbxHighlightRectColor - iGc->DrawRect(aRect); - iGc->CancelClippingRect(); - } -#endif // !RD_TOUCH2 /** * Returns a pointer to the column data. Does not imply transfer of ownership. @@ -210,13 +197,11 @@ TInt pos = -1; TBool removeicon = (!aItemIsSelected && !ItemMarkReverse()) || (aItemIsSelected && ItemMarkReverse()); -#ifdef PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES if ( Flags() & CListItemDrawer::EMarkingModeEnabled ) { removeicon = EFalse; } -#endif // PBK2_AVKON_TOUCH_MARKINGMODE_CHANGES if ( Flags() & EDrawMarkSelection && ItemMarkPosition() != -1 && removeicon) { repl.Set( ItemMarkReplacement() ); @@ -309,7 +294,18 @@ TListItemProperties CPbk2ContactViewCustomListBoxItemDrawer::Properties(TInt aItemIndex) const { - if (!iPropertyArray) return CTextListItemDrawer::Properties(aItemIndex); + if ( !iPropertyArray ) + { + TListItemProperties prop( + CTextListItemDrawer::Properties( aItemIndex ) ); + // Do not allow marking other than contact items + if ( !ColumnData()->IsContactAtListboxIndex( aItemIndex ) ) + { + prop.SetHiddenSelection( ETrue ); + } + return prop; + } + CAknListBoxFilterItems *filter = STATIC_CAST(CAknFilteredTextListBoxModel*,iModel)->Filter(); if (filter) { diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIPolicy/inc/CPbk2ContactViewSortPolicy.h --- a/phonebookui/Phonebook2/UIPolicy/inc/CPbk2ContactViewSortPolicy.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIPolicy/inc/CPbk2ContactViewSortPolicy.h Thu Aug 19 09:41:07 2010 +0300 @@ -73,6 +73,17 @@ TParam* aParam ); TInt PostProcessResult( TInt aSortUtilResult ); + /** + * Get the index of top contact field in sort order list + */ + TInt GetTopContactFieldIndex(); + /** + * Set sortkey array item from one field + */ + void SetSortKey( + CPbk2SortKeyArray* aSortKeyArray, + const MVPbkBaseContactField* aField, + TInt aIndex ); private: // Data /// Own: Sort Util to forward sorting requests @@ -90,6 +101,8 @@ TPbk2SortOrderFieldMapper iFieldMapper; /// Own: Indicates succesfull initialization TBool iSortPolicyParameterReceived; + /// Index of top contact field in iSortOrder + TInt iTopContactId; }; #endif // CPBK2CONTACTVIEWSORTPOLICY_H diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/UIPolicy/src/CPbk2ContactViewSortPolicy.cpp --- a/phonebookui/Phonebook2/UIPolicy/src/CPbk2ContactViewSortPolicy.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/UIPolicy/src/CPbk2ContactViewSortPolicy.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -43,6 +43,12 @@ // Debugging headers #include +#include + +// Greater than any practical top contact number string +// which is in form like '0000000001'. +_LIT(KBigNumStr, "9999999999"); + /// Unnamed namespace for local definitions namespace { @@ -172,6 +178,8 @@ iSortOrder = CVPbkSortOrder::NewL(aParam->iSortOrder); iFieldMapper.SetSortOrder(*iSortOrder); + iTopContactId = GetTopContactFieldIndex(); + RPbk2LocalizedResourceFile resFile(aParam->iFs); resFile.OpenLC( KPbk2RomFileDrive, KDC_RESOURCE_FILES_DIR, KResourceFile ); @@ -205,6 +213,8 @@ delete iSortOrder; iSortOrder = sortOrder; iFieldMapper.SetSortOrder( *iSortOrder ); + + iTopContactId = GetTopContactFieldIndex(); } // -------------------------------------------------------------------------- @@ -275,34 +285,14 @@ const TInt lhsCount = iFieldMapper.FieldCount(); for ( i = 0; i < lhsCount; ++i ) { - const MVPbkBaseContactField* lhsField = - iFieldMapper.FieldAt( i ); - if ( lhsField ) - { - iLeftSortKeyArray->SetText( MVPbkContactFieldTextData::Cast - ( lhsField->FieldData() ).Text(), i ); - } - else - { - iLeftSortKeyArray->SetText( KNullDesC, i ); - } + SetSortKey( iLeftSortKeyArray, iFieldMapper.FieldAt(i), i ); } iFieldMapper.SetContactFields( aRhs.Fields() ); const TInt rhsCount = iFieldMapper.FieldCount(); for ( i = 0; i < rhsCount; ++i ) { - const MVPbkBaseContactField* rhsField = - iFieldMapper.FieldAt( i ); - if ( rhsField ) - { - iRightSortKeyArray->SetText( MVPbkContactFieldTextData::Cast - ( rhsField->FieldData() ).Text(), i ); - } - else - { - iRightSortKeyArray->SetText( KNullDesC, i ); - } + SetSortKey( iRightSortKeyArray, iFieldMapper.FieldAt(i), i ); } PBK2_PROFILE_END( Pbk2Profile::ESortPolicyCompareContacts ); @@ -392,4 +382,60 @@ return result; } +// -------------------------------------------------------------------------- +// CPbk2ContactViewSortPolicy::GetTopContactFieldIndex +// -------------------------------------------------------------------------- +// +TInt CPbk2ContactViewSortPolicy::GetTopContactFieldIndex() + { + TInt index = KErrNotFound; + for ( TInt i=0; iFieldTypeCount(); i++ ) + { + // Resource id of top contact field is R_VPBK_FIELD_TYPE_TOPCONTACT. + if ( iSortOrder->FieldTypeAt( i ).FieldTypeResId() == + R_VPBK_FIELD_TYPE_TOPCONTACT ) + { + index = i; + break; + } + } + return index; + } + +// -------------------------------------------------------------------------- +// CPbk2ContactViewSortPolicy::SetSortKey +// -------------------------------------------------------------------------- +// +void CPbk2ContactViewSortPolicy::SetSortKey( + CPbk2SortKeyArray* aSortKeyArray, + const MVPbkBaseContactField* aField, + TInt aIndex ) + { + TInt textLen = 0; + if ( aField ) + { + TPtrC text = MVPbkContactFieldTextData::Cast + ( aField->FieldData() ).Text(); + aSortKeyArray->SetText( text, aIndex ); + textLen = text.Length(); + } + if ( textLen == 0 ) + { + if ( aIndex == iTopContactId ) + { + // For some variants such as Chinese variant, + // empty string is less than not empty string. + // This will make topic contacts which have substantial top contact + // id strings after those with empty id strings. + // To prevent this, use a big number string instead of empty string + // and make sure top contacts in front of other contacts. + aSortKeyArray->SetText( KBigNumStr, aIndex ); + } + else + { + aSortKeyArray->SetText( KNullDesC, aIndex ); + } + } + } + // End of File diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/USIMExtension/inc/CPsu2CopyToSimFieldInfoArray.h --- a/phonebookui/Phonebook2/USIMExtension/inc/CPsu2CopyToSimFieldInfoArray.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/USIMExtension/inc/CPsu2CopyToSimFieldInfoArray.h Thu Aug 19 09:41:07 2010 +0300 @@ -120,8 +120,16 @@ * @return a reference to item in given index */ inline const TPsu2CopyToSimFieldInfo& operator[](TInt aIndex) const; - - + + /** + * Remove the fieldinfo which target type is not supported. + * Some target types defined in the rss file are not supported because of the limit + * of the sim card support. So the unsupported types must be removed from mapping + * array. + * @param aSupportedTypes: the supported type list. + */ + void RemoveUnSupportedFieldInfo( const MVPbkFieldTypeList& aSupportedTypes ); + /** * @param aSourceType the source field type * @return the info that for the aSourceType or NULL diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/USIMExtension/rss/Pbk2USimSimCopy.rss --- a/phonebookui/Phonebook2/USIMExtension/rss/Pbk2USimSimCopy.rss Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/USIMExtension/rss/Pbk2USimSimCopy.rss Thu Aug 19 09:41:07 2010 +0300 @@ -218,6 +218,152 @@ }; } +// ----------------------------------------------------------------------------- +// +// R_PSU2_COPY_TO_USIM_FIELDTYPE_MAPPINGS +// A array that defines the rules for copying fields to the usim +// with additional numbers +// +// ----------------------------------------------------------------------------- +// +RESOURCE PSU2_COPY_TO_SIM_FIELDTYPE_MAPPINGS r_psu2_copy_to_usim_fieldtype_mappings + { + items = + { + PSU2_COPY_TO_SIM_FIELDTYPE_MAPPING + { + // Source: all email types + sourceTypeSelector = VPBK_FIELD_TYPE_SELECTOR + { + versitProperties = + { + VBK_FIELD_VERSIT_PROPERTY + { + name = EVPbkVersitNameEMAIL; + } + }; + }; + // Target: USIM supports only general email + targetSimType = R_VPBK_FIELD_TYPE_EMAILGEN; + iBlockingError = KPsu2EMailFullError; + }, + //To handle the situation of USIM supports more than one additional number. + PSU2_COPY_TO_SIM_FIELDTYPE_MAPPING + { + sourceTypeSelector = VPBK_FIELD_TYPE_SELECTOR + { + versitProperties = + { + VBK_FIELD_VERSIT_PROPERTY + { + name = EVPbkVersitNameTEL; + parameters = { EVPbkVersitParamHOME }; + } + }; + excludedParameters ={ EVPbkVersitParamFAX, EVPbkVersitParamWORK, + EVPbkVersitParamCELL, EVPbkVersitParamVIDEO }; + }; + // Target: USIM supports telephone( home ) + targetSimType = R_VPBK_FIELD_TYPE_LANDPHONEHOME; + flags = 0; + }, + PSU2_COPY_TO_SIM_FIELDTYPE_MAPPING + { + sourceTypeSelector = VPBK_FIELD_TYPE_SELECTOR + { + versitProperties = + { + VBK_FIELD_VERSIT_PROPERTY + { + name = EVPbkVersitNameTEL; + parameters = { EVPbkVersitParamWORK }; + } + }; + excludedParameters ={ EVPbkVersitParamFAX, EVPbkVersitParamHOME, + EVPbkVersitParamCELL, EVPbkVersitParamVIDEO }; + }; + + // Target: USIM supports telephone( work ) + targetSimType = R_VPBK_FIELD_TYPE_LANDPHONEWORK; + flags = 0; + }, + PSU2_COPY_TO_SIM_FIELDTYPE_MAPPING + { + sourceTypeSelector = VPBK_FIELD_TYPE_SELECTOR + { + versitProperties = + { + VBK_FIELD_VERSIT_PROPERTY + { + name = EVPbkVersitNameTEL; + parameters = { EVPbkVersitParamFAX }; + }, + VBK_FIELD_VERSIT_PROPERTY + { + name = EVPbkVersitNameTEL; + parameters = { EVPbkVersitParamFAX, EVPbkVersitParamHOME }; + }, + VBK_FIELD_VERSIT_PROPERTY + { + name = EVPbkVersitNameTEL; + parameters = { EVPbkVersitParamFAX,EVPbkVersitParamWORK}; + } + }; + excludedParameters ={ EVPbkVersitParamCELL, EVPbkVersitParamVIDEO }; + }; + // Target: USIM supports only fax general + targetSimType = R_VPBK_FIELD_TYPE_FAXNUMBERGEN; + flags = 0; + }, + PSU2_COPY_TO_SIM_FIELDTYPE_MAPPING + { + // Source: all number types + sourceTypeSelector = VPBK_FIELD_TYPE_SELECTOR + { + versitProperties = + { + VBK_FIELD_VERSIT_PROPERTY + { + name = EVPbkVersitNameTEL; + }, + VBK_FIELD_VERSIT_PROPERTY + { + name = EVPbkVersitNameX; + extensionName = "X-ASSISTANT-TEL"; + } + }; + nonVersitType = + { + EVPbkNonVersitTypeDTMF + }; + }; + // Target: SIM supports only mobile general + targetSimType = R_VPBK_FIELD_TYPE_MOBILEPHONEGEN; + flags = 0; + }, + PSU2_COPY_TO_SIM_FIELDTYPE_MAPPING + { + // Source: nick name + sourceTypeSelector = VPBK_FIELD_TYPE_SELECTOR + { + versitProperties = + { + VBK_FIELD_VERSIT_PROPERTY + { + name = EVPbkVersitNameX; + extensionName = "X-NICKNAME"; + } + }; + }; + // Target: nick name + targetSimType = R_VPBK_FIELD_TYPE_SECONDNAME; + // Nick name can be truncated. + flags = KPsu2AllowedToTruncate; + iBlockingError = KPsu2SecondNameFullError; + } + }; + } + // End of File diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/USIMExtension/src/CPsu2CopyToSimCmd.cpp --- a/phonebookui/Phonebook2/USIMExtension/src/CPsu2CopyToSimCmd.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/USIMExtension/src/CPsu2CopyToSimCmd.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -299,6 +299,13 @@ PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING ( "CPsu2CopyToSimCmd::RunError %d" ), aError ); CCoeEnv::Static()->HandleError(aError); + + // If the copy operation is cancelled due to error occurred, update the + // ui control and reset the command pointer before it is destructed. + if ( iNameListUiControl ) + { + iNameListUiControl->UpdateAfterCommandExecution(); + } if ( iCommandObserver ) { iCommandObserver->CommandFinished(*this); diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/USIMExtension/src/CPsu2CopyToSimFieldInfoArray.cpp --- a/phonebookui/Phonebook2/USIMExtension/src/CPsu2CopyToSimFieldInfoArray.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/USIMExtension/src/CPsu2CopyToSimFieldInfoArray.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -33,7 +33,7 @@ #include #include #include - +#include #include namespace @@ -239,10 +239,19 @@ RPbk2LocalizedResourceFile resFile( &aFs ); resFile.OpenLC(KPbk2RomFileDrive, KDC_RESOURCE_FILES_DIR, KPsu2USimExtensionResFile); - + FeatureManager::InitializeLibL(); TResourceReader reader; - reader.SetBuffer( - resFile.AllocReadLC( R_PSU2_COPY_TO_SIM_FIELDTYPE_MAPPINGS ) ); + if( !FeatureManager::FeatureSupported( + KFeatureIdFfTdClmcontactreplicationfromphonebooktousimcard ) ) + { + reader.SetBuffer( + resFile.AllocReadLC( R_PSU2_COPY_TO_SIM_FIELDTYPE_MAPPINGS ) ); + } + else + { + reader.SetBuffer( + resFile.AllocReadLC( R_PSU2_COPY_TO_USIM_FIELDTYPE_MAPPINGS ) ); + } // Go through all mappings in resource and create a mapping array const TInt count = reader.ReadInt16(); @@ -299,6 +308,7 @@ iInfoArray.Close(); iMatchedTypes.Close(); delete iNumberKeyMap; + FeatureManager::UnInitializeLib(); } // ----------------------------------------------------------------------------- @@ -320,6 +330,25 @@ } return result; } + +// ----------------------------------------------------------------------------- +// CPsu2CopyToSimFieldInfoArray::RemoveUnSupportedTargetTypeFieldInfo +// ----------------------------------------------------------------------------- +// +void CPsu2CopyToSimFieldInfoArray::RemoveUnSupportedFieldInfo( const MVPbkFieldTypeList& aSupportedTypes ) + { + // Check all the field info in the iInfoArray, if the target of the fieldinfo + // is not contained in the supportedTypes, Remove it from iInfoArray. + TInt i = iInfoArray.Count() - 1; + while( i >= 0 ) + { + if( !aSupportedTypes.ContainsSame( iInfoArray[i].SimType())) + { + iInfoArray.Remove( i ); + } + i --; + } + } // ----------------------------------------------------------------------------- // CPsu2CopyToSimFieldInfoArray::SimNameType diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/USIMExtension/src/CPsu2SimContactProcessor.cpp --- a/phonebookui/Phonebook2/USIMExtension/src/CPsu2SimContactProcessor.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/USIMExtension/src/CPsu2SimContactProcessor.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -253,6 +253,11 @@ // void CPsu2SimContactProcessor::ConstructL( RFs& aFs ) { + const MVPbkFieldTypeList& supportedTypes = + iTargetStore.StoreProperties().SupportedFields(); + // Remove the unsupported fieldInfo from array first. + iCopyToSimFieldInfoArray.RemoveUnSupportedFieldInfo( supportedTypes ); + const TInt count = iCopyToSimFieldInfoArray.Count(); for ( TInt i = 0; i < count; ++i ) { diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ccapplication/ccacommlauncherplugin/inc/ccappcommlaunchercontainer.h --- a/phonebookui/Phonebook2/ccapplication/ccacommlauncherplugin/inc/ccappcommlaunchercontainer.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ccapplication/ccacommlauncherplugin/inc/ccappcommlaunchercontainer.h Thu Aug 19 09:41:07 2010 +0300 @@ -23,6 +23,7 @@ #include #include "ccappstatuscontrol.h" #include +#include class CAknsBasicBackgroundControlContext; class CAknPreviewPopUpController; @@ -36,6 +37,7 @@ class CCCAExtensionFactory; class CCCAppCommLauncherCustomListBox; class CCCaFactoryExtensionNotifier; +class CAknInputBlock; /** * Class implementing CCAppCommLauncher -container for controls @@ -52,7 +54,8 @@ public MEikListBoxObserver, public MCCAppContactHandlerNotifier, public MCCAStatusControlObserver, - public MAknLongTapDetectorCallBack + public MAknLongTapDetectorCallBack, + public MAknInputBlockCancelHandler { public: // constructor and destructor @@ -227,7 +230,8 @@ * @return the amount of the list box. * @since S60 v5.0 */ - const TInt GetListBoxItemAmount() const; + const TInt GetListBoxItemAmount() const; + private: // New @@ -280,6 +284,105 @@ */ void DoCheckExtensionFactoryL(); + /* + * Launches find on map contact action + */ + void HandleFindOnMapContactActionL(); + + /* + * Launches generic contact action + * @param aActionType - Contact Action + */ + void HandleGenericContactActionL( + VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aActionType ); + + /* + * Used to check whether a Contact has only one number for initiating VoiceCall. + * Fills selection to aSelectedField if only one field is possible + * Only works with VoiceCall Contact Action Type + * + * @param aActionType - Contact ActionType. Here it should be EVoiceCallSelector + * @param aSelectedField - Data of the selected field. (Phonenumber) + * @return - returns ETrue, if more than one field is present for the contact which is capable + * of VoiceCall. + * In this case we need to show the field selection dialog + * wherein the user will choose the number for which he wants to start VoiceCall. + * + * returns EFalse - Straight Forward. Voice call can be made directly, + * since we have only once number for this contact. + * The number to which VoiceCall needs to be made is filled in the aSelectedField. + * + */ + TBool IsVoiceCallFieldSelectionAmbiguous( + VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aActionType, + TPtrC& aSelectedField ); + + /* + * Returns true if field has only one item + * @param CCmsContactField + */ + TBool HasFieldOnlyOneItem( const CCmsContactField& field ) const; + + /* + * Returns true if field is voice call type + * @param CCmsContactField + */ + TBool IsVoiceCallType( const CCmsContactField& field ) const; + + /* + * Returns true if contact has single address + * @param aActionType - Contact ActionType. + * @param aHandler - Contact Handler + */ + TBool HasContactSingleAddress( + VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aActionType, + CCCAppCommLauncherContactHandler& aHandler ); + + + /* + * Executes contact action service with field selection + * + * @param aActionType - Contact ActionType. + * @param aContactIdentifier - Contact Link + * @param aFullName - Contact's Name + */ + void ExecuteContactActionServiceWithFieldSelectionL( + VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aActionType, + TDesC8& aContactIdentifier, + TDesC& aFullName ); + + /* + * Executes contact actions service without field selections + * + * @param aActionType - Contact ActionType. + * @param aContactIdentifier - Contact Link + * @param aFullName - Contact's Name + * @param aSelectedField - Contains the number to which + * VoiceCall needs to be established. + */ + void ExecuteContactActionServiceWithoutFieldSelectionL( + VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aActionType, + TDesC8& aContactIdentifier, + TDesC& aFullName, + TDesC& aSelectedField ); + + /* + * From MAknInputBlockCancelHandler + */ + void AknInputBlockCancel(); + + /** + * Removes the Input Blocker and makes the contianer regain + * user input, key and pen + */ + void RemoveInputBlocker(); + + /** + * Blocks user input, key and pen, from reaching + * container untill the issue of communication is complete + */ + void SetInputBlockerL(); + private: // Constructors /** @@ -371,6 +474,11 @@ TBool iLongTap; + + /** + * Owns - Input Blocker + */ + CAknInputBlock* iInputBlocker; }; #endif // __CCAPPCOMMALAUNCHERCONTAINER_H diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ccapplication/ccacommlauncherplugin/src/ccappcommlaunchercontainer.cpp --- a/phonebookui/Phonebook2/ccapplication/ccacommlauncherplugin/src/ccappcommlaunchercontainer.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ccapplication/ccacommlauncherplugin/src/ccappcommlaunchercontainer.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -576,57 +576,233 @@ iHasBeenDragged = EFalse; } - if ( executeContactAction && iPlugin.CommandState().IsRunning() ) + if ( executeContactAction && iPlugin.CommandState().IsRunning() ) { executeContactAction = EFalse; } - if (executeContactAction) + if ( executeContactAction ) { + SetInputBlockerL(); + VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector contactActionType = iPlugin.Container().SelectedCommunicationMethod(); if ( contactActionType == VPbkFieldTypeSelectorFactory::EFindOnMapSelector ) { - if ( !iLongTap ) - { - DoShowMapCmdL( (TPbk2CommandId)EPbk2ExtensionShowOnMap ); - } - else - { - iLongTap = EFalse; - } + HandleFindOnMapContactActionL(); } else { - TPtrC fullName; - - iPlugin.ContactHandler().ContactFieldItemDataL( - CCmsContactFieldItem::ECmsFullName, fullName); - - TUint paramFlag = CCAContactorService::TCSParameter::EEnableDefaults; - - CCAContactorService::TCSParameter param( - contactActionType, - *iPlugin.ContactHandler().ContactIdentifierLC(),//contactlinkarray - paramFlag, - fullName); + HandleGenericContactActionL( contactActionType ); + } - iPlugin.ExecuteServiceL(param); + RemoveInputBlocker(); + } + } + +// ---------------------------------------------------------------------------- +// CCCAppCommLauncherContainer::HandleFindOnMapContactActionL() +// ---------------------------------------------------------------------------- +// +void CCCAppCommLauncherContainer::HandleFindOnMapContactActionL() + { + if ( !iLongTap ) + { + DoShowMapCmdL( (TPbk2CommandId)EPbk2ExtensionShowOnMap ); + } + else + { + iLongTap = EFalse; + } + } + +// ---------------------------------------------------------------------------- +// CCCAppCommLauncherContainer::HandleGenericContactActionL() +// ---------------------------------------------------------------------------- +// +void CCCAppCommLauncherContainer::HandleGenericContactActionL( + VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aActionType ) + { + TPtrC fullName; + iPlugin.ContactHandler().ContactFieldItemDataL( + CCmsContactFieldItem::ECmsFullName, fullName ); + + //contactlinkarray + HBufC8* contactIdentifier = iPlugin.ContactHandler().ContactIdentifierLC(); + + TBool fieldSelectionReq(ETrue); + TPtrC selectedField; + if ( VPbkFieldTypeSelectorFactory::EVoiceCallSelector == aActionType ) + { + fieldSelectionReq = IsVoiceCallFieldSelectionAmbiguous( aActionType, selectedField ); + } + + + if( fieldSelectionReq ) + { + ExecuteContactActionServiceWithFieldSelectionL( + aActionType, + *contactIdentifier, + fullName ); + } + else + { + // Speed up contact action by skipping slow field selection operation + ExecuteContactActionServiceWithoutFieldSelectionL( + aActionType, + *contactIdentifier, + fullName, + selectedField ); + } + + //The Timer can be started after user selected any call item + if ( iPlugin.ContactorService()->IsSelected() && + ( aActionType == VPbkFieldTypeSelectorFactory::EVoiceCallSelector || + aActionType == VPbkFieldTypeSelectorFactory::EVideoCallSelector || + aActionType == VPbkFieldTypeSelectorFactory::EVOIPCallSelector) ) + { + iPlugin.StartTimerL(); + } + + CleanupStack::PopAndDestroy(1);// contactlinkarray + } + +// ---------------------------------------------------------------------------- +// CCCAppCommLauncherContainer::IsVoiceCallFieldSelectionAmbiguous() +// ---------------------------------------------------------------------------- +// +TBool CCCAppCommLauncherContainer::IsVoiceCallFieldSelectionAmbiguous( + VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aActionType, + TPtrC& aSelectedField ) + { + CCCAppCommLauncherContactHandler& handler = iPlugin.ContactHandler(); + + if ( HasContactSingleAddress( aActionType, handler ) ) + { + RPointerArray& fields = handler.ContactFieldDataArray(); + + for( TInt i=0; i < fields.Count(); i++ ) + { + CCmsContactField* field = fields[i]; - //The Timer can be started after user selected any call item - if ( iPlugin.ContactorService()->IsSelected() && - (contactActionType == VPbkFieldTypeSelectorFactory::EVoiceCallSelector || - contactActionType == VPbkFieldTypeSelectorFactory::EVideoCallSelector || - contactActionType == VPbkFieldTypeSelectorFactory::EVOIPCallSelector) ) + if ( HasFieldOnlyOneItem( *field ) && + IsVoiceCallType( *field ) ) { - iPlugin.StartTimerL(); - } - - CleanupStack::PopAndDestroy(1);// contactlinkarray + const CCmsContactFieldItem* fieldItem = NULL; + + TInt error = KErrNone; + TRAP( error, fieldItem = &field->ItemL( 0 ) ); + + if( error == KErrNone ) + { + aSelectedField.Set(fieldItem->Data()); + //Its safe to exit here + //Making of Voice Call is not tedious + //we have only one number + return EFalse; + } + } } } + + return ETrue; + } + +// ---------------------------------------------------------------------------- +// CCCAppCommLauncherContainer::HasContactSingleAddress() +// ---------------------------------------------------------------------------- +// +TBool CCCAppCommLauncherContainer::HasContactSingleAddress( + VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aActionType, + CCCAppCommLauncherContactHandler& aHandler ) + { + TInt amount = aHandler.AddressAmount( aActionType ); + if( 1 == amount ) + { + return ETrue; + } + + return EFalse; + } + +// ---------------------------------------------------------------------------- +// CCCAppCommLauncherContainer::HasFieldOnlyOneItem() +// ---------------------------------------------------------------------------- +// +TBool CCCAppCommLauncherContainer::HasFieldOnlyOneItem( const CCmsContactField& field ) const + { + const RPointerArray& items = field.Items(); + + if ( 1 == items.Count() ) + { + return ETrue; + } + + return EFalse; + } + +// ---------------------------------------------------------------------------- +// CCCAppCommLauncherContainer::IsVoiceCallType() +// ---------------------------------------------------------------------------- +// +TBool CCCAppCommLauncherContainer::IsVoiceCallType( const CCmsContactField& field ) const + { + CCmsContactFieldItem::TCmsContactField fieldType = field.Type(); + + if( fieldType == CCmsContactFieldItem::ECmsLandPhoneGeneric || + fieldType == CCmsContactFieldItem::ECmsLandPhoneHome || + fieldType == CCmsContactFieldItem::ECmsLandPhoneWork || + fieldType == CCmsContactFieldItem::ECmsMobilePhoneGeneric || + fieldType == CCmsContactFieldItem::ECmsMobilePhoneHome || + fieldType == CCmsContactFieldItem::ECmsMobilePhoneWork ) + { + return ETrue; + } + + return EFalse; + } + + +// ---------------------------------------------------------------------------- +// CCCAppCommLauncherContainer::ExecuteContactActionServiceWithFieldSelectionL() +// ---------------------------------------------------------------------------- +// +void CCCAppCommLauncherContainer::ExecuteContactActionServiceWithFieldSelectionL( + VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aActionType, + TDesC8& aContactIdentifier, + TDesC& aFullName ) + { + TUint paramFlag = CCAContactorService::TCSParameter::EEnableDefaults; + + CCAContactorService::TCSParameter param( + aActionType, + aContactIdentifier, + paramFlag, + aFullName ); + + iPlugin.ExecuteServiceL(param); + } + +// ---------------------------------------------------------------------------- +// CCCAppCommLauncherContainer::ExecuteContactActionServiceWithoutFieldSelectionL() +// ---------------------------------------------------------------------------- +// +void CCCAppCommLauncherContainer::ExecuteContactActionServiceWithoutFieldSelectionL( + VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aActionType, + TDesC8& aContactIdentifier, + TDesC& aFullName, + TDesC& aSelectedField ) + { + CCAContactorService::TCSParameter param( + aActionType, + aContactIdentifier, + CCAContactorService::TCSParameter::EUseFieldParam, + aFullName, + aSelectedField ); + + iPlugin.ExecuteServiceL(param); } // ---------------------------------------------------------------------------- @@ -915,4 +1091,39 @@ { return iModel->MdcaCount(); } + +//----------------------------------------------------------------------------- +// CCCAppCommLauncherContainer::SetInputBlockerL() +//----------------------------------------------------------------------------- +// +void CCCAppCommLauncherContainer::SetInputBlockerL() + { + if (!iInputBlocker) + { + iInputBlocker = CAknInputBlock::NewCancelHandlerLC( this ); + CleanupStack::Pop( iInputBlocker ); + iInputBlocker->SetCancelDelete( iInputBlocker ); + } + } + +// -------------------------------------------------------------------------- +// CCCAppCommLauncherContainer::RemoveInputBlockerL +// -------------------------------------------------------------------------- +// +void CCCAppCommLauncherContainer::RemoveInputBlocker() + { + if (iInputBlocker) + { + iInputBlocker->Cancel(); + } + } + +// -------------------------------------------------------------------------- +// CCCAppCommLauncherContainer::AknInputBlockCancel +// -------------------------------------------------------------------------- +// +void CCCAppCommLauncherContainer::AknInputBlockCancel() + { + iInputBlocker = NULL; + } // End of File diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ccapplication/ccacommlauncherplugin/src/ccappcommlaunchermenuhandler.cpp --- a/phonebookui/Phonebook2/ccapplication/ccacommlauncherplugin/src/ccappcommlaunchermenuhandler.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ccapplication/ccacommlauncherplugin/src/ccappcommlaunchermenuhandler.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -544,23 +544,27 @@ TPtrC8 contactLink = param->Value().AsData(); // Update the CCA parameter contact data - HBufC16* link16 = HBufC16::NewLC( contactLink.Length() ); - link16->Des().Copy( contactLink ); - iPlugin.AppEngine()->Parameter().SetContactDataL( link16->Des() ); - // Set contact data flag to EContactLink, because the parameters returned from - // phonebook AIW provider have conatct link but not contact id. - iPlugin.AppEngine()->Parameter().SetContactDataFlag( MCCAParameter::EContactLink ); - CleanupStack::PopAndDestroy(1); // link16 + TInt length = contactLink.Length(); + if ( length > 0 ) + { + HBufC16* link16 = HBufC16::NewLC( length ); + link16->Des().Copy( contactLink ); + iPlugin.AppEngine()->Parameter().SetContactDataL( link16->Des() ); + // Set contact data flag to EContactLink, because the parameters returned from + // phonebook AIW provider have conatct link but not contact id. + iPlugin.AppEngine()->Parameter().SetContactDataFlag( MCCAParameter::EContactLink ); + CleanupStack::PopAndDestroy(1); // link16 - // Inform the app engine of the contact event - iPlugin.AppEngine()->CCAppContactEventL(); + // Inform the app engine of the contact event + iPlugin.AppEngine()->CCAppContactEventL(); - // Update the commlauncher the UI contact data - iPlugin.ContactHandler().RefetchContactL(); - iPlugin.Container().ContactsChangedL(); - - //Update the Store - SetContactStore(iPlugin.ContactHandler().ContactStore()); + // Update the commlauncher the UI contact data + iPlugin.ContactHandler().RefetchContactL(); + iPlugin.Container().ContactsChangedL(); + + //Update the Store + SetContactStore(iPlugin.ContactHandler().ContactStore()); + } } if (errParam) diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ccapplication/ccacommlauncherplugin/tsrc/ut_commlaunchercontacthandler/inc/ccappcommlauncherheaders.h --- a/phonebookui/Phonebook2/ccapplication/ccacommlauncherplugin/tsrc/ut_commlaunchercontacthandler/inc/ccappcommlauncherheaders.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ccapplication/ccacommlauncherplugin/tsrc/ut_commlaunchercontacthandler/inc/ccappcommlauncherheaders.h Thu Aug 19 09:41:07 2010 +0300 @@ -30,7 +30,7 @@ #include "t_ccappcmscontactfetcher.h" #include "t_testsingleton.h" #include "phonebookPrivateCRKeys.h" - +#include class CCmsContactFieldInfo; class MCCAppContactFieldDataObserver; diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ccapplication/ccadetailsviewplugin/src/ccappdetailsviewlistboxmodel.cpp --- a/phonebookui/Phonebook2/ccapplication/ccadetailsviewplugin/src/ccappdetailsviewlistboxmodel.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ccapplication/ccadetailsviewplugin/src/ccappdetailsviewlistboxmodel.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -698,7 +698,12 @@ UpdateMSKinCbaL(); ); - SetFocusedListIndex(iInitialFocusIndex); + // check if any item highlighted + TBool highLightEnabled = iListBox.IsHighlightEnabled(); + if ( !highLightEnabled ) + { + SetFocusedListIndex(iInitialFocusIndex); + } /*if (!iXspIdModifyState) { diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/ccapplication/inc/ccalogger.h --- a/phonebookui/Phonebook2/ccapplication/inc/ccalogger.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/ccapplication/inc/ccalogger.h Thu Aug 19 09:41:07 2010 +0300 @@ -134,19 +134,20 @@ /** * PERFORMANCE LOGGINS - * + * Logging is down only in debug, to get the log files, + * need to enable the _DEBUG marco first. + * * OPTIONS: * PERF_LOGGING -> 12 different points where performance is measured. (c:\logs\perflogger.txt) - * http://presenceprojects/trac/wiki/PerfLogging - * + * http://presenceprojects/trac/wiki/PerfLogging * PERF_LAUNCH -> For test guys (c:\logs\perflaunch.txt) * */ -#undef PERF_LOGGING +#ifdef _DEBUG +#define PERF_LOGGING #define PERF_LAUNCH - - +#endif //_DEBUG #ifdef PERF_LOGGING diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/conf/phonebook2.confml Binary file phonebookui/Phonebook2/conf/phonebook2.confml has changed diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/conf/phonebook2_101f8794.crml Binary file phonebookui/Phonebook2/conf/phonebook2_101f8794.crml has changed diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/group/Pbk2CommandsExtension.mmp --- a/phonebookui/Phonebook2/group/Pbk2CommandsExtension.mmp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/group/Pbk2CommandsExtension.mmp Thu Aug 19 09:41:07 2010 +0300 @@ -87,7 +87,7 @@ END // Include paths -USERINCLUDE ../CommandsExtension/inc +USERINCLUDE ../CommandsExtension/inc ../Commands/inc SYSTEMINCLUDE ../inc SYSTEMINCLUDE /epoc32/include/ecom //RCL_ADD diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/help/data/xhtml.zip Binary file phonebookui/Phonebook2/help/data/xhtml.zip has changed diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/inc/CPbk2FetchDlg.h --- a/phonebookui/Phonebook2/inc/CPbk2FetchDlg.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/inc/CPbk2FetchDlg.h Thu Aug 19 09:41:07 2010 +0300 @@ -159,6 +159,14 @@ */ IMPORT_C void AcceptDelayedFetchL( const TDesC8& aContactLink ); + + /** + * Unmarks the given contact as selected. + * + * @param aContactLink Link to a contact to select. + */ + IMPORT_C void DenyDelayedFetchL( + const TDesC8& aContactLink ); public: // From CEikDialog IMPORT_C TInt ExecuteLD(); @@ -204,6 +212,7 @@ void SelectContactL( const MVPbkContactLink& aLink, TBool aSelected ); + TBool IsSelectPermitted(); private: // From MPbk2StoreConfigurationObserver void ConfigurationChanged(); @@ -312,6 +321,8 @@ CPbk2NamesListControl* iNamesListControl; /// Not own: Group list control CPbk2NamesListControl* iGroupListControl; + /// Is selection permitted + TBool iSelectPermitted; }; #endif // CPBK2FETCHDLG_H diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/inc/CPbk2NamesListControl.h --- a/phonebookui/Phonebook2/inc/CPbk2NamesListControl.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/inc/CPbk2NamesListControl.h Thu Aug 19 09:41:07 2010 +0300 @@ -32,6 +32,7 @@ #include #include #include "CPbk2ControlContainer.h" +#include // FORWARD DECLARATIONS class MPbk2NamesListState; @@ -78,7 +79,8 @@ public MEikListBoxObserver, public MPbk2ControlContainerForegroundEventObserver, public MPbk2CommandItemUpdater, - public MVPbkContactViewObserverExtension + public MVPbkContactViewObserverExtension, + public MAknMarkingModeObserver { public: // Enumerations @@ -129,27 +131,27 @@ CPbk2StorePropertyArray& aStoreProperties ); /** - * Creates a new instance of this class. - * - * @param aResourceId Id of the resource where the control - * is defined in. - * @param aContainer This control's container. - * @param aManager Virtual Phonebook contact manager. - * @param aView The contact view. - * @param aNameFormatter Name formatter. - * @param aStoreProperties An array containg properties - * for the stores that are shown. - * @param aThumbManager Thumbnail manager for social phonebook //TODO - * @return A new instance of this class. - */ - IMPORT_C static CPbk2NamesListControl* NewL( - TInt aResourceId, - const CCoeControl* aContainer, - CVPbkContactManager& aManager, - MVPbkContactViewBase& aView, - MPbk2ContactNameFormatter& aNameFormatter, - CPbk2StorePropertyArray& aStoreProperties, - CPbk2ThumbnailManager* aThumbManager ); + * Creates a new instance of this class. + * + * @param aResourceId Id of the resource where the control + * is defined in. + * @param aContainer This control's container. + * @param aManager Virtual Phonebook contact manager. + * @param aView The contact view. + * @param aNameFormatter Name formatter. + * @param aStoreProperties An array containg properties + * for the stores that are shown. + * @param aThumbManager Thumbnail manager for social phonebook //TODO + * @return A new instance of this class. + */ + IMPORT_C static CPbk2NamesListControl* NewL( + TInt aResourceId, + const CCoeControl* aContainer, + CVPbkContactManager& aManager, + MVPbkContactViewBase& aView, + MPbk2ContactNameFormatter& aNameFormatter, + CPbk2StorePropertyArray& aStoreProperties, + CPbk2ThumbnailManager* aThumbManager ); /** * Constructor. Defined as public for custom control needs. @@ -245,8 +247,8 @@ /** * For special case: Call this function to skip showing the * blocking progress note when mass update is going on in nameslistview. - * When done, MassUpdateSkipProgressNote(EFalse) must always be - * called to reset back to original state (even if a Leave would happen in between) + * When done, MassUpdateSkipProgressNote(EFalse) must always be + * called to reset back to original state (even if a Leave would happen in between) * @param aSkip - ETrue if progress note should not be displayed. EFalse reset to normal. */ IMPORT_C void MassUpdateSkipProgressNote( TBool aSkip ); @@ -390,6 +392,25 @@ public: // from MAdaptiveSearchTextObserver void AdaptiveSearchTextChanged( CAknSearchField* aSearchField ); + + public: // From MAknMarkingModeObserver + + /** + * This method is called when marking mode is activated or deactivated. + * + * @param aActivated @c ETrue if marking mode was activate, @c EFalse + * if marking mode was deactivated. + */ + void MarkingModeStatusChanged( TBool aActivated ); + + /** + * This method is called just before marking mode is closed. Client can + * either accept or decline closing. + * + * @return @c ETrue if marking mode should be closed, otherwise @c EFalse. + */ + TBool ExitMarkingMode() const; + private: // Implementation /** @@ -443,7 +464,16 @@ void RestoreMarkedContactsL(); void ClearMarkedContactsInfo(); + public: + inline void SetMarkingMode( TBool aActived ) + { + iMarkingModeOn = aActived; + } + inline TBool GetMarkingMode() const + { + return iMarkingModeOn; + } private: // Data /// Ref: Current state @@ -500,17 +530,19 @@ // Wheter this control owns the thumbnail manager (iThumbManager) or not TBool iOwnThumbManager; //OWN: double list box "handle" - CPbk2ContactViewDoubleListBox* iDoubleListBox; + CPbk2ContactViewDoubleListBox* iDoubleListBox; //Own: Selected/Marked Contacts - MVPbkContactLinkArray* iSelectedLinkArray; + MVPbkContactLinkArray* iSelectedLinkArray; //Own: Background Task Handler CPbk2NamesListControlBgTask* iBgTask; //Own: Mass update checker/handler CPbk2HandleMassUpdate* iCheckMassUpdate; //Own: Open Cca is in progress - TBool iOpeningCca; + TBool iOpeningCca; + // Flag to indicate marking mode is active + TBool iMarkingModeOn; }; #endif // CPBK2NAMESLISTCONTROL_H diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/inc/MPbk2FetchDlg.h --- a/phonebookui/Phonebook2/inc/MPbk2FetchDlg.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/inc/MPbk2FetchDlg.h Thu Aug 19 09:41:07 2010 +0300 @@ -118,6 +118,13 @@ virtual void SelectContactL( const MVPbkContactLink& aLink, TBool aSelected ) = 0; + /** + * Check whether selection is permitted + * + * @return Check result + */ + virtual TBool IsSelectPermitted() = 0; + protected: // Protected functions diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/inc/cpbk2commandactivator.h --- a/phonebookui/Phonebook2/inc/cpbk2commandactivator.h Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/inc/cpbk2commandactivator.h Thu Aug 19 09:41:07 2010 +0300 @@ -52,7 +52,7 @@ void ExecuteLD(); void ResetUiControl(MPbk2ContactUiControl& aUiControl); void AddObserver( MPbk2CommandObserver& aObserver ); - + TAny* CommandExtension(TUid /*aExtensionUid*/); private: // MPbk2CommandObserver void CommandFinished( const MPbk2Command& aCommand ); diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Phonebook2/xSPExtensionManager/src/CxSPViewActivator.cpp --- a/phonebookui/Phonebook2/xSPExtensionManager/src/CxSPViewActivator.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/phonebookui/Phonebook2/xSPExtensionManager/src/CxSPViewActivator.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -21,6 +21,7 @@ #include "CxSPViewActivator.h" #include #include "CxSPViewInfo.h" +#include // System includes @@ -137,17 +138,34 @@ newViewId = viewID; } - aMessage.Complete(err); + // If err is KErrNone or KErrNotFound, complete client's request with KErrNone. + // The reason is even if client passed an invalid view id to xsp server, + // the server will launch phonebook namelist view instead. + if ( KErrNone == err || KErrNotFound == err ) + { + aMessage.Complete( KErrNone ); + } + else + { + aMessage.Complete( err ); + } - if(err == KErrNone) + if( err == KErrNone ) { // Make view id - const TVwsViewId viewId(TUid::Uid(KUid), TUid::Uid(newViewId)); + const TVwsViewId viewId( TUid::Uid( KUid ), TUid::Uid( newViewId ) ); // Activate the view static_cast(CCoeEnv::Static()->AppUi())->ActivateViewL( viewId, CPbk2ViewState::Uid(), *paramBuf); } - + else if ( err == KErrNotFound ) + { + // Activate phonebook namelist view if valid view id can't be found + const TVwsViewId viewId( TUid::Uid( KUid ), TUid::Uid( EPbk2NamesListViewId ) ); + static_cast( CCoeEnv::Static()->AppUi() )->ActivateViewL( + viewId, CPbk2ViewState::Uid(), *paramBuf ); + } + CleanupStack::PopAndDestroy(); // paramBuf; } } diff -r 2666d9724c76 -r d4f567ce2e7c phonebookui/Speeddial/help/data/xhtml.zip Binary file phonebookui/Speeddial/help/data/xhtml.zip has changed diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsAlgorithm/Algorithm1/inc/CPcsAlgorithm1.h --- a/predictivesearch/PcsAlgorithm/Algorithm1/inc/CPcsAlgorithm1.h Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsAlgorithm/Algorithm1/inc/CPcsAlgorithm1.h Thu Aug 19 09:41:07 2010 +0300 @@ -308,12 +308,19 @@ /** * launch plugins by idle */ - void DoLaunchPluginsL(); + void DoLaunchPluginsL(); /** * launch plugins */ - static TInt DoLaunchPluginsL(TAny* aPtr); + static TInt DoLaunchPluginsL(TAny* aPtr); + + /** + * Get the Adaptive Grid data for one or more URIs + */ + void GetAdaptiveGridFromCacheL( const MDesCArray& aURIs, + const TBool aCompanyName, + TDes& aAdaptiveGrid ); private: diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsAlgorithm/Algorithm1/src/CPcsAlgorithm1.cpp --- a/predictivesearch/PcsAlgorithm/Algorithm1/src/CPcsAlgorithm1.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsAlgorithm/Algorithm1/src/CPcsAlgorithm1.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -908,68 +908,115 @@ // ---------------------------------------------------------------------------- void CPcsAlgorithm1::UpdateCachingStatus(TDesC& aDataStore, TInt aStatus) { - PRINT ( _L("Enter CPcsAlgorithm1::UpdateCachingStatus") ); - - // Handle data store update events - if ( aStatus == ECacheUpdateContactRemoved || - aStatus == ECacheUpdateContactModified || - aStatus == ECacheUpdateContactAdded ) - { + PRINT ( _L("Enter CPcsAlgorithm1::UpdateCachingStatus") ); + PRINT2 ( _L("CPcsAlgorithm1::UpdateCachingStatus: Request received for URI=%S with status=%d"), + &aDataStore, aStatus ); + + // Handle data store update events + if ( aStatus == ECacheUpdateContactRemoved || + aStatus == ECacheUpdateContactModified || + aStatus == ECacheUpdateContactAdded ) + { HandleCacheUpdated( static_cast(aStatus) ); return; - } - - // If not a cache update event, then this event is related to the initial - // cache construction. - TInt index = FindStoreUri(aDataStore); - - iPcsCache[index]->UpdateCacheStatus(aStatus); - - // Check if any error occurred - // If so, update the cache status, Set the property and return - if ( aStatus < 0 ) - { - SetCachingError(aDataStore, aStatus); - //return; - } - - // No error occurred - TCachingStatus status = ECachingComplete; - TBool atLeastOneStoreCachingCompleteWithErrors(EFalse); - for ( TInt i = 0; i < iPcsCache.Count(); i++ ) - { - if ( iPcsCache[i]->GetCacheStatus() == ECachingComplete ) - { - continue; - } - else if ( iPcsCache[i]->GetCacheStatus() == ECachingCompleteWithErrors ) - { - atLeastOneStoreCachingCompleteWithErrors = ETrue; - continue; - } - else - { - status = ECachingInProgress; - break; - } - } - - if ( status == ECachingComplete ) - { - // See if any error occurred while caching - // If so, change the status to ECachingCompleteWithErrors - if (( iCacheError != KErrNone ) || (atLeastOneStoreCachingCompleteWithErrors)) - status = ECachingCompleteWithErrors; - } - - // Check if status changed - if ( status != iCacheStatus ) - { - iCacheStatus = status; - RProperty::Set(KPcsInternalUidCacheStatus, EPsKeyCacheStatus, iCacheStatus ); - } - - PRINT ( _L("End CPcsAlgorithm1::UpdateCachingStatus") ); + } + + // If not a cache update event, then this event is related to the initial + // cache construction. + + // Check if any error occurred and update the cache error + if ( aStatus < 0 ) + { + SetCachingError(aDataStore, aStatus); + } + else + { + TInt index = FindStoreUri(aDataStore); + iPcsCache[index]->UpdateCacheStatus(aStatus); + } + + TCachingStatus status = ECachingNotStarted; + TUint countNotStarted = 0; + TUint countInProgress = 0; + TUint countCompleted = 0; + TUint countCompletedWithErrors = 0; + TInt cacheCount = iPcsCache.Count(); + for ( TInt i = 0; i < cacheCount; i++ ) + { + PRINT3 ( _L("CPcsAlgorithm1::UpdateCachingStatus: URI[%d]=%S, cache status=%d"), + i, &iPcsCache[i]->GetURI(), iPcsCache[i]->GetCacheStatus() ); + + switch ( iPcsCache[i]->GetCacheStatus() ) + { + case ECachingNotStarted: + { + countNotStarted++; + break; + } + case ECachingInProgress: + { + countInProgress++; + break; + } + case ECachingComplete: + { + countCompleted++; + break; + } + case ECachingCompleteWithErrors: + { + countCompletedWithErrors++; + break; + } + default: + { + // Default completed state + countCompleted++; + break; + } + } + } + + // Calculate cumulative status according to single caches statuses + if ( countCompleted > 0 && ( countCompleted + countNotStarted ) == cacheCount ) + { + // If at least one caching is finished + // set status to ECachingComplete or ECachingCompleteWithErrors + // according to iCacheError + status = ( iCacheError == KErrNone ) ? ECachingComplete : ECachingCompleteWithErrors; + } + else if ( countInProgress > 0 ) + { + // Else if at least one caching is in progress, + // set status to ECachingInProgress + status = ECachingInProgress; + } + else if ( countCompletedWithErrors > 0 ) + { + // Else if at least one caching is completed with errors, + //set status to ECachingCompleteWithErrors + status = ECachingCompleteWithErrors; + } + else + { + // countNotStarted == cacheCount + // status is set to default ECachingNotStarted + } + + PRINT1 ( _L("CPcsAlgorithm1::UpdateCachingStatus: Cumulative caching status is %d"), + status ); + + // Check if status changed + if ( status != iCacheStatus ) + { + PRINT2 ( _L("CPcsAlgorithm1::UpdateCachingStatus: Cumulative caching changed: %d -> %d"), + iCacheStatus, status ); + + iCacheStatus = status; + RProperty::Set(KPcsInternalUidCacheStatus, EPsKeyCacheStatus, iCacheStatus ); + } + + PRINT( _L("End CPcsAlgorithm1::UpdateCachingStatus") ); } // ---------------------------------------------------------------------------- @@ -978,7 +1025,7 @@ // ---------------------------------------------------------------------------- void CPcsAlgorithm1::SetCachingError(const TDesC& aDataStore, TInt aError) { - PRINT2 ( _L("SetCachingError::URI %S ERROR %d"), &aDataStore, aError ); + PRINT2 ( _L("CPcsAlgorithm1::SetCachingError: URI=%S, ERROR=%d"), &aDataStore, aError ); iCacheError = aError; RProperty::Set( KPcsInternalUidCacheStatus, EPsKeyCacheError, iCacheError ); @@ -1326,9 +1373,35 @@ PRINT1 ( _L("CPcsAlgorithm1::GetAdaptiveGridL. Request of Adaptive Grid for %d URI(s)"), aURIs.MdcaCount() ); + if ( iCacheStatus != ECachingComplete ) + { + PRINT ( _L("CPcsAlgorithm1::GetAdaptiveGridL: PCS Caching is not ready, returning empty Adaptive Grid") ); + aAdaptiveGrid.Zero(); + } + else + { + GetAdaptiveGridFromCacheL( aURIs, aCompanyName, aAdaptiveGrid ); + } + + PRINT ( _L("End CPcsAlgorithm1::GetAdaptiveGridL") ); +} + +// ---------------------------------------------------------------------------- +// CPcsAlgorithm1::GetAdaptiveGridFromCacheL +// +// ---------------------------------------------------------------------------- +void CPcsAlgorithm1::GetAdaptiveGridFromCacheL( const MDesCArray& aURIs, + const TBool aCompanyName, + TDes& aAdaptiveGrid ) +{ + PRINT ( _L("Enter CPcsAlgorithm1::GetAdaptiveGridFromCacheL") ); + + PRINT1 ( _L("CPcsAlgorithm1::GetAdaptiveGridFromCacheL. Request of Adaptive Grid for %d URI(s)"), + aURIs.MdcaCount() ); + RArray cacheIds; CleanupClosePushL( cacheIds ); - + // Create the list of the cache indexes that will form the Adaptive Grid for ( TInt i=0; i < aURIs.MdcaCount(); i++ ) { @@ -1337,7 +1410,7 @@ // If URI is a group URI skip it if ( CPcsAlgorithm1Utils::IsGroupUri( uri ) ) { - PRINT1 ( _L("CPcsAlgorithm1::GetAdaptiveGridL. Adaptive Grid for URI \"%S\" is not supported. Skipping"), + PRINT1 ( _L("CPcsAlgorithm1::GetAdaptiveGridFromCacheL. Adaptive Grid for URI \"%S\" is not supported. Skipping"), &uri ); continue; } @@ -1345,18 +1418,18 @@ TInt cacheIndex = GetCacheIndex( uri ); if ( cacheIndex == KErrNotFound ) { - PRINT1 ( _L("CPcsAlgorithm1::GetAdaptiveGridL. Cache for URI \"%S\" doesn't exist"), + PRINT1 ( _L("CPcsAlgorithm1::GetAdaptiveGridFromCacheL. Cache for URI \"%S\" doesn't exist"), &uri ); continue; } - PRINT1 ( _L("CPcsAlgorithm1::GetAdaptiveGridL. Cache for URI \"%S\" will be used to form the Adaptive Grid"), + PRINT1 ( _L("CPcsAlgorithm1::GetAdaptiveGridFromCacheL. Cache for URI \"%S\" will be used to form the Adaptive Grid"), &uri ); cacheIds.AppendL( cacheIndex ); } - PRINT1 ( _L("CPcsAlgorithm1::GetAdaptiveGridL. Number of caches that will be used to form the grid is %d"), + PRINT1 ( _L("CPcsAlgorithm1::GetAdaptiveGridFromCacheL. Number of caches that will be used to form the grid is %d"), cacheIds.Count( ) ); // Create the Adaptive Grid from the cache(s) @@ -1368,7 +1441,7 @@ // Get the Adaptive Grid cache->GetAdaptiveGridL( aCompanyName, aAdaptiveGrid ); - PRINT1 ( _L("CPcsAlgorithm1::GetAdaptiveGridL. Adaptive Grid: \"%S\" (No merge was needed)"), + PRINT1 ( _L("CPcsAlgorithm1::GetAdaptiveGridFromCacheL. Adaptive Grid: \"%S\" (No merge was needed)"), &aAdaptiveGrid ); } else if ( cacheIds.Count() > 1 ) // Merge if we have more than one cache @@ -1394,7 +1467,7 @@ gridOnePtr.Zero(); cache->GetAdaptiveGridL( aCompanyName, gridOnePtr ); - PRINT2 ( _L("CPcsAlgorithm1::GetAdaptiveGridL. Adaptive Grid for cache \"%S\" is \"%S\""), + PRINT2 ( _L("CPcsAlgorithm1::GetAdaptiveGridFromCacheL. Adaptive Grid for cache \"%S\" is \"%S\""), &cache->GetURI(), &gridOnePtr ); // Loop through the characters of the Adaptive Grid for the cache @@ -1421,7 +1494,7 @@ aAdaptiveGrid.Append( gridAll[i] ); } - PRINT1 ( _L("CPcsAlgorithm1::GetAdaptiveGridL. Adaptive Grid: \"%S\" (Merge was done)"), + PRINT1 ( _L("CPcsAlgorithm1::GetAdaptiveGridFromCacheL. Adaptive Grid: \"%S\" (Merge was done)"), &aAdaptiveGrid ); CleanupStack::PopAndDestroy( gridOne ); @@ -1430,7 +1503,7 @@ CleanupStack::PopAndDestroy( &cacheIds ); // Close - PRINT ( _L("End CPcsAlgorithm1::GetAdaptiveGridL") ); + PRINT ( _L("End CPcsAlgorithm1::GetAdaptiveGridFromCacheL") ); } // --------------------------------------------------------------------------------- diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsAlgorithm/Algorithm2/group/PcsAlgorithm2.mmp --- a/predictivesearch/PcsAlgorithm/Algorithm2/group/PcsAlgorithm2.mmp Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsAlgorithm/Algorithm2/group/PcsAlgorithm2.mmp Thu Aug 19 09:41:07 2010 +0300 @@ -40,8 +40,8 @@ SOURCE CPcsPoolElement.cpp SOURCE CPcsKeyMap.cpp SOURCE CPsDataPluginInterface.cpp -SOURCE FindUtilChineseECE.cpp -SOURCE chinesefindutils.cpp +SOURCE chinesefindutils.cpp +SOURCE FindUtilChineseECE.cpp USERINCLUDE ../inc USERINCLUDE ../../inc @@ -65,3 +65,4 @@ LIBRARY fepbase.lib LIBRARY centralrepository.lib LIBRARY findutil.lib +LIBRARY pbkeng.lib diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsAlgorithm2.h --- a/predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsAlgorithm2.h Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsAlgorithm2.h Thu Aug 19 09:41:07 2010 +0300 @@ -54,8 +54,7 @@ // CLASS DECLARATION class CPcsAlgorithm2 : public CPcsPlugin, public MDataStoreObserver, -public MStoreListObserver, -public MFindStringConverter +public MStoreListObserver { public: @@ -80,7 +79,7 @@ void PerformSearchL(const CPsSettings& aPcsSettings, CPsQuery& aCondition, RPointerArray& aData, - RPointerArray& aPattern); + RPointerArray& aPattern); /** * Search Function for input string @@ -88,15 +87,15 @@ void SearchInputL(CPsQuery& aSearchQuery, TDesC& aSearchData, RPointerArray& aMatchSet, - RArray& aMatchLocation ); + RArray& aMatchLocation ); /** * Performs search on a input string, and return result also as a string */ void SearchMatchStringL( CPsQuery& aSearchQuery, - TDesC& aSearchData, - TDes& aMatch ); + TDesC& aSearchData, + TDes& aMatch ); /** * Returns ETrue if this language is supported @@ -118,12 +117,6 @@ */ void ChangeSortOrderL(TDesC& aURI, RArray& aSortOrder); - /** - * Get the Adaptive Grid for one or more URIs - */ - void GetAdaptiveGridL( const MDesCArray& aURIs, - const TBool aCompanyName, - TDes& aAdaptiveGrid ); // -------------------------------------------------------------------- @@ -134,22 +127,29 @@ /** * Add a contact to the cache */ - void AddData ( TDesC& aDataStore, CPsData* aData); + void AddData( TDesC& aDataStore, CPsData* aData ); /** - * Remove a contact from the cache based on contact id + * Remove a contact from the cache based on contact id */ - void RemoveData ( TDesC& aDataStore, TInt aItemId ); + void RemoveData( TDesC& aDataStore, TInt aItemId ); /** * Removes all the contacts from a particular datastore */ - void RemoveAll ( TDesC& aDataStore); + void RemoveAll( TDesC& aDataStore ); /** * Updates the caching status for a particular datastore */ void UpdateCachingStatus(TDesC& aDataStore, TInt aStatus); + + /** + * Get the Adaptive Grid for one or more URIs + */ + void GetAdaptiveGridL( const MDesCArray& aURIs, + const TBool aCompanyName, + TDes& aAdaptiveGrid ); // -------------------------------------------------------------------- @@ -160,12 +160,12 @@ /** * This method is called whenever any new store has been added */ - void AddDataStore ( TDesC& aDataStore); + void AddDataStore( TDesC& aDataStore ); /** * This method is called whenever a data store is removed */ - void RemoveDataStore ( TDesC& aDataStore); + void RemoveDataStore( TDesC& aDataStore ); // -------------------------------------------------------------------- @@ -174,7 +174,7 @@ /** * Returns the array index of cache (in iPcsCache) for a datastore */ - TInt GetCacheIndex(TDesC& aDataStore); + TInt GetCacheIndex(const TDesC& aDataStore); /** * Return the cache instance at a specific array index @@ -190,8 +190,14 @@ inline CPcsKeyMap* GetKeyMap() { return iKeyMap; - }; + } + inline CFindUtilChineseECE* FindUtilECE() + { + return iFindUtilECE; + } + + void ReconstructCacheDataL(); private: @@ -215,48 +221,54 @@ void DefinePropertyL( TPcsInternalKeyCacheStatus aPsKey ); /** - * Replace occurance of "0" in ITU-T mode with space + * Remove leading and trailing spaces of search query */ - TBool ReplaceZeroWithSpaceL(CPsQuery& aQuery); + void RemoveSpacesL( CPsQuery& aQuery ); + + /** + * Replace occurances of "0" in predictive mode with space + * if those are on the same button + */ + TBool ReplaceZeroWithSpaceL( CPsQuery& aQuery ); /** * Search function helper */ - void DoSearchL(const CPsSettings& aPcsSettings, - CPsQuery& aCondition, - RPointerArray& searchResults, - RPointerArray& searchSeqs ); + void DoSearchL( const CPsSettings& aPcsSettings, + CPsQuery& aCondition, + RPointerArray& aSearchResults, + RPointerArray& aSearchSeqs ); /** * Search function helper */ - void DoSearchInputL(CPsQuery& aQuery, - TDesC& aData, - RPointerArray& searchSeqs, - RArray& aMatchLocation ); + void DoSearchInputL( CPsQuery& aQuery, + const TDesC& aData, + RPointerArray& aSearchSeqs, + RArray& aMatchLocation ); /** * Returns the index corresponding a URI in iDataStoreUri */ - TInt FindStoreUri ( TDesC& aDataStoreUri ); + TInt FindStoreUri( const TDesC& aDataStoreUri ); /** * Function to return all cached content */ - void GetAllContentsL(const CPsSettings& aPcsSettings, - RPointerArray& searchResults ); + void GetAllContentsL( const CPsSettings& aPcsSettings, + RPointerArray& aSearchResults ); /** * Checks if search is on groups - * Return ETrue if there is a valid group URI + * Return ETrue if there is a valid group URI */ - TBool IsGroupSearchL ( CPsSettings& aSettings, - RArray& aGroupIdArray ); + TBool IsGroupSearchL( CPsSettings& aSettings, + RArray& aGroupIdArray ); /** * Utility function to replace groups uri with that of contacts uri */ - void ReplaceGroupsUriL ( CPsSettings& aSettings ); + void ReplaceGroupsUriL( CPsSettings& aSettings ); /** * Filters the search results array for groups @@ -266,8 +278,8 @@ /** * Get the list of contact ids that belong to a group. - */ - void GetContactsInGroupL ( TInt aGroupId, + */ + void GetContactsInGroupL( TInt aGroupId, RArray& aGroupContactIds ); /** @@ -275,31 +287,30 @@ * @param aURI - The data store URI for which sort order is required * @param aSortOrder - The persisted sort order from the cenrep */ - void ReadSortOrderFromCenRepL ( TDesC& aURI, + void ReadSortOrderFromCenRepL( const TDesC& aURI, RArray& aSortOrder ); /** Write sort order for a data store to the central repository * @param aURI - The data store URI for which sort order is to be persisted * @param aSortOrder - The sort order to be persisted */ - void WriteSortOrderToCenRepL ( TDesC& aURI, - RArray& aSortOrder ); + void WriteSortOrderToCenRepL( const TDesC& aURI, + RArray& aSortOrder ); /** * Utility function that sets the caching error value - */ - void SetCachingError ( TDesC& aDataStore, - TInt aError ); + */ + void SetCachingError( const TDesC& aDataStore, TInt aError ); /** - * Write the content required by client + * Write the content required by client */ - CPsClientData* WriteClientDataL ( CPsData& aPsData ); + CPsClientData* WriteClientDataL( CPsData& aPsData ); /** * Function to return data base URI for an internal identifier - */ - TDesC& GetUriForIdL( TUint8 aUriId ); + */ + const TDesC& GetUriForIdL( TUint8 aUriId ); /** * Inform clients about update happened on the cache @@ -316,45 +327,18 @@ */ static TInt DoLaunchPluginsL(TAny* aPtr); -public: - - inline TInt GetFirstNameIndex() - { - return iFirstNameIndex; - } - - inline TInt GetLastNameIndex() - { - return iLastNameIndex; - } - - inline CFindUtilChineseECE* FindUtilECE() - { - return iFindUtilECE; - } - - inline CFindUtil* FindUtil() - { - return iFindUtil; - } - - void ReconstructCacheDataL(); - -public: // From MFindStringConverter - void Converter(const TDesC& aSourStr, TDes& aDestStr); - private: /** * Instance of contacts cache * Own */ - RPointerArray iPcsCache; + RPointerArray iPcsCache; /** * Keeps the count of caches */ - TUint8 iCacheCount; + TUint8 iCacheCount; /** * Instance of key map @@ -387,13 +371,6 @@ // Own: Find util used to match contacts and construct character grid CFindUtilChineseECE* iFindUtilECE; - // Own: Find util used to match contacts and construct character grid - CFindUtil* iFindUtil; - - // keep the index for Firstname and Lastname - TInt iFirstNameIndex; - TInt iLastNameIndex; - /** * plugin laucher, make the plugin instantiation async */ diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsAlgorithm2FilterHelper.h --- a/predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsAlgorithm2FilterHelper.h Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsAlgorithm2FilterHelper.h Thu Aug 19 09:41:07 2010 +0300 @@ -91,7 +91,7 @@ /** * 2nd phase construtor */ - void ConstructL(TSortType aSortType); + void ConstructL(TSortType aSortType); /** * Adds each result into respective pool based on match pattern @@ -102,7 +102,7 @@ * Searches for for aSeq in iMatchPatternDetails and returns index * where input sequence is found. Returns -1 if not found */ - TInt FindSequence(TDesC* aSeq); + TInt FindSequence(const TDesC& aSeq); /** @@ -110,19 +110,19 @@ * and returns index where input sequence is found. * Returns -1 if not found */ - TInt FindSubSequence(TDesC* aSeq,TInt aPatternIndex); + TInt FindSubSequence(const TDesC& aSeq, TInt aPatternIndex); /** * Creates the Matchpattern aSeq in iMatchPatternDetails. * Returns the index of the sequence in iMatchPatternDetails */ - TInt CreateMatchPatternDetailsAndPoolsL(TDesC* aSeq); + TInt CreateMatchPatternDetailsAndPoolsL(const TDesC& aSeq); /** * Searches for all the subsequences of aSeq and updates the * aFirstOccrVal in iMatchPatternDetails. */ - void UpdateForSubSequencesL(TDesC& aSeq,TInt aFirstOccrVal); + void UpdateForSubSequencesL(const TDesC& aSeq, TInt aFirstOccrVal); private: diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsAlgorithm2Helper.h --- a/predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsAlgorithm2Helper.h Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsAlgorithm2Helper.h Thu Aug 19 09:41:07 2010 +0300 @@ -22,6 +22,7 @@ #include #include #include +#include // For name order setting #include "CPcsPlugin.h" #include "CPsData.h" @@ -36,7 +37,7 @@ class CPsDataPluginInterface; // CLASS DECLARATION -class CPcsAlgorithm2Helper : public CBase +class CPcsAlgorithm2Helper : public CBase, private MPbkGlobalSettingObserver { public: @@ -53,78 +54,52 @@ private: /** - * Filter subset results for ITU-T Mode. Entire search query is - * entered in ITU-T mode. - */ - void FilterResultsL(CPcsAlgorithm2FilterHelper* aAlgorithmFilterHelper, - RPointerArray& searchSet, - const TDesC& searchQuery, TBool isSearchInGroup, - RArray& aContactsInGroup); - /** - * Filter subset results for Qwerty Mode. Entire search query is - * entered in Qwerty mode. + * Filter subset results for Mixed mode. Some portion of query can be in + * ITU-T mode and some portion in Qwerty mode. */ - void FilterResultsQwertyL(CPcsAlgorithm2FilterHelper* aAlgorithmFilterHelper, - RPointerArray& searchSet, - const TDesC& searchQuery, TBool isSearchInGroup, - RArray& aContactsInGroup); - - /** - * Filter subset results for Mixed mode. Some portion of query is in - * ITU-T mode and some portion in Qwert mode. - */ - void FilterResultsMixedL(CPcsAlgorithm2FilterHelper* aAlgorithmFilterHelper, - RPointerArray& searchSet, - CPsQuery& searchQuery, TBool isSearchInGroup, - RArray& aContactsInGroup); - + void FilterResultsSingleL(CPcsAlgorithm2FilterHelper* aAlgorithmFilterHelper, + RPointerArray& aSearchSet, + CPsQuery& aSearchQuery, + TUint8 aFilteredDataMatch, + TBool aIsSearchInGroup, + const RArray& aContactsInGroup); + /** - * Convert the search query to a string. - * If the mode is ITU-T, character is converted to numeric. - * If the mode is Qwerty, character is retained as is. + * Create a buffer containing the first name and last name of a contact in the + * order specified in Phonebook settings. */ - void ExtractQueryL(CPsQuery& aPsQuery, TDes& aOutput); - + HBufC* CreateNameBufLC( const CPsData& aContactData, TInt aFirstNameIndex, TInt aLastNameIndex ) const; + /** - * Convert the input search query to a string. - * Mode is referred in the CPsQuery. - * If the mode is ITU-T, character is converted to numeric. - * If the mode is Qwerty, character is retained as is. + * Get and store the order of first and last name. */ - void ExtractQueryL(TDesC& aInput, CPsQuery& aPsQuery, TDes& aOutput); - -public: + void UpdateNameOrderL(); +private: // from MPbkGlobalSettingObserver /** - * Search Function for ITU-T style + * React to change in Phonebook settings. */ - void SearchITUL(const CPsSettings& aSettings, CPsQuery& aQuery, - TBool isGroupSearch, RArray& aContactsInGroup, - RPointerArray& searchResults, - RPointerArray& searchSeqs); - - /** - * Search Function for QWERTY style - */ - void SearchQWERTYL(const CPsSettings& aSettings, CPsQuery& aQuery, - TBool isGroupSearch, RArray& aContactsInGroup, - RPointerArray& searchResults, - RPointerArray& searchSeqs); + void SettingChangedL( MPbkGlobalSetting::TPbkGlobalSetting aKey ); + +public: /** * Search Function for mixed style * Some chars are entered in ITU-T and some in QWERTY */ - void SearchMixedL(const CPsSettings& aSettings, CPsQuery& aQuery, - TBool isGroupSearch, RArray& aContactsInGroup, - RPointerArray& searchResults, - RPointerArray& searchSeqs); + void SearchSingleL(const CPsSettings& aSettings, + CPsQuery& aQuery, + TBool aIsGroupSearch, + const RArray& aContactsInGroup, + RPointerArray& aSearchResults, + RPointerArray& aSearchSeqs); /** * Funciton to search matching sequences in the input text */ - void SearchMatchSeqL(HBufC* aQuery, TDesC& aData, - RPointerArray& aMatchSet, CPsQuery& aPsQuery, + void SearchMatchSeqL(CPsQuery& aPsQuery, + const TDesC& aData, + RPointerArray& aMatchSet, RArray& aMatchLocation); /** @@ -135,16 +110,6 @@ private: /** - * Constructs a bit pattern using the required/supported data fields - * For example, 6, 4 and 27 are supported fields <-- 00000111 - * 6 and 4 are required fields <-- 00000011 - * Bit pattern returned is 00000011. - */ - TUint8 FilterDataFieldsL(RArray& aRequiredDataFields, - RArray& aSupportedDataFields); -private: - - /** * Constructor */ CPcsAlgorithm2Helper(); @@ -164,13 +129,33 @@ /** * Pointer to key map instance. Not owned. */ - CPcsKeyMap* keyMap; + CPcsKeyMap* iKeyMap; /** * Array of result sets from different data stores. */ typedef RPointerArray CPSDATA_R_PTR_ARRAY; RPointerArray iSearchResultsArr; + + /** + * Phonebook settings store for reading name order. + */ + MPbkGlobalSetting* iPbkSettings; + + /** + * Contact name display order + */ + enum TNameOrder + { + EFirstnameLastname, + ELastnameFirstname + }; + TNameOrder iNameOrder; + + /** + * Counter of the matched contacts requested by PCS client + */ + TInt iMaxCount; }; #endif // C_PCS_ALGORITHM_2_HELPER diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsAlgorithm2MultiSearchHelper.h --- a/predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsAlgorithm2MultiSearchHelper.h Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsAlgorithm2MultiSearchHelper.h Thu Aug 19 09:41:07 2010 +0300 @@ -64,33 +64,11 @@ * Filter subset results for multi query mode. */ void FilterResultsMultiL(CPcsAlgorithm2FilterHelper* aAlgorithmFilterHelper, - RPointerArray& searchSet, - RPointerArray& searchQuery, TUint8 aFilteredDataMatch, - TBool isGroupSearch, RArray& aContactsInGroup, - TInt keyboardMode); - - /** - * Convert the search query to a string. - * If the mode is ITU-T, character is converted to numeric. - * If the mode is Qwerty, character is retained as is. - */ - void ExtractQueryL(CPsQuery& aPsQuery, TDes& aOutput); - - /** - * Convert the input search query to a string. - * Mode is referred in the CPsQuery. - * If the mode is ITU-T, character is converted to numeric. - * If the mode is Qwerty, character is retained as is. - */ - void ExtractQueryL(TDesC& aInput, CPsQuery& aPsQuery, TDes& aOutput); - /** - * Converts the input data to the key board mode specified by the query. - * Mode is referred in the CPsQuery. - * If the mode is ITU-T, data is converted to numeric. - * If the mode is Qwerty, data is retained as is. - */ - void ConvertdDataToKeyBoardModeL(CPsQuery* aQuery, TPtrC aInputData, - TBuf& aOutputData); + RPointerArray& aSearchSet, + RPointerArray& aSearchQuery, + TUint8 aFilteredDataMatch, + TBool aIsGroupSearch, + const RArray& aContactsInGroup); public: @@ -98,29 +76,24 @@ * Search Function for multi query * Initials search feature */ - void SearchMultiL(const CPsSettings& aSettings, RPointerArray& aQuery, - TBool isGroupSearch, RArray& aContactsInGroup, - RPointerArray& searchResults, - RPointerArray& searchSeqs, TInt keyboardMode); + void SearchMultiL(const CPsSettings& aSettings, + RPointerArray& aQuery, + TBool aIsGroupSearch, + const RArray& aContactsInGroup, + RPointerArray& aSearchResults, + RPointerArray& aSearchSeqs); /** * Funtion to Search matching sequences for multi query */ void SearchMatchSeqMultiL(RPointerArray& aPsQuery, - TDesC& aData, RPointerArray& aMatchSet, + const TDesC& aData, + RPointerArray& aMatchSet, RArray& aMatchLocation); private: /** - * Constructs a bit pattern using the required/supported data fields - * For example, 6, 4 and 27 are supported fields <-- 00000111 - * 6 and 4 are required fields <-- 00000011 - * Bit pattern returned is 00000011. - */ - TUint8 FilterDataFieldsL(RArray& aRequiredDataFields, - RArray& aSupportedDataFields); - /** * Set the bits corresponding to word matches * * @param aIndex Index of data element @@ -155,12 +128,6 @@ */ RPointerArray MultiQueryL(CPsQuery& aQuery); - /** - * Convert the search query (multiple) to a list - */ - void ConvertQueryToListL(RPointerArray& aSearchQuery, - RPointerArray& aQueryList); - private: /** @@ -183,7 +150,7 @@ /** * Pointer to key map instance. Not owned. */ - CPcsKeyMap* keyMap; + CPcsKeyMap* iKeyMap; /** * Array of result sets from different data stores. @@ -195,6 +162,11 @@ * Array of word macthes. */ TUint8 iWordMatches[MAX_DATA_FIELDS]; + + /** + * Counter of the matched contacts + */ + TInt iMaxCount; }; #endif // C_PCS_ALGORITHM_2_MULTI_SEARCH_HELPER diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsAlgorithm2Utils.h --- a/predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsAlgorithm2Utils.h Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsAlgorithm2Utils.h Thu Aug 19 09:41:07 2010 +0300 @@ -20,11 +20,12 @@ // INCLUDE FILES -#include - -#include "CPsData.h" +#include // FORWARD DECLARATION +class CPsData; +class CPsQuery; +struct TPsMatchLocation; typedef RPointerArray CPSDATA_R_PTR_ARRAY; @@ -41,10 +42,10 @@ * works for all type of key board modes */ static void FormCompleteSearchResultsL(RPointerArray& aSearchResultsArr, - RPointerArray& SearchResults); + RPointerArray& aSearchResults); /** - * Customized CompareC + * Customized CompareC */ static TInt MyCompareC(const TDesC& aLeft, const TDesC& aRight); @@ -54,6 +55,16 @@ static TInt CompareDataBySortOrder(const CPsData& aObject1, const CPsData& aObject2); /** + * TIdentityRelation rule for comparing descriptors case-sensitively. + */ + static TBool CompareExact(const TDesC& aFirst, const TDesC& aSecond); + + /** + * TLinearOrder rule for comparing queries by length + */ + static TInt CompareLength(const CPsQuery& aFirst, const CPsQuery& aSecond); + + /** * Trim off all white spaces and special chars */ static void MyTrim(TDes& aString); @@ -62,8 +73,28 @@ * Check if the input URI is of contact search in a group template form */ static TBool IsGroupUri(TDesC& aURI); + + /** + * Constructs a bit pattern using the required/supported data fields + * For example, 6, 4 and 27 are supported fields <-- 00000111 + * 6 and 4 are required fields <-- 00000011 + * Bit pattern returned is 00000011. + */ + static TUint8 FilterDataFieldsL(const RArray& aRequiredDataFields, + const RArray& aSupportedDataFields); + + /** + * Create upper-case match sequence buffer from matching part and append it to + * array unless there's equal sequence already present. + */ + static void AppendMatchToSeqL( RPointerArray& aMatchSeq, const TDesC& aMatch ); + + /** + * Check if two match location items have overlapping indices. + */ + static TBool MatchesOverlap( const TPsMatchLocation& aFirst, const TPsMatchLocation& aSecond ); + }; - }; // CleanupStack helpers for item owning RPointerArrays template diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsCache.h --- a/predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsCache.h Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsCache.h Thu Aug 19 09:41:07 2010 +0300 @@ -38,7 +38,7 @@ /** * Two phase construction */ - static CPcsCache* NewL(CPcsAlgorithm2* aAlgorithm, TDesC& aURI, + static CPcsCache* NewL(CPcsAlgorithm2* aAlgorithm, const TDesC& aURI, CPcsKeyMap& aKeyMap, TUint8 aUriId); /** @@ -74,7 +74,7 @@ /** * Removes all data elements from the cache */ - void RemoveAllFromCacheL(); + void RemoveAllFromCache(); /** * Sets data fields to the cache @@ -125,6 +125,16 @@ */ void ResortdataInPoolsL(); + /** + * Get data index of the first name field + */ + TInt GetFirstNameIndex() const; + + /** + * Get data index of the last name field + */ + TInt GetLastNameIndex() const; + private: /** @@ -135,24 +145,36 @@ /** * Second phase constructor */ - void ConstructL(CPcsAlgorithm2* aAlgorithm, TDesC& aURI, + void ConstructL(CPcsAlgorithm2* aAlgorithm, const TDesC& aURI, CPcsKeyMap& aKeyMap, TUint8 aUriId); /** * Utility function to add a contact to the pool */ - void AddToPoolL(TInt& aInfo, CPsData& data); + void AddToPoolL(TUint64& aPoolMap, CPsData& aData); + + /** + * Utility function + */ + void SetPoolMap(TUint64& aPoolMap, TInt aArrayIndex); /** * Utility function */ - void SetPoolMap(TInt& aPoolMap, TInt aPoolId); + TBool GetPoolMap(TUint64& aPoolMap, TInt aArrayIndex); /** - * Utility function + * Gets all the first characters of the words in the data field according + * to which the contact should be inserted into cache. */ - TBool GetPoolMap(TInt& aPoolMap, TInt arrayIndex); - + void GetFirstCharsForDataL( const TDesC& aData, RArray& aFirstChars ) const; + + /** + * Gets all the pool IDs matching the given characters. If there are two predictive + * keyboards available, then pool IDs are given according to both keyboards. + */ + void GetPoolIdsForCharsL( const RArray& aChars, RArray& aPoolIds ) const; + /** * Utility function */ @@ -165,27 +187,27 @@ * Array of key maps */ typedef RPointerArray R_PTR_ARRAY; - RPointerArray keyArr; + RPointerArray iKeyArr; /* * Hashmaps to remember the location of a contact in the pools */ - RHashMap cacheInfo; + RHashMap iCacheInfo; /* * Master pool of all contacts in this cache */ - RPointerArray masterPool; + RPointerArray iMasterPool; /* * Master pool backup of all contacts in this cache when sortorder changed */ - RPointerArray masterPoolBackup; + RPointerArray iMasterPoolBackup; /* * Not owned */ - CPcsKeyMap* keyMap; + CPcsKeyMap* iKeyMap; /** * Owned. Refer to the database URI this cache is for. diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsKeyMap.h --- a/predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsKeyMap.h Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsKeyMap.h Thu Aug 19 09:41:07 2010 +0300 @@ -18,24 +18,22 @@ #ifndef __CPCS_KEY_MAP_ALGORITHM_2_H__ #define __CPCS_KEY_MAP_ALGORITHM_2_H__ -// The macro is used for a hack which fix a problem of PtiEngine with Sonja keyboard. -// The problem is that J/# key can't returned character code ('J', 'j', '#') -#define HACK_FOR_E72_J_KEY // INCLUDES #include -#include -#include -#include #include +#include +#include "CPcsDefs.h" class CPcsAlgorithm2; -class CPtiEngine; +class CPsQuery; +class CPtiEngine; +class CPtiKeyMapData; class TKeyMappingData { public: - TPtiKey key; // key + TPtiKey iKey; // key RArray iKeyMappingArray; // All the characters mapped to the key }; @@ -56,14 +54,15 @@ virtual ~CPcsKeyMap(); /** - * Converts the alphanumeric string to numeric string + * Convert functions to get the key string from query and/or chars string */ - void GetNumericKeyString(const TDesC& alphaNumericStr, TDes& numericStr); + void GetMixedKeyStringForQueryL(CPsQuery& aSrcQuery, TDes& aDestStr) const; + void GetMixedKeyStringForDataL(CPsQuery& aSrcQuery, const TDesC& aSrcData, TDes& aDestStr) const; /** - * Returns the numeric key id corresponding to a specific character + * Returns the numeric key id corresponding to a specific character */ - TInt KeyForCharacter(const TChar& aChar); + TPtiKey KeyForCharacter(TText aChar, TKeyboardModes aKbMode) const; /** * Returns ETrue if this language is supported @@ -73,15 +72,20 @@ void ReconstructKeymapL(); /** - * Returns the pool Id for a Character + * Returns the pool Id for a key */ - TInt PoolIdForCharacter(TChar aChar); + TInt PoolIdForCharacter(TChar aChar, TKeyboardModes aKbMode ); /** - * Returns total number of pools + * Returns total number of pools */ TInt PoolCount(); + /** + * Returns true if the characters "0" and " " are on the same key + */ + TBool GetSpaceAndZeroOnSameKey( TKeyboardModes aMode ); + private: /** @@ -95,41 +99,42 @@ void ConstructL(CPcsAlgorithm2* aAlgorithm); /** + * Set flags to indicate if space and zero are on same key. + * Keymappings must be constructed before calling this. + */ + void SetSpaceAndZeroOnSameKey(); + + /** * Helper function to construct keyboard specific mappings */ - void ContructForItutKeyboardL(TLanguage aLanguage); - void ContructForHalfQwertyKeyboardL(TLanguage aLanguage); - void ContructFor4x10QwertyKeyboardL(TLanguage aLanguage); + void ConstructForItutKeyboardL(); + void ConstructForQwertyKeyboardL(TPtiKeyboardType aKbType); /** * Helper function to populate Itut key mappings */ void AddKeyMapforItutL(TLanguage aLanguage); - void AddDataForItutKeyboardL(CPtiKeyMappings* aPtiKeyMappings, + void AddDataForItutKeyboardL(CPtiKeyMapData* aPtiKeyMapData, TPtiKey aKey, TKeyMappingData& aKeyDataList); /** * Helper function to populate 4x10 Qwerty Keyboard key mappings */ - void AddKeyMapfor4x10QwertyKeyboardL(TLanguage aLanguage); + void AddKeyMapForQwertyKeyboardL(TLanguage aLanguage, TPtiKeyboardType aKbType); - void AddDataFor4x10QwertyKeyboardL( - CPtiQwertyKeyMappings* aPtiKeyMappings, TPtiKey aKey, + void AddDataForQwertyKeyboardL( + CPtiKeyMapData* aPtiKeyMapData, + TPtiKeyboardType aKbType, + TPtiKey aKey, TKeyMappingData& aKeyDataList); -#ifdef HACK_FOR_E72_J_KEY - void AddDataFor4x10QwertyKeyboardE72HackL(); // Hack for E72 (J/# key) -#endif // HACK_FOR_E72_J_KEY - /** - * Helper function to populate alfQwerty Keyboard key mappings + * Create list of PTI keys for the given keyboard type */ - void AddKeyMapforHalfQwertyKeyboardL(TLanguage aLanguage); - - void AddDataForHalfQwertyKeyboardL(CPtiHalfQwertyKeyMappings* aPtiKeyMappings, - TPtiKey aKey, TKeyMappingData& aKeyDataList); + void CreateKeyListFromKeyBindingTable( RArray& aKeyArray, TPtiKeyboardType aKbType ); void ResetKeyMap(); + /** * Function to construct key mappings for a particula language * @@ -137,18 +142,15 @@ void ConstructKeymapL(); /** - * Get the current keyboard type. - * @return current keyboard type. + * Select keyboard types according to available physical keyboard(s) */ - TInt CurrentKeyBoardTypeL(); + void SetupKeyboardTypesL(); /** * - * Construct keymap by type and language - * @ aKeyboardType, the current keyboard type. - * @ aLanguage, the keymap construct language. + * Construct keymaps */ - void ConstructConcreteKeyMapL( TInt aKeyboardType, TLanguage aLanguage ); + void ConstructConcreteKeyMapL(); /** * @@ -156,35 +158,104 @@ * @ aKeyboardType, the current keyboard type. * @ aLanguage, the keymap construct language. */ - void AddKeyMapforConcreteKeyboardL( TInt aKeyboardType, TLanguage aLanguage ); - + void AddKeyMapforConcreteKeyboardL( TLanguage aLanguage ); + /** * In case the given character is a Chinese characer, give the first * character of it's first spelling using the current spelling mode. * Otherwise, the character is returned unmodified. */ TChar FirstCharFromSpellingL( TChar aChar ) const; + + TInt PoolIdForKey(TPtiKey aKey, TKeyboardModes aKbMode) const; + + /** + * Gets predictive keyboard mapping data for given match mode. + * @param aMode Matching mode for which keymappings are asked. + * @return Mapping table for the given mode. NULL if asked for non-predictive mode. + */ + const RPointerArray* KeyMappings( TKeyboardModes aMode ) const; + /** + * Resolve any ambiguity from the given keyboard mode. + * Keyboard mode "predictive default keyboard" will be replaced by + * "ITU-T predictive" or "QWERTY predictive", depending on the configuration + * of the device. Predictive keyboard modes, which can't be supported + * in this device, are replaced with "non-predictive" mode. + */ + TKeyboardModes ResolveKeyboardMode( TKeyboardModes aKbMode ) const; + + /** + * Get the default charcter for the given key in given keyboard. + * The default character is used to construct the compare string for + * predictive mode. + */ + TText DefaultCharForKey( TPtiKey aKey, TKeyboardModes aKbMode ) const; + private: + /** + * PTI engine istance. Owned. + */ CPtiEngine* iPtiEngine; + /** + * Algorithm instacne pointer. NOT owned. + */ CPcsAlgorithm2* iAlgorithm; + /** * Array to hold the list of languages not supported */ RArray iLanguageNotSupported; /** - * Flag to indicate if Phone is Chinese variant + * Type of keyboard used in ITU-T search mode. Typically this is standard ITU-T + * 12-key keypad. */ - RArray iKeysForPoolFormation; + TPtiKeyboardType iItutKeyboardType; + + /** + * PTI keys of the ITU-T keyboard. + */ + RArray iItutKeys; + + /** + * Contains all the ITU-T keys and the characters mapped to each key. Owned. + */ + RPointerArray iItutKeyMappings; /** - * Contains all the keys and the characters mapped to each key - * own + * True if "0" and " " are on the same key in the ITU-T mode + */ + TBool iSpaceAndZeroOnSameKeyOnItut; + + /** + * Type of keyboard used in QWERTY search mode. Typically this is either 3x11 or 4x10 QWERTY + * or EPtiKeyboardNone if there's no any kind of QWERTY available. This may also be + * half-QWERTY. + */ + TPtiKeyboardType iQwertyKeyboardType; + + /** + * PTI keys of the QWERTY keyboard. */ - RPointerArray iAllKeyMappingsPtrArr; + RArray iQwertyKeys; + + /** + * Contains all the QWERTY keys and the characters mapped to each key. Owned. + */ + RPointerArray iQwertyKeyMappings; + /** + * True if "0" and " " are on the same key in the QWERTY mode + */ + TBool iSpaceAndZeroOnSameKeyOnQwerty; + + /** + * Flag to indicate if the default multi-matching mode is ITU-T or QWERTY mode. + * ETrue, if ITU-T is defualt and EFalse if QWERTY is default. + */ + TBool iItutIsDefault; }; #endif // __CPCS_KEY_MAP_ALGORITHM_2_H__ diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsPoolElement.h --- a/predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsPoolElement.h Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsAlgorithm/Algorithm2/inc/CPcsPoolElement.h Thu Aug 19 09:41:07 2010 +0300 @@ -100,7 +100,7 @@ * Bit 6 = Not used * Bit 7 = Not used */ - TInt8 iDataMatchAttribute; + TUint8 iDataMatchAttribute; }; #endif // __CPCS_POOL_ELEMENT_ALGORITHM_2_H__ diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsAlgorithm/Algorithm2/inc/FindUtilChineseECE.h --- a/predictivesearch/PcsAlgorithm/Algorithm2/inc/FindUtilChineseECE.h Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsAlgorithm/Algorithm2/inc/FindUtilChineseECE.h Thu Aug 19 09:41:07 2010 +0300 @@ -36,7 +36,7 @@ Defines flags that can be used to indicate what is the default search method for each language. */ -enum TDefaultAdaptiveSearchMethod +enum TChineseSearchMethod { EAdptSearchPinyin =0, EAdptSearchStroke, @@ -48,7 +48,7 @@ /** * STRINGINFO struct * - * This data struct is for splited taxt in find pane. + * This data struct is for splited text in find pane. * It includes two type word, which is Chinese or no-Chinese * * @lib FindUtil.dll @@ -58,6 +58,7 @@ { TBuf segmentString; TBool isChinese; + TInt segmentPos; }; /** @@ -88,12 +89,26 @@ * * @since S60 v3.2 * @param aItemString Reference to the searching target - * @param aWord Reference to text in find pane + * @param aPsQuery Reference to the search query * @return ETrue for the text are matched; otherwise EFalse */ virtual TBool MatchRefineL(const TDesC& aItemString, CPsQuery& aPsQuery); /** + * Match arithmetic for accurate search + * + * @since S60 v5.2 + * @param aItemString Reference to the searching target + * @param aPsQuery Reference to the search query + * @param aMatchPos On return, contain positions of matching parts within aItemString + * @param aMatchLength On return, contains lenghts of matching parts within aItemString + * @param aHighLight If highlight or underline position of matched contact is enabled + * @return ETrue for the text are matched; otherwise EFalse + */ + TBool MatchRefineL(const TDesC& aItemString, CPsQuery& aPsQuery, + RArray& aMatchPos, RArray& aMatchLength, TBool aHighLight ); + + /** * Current input text is handled by this model * * @since S60 v3.2 @@ -170,30 +185,6 @@ public: /** - * Do translate for Chinese word - * - * @since S60 v3.2 - * @param aHZUnicode For translate word - * @param aSpellList Reference to spelling list for polyphonic word - * @return ETrue for it can be translated; otherwise EFalse - */ - TBool T9ChineseTranslationL(TInt16 aHZUnicode, RPointerArray& aSpellList); - - /** - * Find pane text is including Chinese word - * - * @since S60 v3.2 - * @param aWord Reference to text for analyse - * @return ETrue it includes Chinese; otherwise EFalse - */ - TBool IsChineseWord(const TDesC& aWord); - - /* - * - */ - void SetKeyboardMode(TInt aMode); - - /** * Translate Chinese word to its spelling * * @since S60 v3.2 @@ -203,6 +194,15 @@ */ TBool DoTranslationL(TInt16 aHZUnicode, RPointerArray& aSpellList); + /** + * Find pane text is including Chinese word + * + * @since S60 v3.2 + * @param aWord Reference to text for analyse + * @return ETrue it includes Chinese; otherwise EFalse + */ + TBool IsChineseWordIncluded(const TDesC& aWord); + /* * */ @@ -211,6 +211,11 @@ return iLanguage; } + inline TChineseSearchMethod CurrentSearchMethod() + { + return iSearchMethod; + } + private: /** @@ -238,9 +243,6 @@ */ void CloseT9InterfaceL(); - TInt CategoryOfLang(TLanguage aLanguage); - - /** * This letter is stroke symbol * @@ -248,12 +250,18 @@ * @param aFindWord For analyse * @return ETrue for it is stroke symbol; otherwise EFalse */ - TInt IsStrokeSymbol(const TInt aFindWord); + TInt IsStrokeSymbol(const TUint16 aFindWord); - // The below code is commented out because current CFindUtilChineseECE is used - // on 3.2.3 which is not supported adaptive search. It will be easy to keep these code - // for the further merging work (merge from FindUtil 5.0) -#if 0 + /** + * Do translate for Chinese word + * + * @since S60 v3.2 + * @param aHZUnicode For translate word + * @param aSpellList Reference to spelling list for polyphonic word + * @return ETrue for it can be translated; otherwise EFalse + */ + TBool T9ChineseTranslationL(TInt16 aHZUnicode, RPointerArray& aSpellList); + /** * Do translate for Chinese word * @@ -263,7 +271,6 @@ * @return ETrue for it can be translated; otherwise EFalse */ TBool T9ChineseTranslationAdaptiveL(TInt16 aHZUnicode, RPointerArray& aSpellList); -#endif /** * Find pane text is including separator @@ -284,6 +291,14 @@ TBool IsStrokeSymbolInString(const TDesC& aWord); /** + * Find pane text is just Chinese word + * + * @param aWord Reference to text for analyse + * @return ETrue it is all Chinese word(s); otherwise EFalse + */ + TBool IsAllChineseWord(const TDesC& aWord); + + /** * Find pane text is including zhuyin symbol * * @since S60 v3.2 @@ -327,10 +342,13 @@ * @param aStringInfoArr Reference to segment list * @param aSegmentStr Reference to segment text * @param aChinese The segment is Chinese + * @param aIndexAfterStr The first index in the source string after the aSegmentStr. + * The indices of characters of aSegmentStr are + * [aIndexAfterStr-aSegmementStr.Length(), aIndexAfterStr-1] * @return none */ void InsertStrInforArrayL(RPointerArray& aStringInfoArr, - TDes &aSegmentStr, const TBool aChinese); + TDes &aSegmentStr, TBool aChinese, TInt aIndexAfterStr); /** * This segment is matched by search text @@ -338,9 +356,13 @@ * @since S60 v3.2 * @param aStringInfoArr Reference to segment list * @param aSearchText Reference to searching text + * @param aMatchPos On return, contain positions of matching parts within the original searcg target text + * @param aMatchLength On return, contains lenghts of matching parts within the original search target text + * @param aHighLight If highlight or underline position of matched contact is enabled * @return ETrue it is matched; otherwise EFalse */ - TBool MatchSegmentL(RPointerArray& aStringInfoArr, CPsQuery& aQuery); + TBool MatchSegmentL(RPointerArray& aStringInfoArr, + CPsQuery& aQuery, RArray& aMatchPos, RArray& aMatchLength, TBool aHighLight ); /** * Search text by reverse @@ -348,9 +370,10 @@ * @since S60 v3.2 * @param aFirst Reference to matched text * @param aSecond Reference to matched text + * @param aFullQuery Reference to the FullQuery * @return Matched count */ - TInt ReverseMatchString(const TDesC& aFirst, const TDesC& aSecond); + TInt ReverseMatchStringL(const TDesC& aFirst, const TDesC& aSecond, CPsQuery& aFullQuery ); /** * Search text in other text @@ -358,29 +381,34 @@ * @since S60 v3.2 * @param aFirst Reference to matched text * @param aSecond Reference to matched text + * @param aFullQuery Reference to the FullQuery * @return Matched count */ - TInt MatchString(const TDesC& aFirst, const TDesC& aSecond); + TInt MatchStringL(const TDesC& aFirst, const TDesC& aSecond, CPsQuery& aFullQuery); /** * Search text in other text * * @since S60 v3.2 - * @param aSearhTargetStr Reference to the target text to be queried - * @param CPsQuery maintain the matched text from user - * @return Matched count + * @param aSearchTargetString Data to be searched through + * @param aQuery Text to be searched from aSearchTargetString + * @return Number of matched characters from the begining of aQuery */ - TInt MatchString(const TDesC& aSearhTargetStr, CPsQuery& aQuery); + TInt MatchStringL(const TDesC& aSearhTargetString, CPsQuery& aQuery); /** * Search Chinese word in input text * * @since S60 v3.2 - * @param aFirst Reference to matched text - * @param aSecond Reference to matched text - * @return Matched count + * @param aSearchTargetString Data to be searched through + * @param aQuery Text to be searched from aSearchTargetString + * @param aMatchStrtIdx On return, will contain the start index + * of the matching part within aSearchTargetString + * @param aMatchEndIdx On return, will contain the end index + * of the matching part within aSearchTargetString + * @return Number of matched characters from the begining of aQuery */ - TInt MatchChineseStringL(const TDesC& aSearchTargetString, CPsQuery& aQuery, TInt& aIndex); + TInt MatchChineseStringL(const TDesC& aSearchTargetString, CPsQuery& aQuery, TInt& aMatchStartIdx, TInt& aMatchEndIdx); /** * Initial character search @@ -397,18 +425,19 @@ * Maximal matched count in spelling list * * @since S60 v3.2 - * @param spellList Reference to spelling list + * @param aSpellList Reference to spelling list * @param aSearchStr Reference to search text * @param aPreviouStr Reference to previous matched word * @param aMatchIndex Reference to match index in Search text * @param aFullMatched Previous word is fully matched * @param aMatchedCount Previous word matched count * @param aAgain Search again + * @param aFullQuery Reference to the FullQuery * @return Matched count */ - TInt MaxMatchInList(RPointerArray &spellList, CPsQuery& aQuery, + TInt MaxMatchInListL(RPointerArray& aSpellList, CPsQuery& aQuery, TDesC& aPreviouStr, TInt& aMatchIndex, const TBool aFullMatched, - const TInt aMatchedCount, TBool& aAgain); + const TInt aMatchedCount, TBool& aAgain, TBool& aPrevReplaced, CPsQuery& aFullQuery); /** * Search the taxt is include the input text @@ -527,18 +556,6 @@ const TDes& aCurrentBuf,HBufC*& aNextChars ); #endif - /** - * Converts the input data to the key board mode specified by the query. - * Mode is referred in the CPsQuery. - * If the mode is ITU-T, data is converted to numeric. - * If the mode is Qwerty, data is retained as is. - * If the mode is Mix, data is conerted according to the keyboard mode - * of the corresponding query chararter - */ - void ConvertdDataToKeyBoardModeL(CPsQuery& aQuery, - const TDesC& aSearchTargetStr, - TBuf& aOutputNumInterpretationStr); - // help function for using CPsQuery public: void GetPartOfQueryL(CPsQuery& aSrcQuery, TInt aStartIndex, @@ -555,21 +572,11 @@ CPtiEngine* iPtiEngine; /** - * Ptiengine for Chinese translation in English language (Own) - */ - CPtiEngine* iPtiEnginePrc; - - /** * Current text input language */ TLanguage iLanguage; /** - * It is support Chinese Language - */ - TBool iSupportPRCChinese; - - /** * Current input mode */ TInt iCurInputMode; @@ -584,14 +591,10 @@ */ CFindRepositoryWatcher* iWatcher; - // The below code is commented out because current CFindUtilChineseECE is used - // on 3.2.3 which is not supported adaptive search. It will be easy to keep these code - // for the further merging work (merge from FindUtil 5.0) -#if 0 /** * Repository for input mode (Own) */ - CRepository* iRepositoryFindAdaptive; + CRepository* iRepositoryFindAdaptive; /** * The repository watcher(Own); @@ -602,31 +605,15 @@ /** * The default adaptive search method; */ - TDefaultAdaptiveSearchMethod iSearchMethodPRC; - - /** - * The default adaptive search method; - */ - TDefaultAdaptiveSearchMethod iSearchMethodTaiWan; - - /** - * The default adaptive search method; - */ - TDefaultAdaptiveSearchMethod iSearchMethodHongKong; + TChineseSearchMethod iSearchMethod; /** * The search method; */ TBool iSearchMethodAdaptive; -#endif CPcsAlgorithm2* iAlgorithm; - /* - * The keyboard Mode - */ - TInt iKeyboardMode; - }; #endif // __FINDUTILCHINESE_ECE__ diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsAlgorithm2.cpp --- a/predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsAlgorithm2.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsAlgorithm2.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -79,7 +79,6 @@ iCacheCount = 0; // No data iFindUtilECE = CFindUtilChineseECE::NewL(this); - iFindUtil = CFindUtil::NewL(); iPluginLauncher = CIdle::NewL( CActive::EPriorityStandard ); @@ -96,13 +95,14 @@ // Initialize key map and pti engine TInt keyMapErr = KErrNone; - TRAP( keyMapErr, iKeyMap = CPcsKeyMap::NewL( this )); + TRAP( keyMapErr, iKeyMap = CPcsKeyMap::NewL( this ) ); if (keyMapErr != KErrNone) { PRINT ( _L("**********************************************.")); PRINT1 ( _L("CPcsAlgorithm2::ConstructL() KeyMap construction error. The keymap crashed with error code %d."), keyMapErr ); PRINT ( _L("Please check the keypad/language for which keymap got crashed.") ); PRINT ( _L("**********************************************.")); + User::Leave( keyMapErr ); // we can't go on without a key map; constructing cache needs it } // Initialize helpers @@ -140,7 +140,6 @@ delete iMultiSearchHelper; delete iFindUtilECE; - delete iFindUtil; delete iPluginLauncher; @@ -165,105 +164,152 @@ } // ---------------------------------------------------------------------------- +// CPcsAlgorithm2::RemoveSpacesL +// Remove leading and trailing spaces of search query +// ---------------------------------------------------------------------------- +void CPcsAlgorithm2::RemoveSpacesL(CPsQuery& aQuery) + { + PRINT ( _L("Enter CPcsAlgorithm2::RemoveSpacesL") ); + + // Remove all leading " " + while ( aQuery.Count() > 0 ) + { + CPsQueryItem& item = aQuery.GetItemAtL(0); // First + if ( !item.Character().IsSpace() ) + { + break; + } + aQuery.Remove(0); + } + + // Remove all trailing " " + while ( aQuery.Count() > 0 ) + { + CPsQueryItem& item = aQuery.GetItemAtL(aQuery.Count()-1); // Last + if ( !item.Character().IsSpace() ) + { + break; + } + aQuery.Remove(aQuery.Count()-1); + } + + PRINT ( _L("End CPcsAlgorithm2::RemoveSpacesL") ); + } + +// ---------------------------------------------------------------------------- // CPcsAlgorithm2::ReplaceZeroWithSpaceL // Replace first occurance of '0' in a sequence of '0's in ITU-T with space // ---------------------------------------------------------------------------- TBool CPcsAlgorithm2::ReplaceZeroWithSpaceL(CPsQuery& aQuery) { - TChar space(KSpace); // ascii value for space + PRINT ( _L("Enter CPcsAlgorithm1::ReplaceZeroWithSpaceL") ); - TBool queryModified = EFalse; + //PRINTQUERY ( _L("CPcsAlgorithm1::ReplaceZeroWithSpaceL (BEFORE): "), aQuery ); + + TBool queryModified = EFalse; - // Skip initial zeros in query - TInt index = 0; - for (index = 0; index < aQuery.Count() - && aQuery.GetItemAtL(index).Character().GetNumericValue() == 0; ++index) - { - } - - if (aQuery.KeyboardModeL() != EQwerty) - { - for (TInt beg = index; beg < aQuery.Count(); ++beg) - { - CPsQueryItem& item = aQuery.GetItemAtL(beg); + /* In phones like E52 and E55, where the "0" and the " " characters are on + * the same key, the "0"s have to be considered as possible separators. + * + * In phones like N97 and E72, where the "0" and the " " characters are on + * different keys, the "0"s must not be considered as possible separators. + */ - if (item.Character().GetNumericValue() == 0 && item.Mode()== EItut) - { - if (beg != 0) - { - CPsQueryItem& item1 = aQuery.GetItemAtL(beg - 1); - if (item1.Character().GetNumericValue() != 0 - && !item1.Character().IsSpace()) - { - item.SetCharacter(space); - queryModified = ETrue; - } - } - else - { - item.SetCharacter(space); - queryModified = ETrue; - } - } - } - } + // Skip initial "0"s, they are not replaced into spaces + TInt skipIndex = 0; + while ( (skipIndex < aQuery.Count()) && + (aQuery.GetItemAtL(skipIndex).Character().GetNumericValue() == 0) ) + { + skipIndex++; + } + + // Replace remaining "0"s into spaces in case they are entered with a keyboard + // that has "0" and " " on the same key. + const TInt queryCount = aQuery.Count(); + for ( TInt index = skipIndex; index < queryCount; index++ ) + { + CPsQueryItem& item = aQuery.GetItemAtL(index); - return queryModified; + if ( iKeyMap->GetSpaceAndZeroOnSameKey( item.Mode() ) && + item.Character().GetNumericValue() == 0 ) + { + item.SetCharacter(KSpace); + queryModified = ETrue; + } + } + + //PRINTQUERY ( _L("CPcsAlgorithm1::ReplaceZeroWithSpaceL (AFTER): "), aQuery ); + + PRINT1 ( _L("CPcsAlgorithm1::ReplaceZeroWithSpaceL: Query modified (0=not, 1=yes): %d"), queryModified ); + + PRINT ( _L("End CPcsAlgorithm1::ReplaceZeroWithSpaceL") ); + + return queryModified; } // ---------------------------------------------------------------------------- // CPcsAlgorithm2::PerformSearchL // Search function for cache // ---------------------------------------------------------------------------- -void CPcsAlgorithm2::PerformSearchL(const CPsSettings& aSettings, CPsQuery& aQuery, +void CPcsAlgorithm2::PerformSearchL(const CPsSettings& aSettings, + CPsQuery& aQuery, RPointerArray& aSearchResults, RPointerArray& aSearchSeqs) { PRINT ( _L("Enter CPcsAlgorithm2::PerformSearchL") ); - __LATENCY_MARK ( _L("CPcsAlgorithm2::PerformSearchL") ); - - // Get the current language - TLanguage lang = User::Language(); - - // Check if the language is supported and the keyboard mode is not qwerty. + //__LATENCY_MARK ( _L("CPcsAlgorithm2::PerformSearchL") ); + + // Check aSettings + RPointerArray searchUris; + CleanupResetAndDestroyPushL( searchUris ); + aSettings.SearchUrisL(searchUris); + + if ( searchUris.Count() <= 0) + { + PRINT ( _L("searchUris.Count() <= 0, Leave from CPcsAlgorithm1::PerformSearchL") ); + User::Leave(KErrArgument); + } + CleanupStack::PopAndDestroy( &searchUris ); // ResetAndDestroy // Local arrays to hold the search results RPointerArray tempSearchResults; + CleanupClosePushL( tempSearchResults ); RPointerArray tempSearchResults1; + CleanupClosePushL( tempSearchResults1 ); // -------------------- Perform the basic search -------------------------- + RemoveSpacesL(aQuery); + PRINTQUERY ( _L("CPcsAlgorithm2::PerformSearchL: 1st search query: "), aQuery ); DoSearchL(aSettings, aQuery, tempSearchResults, aSearchSeqs); // ------------------------------------------------------------------------ - // ------------------- Perform advanced search if needed ------------------ - // Substitute "0" with space + // ---- Perform new search after "0" replacement if query is not empty ---- + /* Examples: + * - If the original search string is "Abc0" then we will search again with "Abc". + * - If the original search string is "00" then we will not search again. + */ TBool queryModified = ReplaceZeroWithSpaceL(aQuery); - - // If query got modified and the search query translated to more than 1 query - // perform a multi search again + RemoveSpacesL(aQuery); + // Perform query again if query got modified. if (queryModified) { - // Split query - RPointerArray queryList = iMultiSearchHelper->MultiQueryL(aQuery); + PRINTQUERY ( _L("CPcsAlgorithm2::PerformSearchL: 2nd search query: "), aQuery ); + DoSearchL(aSettings, aQuery, tempSearchResults1, aSearchSeqs); - // Perform seach again - if (queryList.Count() > 1) - { - DoSearchL(aSettings, aQuery, tempSearchResults1, aSearchSeqs); - } // Sort rule TLinearOrder rule(CPcsAlgorithm2Utils::CompareDataBySortOrder); // Avoid duplicates and add new results TIdentityRelation identityRule(CPsData::CompareById); + const TInt tempSearchResults1Count = tempSearchResults1.Count(); if (aSettings.GetSortType() != EAlphabetical) { TInt insertPos = 0; - for (int i = 0; i < tempSearchResults1.Count(); i++) + for (TInt i = 0; i < tempSearchResults1Count; i++) { if (tempSearchResults.Find(tempSearchResults1[i], identityRule) == KErrNotFound) @@ -271,14 +317,11 @@ tempSearchResults.Insert(tempSearchResults1[i], insertPos); insertPos++; } - } - } else { - - for (int i = 0; i < tempSearchResults1.Count(); i++) + for (TInt i = 0; i < tempSearchResults1Count; i++) { if (tempSearchResults.Find(tempSearchResults1[i], identityRule) == KErrNotFound) @@ -288,40 +331,35 @@ } } } - - queryList.ResetAndDestroy(); } // ------------------------------------------------------------------------ // ---------------------- Write result objects to the stream -------------- // Truncate the result set if required - TInt numToDisplay = aSettings.MaxResults(); - TInt resultSet = tempSearchResults.Count(); - - if (resultSet > numToDisplay && numToDisplay != -1) + TInt maxNumToDisplay = aSettings.MaxResults(); + TInt resultSetCount = tempSearchResults.Count(); + TInt numToDisplay = 0; + if ( maxNumToDisplay == -1 ) { - // Copy the top N contents from tempSearchResults to the results stream - for (int i = 0; i < numToDisplay; i++) - { - aSearchResults.Append(WriteClientDataL(*(tempSearchResults[i]))); - } - + numToDisplay = resultSetCount; } else { - // Copy all the contents from tempSearchResults to the results stream - for (int i = 0; i < resultSet; i++) - { - aSearchResults.Append(WriteClientDataL(*(tempSearchResults[i]))); - } + numToDisplay = Min( maxNumToDisplay, resultSetCount ); + } + + // Copy desired number of results from tempSearchResults to the results stream + for (TInt i = 0; i < numToDisplay; i++) + { + aSearchResults.Append(WriteClientDataL(*(tempSearchResults[i]))); } // ------------------------------------------------------------------------ // Cleanup local results array - tempSearchResults.Reset(); // Don't destroy - tempSearchResults1.Reset(); // Don't destroy + CleanupStack::PopAndDestroy( &tempSearchResults1 ); // Close, don't destroy + CleanupStack::PopAndDestroy( &tempSearchResults ); // Close, don't destroy - __LATENCY_MARKEND ( _L("CPcsAlgorithm2::PerformSearchL") ); + // __LATENCY_MARKEND ( _L("CPcsAlgorithm2::PerformSearchL") ); PRINT ( _L("End CPcsAlgorithm2::PerformSearchL") ); } @@ -330,52 +368,121 @@ // CPcsAlgorithm2::SearchInputL // Search function for input string // ---------------------------------------------------------------------------- -void CPcsAlgorithm2::SearchInputL(CPsQuery& aQuery, TDesC& aData, +void CPcsAlgorithm2::SearchInputL(CPsQuery& aQuery, + TDesC& aData, RPointerArray& aMatchSet, RArray& aMatchLocation) { + // __LATENCY_MARK ( _L("CPcsAlgorithm2::SearchInputL: ") ); PRINT ( _L("Enter CPcsAlgorithm2::SearchInputL") ); - // Get the current language - TLanguage lang = User::Language(); - - // Check if the language is supported and the keyboard mode is not qwerty. - // Print input query for debug - aQuery.PrintQuery(); + PRINTQUERY ( _L("CPcsAlgorithm2::SearchInputL: Search query: "), aQuery ); // Print received search data PRINT1 ( _L("Search data received = %S"), &aData); + // -------------------- Perform the basic search -------------------------- + RemoveSpacesL(aQuery); DoSearchInputL(aQuery, aData, aMatchSet, aMatchLocation); // ------------------------------------------------------------------------ - // ------------------- Perform advanced search if needed ------------------ - // Substitute "0" with space + // ---- Perform new search after "0" replacement if query is not empty ---- + /* Examples: + * - If the original search string is "Abc0" then we will search again with "Abc". + * - If the original search string is "00" then we will not search again. + */ TBool queryModified = ReplaceZeroWithSpaceL(aQuery); - - // If query got modified and the search query translated to more than 1 query + RemoveSpacesL(aQuery); + // If query got modified and the search query still contains something // perform a multi search again - if (queryModified) + if (queryModified && aQuery.Count() > 0 && aMatchSet.Count() == 0 && aMatchLocation.Count() == 0 ) { - RPointerArray queryList = iMultiSearchHelper->MultiQueryL(aQuery); + DoSearchInputL(aQuery, aData, aMatchSet, aMatchLocation); + } + // ------------------------------------------------------------------------ - if (queryList.Count() > 1) + // --- Remove overlapping items from aMatchLocation --- + TInt i = 0; + TBool incrementFirstCursor; + while ( i < aMatchLocation.Count() ) + { + incrementFirstCursor = ETrue; + TInt j = i+1; + while ( j < aMatchLocation.Count() ) + { + if ( CPcsAlgorithm2Utils::MatchesOverlap( aMatchLocation[j], aMatchLocation[i] ) ) + { + // Remove match location item with smallest length if 2 items have same index + if ( aMatchLocation[j].length <= aMatchLocation[i].length ) + { + aMatchLocation.Remove(j); + continue; // Do not increment j + } + else + { + aMatchLocation.Remove(i); + incrementFirstCursor = EFalse; // Do not increment i + break; + } + } + j++; + } + if ( incrementFirstCursor ) { - DoSearchInputL(aQuery, aData, aMatchSet, aMatchLocation); + i++; + } + } + + // --- Remove from aMatchSet items which no longer have corresponding item in aMatchLocation --- + HBufC* dataUpper = HBufC::NewLC(aData.Length()); + dataUpper->Des().Copy(aData); + dataUpper->Des().UpperCase(); // Get uppercase, as aMatchSet is in upper case + + TInt k = 0; + while ( k < aMatchSet.Count() ) + { + TBool keepMatch = EFalse; + TInt startCursor = -1; + + TInt offsetCursor; + while ( KErrNotFound != (offsetCursor = dataUpper->Mid(startCursor + 1).Find(*aMatchSet[k])) ) + { + // startCursor = index of match item *aMatchSet[k] into search string aData + startCursor = offsetCursor + startCursor + 1; + const TInt matchLocationCount = aMatchLocation.Count(); + for ( TInt i = 0; i < matchLocationCount; i++ ) + { + // If match item was found in the location list, then keep it + if ( (aMatchLocation[i].index == startCursor) && + (aMatchLocation[i].length == aMatchSet[k]->Length()) ) + { + keepMatch = ETrue; + break; + } + } } - queryList.ResetAndDestroy(); + if ( keepMatch ) + { + k++; + } + else + { + aMatchSet.Remove(k); // Do not increment k + } } - // ------------------------------------------------------------------------ + CleanupStack::PopAndDestroy( dataUpper ); + // --- Remove items End --- // Sort match set iHelper->SortSearchSeqsL(aMatchSet); PRINT ( _L("End CPcsAlgorithm2::SearchInputL") ); + //__LATENCY_MARKEND ( _L("CPcsAlgorithm2::SearchInputL") ); } // ---------------------------------------------------------------------------- @@ -386,28 +493,39 @@ TDesC& /*aSearchData*/, TDes& /*aMatch*/ ) { - //NOT IMPLEMENTED YET + PRINT ( _L("Enter CPcsAlgorithm2::SearchMatchStringL") ); + + //__LATENCY_MARK ( _L("CPcsAlgorithm2::SearchMatchStringL") ); + + // TODO: Implementation missing + + //__LATENCY_MARKEND ( _L("CPcsAlgorithm2::SearchMatchStringL") ); + + PRINT ( _L("End CPcsAlgorithm2::SearchMatchStringL") ); } // ---------------------------------------------------------------------------- // CPcsAlgorithm2::DoSearchL // Search function helper // ---------------------------------------------------------------------------- -void CPcsAlgorithm2::DoSearchL(const CPsSettings& aSettings, CPsQuery& aQuery, - RPointerArray& searchResults, - RPointerArray& searchSeqs) +void CPcsAlgorithm2::DoSearchL( const CPsSettings& aSettings, + CPsQuery& aQuery, + RPointerArray& aSearchResults, + RPointerArray& aSearchSeqs ) { PRINT ( _L("Enter CPcsAlgorithm2::DoSearchL") ); - // Print query for debug - aQuery.PrintQuery(); - + //__LATENCY_MARK ( _L("CPcsAlgorithm2::DoSearchL") ); + // -(0)----------------- Check if group search is required --------------- RArray contactsInGroup; + CleanupClosePushL( contactsInGroup ); RArray groupIdArray; + CleanupClosePushL( groupIdArray ); // Create a new settings instance - CPsSettings *tempSettings = aSettings.CloneL(); + CPsSettings* tempSettings = aSettings.CloneL(); + CleanupStack::PushL( tempSettings ); TBool isGroupSearch = IsGroupSearchL(*tempSettings, groupIdArray); @@ -420,102 +538,55 @@ GetContactsInGroupL(groupIdArray[0], contactsInGroup); } - groupIdArray.Close(); - // ----------------------------------------------------------------------- // Extract query list. RPointerArray queryList = iMultiSearchHelper->MultiQueryL(aQuery); + CleanupResetAndDestroyPushL( queryList ); - // -(1)--------------------- No query return all contacts ---------------- + // (1)-------------------- No query return all contacts ------------------- if (queryList.Count() == 0) { - GetAllContentsL(*tempSettings, searchResults); + GetAllContentsL(*tempSettings, aSearchResults); if (isGroupSearch) { - FilterSearchResultsForGroupsL(contactsInGroup, searchResults); + FilterSearchResultsForGroupsL(contactsInGroup, aSearchResults); } } // ------------------------------------------------------------------------ - - // -(2)------------------------ Perform a single query search ------------- - if (queryList.Count() == 1) + // (2)-------------------- Perform a single query search ------------------ + else if (queryList.Count() == 1) { - TInt mode = aQuery.KeyboardModeL(); - CPsQuery* query = queryList[0]; - iFindUtilECE->SetKeyboardMode(mode); - - switch (mode) - { - case EItut: - - PRINT ( _L("Query received is in ITU-T mode") ); - - // Search results - iHelper->SearchITUL(*tempSettings, *query, isGroupSearch, - contactsInGroup, searchResults, searchSeqs); - - break; - - case EQwerty: - - PRINT ( _L("Query received is in QWERTY mode") ); - - // Search results - iHelper->SearchQWERTYL(*tempSettings, *query, isGroupSearch, - contactsInGroup, searchResults, searchSeqs); - - break; - - case EModeUndefined: - - PRINT ( _L("Query received is in Mixed mode. Keyboard swap happened.") ); - - // Search results - iHelper->SearchMixedL(*tempSettings, *query, isGroupSearch, - contactsInGroup, searchResults, searchSeqs); - - break; - } - + // Search results + iHelper->SearchSingleL(*tempSettings, *query, isGroupSearch, + contactsInGroup, aSearchResults, aSearchSeqs); } // ------------------------------------------------------------------------ - - // -(3)---------------------------- Perform a multi query search ---------- - if (queryList.Count() > 1) // multiple query + // (3)-------------------- Perform a multi query search ------------------- + else // multiple query { PRINT ( _L("Query received is in multiple. Performing a multi search.") ); - TInt mode = aQuery.KeyboardModeL(); - iFindUtilECE->SetKeyboardMode(mode); - - for (int i = 0; i < queryList.Count(); i++) - { - TPtrC queryPtr = queryList[i]->QueryAsStringLC(); - PRINT2 ( _L("Received Query, index = %d; value = %S"), i, &queryPtr ); - CleanupStack::PopAndDestroy(); - } - // Search results iMultiSearchHelper->SearchMultiL(*tempSettings, queryList, isGroupSearch, - contactsInGroup, searchResults, searchSeqs, - mode); + contactsInGroup, aSearchResults, aSearchSeqs); } // ------------------------------------------------------------------------- // Cleanup - delete tempSettings; - tempSettings = NULL; + + CleanupStack::PopAndDestroy( &queryList ); // ResetAndDestroy + CleanupStack::PopAndDestroy( tempSettings ); + CleanupStack::PopAndDestroy( &groupIdArray ); // Close + CleanupStack::PopAndDestroy( &contactsInGroup ); // Close - groupIdArray.Close(); - contactsInGroup.Close(); - queryList.ResetAndDestroy(); + //__LATENCY_MARKEND ( _L("CPcsAlgorithm2::DoSearchL") ); PRINT ( _L("End CPcsAlgorithm2::DoSearchL") ); } @@ -524,56 +595,49 @@ // CPcsAlgorithm2::DoSearchInputL // Search function helper // ---------------------------------------------------------------------------- -void CPcsAlgorithm2::DoSearchInputL(CPsQuery& aQuery, TDesC& aData, +void CPcsAlgorithm2::DoSearchInputL(CPsQuery& aQuery, + const TDesC& aData, RPointerArray& aMatchSet, RArray& aMatchLocation) { + //__LATENCY_MARK ( _L("CPcsAlgorithm2::SearchInputL: ") ); PRINT ( _L("Enter CPcsAlgorithm2::DoSearchInputL") ); // Check if any seperator is there in the query RPointerArray queryList = iMultiSearchHelper->MultiQueryL(aQuery); + CleanupResetAndDestroyPushL( queryList ); // No query if (queryList.Count() == 0) { PRINT ( _L("Query received is empty") ); + CleanupStack::PopAndDestroy( &queryList ); // ResetAndDestroy return; } - RPointerArray convertedQuery; - iMultiSearchHelper->ConvertQueryToListL(queryList, convertedQuery); - // Single query if (queryList.Count() == 1) { - iHelper->SearchMatchSeqL(convertedQuery[0], aData, aMatchSet, aQuery, - aMatchLocation); - + iHelper->SearchMatchSeqL(aQuery, aData, aMatchSet, aMatchLocation); } if (queryList.Count() > 1) // multiple query { PRINT ( _L("Query received is in multiple. Performing a multi search.") ); - for (int i = 0; i < queryList.Count(); i++) - { - TPtrC queryPtr = queryList[i]->QueryAsStringLC(); - PRINT2 ( _L("Rceived Query, index = %d; value = %S"), i, &queryPtr ); - CleanupStack::PopAndDestroy(); - } - // Search results - iMultiSearchHelper->SearchMatchSeqMultiL(queryList, aData, aMatchSet, + iMultiSearchHelper->SearchMatchSeqMultiL(queryList, + aData, + aMatchSet, aMatchLocation); - } // Delete all the query elements - queryList.ResetAndDestroy(); - convertedQuery.ResetAndDestroy(); + CleanupStack::PopAndDestroy( &queryList ); // ResetAndDestroy + PRINT ( _L("End CPcsAlgorithm2::DoSearchInputL") ); + //__LATENCY_MARKEND ( _L("CPcsAlgorithm2::SearchInputL") ); - PRINT ( _L("End CPcsAlgorithm2::DoSearchInputL") ); } // ---------------------------------------------------------------------------- @@ -640,21 +704,17 @@ return; CPcsCache* cache = iPcsCache[dataStoreIndex]; - TRAPD(err, cache->RemoveAllFromCacheL()); - - if (err != KErrNone) - { - SetCachingError(aDataStore, err); - } + cache->RemoveAllFromCache(); } // ---------------------------------------------------------------------------- // CPcsAlgorithm2::GetCacheIndex // Return the cache index for a data store // ---------------------------------------------------------------------------- -TInt CPcsAlgorithm2::GetCacheIndex(TDesC& aDataStore) +TInt CPcsAlgorithm2::GetCacheIndex(const TDesC& aDataStore) { - for (int i = 0; i < iPcsCache.Count(); i++) + const TInt pcsCacheCount = iPcsCache.Count(); + for (int i = 0; i GetUriId() == aUriId) { @@ -790,17 +851,18 @@ // CPcsAlgorithm2::FindStoreUri // Checks if this store exists // ---------------------------------------------------------------------------- -TInt CPcsAlgorithm2::FindStoreUri(TDesC& aDataStore) +TInt CPcsAlgorithm2::FindStoreUri(const TDesC& aDataStore) { - for (int i = 0; i < iPcsCache.Count(); i++) + const TInt pcsCacheCount = iPcsCache.Count(); + for ( TInt i = 0; i < pcsCacheCount; i++ ) { - if (aDataStore.CompareC(*(iPcsCache[i]->GetUri())) == 0) + if ( aDataStore.CompareC(*(iPcsCache[i]->GetUri())) == 0 ) { return i; } } - return -1; + return KErrNotFound; } // ---------------------------------------------------------------------------- @@ -808,8 +870,10 @@ // Update caching status // ---------------------------------------------------------------------------- void CPcsAlgorithm2::UpdateCachingStatus(TDesC& aDataStore, TInt aStatus) - { +{ PRINT ( _L("Enter CPcsAlgorithm2::UpdateCachingStatus") ); + PRINT2 ( _L("CPcsAlgorithm2::UpdateCachingStatus: Request received for URI=%S with status=%d"), + &aDataStore, aStatus ); // Handle data store update events if ( aStatus == ECacheUpdateContactRemoved || @@ -822,82 +886,108 @@ // If not a cache update event, then this event is related to the initial // cache construction. - TInt index = FindStoreUri(aDataStore); - iPcsCache[index]->UpdateCacheStatus(aStatus); + + // Check if any error occurred and update the cache error + if ( aStatus < 0 ) + { + SetCachingError(aDataStore, aStatus); + } + else + { + TInt index = FindStoreUri(aDataStore); + iPcsCache[index]->UpdateCacheStatus(aStatus); + } - // Check if any error occurred - // If so, update the cache status, Set the property and return - if (aStatus < 0) - { - SetCachingError(aDataStore, aStatus); - //return; - } + TCachingStatus status = ECachingNotStarted; + TUint countNotStarted = 0; + TUint countInProgress = 0; + TUint countCompleted = 0; + TUint countCompletedWithErrors = 0; + TInt cacheCount = iPcsCache.Count(); + for ( TInt i = 0; i < cacheCount; i++ ) + { + PRINT3 ( _L("CPcsAlgorithm2::UpdateCachingStatus: URI[%d]=%S, cache status=%d"), + i, &iPcsCache[i]->GetURI(), iPcsCache[i]->GetCacheStatus() ); - //store the index for firstname and lastname - if (aStatus == ECachingComplete) + switch ( iPcsCache[i]->GetCacheStatus() ) { - RArray dataFields; - iPcsCache[index]->GetDataFields(dataFields); - - for (int i = 0; i < dataFields.Count(); i++) + case ECachingNotStarted: + { + countNotStarted++; + break; + } + case ECachingInProgress: + { + countInProgress++; + break; + } + case ECachingComplete: { - if (dataFields[i] == R_VPBK_FIELD_TYPE_FIRSTNAME) - { - iFirstNameIndex = i; - } - else if (dataFields[i] == R_VPBK_FIELD_TYPE_LASTNAME) - { - iLastNameIndex = i; - } + countCompleted++; + break; + } + case ECachingCompleteWithErrors: + { + countCompletedWithErrors++; + break; + } + default: + { + // Default completed state + countCompleted++; + break; } } + } - // No error occurred - TCachingStatus status = ECachingComplete; - TBool atLeastOneStoreCachingCompleteWithErrors(EFalse); - for (TInt i = 0; i < iPcsCache.Count(); i++) - { - if (iPcsCache[i]->GetCacheStatus() == ECachingComplete) - { - continue; - } - else if (iPcsCache[i]->GetCacheStatus() == ECachingCompleteWithErrors) - { - atLeastOneStoreCachingCompleteWithErrors = ETrue; - continue; - } - else - { - status = ECachingInProgress; - break; - } - } + // Calculate cumulative status according to single caches statuses + if ( countCompleted > 0 && ( countCompleted + countNotStarted ) == cacheCount ) + { + // If at least one caching is finished + // set status to ECachingComplete or ECachingCompleteWithErrors + // according to iCacheError + status = ( iCacheError == KErrNone ) ? ECachingComplete : ECachingCompleteWithErrors; + } + else if ( countInProgress > 0 ) + { + // Else if at least one caching is in progress, + // set status to ECachingInProgress + status = ECachingInProgress; + } + else if ( countCompletedWithErrors > 0 ) + { + // Else if at least one caching is completed with errors, + //set status to ECachingCompleteWithErrors + status = ECachingCompleteWithErrors; + } + else + { + // countNotStarted == cacheCount + // status is set to default ECachingNotStarted + } - if (status == ECachingComplete) - { - // See if any error occurred while caching - // If so, change the status to ECachingCompleteWithErrors - if ((iCacheError != KErrNone) || (atLeastOneStoreCachingCompleteWithErrors)) - { - status = ECachingCompleteWithErrors; - } - } + PRINT1 ( _L("CPcsAlgorithm2::UpdateCachingStatus: Cumulative caching status is %d"), + status ); // Check if status changed - if (status != iCacheStatus) - { + if ( status != iCacheStatus ) + { + PRINT2 ( _L("CPcsAlgorithm2::UpdateCachingStatus: Cumulative caching changed: %d -> %d"), + iCacheStatus, status ); + iCacheStatus = status; RProperty::Set(KPcsInternalUidCacheStatus, EPsKeyCacheStatus, iCacheStatus ); - } + } - PRINT ( _L("End CPcsAlgorithm2::UpdateCachingStatus") ); - } + PRINT( _L("End CPcsAlgorithm2::UpdateCachingStatus") ); +} + // ---------------------------------------------------------------------------- // CPcsAlgorithm2::SetCachingError // Updates cachinge error // ---------------------------------------------------------------------------- -void CPcsAlgorithm2::SetCachingError(TDesC& aDataStore, TInt aError) +void CPcsAlgorithm2::SetCachingError(const TDesC& aDataStore, TInt aError) { PRINT2 ( _L("SetCachingError::URI %S ERROR %d"), &aDataStore, aError ); @@ -912,25 +1002,33 @@ void CPcsAlgorithm2::GetAllContentsL(const CPsSettings& aSettings, RPointerArray& aResults) { - __LATENCY_MARK ( _L("CPcsAlgorithm2::GetAllContentsL") ); + //__LATENCY_MARK ( _L("CPcsAlgorithm2::GetAllContentsL") ); PRINT ( _L("Enter CPcsAlgorithm2::GetAllContentsL") ); - // Get the data stores - RPointerArray aDataStores; - aSettings.SearchUrisL(aDataStores); - // To hold array of results from different data stores typedef RPointerArray CPSDATA_R_PTR_ARRAY; - RPointerArray iSearchResultsArr; + RPointerArray searchResultsArr; + CleanupResetAndDestroyPushL( searchResultsArr ); + // TODO: Here's still a potential memory leak if a leave happens. The child + // arrays of searchResultsArr are not Reset in that case. The CPsData objects + // may leak as well. Handling this safely is somewhat complicated because some of + // the CPsData objects may already be transferred to ownership of aResults array + // at the time the leave happens, and those items must not be deleted. + + // Get the data stores + RPointerArray dataStores; + CleanupResetAndDestroyPushL( dataStores ); + aSettings.SearchUrisL(dataStores); // Get all contacts for each data store - for (int dsIndex = 0; dsIndex < aDataStores.Count(); dsIndex++) + const TInt dataStoresCount = dataStores.Count(); + for (TInt dsIndex = 0; dsIndex < dataStoresCount; dsIndex++) { RPointerArray *temp = new (ELeave) RPointerArray (); - iSearchResultsArr.Append(temp); + searchResultsArr.Append(temp); - TInt arrayIndex = GetCacheIndex(*(aDataStores[dsIndex])); + TInt arrayIndex = GetCacheIndex(*(dataStores[dsIndex])); if (arrayIndex < 0) { continue; @@ -938,29 +1036,28 @@ CPcsCache* cache = GetCache(arrayIndex); - cache->GetAllContentsL(*(iSearchResultsArr[dsIndex])); + cache->GetAllContentsL(*(searchResultsArr[dsIndex])); } - aDataStores.ResetAndDestroy(); + CleanupStack::PopAndDestroy( &dataStores ); // ResetAndDestroy // Merge the results from different data stores - CPcsAlgorithm2Utils::FormCompleteSearchResultsL(iSearchResultsArr, aResults); + CPcsAlgorithm2Utils::FormCompleteSearchResultsL(searchResultsArr, aResults); // Cleanup the local arrays - for (TInt i = 0; i < iSearchResultsArr.Count(); i++) + const TInt seaerchResultsArrCount = searchResultsArr.Count(); + for (TInt i = 0; i < seaerchResultsArrCount; i++) { - iSearchResultsArr[i]->Reset(); - delete iSearchResultsArr[i]; - iSearchResultsArr[i] = NULL; + searchResultsArr[i]->Reset(); } - iSearchResultsArr.Reset(); + CleanupStack::PopAndDestroy( &searchResultsArr ); // ResetAndDestroy PRINT1 ( _L("Number of results = %d"), aResults.Count() ); PRINT ( _L("End CPcsAlgorithm2::GetAllContentsL") ); - __LATENCY_MARKEND ( _L("CPcsAlgorithm2::GetAllContentsL") ); + //__LATENCY_MARKEND ( _L("CPcsAlgorithm2::GetAllContentsL") ); } // ---------------------------------------------------------------------------- @@ -977,18 +1074,18 @@ // Get the current URIs defined in settings RPointerArray searchUris; + CleanupResetAndDestroyPushL( searchUris ); aSettings.SearchUrisL(searchUris); if (aGroupIdArray.Count() && (searchUris.Count() > aGroupIdArray.Count())) { // There is an error, either there are more than one groups // or the settings contain a combination of group/non-group Uris - searchUris.ResetAndDestroy(); aGroupIdArray.Close(); User::Leave(KErrArgument); } - searchUris.ResetAndDestroy(); + CleanupStack::PopAndDestroy( &searchUris ); // ResetAndDestroy PRINT ( _L("End CPcsAlgorithm2::IsGroupSearchL") ); @@ -1005,15 +1102,16 @@ void CPcsAlgorithm2::ReplaceGroupsUriL(CPsSettings& aSettings) { RPointerArray uri; + CleanupResetAndDestroyPushL( uri ); // Set contacts db uri - HBufC* cntdb = HBufC::NewL(KBufferMaxLen); - cntdb->Des().Copy(KVPbkDefaultCntDbURI); - uri.Append(cntdb); + HBufC* cntdb = KVPbkDefaultCntDbURI().AllocLC(); + uri.AppendL(cntdb); + CleanupStack::Pop( cntdb ); // ownership transferred aSettings.SetSearchUrisL(uri); // Cleanup - uri.ResetAndDestroy(); + CleanupStack::PopAndDestroy( &uri ); // ResetAndDestroy } // ---------------------------------------------------------------------------- @@ -1055,28 +1153,22 @@ { // Clear results array aGroupContactIds.Reset(); - - // Groups URI - HBufC* groupURI = HBufC::NewL(50); - groupURI->Des().Copy(KVPbkDefaultGrpDbURI); - - // Cache Index - TInt cacheIndex = GetCacheIndex(*groupURI); - - // Cleanup - delete groupURI; - groupURI = NULL; - + + // Cache Index for group database + TInt cacheIndex = GetCacheIndex(KVPbkDefaultGrpDbURI); + // Get the groups contact ids if (cacheIndex != -1) { RPointerArray groups; + CleanupClosePushL( groups ); // Get all groups iPcsCache[cacheIndex]->GetAllContentsL(groups); // Get all contacts in group - for (TInt i = 0; i < groups.Count(); i++) + const TInt groupsCount = groups.Count(); + for (TInt i = 0; i < groupsCount; i++) { if (groups[i]->Id() == aGroupId) { @@ -1085,7 +1177,7 @@ } } - groups.Reset(); + CleanupStack::PopAndDestroy( &groups ); // Close } } @@ -1102,8 +1194,7 @@ if (CPcsAlgorithm2Utils::IsGroupUri(aURI)) { // If search in a group uri, use contacts db - TBuf<255> cntdb(KVPbkDefaultCntDbURI); - arrayIndex = GetCacheIndex(cntdb); + arrayIndex = GetCacheIndex(KVPbkDefaultCntDbURI); } else { @@ -1138,8 +1229,7 @@ if (CPcsAlgorithm2Utils::IsGroupUri(aURI)) { // If search in a group uri, use contacts db - TBuf<255> cntdb(KVPbkDefaultCntDbURI); - arrayIndex = GetCacheIndex(cntdb); + arrayIndex = GetCacheIndex(KVPbkDefaultCntDbURI); } else { @@ -1197,7 +1287,8 @@ if (aSortOrder.Count() == mySortOrder.Count()) { TBool same = ETrue; - for (int i = 0; i < mySortOrder.Count(); i++) + const TInt mySourtOrderCount = mySortOrder.Count(); + for ( TInt i = 0; i < mySourtOrderCount ; i++ ) { if (mySortOrder[i] != aSortOrder[i]) { @@ -1239,22 +1330,11 @@ PRINT ( _L("End CPcsAlgorithm2::ChangeSortOrderL.") ); } -// ---------------------------------------------------------------------------- -// CPcsAlgorithm2::GetAdaptiveGridL -// -// ---------------------------------------------------------------------------- -void CPcsAlgorithm2::GetAdaptiveGridL( const MDesCArray& /*aURIs*/, - const TBool /*aCompanyName*/, - TDes& /*aAdaptiveGrid*/ ) - { - //NOT IMPLEMENTED YET - } - // --------------------------------------------------------------------------------- // Read the persisted sort order from the central repository // Persisted sort order is of form URI Field1 Field2 Field3 .. FieldN (space delimited) // --------------------------------------------------------------------------------- -void CPcsAlgorithm2::ReadSortOrderFromCenRepL(TDesC& aURI, RArray& aSortOrder) +void CPcsAlgorithm2::ReadSortOrderFromCenRepL(const TDesC& aURI, RArray& aSortOrder) { PRINT ( _L("Enter CPcsAlgorithm2::ReadSortOrderFromCenRepL.") ); @@ -1265,8 +1345,9 @@ // Read the sort order from cenrep TBuf str; - for (TInt i(KCenrepFieldsStartKey); i < KCenrepFieldsStartKey - + KCenrepNumberOfFieldsCount; i++) + for ( TInt i(KCenrepFieldsStartKey); + i < KCenrepFieldsStartKey + KCenrepNumberOfFieldsCount; + i++ ) { TInt err = repository->Get(i, str); @@ -1318,18 +1399,19 @@ // Write the sort order into the central repository // Persisted sort order is of form URI Field1 Field2 Field3 .. FieldN (space delimited) // --------------------------------------------------------------------------------- -void CPcsAlgorithm2::WriteSortOrderToCenRepL(TDesC& aURI, RArray& aSortOrder) +void CPcsAlgorithm2::WriteSortOrderToCenRepL(const TDesC& aURI, RArray& aSortOrder) { PRINT ( _L("Enter CPcsAlgorithm2::WriteSortOrderToCenRepL.") ); - CRepository *repository = CRepository::NewL(KCRUidPSSortOrder); + CRepository* repository = CRepository::NewLC(KCRUidPSSortOrder); // Check if there an entry for this URI in cenrep TBuf str; TInt keyIndex = -1; - for (TInt i(KCenrepFieldsStartKey); i < KCenrepFieldsStartKey - + KCenrepNumberOfFieldsCount; i++) + for ( TInt i(KCenrepFieldsStartKey); + i < KCenrepFieldsStartKey + KCenrepNumberOfFieldsCount; + i++ ) { TInt err = repository->Get(i, str); @@ -1359,8 +1441,9 @@ if (keyIndex == -1) { // Find the next free key index - for (TInt i(KCenrepFieldsStartKey); i < KCenrepFieldsStartKey - + KCenrepNumberOfFieldsCount; i++) + for ( TInt i(KCenrepFieldsStartKey); + i < KCenrepFieldsStartKey + KCenrepNumberOfFieldsCount; + i++ ) { TInt err = repository->Get(i, str); @@ -1385,7 +1468,7 @@ } // Persist the sort order - HBufC* str1 = HBufC::NewL(KCRMaxLen); + HBufC* str1 = HBufC::NewLC(KCRMaxLen); TPtr ptr(str1->Des()); // Append the URI @@ -1393,7 +1476,8 @@ ptr.Append(KSpace); // Append the sort order fields - for (int j = 0; j < aSortOrder.Count(); j++) + const TInt sortOrderCount = aSortOrder.Count(); + for (TInt j = 0; j < sortOrderCount; j++) { ptr.AppendNum(aSortOrder[j]); ptr.Append(KSpace); @@ -1404,9 +1488,9 @@ User::LeaveIfError(err); - delete str1; + CleanupStack::PopAndDestroy( str1 ); - delete repository; + CleanupStack::PopAndDestroy( repository ); PRINT ( _L("End CPcsAlgorithm2::WriteSortOrderToCenRepL.") ); } @@ -1427,7 +1511,8 @@ clientData->SetUriL(GetUriForIdL(aPsData.UriId())); // set pointer to the each data element - for (TInt i = 0; i < aPsData.DataElementCount(); i++) + const TInt dataElementCount = aPsData.DataElementCount(); + for (TInt i = 0; i SetDataL(i, *(aPsData.Data(i))); } @@ -1466,11 +1551,11 @@ default: break; } - - if ( psKey != KErrNotFound ) + + // Increment the relevant counter in P&S by one to signal the clients about + // the cache update. + if( psKey != KErrNotFound ) { - // Increment the relevant counter in P&S by one to signal the clients about - // the cache update. TInt counter( KErrNotFound ); TInt err = RProperty::Get( KPcsInternalUidCacheStatus, psKey, counter ); if ( !err ) @@ -1495,25 +1580,24 @@ PRINT1 ( _L("keyMap ReconstructKeymapL, err =%d"),err ); } - for (int index = 0; index < iCacheCount; index++) + for (TInt index = 0; index < iCacheCount; index++) { CPcsCache* cache = iPcsCache[index]; - HBufC * uri = cache->GetUri(); + HBufC* uri = cache->GetUri(); // Clear the cache - TRAP(err, cache->RemoveAllFromCacheL()); - PRINT1 ( _L("cache RemoveAllFromCacheL, err =%d"),err ); + cache->RemoveAllFromCache(); if (err != KErrNone) { SetCachingError(*uri, err); } //Update the caching status as ECachingInProgress, since now the caching - // would be strated again + // would be started again UpdateCachingStatus(*uri, ECachingInProgress); // Request for data again - TRAP(err, iPsDataPluginInterface->RequestForDataL(*uri)); + TRAP(err, iPsDataPluginInterface->RequestForDataL(*uri)); PRINT1 ( _L("iPsDataPluginInterface->RequestForDataL, err =%d"),err ); if (err != KErrNone) @@ -1523,14 +1607,6 @@ } } -void CPcsAlgorithm2::Converter(const TDesC& aSourStr, TDes& aDestStr) - { - if (iKeyMap) - { - iKeyMap->GetNumericKeyString(aSourStr, aDestStr); - } - } - // --------------------------------------------------------------------------------- // DoLaunchPluginsL. // launch plugins by idle @@ -1561,15 +1637,32 @@ // Initialize cache RPointerArray dataStores; + CleanupClosePushL( dataStores ); iPsDataPluginInterface->GetAllSupportedDataStoresL(dataStores); - for (int dIndex = 0; dIndex < dataStores.Count(); dIndex++) + const TInt dataStoresCount = dataStores.Count(); + for (TInt dIndex = 0; dIndex < dataStoresCount; dIndex++) { AddDataStore(*(dataStores[dIndex])); } - dataStores.Reset(); + CleanupStack::PopAndDestroy( &dataStores ); // Close + } + +/** +* Returns the Adaptive Grid for one or more URI +* +*/ + void CPcsAlgorithm2::GetAdaptiveGridL( const MDesCArray& /*aURIs*/, + const TBool /*aCompanyName*/, + TDes& /*aAdaptiveGrid*/ ) + { + PRINT ( _L("Enter CPcsAlgorithm2::GetAdaptiveGridL") ); + + + PRINT ( _L("End CPcsAlgorithm2::GetAdaptiveGridL") ); + } // End of file diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsAlgorithm2FilterHelper.cpp --- a/predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsAlgorithm2FilterHelper.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsAlgorithm2FilterHelper.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -20,8 +20,8 @@ #include "CPcsDebug.h" // Compare functions -TBool ComparePsPattern(const TPsPatternDetails& aFirst, - const TPsPatternDetails& aSecond) +TInt ComparePsPattern(const TPsPatternDetails& aFirst, + const TPsPatternDetails& aSecond) { return (CPcsAlgorithm2Utils::MyCompareC(*(aFirst.matchPattern), *(aSecond.matchPattern))); @@ -109,7 +109,7 @@ // CPcsAlgorithm2FilterHelper::AddL // // ---------------------------------------------------------------------------- -void CPcsAlgorithm2FilterHelper::AddL(CPsData* psData, RPointerArray& aPatternSequence) +void CPcsAlgorithm2FilterHelper::AddL(CPsData* aPsData, RPointerArray& aPatternSequence) { if (iSortType == EAlphabetical) { @@ -117,44 +117,46 @@ if (iMatchPatternPools.Count() == 0) { RPointerArray *tempPsDataArray = new (ELeave) RPointerArray (); - iMatchPatternPools.Append(tempPsDataArray); + CleanupStack::PushL( tempPsDataArray ); + iMatchPatternPools.AppendL(tempPsDataArray); + CleanupStack::Pop( tempPsDataArray ); } // Add result to the result set - iMatchPatternPools[0]->Append(psData); + iMatchPatternPools[0]->AppendL(aPsData); // Update the count iResultCount++; // Update sequence list - for (TInt i = 0; i < aPatternSequence.Count(); i++) + const TInt patternSequenceCount = aPatternSequence.Count(); + for (TInt i = 0; i < patternSequenceCount; i++) { - TInt index = FindSequence(aPatternSequence[i]); + TInt index = FindSequence(*aPatternSequence[i]); if (index == KErrNotFound) { // sequence not found, add it to array TPsPatternDetails* temp = new (ELeave) TPsPatternDetails; - - TInt len = aPatternSequence[i]->Length(); - temp->matchPattern = HBufC::NewL(len); - temp->matchPattern->Des().Copy(*(aPatternSequence[i])); + CleanupStack::PushL( temp ); + + temp->matchPattern = aPatternSequence[i]->AllocL(); // First occurence should be -1 for alphabetical sort // and pool index will be 0 as only one pool will be created temp->firstOccurence = -1; temp->poolIndex = 0; - iMatchPatternDetails.Append(temp); + iMatchPatternDetails.AppendL(temp); + CleanupStack::Pop( temp ); } } } else { // PatternBased sort - TInt index = AddToPoolL(psData, aPatternSequence); + TInt index = AddToPoolL(aPsData, aPatternSequence); // Increment the total count iResultCount++; - } } @@ -163,7 +165,7 @@ // // ---------------------------------------------------------------------------- -TInt CPcsAlgorithm2FilterHelper::AddToPoolL(CPsData* psData, RPointerArray& aPatternSequence) +TInt CPcsAlgorithm2FilterHelper::AddToPoolL(CPsData* aPsData, RPointerArray& aPatternSequence) { // Sort the pattern sequence @@ -179,12 +181,13 @@ TInt poolItemCount = -1; TInt matchpatterpoolIndexToAppend = -1; - for (TInt cnt = 0; cnt < aPatternSequence.Count(); cnt++) + const TInt patternSequenceCount = aPatternSequence.Count(); + for (TInt cnt = 0; cnt < patternSequenceCount; cnt++) { // Create the pattern for aPatternSequence[cnt] in iMatchPatternDetails // and return the index - TInt indexInMatchPatternDetails = CreateMatchPatternDetailsAndPoolsL(aPatternSequence[cnt]); + TInt indexInMatchPatternDetails = CreateMatchPatternDetailsAndPoolsL(*aPatternSequence[cnt]); //Add the data to the pool the first pattern pool. // The data should be added only once @@ -192,8 +195,8 @@ { TInt poolIndex = iMatchPatternDetails[indexInMatchPatternDetails]->poolIndex; matchpatterpoolIndexToAppend = indexInMatchPatternDetails; - iMatchPatternPools[poolIndex]->InsertInOrderAllowRepeats(psData, psDataRule); - TInt findposition = iMatchPatternPools[poolIndex]->Find(psData, identitySearchRule); + iMatchPatternPools[poolIndex]->InsertInOrderAllowRepeats(aPsData, psDataRule); + TInt findposition = iMatchPatternPools[poolIndex]->Find(aPsData, identitySearchRule); if (findposition != KErrNotFound) { poolItemCount = findposition; @@ -208,7 +211,7 @@ { // Check if aPatternSequence[cnt] is listed in subpatterns of aPatternSequence[0] // If not, then create a sub pattern and apped it to iMatchPatternDetails for aPatternSequence[0] - TInt subSeq = FindSubSequence(aPatternSequence[cnt], matchpatterpoolIndexToAppend); + TInt subSeq = FindSubSequence(*aPatternSequence[cnt], matchpatterpoolIndexToAppend); if (subSeq == KErrNotFound) { //Create the subpattern and append it. @@ -230,7 +233,7 @@ // Returns the index of the sequence in iMatchPatternDetails // ---------------------------------------------------------------------------- -TInt CPcsAlgorithm2FilterHelper::CreateMatchPatternDetailsAndPoolsL(TDesC* aSeq) +TInt CPcsAlgorithm2FilterHelper::CreateMatchPatternDetailsAndPoolsL(const TDesC& aSeq) { TInt indexInMatchPatternDetails = FindSequence(aSeq); @@ -240,8 +243,7 @@ TPsPatternDetails* tempPatternDetailsInstance = new (ELeave) TPsPatternDetails; //TInt len = aPatternSequence[cnt]->Length(); - tempPatternDetailsInstance->matchPattern = HBufC::NewL(aSeq->Length()); - tempPatternDetailsInstance->matchPattern->Des().Copy(*(aSeq)); + tempPatternDetailsInstance->matchPattern = aSeq.Alloc(); tempPatternDetailsInstance->firstOccurence = -1; //RAVIKIRAN // Pools doesn't exist for this sequence.. @@ -282,7 +284,8 @@ if (iSortType == EAlphabetical) { // Return the results stored in single array - for (TInt i = 0; i < iMatchPatternPools[0]->Count(); i++) + const TInt cnt = iMatchPatternPools[0]->Count(); + for (TInt i = 0; i < cnt; i++) { aSearchResults.Append((*(iMatchPatternPools[0]))[i]); } @@ -293,18 +296,21 @@ else { TInt firstOccurenceTracker = 0; - for (TInt i = 0; i < iMatchPatternDetails.Count(); i++) + const TInt matchPatternDetailsCount = iMatchPatternDetails.Count(); + for (TInt i = 0; i < matchPatternDetailsCount; i++) { // Get the mapping pool index for this sequence TInt index = iMatchPatternDetails[i]->poolIndex; TInt j = 0; - for (; j < iMatchPatternPools[index]->Count(); j++) + const TInt poolCount = iMatchPatternPools[index]->Count(); + for (; j < poolCount; j++) { aSearchResults.Append((*(iMatchPatternPools[index]))[j]); } // Check the sub patterns - for (TInt k = 0; k < iMatchPatternDetails[i]->subPatternArray.Count(); k++) + const TInt subPatternArrayCount = iMatchPatternDetails[i]->subPatternArray.Count(); + for (TInt k = 0; k < subPatternArrayCount; k++) { HBufC* temporseq = iMatchPatternDetails[i]->subPatternArray[k]->matchPattern; TRAP_IGNORE( UpdateForSubSequencesL( *temporseq, @@ -334,7 +340,8 @@ TLinearOrder rule(ComparePsPattern); iMatchPatternDetails.Sort(rule); - for (TInt i = 0; i < iMatchPatternDetails.Count(); i++) + const TInt matchPatternDetailsCount = iMatchPatternDetails.Count(); + for (TInt i = 0; i < matchPatternDetailsCount; i++) { CPsPattern *tempPattern = CPsPattern::NewL(); @@ -351,17 +358,14 @@ // Searches for for aSeq in iMatchPatternDetails and returns index // where input sequence is found. Returns -1 if not found // ---------------------------------------------------------------------------- -TInt CPcsAlgorithm2FilterHelper::FindSequence(TDesC* aSeq) +TInt CPcsAlgorithm2FilterHelper::FindSequence(const TDesC& aSeq) { - TBuf<50> seqBuf; - seqBuf.Append(*aSeq); - TInt j = 0; - for (; j < iMatchPatternDetails.Count(); j++) + const TInt matchPatternDetailsCount = iMatchPatternDetails.Count(); + for (; j < matchPatternDetailsCount; j++) { - TBuf<50> matchPatternBuf; - matchPatternBuf.Copy((iMatchPatternDetails[j]->matchPattern->Des())); - if (seqBuf == matchPatternBuf) + const TDesC& matchPattern = *(iMatchPatternDetails[j]->matchPattern); + if ( CPcsAlgorithm2Utils::MyCompareC(aSeq, matchPattern) == 0 ) break; } @@ -377,17 +381,14 @@ // and returns index where input sequence is found. // Returns -1 if not found // ---------------------------------------------------------------------------- -TInt CPcsAlgorithm2FilterHelper::FindSubSequence(TDesC* aSeq, TInt aPatternIndex) +TInt CPcsAlgorithm2FilterHelper::FindSubSequence(const TDesC& aSeq, TInt aPatternIndex) { - TBuf<50> seqBuf; - seqBuf.Append(*aSeq); - TInt j = 0; - for (; j < iMatchPatternDetails[aPatternIndex]->subPatternArray.Count(); j++) + const TInt subPatternArraycount = iMatchPatternDetails[aPatternIndex]->subPatternArray.Count(); + for (; j < subPatternArraycount; j++) { - TBuf<50> matchPatternBuf; - matchPatternBuf.Copy((iMatchPatternDetails[aPatternIndex]->subPatternArray[j]->matchPattern->Des())); - if (seqBuf == matchPatternBuf) + const TDesC& matchPattern = *(iMatchPatternDetails[aPatternIndex]->subPatternArray[j]->matchPattern); + if ( CPcsAlgorithm2Utils::MyCompareC(aSeq, matchPattern) == 0 ) break; } @@ -410,13 +411,13 @@ // then, firstOccurence of all substring sequences ("A", "AB", "ABC") // in iMatchPatternDetails will be set to 2 // ---------------------------------------------------------------------------- -void CPcsAlgorithm2FilterHelper::UpdateForSubSequencesL(TDesC& aSeq, TInt aFirstOccrVal) +void CPcsAlgorithm2FilterHelper::UpdateForSubSequencesL(const TDesC& aSeq, TInt aFirstOccrVal) { - HBufC* tempSequence = HBufC::NewL(aSeq.Length() + 1); - for (TInt i = 0; i < aSeq.Length(); i++) + TPtrC tempSequence; + for ( TInt i = 1; i <= aSeq.Length(); i++ ) { // Get the next substring in tempSequence - tempSequence->Des().Append(aSeq[i]); + tempSequence.Set( aSeq.Left(i) ); // Find if this sequence exist in iMatchPatternDetails TInt patternIndex = FindSequence(tempSequence); @@ -428,11 +429,6 @@ } } - delete tempSequence; - tempSequence = NULL; - - return; - } // END OF FILE diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsAlgorithm2Helper.cpp --- a/predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsAlgorithm2Helper.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsAlgorithm2Helper.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -16,7 +16,7 @@ */ // INCLUDES -#include +#include #include "FindUtilChineseECE.h" #include "CPcsAlgorithm2.h" #include "CPcsAlgorithm2Helper.h" @@ -25,22 +25,11 @@ #include "CPcsCache.h" #include "CPcsKeyMap.h" #include "CPsData.h" -#include "CWords.h" #include "CPsQuery.h" #include "CPsQueryItem.h" #include "CPsDataPluginInterface.h" #include "CPcsPoolElement.h" -// Compare functions -TBool Compare1(const TDesC& aFirst, const TDesC& aSecond) - { - return aFirst == aSecond; - } - -TBool Compare2(const TDesC& aFirst, const TDesC& aSecond) - { - return CPcsAlgorithm2Utils::MyCompareC(aFirst, aSecond); - } // ============================== MEMBER FUNCTIONS ============================ @@ -70,6 +59,7 @@ { PRINT ( _L("Enter CPcsAlgorithm2Helper::CPcsAlgorithm2") ); PRINT ( _L("End CPcsAlgorithm2Helper::CPcsAlgorithm2") ); + iMaxCount = 0; } // ---------------------------------------------------------------------------- @@ -81,13 +71,18 @@ PRINT ( _L("Enter CPcsAlgorithm2Helper::ConstructL") ); iAlgorithm = aAlgorithm; - keyMap = iAlgorithm->GetKeyMap(); + iKeyMap = iAlgorithm->GetKeyMap(); + iPbkSettings = PbkGlobalSettingFactory::CreatePersistentSettingL(); + iPbkSettings->ConnectL( MPbkGlobalSetting::EGeneralSettingCategory ); + iPbkSettings->RegisterObserverL( this ); + UpdateNameOrderL(); + PRINT ( _L("End CPcsAlgorithm2Helper::ConstructL") ); } // ---------------------------------------------------------------------------- -// CPcsAlgorithm2Helper::CPcsAlgorithm2Helper +// CPcsAlgorithm2Helper::~CPcsAlgorithm2Helper // Destructor // ---------------------------------------------------------------------------- CPcsAlgorithm2Helper::~CPcsAlgorithm2Helper() @@ -98,798 +93,323 @@ } // ---------------------------------------------------------------------------- -// CPcsAlgorithm2Helper::SearchMixedL +// CPcsAlgorithm2Helper::SearchSingleL // Search function for input with both ITU-T and QWERTY mode // ---------------------------------------------------------------------------- -void CPcsAlgorithm2Helper::SearchMixedL(const CPsSettings& aSettings, - CPsQuery& aPsQuery, TBool isSearchInGroup, - RArray& aContactsInGroup, - RPointerArray& searchResults, - RPointerArray& searchSeqs) +void CPcsAlgorithm2Helper::SearchSingleL(const CPsSettings& aSettings, + CPsQuery& aPsQuery, + TBool aIsSearchInGroup, + const RArray& aContactsInGroup, + RPointerArray& aSearchResults, + RPointerArray& aSearchSeqs) { - __LATENCY_MARK ( _L("CPcsAlgorithm2Helper::SearchMixedL") ); + PRINT ( _L("Enter CPcsAlgorithm2Helper::SearchSingleL") ); - PRINT ( _L("Enter CPcsAlgorithm2Helper::SearchMixedL") ); + //__LATENCY_MARK ( _L("CPcsAlgorithm2Helper::SearchSingleL") ); + iMaxCount = aSettings.MaxResults(); + // Create filtering helper for the required sort type TSortType sortType = aSettings.GetSortType(); CPcsAlgorithm2FilterHelper* filterHelper = CPcsAlgorithm2FilterHelper::NewL(sortType); + CleanupStack::PushL( filterHelper ); + + // Search from cache based on first character + const CPsQueryItem& firstCharItem = aPsQuery.GetItemAtL(0); + TInt cachePoolId = iKeyMap->PoolIdForCharacter( firstCharItem.Character(), firstCharItem.Mode() ); // Reset the result set array for new search iSearchResultsArr.ResetAndDestroy(); // Get the data stores - RPointerArray aDataStores; - aSettings.SearchUrisL(aDataStores); + RPointerArray dataStores; + CleanupResetAndDestroyPushL( dataStores ); + aSettings.SearchUrisL(dataStores); // Get the required display fields from the client RArray requiredDataFields; + CleanupClosePushL( requiredDataFields ); aSettings.DisplayFieldsL(requiredDataFields); - - // Search from cache based on first character - const CPsQueryItem& firstCharItem = aPsQuery.GetItemAtL(0); - TInt numValue = keyMap->PoolIdForCharacter( firstCharItem.Character() ); // Perform search for each required data store RPointerArray elements; + CleanupClosePushL( elements ); + const TInt dataStoresCount = dataStores.Count(); - for (int dsIndex = 0; dsIndex < aDataStores.Count(); dsIndex++) + for (TInt dsIndex = 0; dsIndex < dataStoresCount; dsIndex++) { - - RPointerArray *temp = new (ELeave) RPointerArray (); - iSearchResultsArr.Append(temp); + RPointerArray* temp = new (ELeave) RPointerArray (); + CleanupStack::PushL( temp ); + iSearchResultsArr.AppendL( temp ); + CleanupStack::Pop( temp ); // Get the contents for this data store - TInt arrayIndex = iAlgorithm->GetCacheIndex(*(aDataStores[dsIndex])); + TInt arrayIndex = iAlgorithm->GetCacheIndex(*(dataStores[dsIndex])); if (arrayIndex < 0) { continue; } CPcsCache* cache = iAlgorithm->GetCache(arrayIndex); - cache->GetContactsForKeyL(numValue, elements); + cache->GetContactsForKeyL(cachePoolId, elements); + + // Get the supported data fields for this data store + RArray supportedDataFields; + CleanupClosePushL( supportedDataFields ); + cache->GetDataFields(supportedDataFields); + + // Get the filtered data fields for this data store + TUint8 filteredDataMatch = CPcsAlgorithm2Utils::FilterDataFieldsL(requiredDataFields, + supportedDataFields); // Perform filtering - FilterResultsMixedL(filterHelper, elements, aPsQuery, - isSearchInGroup, aContactsInGroup); + FilterResultsSingleL(filterHelper, + elements, + aPsQuery, + filteredDataMatch, + aIsSearchInGroup, + aContactsInGroup); - // If alphabetical sorting, get the results for this datastore + // If alphabetical sorting, get the results for this datastore if (sortType == EAlphabetical) { filterHelper->GetResults(*(iSearchResultsArr[dsIndex])); } elements.Reset(); - } - - aDataStores.ResetAndDestroy(); - requiredDataFields.Reset(); - - // If alphabetical sorting, merge the result sets of all datastores - if (sortType == EAlphabetical) - { - // Form the complete searchResults array - CPcsAlgorithm2Utils::FormCompleteSearchResultsL(iSearchResultsArr, - searchResults); - } - else - { - // Results are already sorted pattern based - filterHelper->GetResults(searchResults); - } - - // Get the sorted match sequence list - filterHelper->GetPatternsL(searchSeqs); - - PRINT1 ( _L("Number of search results = %d"), searchResults.Count() ); - - // Cleanup - for (TInt i = 0; i < iSearchResultsArr.Count(); i++) - { - iSearchResultsArr[i]->Reset(); - delete iSearchResultsArr[i]; - iSearchResultsArr[i] = NULL; + CleanupStack::PopAndDestroy( &supportedDataFields ); // Close } - iSearchResultsArr.Reset(); - - CleanupStack::PopAndDestroy(); // query - delete filterHelper; - - PRINT ( _L("End CPcsAlgorithm2Helper::SearchMixedL") ); - - __LATENCY_MARKEND ( _L("CPcsAlgorithm2Helper::SearchMixedL") ); - } - -// ---------------------------------------------------------------------------- -// CPcsAlgorithm2Helper::SearchITUL -// Search function for ITU-T style -// ---------------------------------------------------------------------------- -void CPcsAlgorithm2Helper::SearchITUL(const CPsSettings& aSettings, - CPsQuery& aPsQuery, TBool isSearchInGroup, - RArray& aContactsInGroup, - RPointerArray& searchResults, - RPointerArray& searchSeqs) - { - __LATENCY_MARK ( _L("CPcsAlgorithm2Helper::SearchITUL") ); - - PRINT ( _L("Enter CPcsAlgorithm2Helper::SearchITUL") ); - - // Create filtering helper for the required sort type - TSortType sortType = aSettings.GetSortType(); - CPcsAlgorithm2FilterHelper* filterHelper = - CPcsAlgorithm2FilterHelper::NewL(sortType); - - // Convert the query to string - TPtrC queryPtr = aPsQuery.QueryAsStringLC(); - - // Search from cache based on first character - const CPsQueryItem& firstCharItem = aPsQuery.GetItemAtL(0); - TInt numValue = keyMap->PoolIdForCharacter( firstCharItem.Character() ); - - // Reset the result set array for new search - iSearchResultsArr.ResetAndDestroy(); - - // Get the data stores - RPointerArray aDataStores; - aSettings.SearchUrisL(aDataStores); - - // Get the required display fields from the client - RArray requiredDataFields; - aSettings.DisplayFieldsL(requiredDataFields); - - // Perform search for each required data store - RPointerArray elements; - - for (int dsIndex = 0; dsIndex < aDataStores.Count(); dsIndex++) - { - RPointerArray *temp = new (ELeave) RPointerArray (); - iSearchResultsArr.Append(temp); - - // Get the contents for this data store - TInt arrayIndex = iAlgorithm->GetCacheIndex(*(aDataStores[dsIndex])); - if (arrayIndex < 0) - { - continue; - } - CPcsCache* cache = iAlgorithm->GetCache(arrayIndex); - cache->GetContactsForKeyL(numValue, elements); - - // Perform filtering - FilterResultsL(filterHelper, elements, queryPtr, - isSearchInGroup, aContactsInGroup); - - // If alphabetical sorting, get the results for this datastore - if (sortType == EAlphabetical) - { - filterHelper->GetResults(*(iSearchResultsArr[dsIndex])); - } - - elements.Reset(); - } - - aDataStores.ResetAndDestroy(); - requiredDataFields.Reset(); - - // If alphabetical sorting, merge the result sets of all datastores - if (sortType == EAlphabetical) - { - // Merge the result sets of individual datastores alphabetically - CPcsAlgorithm2Utils::FormCompleteSearchResultsL(iSearchResultsArr, - searchResults); - } - else - { - // Results are already sorted pattern based - filterHelper->GetResults(searchResults); - } - - // Get the sorted match sequence list - filterHelper->GetPatternsL(searchSeqs); - - PRINT1 ( _L("Number of search results = %d"), searchResults.Count() ); - - // Cleanup - for (TInt i = 0; i < iSearchResultsArr.Count(); i++) - { - iSearchResultsArr[i]->Reset(); - delete iSearchResultsArr[i]; - iSearchResultsArr[i] = NULL; - } - iSearchResultsArr.Reset(); - - CleanupStack::PopAndDestroy(); // query - delete filterHelper; - - PRINT ( _L("End CPcsAlgorithm2Helper::SearchITUL") ); - __LATENCY_MARKEND ( _L("CPcsAlgorithm2Helper::SearchITUL") ); - } - -// ---------------------------------------------------------------------------- -// CPcsAlgorithm2Helper::SearchQWERTYL -// Search function for QWERTY style -// ---------------------------------------------------------------------------- -void CPcsAlgorithm2Helper::SearchQWERTYL(const CPsSettings& aSettings, - CPsQuery& aPsQuery, TBool isSearchInGroup, - RArray& aContactsInGroup, - RPointerArray& searchResults, - RPointerArray& searchSeqs) - { - __LATENCY_MARK ( _L("CPcsAlgorithm2Helper::SearchQWERTYL") ); - PRINT ( _L("Enter CPcsAlgorithm2Helper::SearchQWERTYL") ); - - // te filtering helper for the required sort type - TSortType sortType = aSettings.GetSortType(); - CPcsAlgorithm2FilterHelper* filterHelper = - CPcsAlgorithm2FilterHelper::NewL(sortType); - - // Convert the query to string - TPtrC queryPtr = aPsQuery.QueryAsStringLC(); - - // Search from cache based on first character - const CPsQueryItem& firstCharItem = aPsQuery.GetItemAtL(0); - TInt numValue = keyMap->PoolIdForCharacter( firstCharItem.Character() ); - - // Reset the result set array for new search - iSearchResultsArr.ResetAndDestroy(); - - // Get the data stores - RPointerArray aDataStores; - aSettings.SearchUrisL(aDataStores); - - // Get the required display fields from the client - RArray requiredDataFields; - aSettings.DisplayFieldsL(requiredDataFields); - - // Perform search for each of the required data stores - RPointerArray elements; - - for (int dsIndex = 0; dsIndex < aDataStores.Count(); dsIndex++) - { - - RPointerArray *temp = new (ELeave) RPointerArray (); - iSearchResultsArr.Append(temp); - - // Get the contents for this data store - TInt arrayIndex = iAlgorithm->GetCacheIndex(*(aDataStores[dsIndex])); - if (arrayIndex < 0) - { - continue; - } - CPcsCache* cache = iAlgorithm->GetCache(arrayIndex); - cache->GetContactsForKeyL(numValue, elements); - - // Perform filtering - FilterResultsQwertyL(filterHelper, elements, queryPtr, - isSearchInGroup, aContactsInGroup); - - // If alphabetical sorting, get the results for this datastore - if (sortType == EAlphabetical) - { - filterHelper->GetResults(*(iSearchResultsArr[dsIndex])); - } - - elements.Reset(); - } - aDataStores.ResetAndDestroy(); - requiredDataFields.Reset(); + CleanupStack::PopAndDestroy( &elements ); // Close + CleanupStack::PopAndDestroy( &requiredDataFields ); // Close + CleanupStack::PopAndDestroy( &dataStores ); // ResetAndDestroy // If alphabetical sorting, merge the result sets of all datastores if (sortType == EAlphabetical) { // Form the complete searchResults array CPcsAlgorithm2Utils::FormCompleteSearchResultsL(iSearchResultsArr, - searchResults); + aSearchResults); } else { // Results are already sorted pattern based - filterHelper->GetResults(searchResults); + filterHelper->GetResults(aSearchResults); } // Get the sorted match sequence list - filterHelper->GetPatternsL(searchSeqs); + filterHelper->GetPatternsL(aSearchSeqs); + + PRINT1 ( _L("Number of search results = %d"), aSearchResults.Count() ); - PRINT1 ( _L("Number of search results = %d"), searchResults.Count() ); - - // Cleanup - for (TInt i = 0; i < iSearchResultsArr.Count(); i++) + // Cleanup + const TInt searchResultsArrCount = iSearchResultsArr.Count(); + for (TInt i = 0; i < searchResultsArrCount; i++) { iSearchResultsArr[i]->Reset(); - delete iSearchResultsArr[i]; - iSearchResultsArr[i] = NULL; } - iSearchResultsArr.Reset(); + iSearchResultsArr.ResetAndDestroy(); - CleanupStack::PopAndDestroy(); // query - delete filterHelper; + CleanupStack::PopAndDestroy( filterHelper ); - PRINT ( _L("End CPcsAlgorithm2Helper::SearchQWERTYL") ); - __LATENCY_MARKEND ( _L("CPcsAlgorithm2Helper::SearchQWERTYL") ); + //__LATENCY_MARKEND ( _L("CPcsAlgorithm2Helper::SearchSingleL") ); + + PRINT ( _L("End CPcsAlgorithm2Helper::SearchSingleL") ); } // ---------------------------------------------------------------------------- // CPcsAlgorithm2Helper::SearchMatchSeqL -// Funciton to search matching sequences in the input text +// Function to search matching sequences in the input text // ---------------------------------------------------------------------------- -void CPcsAlgorithm2Helper::SearchMatchSeqL(HBufC* /*aQuery*/, TDesC& aData, - RPointerArray& /*aMatchSet*/, - CPsQuery& /*aPsQuery*/, - RArray& aMatchLocation) +void CPcsAlgorithm2Helper::SearchMatchSeqL(CPsQuery& aPsQuery, + const TDesC& aData, + RPointerArray& aMatchSet, + RArray& aMatchLocation ) { PRINT ( _L("Enter CPcsAlgorithm2Helper::SearchMatchSeqL") ); - // Convert the data into words - TLex lex(aData); - - // First word - TPtrC token = lex.NextToken(); - - TInt beg = lex.Offset() - token.Length(); // start index of match sequence - - // Search thru multiple words - while (token.Length() != 0) + RArray matchPos; + CleanupClosePushL( matchPos ); + RArray matchLen; + CleanupClosePushL( matchLen ); + if ( iAlgorithm->FindUtilECE()->MatchRefineL( aData, aPsQuery, matchPos, matchLen, ETrue ) ) { - TPsMatchLocation tempLocation; - - // check for directionality of the text - TBool found(EFalse); - TBidiText::TDirectionality dir = TBidiText::TextDirectionality(token, &found); - - tempLocation.index = beg; - tempLocation.length = 0; - tempLocation.direction = dir; - - // Add the match location to the data structure array - aMatchLocation.Append(tempLocation); - - // Next word - token.Set(lex.NextToken()); - beg = lex.Offset() - token.Length(); // start index of next word + ASSERT( matchPos.Count() == matchLen.Count() ); + const TInt matchPosCount = matchPos.Count(); + for ( TInt i = 0 ; i < matchPosCount ; ++i ) + { + TPsMatchLocation tempLocation; + + // check for directionality of the text + TBool found(EFalse); + TPtrC matchingPart = aData.Mid( matchPos[i], matchLen[i] ); + TBidiText::TDirectionality dir = TBidiText::TextDirectionality(matchingPart, &found); + + tempLocation.index = matchPos[i]; + tempLocation.length = matchLen[i]; + tempLocation.direction = dir; + + // Add the match location to the data structure array + aMatchLocation.Append(tempLocation); + + // Add the matched sequence to set, not allowing duplicates + CPcsAlgorithm2Utils::AppendMatchToSeqL( aMatchSet, matchingPart ); + } } + CleanupStack::PopAndDestroy( &matchLen ); + CleanupStack::PopAndDestroy( &matchPos ); PRINT ( _L("End CPcsAlgorithm2Helper::SearchMatchSeqL") ); } // ---------------------------------------------------------------------------- -// CPcsAlgorithm2::FilterResultsL +// CPcsAlgorithm2Helper::FilterResultsSingleL // Subset search function // ---------------------------------------------------------------------------- -void CPcsAlgorithm2Helper::FilterResultsL(CPcsAlgorithm2FilterHelper* aAlgorithmFilterHelper, - RPointerArray& searchSet, - const TDesC& searchQuery, - TBool isSearchInGroup, - RArray& aContactsInGroup) +void CPcsAlgorithm2Helper::FilterResultsSingleL(CPcsAlgorithm2FilterHelper* aAlgorithmFilterHelper, + RPointerArray& aSearchSet, + CPsQuery& aSearchQuery, + TUint8 aFilteredDataMatch, + TBool aIsSearchInGroup, + const RArray& aContactsInGroup) { - __LATENCY_MARK ( _L("CPcsAlgorithm2Helper::FilterResultsL") ); - PRINT ( _L("Enter CPcsAlgorithm2Helper::FilterResultsL") ); + PRINT ( _L("Enter CPcsAlgorithm2::FilterResultsSingleL") ); + + TInt maxcount = 0; + CFindUtilChineseECE* pFindUtilEce = iAlgorithm->FindUtilECE(); - // Convert the search condition to numeric key string - TBuf tmpSearchQuery; - keyMap->GetNumericKeyString(searchQuery, tmpSearchQuery); - - //Holds the first char of first name of a contact - TBuf<10> firstChar; + // Assume that all the elements is aSearchSet are from the same database. + // Get firstname index and lastname index for that database. + // If both are found, then name fields are matched a bit differently compared + // to rest of the fields. + TInt fnIndex( KErrNotFound ); + TInt lnIndex( KErrNotFound ); + TBool fullNameSearch( EFalse ); + if ( aSearchSet.Count() ) + { + TInt dbUriId = aSearchSet[0]->GetPsData()->UriId(); + CPcsCache* cache = iAlgorithm->GetCache( dbUriId ); + fnIndex = cache->GetFirstNameIndex(); + lnIndex = cache->GetLastNameIndex(); - PRINT2 ( _L("Numeric Key String for %S = %S"), &searchQuery, &tmpSearchQuery ); - + // Ensure that firstname and lastname are among the fields to be searched + TUint8 fnBitmask = 1 << fnIndex; + TUint8 lnBitmask = 1 << lnIndex; + if ( (aFilteredDataMatch & fnBitmask) && + (aFilteredDataMatch & lnBitmask) ) + { + fullNameSearch = ETrue; + // Remove firstname and lastname from the set of fields to search + // so that they will not be searched twice. + aFilteredDataMatch &= ~fnBitmask; + aFilteredDataMatch &= ~lnBitmask; + } + } + // Parse thru each search set elements and filter the results - for (int index = 0; index < searchSet.Count(); index++) + const TInt searchSetCount = aSearchSet.Count(); + for (TInt index = 0; index < searchSetCount; index++) { - CPcsPoolElement* poolElement = static_cast (searchSet[index]); + CPcsPoolElement* poolElement = static_cast (aSearchSet[index]); CPsData* psData = poolElement->GetPsData(); psData->ClearDataMatches(); - RPointerArray tempMatchSeq; - // Search thru multiple words - TBuf token; - TBuf firstName; - TBuf lastName; - lastName.Append(psData->Data(iAlgorithm->GetLastNameIndex())->Des()); - firstName.Append(psData->Data(iAlgorithm->GetFirstNameIndex())->Des()); + // Skip the contact if we are doing a group search and contact doesn't belong to the group + if ( aIsSearchInGroup && + aContactsInGroup.Find( psData->Id() ) == KErrNotFound ) + { + continue; + } + + // Buffer for matched character sequence. Currently, we don't return + // accurate pattern but just first character from the matching point. + // Current clients don't actually use this data for anything. + TBuf<1> matchingData; + + TBool matched = EFalse; - CFindUtilChineseECE* pFindUtilEce = iAlgorithm->FindUtilECE(); - TBool matched = 0; + // Parse thru each data field and filter the results + // ------------------------------------------------- + + // Name fields are handled separately to enable searching with query like + // "LastnameFirstname". Searching fullname by query string + // only for the pool elements matching with the firstname or lastname + if ( fullNameSearch && ( poolElement->IsDataMatch(fnIndex) || + poolElement->IsDataMatch(lnIndex) )) + { + HBufC* fullName = CreateNameBufLC( *psData, fnIndex, lnIndex ); - // If has Chinese word and the first name doesn't start with Chinese character, then should add a space - // before the first name, otherwise intitial letter searching will not function - if( pFindUtilEce->IsChineseWord(lastName) || pFindUtilEce->IsChineseWord(firstName)) - { - token.Append(lastName); - if (firstName.Length()) + // FindUtil can take care of matching queries like "Firstname", "Lastname", + // and "LastnameFirstname". + matched = pFindUtilEce->MatchRefineL( *fullName, aSearchQuery ); + if (matched) { - firstChar.Zero(); - firstChar.Append(firstName[0]); - if (!pFindUtilEce->IsChineseWord(firstChar) ) - { - token.Append(KSpace); - } - token.Append(firstName); + matchingData = fullName->Left(1); + psData->SetDataMatch( fnIndex ); + psData->SetDataMatch( lnIndex ); + } + + CleanupStack::PopAndDestroy( fullName ); + } + + // Find from the rest of the fields if no match found so far. + // Name fields are already removed from aFilteredDataMatch if we did separate full name search. + const TInt dataElementCount = psData->DataElementCount(); + for ( TInt dataIndex = 0; dataIndex < dataElementCount && !matched ; dataIndex++ ) + { + // Filter off data fields not required in search + TUint8 bitIndex = 1 << dataIndex; + TUint8 filter = bitIndex & aFilteredDataMatch; + if ( filter == 0x0 ) + { + // Move to next data + continue; } - if (token.Length() != 0) + if ( poolElement->IsDataMatch(dataIndex) ) { - matched = iAlgorithm->FindUtil()->Interface()-> - MatchRefineL(token, tmpSearchQuery, ECustomConverter, iAlgorithm); - + TPtrC fieldData( *psData->Data(dataIndex) ); + matched = pFindUtilEce->MatchRefineL( fieldData, aSearchQuery ); if (matched) { - psData->SetDataMatch(iAlgorithm->GetLastNameIndex()); - psData->SetDataMatch(iAlgorithm->GetFirstNameIndex()); - } - } - } - else - { - // If contact name only has western word, then should send - // "first name","last name" and "last name + first name" to FindUtil to do the search - const TInt lastnameLen = lastName.Length(); - const TInt firstnameLen = firstName.Length(); - if(lastnameLen) - { - matched = iAlgorithm->FindUtil()->Interface()-> - MatchRefineL(lastName, tmpSearchQuery, ECustomConverter, iAlgorithm); - - if (matched) - { - psData->SetDataMatch(iAlgorithm->GetLastNameIndex()); - } - } - - if(!matched && firstnameLen) - { - matched = iAlgorithm->FindUtil()->Interface()-> - MatchRefineL(firstName, tmpSearchQuery, ECustomConverter, iAlgorithm); - - if (matched) - { - psData->SetDataMatch(iAlgorithm->GetFirstNameIndex()); - } - } - - token.Append(lastName); - token.Append(firstName); - if (!matched && lastnameLen && firstnameLen) - { - matched = iAlgorithm->FindUtil()->Interface()-> - MatchRefineL(token, tmpSearchQuery, ECustomConverter, iAlgorithm); - - if (matched) - { - psData->SetDataMatch(iAlgorithm->GetLastNameIndex()); - psData->SetDataMatch(iAlgorithm->GetFirstNameIndex()); + matchingData = fieldData.Left(1); + psData->SetDataMatch( dataIndex ); } } } - if (matched) + + // Add to results if match is found + if ( matched ) { - // Extract matched character sequence, don't need to be accurate for Chinese variant - const TInt len = 1; - HBufC* seq = HBufC::NewLC(len); - *seq = token.Mid(0, len); - seq->Des().UpperCase(); - - TIdentityRelation rule(Compare1); - if (tempMatchSeq.Find(seq, rule) == KErrNotFound) - { - tempMatchSeq.Append(seq); - CleanupStack::Pop(); - } - else - { - CleanupStack::PopAndDestroy(); - } - - - // Add the result - if (isSearchInGroup) - { - if (aContactsInGroup.Find(psData->Id()) != KErrNotFound) - { - aAlgorithmFilterHelper->AddL(psData, tempMatchSeq); - } - } - else - { - aAlgorithmFilterHelper->AddL(psData, tempMatchSeq); - } - } - - // Cleanup the match sequence array as - // they are stored in pattern details structure - tempMatchSeq.ResetAndDestroy(); - } - - PRINT ( _L("End CPcsAlgorithm2Helper::FilterResultsL") ); - __LATENCY_MARKEND ( _L("CPcsAlgorithm2Helper::FilterResultsL") ); - } - -// ---------------------------------------------------------------------------- -// CPcsAlgorithm2Helper::FilterResultsQwertyL -// Subset search function -// ---------------------------------------------------------------------------- -void CPcsAlgorithm2Helper::FilterResultsQwertyL(CPcsAlgorithm2FilterHelper* aAlgorithmFilterHelper, - RPointerArray& searchSet, - const TDesC& searchQuery,TBool isSearchInGroup, - RArray& aContactsInGroup) - { - PRINT ( _L("Enter CPcsAlgorithm2::FilterResultsQwertyL") ); - - TBuf<50> tmpSearchQuery = searchQuery; - tmpSearchQuery.LowerCase(); - - //Holds the first char of first name of a contact - TBuf<10> firstChar; - - // Parse thru each search set elements and filter the results - for (int index = 0; index < searchSet.Count(); index++) - { - CPcsPoolElement* poolElement = static_cast (searchSet[index]); - CPsData* psData = poolElement->GetPsData(); - psData->ClearDataMatches(); - RPointerArray tempMatchSeq; + RPointerArray tempMatchSeq; + CleanupClosePushL( tempMatchSeq ); - // Parse thru each data and filter the results - TBuf token; - TBuf firstName; - TBuf lastName; - lastName.Append(psData->Data(iAlgorithm->GetLastNameIndex())->Des()); - firstName.Append(psData->Data(iAlgorithm->GetFirstNameIndex())->Des()); - - CFindUtilChineseECE* pFindUtilEce = iAlgorithm->FindUtilECE(); - TBool matched = 0; - - // If has Chinese word and the first name doesn't start with Chinese character, then should add a space - // before the first name, otherwise intitial letter searching will not function - if( pFindUtilEce->IsChineseWord(lastName) || pFindUtilEce->IsChineseWord(firstName)) - { - token.Append(lastName); - if (firstName.Length()) - { - firstChar.Zero(); - firstChar.Append(firstName[0]); - if (!pFindUtilEce->IsChineseWord(firstChar) ) - { - token.Append(KSpace); - } - token.Append(firstName); - } - - if (token.Length() != 0) - { - matched = iAlgorithm->FindUtil()->Interface()->MatchRefineL(token, tmpSearchQuery); - - if (matched) - { - psData->SetDataMatch(iAlgorithm->GetLastNameIndex()); - psData->SetDataMatch(iAlgorithm->GetFirstNameIndex()); - } - } - } - else - { - // If contact name only has western word, then should send - // "first name","last name" and "last name + first name" to FindUtil to do the search - const TInt lastnameLen = lastName.Length(); - const TInt firstnameLen = firstName.Length(); - if(lastnameLen) - { - matched = iAlgorithm->FindUtil()->Interface()->MatchRefineL(lastName, tmpSearchQuery); - - if (matched) - { - psData->SetDataMatch(iAlgorithm->GetLastNameIndex()); - } - } - - if(!matched && firstnameLen) - { - matched = iAlgorithm->FindUtil()->Interface()->MatchRefineL(firstName, tmpSearchQuery); - - if (matched) - { - psData->SetDataMatch(iAlgorithm->GetFirstNameIndex()); - } - } + // Wrap matched character sequence to array. + matchingData.UpperCase(); + tempMatchSeq.AppendL(&matchingData); + + // Add the result + aAlgorithmFilterHelper->AddL( psData, tempMatchSeq ); + maxcount++; - token.Append(lastName); - token.Append(firstName); - if (!matched && lastnameLen && firstnameLen) - { - matched = iAlgorithm->FindUtil()->Interface()->MatchRefineL(token, tmpSearchQuery); - - if (matched) - { - psData->SetDataMatch(iAlgorithm->GetLastNameIndex()); - psData->SetDataMatch(iAlgorithm->GetFirstNameIndex()); - } - } + // Cleanup the match sequence array as + // they are stored in pattern details structure + CleanupStack::PopAndDestroy( &tempMatchSeq ); // Close + + // TODO: Match seqs could be extracted from actual + // match locations by using the other overload of + // CFindUtilChineseECE::MatchRefineL(). + // Currently, match seq data is not used by clients. } - if (matched) - { - // Extract matched character sequence, don't need to be accurate for Chinese variant - const TInt len = 1; - HBufC* seq = HBufC::NewLC(len); - *seq = token.Mid(0, len); - seq->Des().UpperCase(); - - TIdentityRelation rule(Compare1); - if (tempMatchSeq.Find(seq, rule) == KErrNotFound) - { - tempMatchSeq.Append(seq); - CleanupStack::Pop(); - } - else - { - CleanupStack::PopAndDestroy(); - } - - // Add the result - if (isSearchInGroup) - { - if (aContactsInGroup.Find(psData->Id()) != KErrNotFound) - { - aAlgorithmFilterHelper->AddL(psData, tempMatchSeq); - } - } - else - { - aAlgorithmFilterHelper->AddL(psData, tempMatchSeq); - } - } - - // Cleanup the match sequence array as - // they are stored in pattern details structure - tempMatchSeq.ResetAndDestroy(); + if ( iMaxCount != -1 && maxcount > iMaxCount ) + { + return; + } } - PRINT ( _L("End CPcsAlgorithm2Helper::FilterResultsQwertyL") ); - } - -// ---------------------------------------------------------------------------- -// CPcsAlgorithm2Helper::FilterResultsMixedL -// Subset search function -// ---------------------------------------------------------------------------- -void CPcsAlgorithm2Helper::FilterResultsMixedL(CPcsAlgorithm2FilterHelper* aAlgorithmFilterHelper, - RPointerArray& searchSet, - CPsQuery& searchQuery, TBool isSearchInGroup, - RArray& aContactsInGroup) - { - PRINT ( _L("Enter CPcsAlgorithm2::FilterResultsMixedL") ); - - // Convert the search query to alpha numeric string - TBuf<50> tmpSearchQuery; - ExtractQueryL(searchQuery, tmpSearchQuery); - tmpSearchQuery.LowerCase(); - TBuf<10> firstChar; - - // Parse thru each search set elements and filter the results - for (int index = 0; index < searchSet.Count(); index++) - { - CPcsPoolElement* poolElement = static_cast (searchSet[index]); - CPsData* psData = poolElement->GetPsData(); - psData->ClearDataMatches(); - RPointerArray tempMatchSeq; - - // Parse thru each data and filter the results - TBuf<255> token; - TBuf firstName; - TBuf lastName; - lastName.Append(psData->Data(iAlgorithm->GetLastNameIndex())->Des()); - firstName.Append(psData->Data(iAlgorithm->GetFirstNameIndex())->Des()); - - CFindUtilChineseECE* pFindUtilEce = iAlgorithm->FindUtilECE(); - TBool matched = 0; - - // If has Chinese word and the first name doesn't start with Chinese character, then should add a space - // before the first name, otherwise intitial letter searching will not function - if( pFindUtilEce->IsChineseWord(lastName) || pFindUtilEce->IsChineseWord(firstName)) - { - token.Append(lastName); - if (firstName.Length()) - { - firstChar.Zero(); - firstChar.Append(firstName[0]); - if (!pFindUtilEce->IsChineseWord(firstChar) ) - { - token.Append(KSpace); - } - token.Append(firstName); - } - - if (token.Length() != 0) - { - matched = pFindUtilEce->MatchRefineL(token, searchQuery); - - if (matched) - { - psData->SetDataMatch(iAlgorithm->GetLastNameIndex()); - psData->SetDataMatch(iAlgorithm->GetFirstNameIndex()); - } - } - } - else - { - // If contact name only has western word, then should send - // "first name","last name" and "last name + first name" to FindUtil to do the search - const TInt lastnameLen = lastName.Length(); - const TInt firstnameLen = firstName.Length(); - if(lastnameLen) - { - matched = pFindUtilEce->MatchRefineL(lastName, searchQuery); - - if (matched) - { - psData->SetDataMatch(iAlgorithm->GetLastNameIndex()); - } - } - - if(!matched && firstnameLen) - { - matched = pFindUtilEce->MatchRefineL(firstName, searchQuery); - - if (matched) - { - psData->SetDataMatch(iAlgorithm->GetFirstNameIndex()); - } - } - - token.Append(lastName); - token.Append(firstName); - if (!matched && lastnameLen && firstnameLen) - { - matched = pFindUtilEce->MatchRefineL(token, searchQuery); - - if (matched) - { - psData->SetDataMatch(iAlgorithm->GetLastNameIndex()); - psData->SetDataMatch(iAlgorithm->GetFirstNameIndex()); - } - } - } - - if (matched) - { - // Extract matched character sequence, don't need to be accurate for Chinese variant - const TInt len = 1; - - HBufC* seq = HBufC::NewLC(len); - *seq = token.Mid(0, len); - seq->Des().UpperCase(); - - TIdentityRelation rule(Compare1); - if (tempMatchSeq.Find(seq, rule) == KErrNotFound) - { - tempMatchSeq.Append(seq); - CleanupStack::Pop(); - } - else - { - CleanupStack::PopAndDestroy(); - } - - // Add the result - if (isSearchInGroup) - { - if (aContactsInGroup.Find(psData->Id()) != KErrNotFound) - { - aAlgorithmFilterHelper->AddL(psData, tempMatchSeq); - } - } - else - { - aAlgorithmFilterHelper->AddL(psData, tempMatchSeq); - } - } - - // Cleanup the match sequence array as - // they are stored in pattern details structure - tempMatchSeq.ResetAndDestroy(); - } - - PRINT ( _L("End CPcsAlgorithm2Helper::FilterResultsMixedL") ); + PRINT ( _L("End CPcsAlgorithm2Helper::FilterResultsSingleL") ); } // ---------------------------------------------------------------------------- @@ -899,93 +419,156 @@ void CPcsAlgorithm2Helper::SortSearchSeqsL(RPointerArray& aSearchSeqs) { // Sort the search seqs - TLinearOrder rule(Compare2); + TLinearOrder rule( CPcsAlgorithm2Utils::MyCompareC ); aSearchSeqs.Sort(rule); } -// ---------------------------------------------------------------------------- -// CPcsAlgorithm2Helper::ExtractQueryL() -// Required for mixed mode search. -// ---------------------------------------------------------------------------- -void CPcsAlgorithm2Helper::ExtractQueryL(CPsQuery& aQuery, TDes& aOutput) +// --------------------------------------------------------------------------- +// CPcsAlgorithm2Helper::CreteNameBufLC +// Update name order according to Phonebook setting +// --------------------------------------------------------------------------- +HBufC* CPcsAlgorithm2Helper::CreateNameBufLC( const CPsData& aContactData, + TInt aFirstNameIndex, TInt aLastNameIndex ) const { - for (int i = 0; i < aQuery.Count(); i++) + const TDesC& firstName( *aContactData.Data(aFirstNameIndex) ); + const TDesC& lastName( *aContactData.Data(aLastNameIndex) ); + CFindUtilChineseECE* pFindUtilEce = iAlgorithm->FindUtilECE(); + HBufC* fullName = NULL; + + if ( pFindUtilEce->IsChineseWordIncluded( lastName ) || + pFindUtilEce->IsChineseWordIncluded( firstName ) ) { - if (aQuery.GetItemAtL(i).Mode() == EItut) + fullName = HBufC::NewLC( lastName.Length() + firstName.Length() + 1 ); + TPtr fullNamePtr = fullName->Des(); + + // Form the full name according the Phonebook name order setting. Typically, + // the order is always lastname-firstname in Chinese variants. However, at least + // currently it is possible to change this from Contacts app if UI language has + // been set to English. + if ( iNameOrder == ELastnameFirstname ) { - TBuf outBuf; - keyMap->GetNumericKeyString(aQuery.QueryAsStringLC(), outBuf); - aOutput.Append(outBuf[i]); - CleanupStack::PopAndDestroy(); + fullNamePtr.Append( lastName ); + //Holds the first char of first name of a contact + TBuf<10> firstChar; + firstChar.Zero(); + + if(firstName.Length()) + { + firstChar.Append(firstName[0]); + // There is no space between LastName and FirstName in Chinese Name + // except that the firstChar of FirstName isn't Chinese character + if ( !pFindUtilEce->IsChineseWordIncluded( firstChar ) ) + { + fullNamePtr.Append( KSpace ); + } + fullNamePtr.Append( firstName ); + } } else { - aOutput.Append(aQuery.GetItemAtL(i).Character()); + fullNamePtr.Append( firstName ); + //Holds the first char of last name of a contact + TBuf<10> firstChar; + firstChar.Zero(); + + if(lastName.Length()) + { + firstChar.Append(lastName[0]); + // There is no space between LastName and FirstName in Chinese Name + // except that the firstChar of Lastname isn't Chinese character + if ( !pFindUtilEce->IsChineseWordIncluded( firstChar ) ) + { + fullNamePtr.Append( KSpace ); + } + fullNamePtr.Append( lastName ); + } + } + } + else + { + fullName = HBufC::NewLC( lastName.Length() + firstName.Length() + 1 ); + TPtr fullNamePtr = fullName->Des(); + + // Form the full name according the Phonebook name order setting. Typically, + // the order is always lastname-firstname in Chinese variants. However, at least + // currently it is possible to change this from Contacts app if UI language has + // been set to English. + if ( iNameOrder == ELastnameFirstname ) + { + fullNamePtr.Append( lastName ); + fullNamePtr.Append( KSpace ); + fullNamePtr.Append( firstName ); + } + else + { + fullNamePtr.Append( firstName ); + fullNamePtr.Append( KSpace ); + fullNamePtr.Append( lastName ); + } + } + + return fullName; + } + +// --------------------------------------------------------------------------- +// CPcsAlgorithm2Helper::UpdateNameOrderL +// Update name order according to Phonebook setting +// --------------------------------------------------------------------------- +void CPcsAlgorithm2Helper::UpdateNameOrderL() + { + /* + * Phonebook name ordering flag, integer value, possible values: + * 0: name order Lastname Firstname + * 1: name order Firstname Lastname + * 2: name order undefined + */ + TInt nameOrderSetting; + iPbkSettings->Get( MPbkGlobalSetting::ENameOrdering, nameOrderSetting ); + + switch ( nameOrderSetting ) + { + case 0: + { + iNameOrder = ELastnameFirstname; + break; + } + case 1: + { + iNameOrder = EFirstnameLastname; + break; + } + case 2: + default: + { + // Decide name order based on UI language: lastname-firstname + // for Chinese, firstname-lastname for the rest of languages. + TLanguage uiLang = User::Language(); + if ( uiLang == ELangPrcChinese || + uiLang == ELangHongKongChinese || + uiLang == ELangTaiwanChinese ) + { + iNameOrder = ELastnameFirstname; + } + else + { + iNameOrder = EFirstnameLastname; + } } } } -// ---------------------------------------------------------------------------- -// CPcsAlgorithm2Helper::ExtractQueryL() -// Required for mixed mode search. -// ---------------------------------------------------------------------------- -void CPcsAlgorithm2Helper::ExtractQueryL(TDesC& aInput, CPsQuery& aQuery, TDes& aOutput) +// --------------------------------------------------------------------------- +// CPcsAlgorithm2Helper::SettingChangedL +// From MPbkGlobalSettingObserver +// --------------------------------------------------------------------------- +void CPcsAlgorithm2Helper::SettingChangedL( MPbkGlobalSetting::TPbkGlobalSetting aKey ) { - TInt len = -1; - - if (aInput.Length() > aQuery.Count()) - { - len = aQuery.Count(); - } - else + if ( aKey == MPbkGlobalSetting::ENameOrdering ) { - len = aInput.Length(); - } - - for (int i = 0; i < len; i++) - { - if (aQuery.GetItemAtL(i).Mode() == EItut) - { - TBuf outBuf; - keyMap->GetNumericKeyString(aInput, outBuf); - aOutput.Append(outBuf[i]); - } - else - { - aOutput.Append(aInput[i]); - } + UpdateNameOrderL(); } } -// ---------------------------------------------------------------------------- -// CPcsAlgorithm2Helper::FilterDataFieldsL() -// Constructs a bit pattern using the required/supported data fields -// For example, 6, 4 and 27 are supported fields <-- 00000111 -// 6 and 4 are required fields <-- 00000011 -// Bit pattern returned is 00000011. -// ---------------------------------------------------------------------------- -TUint8 CPcsAlgorithm2Helper::FilterDataFieldsL(RArray& aRequiredDataFields, - RArray& aSupportedDataFields) - { - TUint8 filteredMatch = 0x0; - - for (int i = 0; i < aSupportedDataFields.Count(); i++) - { - for (int j = 0; j < aRequiredDataFields.Count(); j++) - { - if (aSupportedDataFields[i] == aRequiredDataFields[j]) - { - TReal val; - Math::Pow(val, 2, i); - - filteredMatch |= (TUint8) val; - } - } - } - - return filteredMatch; - } - // End of file diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsAlgorithm2MultiSearchHelper.cpp --- a/predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsAlgorithm2MultiSearchHelper.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsAlgorithm2MultiSearchHelper.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -23,26 +23,7 @@ #include #include -// Compare functions -TBool Compare2(const HBufC& aFirst, const HBufC& aSecond) - { - TPtrC t1(aFirst); - TPtrC t2(aSecond); - return (t1.Length() > t2.Length()); - } -TBool Compare3(const TDesC& aFirst, const TDesC& aSecond) - { - return aFirst == aSecond; - } - -TBool Compare4(const CPsQuery& aFirst, const CPsQuery& aSecond) - { - CPsQuery& first = const_cast (aFirst); - CPsQuery& second = const_cast (aSecond); - - return (first.Count() > second.Count()); - } // ============================== MEMBER FUNCTIONS ============================ // ---------------------------------------------------------------------------- @@ -82,13 +63,14 @@ PRINT ( _L("Enter CPcsAlgorithm2MultiSearchHelper::ConstructL") ); iAlgorithm = aAlgorithm; - keyMap = iAlgorithm->GetKeyMap(); - + iKeyMap = iAlgorithm->GetKeyMap(); + iMaxCount = 0; + PRINT ( _L("End CPcsAlgorithm2MultiSearchHelper::ConstructL") ); } // ---------------------------------------------------------------------------- -// CPcsAlgorithm2MultiSearchHelper::CPcsAlgorithm2MultiSearchHelper +// CPcsAlgorithm2MultiSearchHelper::~CPcsAlgorithm2MultiSearchHelper // Destructor // ---------------------------------------------------------------------------- CPcsAlgorithm2MultiSearchHelper::~CPcsAlgorithm2MultiSearchHelper() @@ -116,90 +98,105 @@ // ---------------------------------------------------------------------------- void CPcsAlgorithm2MultiSearchHelper::SearchMultiL(const CPsSettings& aSettings, RPointerArray& aPsQuery, - TBool isSearchInGroup, - RArray& aContactsInGroup, - RPointerArray& searchResults, - RPointerArray& searchSeqs, - TInt keyboardMode) + TBool aIsSearchInGroup, + const RArray& aContactsInGroup, + RPointerArray& aSearchResults, + RPointerArray& aSearchSeqs) { - __LATENCY_MARK ( _L("CPcsAlgorithm2MultiSearchHelper::SearchMultiL") ); PRINT ( _L("Enter CPcsAlgorithm2MultiSearchHelper::SearchMultiL") ); + //__LATENCY_MARK ( _L("CPcsAlgorithm2MultiSearchHelper::SearchMultiL") ); + + PRINTQUERYLIST ( _L("CPcsAlgorithm2MultiSearchHelper::SearchMultiL: "), aPsQuery ); + + iMaxCount = aSettings.MaxResults(); // Create CPcsAlgorithm2FilterHelper object to be used for filtering the results TSortType sortType = aSettings.GetSortType(); CPcsAlgorithm2FilterHelper* filterHelper = CPcsAlgorithm2FilterHelper::NewL(sortType); + CleanupStack::PushL( filterHelper ); RPointerArray elements; + CleanupClosePushL( elements ); iMultiSearchResultsArr.ResetAndDestroy(); // Get the data stores - RPointerArray aDataStores; - aSettings.SearchUrisL(aDataStores); + RPointerArray dataStores; + CleanupResetAndDestroyPushL( dataStores ); + aSettings.SearchUrisL(dataStores); // Get the required display fields from the client RArray requiredDataFields; + CleanupClosePushL( requiredDataFields ); aSettings.DisplayFieldsL(requiredDataFields); - // Search from cache based on first character + // Search from cache based on first character of 1st item in query list const CPsQueryItem& firstCharItem = aPsQuery[0]->GetItemAtL(0); - TInt numValue = keyMap->PoolIdForCharacter( firstCharItem.Character() ); - + TInt cachePoolId = iKeyMap->PoolIdForCharacter( firstCharItem.Character(), firstCharItem.Mode() ); + // Get the elements from all the databases - for (int dsIndex = 0; dsIndex < aDataStores.Count(); dsIndex++) + const TInt dataStoresCount = dataStores.Count(); + for (TInt dsIndex = 0; dsIndex < dataStoresCount; dsIndex++) { RPointerArray *temp = new (ELeave) RPointerArray (); iMultiSearchResultsArr.Append(temp); // Get the contents for this data store - TInt arrayIndex = iAlgorithm->GetCacheIndex(*(aDataStores[dsIndex])); + TInt arrayIndex = iAlgorithm->GetCacheIndex(*(dataStores[dsIndex])); if (arrayIndex < 0) { continue; } CPcsCache* cache = iAlgorithm->GetCache(arrayIndex); - cache->GetContactsForKeyL(numValue, elements); + cache->GetContactsForKeyL(cachePoolId, elements); // Get the supported data fields for this data store RArray supportedDataFields; + CleanupClosePushL( supportedDataFields ); cache->GetDataFields(supportedDataFields); - // Get the filtered data fields for this data store - TUint8 filteredDataMatch = FilterDataFieldsL(requiredDataFields, supportedDataFields); + // Get the filtered data fields for this data store + TUint8 filteredDataMatch = CPcsAlgorithm2Utils::FilterDataFieldsL( + requiredDataFields, supportedDataFields); // Filter the results now - FilterResultsMultiL(filterHelper, elements, aPsQuery, filteredDataMatch, - isSearchInGroup, aContactsInGroup, keyboardMode); + FilterResultsMultiL(filterHelper, + elements, + aPsQuery, + filteredDataMatch, + aIsSearchInGroup, + aContactsInGroup); - // If alphabetical sorting, get the results for this datastore + // If alphabetical sorting, get the results for this datastore if (sortType == EAlphabetical) { filterHelper->GetResults(*(iMultiSearchResultsArr[dsIndex])); } elements.Reset(); - supportedDataFields.Reset(); + CleanupStack::PopAndDestroy( &supportedDataFields ); // Close } - aDataStores.ResetAndDestroy(); - requiredDataFields.Reset(); + CleanupStack::PopAndDestroy( &requiredDataFields ); // Close + CleanupStack::PopAndDestroy( &dataStores ); // ResetAndDestroy // If alphabetical sorting, merge the result sets of all datastores if (sortType == EAlphabetical) { // Form the complete searchResults array - CPcsAlgorithm2Utils::FormCompleteSearchResultsL(iMultiSearchResultsArr, searchResults); + CPcsAlgorithm2Utils::FormCompleteSearchResultsL(iMultiSearchResultsArr, + aSearchResults); } else { // Results are already sorted patternbased - filterHelper->GetResults(searchResults); + filterHelper->GetResults(aSearchResults); } // Get the sorted match sequence list - filterHelper->GetPatternsL(searchSeqs); + filterHelper->GetPatternsL(aSearchSeqs); - PRINT1 ( _L("Number of search results = %d"), searchResults.Count() ); + PRINT1 ( _L("Number of search results = %d"), aSearchResults.Count() ); - // Cleanup + // Cleanup for (TInt i = 0; i < iMultiSearchResultsArr.Count(); i++) { iMultiSearchResultsArr[i]->Reset(); @@ -208,278 +205,148 @@ } iMultiSearchResultsArr.Reset(); - delete filterHelper; + CleanupStack::PopAndDestroy( &elements ); // Close + CleanupStack::PopAndDestroy( filterHelper ); + + //__LATENCY_MARKEND ( _L("CPcsAlgorithm2MultiSearchHelper::SearchMultiL") ); PRINT ( _L("End CPcsAlgorithm2MultiSearchHelper::SearchMultiL") ); - __LATENCY_MARKEND ( _L("CPcsAlgorithm2MultiSearchHelper::SearchMultiL") ); } // ---------------------------------------------------------------------------- -// CPcsAlgorithm2MultiSearchHelper::SearchInputMultiL -// Function to search match sequences for multi query +// CPcsAlgorithm1MultiSearchHelper::SearchMatchSeqMultiL +// Function adds matches, and locations based on multi query, and data +// Duplicate locations are allowed (as they are removed later anyway) +// Post condition locations in index order // ---------------------------------------------------------------------------- -void CPcsAlgorithm2MultiSearchHelper::SearchMatchSeqMultiL(RPointerArray& aPsQuery, - TDesC& aData, - RPointerArray& aMatchSet, - RArray& aMatchLocation) +void CPcsAlgorithm2MultiSearchHelper::SearchMatchSeqMultiL( RPointerArray& aPsQuery, + const TDesC& aData, + RPointerArray& aMatchSeq, + RArray& aMatchLocation ) { PRINT ( _L("Enter CPcsAlgorithm2MultiSearchHelper::SearchMatchSeqMultiL") ); - CleanupResetAndDestroyPushL( aMatchSet ); - CleanupClosePushL( aMatchLocation ); - - RPointerArray queryList; - ConvertQueryToListL(aPsQuery, queryList); - - RPointerArray tempqueryList; - // Remember a temporary copy of query list - // since we sort the queries - for (TInt i = 0; i < queryList.Count(); i++) - { - tempqueryList.Append(queryList[i]); - } - // To hold the match results - RPointerArray tmpMatchSet; - TBool isMatch = ETrue; - TUint32 wordMatches = 0; - - // Sort the query items before we search them - TLinearOrder rule(Compare2); - queryList.Sort(rule); - // Check for each query atleast one data element matches - // Loop from the last query so that longest match is seen first - for (TInt queryIndex = queryList.Count() - 1; queryIndex >= 0; queryIndex--) + TLex lex(aData); + while ( !lex.Eos() ) // Search thru all words { - TBool queryMatch = EFalse; - HBufC* tmpQuery = queryList[queryIndex]; - // Get the original query mode corresponding to this query - TInt modeIndex = tempqueryList.Find(tmpQuery); - - TLex lex(aData); + TPtrC currentWord = lex.NextToken(); // next word - // First word - TPtrC tmpData = lex.NextToken(); - - TInt beg = lex.Offset() - tmpData.Length(); // start index of match sequence - - TInt wordIndex = -1; - // Search thru multiple words - while ((tmpData.Length() != 0) && (!queryMatch)) + const TInt psQueryCount = aPsQuery.Count(); + for ( TInt queryIndex = 0; queryIndex < psQueryCount; ++queryIndex ) { - wordIndex++; + CPsQuery* currentQuery = aPsQuery[queryIndex]; - TPtr ptr = tmpQuery->Des(); - - // Perform two checks. - // 1. Ensure that the word is not matched against any previous query - // 2. If it is the first match to the query - TBool isWordMatch = EFalse; - TReal val; - Math::Pow(val, 2, wordIndex); - isWordMatch = wordMatches & (TUint) val; - - if (!isWordMatch) + RArray matchPos; + CleanupClosePushL( matchPos ); + RArray matchLen; + CleanupClosePushL( matchLen ); + + if ( iAlgorithm->FindUtilECE()->MatchRefineL( currentWord, *currentQuery, matchPos, matchLen, ETrue ) ) { - // Check if no word is matched till now for this query - if (!queryMatch) + // Some matches found. Add all of them to result array. + ASSERT( matchPos.Count() == matchLen.Count() ); + + TInt wordStartPos = lex.Offset() - currentWord.Length(); + const TInt matchPosCount = matchPos.Count(); + for ( TInt i = 0 ; i < matchPosCount; ++i ) { - queryMatch = ETrue; - //set the word match bit - TReal val; - Math::Pow(val, 2, wordIndex); - wordMatches |= (TUint) val; - } + TPsMatchLocation newLocation = { wordStartPos + matchPos[i], matchLen[i], + TBidiText::TextDirectionality(currentWord) }; + aMatchLocation.AppendL( newLocation ); - TPsMatchLocation tempLocation; - // check for directionality of the text - TBool found(EFalse); - TBidiText::TDirectionality dir = TBidiText::TextDirectionality(tmpData, &found); - - tempLocation.index = beg; - tempLocation.length = 0; - tempLocation.direction = dir; - - // Add the match location to the data structure array - aMatchLocation.Append(tempLocation); + TPtrC matchPart = currentWord.Mid( matchPos[i], matchLen[i] ); + CPcsAlgorithm2Utils::AppendMatchToSeqL( aMatchSeq, matchPart ); + } } - } - // Next word - tmpData.Set(lex.NextToken()); - beg = lex.Offset() - tmpData.Length(); // start index of next word - - - // No data element matches the query. Ignore this result. - if (queryMatch == EFalse) - { - isMatch = EFalse; - break; + + CleanupStack::PopAndDestroy( &matchLen ); + CleanupStack::PopAndDestroy( &matchPos ); } } - // Count the number of bits set - TInt matchCount = 0; - matchCount = BitsSet32(wordMatches); - - // If match add the element to the result set - // Before adding to the result set, check if there is atleast one match per query - // Number of bits set in word matches is atleast equal to total number of queries. - if ((isMatch) && (matchCount >= queryList.Count())) - { - - // Include the match sequences in the final results - for (int i = 0; i < tmpMatchSet.Count(); i++) - { - TIdentityRelation rule(Compare3); - CleanupStack::PushL(tmpMatchSet[i]); - if (aMatchSet.Find(tmpMatchSet[i], rule) == KErrNotFound) - { - aMatchSet.Append(tmpMatchSet[i]); - CleanupStack::Pop(); - } - else - { - CleanupStack::PopAndDestroy(); - } - } - - // Reset tmp match set - tmpMatchSet.Reset(); - } - else - { - tmpMatchSet.ResetAndDestroy(); - } - - // Free the query list - queryList.ResetAndDestroy(); - tempqueryList.Reset(); - - CleanupStack::Pop(); - CleanupStack::Pop( &aMatchSet ); - PRINT ( _L("End CPcsAlgorithm2MultiSearchHelper::SearchMatchSeqMultiL") ); } // ---------------------------------------------------------------------------- -// CPcsAlgorithm2MultiSearchHelper::ConvertQueryToList -// Converts the multiple search queries to a list -// ---------------------------------------------------------------------------- -void CPcsAlgorithm2MultiSearchHelper::ConvertQueryToListL(RPointerArray& aSearchQuery, - RPointerArray& aQueryList) - { - for (int queryIndex = 0; queryIndex < aSearchQuery.Count(); queryIndex++) - { - CPsQuery* query = aSearchQuery[queryIndex]; - - HBufC* tmpSearchQuery = HBufC::NewL(KPsQueryMaxLen); - TPtr ptr = tmpSearchQuery->Des(); - - if (query->KeyboardModeL() == EItut) // ITU - { - keyMap->GetNumericKeyString(query->QueryAsStringLC(), ptr); - CleanupStack::PopAndDestroy(); - } - else if (query->KeyboardModeL() == EQwerty) // QWERTY - { - ptr = query->QueryAsStringLC(); - ptr.LowerCase(); - CleanupStack::PopAndDestroy(); - } - else // UNDEFINED - { - ExtractQueryL(*query, ptr); - ptr.LowerCase(); - } - aQueryList.Append(tmpSearchQuery); - } - } - -// ---------------------------------------------------------------------------- -// CPcsAlgorithm2MultiSearchHelper::ConvertdDataToKeyBoardModeL -// Converts the input data to the key board mode specified by the query -// ---------------------------------------------------------------------------- -void CPcsAlgorithm2MultiSearchHelper::ConvertdDataToKeyBoardModeL(CPsQuery* aQuery, - TPtrC aInputData, - TBuf& aOutputData) - { - if (aQuery->KeyboardModeL() == EItut) - { - keyMap->GetNumericKeyString(aInputData, aOutputData); - } - else if (aQuery->KeyboardModeL() == EQwerty) - { - aOutputData = aInputData; - aOutputData.LowerCase(); - } - else - { - ExtractQueryL(aInputData, *aQuery, aOutputData); - aOutputData.LowerCase(); - } - } - -// ---------------------------------------------------------------------------- // CPcsAlgorithm2MultiSearchHelper::FilterResultsMultiL // Subset search function. Refer the above function for more description. // ---------------------------------------------------------------------------- void CPcsAlgorithm2MultiSearchHelper::FilterResultsMultiL(CPcsAlgorithm2FilterHelper* aAlgorithmFilterHelper, - RPointerArray& searchSet, - RPointerArray& searchQuery, + RPointerArray& aSearchSet, + RPointerArray& aSearchQuery, TUint8 aFilteredDataMatch, - TBool isSearchInGroup, - RArray& aContactsInGroup, - TInt keyboardMode) + TBool aIsSearchInGroup, + const RArray& aContactsInGroup) { PRINT ( _L("Enter CPcsAlgorithm2MultiSearchHelper::FilterResultsMultiL") ); + //__LATENCY_MARK ( _L("CPcsAlgorithm2MultiSearchHelper::FilterResultsMultiL") ); + + TInt maxcount = 0; + // Convert the individual queries to string form RPointerArray mySearchQuery; + CleanupResetAndDestroyPushL( mySearchQuery ); // Remember a temporary copy of query list // Copy the content of searchQuery - for (TInt i=0; iFindUtilECE()->GetPartOfQueryL(*(searchQuery[i]), 0, - searchQuery[i]->Count()-1, *tempQuery); - mySearchQuery.Append(tempQuery); + CleanupStack::PushL( tempQuery ); + iAlgorithm->FindUtilECE()->GetPartOfQueryL( + *(aSearchQuery[i]), 0, aSearchQuery[i]->Count()-1, *tempQuery ); + mySearchQuery.AppendL(tempQuery); + CleanupStack::Pop(tempQuery); // ownership transferred } // Sort the query items according to the length of each query - TLinearOrder rule(Compare4); + TLinearOrder rule(CPcsAlgorithm2Utils::CompareLength); mySearchQuery.Sort(rule); // To hold the match results RPointerArray tmpMatchSet; + CleanupResetAndDestroyPushL( tmpMatchSet ); - // Parse thru each search set elements and filter the results - for (int index = 0; index < searchSet.Count(); index++) + // Parse thru each search set elements and filter the results + const TInt searchSetCount = aSearchSet.Count(); + for (TInt index = 0; index < searchSetCount; index++) { - CPcsPoolElement* poolElement = static_cast (searchSet[index]); + CPcsPoolElement* poolElement = static_cast (aSearchSet[index]); CPsData* psData = poolElement->GetPsData(); psData->ClearDataMatches(); + // Skip the contact if we are doing a group search and contact doesn't belong to the group + if ( aIsSearchInGroup && + aContactsInGroup.Find( psData->Id() ) == KErrNotFound ) + { + continue; + } + TBool isMatch = ETrue; - TUint8 wordMatches = 0; + TInt wordMatches = 0; // Reset iWordMatches to zero ClearWordMatches(); // Check for each query atleast one data element matches // Loop from the last query so that longest match is seen first - for (TInt queryIndex = mySearchQuery.Count() - 1; queryIndex >= 0; queryIndex--) + for (TInt queryIndex = mySearchQuery.Count() - 1; queryIndex >= 0; queryIndex--) { TBool queryMatch = EFalse; CPsQuery* tmpPsQuery = mySearchQuery[queryIndex]; - for (TInt dataIndex = 0; dataIndex < psData->DataElementCount(); dataIndex++) + const TInt dataElementCount = psData->DataElementCount(); + for (TInt dataIndex = 0; dataIndex < dataElementCount; dataIndex++) { // Filter off data fields not required in search - TReal bitIndex; - Math::Pow(bitIndex, 2, dataIndex); - - TUint8 filter = (TUint8) bitIndex & aFilteredDataMatch; - if (filter == 0x0) + TUint8 bitIndex = 1 << dataIndex; + TUint8 filter = bitIndex & aFilteredDataMatch; + + // Omit the data fields which is not required in search + // or not matched with the pool element + if ( filter == 0x0 ) { // Move to next data continue; @@ -497,27 +364,9 @@ { wordIndex++; - TPtrC queryPtr = tmpPsQuery->QueryAsStringLC(); - TBool matched = EFalse; + // Compare the data against query + TBool matched = iAlgorithm->FindUtilECE()->MatchRefineL(tmpData, *tmpPsQuery); - if (keyboardMode == EModeUndefined) - { - matched = iAlgorithm->FindUtilECE()->MatchRefineL(tmpData, *tmpPsQuery); - } - else if (keyboardMode == EItut) - { - matched = iAlgorithm->FindUtil()->Interface()-> - MatchRefineL(tmpData, queryPtr, ECustomConverter, iAlgorithm); - } - else // Qwerty - { - matched = iAlgorithm->FindUtil()->Interface()->MatchRefineL(tmpData, queryPtr); - - } - - CleanupStack::PopAndDestroy(); // queryPtr - - // Compare the data against query if (matched) { psData->SetDataMatch(dataIndex); @@ -540,25 +389,18 @@ // Extract matched character sequence and fill in temp array TInt len = tmpPsQuery->Count(); - if (iAlgorithm->FindUtilECE()->IsChineseWord(tmpData)) + if (iAlgorithm->FindUtilECE()->IsChineseWordIncluded(tmpData)) { len = 1; } - HBufC* seq = HBufC::NewL(len); - *seq = tmpData.Mid(0, len); - - seq->Des().UpperCase(); - TIdentityRelation searchRule(Compare3); - if (tmpMatchSet.Find(seq, searchRule) == KErrNotFound) - { - tmpMatchSet.Append(seq); - } - else - { - delete seq; - seq = NULL; - } + TPtrC seq = tmpData.Left(len); + CPcsAlgorithm2Utils::AppendMatchToSeqL( tmpMatchSet, seq ); + + // TODO: Match seqs could be extracted from actual + // match locations by using the other overload of + // CFindUtilChineseECE::MatchRefineL(). + // Currently, match seq data is not used by clients. } } @@ -574,112 +416,50 @@ break; } } + // If match add the element to the result set // And before adding to the result set, check if there is atleast one match per query - if ((isMatch) && (wordMatches >= mySearchQuery.Count())) + if ( isMatch && wordMatches >= mySearchQuery.Count() ) { - if (isSearchInGroup) - { - if (aContactsInGroup.Find(psData->Id()) != KErrNotFound) - { - aAlgorithmFilterHelper->AddL(psData, tmpMatchSet); - } - } - else - { - aAlgorithmFilterHelper->AddL(psData, tmpMatchSet); - } + aAlgorithmFilterHelper->AddL(psData, tmpMatchSet); + maxcount++; } - + + if ( iMaxCount != -1 && maxcount > iMaxCount ) + { + break; + } + // Cleanup the match sequence array as // they are stored in pattern details structure tmpMatchSet.ResetAndDestroy(); } - mySearchQuery.Reset(); + CleanupStack::PopAndDestroy( &tmpMatchSet ); // ResetAndDestroy + CleanupStack::PopAndDestroy( &mySearchQuery ); // ResetAndDestroy + + //__LATENCY_MARKEND ( _L("CPcsAlgorithm2MultiSearchHelper::FilterResultsMultiL") ); PRINT ( _L("End CPcsAlgorithm2MultiSearchHelper::FilterResultsMultiL") ); } // ---------------------------------------------------------------------------- -// CPcsAlgorithm2MultiSearchHelper::SetWordMap() +// CPcsAlgorithm2MultiSearchHelper::SetWordMap // ---------------------------------------------------------------------------- void CPcsAlgorithm2MultiSearchHelper::SetWordMap(TInt aIndex, TInt aPosition) { - TReal val; - Math::Pow(val, 2, aPosition); - - iWordMatches[aIndex] |= (TUint8) val; - } - -// ---------------------------------------------------------------------------- -// CPcsAlgorithm2MultiSearchHelper::IsWordMatch() -// ---------------------------------------------------------------------------- -TBool CPcsAlgorithm2MultiSearchHelper::IsWordMatch(TInt aDataIndex, TInt aWordIndex) - { - TReal val; - Math::Pow(val, 2, aWordIndex); - - return (iWordMatches[aDataIndex] & (TUint8) val); + TUint8 val = 1 << aPosition; + iWordMatches[aIndex] |= val; } // ---------------------------------------------------------------------------- -// CPcsAlgorithm2MultiSearchHelper::ExtractQueryL() -// Extracts the query as a string. If the mode of query item is ITU numeric -// character is used. Else the character is used. -// ---------------------------------------------------------------------------- -void CPcsAlgorithm2MultiSearchHelper::ExtractQueryL(CPsQuery& aQuery, TDes& aOutput) - { - for (int i = 0; i < aQuery.Count(); i++) - { - if (aQuery.GetItemAtL(i).Mode() == EItut) - { - TBuf outBuf; - keyMap->GetNumericKeyString(aQuery.QueryAsStringLC(), outBuf); - aOutput.Append(outBuf[i]); - CleanupStack::PopAndDestroy(); - } - else - { - aOutput.Append(aQuery.GetItemAtL(i).Character()); - } - } - } - -// ---------------------------------------------------------------------------- -// CPcsAlgorithm2MultiSearchHelper::ExtractQueryL() -// Converts the input data refering the modes in the query. -// If the mode of query item is ITU numeric character is used. Else the character -// is used. +// CPcsAlgorithm2MultiSearchHelper::IsWordMatch // ---------------------------------------------------------------------------- -void CPcsAlgorithm2MultiSearchHelper::ExtractQueryL(TDesC& aInput, CPsQuery& aQuery, TDes& aOutput) +TBool CPcsAlgorithm2MultiSearchHelper::IsWordMatch(TInt aDataIndex, TInt aWordIndex) { - TInt len = -1; - - // Always loop thru the lowest length - if (aInput.Length() > aQuery.Count()) - { - len = aQuery.Count(); - } - else - { - len = aInput.Length(); - } - - for (int i = 0; i < len; i++) - { - if (aQuery.GetItemAtL(i).Mode() == EItut) - { - TBuf outBuf; - keyMap->GetNumericKeyString(aInput, outBuf); - aOutput.Append(outBuf[i]); - } - else - { - aOutput.Append(aInput[i]); - } - } + TUint8 val = 1 << aWordIndex; + return (iWordMatches[aDataIndex] & val); } // ---------------------------------------------------------------------------- @@ -699,7 +479,7 @@ } // ---------------------------------------------------------------------------- -// CPcsAlgorithm2MultiSearchHelper::BitsSet32 +// CPcsAlgorithm2MultiSearchHelper::ClearWordMatches // Function to reset the iWordMatches // ---------------------------------------------------------------------------- void CPcsAlgorithm2MultiSearchHelper::ClearWordMatches() @@ -729,13 +509,14 @@ { // Scan the end of the word TInt end = beg; - for (; end < textLength && !aQuery.GetItemAtL(end).Character().IsSpace(); ++end) + while ( end < textLength && !aQuery.GetItemAtL(end).Character().IsSpace() ) { + end++; } // Create a new query object and append CPsQuery* newQuery = CPsQuery::NewL(); - for (int i = beg; i < end; i++) + for (TInt i = beg; i < end; i++) { CPsQueryItem* item = CPsQueryItem::NewL(); item->SetCharacter(aQuery.GetItemAtL(i).Character()); @@ -752,35 +533,6 @@ return query; } -// ---------------------------------------------------------------------------- -// CPcsAlgorithm2MultiSearchHelper::FilterDataFieldsL() -// Constructs a bit pattern using the required/supported data fields -// For example, 6, 4 and 27 are supported fields <-- 00000111 -// 6 and 4 are required fields <-- 00000011 -// Bit pattern returned is 00000011. -// ---------------------------------------------------------------------------- -TUint8 CPcsAlgorithm2MultiSearchHelper::FilterDataFieldsL(RArray& aRequiredDataFields, - RArray& aSupportedDataFields) - { - TUint8 filteredMatch = 0x0; - - for (int i = 0; i < aSupportedDataFields.Count(); i++) - { - for (int j = 0; j < aRequiredDataFields.Count(); j++) - { - if (aSupportedDataFields[i] == aRequiredDataFields[j]) - { - TReal val; - Math::Pow(val, 2, i); - - filteredMatch |= (TUint8) val; - } - } - } - - return filteredMatch; - } - // End of file diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsAlgorithm2Utils.cpp --- a/predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsAlgorithm2Utils.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsAlgorithm2Utils.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -18,6 +18,7 @@ // INCLUDES #include "CPcsAlgorithm2Utils.h" #include "CPsData.h" +#include "CPsQuery.h" #include "CPcsDefs.h" #include "CPcsCache.h" #include @@ -33,16 +34,15 @@ // Merges all the respective data store result sets to single set in sorted order. // ---------------------------------------------------------------------------- void CPcsAlgorithm2Utils::FormCompleteSearchResultsL(RPointerArray& aSearchResultsArr, - RPointerArray& SearchResults) + RPointerArray& aSearchResults) { - CleanupClosePushL( SearchResults ); - TInt maxIndex = 0; TInt maxValue = aSearchResultsArr[maxIndex]->Count(); TLinearOrder rule(CPcsAlgorithm2Utils::CompareDataBySortOrder); // Find the largest array in aSearchResultsArr - for (TInt i = 1; i < aSearchResultsArr.Count(); i++) + const TInt searchResultsArrCount = aSearchResultsArr.Count(); + for (TInt i = 1; i < searchResultsArrCount; i++) { if (aSearchResultsArr[i]->Count() > maxValue) { @@ -52,13 +52,15 @@ } // Assign the largets array to searchresults - for (TInt i = 0; i < aSearchResultsArr[maxIndex]->Count(); i++) + const TInt cnt = aSearchResultsArr[maxIndex]->Count(); + for (TInt i = 0; i < cnt; i++) { - SearchResults.Append((*(aSearchResultsArr[maxIndex]))[i]); + aSearchResults.Append((*(aSearchResultsArr[maxIndex]))[i]); } // Merge the remaining result arrays to the largest array in sequential order - for (TInt i = 0; i < aSearchResultsArr.Count(); i++) + + for (TInt i = 0; i < searchResultsArrCount; i++) { // Check if we are not copying again the largest array if ((i != maxIndex) && ((aSearchResultsArr[i])->Count() != 0)) @@ -66,11 +68,10 @@ TInt numElements = (aSearchResultsArr[i])->Count(); for (TInt j = 0; j < numElements; j++) { - SearchResults.InsertInOrderAllowRepeatsL((*(aSearchResultsArr[i]))[j], rule); + aSearchResults.InsertInOrderAllowRepeatsL((*(aSearchResultsArr[i]))[j], rule); } } } - CleanupStack::Pop(); } // ---------------------------------------------------------------------------- @@ -121,7 +122,8 @@ cache->GetIndexOrder(indexOrder); // Append sort order elements first - for (int i = 0; i < indexOrder.Count(); i++) + const TInt indexOrderCount1 = indexOrder.Count(); + for (int i = 0; i < indexOrderCount1; i++) { TInt index = indexOrder[i]; if (index < aObject1.DataElementCount() && aObject1.Data(index)) @@ -158,9 +160,10 @@ // Get the index order based on sort order from the cache cache->GetIndexOrder(indexOrder); + const TInt indexOrderCount2 = indexOrder.Count(); // Append sort order elements first - for (int i = 0; i < indexOrder.Count(); i++) + for (int i = 0; i < indexOrderCount2; i++) { TInt index = indexOrder[i]; if (index < aObject2.DataElementCount() && aObject2.Data(index)) @@ -195,6 +198,27 @@ } // ---------------------------------------------------------------------------- +// CPcsAlgorithm2Utils::CompareExact() +// +// ---------------------------------------------------------------------------- +TBool CPcsAlgorithm2Utils::CompareExact(const TDesC& aFirst, const TDesC& aSecond) + { + return aFirst == aSecond; + } + +// ---------------------------------------------------------------------------- +// CPcsAlgorithm2Utils::CompareLength() +// +// ---------------------------------------------------------------------------- +TInt CPcsAlgorithm2Utils::CompareLength(const CPsQuery& aFirst, const CPsQuery& aSecond) + { + CPsQuery& first = const_cast (aFirst); + CPsQuery& second = const_cast (aSecond); + + return (first.Count() - second.Count()); + } + +// ---------------------------------------------------------------------------- // CPcsAlgorithm2Utils::MyTrim() // Trim off all white spaces and special characters // This behavior is required to mimic the current phonebook sort sequence @@ -233,5 +257,90 @@ return ETrue; } +// ---------------------------------------------------------------------------- +// CPcsAlgorithm1Helper::FilterDataFieldsL() +// Constructs a bit pattern using the required/supported data fields +// For example, 6, 4 and 27 are supported fields <-- 00000111 +// 6 and 4 are required fields <-- 00000011 +// Bit pattern returned is 00000011. +// ---------------------------------------------------------------------------- +TUint8 CPcsAlgorithm2Utils::FilterDataFieldsL(const RArray& aRequiredDataFields, + const RArray& aSupportedDataFields) +{ + TUint8 filteredMatch = 0x0; + const TInt supportedDataFieldsCount = aSupportedDataFields.Count(); + const TInt requiredDataFieldsCount = aRequiredDataFields.Count(); + for ( TInt i = 0; i < supportedDataFieldsCount; i++ ) + { + for ( TInt j = 0; j < requiredDataFieldsCount; j++ ) + { + if ( aSupportedDataFields[i] == aRequiredDataFields[j] ) + { + TUint8 val = 1 << i; + filteredMatch |= val; + } + } + } + + return filteredMatch; +} + +// ---------------------------------------------------------------------------- +// CPcsAlgorithm2Utils::AppendMatchToSeqL +// ---------------------------------------------------------------------------- +void CPcsAlgorithm2Utils::AppendMatchToSeqL( + RPointerArray& aMatchSeq, const TDesC& aMatch ) + { + HBufC* seq = aMatch.AllocLC(); + seq->Des().UpperCase(); + TIdentityRelation rule(CompareExact); + if ( aMatchSeq.Find(seq, rule) == KErrNotFound ) + { + aMatchSeq.AppendL(seq); + CleanupStack::Pop( seq ); + } + else + { + CleanupStack::PopAndDestroy( seq ); + } + } + +// ---------------------------------------------------------------------------- +// CPcsAlgorithm2Utils::MatchesOverlap +// Check if two match location items have overlapping indices. +// ---------------------------------------------------------------------------- +TBool CPcsAlgorithm2Utils::MatchesOverlap( const TPsMatchLocation& aFirst, + const TPsMatchLocation& aSecond ) + { + TBool overlap = EFalse; + + if ( aFirst.index == aSecond.index ) + { + overlap = ETrue; + } + else + { + // give arguments alias names where first begins before the second + TInt firstPos( aFirst.index ); + TInt firstLen( aFirst.length ); + TInt secondPos( aSecond.index ); + if ( firstPos > secondPos ) + { + firstPos = aSecond.index; + firstLen = aSecond.length; + secondPos = aFirst.index; + } + + // there is an overlap if the end of the first comes after + // beginning of the second + if ( firstPos + firstLen > secondPos ) + { + overlap = ETrue; + } + } + + return overlap; + } + // End of File diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsCache.cpp --- a/predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsCache.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsCache.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -22,6 +22,7 @@ // INCLUDE FILES #include +#include #include "FindUtilChineseECE.h" #include "CPsData.h" @@ -37,7 +38,7 @@ // CPcsCache::NewL // Two Phase Construction // ---------------------------------------------------------------------------- -CPcsCache* CPcsCache::NewL(CPcsAlgorithm2* aAlgorithm, TDesC& aURI, +CPcsCache* CPcsCache::NewL(CPcsAlgorithm2* aAlgorithm, const TDesC& aURI, CPcsKeyMap& aKeyMap, TUint8 aUriId) { PRINT ( _L("Enter CPcsCache::NewL") ); @@ -69,7 +70,7 @@ // CPcsCache::ConstructL // 2nd Phase Constructor // ---------------------------------------------------------------------------- -void CPcsCache::ConstructL(CPcsAlgorithm2* aAlgorithm, TDesC& aURI, +void CPcsCache::ConstructL(CPcsAlgorithm2* aAlgorithm, const TDesC& aURI, CPcsKeyMap& aKeyMap, TUint8 aUriId) { PRINT ( _L("Enter CPcsCache::ConstructL") ); @@ -80,13 +81,14 @@ //Update the caching status for this cache iCacheStatus = ECachingNotStarted; - keyMap = &aKeyMap; + iKeyMap = &aKeyMap; - // Populate keyArr - for (TInt i = 0; i < aKeyMap.PoolCount(); i++) + // Populate iKeyArr + const TInt keyMapPoolcount = aKeyMap.PoolCount(); + for (TInt i = 0; i < keyMapPoolcount; i++) { - RPointerArray *keyMap = new (ELeave) RPointerArray (1); - keyArr.InsertL(keyMap, i); + RPointerArray* keyMap = new (ELeave) RPointerArray (1); + iKeyArr.InsertL(keyMap, i); } PRINT ( _L("End CPcsCache::ConstructL") ); @@ -100,86 +102,15 @@ { PRINT ( _L("Enter CPcsCache::~CPcsCache") ); - if (iURI) - { - delete iURI; - } - - // Loop thru cache info and free and the data elements - THashMapIter iter(cacheInfo); - - do - { - TInt* id = const_cast (iter.NextKey()); - - if (id == NULL) - break; - - TInt* poolMap = iter.CurrentValue(); - - if (poolMap == NULL) - { - continue; - } - - CPsData *data = NULL; - for (int keyIndex = 0; keyIndex <= keyArr.Count(); keyIndex++) - { - TBool present = GetPoolMap(*poolMap, keyIndex); - - if (!present) - { - continue; - } + delete iURI; - RPointerArray tmpKeyMap = *(keyArr[keyIndex]); - for (int arrayIndex = 0; arrayIndex < tmpKeyMap.Count(); arrayIndex++) - { - CPcsPoolElement *element = tmpKeyMap[arrayIndex]; - TInt localId = element->GetPsData()->Id(); - if (*id == localId) - { - data = element->GetPsData(); - delete element; - keyArr[keyIndex]->Remove(arrayIndex); - } - } - }; - - // Remove this element from master pool - for (int arrayIndex = 0; arrayIndex < masterPool.Count(); arrayIndex++) - { - CPsData *dataElement = masterPool[arrayIndex]; - TInt localId = dataElement->Id(); - if (*id == localId) - { - masterPool.Remove(arrayIndex); - } - } - - if (data) - { - delete data; - } - - } - while (1); - - for (TInt i = 0; i < keyArr.Count(); i++) - { - keyArr[i]->ResetAndDestroy(); - delete keyArr[i]; - keyArr[i] = NULL; - } - - masterPool.ResetAndDestroy(); - - cacheInfo.Close(); - - keyArr.Reset(); + RemoveAllFromCache(); // cleans up iMasterPool and iCacheInfo + + iKeyArr.ResetAndDestroy(); iDataFields.Reset(); iSortOrder.Reset(); iIndexOrder.Reset(); + iMasterPoolBackup.Close(); PRINT ( _L("End CPcsCache::~CPcsCache") ); } @@ -191,15 +122,18 @@ void CPcsCache::GetContactsForKeyL(TInt aKeyId, RPointerArray& aData) { PRINT ( _L("Enter CPcsCache::GetContactsForKeyL") ); - CleanupClosePushL( aData ); - RPointerArray arr = *keyArr[aKeyId]; - for (int i = 0; i < arr.Count(); i++) + + if ( aKeyId >= 0 && aKeyId < iKeyArr.Count() ) { - CPcsPoolElement* value = arr[i]; - aData.AppendL(value); + const RPointerArray& arr = *iKeyArr[aKeyId]; + const TInt arrCount = arr.Count(); + for (TInt i = 0; i < arrCount; i++) + { + CPcsPoolElement* value = arr[i]; + aData.AppendL(value); + } } - CleanupStack::Pop(); PRINT ( _L("End CPcsCache::GetContactsForKeyL") ); } @@ -210,13 +144,14 @@ void CPcsCache::GetAllContentsL(RPointerArray& aData) { PRINT ( _L("Enter CPcsCache::GetAllContentsL") ); - CleanupClosePushL( aData ); - for (int i = 0; i < masterPool.Count(); i++) + + const TInt masterPoolCount = iMasterPool.Count(); + for (TInt i = 0; i < masterPoolCount; i++) { - CPsData* value = masterPool[i]; + CPsData* value = iMasterPool[i]; aData.AppendL(value); } - CleanupStack::Pop(); + PRINT ( _L("End CPcsCache::GetAllContentsL") ); } @@ -224,7 +159,7 @@ // CPcsCache::AddToPool // Adds a contact to cache // ---------------------------------------------------------------------------- -void CPcsCache::AddToPoolL(TInt& aPoolMap, CPsData& aData) +void CPcsCache::AddToPoolL(TUint64& aPoolMap, CPsData& aData) { // Temp hash to remember the location of pool elements // First TInt = Pool @@ -232,68 +167,43 @@ // Required for memory optimization so that more than one pool // element doesn't get added for the same data RHashMap elementHash; + CleanupClosePushL( elementHash ); TLinearOrder rule(CPcsPoolElement::CompareByData); - // Parse thru each data element - for (int dataIndex = 0; dataIndex < aData.DataElementCount(); dataIndex++) + // Parse thru each data element + const TInt dataElementCount = aData.DataElementCount(); + for (TInt dataIndex = 0; dataIndex < dataElementCount; dataIndex++) { // Stores first key for each word - RArray firstKey; + RArray firstCharArr; + CleanupClosePushL( firstCharArr ); // Recover the first character - if (aData.Data(dataIndex) && aData.Data(dataIndex)->Length() != 0) + if ( aData.Data(dataIndex) ) { - // Split the data into words - CWords* words = CWords::NewLC(*aData.Data(dataIndex)); + GetFirstCharsForDataL( *aData.Data(dataIndex), firstCharArr ); + } + + // Get the corresponding Pool IDs + RArray poolIdArr; + CleanupClosePushL( poolIdArr ); + GetPoolIdsForCharsL( firstCharArr, poolIdArr ); - // Store the first numeric key for each word - for (int i = 0; i < words->MdcaCount(); i++) - { - TChar firstChar; - for (int j = 0; j < words->MdcaPoint(i).Length(); j++) - { - firstChar = (words->MdcaPoint(i))[j]; - TBuf<20> word; - word.Append(firstChar); - if (iAlgorithm->FindUtilECE()->IsChineseWord(word)) - { - RPointerArray spellList; - if (iAlgorithm->FindUtilECE()->T9ChineseTranslationL(firstChar, spellList)) - { - for (int j = 0; j < spellList.Count(); j++) - { - firstKey.Append(keyMap->KeyForCharacter(*(spellList[j]->Ptr()))); - } - } - else - { - firstKey.Append( keyMap->KeyForCharacter(firstChar)); - } - spellList.ResetAndDestroy(); - } - else - { - firstKey.Append(keyMap->KeyForCharacter(firstChar)); - } - } - } - - CleanupStack::PopAndDestroy(words); - } - - for (TInt wordIndex = 0; wordIndex < firstKey.Count(); wordIndex++) + const TInt poolIdArrCount = poolIdArr.Count(); + for (TInt poolArrIndex = 0; poolArrIndex < poolIdArrCount ; poolArrIndex++) { - TInt arrayIndex = keyMap->PoolIdForCharacter(firstKey[wordIndex]); + + TInt poolId = poolIdArr[poolArrIndex]; CPcsPoolElement* element = NULL; // Check if an element already exists in the pool for this data TInt* loc = NULL; - loc = elementHash.Find(arrayIndex); + loc = elementHash.Find(poolId); if (loc != NULL) { // Exists. Then recover ... - RPointerArray tmpKeyMap = *(keyArr[arrayIndex]); + RPointerArray tmpKeyMap = *(iKeyArr[poolId]); element = tmpKeyMap[*loc]; } @@ -304,30 +214,31 @@ element->SetDataMatch(dataIndex); // Insert to pool - keyArr[arrayIndex]->InsertInOrderAllowRepeatsL(element, rule); - TInt index = keyArr[arrayIndex]->FindInOrderL(element, rule); + iKeyArr[poolId]->InsertInOrderAllowRepeatsL(element, rule); + TInt index = iKeyArr[poolId]->FindInOrderL(element, rule); - // Set the bit for this pool - SetPoolMap(aPoolMap, arrayIndex); + // Set the bit for this pool + SetPoolMap(aPoolMap, poolId); // Store the array index in the temp hash - elementHash.InsertL(arrayIndex, index); + elementHash.InsertL(poolId, index); } else // Pool element exists. Just alter the data match attribute { element->SetDataMatch(dataIndex); - // Set the bit for this pool - SetPoolMap(aPoolMap, arrayIndex); + // Set the bit for this pool + SetPoolMap(aPoolMap, poolId); } } // for 2 loop - firstKey.Reset(); + CleanupStack::PopAndDestroy( &poolIdArr ); // Close + CleanupStack::PopAndDestroy( &firstCharArr ); // Close } // for 1 loop - elementHash.Close(); + CleanupStack::PopAndDestroy( &elementHash ); // Close } // --------------------------------------------------------------------- @@ -337,19 +248,19 @@ void CPcsCache::AddToCacheL(CPsData& aData) { // Protect against duplicate items getting added - if (cacheInfo.Find(aData.Id()) != NULL) + if (iCacheInfo.Find(aData.Id()) != NULL) { return; } // Include this element in the pool - TInt poolMap = 0; + TUint64 poolMap = 0; AddToPoolL(poolMap, aData); - cacheInfo.InsertL(aData.Id(), poolMap); + iCacheInfo.InsertL(aData.Id(), poolMap); // Include this element in master pool TLinearOrder rule(CPcsAlgorithm2Utils::CompareDataBySortOrder); - masterPool.InsertInOrderAllowRepeatsL(&aData, rule); + iMasterPool.InsertInOrderAllowRepeatsL(&aData, rule); } // --------------------------------------------------------------------- @@ -360,7 +271,7 @@ { CPsData *data = NULL; - TInt* poolMap = cacheInfo.Find(aItemId); + TUint64* poolMap = iCacheInfo.Find(aItemId); if (poolMap == NULL) { @@ -368,7 +279,8 @@ } // Remove this element from pools - for (int keyIndex = 0; keyIndex <= keyArr.Count(); keyIndex++) + const TInt keyArrCount = iKeyArr.Count(); + for (TInt keyIndex = 0; keyIndex < keyArrCount; keyIndex++) { TBool present = GetPoolMap(*poolMap, keyIndex); @@ -377,8 +289,9 @@ continue; } - RPointerArray tmpKeyMap = *(keyArr[keyIndex]); - for (int arrayIndex = 0; arrayIndex < tmpKeyMap.Count(); arrayIndex++) + const RPointerArray& tmpKeyMap = *(iKeyArr[keyIndex]); + + for (TInt arrayIndex = 0; arrayIndex < tmpKeyMap.Count(); arrayIndex++) { CPcsPoolElement *element = tmpKeyMap[arrayIndex]; TInt id = element->GetPsData()->Id(); @@ -386,19 +299,19 @@ { data = element->GetPsData(); delete element; - keyArr[keyIndex]->Remove(arrayIndex); + iKeyArr[keyIndex]->Remove(arrayIndex); } } } // Remove this element from master pool - for (int arrayIndex = 0; arrayIndex < masterPool.Count(); arrayIndex++) + for (TInt arrayIndex = 0; arrayIndex < iMasterPool.Count(); arrayIndex++) { - CPsData *dataElement = masterPool[arrayIndex]; + CPsData *dataElement = iMasterPool[arrayIndex]; TInt id = dataElement->Id(); if (id == aItemId) { - masterPool.Remove(arrayIndex); + iMasterPool.Remove(arrayIndex); } } @@ -410,51 +323,178 @@ } // Clear up cache information - cacheInfo.Remove(aItemId); + iCacheInfo.Remove(aItemId); } // --------------------------------------------------------------------- // CPcsCache::RemoveAllFromCacheL // // --------------------------------------------------------------------- -void CPcsCache::RemoveAllFromCacheL() +void CPcsCache::RemoveAllFromCache() { - PRINT ( _L("Enter CPcsCache::RemoveAllFromCacheL") ); + PRINT ( _L("Enter CPcsCache::RemoveAllFromCache") ); - for (TInt i = 0; i < keyArr.Count(); i++) + const TInt keyArrCount = iKeyArr.Count(); + for ( TInt i = 0 ; i < keyArrCount ; i++ ) { - keyArr[i]->ResetAndDestroy(); - + iKeyArr[i]->ResetAndDestroy(); } - masterPool.ResetAndDestroy(); - cacheInfo.Close(); + iMasterPool.ResetAndDestroy(); + iCacheInfo.Close(); - PRINT ( _L("End CPcsCache::RemoveAllFromCacheL") ); + PRINT ( _L("End CPcsCache::RemoveAllFromCache") ); } // --------------------------------------------------------------------- // CPcsCache::SetPoolMap // // --------------------------------------------------------------------- -void CPcsCache::SetPoolMap(TInt& aPoolMap, TInt arrayIndex) +void CPcsCache::SetPoolMap(TUint64& aPoolMap, TInt aArrayIndex) { - TReal val; - Math::Pow(val, 2, arrayIndex); + __ASSERT_DEBUG( aArrayIndex < 64, User::Panic(_L("CPcsCache"), KErrOverflow ) ); - aPoolMap |= (TInt) val; + /* Some platforms do not support 64 bits shift operations. + * Split to two 32 bits operations. + */ + + TUint32 poolMapH = I64HIGH(aPoolMap); + TUint32 poolMapL = I64LOW(aPoolMap); + + TUint32 valH = 0; + TUint32 valL = 0; + if (aArrayIndex < 32) + { + valL = 1 << aArrayIndex; + } + else + { + valH = 1 << (aArrayIndex-32); + } + + poolMapH |= valH; + poolMapL |= valL; + + aPoolMap = MAKE_TUINT64(poolMapH, poolMapL); } // --------------------------------------------------------------------- // CPcsCache::GetPoolMap // // --------------------------------------------------------------------- -TBool CPcsCache::GetPoolMap(TInt& aPoolMap, TInt arrayIndex) +TBool CPcsCache::GetPoolMap(TUint64& aPoolMap, TInt aArrayIndex) + { + __ASSERT_DEBUG( aArrayIndex < 64, User::Panic(_L("CPcsCache"), KErrOverflow ) ); + + /* Some platforms do not support 64 bits shift operations. + * Split to two 32 bits operations. + */ + + TUint32 poolMapH = I64HIGH(aPoolMap); + TUint32 poolMapL = I64LOW(aPoolMap); + + TUint32 valH = 0; + TUint32 valL = 0; + if (aArrayIndex < 32) + { + valL = 1 << aArrayIndex; + } + else + { + valH = 1 << (aArrayIndex-32); + } + + TBool ret = (poolMapH & valH) || (poolMapL & valL); + + return (ret); + } + +// --------------------------------------------------------------------- +// CPcsCache::GetFirstCharsForDataL +// +// --------------------------------------------------------------------- +void CPcsCache::GetFirstCharsForDataL( const TDesC& aData, RArray& aFirstChars ) const { - TReal val; - Math::Pow(val, 2, arrayIndex); + // Split the data into words + CWords* words = CWords::NewLC(aData); - return (aPoolMap & (TInt) val); + // Find indexing characters for each word + for (TInt i = 0; i < words->MdcaCount(); i++) + { + TPtrC16 word = words->MdcaPoint(i); + TBool lastCharIsChinese = EFalse; + + // If the word contains any Chinese characters, then it is + // stored to cache according all the available spellings of + // all the Chinese characters + if ( iAlgorithm->FindUtilECE()->IsChineseWordIncluded(word) ) + { + const TInt wordLength = word.Length(); + for (TInt j = 0; j < wordLength; j++) + { + TText curChar = word[j]; + RPointerArray spellList; + CleanupResetAndDestroyPushL( spellList ); + if ( iAlgorithm->FindUtilECE()->DoTranslationL(curChar, spellList) ) + { + lastCharIsChinese = ETrue; + // Append first char of each spelling + const TInt spellListCount = spellList.Count(); + for (TInt k = 0; k < spellListCount; k++) + { + const HBufC* spelling = spellList[k]; + aFirstChars.AppendL( (*spelling)[0] ); + } + } + else + { + if ( lastCharIsChinese ) + { + aFirstChars.AppendL( word[j] ); + lastCharIsChinese = EFalse; + } + } + CleanupStack::PopAndDestroy( &spellList ); // ResetAndDestroy + } + } + + // If the first charcter of the word is non-Chinese, then it's stored to the + // cache according this first character. Other characters of the word may or + // may not be Chinese. + if ( !iAlgorithm->FindUtilECE()->IsChineseWordIncluded( word.Left(1) ) ) + { + aFirstChars.AppendL( word[0] ); + } + } + CleanupStack::PopAndDestroy(words); + } + +// --------------------------------------------------------------------- +// CPcsCache::GetPoolIdsForCharsL +// +// --------------------------------------------------------------------- +void CPcsCache::GetPoolIdsForCharsL( const RArray& aChars, RArray& aPoolIds ) const + { + // There can potentially be two pool IDs for each character. + // Reserve memory for this upfront to prevent unnecessary reallocations. + aPoolIds.ReserveL( aChars.Count() * 2 ); + + const TInt charsCount = aChars.Count() ; + for ( TInt i = 0 ; i < charsCount ; ++i ) + { + TChar character = aChars[i]; + TInt itutPoolId = iKeyMap->PoolIdForCharacter( character, EPredictiveItuT ); + if ( itutPoolId != KErrNotFound ) + { + aPoolIds.AppendL( itutPoolId ); + } + + TInt qwertyPoolId = iKeyMap->PoolIdForCharacter( character, EPredictiveQwerty ); + if ( qwertyPoolId != KErrNotFound ) + { + aPoolIds.AppendL( qwertyPoolId ); + } + } } // --------------------------------------------------------------------- @@ -472,7 +512,8 @@ // --------------------------------------------------------------------- void CPcsCache::SetDataFields(RArray& aDataFields) { - for (TInt i(0); i < aDataFields.Count(); i++) + const TInt dataFieldsCount = aDataFields.Count(); + for (TInt i(0); i < dataFieldsCount; i++) { iDataFields.Append(aDataFields[i]); } @@ -484,7 +525,8 @@ // --------------------------------------------------------------------- void CPcsCache::GetDataFields(RArray& aDataFields) { - for (TInt i(0); i < iDataFields.Count(); i++) + const TInt dataFieldsCount = iDataFields.Count(); + for (TInt i(0); i < dataFieldsCount; i++) { aDataFields.Append(iDataFields[i]); } @@ -535,8 +577,8 @@ PRINT ( _L("Enter CPcsCache::SetSortOrder") ); iSortOrder.Reset(); - - for (TInt i(0); i < aSortOrder.Count(); i++) + const TInt sortOrderCount = aSortOrder.Count(); + for (TInt i(0); i < sortOrderCount; i++) { iSortOrder.Append(aSortOrder[i]); } @@ -553,8 +595,8 @@ void CPcsCache::GetSortOrder(RArray& aSortOrder) { aSortOrder.Reset(); - - for (TInt i(0); i < iSortOrder.Count(); i++) + const TInt sortOrderCount = iSortOrder.Count(); + for (TInt i(0); i < sortOrderCount; i++) { aSortOrder.Append(iSortOrder[i]); } @@ -567,8 +609,8 @@ void CPcsCache::GetIndexOrder(RArray& aIndexOrder) { aIndexOrder.Reset(); - - for (TInt i(0); i < iIndexOrder.Count(); i++) + const TInt indexOrderCount = iIndexOrder.Count(); + for (TInt i(0); i < indexOrderCount; i++) { aIndexOrder.Append(iIndexOrder[i]); } @@ -582,9 +624,11 @@ { iIndexOrder.Reset(); - for (int i = 0; i < iSortOrder.Count(); i++) + const TInt sortOrderCount = iSortOrder.Count(); + const TInt dataFieldsCount = iDataFields.Count(); + for (TInt i = 0; i < sortOrderCount; i++) { - for (int j = 0; j < iDataFields.Count(); j++) + for (TInt j = 0; j ResetAndDestroy(); + iKeyArr[i]->ResetAndDestroy(); } - masterPool.Reset(); - cacheInfo.Close(); - //now add data again from the masterPoolBackup - for (TInt i = 0; i < masterPoolBackup.Count(); i++ ) + iMasterPool.Reset(); + iCacheInfo.Close(); + //now add data again from the iMasterPoolBackup + const TInt masterPoolBackupCount = iMasterPoolBackup.Count(); + for (TInt i = 0; i < masterPoolBackupCount; i++ ) { - CPsData* temp = static_cast(masterPoolBackup[i]); + CPsData* temp = iMasterPoolBackup[i]; AddToCacheL( *temp ); } - masterPoolBackup.Reset(); - } + iMasterPoolBackup.Reset(); + } + +// --------------------------------------------------------------------- +// CPcsCache::GetFirstNameIndex +// +// --------------------------------------------------------------------- +TInt CPcsCache::GetFirstNameIndex() const + { + TInt fnIndex = KErrNotFound; + const TInt dataFieldsCount = iDataFields.Count(); + for ( TInt i = 0 ; i < dataFieldsCount && fnIndex == KErrNotFound ; ++i ) + { + if ( iDataFields[i] == R_VPBK_FIELD_TYPE_FIRSTNAME ) + { + fnIndex = i; + } + } + return fnIndex; + } + +// --------------------------------------------------------------------- +// CPcsCache::GetLastNameIndex +// +// --------------------------------------------------------------------- +TInt CPcsCache::GetLastNameIndex() const + { + TInt lnIndex = KErrNotFound; + const TInt dataFieldsCount = iDataFields.Count(); + for ( TInt i = 0 ; i < dataFieldsCount && lnIndex == KErrNotFound ; ++i ) + { + if ( iDataFields[i] == R_VPBK_FIELD_TYPE_LASTNAME ) + { + lnIndex = i; + } + } + return lnIndex; + } + // End of file diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsKeyMap.cpp --- a/predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsKeyMap.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsKeyMap.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -23,9 +23,37 @@ #include "FindUtilChineseECE.h" #include "CPcsDebug.h" #include "CPcsKeyMap.h" +#include "CPsQueryItem.h" +#include +#include #include #include + +// Unnamed namespace for local definitions +namespace { + +#ifdef _DEBUG + enum TPanicCode + { + EPanicPreCond_MultipleSingleCharMatching = 1, + EPanicPreCond_MultipleUIPriorityMatching = 2, + EPanicPreCond_MultipleEnglishPriorityMatching = 3, + EPanicPreCond_MultipleOthersPriorityMatching = 4, + EPanic_OverflowInPoolIndex = 5, + EPanic_InvalidKeyboardType = 6 + }; + + void Panic(TInt aReason) + { + _LIT(KPanicText, "CPcsKeyMap"); + User::Panic(KPanicText, aReason); + } +#endif // DEBUG + +} // namespace + + // ============================== MEMBER FUNCTIONS ============================ // ---------------------------------------------------------------------------- @@ -61,11 +89,14 @@ void CPcsKeyMap::ConstructL(CPcsAlgorithm2* aAlgorithm) { iLanguageNotSupported.Append(ELangJapanese); + iLanguageNotSupported.Append(ELangKorean); iAlgorithm = aAlgorithm; iPtiEngine = CPtiEngine::NewL(); - + + SetupKeyboardTypesL(); ConstructKeymapL(); + SetSpaceAndZeroOnSameKey(); } // ---------------------------------------------------------------------------- @@ -74,17 +105,18 @@ // ---------------------------------------------------------------------------- void CPcsKeyMap::ReconstructKeymapL() { - TLanguage lang = iAlgorithm->FindUtilECE()->CurrentInputLanguage(); - if (lang == ELangPrcChinese || !IsLanguageSupportedL(lang)) - lang = ELangEnglish; - - TInt keyboardType = CurrentKeyBoardTypeL(); - // Clear the keymap data array first when reconstruct the keymap. ResetKeyMap(); - // Add new keymap to the keymap data array according the current writing language. - AddKeyMapforConcreteKeyboardL( keyboardType, lang ); + // Always add English mappings first + AddKeyMapforConcreteKeyboardL( ELangEnglish ); + + // Then append the mappings of the current input language + TLanguage lang = iAlgorithm->FindUtilECE()->CurrentInputLanguage(); + if ( lang != ELangEnglish && IsLanguageSupportedL(lang) ) + { + AddKeyMapforConcreteKeyboardL( lang ); + } } // ---------------------------------------------------------------------------- @@ -93,106 +125,107 @@ // ---------------------------------------------------------------------------- void CPcsKeyMap::ConstructKeymapL() { + ConstructConcreteKeyMapL(); + + // Always add English mappings first + AddKeyMapforConcreteKeyboardL( ELangEnglish ); + + // Then append the mappings of the current input language TLanguage lang = iAlgorithm->FindUtilECE()->CurrentInputLanguage(); - if (lang == ELangPrcChinese || !IsLanguageSupportedL(lang)) - lang = ELangEnglish; - - TInt keyboardType = CurrentKeyBoardTypeL(); - - ConstructConcreteKeyMapL( keyboardType, lang ); + if ( lang != ELangEnglish && IsLanguageSupportedL(lang) ) + { + AddKeyMapforConcreteKeyboardL( lang ); + } PRINT ( _L("----------------------------------------")); - } // ---------------------------------------------------------------------------- -// CPcsKeyMap::CurrentKeyBoardTypeL -// +// CPcsKeyMap::SetupKeyboardTypesL +// Initialise the keyboard type variables // ---------------------------------------------------------------------------- -TInt CPcsKeyMap::CurrentKeyBoardTypeL() +void CPcsKeyMap::SetupKeyboardTypesL() { - TInt keyBoardType = EPtiKeyboardNone; - -#ifdef RD_INTELLIGENT_TEXT_INPUT - TInt physicalKeyboard = 0; CRepository* aknFepRepository = CRepository::NewL( KCRUidAknFep ); - // Get all the physical keyboards which are connected to the phone currently. aknFepRepository->Get( KAknFepPhysicalKeyboards, physicalKeyboard ); delete aknFepRepository; - - - PRINT1 ( _L("CPcsKeyMap::CurrentKeyBoardTypeL: Physical keyboard support flag = 0x%02X"), physicalKeyboard ); + + PRINT1 ( _L("CPcsKeyMap::ConstructL: Physical keyboard support flag = 0x%02X"), physicalKeyboard ); // Constants follow the definition of KAknFepPhysicalKeyboards - const TInt ptiKeyboard12Key = 0x01; // Default - // const TInt ptiKeyboardQwerty4x12 = 0x02; // Not used at the moment - const TInt ptiKeyboardQwerty4x10 = 0x04; - // const TInt ptiKeyboardQwerty3x11 = 0x08; // Not used at the moment - const TInt ptiKeyboardHalfQwerty = 0x10; - // const TInt ptiKeyboardCustomQwerty = 0x20; // Not used at the moment + const TInt KPtiKeyboard12Key = 0x01; + const TInt KPtiKeyboardQwerty4x12 = 0x02; + const TInt KPtiKeyboardQwerty4x10 = 0x04; + const TInt KPtiKeyboardQwerty3x11 = 0x08; + const TInt KPtiKeyboardHalfQwerty = 0x10; + const TInt KPtiKeyboardCustomQwerty = 0x20; - // If there are more than 1 keyboards on HW, The priority from high to low for - // selecting keyboard is EPtiKeyboard12Key, EPtiKeyboardHalfQwerty, EPtiKeyboardQwerty4x10 - if ( physicalKeyboard & ptiKeyboard12Key ) + // Setup ITU-T mode first. + // Use always 12-key mode since all the supported devices should have at least + // virtual ITU-T available. + iItutKeyboardType = EPtiKeyboard12Key; + // TODO: ITU-T type could be set to "none" if device does not have either + // virtual keypad or hardware ITU-T available. This could be decided according + // some cenrep value, feature flag, device model, or platform version. + + // Then setup QWERTY mode. On real-life devices there should never + // be more than one QWERTY keyboard available but on emulator there can be several. + // Use the first one found in the following precedence + if ( physicalKeyboard & KPtiKeyboardQwerty3x11 ) { - keyBoardType = EPtiKeyboard12Key; + iQwertyKeyboardType = EPtiKeyboardQwerty3x11; } - else if ( physicalKeyboard & ptiKeyboardHalfQwerty ) + else if ( physicalKeyboard & KPtiKeyboardQwerty4x10 ) { - keyBoardType = EPtiKeyboardHalfQwerty; + iQwertyKeyboardType = EPtiKeyboardQwerty4x10; + } + else if ( physicalKeyboard & KPtiKeyboardQwerty4x12 ) + { + iQwertyKeyboardType = EPtiKeyboardQwerty4x12; } - else if ( physicalKeyboard & ptiKeyboardQwerty4x10 ) + else if ( physicalKeyboard & KPtiKeyboardCustomQwerty ) { - keyBoardType = EPtiKeyboardQwerty4x10; + iQwertyKeyboardType = EPtiKeyboardCustomQwerty; + } + else if ( physicalKeyboard & KPtiKeyboardHalfQwerty ) + { + iQwertyKeyboardType = EPtiKeyboardHalfQwerty; } else -#endif { - keyBoardType = EPtiKeyboard12Key; + iQwertyKeyboardType = EPtiKeyboardNone; } - return keyBoardType; + + // Decide, which keyboard is used for the "default" matching mode. + // If there is physical ITU-T available, or there's no physical QWERTY, + // then ITU-T is default. + iItutIsDefault = (physicalKeyboard & KPtiKeyboard12Key) || + (iQwertyKeyboardType == EPtiKeyboardNone); + + PRINT1 ( _L("CPcsKeyMap::ConstructL: ITU-T Keyboard chosen for Predictive Search = %d"), iItutKeyboardType ); + PRINT1 ( _L("CPcsKeyMap::ConstructL: QWERTY Keyboard chosen for Predictive Search = %d"), iQwertyKeyboardType ); } + // ---------------------------------------------------------------------------- // CPcsKeyMap::ConstructConcreteKeyMapL // // ---------------------------------------------------------------------------- -void CPcsKeyMap::ConstructConcreteKeyMapL( TInt aKeyboardType, TLanguage aLanguage ) +void CPcsKeyMap::ConstructConcreteKeyMapL() { - switch ( aKeyboardType ) + if ( iItutKeyboardType != EPtiKeyboardNone ) { - case EPtiKeyboard12Key: - { - // Construct for Itut keyboard by default - PRINT ( _L("CPcsKeyMap::ConstructConcreteKeyMapL: Construct keymap for ContructForItutKeyboardL")); - - ContructForItutKeyboardL( aLanguage ); - break; - } - case EPtiKeyboardHalfQwerty: - { - // Construct for Half Qwerty keyboard - PRINT ( _L("CPcsKeyMap::ConstructConcreteKeyMapL: Construct keymap for ContructForHalfQwertyKeyboardL")); - - ContructForHalfQwertyKeyboardL( aLanguage ); - break; - } - case EPtiKeyboardQwerty4x10: - { - // Construct for 4x10 Qwerty keyboard - PRINT ( _L("CPcsKeyMap::ConstructConcreteKeyMapL: Construct keymap for ContructFor4x10QwertyKeyboardL")); - - ContructFor4x10QwertyKeyboardL( aLanguage ); - break; - } - default: - { - // Construct for Itut keyboard - PRINT ( _L("CPcsKeyMap::ConstructConcreteKeyMapL: Construct keymap for ContructForItutKeyboardL")); - - ContructForItutKeyboardL( aLanguage ); - } + // Construct for Itut keyboard by default + PRINT ( _L("CPcsKeyMap::ConstructConcreteKeyMapL: Construct keymap for ITU-T")); + ConstructForItutKeyboardL(); + } + if ( iQwertyKeyboardType != EPtiKeyboardNone ) + { + // Construct for any QWERTY keyboard + PRINT1 ( _L("CPcsKeyMap::ConstructConcreteKeyMapL: Construct keymap for QWERTY keyboard type %d"), + iQwertyKeyboardType ); + ConstructForQwertyKeyboardL( iQwertyKeyboardType ); } } @@ -200,49 +233,16 @@ // CPcsKeyMap::AddKeyMapforConcreteKeyboardL // // ---------------------------------------------------------------------------- -void CPcsKeyMap::AddKeyMapforConcreteKeyboardL( TInt aKeyboardType, TLanguage aLanguage ) +void CPcsKeyMap::AddKeyMapforConcreteKeyboardL( TLanguage aLanguage ) { - // If it's TW or HK variant, the key map for English also needs add to current key map. - TBool needAddEnglishKeyMap = ( aLanguage == ELangTaiwanChinese || aLanguage == ELangHongKongChinese ); - - // Add the keymap for current writing language. - switch ( aKeyboardType ) + if ( iItutKeyboardType != EPtiKeyboardNone ) { - case EPtiKeyboard12Key: - { - AddKeyMapforItutL( aLanguage ); - if ( needAddEnglishKeyMap ) - { - AddKeyMapforItutL( ELangEnglish ); - } - break; - } - case EPtiKeyboardHalfQwerty: - { - AddKeyMapforHalfQwertyKeyboardL( aLanguage ); - if ( needAddEnglishKeyMap ) - { - AddKeyMapforHalfQwertyKeyboardL( ELangEnglish ); - } - break; - } - case EPtiKeyboardQwerty4x10: - { - AddKeyMapfor4x10QwertyKeyboardL( aLanguage ); - if ( needAddEnglishKeyMap ) - { - AddKeyMapfor4x10QwertyKeyboardL( ELangEnglish ); - } - break; - } - default: - { - AddKeyMapforItutL( aLanguage ); - if ( needAddEnglishKeyMap ) - { - AddKeyMapforItutL( ELangEnglish ); - } - } + AddKeyMapforItutL( aLanguage ); + } + + if ( iQwertyKeyboardType != EPtiKeyboardNone ) + { + AddKeyMapForQwertyKeyboardL( aLanguage, iQwertyKeyboardType ); } } @@ -252,12 +252,18 @@ // ---------------------------------------------------------------------------- void CPcsKeyMap::ResetKeyMap() { - for (TInt i = 0; i < iAllKeyMappingsPtrArr.Count(); i++) + const TInt ItutKeyMappingsCount = iItutKeyMappings.Count(); + const TInt qwertyKeyMappingsCount = iQwertyKeyMappings.Count(); + for (TInt i = 0; i < ItutKeyMappingsCount; i++) { - iAllKeyMappingsPtrArr[i]->iKeyMappingArray.Close(); + iItutKeyMappings[i]->iKeyMappingArray.Reset(); } + for (TInt i = 0; i < qwertyKeyMappingsCount; i++) + { + iQwertyKeyMappings[i]->iKeyMappingArray.Reset(); + } + } - } // ---------------------------------------------------------------------------- // CPcsKeyMap::~CPcsKeyMap // Destructor @@ -268,137 +274,162 @@ // Cleanup local arrays iLanguageNotSupported.Reset(); - iAllKeyMappingsPtrArr.ResetAndDestroy(); - iKeysForPoolFormation.Close(); + iItutKeyMappings.ResetAndDestroy(); + iItutKeys.Close(); + iQwertyKeyMappings.ResetAndDestroy(); + iQwertyKeys.Close(); delete iPtiEngine; } // ---------------------------------------------------------------------------- -// CPcsKeyMap::GetNumericKeyStringL -// +// CPcsKeyMap::GetMixedKeyStringForQueryL +// aDestStr will have the length as the number of items in aSrcQuery. // ---------------------------------------------------------------------------- -void CPcsKeyMap::GetNumericKeyString(const TDesC& aSrcStr, TDes& aDestStr) - { - for (int i = 0; i < aSrcStr.Length(); i++) +void CPcsKeyMap::GetMixedKeyStringForQueryL( + CPsQuery& aSrcQuery, TDes& aDestStr) const +{ + PRINT ( _L("Enter CPcsKeyMap::GetMixedKeyStringForQueryL") ); + + GetMixedKeyStringForDataL( aSrcQuery, aSrcQuery.QueryAsStringLC(), aDestStr ); + CleanupStack::PopAndDestroy(); //result of QueryAsStringLC + + PRINT ( _L("End CPcsKeyMap::GetMixedKeyStringForQueryL") ); +} + +// ---------------------------------------------------------------------------- +// CPcsKeyMap::GetMixedKeyStringForDataL +// aDestStr will have the same length as aSrcData. aSrcQuery can be shorter. +// ---------------------------------------------------------------------------- +void CPcsKeyMap::GetMixedKeyStringForDataL( + CPsQuery& aSrcQuery, const TDesC& aSrcData, TDes& aDestStr) const +{ + PRINT ( _L("Enter CPcsKeyMap::GetMixedKeyStringForDataL") ); + + const TInt srcDataLength = aSrcData.Length(); + for ( TInt i = 0; i < srcDataLength; ++i ) { - TInt index = KeyForCharacter(aSrcStr[i]); - - // If a character is not mapped to numeric key append the character - if (index == -1) + TChar character( aSrcData[i] ); + character.LowerCase(); + if ( i < aSrcQuery.Count() ) { - aDestStr.Append(aSrcStr[i]); + CPsQueryItem& currentItem = aSrcQuery.GetItemAtL(i); + TKeyboardModes curMode = ResolveKeyboardMode( currentItem.Mode() ); + TPtiKey key = KeyForCharacter( aSrcData[i], curMode ); + // If a character is not mapped to any key or it's entered in non-predictive mode, + // then append the character as exact. + if ( EPtiKeyNone == key ) + { + aDestStr.Append( character ); + } + else + { + aDestStr.Append( DefaultCharForKey(key, curMode) ); + } } else { - aDestStr.Append(index); + // characters over query length are taken as exact + aDestStr.Append( character ); } } - } + + PRINT1 ( _L("CPcsKeyMap::GetMixedKeyStringForDataL: Return string: \"%S\""), + &aDestStr ); + + PRINT ( _L("End CPcsKeyMap::GetMixedKeyStringForDataL") ); +} // ---------------------------------------------------------------------------- // CPcsKeyMap::KeyForCharacter // // ---------------------------------------------------------------------------- -TInt CPcsKeyMap::KeyForCharacter(const TChar& aChar) +TPtiKey CPcsKeyMap::KeyForCharacter(TText aChar, TKeyboardModes aKbMode) const { + const RPointerArray* keyMappings = KeyMappings( aKbMode ); + + // Don't return any key in the exact mode + if ( !keyMappings ) + { + return EPtiKeyNone; + } + TInt index = KErrNotFound; - TChar lChar = User::LowerCase(aChar); + TText lChar = User::LowerCase(aChar); - TInt count = iAllKeyMappingsPtrArr.Count() - 1; + const TInt count = keyMappings->Count() - 1; for (TInt i = 0; i < count; i++) { - index = iAllKeyMappingsPtrArr[i]->iKeyMappingArray.Find(lChar); + index = (*keyMappings)[i]->iKeyMappingArray.Find(lChar); if (index != KErrNotFound) { - return (TInt) iAllKeyMappingsPtrArr[i]->key; + return (*keyMappings)[i]->iKey; } } - return index; + return EPtiKeyNone; } + // ---------------------------------------------------------------------------- -// CPcsKeyMap::ContructForHalfQwertyKeyboardL +// CPcsKeyMap::AddKeyMapForQwertyKeyboardL // // ---------------------------------------------------------------------------- -void CPcsKeyMap::ContructForHalfQwertyKeyboardL(TLanguage aLanguage) +void CPcsKeyMap::AddKeyMapForQwertyKeyboardL(TLanguage aLanguage, TPtiKeyboardType aKbType) { -#ifdef RD_INTELLIGENT_TEXT_INPUT - - iKeysForPoolFormation.Append(EPtiKeyQwertyQ); - iKeysForPoolFormation.Append(EPtiKeyQwertyE); - iKeysForPoolFormation.Append(EPtiKeyQwertyT); - iKeysForPoolFormation.Append(EPtiKeyQwertyU); - iKeysForPoolFormation.Append(EPtiKeyQwertyO); - iKeysForPoolFormation.Append(EPtiKeyQwertyA); - iKeysForPoolFormation.Append(EPtiKeyQwertyD); - iKeysForPoolFormation.Append(EPtiKeyQwertyG); - iKeysForPoolFormation.Append(EPtiKeyQwertyJ); - iKeysForPoolFormation.Append(EPtiKeyQwertyL); - iKeysForPoolFormation.Append(EPtiKeyQwertyZ); - iKeysForPoolFormation.Append(EPtiKeyQwertyC); - iKeysForPoolFormation.Append(EPtiKeyQwertyB); - iKeysForPoolFormation.Append(EPtiKeyQwertyM); - iKeysForPoolFormation.Append(EPtiKeyQwerty0); - // one additional pool for special characters not mapped too any keys. - // This should always be the last one in the arrary - iKeysForPoolFormation.Append(EPtiKeyNone); +#ifdef RD_INTELLIGENT_TEXT_INPUT + iPtiEngine->ActivateLanguageL(aLanguage); + iPtiEngine->SetKeyboardType(aKbType); - // Now add the keymap arrays to hold the keymap data - for (TInt i = 0; i < iKeysForPoolFormation.Count(); i++) - { - TKeyMappingData *keyData = new (ELeave) TKeyMappingData; - keyData->key = iKeysForPoolFormation[i]; - iAllKeyMappingsPtrArr.Append(keyData); - } - // Add the keymap for current language - AddKeyMapforHalfQwertyKeyboardL(aLanguage); - - // If it's TW or HK variant, add the keymap for English language - if (aLanguage == ELangTaiwanChinese || aLanguage == ELangHongKongChinese) - { - AddKeyMapforHalfQwertyKeyboardL(ELangEnglish); - } - - PRINT ( _L("----------------------------------------")); -#endif // RD_INTELLIGENT_TEXT_INPUT - } -// ---------------------------------------------------------------------------- -// CPcsKeyMap::AddKeyMapforHalfQwertyKeyboardL -// -// ---------------------------------------------------------------------------- -void CPcsKeyMap::AddKeyMapforHalfQwertyKeyboardL(TLanguage aLanguage) - { -#ifdef RD_INTELLIGENT_TEXT_INPUT // Make a language object based on current language - CPtiCoreLanguage* iCoreLanguage = static_cast(iPtiEngine->GetLanguage( aLanguage)); + CPtiCoreLanguage* coreLanguage = static_cast(iPtiEngine->GetLanguage( aLanguage )); //Perfrom the key mappings only if the corelanguage is available - if (iCoreLanguage) + if (coreLanguage) { // Get the keyboard mappings for the language - CPtiHalfQwertyKeyMappings* ptiKeyMappings = static_cast - (iCoreLanguage->GetHalfQwertyKeymappings()); + CPtiKeyMapData* ptiKeyMapData = coreLanguage->RawKeyMapData(); - iPtiEngine->ActivateLanguageL(aLanguage, EPtiEngineHalfQwerty); - iPtiEngine->SetKeyboardType(EPtiKeyboardHalfQwerty); - - for (TInt i = 0; i < iAllKeyMappingsPtrArr.Count() - 1; i++) + const TInt qwertyKeyMappingsCount = iQwertyKeyMappings.Count() - 1; + for (TInt i = 0; i < qwertyKeyMappingsCount; i++) { - AddDataForHalfQwertyKeyboardL( ptiKeyMappings, iKeysForPoolFormation[i], *(iAllKeyMappingsPtrArr[i])); + AddDataForQwertyKeyboardL( ptiKeyMapData, aKbType, + iQwertyKeys[i], *(iQwertyKeyMappings[i]) ); } } #endif // RD_INTELLIGENT_TEXT_INPUT } // ---------------------------------------------------------------------------- -// CPcsKeyMap::AddDataForHalfQwertyKeyboardL +// CPcsKeyMap::ConstructForQwertyKeyboardL +// Destructor +// ---------------------------------------------------------------------------- +void CPcsKeyMap::ConstructForQwertyKeyboardL(TPtiKeyboardType aKbType) + { +#ifdef RD_INTELLIGENT_TEXT_INPUT + CreateKeyListFromKeyBindingTable( iQwertyKeys, aKbType ); + + // Now add the keymap arrays to hold the keymap data + const TInt qwertyKeysCount = iQwertyKeys.Count(); + for (TInt i = 0; i < qwertyKeysCount; i++) + { + TKeyMappingData* keyData = new (ELeave) TKeyMappingData; + keyData->iKey = iQwertyKeys[i]; + iQwertyKeyMappings.Append(keyData); + } + + PRINT ( _L("----------------------------------------")); +#endif //RD_INTELLIGENT_TEXT_INPUT + } + +// ---------------------------------------------------------------------------- +// CPcsKeyMap::AddDataForQwertyKeyboardL // // ---------------------------------------------------------------------------- -void CPcsKeyMap::AddDataForHalfQwertyKeyboardL( CPtiHalfQwertyKeyMappings* aPtiKeyMappings, - TPtiKey aKey, - TKeyMappingData& aKeyDataList) +void CPcsKeyMap::AddDataForQwertyKeyboardL(CPtiKeyMapData* aPtiKeyMapData, + TPtiKeyboardType aKbType, + TPtiKey aKey, + TKeyMappingData& aKeyDataList) { #ifdef RD_INTELLIGENT_TEXT_INPUT TPtiTextCase caseArray[] = @@ -411,171 +442,15 @@ EPtiCaseChrUpper }; - TBuf<50> iResult; - for (int i = 0; i < sizeof(caseArray) / sizeof(TPtiTextCase); i++) + for (TInt i = 0; i < sizeof(caseArray) / sizeof(TPtiTextCase); i++) { - iResult.Zero(); - aPtiKeyMappings->GetDataForKey(aKey, iResult, caseArray[i]); - - for (int j = 0; j < iResult.Length(); j++) - aKeyDataList.iKeyMappingArray.Append(iResult[j]); - - PRINT2 ( _L("CPcsKeyMap: Mapping for Key %c = %S"), aKey,&iResult) - } -#endif // RD_INTELLIGENT_TEXT_INPUT - } - -// ---------------------------------------------------------------------------- -// CPcsKeyMap::ContructFor4x10QwertyKeyboardL -// Destructor -// ---------------------------------------------------------------------------- -void CPcsKeyMap::ContructFor4x10QwertyKeyboardL(TLanguage aLanguage) - { -#ifdef RD_INTELLIGENT_TEXT_INPUT -// The special 4x10 Qwerty keyboard for Sonja. - iKeysForPoolFormation.Append( EPtiKeyQwertyA ); - iKeysForPoolFormation.Append( EPtiKeyQwerty8 ); - iKeysForPoolFormation.Append( EPtiKeyQwertyC ); - iKeysForPoolFormation.Append( EPtiKeyQwertyD ); - iKeysForPoolFormation.Append( EPtiKeyQwertyE ); - iKeysForPoolFormation.Append( EPtiKeyQwerty4 ); - iKeysForPoolFormation.Append( EPtiKeyQwerty5 ); - iKeysForPoolFormation.Append( EPtiKeyQwerty6 ); - iKeysForPoolFormation.Append( EPtiKeyQwertyI ); - iKeysForPoolFormation.Append( EPtiKeyQwertyHash ); // Could have been EPtiKeyQwertyJ, EPtiKeyHash - iKeysForPoolFormation.Append( EPtiKeyQwertyK ); - iKeysForPoolFormation.Append( EPtiKeyQwertyL ); - iKeysForPoolFormation.Append( EPtiKeyQwerty0 ); - iKeysForPoolFormation.Append( EPtiKeyQwerty9 ); - iKeysForPoolFormation.Append( EPtiKeyQwertyO ); - iKeysForPoolFormation.Append( EPtiKeyQwertyP ); - iKeysForPoolFormation.Append( EPtiKeyQwertyQ ); - iKeysForPoolFormation.Append( EPtiKeyQwerty1 ); - iKeysForPoolFormation.Append( EPtiKeyQwertyS ); - iKeysForPoolFormation.Append( EPtiKeyQwerty2 ); - iKeysForPoolFormation.Append( EPtiKeyStar ); // Could have been EPtiKeyQwertyU - iKeysForPoolFormation.Append( EPtiKeyQwertyV ); // Could have been EPtiKeyQwerty7 - iKeysForPoolFormation.Append( EPtiKeyQwertyW ); - iKeysForPoolFormation.Append( EPtiKeyQwertyX ); - iKeysForPoolFormation.Append( EPtiKeyQwerty3 ); - iKeysForPoolFormation.Append( EPtiKeyQwertyZ ); - - // one additional pool for special characters not mapped too any keys. - // This should always be the last one in the arrary - iKeysForPoolFormation.Append(EPtiKeyNone); - - // Now add the keymap arrays to hold the keymap data - for (TInt i = 0; i < iKeysForPoolFormation.Count(); i++) - { - TKeyMappingData *keyData = new (ELeave) TKeyMappingData; - keyData->key = iKeysForPoolFormation[i]; - iAllKeyMappingsPtrArr.Append(keyData); - } - - // Add the keymap for current language - AddKeyMapfor4x10QwertyKeyboardL(aLanguage); - - // If it's TW or HK variant, add the keymap for English language - if (aLanguage == ELangTaiwanChinese || aLanguage == ELangHongKongChinese) - { - AddKeyMapfor4x10QwertyKeyboardL(ELangEnglish); - } - - PRINT ( _L("----------------------------------------")); -#endif //RD_INTELLIGENT_TEXT_INPUT - } + TPtrC result = aPtiKeyMapData->DataForKey(aKbType, aKey, caseArray[i]); -// ---------------------------------------------------------------------------- -// CPcsKeyMap::AddKeyMapfor4x10QwertyKeyboardL -// -// ---------------------------------------------------------------------------- -void CPcsKeyMap::AddKeyMapfor4x10QwertyKeyboardL(TLanguage aLanguage) - { -#ifdef RD_INTELLIGENT_TEXT_INPUT - // Make a language object based on current language - CPtiCoreLanguage* iCoreLanguage = static_cast(iPtiEngine->GetLanguage(aLanguage)); - - //Perfrom the key mappings only if the corelanguage is available - if (iCoreLanguage) - { - // Get the keyboard mappings for the language - CPtiQwertyKeyMappings* iPtiKeyMappings = static_cast - (iCoreLanguage->GetQwertyKeymappings()); - iPtiEngine->SetKeyboardType(EPtiKeyboardQwerty4x10); - - for (TInt i = 0; i < iAllKeyMappingsPtrArr.Count() - 1; i++) - { - AddDataFor4x10QwertyKeyboardL(iPtiKeyMappings, iKeysForPoolFormation[i], *(iAllKeyMappingsPtrArr[i])); - } - -#ifdef HACK_FOR_E72_J_KEY - AddDataFor4x10QwertyKeyboardE72HackL(); -#endif // HACK_FOR_E72_J_KEY - } -#endif //RD_INTELLIGENT_TEXT_INPUT - - } - -#ifdef HACK_FOR_E72_J_KEY -// ---------------------------------------------------------------------------- -// CPcsKeyMap::AddDataFor4x10QwertyKeyboardE72HackL -// -// Key code for J/# key in Sonja is EPtiKeyQwertyHash (127). -// No returned character code ('J', 'j', '#') has 127 as ASCII value. -// In this case we must add key to the list of characters for the pool. -// ---------------------------------------------------------------------------- -void CPcsKeyMap::AddDataFor4x10QwertyKeyboardE72HackL() - { -#ifdef RD_INTELLIGENT_TEXT_INPUT - PRINT ( _L("Enter CPcsKeyMap::AddDataFor4x10QwertyKeyboardE72HackL") ); + const TInt resultLength = result.Length(); + for (TInt j = 0; j < resultLength; j++) + aKeyDataList.iKeyMappingArray.Append(result[j]); - TPtiKey keyValue = (TPtiKey) EPtiKeyQwertyHash; - TInt keyIndex = iKeysForPoolFormation.Find(keyValue); - - PRINT3 ( _L("CPcsKeyMap: ===== At index %d appending key to list: '%c' (#%d) -Hack-for-E72-"), - keyIndex, (TInt) keyValue, (TInt) keyValue); - - if ( KErrNotFound != keyIndex ) - { - iAllKeyMappingsPtrArr[keyIndex]->iKeyMappingArray.Append(keyValue); - } - - PRINT ( _L("CPcsKeyMap: ===================================================") ); - - PRINT ( _L("End CPcsKeyMap::AddDataFor4x10QwertyKeyboardE72HackL") ); -#endif // RD_INTELLIGENT_TEXT_INPUT - } -#endif // HACK_FOR_E72_J_KEY - -// ---------------------------------------------------------------------------- -// CPcsKeyMap::AddDataFor4x10QwertyKeyboardL -// -// ---------------------------------------------------------------------------- -void CPcsKeyMap::AddDataFor4x10QwertyKeyboardL(CPtiQwertyKeyMappings* iPtiKeyMappings, - TPtiKey aKey, - TKeyMappingData& aKeyDataList) - { -#ifdef RD_INTELLIGENT_TEXT_INPUT - TPtiTextCase caseArray[] = - { - EPtiCaseUpper, - EPtiCaseLower, - EPtiCaseFnLower, - EPtiCaseFnUpper, - EPtiCaseChrLower, - EPtiCaseChrUpper - }; - - TBuf<50> iResult; - for (int i = 0; i < sizeof(caseArray) / sizeof(TPtiTextCase); i++) - { - iResult.Zero(); - iPtiKeyMappings->GetDataForKey(aKey, iResult, caseArray[i]); - - for (int j = 0; j < iResult.Length(); j++) - aKeyDataList.iKeyMappingArray.Append(iResult[j]); - - PRINT2 ( _L("CPcsKeyMap: Mapping for Key %c = %S"), aKey, &iResult) + PRINT2 ( _L("CPcsKeyMap: Mapping for Key %c = %S"), aKey, &result) } #endif //RD_INTELLIGENT_TEXT_INPUT } @@ -584,42 +459,33 @@ // CPcsKeyMap::ContructForItutKeyboardL // // ---------------------------------------------------------------------------- -void CPcsKeyMap::ContructForItutKeyboardL(TLanguage aLanguage) +void CPcsKeyMap::ConstructForItutKeyboardL() { // Add the keys for Pool formation - iKeysForPoolFormation.Append(EPtiKey0); - iKeysForPoolFormation.Append(EPtiKey1); - iKeysForPoolFormation.Append(EPtiKey2); - iKeysForPoolFormation.Append(EPtiKey3); - iKeysForPoolFormation.Append(EPtiKey4); - iKeysForPoolFormation.Append(EPtiKey5); - iKeysForPoolFormation.Append(EPtiKey6); - iKeysForPoolFormation.Append(EPtiKey7); - iKeysForPoolFormation.Append(EPtiKey8); - iKeysForPoolFormation.Append(EPtiKey9); + iItutKeys.Append(EPtiKey0); + iItutKeys.Append(EPtiKey1); + iItutKeys.Append(EPtiKey2); + iItutKeys.Append(EPtiKey3); + iItutKeys.Append(EPtiKey4); + iItutKeys.Append(EPtiKey5); + iItutKeys.Append(EPtiKey6); + iItutKeys.Append(EPtiKey7); + iItutKeys.Append(EPtiKey8); + iItutKeys.Append(EPtiKey9); // one additional pool for special characters not mapped too any keys. // This should always be the last one in the arrary - iKeysForPoolFormation.Append(EPtiKeyNone); + iItutKeys.Append(EPtiKeyNone); // Now add the keymap arrays to hold the keymap data - for (TInt i = 0; i < iKeysForPoolFormation.Count(); i++) + const TInt ltutKeysCount = iItutKeys.Count(); + for (TInt i = 0; i < ltutKeysCount; i++) { TKeyMappingData *keyData = new (ELeave) TKeyMappingData; - keyData->key = iKeysForPoolFormation[i]; - iAllKeyMappingsPtrArr.Append(keyData); - } - - // Add the keymap for current language - AddKeyMapforItutL(aLanguage); - - // If it's TW or HK variant, add the keymap for English language - if (aLanguage == ELangTaiwanChinese || aLanguage == ELangHongKongChinese) - { - AddKeyMapforItutL(ELangEnglish); + keyData->iKey = iItutKeys[i]; + iItutKeyMappings.Append(keyData); } PRINT ( _L("----------------------------------------")); - } // ---------------------------------------------------------------------------- @@ -628,29 +494,31 @@ // ---------------------------------------------------------------------------- void CPcsKeyMap::AddKeyMapforItutL(TLanguage aLanguage) { - // Make a language object based on current language - CPtiCoreLanguage* iCoreLanguage = static_cast (iPtiEngine->GetLanguage(aLanguage)); + // Activate given language and get corresponding language object + iPtiEngine->ActivateLanguageL(aLanguage); + CPtiCoreLanguage* coreLanguage = static_cast (iPtiEngine->GetLanguage(aLanguage)); //Perfrom the key mappings only if the corelanguage is available - if (iCoreLanguage) + if (coreLanguage) { // Get the keyboard mappings for the language - CPtiKeyMappings* iPtiKeyMappings = static_cast - (iCoreLanguage->GetKeymappings()); + CPtiKeyMapData* ptiKeyMapData = coreLanguage->RawKeyMapData(); - for (TInt i = 0; i < iAllKeyMappingsPtrArr.Count() - 1; i++) + const TInt ltutKeyMappingsCount = iItutKeyMappings.Count() - 1; + for (TInt i = 0; i < ltutKeyMappingsCount; i++) { - AddDataForItutKeyboardL(iPtiKeyMappings, iKeysForPoolFormation[i], *(iAllKeyMappingsPtrArr[i])); + AddDataForItutKeyboardL(ptiKeyMapData, iItutKeys[i], *(iItutKeyMappings[i])); } } - if (iAlgorithm->FindUtilECE()->CurrentInputLanguage() == ELangHongKongChinese) + if ( (aLanguage == ELangPrcChinese || aLanguage == ELangTaiwanChinese || aLanguage == ELangHongKongChinese) && + (iAlgorithm->FindUtilECE()->CurrentSearchMethod() == EAdptSearchStroke) ) { - (*(iAllKeyMappingsPtrArr[1])).iKeyMappingArray.Append(0x4E00); //heng - (*(iAllKeyMappingsPtrArr[2])).iKeyMappingArray.Append(0x4E28); //shu - (*(iAllKeyMappingsPtrArr[3])).iKeyMappingArray.Append(0x4E3F); //pie - (*(iAllKeyMappingsPtrArr[4])).iKeyMappingArray.Append(0x4E36); //dian - (*(iAllKeyMappingsPtrArr[5])).iKeyMappingArray.Append(0x4E5B); //zhe + (*(iItutKeyMappings[1])).iKeyMappingArray.Append(0x4E00); //heng + (*(iItutKeyMappings[2])).iKeyMappingArray.Append(0x4E28); //shu + (*(iItutKeyMappings[3])).iKeyMappingArray.Append(0x4E3F); //pie + (*(iItutKeyMappings[4])).iKeyMappingArray.Append(0x4E36); //dian + (*(iItutKeyMappings[5])).iKeyMappingArray.Append(0x4E5B); //zhe } } @@ -658,18 +526,80 @@ // CPcsKeyMap::AddDataForItutKeyboardL // // ---------------------------------------------------------------------------- -void CPcsKeyMap::AddDataForItutKeyboardL(CPtiKeyMappings* iPtiKeyMappings, TPtiKey aKey, TKeyMappingData& aKeyDataList) +void CPcsKeyMap::AddDataForItutKeyboardL(CPtiKeyMapData* aPtiKeyMapData, TPtiKey aKey, TKeyMappingData& aKeyDataList) { TPtiTextCase caseArray[] = { EPtiCaseUpper, EPtiCaseLower }; - TBuf<50> iResult; - for (int i = 0; i< sizeof(caseArray) / sizeof(TPtiTextCase); i++) + for (TInt i = 0; i< sizeof(caseArray) / sizeof(TPtiTextCase); i++) + { + TPtrC result = aPtiKeyMapData->DataForKey(EPtiKeyboard12Key, aKey, caseArray[i]); + const TInt resultLength = result.Length(); + for (TInt j = 0; j < resultLength; j++) + aKeyDataList.iKeyMappingArray.Append(result[j]); + PRINT2 ( _L("CPcsKeyMap: Mapping for Key %c = %S"), aKey,&result) + } + } + +// ---------------------------------------------------------------------------- +// CPcsKeyMap::CreateKeyMapFromKeyBindingTable +// +// ---------------------------------------------------------------------------- +void CPcsKeyMap::CreateKeyListFromKeyBindingTable( RArray& aKeyArray, + TPtiKeyboardType aKbType ) + { + PRINT ( _L("Enter CPcsKeyMap::CreateKeyListFromKeyBindingTable") ); + + // Use Eglish mappings to list the keys on the keyboard + TRAP_IGNORE( iPtiEngine->ActivateLanguageL( ELangEnglish ) ); + CPtiCoreLanguage* ptiLang = + static_cast(iPtiEngine->GetLanguage( ELangEnglish )); + + if (ptiLang) { - iResult.Zero(); - iPtiKeyMappings->GetDataForKey(aKey, iResult, caseArray[i]); - for (int j = 0; j < iResult.Length(); j++) - aKeyDataList.iKeyMappingArray.Append(iResult[j]); - PRINT2 ( _L("CPcsKeyMap: Mapping for Key %c = %S"), aKey,&iResult) + const CPtiKeyMapData* keyMapData = ptiLang->RawKeyMapData(); + const TPtiKeyBinding* table = NULL; + TInt numItems = 0; + if ( keyMapData ) + { + table = keyMapData->KeyBindingTable(aKbType, numItems); + } + else + { + PRINT( _L("CPcsKeyMap::CreateKeyListFromKeyBindingTable: #### Failed to get RawKeyMapData ####") ); + } + + PRINT1 ( _L("CPcsKeyMap::CreateKeyListFromKeyBindingTable: Num of Items in KeyBindingTable is %d"), numItems ); + + // Get from the key table the keys for constructing the pools + if (table) + { + for (TInt i = 0; i < numItems; i++) + { + TPtiKey key = (TPtiKey) table[i].iScanCode; + // Get all keys with same EPtiCaseLower or EPtiCaseUpper case + // Only for one of the casing to avoid repetitions + if ( (EPtiKeyNone != key) && (EPtiCaseLower == table[i].iCase) ) + { + PRINT3 ( _L("CPcsKeyMap::CreateKeyListFromKeyBindingTable: Adding pool %d with key '%c' (0x%02X)"), + aKeyArray.Count(), key, key ); + aKeyArray.Append( key ); + } + } + } + else + { + PRINT ( _L("CPcsKeyMap::CreateKeyListFromKeyBindingTable: ##### Failed to create Key List (KeyBindingTable) #####") ); + } } + else + { + PRINT ( _L("CPcsKeyMap::CreateKeyListFromKeyBindingTable: ##### Failed to create Key List (Language) #####") ); + } + + // one additional pool for special characters not mapped too any keys. + // This should always be the last one in the arrary + aKeyArray.Append(EPtiKeyNone); + + PRINT ( _L("End CPcsKeyMap::CreateKeyListFromKeyBindingTable") ); } // ---------------------------------------------------------------------------- @@ -680,7 +610,8 @@ { TBool flag = ETrue; - for (int i = 0; i < iLanguageNotSupported.Count(); i++) + const TInt languageNotSupportedCount = iLanguageNotSupported.Count(); + for (TInt i = 0; i < languageNotSupportedCount; i++) { if (iLanguageNotSupported[i] == aLang) { @@ -690,31 +621,131 @@ return flag; } + +// ---------------------------------------------------------------------------- +// CPcsKeyMap::PoolIdForKey +// +// ---------------------------------------------------------------------------- +TInt CPcsKeyMap::PoolIdForKey(TPtiKey aKey, TKeyboardModes aKbMode) const + { + __ASSERT_DEBUG( (aKbMode==EPredictiveItuT || aKbMode==EPredictiveQwerty), + Panic(EPanic_InvalidKeyboardType) ); + + // From logical point of view, the Pool ID is an index of the key in + // an array which is formed by concatenating QWERTY keys array in the end + // of the ITU-T keys array. + TInt poolId = KErrNotFound; + if ( aKbMode == EPredictiveItuT && iItutKeys.Count() ) + { + poolId = iItutKeys.Find(aKey); + // IF the key is not found, then it should go to the special pool, + // which is the pool of the dummy key in the ITU-T keys array + if (KErrNotFound == poolId) + { + poolId = iItutKeys.Count() - 1; + } + } + else if ( aKbMode == EPredictiveQwerty && iQwertyKeys.Count() ) + { + poolId = iQwertyKeys.Find(aKey); + // IF the key is not found, then it should go to the special pool, + // which is the pool of the dummy key in the QWERTY keys array + if (KErrNotFound == poolId) + { + poolId = iQwertyKeys.Count() - 1; + } + // Pools of QWERTY keys come after pools of ITU-T keys + poolId += iItutKeys.Count(); + } + + // Pool ID must never exceed value 63, because CPcsCache class + // stores these values as bitmask into 64 bit variable. + __ASSERT_DEBUG( poolId < 64, Panic(EPanic_OverflowInPoolIndex) ); + return poolId; + } + // ---------------------------------------------------------------------------- // CPcsKeyMap::PoolIdForCharacter // // ---------------------------------------------------------------------------- -TInt CPcsKeyMap::PoolIdForCharacter(TChar aChar) +TInt CPcsKeyMap::PoolIdForCharacter( TChar aChar, TKeyboardModes aKbMode ) { - TInt numValue = KErrNotFound; - + // Pools are formed according the predictive keyboard mapping(s). + // When selecting pool for non-predictive mode, we use the pool of the + // default keyboard. The non-predictive matches should be a sub set of the + // predictive matches of the default keyboard, although strictly speaking, + // there' no guarantee for this. + if ( aKbMode == ENonPredictive || aKbMode == EPredictiveDefaultKeyboard ) + { + aKbMode = ( iItutIsDefault ? EPredictiveItuT : EPredictiveQwerty ); + } + // If character is a Chinese word character, then we select the // pool ID according the first character of the first spelling of the word. TRAP_IGNORE( aChar = FirstCharFromSpellingL( aChar ) ); + + TPtiKey key = KeyForCharacter( aChar, aKbMode ); + TInt poolId = PoolIdForKey( key, aKbMode ); + + return poolId; + } + +// ---------------------------------------------------------------------------- +// CPcsKeyMap::PoolCount +// +// ---------------------------------------------------------------------------- +TInt CPcsKeyMap::PoolCount() + { + return iItutKeyMappings.Count() + iQwertyKeyMappings.Count(); + } + +// ---------------------------------------------------------------------------- +// CPcsKeyMap::GetSpaceAndZeroOnSameKey +// +// ---------------------------------------------------------------------------- +TBool CPcsKeyMap::GetSpaceAndZeroOnSameKey( TKeyboardModes aMode ) + { + // Resolve ambiguous keyboard mode + aMode = ResolveKeyboardMode( aMode ); - TInt key = KeyForCharacter(aChar); - if (key != KErrNotFound) + if ( aMode == EPredictiveItuT ) { - numValue = iKeysForPoolFormation.Find((TPtiKey) key); + return iSpaceAndZeroOnSameKeyOnItut; + } + else if ( aMode == EPredictiveQwerty ) + { + return iSpaceAndZeroOnSameKeyOnQwerty; } else { - // IF the key is not found, then it should go to the special pool, - // which is the last pool of iAllKeyMappingsPtrArr - numValue = iAllKeyMappingsPtrArr.Count() - 1; + return EFalse; } + } - return numValue; +// ---------------------------------------------------------------------------- +// CPcsKeyMap::SetSpaceAndZeroOnSameKey +// +// ---------------------------------------------------------------------------- +void CPcsKeyMap::SetSpaceAndZeroOnSameKey() + { + static const TInt KSpace = 0x20; // ASCII for " " + static const TInt KZero = 0x30; // ASCII for "0" + + TChar charSpace(KSpace); + TChar charZero(KZero); + + TPtiKey keySpace; + TPtiKey keyZero; + + // ITU-T mode + keySpace = KeyForCharacter(charSpace, EPredictiveItuT); + keyZero = KeyForCharacter(charZero, EPredictiveItuT); + iSpaceAndZeroOnSameKeyOnItut = (keySpace == keyZero); + + // QWERTY mode + keySpace = KeyForCharacter(charSpace, EPredictiveQwerty); + keyZero = KeyForCharacter(charZero, EPredictiveQwerty); + iSpaceAndZeroOnSameKeyOnQwerty = (keySpace == keyZero); } // ---------------------------------------------------------------------------- @@ -726,7 +757,7 @@ TChar translated( aChar ); TBuf<1> temp; temp.Append( aChar ); - if ( iAlgorithm->FindUtilECE()->IsChineseWord( temp ) ) + if ( iAlgorithm->FindUtilECE()->IsChineseWordIncluded( temp ) ) { RPointerArray spellList; CleanupResetAndDestroyPushL( spellList ); @@ -738,12 +769,91 @@ } return translated; } + // ---------------------------------------------------------------------------- -// CPcsKeyMap::PoolCount +// CPcsKeyMap::KeyMappings +// +// ---------------------------------------------------------------------------- +const RPointerArray* CPcsKeyMap::KeyMappings( TKeyboardModes aMode ) const + { + const RPointerArray* mappings = NULL; + + if ( aMode == EPredictiveItuT ) + { + mappings = &iItutKeyMappings; + } + else if ( aMode == EPredictiveQwerty ) + { + mappings = &iQwertyKeyMappings; + } + else if ( aMode == ENonPredictive ) + { + mappings = NULL; + } + else + { + mappings = NULL; + __ASSERT_DEBUG( EFalse, Panic( EPanic_InvalidKeyboardType ) ); + } + + return mappings; + } + +// ---------------------------------------------------------------------------- +// CPcsKeyMap::ResolveKeyboardMode // // ---------------------------------------------------------------------------- -TInt CPcsKeyMap::PoolCount() +TKeyboardModes CPcsKeyMap::ResolveKeyboardMode( TKeyboardModes aKbMode ) const { - return iAllKeyMappingsPtrArr.Count(); + TKeyboardModes resolvedMode = aKbMode; + + // Substitute "default predictive" mode with actual mode + if ( resolvedMode == EPredictiveDefaultKeyboard ) + { + resolvedMode = ( iItutIsDefault ? EPredictiveItuT : EPredictiveQwerty ); + } + + // Substitute predictive mode with non-predictive mode if corresponding + // keyboard mappings are not available. + if ( ( resolvedMode == EPredictiveItuT && iItutKeyboardType == EPtiKeyboardNone ) || + ( resolvedMode == EPredictiveQwerty && iQwertyKeyboardType == EPtiKeyboardNone ) ) + { + PRINT1( _L("CPcsKeyMap::ResolveKeyboardMode: Mappings for requested mode %d unavailable. Falling back to non-predictive mode!"), aKbMode ); + resolvedMode = ENonPredictive; + } + + return resolvedMode; + } + +// ---------------------------------------------------------------------------- +// CPcsKeyMap::DefaultCharForKey +// +// ---------------------------------------------------------------------------- +TText CPcsKeyMap::DefaultCharForKey( TPtiKey aKey, TKeyboardModes aKbMode ) const + { + // On ITU-T, the Pti key code can be directly interpreted as unicode character. + // Thus, default characters for keys are 1,2,3,4,5,6,7,8,9,0,*,#. + TText defChar = aKey; + + // On QWERTY, using PtiKey values directly is not safe since all PtiKey values are + // not codepoints of printable Unicode characters. + // Treating these arbitrary numerical values as Unicode characters could break + // the uniqueness of keys when collated comparison is used. Also, converting same + // data multiple times to "compare format" would then break the data. + if ( aKbMode == EPredictiveQwerty ) + { + // Take first mapped character of the key and convert it to upper case. + TInt index = iQwertyKeys.Find( aKey ); + if ( index != KErrNotFound ) + { + const RArray& mappings = iQwertyKeyMappings[index]->iKeyMappingArray; + if ( mappings.Count() ) + { + defChar = User::UpperCase( mappings[0] ); + } + } + } + + return defChar; } // End of file diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsPoolElement.cpp --- a/predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsPoolElement.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsAlgorithm/Algorithm2/src/CPcsPoolElement.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -79,20 +79,19 @@ // ---------------------------------------------------------------------------- TInt CPcsPoolElement::CompareByData ( const CPcsPoolElement& aObject1, const CPcsPoolElement& aObject2 ) { - CPsData *data1 = const_cast (aObject1).GetPsData(); - CPsData *data2 = const_cast (aObject2).GetPsData(); - return (CPcsAlgorithm2Utils::CompareDataBySortOrder(*(data1), *(data2))); + CPsData *data1 = const_cast (aObject1).GetPsData(); + CPsData *data2 = const_cast (aObject2).GetPsData(); + return (CPcsAlgorithm2Utils::CompareDataBySortOrder(*(data1), *(data2))); } // CPcsPoolElement::IsDataMatch // // ---------------------------------------------------------------------------- -TBool CPcsPoolElement::IsDataMatch (TInt aIndex) +TBool CPcsPoolElement::IsDataMatch(TInt aIndex) { - TReal val; - Math::Pow(val, 2, aIndex); - - return(iDataMatchAttribute & (TUint8)val); + __ASSERT_DEBUG( aIndex < 8, User::Panic( _L("CPcsPoolElement"), KErrOverflow ) ); + TUint8 val = 1 << aIndex; + return (iDataMatchAttribute & val); } // ---------------------------------------------------------------------------- @@ -101,10 +100,9 @@ // ---------------------------------------------------------------------------- void CPcsPoolElement::SetDataMatch(TInt aIndex) { - TReal val; - Math::Pow(val, 2, aIndex); - - iDataMatchAttribute |= (TUint8)val; + __ASSERT_DEBUG( aIndex < 8, User::Panic( _L("CPcsPoolElement"), KErrOverflow ) ); + TUint8 val = 1 << aIndex; + iDataMatchAttribute |= val; } // ---------------------------------------------------------------------------- diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsAlgorithm/Algorithm2/src/CPsDataPluginInterface.cpp --- a/predictivesearch/PcsAlgorithm/Algorithm2/src/CPsDataPluginInterface.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsAlgorithm/Algorithm2/src/CPsDataPluginInterface.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -15,6 +15,7 @@ * */ + // INCLUDE FILES #include "CPsDataPluginInterface.h" #include "CPsDataPlugin.h" @@ -109,7 +110,8 @@ // Instantiate plugins for all impUIds by calling // InstantiatePlugInFromImpUidL - for ( TInt i=0; iIsDataStoresSupportedL(aDataStore)) { @@ -200,8 +202,8 @@ { PRINT ( _L("Enter CPsDataPluginInterface::GetAllSupportedDataStoresL") ); - - for ( TInt idx = 0; idx < iPsDataPluginInstances.Count(); idx++ ) + const TInt instancesCount = iPsDataPluginInstances.Count(); + for ( TInt idx = 0; idx < instancesCount; idx++ ) { iPsDataPluginInstances[idx]->GetSupportedDataStoresL(aDataStores); } @@ -219,20 +221,23 @@ PRINT ( _L("Enter CPsDataPluginInterface::GetAllSupportedDataStoresL") ); - for ( TInt idx = 0; idx < iPsDataPluginInstances.Count(); idx++ ) - { - RPointerArray aDataStores; - iPsDataPluginInstances[idx]->GetSupportedDataStoresL(aDataStores); + const TInt instancesCount = iPsDataPluginInstances.Count(); + for ( TInt idx = 0; idx < instancesCount; idx++ ) + { + RPointerArray dataStores; + CleanupClosePushL( dataStores ); + iPsDataPluginInstances[idx]->GetSupportedDataStoresL(dataStores); - for( TInt i(0); iCompare(aUri) == 0) + const TInt dataStoresCount = dataStores.Count(); + for ( TInt i(0); i < dataStoresCount; i++) + { + if ( dataStores[i]->Compare(aUri) == 0) { iPsDataPluginInstances[idx]->GetSupportedDataFieldsL(aDataFields); break; - } + } } - aDataStores.Reset(); + CleanupStack::PopAndDestroy( &dataStores ); // Close } PRINT ( _L("End CPsDataPluginInterface::GetAllSupportedDataStoresL") ); diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsAlgorithm/Algorithm2/src/FindUtilChineseECE.cpp --- a/predictivesearch/PcsAlgorithm/Algorithm2/src/FindUtilChineseECE.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsAlgorithm/Algorithm2/src/FindUtilChineseECE.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -20,11 +20,12 @@ #include #include #include +#include + // The below code is commented out because current CFindUtilChineseECE is used // on 3.2.3 which is not supported adaptive search. It will be easy to keep these code // for the further merging work (merge from FindUtil 5.0) #if 0 -#include #include //phonebook #include #include @@ -45,12 +46,13 @@ const TUint16 KZhuyinstart = 0x3105; const TInt KZhuyincount = 37; const TInt KSeperator = 2626; -const TInt16 KMinUnicodeHz = 0x4e00; -const TInt16 KStrokeHorizontalValue = 0x4e00; -const TInt16 KStrokeVerticalValue = 0x4e28; -const TInt16 KStrokeDownToLeftValue = 0x4e3f; -const TInt16 KStrokeDownToRightValue = 0x4e36; -const TInt16 KStrokeBendingValue = 0x4e5b; +const TUint16 KMinUnicodeHz = 0x4e00; +const TUint16 KMaxUnicodeHz = 0x9fa5; +const TUint16 KStrokeHorizontalValue = 0x4e00; +const TUint16 KStrokeVerticalValue = 0x4e28; +const TUint16 KStrokeDownToLeftValue = 0x4e3f; +const TUint16 KStrokeDownToRightValue = 0x4e36; +const TUint16 KStrokeBendingValue = 0x4e5b; const TInt KSysInputMode = -1; const TInt KLeftToRightFlag =0x200e; const TInt KRightToLeftFlag =0x200f; @@ -62,6 +64,7 @@ const TUid KUidPhoneBookServer = {0x10207277}; #endif + _LIT(KWildChar, "*"); _LIT(KUnderLine, "_"); _LIT(KMiddleLine, "-"); @@ -70,28 +73,6 @@ _LIT(KPanicReason, "Abnormal input parameters!"); const TInt KLitLineFeed(8233); - -// CleanupStack helpers for item owning RPointerArrays -template -class CleanupResetAndDestroy - { -public: - inline static void PushL( T& aRef ) - { - CleanupStack::PushL( TCleanupItem( &ResetAndDestroy, &aRef ) ); - } -private: - inline static void ResetAndDestroy( TAny *aPtr ) - { - static_cast( aPtr )->ResetAndDestroy(); - } - }; - -template -inline void CleanupResetAndDestroyPushL( T& aRef ) - { - CleanupResetAndDestroy::PushL( aRef ); - } // ======== MEMBER FUNCTIONS ======== // --------------------------------------------------------- @@ -116,25 +97,16 @@ void CFindUtilChineseECE::ConstructL(CPcsAlgorithm2* aAlgorithm) { iRepositoryFind = CRepository::NewL(KCRUidAknFep); - // The below code is commented out because current CFindUtilChineseECE is used - // on 3.2.3 which is not supported adaptive search. It will be easy to keep these code - // for the further merging work (merge from FindUtil 5.0) -#if 0 iRepositoryFindAdaptive = CRepository::NewL(KCRUidAvkon); -#endif iWatcher = CFindRepositoryWatcher::NewL(KCRUidAknFep, TCallBack(HandleFindRepositoryCallBack, this), iRepositoryFind); - // The below code is commented out because current CFindUtilChineseECE is used - // on 3.2.3 which is not supported adaptive search. It will be easy to keep these code - // for the further merging work (merge from FindUtil 5.0) -#if 0 iWatcherAdaptive = CFindRepositoryWatcher::NewL(KCRUidAvkon, TCallBack(HandleFindRepositoryCallBack, this), - iRepositoryFindAdaptive); -#endif + iRepositoryFindAdaptive); + iAlgorithm = aAlgorithm; OpenL(); @@ -146,19 +118,11 @@ // CFindUtilChineseECE::CFindUtilChineseECE() : iLanguage(ELangTest), -iSupportPRCChinese(EFalse), -iCurInputMode(KSysInputMode) -// The below code is commented out because current CFindUtilChineseECE is used -// on 3.2.3 which is not supported adaptive search. It will be easy to keep these code -// for the further merging work (merge from FindUtil 5.0) -#if 0 -iSearchMethodPRC(EAdptSearchPinyin), -iSearchMethodTaiWan(EAdptSearchZhuyin), -iSearchMethodHongKong(EAdptSearchStroke), +iCurInputMode(KSysInputMode), +iSearchMethod(EAdptSearchPinyin), iSearchMethodAdaptive(EFalse) -#endif - { - } + { + } // --------------------------------------------------------- // Destructor @@ -168,15 +132,9 @@ { delete iPtiEngine; delete iWatcher; - delete iPtiEnginePrc; delete iRepositoryFind; - // The below code is commented out because current CFindUtilChineseECE is used - // on 3.2.3 which is not supported adaptive search. It will be easy to keep these code - // for the further merging work (merge from FindUtil 5.0) -#if 0 delete iWatcherAdaptive; delete iRepositoryFindAdaptive; -#endif } // --------------------------------------------------------- @@ -188,12 +146,36 @@ if (!iPtiEngine) { iPtiEngine = CPtiEngine::NewL(); - iSupportPRCChinese = IsSupportLanguage(ELangPrcChinese); } if (aLanguage != iLanguage) { - iLanguage = aLanguage; + // We only support Chinese languages. If input language is changed + // to non-Chinese, then first available Chinese language is used + // instead. + if ( aLanguage == ELangPrcChinese || + aLanguage == ELangTaiwanChinese || + aLanguage == ELangHongKongChinese ) + { + iLanguage = aLanguage; + } + else if ( IsSupportLanguage(ELangPrcChinese) ) + { + iLanguage = ELangPrcChinese; + } + else if ( IsSupportLanguage(ELangTaiwanChinese) ) + { + iLanguage = ELangTaiwanChinese; + } + else if ( IsSupportLanguage(ELangHongKongChinese) ) + { + iLanguage = ELangHongKongChinese; + } + else + { + iLanguage = aLanguage; + } + iPtiEngine->ActivateLanguageL(iLanguage); iPtiEngine->EnableToneMarks(EFalse); } @@ -217,6 +199,10 @@ // TBool CFindUtilChineseECE::DoTranslationL(TInt16 aHZUnicode, RPointerArray& aSpellList) { + // Always translate according the adaptive search method setting + return T9ChineseTranslationAdaptiveL(aHZUnicode, aSpellList); + +#if 0 // The below code is commented out because current CFindUtilChineseECE is used // on 3.2.3 which is not supported adaptive search. It will be easy to keep these code // for the further merging work (merge from FindUtil 5.0) @@ -264,13 +250,14 @@ #endif return ETrue; +#endif } // --------------------------------------------------------- // Find pane text is including stroke symbol // --------------------------------------------------------- // -TInt CFindUtilChineseECE::IsStrokeSymbol(const TInt aFindWord) +TInt CFindUtilChineseECE::IsStrokeSymbol(const TUint16 aFindWord) { TInt strokeValue = 0; @@ -298,24 +285,7 @@ return strokeValue; } -TInt CFindUtilChineseECE::CategoryOfLang(TLanguage aLanguage) - { - TInt ret = 0; - if (iLanguage == ELangPrcChinese || ( aLanguage == ELangEnglish && iSupportPRCChinese )) - { - ret = 1; - } - else if (aLanguage == ELangTaiwanChinese) - { - ret = 2; - } - else if (aLanguage == ELangHongKongChinese) - { - ret = 3; - } - return ret; - } - +#if 0 // --------------------------------------------------------- // Do translate for Chinese word // --------------------------------------------------------- @@ -323,7 +293,6 @@ TBool CFindUtilChineseECE::T9ChineseTranslationL(TInt16 aHZUnicode, RPointerArray& aSpellList) { TBuf wordInterpretationBuf; - TBuf numInterpretationBuf; if (iLanguage == ELangPrcChinese) { @@ -389,11 +358,8 @@ return ETrue; } +#endif -// The below code is commented out because current CFindUtilChineseECE is used -// on 3.2.3 which is not supported adaptive search. It will be easy to keep these code -// for the further merging work (merge from FindUtil 5.0) -#if 0 // --------------------------------------------------------- // Do translate for Chinese word // --------------------------------------------------------- @@ -403,121 +369,59 @@ { TBuf wordInterpretationBuf; - if ( iLanguage == ELangPrcChinese ) + switch(iSearchMethod) { - if(iSearchMethodPRC == EAdptSearchPinyin) - { - if (iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiPinyin) - != KErrNone) - { - return EFalse; - } - } - else if(iSearchMethodPRC == EAdptSearchStroke) - { - if (iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiStrokes) + case EAdptSearchPinyin: + if (iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiPinyin) != KErrNone) { return EFalse; - } - } - else - { - return EFalse; - } - - } - else if ( iLanguage == ELangTaiwanChinese ) - { - if(iSearchMethodTaiWan == EAdptSearchZhuyin) - { - if (iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiZhuyin) + } + break; + case EAdptSearchStroke: + if (iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiStrokes) != KErrNone) { return EFalse; - } - } - else if(iSearchMethodTaiWan == EAdptSearchStroke) - { - if (iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiStrokes) + } + break; + case EAdptSearchZhuyin: + if (iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiZhuyin) != KErrNone) { return EFalse; - } - } - else - { - return EFalse; - } + } + break; + case EAdptSearchNormalCangjie: + if (iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiCangJie) + != KErrNone) + { + return EFalse; + } + break; + case EAdptSearchEasyCangjie: + if (iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiEasyCangjie) + != KErrNone) + { + return EFalse; + } + break; + case EAdptSearchAdvCangjie: + if ((iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiCangJie) != KErrNone) + &&(iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiEasyCangjie) != KErrNone)) + { + return EFalse; + } + break; + default: + return EFalse; } - else if ( iLanguage == ELangHongKongChinese ) - { - switch(iSearchMethodHongKong) - { - case EAdptSearchNormalCangjie: - if (iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiCangJie) - != KErrNone) - { - return EFalse; - } - break; - case EAdptSearchEasyCangjie: - if (iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiEasyCangjie) - != KErrNone) - { - return EFalse; - } - break; - case EAdptSearchAdvCangjie: - if ((iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiCangJie) != KErrNone) - &&(iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiEasyCangjie) != KErrNone)) - { - return EFalse; - } - break; - case EAdptSearchStroke: - if (iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiStrokes) - != KErrNone) - { - return EFalse; - } - break; - default: - return EFalse; - } - } - else if ( iLanguage == ELangEnglish ) - { - if (!iSupportPRCChinese) - { - return EFalse; - } - - TInt err = KErrNone; - if (!iPtiEnginePrc) - { - iPtiEnginePrc = CPtiEngine::NewL(EFalse); - TRAP(err, iPtiEnginePrc->ActivateLanguageL(ELangPrcChinese)); - } - - if (err == KErrNone) - { - if (iPtiEnginePrc->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiPinyin) - != KErrNone) - - return EFalse; - } - } - else - { - return EFalse; - } TInt len = wordInterpretationBuf.Length(); TInt start = 0; - if( iSearchMethodHongKong != EAdptSearchAdvCangjie ) + if( iSearchMethod != EAdptSearchAdvCangjie ) { for (TInt i =0; i < len; i++) { @@ -528,7 +432,7 @@ } } - aSpellList.Append((wordInterpretationBuf.MidTPtr(start, len-start)).Alloc()); + aSpellList.Append((wordInterpretationBuf.MidTPtr(start, len-start)).Alloc()); } //Could look advanced cangjie as normal and easy cangjie else @@ -564,8 +468,7 @@ } return ETrue; - } -#endif + } // --------------------------------------------------------- // Find pane text is including separator @@ -583,75 +486,71 @@ void CFindUtilChineseECE::OpenL() { TInt inputLanguage = 0; - //TInt searchMode =0; + TInt searchMode = 0; if (iRepositoryFind != NULL) { iRepositoryFind->Get(KAknFepInputTxtLang, inputLanguage); } + // The following sets iLangueage to inputLanguage if inputLanguage + // is Chinese. If inputLanguage is non-Chinese, iLanguage will be + // set to first available Chinese language. OpenT9InterfaceL((TLanguage) inputLanguage); - // The below code is commented out because current CFindUtilChineseECE is used - // on 3.2.3 which is not supported adaptive search. It will be easy to keep these code - // for the further merging work (merge from FindUtil 5.0) -#if 0 if (iRepositoryFindAdaptive != NULL) { iRepositoryFindAdaptive->Get(KAknAvkonAdaptiveSearchEnabled, iSearchMethodAdaptive); } - if( inputLanguage == ELangPrcChinese) + if (iLanguage == ELangPrcChinese) { - iRepositoryFindAdaptive->Get(KAknAdaptiveSearchChinesePRC , searchMode); - if(searchMode ==0) + iRepositoryFindAdaptive->Get(KAknAdaptiveSearchChinesePRC , searchMode); + if (searchMode == 0) { - iSearchMethodPRC = EAdptSearchPinyin; + iSearchMethod = EAdptSearchPinyin; } - else if(searchMode ==1) + else if (searchMode == 1) { - iSearchMethodPRC = EAdptSearchStroke; + iSearchMethod = EAdptSearchStroke; } } - else if(inputLanguage == ELangTaiwanChinese) + else if (iLanguage == ELangTaiwanChinese) { iRepositoryFindAdaptive->Get(KAknAdaptiveSearchChineseTW , searchMode); - if(searchMode ==0) + if (searchMode == 0) { - iSearchMethodTaiWan = EAdptSearchZhuyin; + iSearchMethod = EAdptSearchZhuyin; } - else if(searchMode ==1) + else if (searchMode == 1) { - iSearchMethodTaiWan = EAdptSearchStroke; - } + iSearchMethod = EAdptSearchStroke; + } } - else if(inputLanguage == ELangHongKongChinese) + else if (iLanguage == ELangHongKongChinese) { iRepositoryFindAdaptive->Get(KAknAdaptiveSearchChineseHongkong , searchMode); - if(searchMode ==1) - { + if (searchMode == 1) + { iRepositoryFind->Get(KAknFepCangJieMode , searchMode); switch (searchMode) { case 0: - iSearchMethodHongKong = EAdptSearchNormalCangjie; + iSearchMethod = EAdptSearchNormalCangjie; break; case 1: - iSearchMethodHongKong = EAdptSearchEasyCangjie; + iSearchMethod = EAdptSearchEasyCangjie; break; case 2: - iSearchMethodHongKong = EAdptSearchAdvCangjie; + iSearchMethod = EAdptSearchAdvCangjie; break; } - } - else if(searchMode ==0) + else if (searchMode == 0) { - iSearchMethodHongKong = EAdptSearchStroke; + iSearchMethod = EAdptSearchStroke; } - } -#endif } // --------------------------------------------------------- @@ -682,7 +581,7 @@ TBool ret = EFalse; // Check Chinese word in find pane - TBool chineseWord = IsChineseWord(aWord); + TBool chineseWord = IsChineseWordIncluded(aWord); if (chineseWord) { @@ -851,8 +750,25 @@ // TBool CFindUtilChineseECE::MatchRefineL(const TDesC& aItemString, CPsQuery& aPsQuery) { + RArray ignore1; + CleanupClosePushL( ignore1 ); + RArray ignore2; + CleanupClosePushL( ignore2 ); + + TBool match = MatchRefineL( aItemString, aPsQuery, ignore1, ignore2, EFalse ); + + CleanupStack::PopAndDestroy( &ignore2 ); + CleanupStack::PopAndDestroy( &ignore1 ); + + return match; + } + +TBool CFindUtilChineseECE::MatchRefineL(const TDesC& aItemString, CPsQuery& aPsQuery, + RArray& aMatchPos, RArray& aMatchLength, TBool aHighLight ) + { TBuf tempBuf; TBuf itemString; + TBool haschineseword = EFalse; itemString.Zero(); if ( KMaxWordLength > aItemString.Length() ) @@ -870,12 +786,10 @@ if(itemString[0]== KLeftToRightFlag || itemString[0]== KRightToLeftFlag) { itemString.Delete(0,1); - itemString.Delete((itemString.Length()-1),1); + itemString.Delete((itemString.Length()-1),1); } } - TBool haschineseword = EFalse; - // Check function parameter if (aPsQuery.Count() == 0) { @@ -888,8 +802,8 @@ } TBool ret = EFalse; - CPsQuery* query = CPsQuery::NewL(); + CleanupStack::PushL( query ); GetPartOfQueryL(aPsQuery, 0, aPsQuery.Count()-1, *query); RemoveSeparatorL(*query); TPtrC queryStrPtr = query->QueryAsStringLC(); @@ -912,78 +826,63 @@ { iCurInputMode = KSysInputMode; } - - // Check Chinese word in find pane - if (IsChineseWord(tempBuf)) + + TBool inputMethodStroke = EFalse; + if(iLanguage == ELangHongKongChinese && iCurInputMode == 0x0020) + { + inputMethodStroke = ETrue; + } + + // Check if any Chinese word in find pane + if ( IsChineseWordIncluded(tempBuf) ) { haschineseword = ETrue; ret = IncludeString(aItemString, tempBuf); - - if (ret) + + if( IsAllChineseWord( tempBuf )) { + CleanupStack::PopAndDestroy( query ); return ret; } - /* else - { - // if Stroke Symbol in HongKong - TBool strokeSymHK = (IsStrokeSymbolInString(tempBuf)) && - (iLanguage == ELangHongKongChinese) && - iCurInputMode == 0x0020; - - if (!strokeSymHK) - { - return ret; - } - }*/ } - //Find if search string has chinese word. - //Compare with item string if find chinese word in item string then delete it from search and item string. - //if not then return EFalse. - TBool InputMethodStroke = EFalse; - if(iLanguage == ELangHongKongChinese && iCurInputMode == 0x0020) - { - InputMethodStroke = ETrue; - } - + + // There are two steps to do when searchstring includes Chinese character + // + // step 1: check whether itemstring includes the chinese charactor in the searchstring + // If not, return EFalse. Otherwise, go to step2 + // + // step2: If itemstring includes the chinese charactor in the searchstring, translate + // the Chinese character in the searchstring to spellList and reconstruct the query. if (haschineseword) { TInt ii=0; - TBool leftDifferentChinese = EFalse; //Fixed for ESSG-7PJ6GF, flag the different Chinese character at the left of aSearchText. + + // Step 1: + // E.g: itemstring = "0x4E00,0x4E8C,0x4E09,0x56DB,0x4E94" + // (Unicode of Chinese number "1 2 3 4 5") + // searchstring1 = "0x4E00,x,y,z,0x4E09" + // searchstring2 = "0x4E8C,0x4E00" + // searchstring3 = "0x4E00,0x4E5D" + // In this case, searchstring2 and searchstring3 will return EFalse, + // only searchstring1 will be translated to spellList in step 2 while (ii< tempBuf.Length()) { - if ((TInt)tempBuf[ii]>= KMinUnicodeHz && (!InputMethodStroke - ||(InputMethodStroke && !IsStrokeSymbol(tempBuf[ii])))) + TInt lastFindCursor = -1; + if( (TUint16)tempBuf[ii] <= KMaxUnicodeHz + && (TUint16)tempBuf[ii]>= KMinUnicodeHz + && ( !inputMethodStroke ||(inputMethodStroke && + !IsStrokeSymbol(tempBuf[ii])) ) ) { TInt Findcursor = itemString.Locate(tempBuf[ii]); - if (Findcursor != KErrNotFound) + if( KErrNotFound == Findcursor || Findcursor < lastFindCursor ) { - if ((Findcursor == itemString.Length()-1)&& (ii - ==tempBuf.Length()-1)) - { - //Start:Fixed for ESSG-7PJ6GF - if ( leftDifferentChinese || IsChineseWord( - itemString.Left( Findcursor ) ) ) - { - //if the different Chinese character at the left or middle, return false. - return EFalse; - } - //End:Fixed for ESSG-7PJ6GF - return ETrue; - } - itemString.Delete(0, Findcursor+1); - tempBuf.Delete(0, ii+1); - ii=0; + CleanupStack::PopAndDestroy( query ); + return EFalse; } else { - //Start:Fixed for ESSG-7PJ6GF - if ( IsChineseWord( tempBuf.Left( ii + 1 ) ) ) - { - //flag the different Chinese character at the left. - leftDifferentChinese = ETrue; - } - //End:Fixed for ESSG-7PJ6GF + lastFindCursor = Findcursor; ii++; } } @@ -992,9 +891,70 @@ ii++; } } + + ii = 0; + // Counter of queryItem + TInt queryItemCount = 0; + + //Step 2: + // Translating searchstring to spellList and reconstruct query + while ( ii< tempBuf.Length() ) + { + // If it is a valid chinese character + if ( (TUint16)tempBuf[ii] <= KMaxUnicodeHz + && (TUint16)tempBuf[ii]>= KMinUnicodeHz + && ( !inputMethodStroke ||(inputMethodStroke && + !IsStrokeSymbol(tempBuf[ii])) ) ) + { + RPointerArray spellList; + + // If successfully translating the chinese character to spellList( Pinyin,Zhuyin or stroke ) + // then reconstruct the query, replace the Chinese character with its spellList in the query. + // Otherwise, just increase the counter of queryItem. + if( DoTranslationL(TInt16(tempBuf[ii]), spellList) ) + { + // Replace the queryItem by the translated spelling + CPsQueryItem& tempItem = query->GetItemAtL(queryItemCount); + const TKeyboardModes tempMode = tempItem.Mode(); + + // Remove the Chinese character queryItem + query->Remove(queryItemCount); + + // Reconstruct the query, replace Chinese character with its spellList + for(TInt cnt = 0; cnt < spellList[0]->Length(); cnt++) + { + // Add a new query item to query + CPsQueryItem* newItem = CPsQueryItem::NewL(); + CleanupStack::PushL(newItem); + newItem->SetCharacter( (*spellList[0])[cnt] ); + newItem->SetMode(tempMode); + + query->InsertL(*newItem, queryItemCount + cnt ); + CleanupStack::Pop(newItem); + } + + queryItemCount += spellList[0]->Length(); + } + else + { + queryItemCount++; + } + + ii++; + spellList.ResetAndDestroy(); + spellList.Close(); + + } + //if not, just pass it by + else + { + ii++; + queryItemCount++; + } + } } - + // Array for item string RPointerArray stringInfoArr; // Split item string @@ -1002,13 +962,13 @@ if (stringInfoArr.Count() > 0) { - ret = MatchSegmentL(stringInfoArr, *query); + ret = MatchSegmentL(stringInfoArr, *query, aMatchPos, aMatchLength, aHighLight); } stringInfoArr.ResetAndDestroy(); stringInfoArr.Close(); - delete query; + CleanupStack::PopAndDestroy( query ); return ret; } @@ -1018,7 +978,7 @@ // --------------------------------------------------------- // void CFindUtilChineseECE::SplitItemStringL(RPointerArray& aStringInfoArr, - const TDesC &aItemString) + const TDesC& aItemString) { TBuf tempBuf; TBuf englishBuf; @@ -1029,8 +989,7 @@ chineseBuf.Zero(); TInt index = 0; - TUint32 temp = 0; - TInt32 distance = 0; + TBool isChinese = EFalse; const TInt strLength = aItemString.Length(); for (; index < strLength; index++) @@ -1039,35 +998,35 @@ { // Check Chinese and English Buf. If it is not empty, // add buf to Array - InsertStrInforArrayL(aStringInfoArr, chineseBuf, ETrue); - InsertStrInforArrayL(aStringInfoArr, englishBuf, EFalse); + InsertStrInforArrayL(aStringInfoArr, chineseBuf, ETrue, index); + InsertStrInforArrayL(aStringInfoArr, englishBuf, EFalse, index); continue; } - temp = aItemString[index]; - distance = (TInt32)(temp - KMinUnicodeHz); - - if (distance < 0)// English word + isChinese = ((TUint16)aItemString[index] >= KMinUnicodeHz && + (TUint16)aItemString[index] <= KMaxUnicodeHz); + + if ( !isChinese )// English word { // Chinese word is end and add to array - InsertStrInforArrayL(aStringInfoArr, chineseBuf, ETrue); + InsertStrInforArrayL(aStringInfoArr, chineseBuf, ETrue, index); // Add English word to array - englishBuf.Append((TChar) aItemString[index]); + englishBuf.Append(aItemString[index]); } else // Chinese word { // English word is end and add to array - InsertStrInforArrayL(aStringInfoArr, englishBuf, EFalse); + InsertStrInforArrayL(aStringInfoArr, englishBuf, EFalse, index); // Add Chinese word to array - chineseBuf.Append((TChar) aItemString[index]); + chineseBuf.Append(aItemString[index]); } } // Finish loop check buffer is empty - InsertStrInforArrayL(aStringInfoArr, chineseBuf, ETrue); - InsertStrInforArrayL(aStringInfoArr, englishBuf, EFalse); + InsertStrInforArrayL(aStringInfoArr, chineseBuf, ETrue, index); + InsertStrInforArrayL(aStringInfoArr, englishBuf, EFalse, index); } // --------------------------------------------------------- @@ -1075,9 +1034,8 @@ // --------------------------------------------------------- // void CFindUtilChineseECE::InsertStrInforArrayL(RPointerArray& aStringInfoArr, - TDes &aSegmentStr, const TBool aChinese) + TDes &aSegmentStr, TBool aChinese, TInt aIndexAfterStr) { - CleanupResetAndDestroyPushL( aStringInfoArr ); if (aSegmentStr.Length() <= 0) { return; @@ -1089,10 +1047,10 @@ strInfo->segmentString.Copy(aSegmentStr); strInfo->segmentString.LowerCase(); strInfo->isChinese = aChinese; + strInfo->segmentPos = aIndexAfterStr - aSegmentStr.Length(); aStringInfoArr.AppendL(strInfo); aSegmentStr.Zero(); - CleanupStack::Pop( &aStringInfoArr ); } // --------------------------------------------------------- @@ -1100,107 +1058,133 @@ // --------------------------------------------------------- // TBool CFindUtilChineseECE::MatchSegmentL(RPointerArray& aStringInfoArr, - CPsQuery& aQuery) + CPsQuery& aQuery, RArray& aMatchPos, RArray& aMatchLength, TBool aHighLight ) { const TInt arrayLength = aStringInfoArr.Count(); const TInt searchStrLength = aQuery.Count(); - TInt searchStrIndex = 0; STRINGINFO* pStringInfo; TInt index = 0; + TBool ret = EFalse; + TBool hasChinese = EFalse; - // First only check English + // First check if there is a full match in non-Chinese in any one segment for (; index < arrayLength; index++) { + pStringInfo = aStringInfoArr[index]; + TPtrC currentSeg( pStringInfo->segmentString ); + TInt matchLen( 0 ); + + // Compare word + if (pStringInfo->isChinese) + { + hasChinese = ETrue; + } + else + { + matchLen = MatchStringL( currentSeg, aQuery ); + } + + // If full match is found + if ( matchLen == searchStrLength ) + { + //Only append postion of non-Chinese character + if( !pStringInfo->isChinese ) + { + aMatchPos.Append( pStringInfo->segmentPos ); + aMatchLength.Append( matchLen ); + } + ret = ETrue; + + // If there is no need to HighLight the matched part, return immediately + // Otherwise, continue to find all the matched positions + if( !aHighLight ) + return ret; + } + } + + // Then search through segments again, this time considering + // also cases where matching part continues over several segments. + // This algorithm is greedy and heuristic and can't necesarily find + // all the matches in the segments after the first one. + TPtrC segCurrent; + TInt searchStrIndextemp = 0; + TInt searchStrIndexMax = 0; + TInt searchStrIndex = 0; + index = 0; + + // Loop through seqments until whole query is matched + for (; index < arrayLength && !ret ; index++) + { // Create an empty CPsQuery CPsQuery* tempQuery = CPsQuery::NewL(); - pStringInfo = aStringInfoArr[index]; - - GetPartOfQueryL( aQuery, searchStrIndex, searchStrLength - 1, - *tempQuery ); + CleanupStack::PushL( tempQuery ); - // Compare word - if (!pStringInfo->isChinese) - { - searchStrIndex += MatchString(pStringInfo->segmentString, *tempQuery); - } + GetPartOfQueryL( aQuery, searchStrIndex, searchStrLength - 1, *tempQuery ); - delete tempQuery; - tempQuery = NULL; - - if (searchStrIndex >= searchStrLength) - { - return ETrue; - } - } + pStringInfo = aStringInfoArr[index]; + segCurrent.Set( pStringInfo->segmentString ); - TBuf bufcurrent; - TBuf tempbufcurrent; - TInt searchStrIndextemp = 0; - TInt searchStrIndexMax = 0; - // Find Chinese and English - searchStrIndex = 0; - index = 0; - - for (; index < arrayLength; index++) - { - // Create an empty CPsQuery - CPsQuery* tempQuery = CPsQuery::NewL(); - pStringInfo = aStringInfoArr[index]; - - GetPartOfQueryL( aQuery, searchStrIndex, searchStrLength - 1, - *tempQuery ); - searchStrIndexMax = 0; - - bufcurrent = pStringInfo->segmentString; - - for(TInt i =0;i< pStringInfo->segmentString.Length();i++) + if (pStringInfo->isChinese) { - tempbufcurrent = bufcurrent.Mid(i); - if (pStringInfo->isChinese) + // find the longest substring matching the query + searchStrIndexMax = 0; + for (TInt i = 0; i< segCurrent.Length(); i++) { - TInt temp=0; - searchStrIndextemp = MatchChineseStringL(tempbufcurrent, *tempQuery, temp); - if(searchStrIndextemp > searchStrIndexMax) + TPtrC tempSeg( segCurrent.Mid(i) ); + TInt startIdx( KErrNotFound ); + TInt endIdx( KErrNotFound ); + searchStrIndextemp = MatchChineseStringL(tempSeg, *tempQuery, startIdx, endIdx); + if (searchStrIndextemp > searchStrIndexMax) { searchStrIndex -= searchStrIndexMax; searchStrIndexMax = searchStrIndextemp; searchStrIndex += searchStrIndexMax; } + + if (searchStrIndex >= searchStrLength) + { + // found substring which consumes whole query, no need to find any longer + break; + } } - else - { - searchStrIndex += MatchString(pStringInfo->segmentString, *tempQuery); - } - - if (searchStrIndex >= searchStrLength) + } + else // not chinese + { + TInt matchLen = MatchStringL(segCurrent, *tempQuery); + searchStrIndex += matchLen; + if ( matchLen ) { - delete tempQuery; - tempQuery = NULL; - return ETrue; - } - else if(!pStringInfo->isChinese) - { - break; + aMatchPos.Append( pStringInfo->segmentPos ); + aMatchLength.Append( matchLen ); } } - delete tempQuery; - tempQuery = NULL; + if (searchStrIndex >= searchStrLength) + { + ret = ETrue; // also breaks us out from the loop + } + else if ( !pStringInfo->isChinese && !hasChinese ) + { + CleanupStack::PopAndDestroy( tempQuery ); + break; + } + + CleanupStack::PopAndDestroy( tempQuery ); } - return EFalse; + return ret; } // --------------------------------------------------------- // Search Chinese word in input text // --------------------------------------------------------- // -TInt CFindUtilChineseECE::MatchChineseStringL(const TDesC& aSearhTargetString, CPsQuery& aQuery, TInt& aIndex) +TInt CFindUtilChineseECE::MatchChineseStringL(const TDesC& aSearhTargetString, CPsQuery& aQuery, + TInt& aMatchStartIdx, TInt& aMatchEndIdx) { const TInt stringLength = aSearhTargetString.Length(); const TInt searchLength = aQuery.Count(); TInt index = 0; - //TBuf tempBuf; TBuf previousBuf; TInt curMatchCount = 0; TInt preMatchCount = 0; @@ -1208,6 +1192,13 @@ TInt curSearchIndex = 0; TBool bFullMatched = EFalse; TBool bContinue = EFalse; + TBool bPrevReplaced = EFalse; + aMatchStartIdx = KErrNotFound; + aMatchEndIdx = KErrNotFound; + + CPsQuery* tempFullQuery = CPsQuery::NewL(); + CleanupStack::PushL( tempFullQuery ); + GetPartOfQueryL( aQuery, 0, aQuery.Count() - 1, *tempFullQuery ); for (; index < stringLength; index++) { @@ -1226,17 +1217,17 @@ // Get left string CPsQuery* tempQuery = CPsQuery::NewL(); - GetPartOfQueryL( aQuery, curSearchIndex, searchLength - 1, - *tempQuery ); + CleanupStack::PushL( tempQuery ); + GetPartOfQueryL( aQuery, curSearchIndex, searchLength - 1, *tempQuery ); - // Get Matched count and the matched index in list - curMatchCount = MaxMatchInList(spellList, *tempQuery, previousBuf, matchIndex, - bFullMatched, preMatchCount, bContinue); + // Get Matched count and the matched index in list + curMatchCount = MaxMatchInListL(spellList, *tempQuery, previousBuf, matchIndex, + bFullMatched, preMatchCount, bContinue, bPrevReplaced, *tempFullQuery); // There is a string matched in list if (curMatchCount != 0) { - previousBuf.Copy(spellList[matchIndex]->Des()); + previousBuf.Copy(*spellList[matchIndex]); if (curMatchCount == previousBuf.Length()) { @@ -1247,7 +1238,7 @@ bFullMatched = EFalse; } - // If it is repeat match, continue + // If it is repeat match, continue if (!bContinue) { curSearchIndex += curMatchCount; @@ -1258,6 +1249,14 @@ previousBuf.Zero(); curMatchCount = 0; } + + // Store the index of first matched Han character + if ( bPrevReplaced || aMatchStartIdx == KErrNotFound ) + { + aMatchStartIdx = index; + } + // Store the index of last matched Han character + aMatchEndIdx = index; } else { @@ -1269,13 +1268,17 @@ } curSearchIndex = 0; + + // Any earlier partial match is discarded, reset the matching part indices + aMatchStartIdx = KErrNotFound; + aMatchEndIdx = KErrNotFound; } spellList.ResetAndDestroy();//destroy spellList spellList.Close(); preMatchCount = curMatchCount; - delete tempQuery; + CleanupStack::PopAndDestroy( tempQuery ); tempQuery = NULL; // Search to End and return @@ -1284,8 +1287,9 @@ break; } } + CleanupStack::PopAndDestroy( tempFullQuery ); + tempFullQuery = NULL; - aIndex = index; return curSearchIndex; } @@ -1293,11 +1297,11 @@ // Maximal matched count in spelling list // --------------------------------------------------------- // -TInt CFindUtilChineseECE::MaxMatchInList(RPointerArray &spellList, CPsQuery& aQuery, +TInt CFindUtilChineseECE::MaxMatchInListL(RPointerArray &aSpellList, CPsQuery& aQuery, TDesC& aPreviouStr, TInt& aMatchIndex, const TBool aFullMatched, - const TInt aMatchedCount, TBool& aAgain) + const TInt aMatchedCount, TBool& aAgain, TBool& aPrevReplaced, CPsQuery& aFullQuery) { - const TInt itemCount = spellList.Count(); + const TInt itemCount = aSpellList.Count(); TInt matchCount = 0; TBool selfMatch = EFalse; aMatchIndex = 0; @@ -1320,9 +1324,9 @@ repeatCount = 0; loopFlag = EFalse; tempBuf.Zero(); - tempBuf.Copy(spellList[index]->Des()); + tempBuf.Copy( *aSpellList[index] ); - temp = MatchString(tempBuf, aQuery); + temp = MatchStringL(tempBuf, aQuery); if(temp != 0) { selfMatch = ETrue; @@ -1337,11 +1341,11 @@ // Previous word is fully matched if (aFullMatched) { - repeatCount = ReverseMatchString(aPreviouStr, tempBuf); + repeatCount = ReverseMatchStringL(aPreviouStr, tempBuf, aFullQuery ); // Find repeat and remove it, search again if (repeatCount != 0) { - temp = MatchString(tempBuf.Right(tempBuf.Length() - repeatCount), aQuery); + temp = MatchStringL(tempBuf.Right(tempBuf.Length() - repeatCount), aQuery); if (temp == 0) { @@ -1352,14 +1356,14 @@ } else { - repeatCount = MatchString(aPreviouStr, tempBuf); + repeatCount = MatchStringL(aPreviouStr, tempBuf, aFullQuery); // Find repeat and remove it, search again if (repeatCount != 0) { if (aMatchedCount <= repeatCount) { - temp = MatchString(tempBuf.Right(tempBuf.Length() - aMatchedCount), aQuery); + temp = MatchStringL(tempBuf.Right(tempBuf.Length() - aMatchedCount), aQuery); if (temp == 0) { @@ -1371,11 +1375,11 @@ if (temp == 0) { - repeatCount = ReverseMatchString(aPreviouStr.Left(aMatchedCount), tempBuf); + repeatCount = ReverseMatchStringL(aPreviouStr.Left(aMatchedCount), tempBuf, aFullQuery); if (repeatCount != 0) { - temp = MatchString(tempBuf.Right(tempBuf.Length() - repeatCount), aQuery); + temp = MatchStringL(tempBuf.Right(tempBuf.Length() - repeatCount), aQuery); if (temp == 0) { @@ -1414,16 +1418,20 @@ aMatchIndex = index; aAgain = loopFlag; } - if(matchCount == aQuery.Count() && selfMatch) + if (matchCount == aQuery.Count() && selfMatch) { break; } } + + // Was the previous match replaced with a longer match from this spell list + aPrevReplaced = ( matchCount && repeatCount ); + return matchCount; } // --------------------------------------------------------- -// Search the taxt is include the input text +// Search the text is include the input text // --------------------------------------------------------- // TBool CFindUtilChineseECE::IncludeString(const TDesC& aFirst, const TDesC& aSecond) @@ -1455,29 +1463,22 @@ // Search text in other text // --------------------------------------------------------- // -TInt CFindUtilChineseECE::MatchString(const TDesC& aFirst, const TDesC& aSecond) +TInt CFindUtilChineseECE::MatchStringL(const TDesC& aFirst, const TDesC& aSecond, CPsQuery& aFullQuery) { const TInt secondStrLength = aSecond.Length(); const TInt firstStrLength = aFirst.Length(); - const TInt compareCount = firstStrLength > secondStrLength ? secondStrLength - : firstStrLength; + const TInt compareCount = Min( firstStrLength, secondStrLength ); TInt index = 0; - - TBuf tempStr; - // translate search target string into numeric string before match - if (iAlgorithm) - { - iAlgorithm->Converter( aFirst, tempStr ); - } - else - { - tempStr.Copy(aFirst); - } + TBuf firstNumInterpretationBuf; + TBuf secondNumInterpretationBuf; + + iAlgorithm->GetKeyMap()->GetMixedKeyStringForDataL(aFullQuery, aFirst, firstNumInterpretationBuf); + iAlgorithm->GetKeyMap()->GetMixedKeyStringForDataL(aFullQuery, aSecond, secondNumInterpretationBuf); for (; index < compareCount; index++) { - if (tempStr.Left(index + 1).FindC(aSecond.Left(index + 1)) == KErrNotFound) + if (firstNumInterpretationBuf.Left(index + 1).FindC(secondNumInterpretationBuf.Left(index + 1)) == KErrNotFound) { break; } @@ -1485,32 +1486,32 @@ // Match count return index; } + // --------------------------------------------------------- // Search CPsQuery in aSearhTargetStr // --------------------------------------------------------- // -TInt CFindUtilChineseECE::MatchString(const TDesC& aSearhTargetStr, CPsQuery& aQuery) +TInt CFindUtilChineseECE::MatchStringL(const TDesC& aSearhTargetStr, CPsQuery& aQuery) { const TInt secondStrLength = aQuery.Count(); const TInt firstStrLength = aSearhTargetStr.Length(); TBuf numInterpretationBuf; + TBuf queryStr; - const TInt compareCount = firstStrLength > secondStrLength ? secondStrLength - : firstStrLength; + const TInt compareCount = Min( firstStrLength, secondStrLength ); + TInt index = 0; - ConvertdDataToKeyBoardModeL(aQuery, aSearhTargetStr, numInterpretationBuf); + iAlgorithm->GetKeyMap()->GetMixedKeyStringForDataL(aQuery, aSearhTargetStr, numInterpretationBuf); + iAlgorithm->GetKeyMap()->GetMixedKeyStringForQueryL(aQuery, queryStr); - TPtrC queryStr = aQuery.QueryAsStringLC(); for (; index < compareCount; index++) { - if (numInterpretationBuf.Left(index + 1).FindC(queryStr.Left(index + 1)) == KErrNotFound) { break; } } - CleanupStack::PopAndDestroy(); // Match count return index; @@ -1520,32 +1521,22 @@ // Search text by reverse // --------------------------------------------------------- // -TInt CFindUtilChineseECE::ReverseMatchString(const TDesC& aFirst, const TDesC& aSecond) +TInt CFindUtilChineseECE::ReverseMatchStringL(const TDesC& aFirst, const TDesC& aSecond, CPsQuery& aFullQuery) { const TInt secondStrLength = aSecond.Length(); const TInt firstStrLength = aFirst.Length(); TInt compareCount = firstStrLength > secondStrLength ? secondStrLength : firstStrLength; TInt index = 0; TInt matchCount = 0; - + TBuf firstNumInterpretationBuf; + TBuf secondNumInterpretationBuf; + + iAlgorithm->GetKeyMap()->GetMixedKeyStringForDataL(aFullQuery, aFirst, firstNumInterpretationBuf); + iAlgorithm->GetKeyMap()->GetMixedKeyStringForDataL(aFullQuery, aSecond, secondNumInterpretationBuf); + for (; index < compareCount; index++) { - TBuf firstConvStr; - TBuf secondConvStr; - - // translate compared target string into numeric string before match - if ( iAlgorithm ) - { - iAlgorithm->Converter( aFirst, firstConvStr ); - iAlgorithm->Converter( aSecond, secondConvStr ); - } - else - { - firstConvStr.Copy( aFirst ); - secondConvStr.Copy( aSecond ); - } - - if( firstConvStr.Right( index + 1 ).FindC( secondConvStr.Left( index + 1 ) ) != KErrNotFound ) + if( firstNumInterpretationBuf.Right( index + 1 ).FindC( secondNumInterpretationBuf.Left( index + 1 ) ) != KErrNotFound ) { matchCount = index + 1; } @@ -1567,14 +1558,16 @@ // Find pane text is including Chinese word // --------------------------------------------------------- // -TBool CFindUtilChineseECE::IsChineseWord(const TDesC& aWord) +TBool CFindUtilChineseECE::IsChineseWordIncluded(const TDesC& aWord) { TBool IsChineseSearchStr = EFalse; const TInt len = aWord.Length(); for (TInt ii = 0; ii < len; ii++) { - if ((TInt) aWord[ii] >= KMinUnicodeHz) + + if ( ((TUint16) aWord[ii] >= KMinUnicodeHz) && + ((TUint16) aWord[ii] <= KMaxUnicodeHz) ) { IsChineseSearchStr = ETrue; break; @@ -1594,7 +1587,7 @@ for (TInt index = 0; index < len; index++) { - if (IsStrokeSymbol(TInt(aWord[index])) != 0) + if (IsStrokeSymbol(TUint16(aWord[index])) != 0) { return ETrue; } @@ -1602,6 +1595,33 @@ return EFalse; } +// -------------------------------------------------------- +// Find pane text is all Chinese word(s) +// -------------------------------------------------------- +// +TBool CFindUtilChineseECE::IsAllChineseWord(const TDesC& aWord) + { + TBool isChineseWord = ETrue; + const TInt len = aWord.Length(); + + TBool InputMethodStroke = EFalse; + if(iLanguage == ELangHongKongChinese && iCurInputMode == 0x0020) + { + InputMethodStroke = ETrue; + } + + for( TInt i = 0; i < len; i++ ) + { + if( (( TUint16 )aWord[i] > KMaxUnicodeHz ) || (( TUint16 )aWord[i] < KMinUnicodeHz ) + || ( InputMethodStroke && IsStrokeSymbol(aWord[i]) ) ) + { + isChineseWord = EFalse; + break; + } + } + return isChineseWord; + } + // --------------------------------------------------------- // Find pane text is including zhuyin symbol // --------------------------------------------------------- @@ -1643,108 +1663,37 @@ TInt CFindUtilChineseECE::HandleFindRepositoryCallBack(TAny* aPtr) { TInt ret = KErrNone; - CFindUtilChineseECE *self = static_cast (aPtr); - TInt searchMode = 0; + CFindUtilChineseECE* self = static_cast (aPtr); - if (self->iWatcher->ChangedKey() == KAknFepInputTxtLang) + // Get changed key either from language repository (AknFepRepository) + // or from adaptive repository (AvkonRepository). + TUint32 changedKey = self->iWatcher->ChangedKey(); + if ( changedKey == NCentralRepositoryConstants::KInvalidNotificationId ) { - TInt inputLanguage = 0; - self->iRepositoryFind->Get(KAknFepInputTxtLang, inputLanguage); + changedKey = self->iWatcherAdaptive->ChangedKey(); + } + - TInt prevCategory = self->CategoryOfLang(self->iLanguage); - TRAP(ret, self->OpenT9InterfaceL(TLanguage(inputLanguage))); + // Update the search method if input language or any search method variable + // changed + if ( changedKey == KAknFepInputTxtLang || + changedKey == KAknAdaptiveSearchChinesePRC || + changedKey == KAknAdaptiveSearchChineseTW || + changedKey == KAknAdaptiveSearchChineseHongkong || + changedKey == KAknFepCangJieMode || + changedKey == KAknAvkonAdaptiveSearchEnabled ) + { + TChineseSearchMethod prevSearchMethods = self->iSearchMethod; - TInt category = self->CategoryOfLang(TLanguage(inputLanguage)); - if (prevCategory != category && category != 0) + TRAP( ret, self->OpenL() ); + + // Reconstruct cache if search method got changed + if ( ret == KErrNone && prevSearchMethods != self->iSearchMethod ) { TRAP(ret, self->iAlgorithm->ReconstructCacheDataL()); } } - - // The below code is commented out because current CFindUtilChineseECE is used - // on 3.2.3 which is not supported adaptive search. It will be easy to keep these code - // for the further merging work (merge from FindUtil 5.0) -#if 0 - if(self->iWatcherAdaptive->ChangedKey() == KAknAvkonAdaptiveSearchEnabled) - { - self->iRepositoryFindAdaptive->Get(KAknAvkonAdaptiveSearchEnabled, self->iSearchMethodAdaptive); - } - - if (self->iWatcherAdaptive->ChangedKey() == KAknAdaptiveSearchChinesePRC) - { - self->iRepositoryFindAdaptive->Get(KAknAdaptiveSearchChinesePRC, searchMode); - - if(searchMode ==0) - { - self->iSearchMethodPRC = EAdptSearchPinyin; - } - else if(searchMode ==1) - { - self->iSearchMethodPRC = EAdptSearchStroke; - } - } - - if (self->iWatcherAdaptive->ChangedKey() == KAknAdaptiveSearchChineseTW ) - { - self->iRepositoryFindAdaptive->Get(KAknAdaptiveSearchChineseTW , searchMode); - - if(searchMode ==0) - { - self->iSearchMethodTaiWan = EAdptSearchZhuyin; - } - else if(searchMode ==1) - { - self->iSearchMethodTaiWan = EAdptSearchStroke; - } - } - - if (self->iWatcherAdaptive->ChangedKey() == KAknAdaptiveSearchChineseHongkong ) - { - self->iRepositoryFindAdaptive->Get(KAknAdaptiveSearchChineseHongkong , searchMode); - - if(searchMode ==1) - { - self->iRepositoryFind->Get(KAknFepCangJieMode , searchMode); - - switch (searchMode) - { - case 0: - self->iSearchMethodHongKong = EAdptSearchNormalCangjie; - break; - case 1: - self->iSearchMethodHongKong = EAdptSearchEasyCangjie; - break; - case 2: - self->iSearchMethodHongKong = EAdptSearchAdvCangjie; - break; - } - - } - else if(searchMode ==0) - { - self->iSearchMethodHongKong = EAdptSearchStroke; - } - } - - if (self->iWatcher->ChangedKey() == KAknFepCangJieMode ) - { - self->iRepositoryFind->Get(KAknFepCangJieMode , searchMode); - - switch (searchMode) - { - case 0: - self->iSearchMethodHongKong = EAdptSearchNormalCangjie; - break; - case 1: - self->iSearchMethodHongKong = EAdptSearchEasyCangjie; - break; - case 2: - self->iSearchMethodHongKong = EAdptSearchAdvCangjie; - break; - } - - } -#endif + return ret; } @@ -1777,11 +1726,6 @@ } } -void CFindUtilChineseECE::SetKeyboardMode(TInt aMode) - { - iKeyboardMode = aMode; - } - // The below code is commented out because current CFindUtilChineseECE is used // on 3.2.3 which is not supported adaptive search. It will be easy to keep these code // for the further merging work (merge from FindUtil 5.0) @@ -1798,7 +1742,7 @@ { aNextChars = aNextChars->ReAllocL( aNextChars->Des().MaxLength()+10 ); } - aNextChars->Des().Append(aCh); + aNextChars->Des().Append(aCh); } } @@ -1990,7 +1934,7 @@ // Compare word if (!pStringInfo->isChinese) { - searchStrIndex += MatchString(pStringInfo->segmentString, + searchStrIndex += MatchStringL(pStringInfo->segmentString, transSearchBuf); } @@ -2070,7 +2014,7 @@ } tempSpellList.ResetAndDestroy(); - if(ReverseMatchString(aCurrentBuf,temp)>0) + if(ReverseMatchStringL(aCurrentBuf,temp)>0) { if (pStringInfo->isChinese) { @@ -2320,7 +2264,7 @@ //Find if search string has chinese word. //Compare with item string if find chinese word in item string then delete it from search and item string. - if(IsChineseWord(tempBuf)) + if(IsChineseWordIncluded(tempBuf)) { if(TrimChineseCharacterL(itemString,tempBuf,aNextChars)) { @@ -2405,7 +2349,7 @@ } else {//english words and chinese words don't coexist in same segment - matchLength = MatchString(bufcurrent, transSearchBuf); + matchLength = MatchStringL(bufcurrent, transSearchBuf); searchStrIndex +=matchLength; if (searchStrIndex >= searchStrLength) { @@ -2554,58 +2498,6 @@ } #endif -// ---------------------------------------------------------------------------- -// CFindUtilChineseECE::ConvertdDataToKeyBoardModeL -// Converts the input data to the key board mode specified by the query -// ---------------------------------------------------------------------------- -void CFindUtilChineseECE::ConvertdDataToKeyBoardModeL(CPsQuery& aQuery, - const TDesC& aSearchTargetStr, - TBuf& aOutputNumInterpretationStr) - { - if (iKeyboardMode == EItut) - { - iAlgorithm->GetKeyMap()->GetNumericKeyString(aSearchTargetStr, aOutputNumInterpretationStr); - } - else if (iKeyboardMode == EQwerty) - { - aOutputNumInterpretationStr = aSearchTargetStr; - aOutputNumInterpretationStr.LowerCase(); - } - else - { - - TInt len = -1; - TBuf outBuf; - - iAlgorithm->GetKeyMap()->GetNumericKeyString(aSearchTargetStr, outBuf); - - // Always loop thru the lowest length - if (aSearchTargetStr.Length() > aQuery.Count() ) - { - len = aQuery.Count(); - } - else - { - len = aSearchTargetStr.Length(); - } - - // Interprete search target str according to the query char mode - for (TInt i = 0; i < len; i++) - { - if (aQuery.GetItemAtL(i).Mode() == EItut) - { - aOutputNumInterpretationStr.Append(outBuf[i]); - } - else - { - aOutputNumInterpretationStr.Append(aSearchTargetStr[i]); - } - } - - aOutputNumInterpretationStr.LowerCase(); - } - } - void CFindUtilChineseECE::GetPartOfQueryL(CPsQuery& aSrcQuery, TInt aStartIndex, TInt aEndIndex, CPsQuery& aDestQuery) { @@ -2624,7 +2516,6 @@ aDestQuery.AppendL(*newItem); } - } else { @@ -2651,6 +2542,7 @@ // ajust index after remove index--; } + break; default: continue; } // switch diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsAlgorithm/Algorithm2/src/chinesefindutils.cpp --- a/predictivesearch/PcsAlgorithm/Algorithm2/src/chinesefindutils.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsAlgorithm/Algorithm2/src/chinesefindutils.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -66,7 +66,11 @@ TCallBack aCallBack, CRepository* aRepository) : - iUid(aUid), iKey(aKey), iCallBack(aCallBack), iRepository(aRepository) + iUid(aUid), + iKey(aKey), + iChangedKey(NCentralRepositoryConstants::KInvalidNotificationId), + iCallBack(aCallBack), + iRepository(aRepository) { } diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsServer/inc/CPcsServer.h --- a/predictivesearch/PcsServer/inc/CPcsServer.h Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsServer/inc/CPcsServer.h Thu Aug 19 09:41:07 2010 +0300 @@ -58,11 +58,6 @@ */ CPcsPluginInterface* PluginInterface(); - /** - * Returns ETrue if there is Chinese variant feature in phone - */ - TBool IsChineseVariant() const; - private: /** @@ -85,11 +80,6 @@ * A PCS algorithm instance (owned) */ CPcsPluginInterface* iPcs; - - /** - * Flag for whether there is Chinese in phone - */ - TBool iIsChineseVariant; }; #endif // End of file diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsServer/src/CPcsServer.cpp --- a/predictivesearch/PcsServer/src/CPcsServer.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsServer/src/CPcsServer.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -44,7 +44,7 @@ self->StartL(KPcsServerName); CleanupStack::Pop(); - PRINT ( _L("End CPcsServer::NewL") ); + PRINT ( _L("End CPcsServer::NewL") ); return self; } @@ -70,18 +70,17 @@ iPcs = CPcsPluginInterface::NewL(); // Check if the phone is chinese feature id installed - iIsChineseVariant = IsChineseFeatureInitilizedL(); + TBool isChineseVariant = IsChineseFeatureInitilizedL(); // Create the plugin for the required algorithm // Matches the ECOM Plugin's display name definition in rss file // Check for the chinese feature id flag. - if(iIsChineseVariant) + if(isChineseVariant) { // Chinese variant phones. Use Algorithm 2 PRINT ( _L("Enter CPcsServer::ConstructL() - Chinese Variant Phone Algorithm Instantiated") ); TBuf algorithmName(KPcsAlgorithm_Chinese); iPcs->InstantiateAlgorithmL(algorithmName); - - + } else { @@ -151,12 +150,3 @@ return chineseFeatureInitialized; } - -// ---------------------------------------------------------------------------- -// CPcsServer::IsChineseVariant() const -// Returns ETrue if there is Chinese variant feature in phone -// ---------------------------------------------------------------------------- -TBool CPcsServer::IsChineseVariant() const - { - return iIsChineseVariant; - } diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/PcsServer/src/CPcsSession.cpp --- a/predictivesearch/PcsServer/src/CPcsSession.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/PcsServer/src/CPcsSession.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -240,10 +240,11 @@ void CPcsSession::GetAsyncPcsResultsL(const RMessage2& aMessage) { __LATENCY_MARK ( _L("CPcsSession::GetAsyncPcsResultsL") ); - PRINT ( _L("Enter CPcsSession::GetAsyncPcsResultsL") ); + PRINT( _L("Enter CPcsSession::GetAsyncPcsResultsL") ); if ( iBufferOverFlow == EFalse ) { + // ------------------------------------------------------------- // Read search query from the message @@ -254,20 +255,10 @@ RPointerArray searchResults; RPointerArray searchSeqs; - - if( !iServer->IsChineseVariant() ) - { - PRINT ( _L("----Algorithm1 search----") ); - iServer->PluginInterface()->PerformSearchL(*iSettings, - *psQuery, - searchResults, - searchSeqs); - } - else - { - PRINT ( _L("----Algorithm2 fake search----") ); - } - + iServer->PluginInterface()->PerformSearchL(*iSettings, + *psQuery, + searchResults, + searchSeqs); CleanupStack::PopAndDestroy( psQuery ); // Dynamic data buffer @@ -393,18 +384,11 @@ // To hold matched location RArray sequenceLoc; - if( !iServer->IsChineseVariant() ) - { - PRINT ( _L("----Algorithm1 searchinput----") ); - iServer->PluginInterface()->SearchInputL(*psQuery, - *data, - searchSeqs, - sequenceLoc); - } - else - { - PRINT ( _L("----Algorithm2 fake searchinput----") ); - } + iServer->PluginInterface()->SearchInputL(*psQuery, + *data, + searchSeqs, + sequenceLoc); + // Delete the search query and search data CleanupStack::PopAndDestroy( data ); @@ -478,7 +462,7 @@ void CPcsSession::SearchMatchStringL(const RMessage2& aMessage) { PRINT ( _L("Enter CPcsSession::SearchMatchStringL") ); - __LATENCY_MARK ( _L("CPcsSession::SearchMatchStringL") ); + //__LATENCY_MARK ( _L("CPcsSession::SearchMatchStringL") ); // ------------------------------------------------------------- @@ -525,7 +509,8 @@ CleanupStack::PopAndDestroy(des); PRINT ( _L("End CPcsSession::SearchMatchStringL") ); - __LATENCY_MARKEND ( _L("CPcsSession::SearchMatchStringL") ); + //__LATENCY_MARKEND ( _L("CPcsSession::SearchMatchStringL") ); + } // ---------------------------------------------------------------------------- diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/adapters/contacts/inc/cpcscontactstore.h --- a/predictivesearch/adapters/contacts/inc/cpcscontactstore.h Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/adapters/contacts/inc/cpcscontactstore.h Thu Aug 19 09:41:07 2010 +0300 @@ -50,6 +50,7 @@ enum { ECreateView, + EFetchAllLinks, EFetchContactBlock, EComplete }; @@ -216,6 +217,11 @@ void ConstructL(CVPbkContactManager& aContactManager, MDataStoreObserver& aObserver,const TDesC& aUri); /** + * Check next state of state machine for contacts retrieval and perform transition + */ + void CheckNextState(); + + /** * Handles the operations for a single contact after it is fetched * @param aContact - The contact from database */ @@ -239,7 +245,8 @@ /** * Fetches the data from contact links from the view */ - void FetchlinksL(); + void FetchAllInitialContactLinksL(); + void FetchContactsBlockL(); /** * Reads the fields to cache from the central repository @@ -260,7 +267,7 @@ /** * Issues request to active object to call RunL method */ - void IssueRequest(); + void IssueRequest( TInt aTimeDelay ); /** * Creates a sort order depending on the fields specified in the cenrep @@ -275,12 +282,15 @@ private: + RPointerArray iInitialContactLinks; /** * Flags for store operations */ - TInt iAllContactLinksCount; - TInt iFetchedContactCount; + TInt iInitialContactCount; // Initial contact count in a view + TInt iFetchBlockLowerNumber; + TInt iFetchBlockUpperNumber; + TInt iVPbkCallbackCount; TBool iContactViewReady; TCachingStatus iOngoingCacheUpdate; diff -r 2666d9724c76 -r d4f567ce2e7c predictivesearch/adapters/contacts/src/cpcscontactstore.cpp --- a/predictivesearch/adapters/contacts/src/cpcscontactstore.cpp Thu Jul 15 18:22:55 2010 +0300 +++ b/predictivesearch/adapters/contacts/src/cpcscontactstore.cpp Thu Aug 19 09:41:07 2010 +0300 @@ -95,16 +95,17 @@ // --------------------------------------------------------------------------------- CPcsContactStore::CPcsContactStore(): CActive( CActive::EPriorityLow ), - iAllContactLinksCount(0), - iFetchedContactCount(0), - iContactViewReady(EFalse) + iInitialContactCount( 0 ), + iFetchBlockLowerNumber( 0 ), + iFetchBlockUpperNumber( 0 ), + iVPbkCallbackCount( 0 ), + iContactViewReady( EFalse ) { PRINT ( _L("Enter CPcsContactStore::CPcsContactStore") ); CActiveScheduler::Add( this ); PRINT ( _L("End CPcsContactStore::CPcsContactStore") ); } - // --------------------------------------------------------------------------------- // CPcsContactStore::ConstructL() // 2nd phase constructor @@ -135,7 +136,7 @@ // Initial state iNextState = ECreateView; - IssueRequest(); + IssueRequest( 0 ); FeatureManager::InitializeLibL(); if( FeatureManager::FeatureSupported( KFeatureIdffContactsMycard ) ) @@ -155,26 +156,19 @@ PRINT ( _L("Enter CPcsContactStore::~CPcsContactStore") ); delete iContactViewBase; - iContactViewBase = NULL; - delete iSortOrder; - iSortOrder = NULL; - - delete iSimContactItems; - iSimContactItems = NULL ; - + delete iSimContactItems; delete iWait; - iWait = NULL; - delete iUri; - iUri = NULL; iTimer.Cancel(); iTimer.Close(); iFieldsToCache.Close(); iFs.Close(); - + + iInitialContactLinks.ResetAndDestroy(); + if(IsActive()) { Deque(); @@ -185,7 +179,6 @@ PRINT ( _L("End CPcsContactStore::~CPcsContactStore") ); } - // --------------------------------------------------------------------------------- // Handles addition/deletion/modification of contacts // --------------------------------------------------------------------------------- @@ -193,43 +186,36 @@ TVPbkContactStoreEvent aStoreEvent) { PRINT ( _L("Enter CPcsContactStore::HandleStoreEventL") ); - - switch (aStoreEvent.iEventType) - { + + PRINT2 ( _L("CPcsContactStore::HandleStoreEventL: URI=%S, event TVPbkContactStoreEventType::%d received"), + &*iUri, aStoreEvent.iEventType); + + switch (aStoreEvent.iEventType) + { case TVPbkContactStoreEvent::EContactAdded: + case TVPbkContactStoreEvent::EGroupAdded: { - PRINT ( _L("Add contact/group event received") ); - // Observer will be notified once the cache update is complete iOngoingCacheUpdate = ECacheUpdateContactAdded; iContactManager->RetrieveContactL( *(aStoreEvent.iContactLink), *this ); break; } - + case TVPbkContactStoreEvent::EUnknownChanges: - { - iObserver->RemoveAll( *iUri ); + { + iObserver->RemoveAll( *iUri ); + // To indicate that contact view is not ready when unknown changes happens iContactViewReady = EFalse; iContactViewBase->AddObserverL(*this); - } break; + } case TVPbkContactStoreEvent::EContactDeleted: + case TVPbkContactStoreEvent::EGroupDeleted: case TVPbkContactStoreEvent::EContactChanged: - case TVPbkContactStoreEvent::EGroupDeleted: case TVPbkContactStoreEvent::EGroupChanged: { - if ( aStoreEvent.iEventType == TVPbkContactStoreEvent::EContactChanged || - aStoreEvent.iEventType == TVPbkContactStoreEvent::EGroupChanged ) - { - PRINT ( _L("Change contact/group event received") ); - } - else - { - PRINT ( _L("Delete contact/group event received") ); - } - CVPbkContactIdConverter* converter = NULL; TRAPD ( err, converter = CVPbkContactIdConverter::NewL( aContactStore ) ); @@ -295,83 +281,97 @@ } // --------------------------------------------------------------------------- +// Check next state of state machine for contacts retrieval and perform +// transition +// --------------------------------------------------------------------------- +void CPcsContactStore::CheckNextState() +{ + PRINT5 ( _L("CPcsContactStore::CheckNextState(state %d) %d:(%d..%d)/%d"), + iNextState, iVPbkCallbackCount, + iFetchBlockLowerNumber, iFetchBlockUpperNumber, iInitialContactCount ); + + if ( iNextState == EComplete ) + { + return; + } + + // If during the caching of the contacts initially in the view we get some + // contact events for other contact operations from the user, then it can + // happen at the end of the caching process that iCallbackCount > iAllContactLinksCount. + // We assume that it can never be that at the end of the caching it results + // iCallbackCount < iAllContactLinksCount. + + // Check if caching is complete + if( iFetchBlockUpperNumber == iInitialContactCount // All contacts initially in the view were fetched + && iVPbkCallbackCount >= iInitialContactCount ) // We got at least the same amount of callbacks + { + iObserver->UpdateCachingStatus(*iUri, ECachingComplete); + iNextState = EComplete; + IssueRequest( 0 ); + } + // We could have a number of callbacks that is the same of the fetched contacts + // from the view even before we get the all the callbacks for the fetched contacts. + // This can happen for instance if a contact is added by the user. + // With the following condition it will happen just that the fetching of more + // contacts from the initial view is happening before all the callbacks for + // those are received. + else if ( iVPbkCallbackCount >= iFetchBlockUpperNumber ) // Fetch next block + { + iObserver->UpdateCachingStatus(*iUri, ECachingInProgress); + iNextState = EFetchContactBlock; + // Delay the next fetch since contact fetch is CPU intensive, + // this will give other threads a chance to use CPU + IssueRequest( KTimerInterval ); // 100 milliseconds + } + else + { + // Otherwise, just pass through. + } + +} + +// --------------------------------------------------------------------------- // Callback Method. Called when one Retrieve operation is complete // --------------------------------------------------------------------------- void CPcsContactStore::VPbkSingleContactOperationComplete( MVPbkContactOperationBase& aOperation, MVPbkStoreContact* aContact) -{ - iFetchedContactCount++; +{ + PRINT ( _L("Enter CPcsContactStore::VPbkSingleContactOperationComplete") ); - + // We get this incremented even during add/del of contacts during caching + iVPbkCallbackCount++; + // Handle the fetched contact.... TRAPD(err, HandleRetrievedContactL(aContact) ); if( err != KErrNone) { iObserver->UpdateCachingStatus(*iUri, err); } - + MVPbkContactOperationBase* Opr = &aOperation; if ( Opr ) { delete Opr; Opr = NULL; } - - // Update the iNextState variable to proper state - if( iFetchedContactCount == iAllContactLinksCount ) - { - // Fetch complete - // Update the caching status - iObserver->UpdateCachingStatus(*iUri, ECachingComplete); - iNextState = EComplete; - IssueRequest(); - } - else if ( (iFetchedContactCount % KLinksToFetchInOneGo) == 0 ) - { - // Fetch next block - iNextState = EFetchContactBlock; - // Delay the next fetch since contact fetch is CPU intensive, - // this will give other threads a chance to use CPU - if(!IsActive()) - { - iTimer.After( iStatus, KTimerInterval); // 100 milliseconds - SetActive(); - } - } - + CheckNextState(); + + PRINT ( _L("End CPcsContactStore::VPbkSingleContactOperationComplete") ); } // --------------------------------------------------------------------------- -// Callback Method.Called when one Retrieve operation fails. +// Callback Method. Called when one Retrieve operation fails. // --------------------------------------------------------------------------- void CPcsContactStore::VPbkSingleContactOperationFailed( MVPbkContactOperationBase& /*aOperation*/, TInt /*aError*/ ) { PRINT ( _L("Enter CPcsContactStore::VPbkSingleContactOperationFailed") ); - iFetchedContactCount++; + + iVPbkCallbackCount++; - // Update the iNextState variable to proper state - if( iFetchedContactCount == iAllContactLinksCount ) - { - // Fetch complete - iObserver->UpdateCachingStatus(*iUri, ECachingComplete); - iNextState = EComplete; - IssueRequest(); - } - else if ( (iFetchedContactCount % KLinksToFetchInOneGo) == 0 ) - { - // Fetch next block - iNextState = EFetchContactBlock; - // Delay the next fetch since contact fetch is CPU intensive, - // this will give other threads a chance to use CPU - if(!IsActive()) - { - iTimer.After( iStatus, KTimerInterval); // 100 milliseconds - SetActive(); - } - } - + CheckNextState(); + PRINT ( _L("End CPcsContactStore::VPbkSingleContactOperationFailed") ); } @@ -399,10 +399,9 @@ CleanupStack::PopAndDestroy( aContact ); return; } - + CPsData* phoneContact = CPsData::NewL(); - // Fill the contact id CVPbkContactIdConverter* converter = NULL; TRAPD ( err, converter = CVPbkContactIdConverter::NewL( aContact->ParentStore() ) ); @@ -410,7 +409,7 @@ if ( err == KErrNotSupported ) { // simdb domain - PRINT ( _L("SIM domain data received") ); + PRINT ( _L("CPcsContactStore::HandleRetrievedContactL: SIM domain data received") ); // Set the contact link HBufC8* extnInfo = tmpLink->PackLC(); @@ -519,13 +518,11 @@ void CPcsContactStore::GetDataForSingleContactL( MVPbkBaseContact& aContact, CPsData* aPhoneData ) { - for(TInt i =0; i < iFieldsToCache.Count(); i++) { aPhoneData->SetDataL(i, KNullDesC); AddContactFieldsL( aContact, iFieldsToCache[i], aPhoneData); } - } // --------------------------------------------------------------------------- @@ -587,27 +584,58 @@ } // --------------------------------------------------------------------------- +// Fetches all the initial contact links from vpbk +// --------------------------------------------------------------------------- +void CPcsContactStore::FetchAllInitialContactLinksL() +{ + PRINT2 ( _L("CPcsContactStore::FetchAllInitialContactLinksL: URI=%S. Fetching %d contact links"), + &*iUri, iInitialContactCount ); + + __LATENCY_MARK ( _L("CPcsContactStore::FetchAllInitialContactLinksL ==== fetch contact links start") ); + + for(TInt cnt = 0; cnt < iInitialContactCount; cnt++) + { + // Get the contact link + MVPbkContactLink* tempLink = iContactViewBase->CreateLinkLC(cnt); + iInitialContactLinks.AppendL( tempLink ); + CleanupStack::Pop(); + } + + __LATENCY_MARKEND ( _L("CPcsContactStore::FetchAllInitialContactLinksL ==== fetch contact links end") ); + + // No callback to wait for next state + iObserver->UpdateCachingStatus(*iUri, ECachingInProgress); + iNextState = EFetchContactBlock; + IssueRequest( 0 ); +} + +// --------------------------------------------------------------------------- // Fetches the data from the vpbk using the contact links // --------------------------------------------------------------------------- -void CPcsContactStore::FetchlinksL() -{ - - PRINT1 ( _L("CPcsContactStore::Total contacts downloaded = %d"), - iFetchedContactCount ); - - TInt blockCount = iFetchedContactCount + KLinksToFetchInOneGo; +void CPcsContactStore::FetchContactsBlockL() +{ + iFetchBlockLowerNumber = iFetchBlockUpperNumber; + iFetchBlockUpperNumber += KLinksToFetchInOneGo; + if ( iFetchBlockUpperNumber > iInitialContactCount ) + { + iFetchBlockUpperNumber = iInitialContactCount; + } - if( blockCount >= iAllContactLinksCount) - blockCount = iAllContactLinksCount; - - for(TInt cnt = iFetchedContactCount; cnt < blockCount; cnt++) - { - // Retrieve the contact - MVPbkContactLink* tempLink =iContactViewBase->CreateLinkLC(cnt); - iContactManager->RetrieveContactL( *tempLink, *this ); - CleanupStack::PopAndDestroy(); // tempLink - } + PRINT2 ( _L("CPcsContactStore::FetchContactsBlockL: Fetched %d contacts, fetching more until %d"), + iFetchBlockLowerNumber, iFetchBlockUpperNumber ); + for(TInt cnt = iFetchBlockLowerNumber; cnt < iFetchBlockUpperNumber; cnt++) + { + // Retrieve the contact + iContactManager->RetrieveContactL( *iInitialContactLinks[cnt], *this ); + } + + // Destroy the array of temporary contact links when all + // contacts from the initial view are retrieved + if (iFetchBlockUpperNumber == iInitialContactCount) + { + iInitialContactLinks.ResetAndDestroy(); + } } // --------------------------------------------------------------------------- @@ -617,37 +645,42 @@ MVPbkContactViewBase& aView ) { PRINT ( _L("Enter CPcsContactStore::ContactViewReady") ); + iFs.Close(); aView.RemoveObserver(*this); // Get the total number of contacts for this view - TRAPD(err,iAllContactLinksCount = aView.ContactCountL()); + TRAPD(err, iInitialContactCount = aView.ContactCountL()); if(err != KErrNone) { - PRINT( _L("CPcsContactStore::ContactViewReady - Unable to obtain contact count")); + PRINT( _L("CPcsContactStore::ContactViewReady: Unable to obtain Contacts count")); + iObserver->UpdateCachingStatus(*iUri, ECachingCompleteWithErrors); iNextState = EComplete; - IssueRequest(); + IssueRequest( 0 ); return; } - PRINT1 ( _L("Total number of contacts for this view: %d"), iAllContactLinksCount); - if( iAllContactLinksCount == 0) + PRINT1 ( _L("CPcsContactStore::ContactViewReady: Total number of contacts for this view: %d"), + iInitialContactCount ); + if(iInitialContactCount == 0) { - // No Contactsb to cache, hence update the status accordingly + // No Contacts to cache, hence update the status accordingly iObserver->UpdateCachingStatus(*iUri, ECachingComplete); iNextState = EComplete; - IssueRequest(); + IssueRequest( 0 ); return; } - iFetchedContactCount = 0; + iFetchBlockLowerNumber = 0; + iFetchBlockUpperNumber = 0; + iVPbkCallbackCount = 0; // Change the iNextState to fetch the contacts - if( iContactViewReady == EFalse) + if(iContactViewReady == EFalse) { iObserver->UpdateCachingStatus(*iUri, ECachingInProgress); iContactViewReady = ETrue; - iNextState = EFetchContactBlock; - IssueRequest(); + iNextState = EFetchAllLinks; + IssueRequest( 0 ); } PRINT ( _L("End CPcsContactStore::ContactViewReady") ); @@ -657,22 +690,28 @@ // Implements the view unavailable function of MVPbkContactViewObserver // --------------------------------------------------------------------------- void CPcsContactStore::ContactViewUnavailable( - MVPbkContactViewBase& /*aView*/ ) + MVPbkContactViewBase& /*aView*/ ) { PRINT ( _L("Enter CPcsContactStore::ContactViewUnavailable") ); - // Update the caching status to complete + PRINT1 ( _L("CPcsContactStore::ContactViewUnavailable: URI=%S"), + &*iUri ); + + // Update the caching status to cachingComplete, the client of PCS--Cmail can + // perform searching even when contactview of somestore is unavailable. + // For Contacts and Group view we get one of this event brfore ContactViewReady iObserver->UpdateCachingStatus(*iUri, ECachingComplete); iFs.Close(); - PRINT ( _L("End CPcsContactStore::ContactViewUnavailable") ); + + PRINT ( _L("End CPcsContactStore::ContactViewUnavailable") ); } // --------------------------------------------------------------------------- // Implements the add contact function of MVPbkContactViewObserver // --------------------------------------------------------------------------- void CPcsContactStore::ContactAddedToView( - MVPbkContactViewBase& /*aView*/, - TInt /*aIndex*/, - const MVPbkContactLink& /*aContactLink*/ ) + MVPbkContactViewBase& /*aView*/, + TInt /*aIndex*/, + const MVPbkContactLink& /*aContactLink*/ ) { } @@ -680,9 +719,9 @@ // Implements the remove contact function of MVPbkContactViewObserver // --------------------------------------------------------------------------- void CPcsContactStore::ContactRemovedFromView( - MVPbkContactViewBase& /*aView*/, - TInt /*aIndex*/, - const MVPbkContactLink& /*aContactLink*/ ) + MVPbkContactViewBase& /*aView*/, + TInt /*aIndex*/, + const MVPbkContactLink& /*aContactLink*/ ) { } @@ -690,10 +729,12 @@ // Implements the view error function of MVPbkContactViewObserver // --------------------------------------------------------------------------- void CPcsContactStore::ContactViewError( - MVPbkContactViewBase& /*aView*/, - TInt /*aError*/, - TBool /*aErrorNotified*/ ) + MVPbkContactViewBase& /*aView*/, + TInt aError, + TBool /*aErrorNotified*/ ) { + PRINT2 ( _L("CPcsContactStore::ContactViewError: URI=%S, Error=%d"), + &*iUri, aError ); } // --------------------------------------------------------------------------- @@ -702,13 +743,15 @@ void CPcsContactStore::CreateContactFetchViewL() { PRINT ( _L("Enter CPcsContactStore::CreateContactFetchViewL") ); + PRINT1 ( _L("CPcsContactStore::CreateContactFetchViewL: URI=%S"), + &*iUri ); // Create the view definition CVPbkContactViewDefinition* viewDef = CVPbkContactViewDefinition::NewL(); CleanupStack::PushL( viewDef ); - // Create the View Name for the view - // The views are named as PCSView_ + // Create the View Name for the view + // The views are named as PCSView_ HBufC* viewName = HBufC::NewL(KBufferMaxLen); viewName->Des().Append(KPcsViewPrefix); viewName->Des().Append(iUri->Des()); @@ -767,10 +810,9 @@ CleanupStack::Pop(); // iContactViewBase CleanupStack::PopAndDestroy(sortOrder); CleanupStack::PopAndDestroy(textbuffer); - + // Close the resouce File - iResourceFile.Close(); - + iResourceFile.Close(); } else if ( iUri->CompareC(KVPbkDefaultCntDbURI) == 0) { @@ -807,7 +849,7 @@ // Set name for the view viewDef->SetNameL( *viewName ); - __LATENCY_MARK ( _L("CPcsContactStore::CreateContactFetchViewL===== create view start") ); + __LATENCY_MARK ( _L("CPcsContactStore::CreateContactFetchViewL ==== create view start") ); iContactViewBase = iContactManager->CreateContactViewLC( *this, *viewDef, @@ -841,18 +883,29 @@ switch( iNextState) { - case ECreateView : - CreateContactFetchViewL(); - break; + case ECreateView: + PRINT1 ( _L("CPcsContactStore::RunL(ECreateView): URI=%S. Create contact view to fetch data from store"), + &*iUri ); + CreateContactFetchViewL(); + break; + + case EFetchAllLinks: + PRINT1 ( _L("CPcsContactStore::RunL(EFetchAllLinks): URI=%S. Get all contact links in initial view"), + &*iUri ); + FetchAllInitialContactLinksL(); + break; case EFetchContactBlock: - PRINT ( _L("Issuing the fetch request for next block") ); - FetchlinksL(); + PRINT4 ( _L("CPcsContactStore::RunL(EFetchContactBlock): URI=%S. Issuing fetch request for next block of max %d contacts (%d/%d fetched)"), + &*iUri, KLinksToFetchInOneGo, iFetchBlockUpperNumber, iInitialContactCount); + FetchContactsBlockL(); break; case EComplete: - PRINT ( _L("Contacts Caching FINISHED") ); - PRINT_BOOT_PERFORMANCE ( _L("Contacts Caching FINISHED") ); + PRINT3 ( _L("CPcsContactStore::RunL(EComplete): URI=%S. Contacts Caching FINISHED, (%d/%d contacts fetched)"), + &*iUri, iFetchBlockUpperNumber, iInitialContactCount ); + PRINT1_BOOT_PERFORMANCE ( _L("CPcsContactStore::RunL(EComplete): URI=%S. Contacts Caching FINISHED"), + &*iUri ); break; } } @@ -862,11 +915,13 @@ // --------------------------------------------------------------------------------- TInt CPcsContactStore::RunError(TInt /*aError*/) { - PRINT ( _L(" Enter CPcsContactStore:: CPcsContactStore::RunError()") ); + PRINT ( _L("Enter CPcsContactStore::RunError") ); - PRINT1 ( _L(" CPcsContactStore:: RunError(). Completing caching in contacts store %S with status ECachingCompleteWithErrors "), &(iUri->Des())); + PRINT1 ( _L("CPcsContactStore::RunError(): URI=%S. Completing caching with status ECachingCompleteWithErrors"), + &*iUri ); iObserver->UpdateCachingStatus(*iUri, ECachingCompleteWithErrors); - PRINT ( _L(" End CPcsContactStore:: CPcsContactStore::RunError()") ); + + PRINT ( _L("End CPcsContactStore::RunError") ); return KErrNone; } @@ -908,15 +963,31 @@ // --------------------------------------------------------------------------------- // Issues request to active object to call RunL method // --------------------------------------------------------------------------------- -void CPcsContactStore::IssueRequest() +void CPcsContactStore::IssueRequest( TInt aTimeDelay ) { - TRequestStatus* status = &iStatus; - User::RequestComplete( status, KErrNone ); - SetActive(); + if( IsActive() ) // cannot activate allready active object + return; + + if ( 0 == aTimeDelay ) + { + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + } + else + { + PRINT1 ( _L("CPcsContactStore::IssueRequest: Applying delay of %d milliseconds"), + aTimeDelay ); + + iTimer.After( iStatus, aTimeDelay); + } + + SetActive(); } -// Creates a sort order depending on the fields specified in the cenrep -// when calling this function pass the masterList (i.e list containing all the -// vpbk fields) + +// --------------------------------------------------------------------------------- +// Creates a sort order depending on the fields specified +// in the cenrep when calling this function pass the +// masterList (i.e list containing all the vpbk fields) // --------------------------------------------------------------------------------- void CPcsContactStore::CreateSortOrderL(const MVPbkFieldTypeList& aMasterList) {