diff -r 000000000000 -r e686773b3f54 presencecache/presencecacheserver2/src/presencecacheservicestore.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencecache/presencecacheserver2/src/presencecacheservicestore.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,352 @@ +/* +* 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: The cache stores a single array of this type. +* +*/ + + +#include +#include + +#include "presencecacheservicestore.h" +#include "presencecachebuddystore.h" +#include "presencetrace.h" +#include "presenceobjecthelpers.h" + +// --------------------------------------------------------------------------- +// CPresenceCacheServiceStore::NewLC() +// --------------------------------------------------------------------------- +// +EXPORT_C CPresenceCacheServiceStore* CPresenceCacheServiceStore::NewLC() + { + CPresenceCacheServiceStore* self = new( ELeave ) CPresenceCacheServiceStore; + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// --------------------------------------------------------------------------- +// CPresenceCacheServiceStore::NewL() +// --------------------------------------------------------------------------- +// +EXPORT_C CPresenceCacheServiceStore* CPresenceCacheServiceStore::NewL() + { + CPresenceCacheServiceStore* self = NewLC(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CPresenceCacheServiceStore::~CPresenceCacheServiceStore() +// --------------------------------------------------------------------------- +// +CPresenceCacheServiceStore::~CPresenceCacheServiceStore() + { + TInt count = iBuddyStoreCollection.Count(); + for (TInt i=0;i& CPresenceCacheServiceStore::GetObjectCollection() + { + return iBuddyStoreCollection; + } + +// --------------------------------------------------------------------------- +// CPresenceCacheServiceStore::ServiceName() +// --------------------------------------------------------------------------- +// +TPtrC CPresenceCacheServiceStore::ServiceName() const + { + return *iServiceName; + } + +// --------------------------------------------------------------------------- +// CPresenceCacheServiceStore::Count() +// --------------------------------------------------------------------------- +// +TInt CPresenceCacheServiceStore::Count() const + { + return iBuddyStoreCollection.Count(); + } + +// --------------------------------------------------------------------------- +// CPresenceCacheServiceStore::PresenceCount() +// --------------------------------------------------------------------------- +// +TInt CPresenceCacheServiceStore::PresenceCount() const + { + return iPresenceCount; + } + +// --------------------------------------------------------------------------- +// CPresenceCacheServiceStore::AddBlind() +// --------------------------------------------------------------------------- +// +TInt CPresenceCacheServiceStore::AddBlind(CPresenceCacheBuddyStore* aBuddyStore) + { + TRACE( _L("CPresenceCacheServiceStore::AddBlind - begin") ); + // TRACE_1( _L("______identity: %S"), &aBuddyStore->BuddyId() ); + // TRACE_1( _L("______iService: %S"), &iServiceName->Des()); + if (!aBuddyStore) + return KErrArgument; + + iBuddyStoreCollection.Append(aBuddyStore); + + // now update the presence count + if (aBuddyStore->HasPresence()) + { + iPresenceCount++; + } + + TRACE( _L("CPresenceCacheServiceStore::AddBlind - return")); + return KErrNone; + } + + +// --------------------------------------------------------------------------- +// CPresenceCacheServiceStore::AddOrReplacePresenceL() +// --------------------------------------------------------------------------- +// +CPresenceCacheBuddyStore* CPresenceCacheServiceStore::AddOrReplacePresenceL + (MPresenceBuddyInfo2* aBuddyPresInfo) + { + TRACE( _L("CPresenceCacheServiceStore::AddOrReplacePresence - begin") ); + // TRACE_1( _L("______identity: %S"), &(aBuddyPresInfo->BuddyId() )); + // TRACE_1( _L("______iService: %d"), &(iServiceName->Des())); + + CPresenceCacheBuddyStore* newBuddyStore(NULL); + if(!aBuddyPresInfo) + return newBuddyStore; + + TBool oldPresExists(EFalse); + + TInt count = iBuddyStoreCollection.Count(); + for (TInt i=0;iEqualsIdentity(aBuddyPresInfo) ) + { + oldPresExists = (iBuddyStoreCollection[i])->HasPresence(); + iBuddyStoreCollection[i]->SetPresenceBuddyInfo(aBuddyPresInfo); + newBuddyStore = iBuddyStoreCollection[i]; + TRACE( _L("_________Match found") ); + break; + } + } + + //if not edited, we need to add a new buddy store + if (!newBuddyStore) + { + newBuddyStore = CPresenceCacheBuddyStore::NewLC(this, aBuddyPresInfo->BuddyId()); + newBuddyStore->SetPresenceBuddyInfo(aBuddyPresInfo); + iBuddyStoreCollection.Append(newBuddyStore); + CleanupStack::Pop(newBuddyStore); //newBuddyStore + } + + // new presence is certainly added, check whether it was existed + if (!oldPresExists) + { + iPresenceCount++; + } + + TRACE( _L("CPresenceCacheServiceStore::AddOrReplacePresence - return")); + return newBuddyStore; + } + + +// --------------------------------------------------------------------------- +// CPresenceCacheServiceStore::RemoveBlind() +// --------------------------------------------------------------------------- +// +void CPresenceCacheServiceStore::RemoveBlind(CPresenceCacheBuddyStore* aPresenceBuddyInfo) + { + TInt index = iBuddyStoreCollection.Find(aPresenceBuddyInfo); + if (index>-1) + { + delete iBuddyStoreCollection[index]; + iBuddyStoreCollection.Remove(index); + } + } + +// --------------------------------------------------------------------------- +// CPresenceCacheServiceStore::FindAndRemove() +// --------------------------------------------------------------------------- +// +CPresenceCacheBuddyStore* CPresenceCacheServiceStore::FindAndRemove + (const TDesC& aIdentity, TInt& aErr) + { + TRACE( _L("CPresenceCacheServiceStore::FindAndRemove - begin") ); + // TRACE_1( _L("______iService: %S"), &(iServiceName->Des())); + // TRACE_1( _L("______identity: %S"), &(aIdentity )); + TBool oldPresExists(EFalse); + CPresenceCacheBuddyStore* buddyStore(NULL); + aErr = KErrNotFound; + + TInt count = iBuddyStoreCollection.Count(); + for (TInt i=0;iEqualsIdentity(aIdentity) ) + { + oldPresExists = (iBuddyStoreCollection[i])->HasPresence(); + + //only delete presence if there are subscribers + if ((iBuddyStoreCollection[i])->HasSubscribers()) + { + (iBuddyStoreCollection[i])->SetPresenceBuddyInfo(NULL); + buddyStore = iBuddyStoreCollection[i]; + } + else //if there are no subscribers remove the whole package + { + delete iBuddyStoreCollection[i]; + iBuddyStoreCollection.Remove(i); + } + break; + } + } + + // update presence info counts + if(oldPresExists) + { + iPresenceCount--; + aErr = KErrNone; + } + + TRACE_1( _L("CPresenceCacheServiceStore::FindAndRemove - buddyStore=%d"),buddyStore ); + return buddyStore; + } + +// --------------------------------------------------------------------------- +// CPresenceCacheServiceStore::RemoveExpiredBuddyInfos +// --------------------------------------------------------------------------- +// + +void CPresenceCacheServiceStore::RemoveExpiredBuddyInfos( + RPointerArray& aBuddyStores ) + { + TInt count = iBuddyStoreCollection.Count(); + for( TInt i = 0 ; i < count ; ++i ) + { + CPresenceCacheBuddyStore* buddyStore = iBuddyStoreCollection[i]; + MPresenceBuddyInfo2* buddyInfo = buddyStore->PresenceBuddyInfo(); + + if( buddyInfo && + PresenceCacheBuddyUtils::IsBuddyInfoExpired( *buddyInfo ) ) + { + // remove buddy info + buddyStore->SetPresenceBuddyInfo( NULL ); + --iPresenceCount; + if( buddyStore->HasSubscribers() ) + { + aBuddyStores.Append( buddyStore ); // ignore error + } + else + { + delete buddyStore; + iBuddyStoreCollection.Remove( i ); + --i; + --count; + } + } + } + } + +// --------------------------------------------------------------------------- +// CPresenceCacheServiceStore::FindAndGet() +// --------------------------------------------------------------------------- +// +CPresenceCacheBuddyStore* CPresenceCacheServiceStore::FindAndGet( + const TDesC& aIdentity) const + { + TRACE( _L("CPresenceCacheServiceStore::FindAndGet - begin") ); + // TRACE_1( _L("______iService: %S"), &(iServiceName->Des())); + TRACE_1( _L("______identity: %S"), &(aIdentity )); + CPresenceCacheBuddyStore* buddyStore(NULL); + + TInt count = iBuddyStoreCollection.Count(); + for (TInt i=0;iEqualsIdentity(aIdentity)) + { + buddyStore = iBuddyStoreCollection[i]; + break; + } + } + TRACE_1( _L("CPresenceCacheServiceStore::FindAndGet - buddyStore=%d"),buddyStore ); + return buddyStore; + } + +// --------------------------------------------------------------------------- +// CPresenceCacheServiceStore::RemoveAllPresences() +// --------------------------------------------------------------------------- +// +void CPresenceCacheServiceStore::RemoveAllPresences() + { + TRACE( _L("CPresenceCacheServiceStore::RemoveAllPresences - begin") ); + // TRACE_1( _L("______iService: %S"), &(iServiceName->Des())); + + TInt count = iBuddyStoreCollection.Count(); + TRACE_1( _L("______store collection count: %d"), count); + for (TInt i=0;iRemovePresenceBuddyInfo(); + //if it doesnt have subscribers delete this whole object + if(!(iBuddyStoreCollection[i]->HasSubscribers())) + { + delete iBuddyStoreCollection[i]; + iBuddyStoreCollection.Remove(i); + count--; + i--; + } + } + iPresenceCount = 0; + TRACE(_L("CPresenceCacheServiceStore::RemoveAllPresences - end")); + } + +// eof