--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wvuing/wvuipresence/src/CCAPEngListObserver.cpp Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,330 @@
+/*
+* Copyright (c) 2002-2005 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: Manager for presence-list handling
+ * (Contact-list updater/ Attribute-list publisher ).
+ *
+*/
+
+
+
+// INCLUDE FILES
+#include "CCAPEngListObserver.h"
+#include "ChatDebugPrint.h"
+#include "CAPresenceDefinitions.h"
+#include "CAPresenceUtils.h"
+#include "CCAPresenceErrors.h"
+#include "CAPresenceConst.h"
+
+#include "CCAStorageManagerFactory.h"
+#include "MCAStoredContacts.h"
+#include "MCAStoredContact.h"
+#include "MCAContactList.h"
+#include "MCAPresenceUpdater.h"
+
+#include <CPengPresenceNotifier2.h>
+#include <CPEngContactListStore2.h>
+#include <MPEngContactList2.h>
+#include <MPEngContactListObserver2.h>
+#include <MPEngContactListProperties.h>
+#include <PEngWVPresenceAttributes2.h>
+#include <CPEngContactListNotifier2.h>
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCAPEngListObserver::CCAPEngListObserver
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CCAPEngListObserver::CCAPEngListObserver(
+ CPEngPresenceNotifier2& aAttributeNotifier,
+ RArray<TUint32>& aHandledAttributes,
+ MCAPresenceUpdater& aUpdater )
+ : iAttributeNotifier( aAttributeNotifier ),
+ iAttributes( aHandledAttributes ),
+ iPresenceUpdater( aUpdater )
+ {
+ CHAT_DP_FUNC_ENTER( "CCAPEngListObserver" );
+ CHAT_DP_FUNC_DONE( "CCAPEngListObserver" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCAPEngListObserver::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCAPEngListObserver::ConstructL( CPEngNWSessionSlotID2* aSessionSlotID )
+ {
+ CHAT_DP_FUNC_ENTER( "ConstructL" );
+
+ iStoredContacts = CCAStorageManagerFactory::ContactListInterfaceL();
+ iActiveListId = KNullDesC().AllocL();
+
+ iPEngContactListNotifier =
+ CPEngContactListNotifier2::NewL( *aSessionSlotID );
+ iPEngContactListNotifier->AddObserver( *this );
+
+ iContactListStore = CPEngContactListStore2::NewL( *aSessionSlotID );
+
+ CHAT_DP_FUNC_DONE( "ConstructL" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCAPEngListObserver::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCAPEngListObserver* CCAPEngListObserver::NewL(
+ CPEngNWSessionSlotID2* aSessionSlotID,
+ CPEngPresenceNotifier2& aAttributeNotifier,
+ RArray<TUint32>& aHandledAttributes,
+ MCAPresenceUpdater& aUpdater )
+ {
+ CHAT_DP_FUNC_ENTER( "NewL" );
+
+ CCAPEngListObserver* self = new( ELeave ) CCAPEngListObserver(
+ aAttributeNotifier,
+ aHandledAttributes,
+ aUpdater );
+
+ CleanupStack::PushL( self );
+ self->ConstructL( aSessionSlotID );
+ CleanupStack::Pop( self );
+
+ CHAT_DP_FUNC_DONE( "NewL" );
+
+ return self;
+ }
+
+// Destructor
+CCAPEngListObserver::~CCAPEngListObserver()
+ {
+ CHAT_DP_FUNC_ENTER( "~CCAPEngListObserver" );
+
+ if ( iPEngContactListNotifier )
+ {
+ iPEngContactListNotifier->Stop();
+ iPEngContactListNotifier->RemoveObserver( *this );
+ }
+
+ delete iContactListStore;
+ delete iPEngContactListNotifier;
+ delete iActiveListId;
+
+ CHAT_DP_FUNC_DONE( "~CCAPEngListObserver" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCAPEngListObserver::SetActiveListIdL
+// Setter for active contact list identifier
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAPEngListObserver::SetActiveListIdL( const TDesC& aListId )
+ {
+ CHAT_DP_FUNC_ENTER( "SetActiveListId" );
+
+ HBufC* tmp = aListId.AllocL();
+ delete iActiveListId;
+ iActiveListId = tmp;
+
+ // restart notifier
+ iPEngContactListNotifier->Stop();
+ iPEngContactListNotifier->Start( *iActiveListId );
+
+ // this method is needed as we might move the getter to here also
+
+ CHAT_DP_FUNC_DONE( "SetActiveListId" );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCAPEngListObserver::SetListIdsL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAPEngListObserver::SetListIds( const MDesCArray& aListIds )
+ {
+ // restart notifier
+ iPEngContactListNotifier->Stop();
+ iPEngContactListNotifier->Start( aListIds );
+ }
+
+// -----------------------------------------------------------------------------
+// CCAPEngListObserver::ClearListNotifier
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAPEngListObserver::ClearListNotifier()
+ {
+ iPEngContactListNotifier->Stop();
+ }
+
+// -----------------------------------------------------------------------------
+// CCAPEngListObserver::StartNotifier
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAPEngListObserver::StartNotifier( const TDesC& aListId )
+ {
+ iPEngContactListNotifier->Stop();
+ iPEngContactListNotifier->Start( aListId );
+ }
+
+// -----------------------------------------------------------------------------
+// CCAPEngListObserver::AddL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAPEngListObserver::AddL( const TDesC& aListId )
+ {
+ if ( iPEngContactListNotifier->IsActive() )
+ {
+ TInt err = iPEngContactListNotifier->Add( aListId );
+ if ( err != KErrAlreadyExists )
+ {
+ User::LeaveIfError( err );
+ }
+ }
+ else
+ {
+ User::LeaveIfError( iPEngContactListNotifier->Start( aListId ) );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCAPEngListObserver::Remove
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAPEngListObserver::Remove( const TDesC& aListId )
+ {
+ iPEngContactListNotifier->Remove( aListId );
+ }
+
+// -----------------------------------------------------------------------------
+// CCAPEngListObserver::HandleContactListChangeL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAPEngListObserver::HandleContactListChangeL(
+ CPEngContactListNotifier2& /*aNotifier*/,
+ const TDesC& aContactListName )
+ {
+ CHAT_DP_FUNC_ENTER( "HandleContactListChangeL" );
+
+ MPEngContactList2& list =
+ iContactListStore->ContactListL( aContactListName );
+
+ // fetch list id and display name
+ MPEngContactListProperties& prop = list.ListProperties();
+ TPtrC id( aContactListName );
+ TPtrC name( KNullDesC );
+ prop.DisplayName( name );
+ CHAT_DP( D_CHAT_LIT( "**listchange: %S [%S]" ), &id, &name );
+
+ MCAContactList* storedList = iStoredContacts->FindContactList( id );
+ if ( storedList )
+ {
+ // list found, update displayname if it's changed
+ if ( name.Length() > 0 &&
+ storedList->DisplayName().Compare( name ) != 0 )
+ {
+ storedList->SetDisplayNameL( name );
+ }
+ }
+ else
+ {
+ // list not found, nothing to update
+ return;
+ }
+
+ // check removed contacts
+ const MDesCArray& removed = list.RemovedContacts();
+ TInt removeCount( removed.MdcaCount() );
+ CHAT_DP( D_CHAT_LIT( "removed wvids count %d" ), removeCount );
+ for ( TInt i( 0 ); i < removeCount; ++i )
+ {
+ TPtrC id( removed.MdcaPoint( i ) );
+ CHAT_DP( D_CHAT_LIT( "HandleContactListChangeL - removed id %S" ), &id );
+ iStoredContacts->RemoveContact( aContactListName, id );
+
+ // remove from attribute notifier
+ iAttributeNotifier.Remove( id );
+ }
+
+ // check added contacts
+ const MDesCArray& added = list.AddedContacts();
+ TInt addCount( added.MdcaCount() );
+
+ CHAT_DP( D_CHAT_LIT( "added wvids count %d" ), addCount );
+ for ( TInt ii( 0 ); ii < addCount; ++ii )
+ {
+ TInt i( list.FindContact( added.MdcaPoint( ii ) ) );
+ // might be already removed
+ if ( i != KErrNotFound )
+ {
+ const MPEngContactItem& contact = list.ContactItem( i );
+ TPtrC id( contact.Id() );
+ TPtrC nick( contact.NickName() );
+ CHAT_DP( D_CHAT_LIT( "HandleContactListChangeL - contact id %S, \
+ nick %S" ), &id, &nick );
+
+ // add to attribute notifier
+ TInt err = iAttributeNotifier.Add( id, iAttributes.Array() );
+
+ // updates existing contact or creates new
+ iStoredContacts->CreateContactL( aContactListName, nick, id );
+ // make sure to update the presence
+ iPresenceUpdater.UpdatePresenceL( id );
+
+ // leave with error.
+ // Ignore inactive notifier (manual refresh mode)
+ User::LeaveIfError( err == KErrNotReady ? KErrNone : err );
+ }
+ }
+
+ CHAT_DP_FUNC_DONE( "HandleContactListChangeL" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCAPEngListObserver::HandleContactListError
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAPEngListObserver::HandleContactListError( TInt aError,
+ CPEngContactListNotifier2& /*aNotifier*/ )
+ {
+ // ignored
+ CHAT_DP_FUNC_ENTER( "HandleContactListNotifyError" );
+
+ // but print some debug information
+ CHAT_DP( D_CHAT_LIT( "CCAPEngListObserver::HandleContactListNotifyError - \
+ Got error %d" ), aError );
+
+ CHAT_DP_FUNC_DONE( "HandleContactListNotifyError" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCAPEngListObserver::SkipStorageRemoval
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAPEngListObserver::SkipStorageRemoval()
+ {
+ iSkipRemoval = ETrue;
+ }
+
+// End of File