diff -r 3104fc151679 -r 9a48e301e94b uiservicetab/vimpstengine/src/cvimpstenginesearchmgrextention.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiservicetab/vimpstengine/src/cvimpstenginesearchmgrextention.cpp Wed Sep 01 12:33:36 2010 +0100 @@ -0,0 +1,615 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Search manager extension for CVIMPSTEngine +* +*/ + +// INCLUDE FILES +#include "cvimpstenginesearchmgrextention.h" + +#include +#include +#include +#include +#include +#include +#include + + +#include "cvimpstenginerequestmapper.h" +#include "cvimpstenginerequest.h" + +#include "vimpstallerrors.h" +#include "tvimpstconsts.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mvimpstenginesearchextentioneventobserver.h" +#include "uiservicetabtracer.h" + + + +// ================= MEMBER FUNCTIONS ======================= +// --------------------------------------------------------- +// CVIMPSTEngineSearchMgrExtention::NewL +// Two-phased constructor. +// --------------------------------------------------------- +CVIMPSTEngineSearchMgrExtention* CVIMPSTEngineSearchMgrExtention::NewL( + MXIMPContext& aPresenceCtx, + CVIMPSTEngineRequestMapper& aRequestMapper) + { + TRACER_AUTO; + CVIMPSTEngineSearchMgrExtention* self = + CVIMPSTEngineSearchMgrExtention::NewLC( + aPresenceCtx, + aRequestMapper + ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------- +// CVIMPSTEngineSearchMgrExtention::NewLC +// Two-phased constructor. +// --------------------------------------------------------- +CVIMPSTEngineSearchMgrExtention* CVIMPSTEngineSearchMgrExtention::NewLC( + MXIMPContext& aPresenceCtx, + CVIMPSTEngineRequestMapper& aRequestMapper) + { + TRACER_AUTO; + CVIMPSTEngineSearchMgrExtention* self = new (ELeave) + CVIMPSTEngineSearchMgrExtention(aPresenceCtx, aRequestMapper); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// --------------------------------------------------------- +// CVIMPSTEngineSearchMgrExtention::ConstructL +// --------------------------------------------------------- +void CVIMPSTEngineSearchMgrExtention::ConstructL() + { + TRACER_AUTO; + + // ximp search plugin + iSearchFeature = MSearchFeature::NewL(&iPresenceCtx); + + iSearch = &iSearchFeature->Search(); + + iAlreadySubscibed = EFalse; + + + } + +// --------------------------------------------------------- +// CVIMPSTEngineSearchMgrExtention::CVIMPSTEngineSearchMgrExtention +// --------------------------------------------------------- +CVIMPSTEngineSearchMgrExtention::CVIMPSTEngineSearchMgrExtention( MXIMPContext& aPresenceCtx, + CVIMPSTEngineRequestMapper& aRequestMapper) + :iPresenceCtx(aPresenceCtx), + iRequestMapper(aRequestMapper), + iSearchSupported(TVIMPSTEnums::ESupportUnKnown) + { + + } + +// --------------------------------------------------------- +// CVIMPSTEngineSearchMgrExtention::~CVIMPSTEngineSearchMgrExtention +// --------------------------------------------------------- +CVIMPSTEngineSearchMgrExtention::~CVIMPSTEngineSearchMgrExtention() + { + TRACER_AUTO; + + iSearchObservers.Reset(); + delete iSearchFeature; + iSearchFeature = NULL; + + } + + +// --------------------------------------------------------- +// CVIMPSTEngineSearchMgrExtention::SearchContactsL +// --------------------------------------------------------- +TInt CVIMPSTEngineSearchMgrExtention::SearchContactsL( RArray& aKeyDataArray ) + { + TRACER_AUTO; + + TInt err = KErrNotSupported; + if (iSearchSupported == TVIMPSTEnums::ESupported) + { + + TInt keydataCount = aKeyDataArray.Count(); + + MXIMPObjectFactory& objFactory = iPresenceCtx.ObjectFactory(); + MSearchObjectFactory& searchObjFact= iSearchFeature->SearchObjectFactory(); + + MXIMPIdentity* searchId = objFactory.NewIdentityLC(); + searchId->SetIdentityL(_L("SEARCH")); + + RPointerArray< MSearchElement > searchList; + CleanupClosePushL( searchList ); + + for( TInt i = 0; iSetIdentityL( data.iSearchKeyData ); + + MSearchElement* srchElement = searchObjFact.NewSearchElementLC(); + if( data.iSearchKey != TVIMPSTEnums::EVIMPSTSearchKeyUknown ) + { + srchElement->SetRequestL( *searchKeyId, ConverttoTSearchKey( data.iSearchKey ) ); + } + else + { + MXIMPIdentity* searchLabel = objFactory.NewIdentityLC(); + searchLabel->SetIdentityL( data.iSearchLabel ); + srchElement->SetRequestL( *searchKeyId, *searchLabel ); + CleanupStack::PopAndDestroy ();//searchLabel + } + searchList.Append(srchElement); + + CleanupStack::Pop();//srchElement + CleanupStack::PopAndDestroy();//searchKeyId + + } + + + TXIMPRequestId reqId = iSearch->SearchL(*searchId,searchList,KMaxSearchLimit ); + + iRequestMapper.CreateRequestL(reqId, ETrue,EVIMPSTXimpOperationSearchContact);// waite here + + CleanupStack::Pop() ; // searchList + searchList.ResetAndDestroy();// searchList + CleanupStack::PopAndDestroy ();//searchId + + err = iReqResult; + } + + return err; + } + + +// ----------------------------------------------------------------------------- +// CVIMPSTEngineSearchMgrExtention::SubscribeForSearchKeysL() +// ----------------------------------------------------------------------------- +// +TInt CVIMPSTEngineSearchMgrExtention::SubscribeForSearchKeysL() + { + TRACER_AUTO; + TRACE( "iSearchSupported: %d" , iSearchSupported ); + TRACE( "iAlreadySubscibed: %d" , iAlreadySubscibed ); + + if ( (iSearchSupported == TVIMPSTEnums::ENotSupported) || iAlreadySubscibed ) + { + TRACE("inside if " ); + return KErrNone; + } + + if( iSearch ) + { + TRACE("inside if(iSearch) " ); + + iAlreadySubscibed = ETrue; + + TXIMPRequestId reqId = iSearch->GetSearchKeysL(); + TRACE( "iSearch->GetSearchKeysL() " ); + + iRequestMapper.CreateRequestL(reqId, ETrue ,EVIMPSTXimpOperationSubscribeSearchKeys);// waite here + } + + if( ( iReqResult != KPREQUESTERRSUCCESSFUL ) && ( iReqResult != KErrNone ) ) + { + iSearchSupported = TVIMPSTEnums::ENotSupported; + } + else + { + iSearchSupported = TVIMPSTEnums::ESupported; + } + + return iReqResult;; + } + +// ----------------------------------------------------------------------------- +// CVIMPSTEngineSearchMgrExtention::IsSupported() +// ----------------------------------------------------------------------------- +// +TVIMPSTEnums::FeatureSupport CVIMPSTEngineSearchMgrExtention::IsSupported() const + { + return iSearchSupported; + } + +// ------------------------------------------------------------------------ +// CVIMPSTEngineSearchMgrExtention::ConverttoTSearchKey +// +// ------------------------------------------------------------------------ +TSearchKey CVIMPSTEngineSearchMgrExtention::ConverttoTSearchKey(TVIMPSTEnums::TVIMPSTSearchKey aKey) + { + TRACER_AUTO; + + TSearchKey ret = EUserFirstName; + switch( aKey ) + { + case TVIMPSTEnums::EVIMPSTFirstName : + { + ret = EUserFirstName; + break; + } + case TVIMPSTEnums::EVIMPSTMiddleName : + { + ret = EUserMiddleName ; + break; + } + case TVIMPSTEnums::EVIMPSTLastName : + { + ret = EUserLastName; + break; + } + case TVIMPSTEnums::EVIMPSTFullName : + { + ret = EUserFullName; + break; + } + case TVIMPSTEnums::EVIMPSTCountry : + { + ret = EUserCountry; + break; + } + case TVIMPSTEnums::EVIMPSTCity : + { + ret = EUserCity; + break; + } + case TVIMPSTEnums::EVIMPSTEmailAddress : + { + ret = EUserEmailAddress; + break; + } + case TVIMPSTEnums::EVIMPSTUser : + { + ret = EUser; + break; + } + case TVIMPSTEnums::EVIMPSTOrganisation : + { + ret = EOrganisation; + break; + } + + case TVIMPSTEnums::EVIMPSTNickName : + { + ret = EUserNickName; + break; + } + case TVIMPSTEnums::EVIMPSTState : + { + ret = EState; + break; + } + case TVIMPSTEnums::EVIMPSTOrganisationUnit : + { + ret = EOrganisationUnit; + break; + } + case TVIMPSTEnums::EVIMPSTBirthday : + { + ret = EBirthday; + break; + } + + default: + { + ret = EUserFirstName ; + } + + } + + return ret; + } + + +// ----------------------------------------------------------------------------- +// CVIMPSTEngineSearchMgrExtention::Type() +// ----------------------------------------------------------------------------- +// +TVIMPSTEnums::ExtentionType CVIMPSTEngineSearchMgrExtention::Type() const + { + return TVIMPSTEnums::ESearch; + } + + +// --------------------------------------------------------- +// CVIMPSTEngineSearchMgrExtention::RegisterObserver +// +// --------------------------------------------------------- +void CVIMPSTEngineSearchMgrExtention::RegisterObserver(MVIMPSTEngineSearchExtentionEventObserver* aObserver) + { + TRACER_AUTO; + + TInt index = iSearchObservers.Find(aObserver); + if( index == KErrNotFound ) + { + iSearchObservers.Append( aObserver ); + } + + } + +// --------------------------------------------------------- +// CVIMPSTEngineSearchMgrExtention::UnRegisterObserver +// +// --------------------------------------------------------- +void CVIMPSTEngineSearchMgrExtention::UnRegisterObserver(MVIMPSTEngineSearchExtentionEventObserver* aObserver) + { + TRACER_AUTO; + + TInt index = iSearchObservers.Find(aObserver); + + if( index >=0 ) + { + iSearchObservers.Remove( index ); + iSearchObservers.Compress(); + } + + } + + + +// --------------------------------------------------------- +// CVIMPSTEngineSearchMgrExtention::HandleSessionContextEventL +// --------------------------------------------------------- +void CVIMPSTEngineSearchMgrExtention::HandleSessionContextEventL(const MXIMPContext& /*aContext*/, + const MXIMPBase& aEvent, + TXimpOperation aXimpOperation/* = EVIMPSTXimpOperationNoOperation*/ ) + { + TRACER_AUTO; + + switch( aEvent.GetInterfaceId() ) + { + + case MXIMPRequestCompleteEvent::KInterfaceId: + { + TRACE("InsideCallbackswitch::MXIMPRequestCompleteEvent"); + if ( (EVIMPSTXimpOperationSearchContact == aXimpOperation) + || (EVIMPSTXimpOperationSubscribeSearchKeys == aXimpOperation) ) + { + const MXIMPRequestCompleteEvent* event = + TXIMPGetInterface< const MXIMPRequestCompleteEvent >::From( + aEvent, MXIMPBase::EPanicIfUnknown ); + + iReqResult = event->CompletionResult().ResultCode(); + const TXIMPRequestId& reqId = event->RequestId(); + // Note:FindRequestId does not pass the ownership. hanece req + // should not be deleted. + CVIMPSTEngineRequest *req = iRequestMapper.FindRequestId( reqId ); + + if ( req ) + { + req->StopWait() ; + iRequestMapper.RemoveRequestId(reqId); + } + } + break; + } + + case MSearchEvent::KInterfaceId: + { + const MSearchEvent* srchEvent = + TXIMPGetInterface< const MSearchEvent >::From + (aEvent, MXIMPBase::EPanicIfUnknown); + TInt count= srchEvent->SearchResultCount(); + const MXIMPIdentity& identity= srchEvent->SearchId(); + TPtrC id=srchEvent->SearchId().Identity(); + RArray resultsArray; + for(TInt i=0;iSearchResult(i); + + TVIMPSTSearchData data = + { + info.GetFieldInfo(EFirstName), + info.GetFieldInfo(ELastName), + info.GetFieldInfo(EEmailAddress) + }; + TRAP_IGNORE( resultsArray.AppendL( data ) ); + } + + //should be done in reuqest complete event for search with erro handling + //also first request complete will be received and then search result event + + for(TInt i=0; i< iSearchObservers.Count(); i++ ) + { + TRAP_IGNORE( iSearchObservers[i]->HandleSearchResultL(resultsArray) ); + TRAP_IGNORE( iSearchObservers[i]->HandleSearchFinishedL( KErrNone ) ); + } + + resultsArray.Close(); // close the array + break; + } + case MSearchKeysEvent::KInterfaceId: + { + const MSearchKeysEvent* searchEvent = + TXIMPGetInterface< const MSearchKeysEvent >::From ( aEvent, + MXIMPBase::EPanicIfUnknown ); + TRAP_IGNORE( ProcessSearchKeysEventL( searchEvent ) ); + break; + } + default: + { + break; + } + } + } + + +// --------------------------------------------------------- +// CVIMPSTEngineSearchMgrExtention::ProcessSearchKeysEventL +// +// --------------------------------------------------------- +void CVIMPSTEngineSearchMgrExtention::ProcessSearchKeysEventL(const MSearchKeysEvent* aSearchKeysEvent) + { + TRACER_AUTO; + + TInt searchKeysCount = aSearchKeysEvent->InfoCount(); + + RArray enumKeyArray; + RPointerArray labelKeyArray; + + CleanupClosePushL( enumKeyArray ); + CleanupClosePushL( labelKeyArray ); + + HBufC* keyLabelText = NULL; + for( TInt i = 0; i < searchKeysCount; i++ ) + { + const MSearchKeyInfo& searchKeyInfo = aSearchKeysEvent->SearchKeyInfo ( i ); + switch( searchKeyInfo.Type() ) + { + case EKey: + { + //change to proper type once done at ximp side + TSearchKey keyValue = searchKeyInfo.Key(); + TVIMPSTEnums::TVIMPSTSearchKey key = ConverttoTVIMPSTSearchKey(keyValue); + enumKeyArray.Append(key); + break; + } + case ELabel: + { + keyLabelText = searchKeyInfo.Label().AllocL(); + + labelKeyArray.Append(keyLabelText); + break; + } + + } + } + + for(TInt i=0; i< iSearchObservers.Count(); i++ ) + { + iSearchObservers[i]->HandleSearchKeysEventL(enumKeyArray, labelKeyArray ); + } + + labelKeyArray.ResetAndDestroy(); + CleanupStack::PopAndDestroy(2); //enumKeyArray, labelKeyArray + + } + +// ------------------------------------------------------------------------ +// CVIMPSTEngineSearchMgrExtention::ConverttoTVIMPSTSearchKey +// +// ------------------------------------------------------------------------ +TVIMPSTEnums::TVIMPSTSearchKey CVIMPSTEngineSearchMgrExtention::ConverttoTVIMPSTSearchKey( TSearchKey aKey) + { + TRACER_AUTO; + + TVIMPSTEnums::TVIMPSTSearchKey retKey = TVIMPSTEnums::EVIMPSTFirstName ; + switch( aKey ) + { + case EUserFirstName: + { + retKey = TVIMPSTEnums::EVIMPSTFirstName; + break; + } + case EUserMiddleName: + { + retKey = TVIMPSTEnums::EVIMPSTMiddleName; + break; + } + case EUserLastName: + { + retKey = TVIMPSTEnums::EVIMPSTLastName; + break; + } + case EUserFullName: + { + retKey = TVIMPSTEnums::EVIMPSTFullName; + break; + } + case EUserCountry: + { + retKey = TVIMPSTEnums::EVIMPSTCountry; + break; + } + case EUserCity: + { + retKey = TVIMPSTEnums::EVIMPSTCity; + break; + } + case EUserEmailAddress: + { + retKey = TVIMPSTEnums::EVIMPSTEmailAddress; + break; + } + case EUser: + { + retKey = TVIMPSTEnums::EVIMPSTUser; + break; + } + case EOrganisation: + { + retKey = TVIMPSTEnums::EVIMPSTOrganisation; + break; + } + + case EUserNickName : + { + retKey = TVIMPSTEnums::EVIMPSTNickName; + break; + } + case EState : + { + retKey = TVIMPSTEnums::EVIMPSTState ; + break; + } + case EOrganisationUnit : + { + retKey = TVIMPSTEnums::EVIMPSTOrganisationUnit; + break; + } + case EBirthday: + { + retKey = TVIMPSTEnums::EVIMPSTBirthday; + break; + } + + default: + { + retKey = TVIMPSTEnums::EVIMPSTFirstName; + } + + } + + return retKey; + } +//---------------------------------------------------------------------------- +// CVIMPSTEngineSearchMgrExtention::SetSupported() +// ----------------------------------------------------------------------------- +// +void CVIMPSTEngineSearchMgrExtention::SetSupported(TVIMPSTEnums::FeatureSupport aSupported) + { + TRACER_AUTO; + if ( aSupported == TVIMPSTEnums::ESupportUnKnown) + { + // at the logout time this flag has to be set to EFalse + iAlreadySubscibed = EFalse; + } + iSearchSupported = aSupported; + } + +// end of file