diff -r 000000000000 -r 094583676ce7 wvuing/wvuiprocess/Src/CCASearchInterfacePC.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/wvuiprocess/Src/CCASearchInterfacePC.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,829 @@ +/* +* Copyright (c) 2006 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: Implementation for PC Search Interface +* +*/ + + + +// INCLUDE FILES +#include "CCASearchInterfacePC.h" +#include "MCASearchBackgroundObserverPC.h" +#include "MCASearchInterface.h" +#include "MCASearchObserverInterfacePC.h" +#include "MCAStoredContacts.h" +#include "CCAStorageManagerFactory.h" +#include "MCAGroupManagerInterface.h" +#include "MCAExtendedStoredGroup.h" +#include "MCAGroupOperations.h" +#include "MCAStoredGroups.h" +#include "ImpsCSPAllErrors.h" +#include "TEnumsPC.h" +#include "MCAServerContactsArrayPC.h" +#include "CCAServerContactsArrayPC.h" + + + +// ============================ MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC: Constructor +// ----------------------------------------------------------------------------- +// +CCASearchInterfacePC::CCASearchInterfacePC( MCASearchInterface* aSearchInterface, + MCABackgroundInterface& aBackgroundInterface, + MCAGroupManagerInterface& aGroupMgrInterface ) + : iSearchInterface( aSearchInterface ), + iBackgroundInterface( aBackgroundInterface ), + iGroupMgrInterface( aGroupMgrInterface ) + { + } + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC: ConstructL +// ----------------------------------------------------------------------------- +// +void CCASearchInterfacePC::ConstructL( ) + { + iStoredGroupsInterface = CCAStorageManagerFactory::GroupListInterfaceL(); + } + + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC: NewL +// ----------------------------------------------------------------------------- +// +CCASearchInterfacePC* CCASearchInterfacePC::NewL( MCASearchInterface* aSearchInterface, + MCABackgroundInterface& aBackgroundInterface, + MCAGroupManagerInterface& aGroupMgrInterface ) + { + + + CCASearchInterfacePC* self = new ( ELeave ) CCASearchInterfacePC( aSearchInterface, + aBackgroundInterface, + aGroupMgrInterface ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + + } + + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC: Destructor +// ----------------------------------------------------------------------------- +// +CCASearchInterfacePC::~CCASearchInterfacePC() + { + if ( iBackgroundObserver ) + { + iBackgroundInterface.UnRegisterBackgroundObserver( this ); + } + // delete searchpairs + + if ( iSearchPairs ) + { + iSearchPairs->ResetAndDestroy(); + delete iSearchPairs; + iSearchPairs = NULL; + } + + } + + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC: StartSearchL +// ----------------------------------------------------------------------------- +// +TInt CCASearchInterfacePC::StartSearchL( TInt aSearchLimit, + MCASearchObserverInterfacePC* aObserver, CSearchPairs* aSearchPairs ) + { + //This code is not yet useful for the existing chat. + //the current calls for searching to the engine are synchronous calls. + AddObserver( aObserver ); + + //For the existing chat application with synchronous calls + //to search, pass NULL as the observer + if ( !aSearchPairs ) + { + aSearchPairs = SearchPairs(); + } + + return iSearchInterface->StartSearchL( *aSearchPairs, aSearchLimit, NULL ); + } + + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC: EndSearchL +// ----------------------------------------------------------------------------- +// +TInt CCASearchInterfacePC::EndSearchL() + { + RemoveObserver(); + return iSearchInterface->EndSearchL(); + } + + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC: SearchNextL +// ----------------------------------------------------------------------------- +// +TInt CCASearchInterfacePC::SearchNextL( TInt aIndex, MCASearchObserverInterfacePC* aObserver ) + { + //This code is not yet useful for the existing chat. + //the current calls for searching to the engine are synchronous calls. + AddObserver( aObserver ); + + //For the existing chat application with synchronous calls + //to search, pass NULL as the observer + return iSearchInterface->SearchNextL( aIndex, NULL ); + } + + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC: AddObserver +// ----------------------------------------------------------------------------- +// +void CCASearchInterfacePC::AddObserver( MCASearchObserverInterfacePC* aObserver ) + { + iSearchObserverPC = aObserver; + } + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC: RemoveObserver +// ----------------------------------------------------------------------------- +// +void CCASearchInterfacePC::RemoveObserver() + { + //Not the owner of observer. so dont delete + iSearchObserverPC = NULL; + } + + + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC: HandleSearchError +// ----------------------------------------------------------------------------- +// +void CCASearchInterfacePC::HandleSearchError( TInt aErrorCode ) + { + if ( iSearchObserverPC ) + { + iSearchObserverPC->HandleSearchError( aErrorCode ); + } + } + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC: HandleSearchFinished +// ----------------------------------------------------------------------------- +// +void CCASearchInterfacePC::HandleSearchFinished( ) + { + if ( iSearchObserverPC ) + { + iSearchObserverPC->HandleSearchFinished(); + } + + } + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC::BackgroundTaskStatus +// ----------------------------------------------------------------------------- +// +TInt CCASearchInterfacePC::BackgroundTaskStatus( TEnumsPC::TCABackgroundTasks aTaskID ) + { + MCABackgroundInterface::TCABackgroundTasks eventSource = ConvertToTCABackgroundTasks( aTaskID ); + return iBackgroundInterface.BackgroundTaskStatus( eventSource ); + } + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC::RegisterBackgroundObserver +// ----------------------------------------------------------------------------- +// +TInt CCASearchInterfacePC::RegisterBackgroundObserver( + MCASearchBackgroundObserverPC* aBackgroundObserver, + TInt aTaskMask, + TInt aEventMask ) + { + iBackgroundObserver = aBackgroundObserver; + TInt status = iBackgroundInterface.RegisterBackgroundObserver( this, + aTaskMask, aEventMask ); + ASSERT( aBackgroundObserver ); + return status; + } + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC::UnRegisterBackgroundObserver +// ----------------------------------------------------------------------------- +// +void CCASearchInterfacePC::UnRegisterBackgroundObserver( + MCASearchBackgroundObserverPC* aBackgroundObserver ) + + { + if ( iBackgroundObserver == aBackgroundObserver ) + { + iBackgroundInterface.UnRegisterBackgroundObserver( this ); + } + } + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC::HandleBackgroundEvent +// ----------------------------------------------------------------------------- +// +void CCASearchInterfacePC::HandleBackgroundEvent( + MCABackgroundInterface::TCABackgroundTasks aEventSource, + MCABackgroundInterface::TCABackgroundStatus aStatus, + TInt aSubTaskNumber, + TInt aLeaveCode +) + { + TEnumsPC::TCABackgroundTasks eventSource = ConvertTCABackgroundTasksToTEnumsPC( aEventSource ); + TEnumsPC::TCABackgroundStatus status = ConvertTCABackgroundStatus( aStatus ); + iBackgroundObserver->HandleBackgroundEventPC( eventSource, + status, aSubTaskNumber, aLeaveCode ); + } + + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC::ConvertToTCABackgroundTasks +// ----------------------------------------------------------------------------- +// +MCABackgroundInterface::TCABackgroundTasks CCASearchInterfacePC:: +ConvertToTCABackgroundTasks( TEnumsPC::TCABackgroundTasks aSource ) + { + MCABackgroundInterface::TCABackgroundTasks eventSource; + switch ( aSource ) + { + case TEnumsPC::EGroupFetch: + { + eventSource = MCABackgroundInterface::EGroupFetch; + break; + } + case TEnumsPC::EPresenceTask: + { + eventSource = MCABackgroundInterface::EPresence; + break; + } + case TEnumsPC::EWhisperSync: + { + eventSource = MCABackgroundInterface::EWhisperSync; + break; + } + case TEnumsPC::EBlockGrantListFetch: + default: + { + eventSource = MCABackgroundInterface::EBlockGrantListFetch; + break; + } + } + + return eventSource; + } + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC::ConvertTCABackgroundTasksToTEnumsPC +// ----------------------------------------------------------------------------- +// +TEnumsPC::TCABackgroundTasks CCASearchInterfacePC::ConvertTCABackgroundTasksToTEnumsPC +( MCABackgroundInterface::TCABackgroundTasks aEventSource ) + { + TEnumsPC::TCABackgroundTasks eventSource; + switch ( aEventSource ) + { + case MCABackgroundInterface::EGroupFetch: + { + eventSource = TEnumsPC::EGroupFetch; + break; + } + case MCABackgroundInterface::EPresence: + { + eventSource = TEnumsPC::EPresenceTask; + break; + } + case MCABackgroundInterface::EWhisperSync: + { + eventSource = TEnumsPC::EWhisperSync; + break; + } + case MCABackgroundInterface::EBlockGrantListFetch: + { + eventSource = TEnumsPC::EBlockGrantListFetch; + break; + } + default: + { + eventSource = TEnumsPC::EFailed; + break; + } + } + + return eventSource; + } + + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC::ConvertTCABackgroundStatus +// ----------------------------------------------------------------------------- +// +TEnumsPC::TCABackgroundStatus CCASearchInterfacePC::ConvertTCABackgroundStatus +( MCABackgroundInterface::TCABackgroundStatus aStatus ) + { + TEnumsPC::TCABackgroundStatus status; + + switch ( aStatus ) + { + case MCABackgroundInterface::EUnknown: + { + status = TEnumsPC::EUnknownStatus; + break; + } + case MCABackgroundInterface::EIdleStarted: + { + status = TEnumsPC::EIdleStarted; + break; + } + case MCABackgroundInterface::EStarting: + { + status = TEnumsPC::EStarting; + break; + } + case MCABackgroundInterface::EWaiting: + { + status = TEnumsPC::EWaiting; + break; + } + case MCABackgroundInterface::ECompleted: + { + status = TEnumsPC::ECompleted; + break; + } + case MCABackgroundInterface::ECancelled: + { + status = TEnumsPC::ECancelled; + break; + } + case MCABackgroundInterface::EFailed: + default: + { + status = TEnumsPC::EFailedStatus; + break; + } + } + + return status; + } + + + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC::SetRequestL +// ----------------------------------------------------------------------------- +// +void CCASearchInterfacePC::SetRequestL( RArray& aSearchCriteriaArray, + CDesCArray& aSearchStringArray ) + { + TInt count = aSearchCriteriaArray.Count(); + ASSERT( count ); + SetSearchPairsL( count ); + + for ( TInt i( 0 ); i < count; i++ ) + { + CImpsSearchRequest* request = CImpsSearchRequest::NewL(); + CleanupStack::PushL( request ); + request->SetRequestL( ConvertToTImpsSearchElement( + aSearchCriteriaArray[i] ), aSearchStringArray[i] ); + iSearchPairs->AppendL( request ); //Takes the ownership + CleanupStack::Pop( request ); + } + + } + + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC::ConvertToTImpsSearchElement +// ----------------------------------------------------------------------------- +// +TImpsSearchElement CCASearchInterfacePC:: +ConvertToTImpsSearchElement( TEnumsPC::TSearchCriteria aElement ) + { + TImpsSearchElement searchElement( EImpsUserID ); + + switch ( aElement ) + { + case TEnumsPC::ESearchGroupName: + { + searchElement = EImpsGroupName; + break; + } + case TEnumsPC::ESearchGroupTopic: + { + searchElement = EImpsGroupTopic; + break; + } + case TEnumsPC::ESearchGroupUserIDJoined: + { + searchElement = EImpsGroupUserIDJoined; + break; + } + case TEnumsPC::ESearchUserName: + { + searchElement = EImpsUserFirstName; + break; + } + + case TEnumsPC::ESearchUserLastName: + { + searchElement = EImpsUserLastName; + break; + } + case TEnumsPC::ESearchUserID: + { + searchElement = EImpsUserID; + break; + } + case TEnumsPC::ESearchUserMobileNumber: + { + searchElement = EImpsUserMobileNumber; + break; + } + case TEnumsPC::ESearchUserEmailAddress: + { + searchElement = EImpsUserEmailAddress; + break; + } + default: + { + break; + } + } + + return searchElement; + } + + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC::SearchPairs +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CSearchPairs* CCASearchInterfacePC::SearchPairs() + { + return iSearchPairs; + } + + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC::SetSearchPairsL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCASearchInterfacePC::SetSearchPairsL( TInt aCount ) + { + if ( iSearchPairs ) + { + iSearchPairs->ResetAndDestroy(); + delete iSearchPairs; + iSearchPairs = NULL; + } + + if ( aCount > 0 ) + { + iSearchPairs = new ( ELeave ) CSearchPairs( aCount ); + } + + } + + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC::IsSearchPairsSet +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CCASearchInterfacePC::IsSearchPairsSet() + { + if ( SearchPairs() ) + { + return ETrue; + } + else + { + return EFalse; + } + } + + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC::GetSearchStringLC +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +HBufC* CCASearchInterfacePC::GetSearchStringLC() + { + HBufC* searchString = HBufC::NewLC( 0 ); + + TInt count = iSearchPairs->Count(); + + for ( TInt i = 0; i < count; i++ ) + { + TPtrC newValue = ( *iSearchPairs )[i]->Value(); + + TInt space = 0; + if ( i < count - 1 ) + { + // Memory needed for space + space = KSpace().Length(); + } + + // Reallocate for adding + searchString = searchString->ReAllocL( + searchString->Length() + newValue.Length() + space ); + + // Update cleanup stack + // we are deliberately calling pop and pushL for + // because we are poping old value and pushing new value + // Codescanner warning ignored + CleanupStack::Pop( ); //searchString + CleanupStack::PushL( searchString ); + + // Append data + TPtr searchStringPtr( searchString->Des() ); + searchStringPtr.Append( newValue ); + if ( i < count - 1 ) + { + // Append space + searchStringPtr.Append( KEmptyDesC ); + } + } + return searchString; + } + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC: FindAnyContactL +// ----------------------------------------------------------------------------- +// +TBool CCASearchInterfacePC::FindAnyContactL( const TDesC& aContactId ) + { + MCAStoredContacts* contacts = + CCAStorageManagerFactory::ContactListInterfaceL(); + if ( contacts->FindAnyContact( aContactId ) ) + { + return ETrue; + } + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC: GetPropertiesL +// ----------------------------------------------------------------------------- +// +TEnumsPC::TImpsCSPAllErrors CCASearchInterfacePC::GetPropertiesL( const TDesC& aGroupId, + CImpsCommonGroupProps*& aCommonProps, + CImpsPrivateGroupProps*& aPrivateProps ) + { + MCAGroupOperations* grOps = iGroupMgrInterface.GroupOperationsL( aGroupId ); + + TInt err( KErrNone ); + + err = grOps->GetPropertiesL( aCommonProps, aPrivateProps ); + TEnumsPC::TImpsCSPAllErrors impsErr = ( TEnumsPC::TImpsCSPAllErrors )err; + return impsErr; + } + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC::GetGroupName +// ----------------------------------------------------------------------------- +// +TPtrC CCASearchInterfacePC::GetGroupNameL( const TDesC& aWvid, TBool& aHasCommonProps, + TEnumsPC::TImpsCSPAllErrors& aImpsError ) + { + // we have the group so we can fetch the properties for it + CImpsPrivateGroupProps* privateProps = NULL; + CImpsCommonGroupProps* commonProps = NULL; + MCAGroupOperations* grOps = + iGroupMgrInterface.GroupOperationsL( aWvid ); + if ( grOps ) + { + aImpsError = ( TEnumsPC::TImpsCSPAllErrors )grOps->GetPropertiesL( + commonProps, privateProps ) ; + if ( commonProps ) + { + aHasCommonProps = ETrue; + return commonProps->GroupName(); + } + else + { + aHasCommonProps = EFalse; + } + + } + return KNullDesC(); //Error condition + } + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC: SetGroupNameL +// ----------------------------------------------------------------------------- +// +TEnumsPC::TImpsCSPAllErrors CCASearchInterfacePC::ConvertImpsErrorToUiEnums( TInt aImpsError ) + { + TEnumsPC::TImpsCSPAllErrors impsErr; + switch ( aImpsError ) + { + case ECSPInsufficientGroupPrivileges: + { + impsErr = TEnumsPC::ECSPInsufficientGroupPrivileges; + break; + } + case ECSPNotSupported: + { + impsErr = TEnumsPC::ECSPNotSupported; + break; + } + case ECSPInvalidParameter: + { + impsErr = TEnumsPC::ECSPInvalidParameter; + break; + } + case 0: + { + impsErr = TEnumsPC::EImpsErrNone; + break; + } + default: + { + impsErr = TEnumsPC::ECSPMultipleErrors; //general errors. + break; + } + } + return impsErr; + } +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC: SetGroupNameL +// ----------------------------------------------------------------------------- +// +void CCASearchInterfacePC::SetGroupNameL( const TDesC& aGroupId, const TDesC& aGroupName ) + { + MCAStoredGroups* storedGroups = + CCAStorageManagerFactory::GroupListInterfaceL(); + MCAExtendedStoredGroup* storedGrp = + static_cast( storedGroups->FindGroup( aGroupId ) ); + storedGrp->SetGroupNameL( aGroupName ); + } +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC: SaveChangesL +// ----------------------------------------------------------------------------- +// +void CCASearchInterfacePC::SaveChangesL( const TDesC& aGroupId ) + { + if ( iStoredGroupsInterface ) + { + MCAExtendedStoredGroup* storedGrp = + static_cast( iStoredGroupsInterface->FindGroup( aGroupId ) ); + if ( storedGrp ) + { + storedGrp->SaveChangesL(); + } + } + } +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC: CreateGroupL +// ----------------------------------------------------------------------------- +// +void CCASearchInterfacePC::CreateGroupL( const TDesC& aGroupId ) + { + if ( iStoredGroupsInterface ) + { + // Ownership not transferred to caller. Hence CodeScanner occasionally gives + //false positives for this issue and the warning is ignored. + MCAExtendedStoredGroup* group = iStoredGroupsInterface->CreateGroupL(); + + if ( group ) + { + CleanupStack::PushL( group ); + group->SetGroupIdL( aGroupId ); + CleanupStack::Pop(); + } + + } + } + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC::GetPairArrayForServerContactsArrayL +// ----------------------------------------------------------------------------- +// +MCAServerContactsArrayPC* CCASearchInterfacePC::GetPairArrayForServerContactsArrayLC() + { + + CCAServerContactsArrayPC* pairsArray = NULL; + + if ( iStoredGroupsInterface ) + { + + RPointerArray groupList; + + CDesCArray* groupNames = new ( ELeave ) CDesCArrayFlat( KArrayGranularity ); + CleanupStack::PushL( groupNames ); + + CDesCArray* groupIds = new ( ELeave ) CDesCArrayFlat( KArrayGranularity ); + CleanupStack::PushL( groupIds ); + + CleanupClosePushL( groupList ); + + + iStoredGroupsInterface->PopulateGroupsListL( groupList ); + + TInt count( groupList.Count() ); + //For each item in the group list get the groupname and group id + for ( TInt index( 0 ); index < count; index++ ) + { + groupNames->AppendL( groupList[ index ]->GroupName() ); + groupIds->AppendL( groupList[ index ]->GroupId() ); + } + + //Codescanner warning ignored since we have used CleanupClosePushL + //to push the groupList + CleanupStack::PopAndDestroy(); // groupList.Close() + + // servercontactsarray takes the ownership. Codescanner warning ignored + CleanupStack::Pop( 2 ); // groupIds,groupNames + + pairsArray = CCAServerContactsArrayPC::NewL( groupNames, groupIds, KNullDesC ); + + CleanupStack::PushL( pairsArray ); + + } + + + //Not owned. Transfer ownership of pairsArray to the caller. + return pairsArray; + + } + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC::FindGroup +// ----------------------------------------------------------------------------- +// +TBool CCASearchInterfacePC::FindGroup( const TDesC& aWvid ) + { + if ( iStoredGroupsInterface ) + { + MCAExtendedStoredGroup* group = + static_cast ( + iStoredGroupsInterface->FindGroup( aWvid ) ); + + if ( group ) + { + return ETrue; + } + } + return EFalse;//error condition or did not find a group by wvid + } + + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC::DeleteGroupL +// ----------------------------------------------------------------------------- +// +TInt CCASearchInterfacePC::DeleteGroupL( const TDesC& aGroupId, TBool aDeleteFromNetwork ) + { + return iGroupMgrInterface.DeleteGroupL( aGroupId, aDeleteFromNetwork ); + } + +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC::IsFavouriteChatGroup +// ----------------------------------------------------------------------------- +// +TBool CCASearchInterfacePC::IsFavouriteChatGroup( const TDesC& aGroupId ) const + { + TBool isFavourite( EFalse ); + + MCAStoredGroup* group = iStoredGroupsInterface->FindGroup( aGroupId ); + if ( group ) + { + isFavourite = ( group->StorageType() == + TStorageManagerGlobals::EStoragePersistent ); + } + return isFavourite; + } +// ----------------------------------------------------------------------------- +// CCASearchInterfacePC::JoinedGroups +// ----------------------------------------------------------------------------- +// +TInt CCASearchInterfacePC::JoinedGroups() + { + return iGroupMgrInterface.JoinedGroups(); + } +// End of File +