wvuing/wvuiprocess/Src/CCASearchInterfacePC.cpp
changeset 0 094583676ce7
--- /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<TEnumsPC::TSearchCriteria>&  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<MCAExtendedStoredGroup*>( storedGroups->FindGroup( aGroupId ) );
+    storedGrp->SetGroupNameL( aGroupName );
+    }
+// -----------------------------------------------------------------------------
+// CCASearchInterfacePC: SaveChangesL
+// -----------------------------------------------------------------------------
+//
+void CCASearchInterfacePC::SaveChangesL( const TDesC& aGroupId )
+    {
+    if ( iStoredGroupsInterface )
+        {
+        MCAExtendedStoredGroup* storedGrp =
+            static_cast<MCAExtendedStoredGroup*>( 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<MCAStoredGroup> 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 <MCAExtendedStoredGroup*> (
+                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
+