diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presenceplugincontacts.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presenceplugincontacts.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,507 @@ +/* +* Copyright (c) 2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "presenceplugincontacts.h" +#include "presencelogger.h" +#include "presenceplugincontactsobs.h" +#include "presenceplugincontactstatehandler.h" +#include "presencepluginlocalstore.h" +// States +#include "presenceplugincontactstate.h" +#include "presenceplugincontactstateopen.h" +#include "presenceplugincontactstateresolve.h" +#include "presenceplugincontactstatesearch.h" +#include "presenceplugincontactstateend.h" + +const TInt KSDMASPSMaxPropertyLength = 512; + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencePluginContacts::CPresencePluginContacts() +// --------------------------------------------------------------------------- +// +CPresencePluginContacts::CPresencePluginContacts( TInt aServiceId, + MPresencePluginContactsObs& aObserver ) + : CActive( CActive::EPriorityStandard ), + iServiceId( aServiceId ), + iObserver( &aObserver ) + { + CActiveScheduler::Add(this); + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContacts::ConstructL() +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::ConstructL( const TDesC& aServiceName ) + { + DP_SDA( "CPresencePluginContacts::ConstructL()" ); + + iServiceName = aServiceName.AllocL(); + CVPbkContactStoreUriArray* uriArray = CVPbkContactStoreUriArray::NewLC(); + HBufC* storeName = ContactStoreNameL(); + + if ( NULL != storeName ) + { + DP_SDA2( "CPresencePluginContacts::ConstructL() %S", storeName ); + CleanupStack::PushL( storeName ); + uriArray->AppendL( TVPbkContactStoreUriPtr( *storeName ) ); + CleanupStack::PopAndDestroy( storeName ); + } + else + { + DP_SDA( "CPresencePluginContacts::ConstructL() Use default contact store uri" ); + uriArray->AppendL( TVPbkContactStoreUriPtr( + VPbkContactStoreUris::DefaultCntDbUri() ) ); + } + iContactManager = CVPbkContactManager::NewL( *uriArray ); + CleanupStack::PopAndDestroy( uriArray ); + + DP_SDA( "CPresencePluginContacts::ConstructL() -exit" ); + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContacts::NewL() +// --------------------------------------------------------------------------- +// +CPresencePluginContacts* CPresencePluginContacts::NewL( TInt aServiceId, + const TDesC& aServiceName, MPresencePluginContactsObs& aObserver ) + { + CPresencePluginContacts* self = + CPresencePluginContacts::NewLC( aServiceId, aServiceName, aObserver ); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContacts::NewLC() +// --------------------------------------------------------------------------- +// +CPresencePluginContacts* CPresencePluginContacts::NewLC( TInt aServiceId, + const TDesC& aServiceName, MPresencePluginContactsObs& aObserver ) + { + CPresencePluginContacts* self = + new( ELeave ) CPresencePluginContacts( aServiceId, aObserver ); + CleanupStack::PushL( self ); + self->ConstructL( aServiceName ); + return self; + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContacts::~CPresencePluginContacts() +// --------------------------------------------------------------------------- +// +CPresencePluginContacts::~CPresencePluginContacts() + { + DP_SDA("CPresencePluginContacts::~CPresencePluginContacts"); + + delete iServiceName; + delete iSearchText; + delete iContactOperation; + iStoreContactArray.ResetAndDestroy(); + delete iStateHandler; + delete iFieldTypeRefList; + delete iContactLinkArray; + if( iContactManager ) + { + TRAP_IGNORE( iContactManager->ContactStoresL().CloseAll( *this ) ); + } + delete iContactManager; + iClientStatus = NULL; + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContacts::PresenceIdStoredL +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::IsPresenceIdStoredL( + const TDesC16& aPresenceId, TRequestStatus& aStatus ) + { + DP_SDA( "CPresencePluginContacts::IsPresenceIdStoredL -Enter" ); + + iOperation = EOperationIsPresenceStoredToContacts; + + aStatus = KRequestPending; + iClientStatus = &aStatus; + + iSearchText = HBufC::NewL( + iServiceName->Length() + aPresenceId.Length() + 1 ); + TPtr searchTextPtr = iSearchText->Des(); + searchTextPtr.Copy( *iServiceName ); + searchTextPtr.Append( ':' ); + searchTextPtr.Append( aPresenceId ); + + iFieldTypeRefList = CVPbkFieldTypeRefsList::NewL(); + iFieldTypeRefList->AppendL( + *iContactManager->FieldTypes().Find( R_VPBK_FIELD_TYPE_IMPP ) ); + + iStateHandler = CPresencePluginContactStateHandler::NewL(); + + iStateHandler->AddStateL( new( ELeave ) CPresencePluginContactStateOpen( + *this, *iStateHandler ) ); + iStateHandler->AddStateL( new( ELeave ) CPresencePluginContactStateSearch( + *this, *iStateHandler ) ); + iStateHandler->AddStateL( new( ELeave ) CPresencePluginContactStateResolve( + *this, *iStateHandler ) ); + iStateHandler->AddStateL( new( ELeave ) CPresencePluginContactStateEnd( + *this, *iStateHandler ) ); + + iStateHandler->Start( &iStatus ); + SetActive(); + + DP_SDA( "CPresencePluginContacts::IsPresenceIdStoredL - exit" ); + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContacts::ContactStoreNameL +// --------------------------------------------------------------------------- +// +HBufC* CPresencePluginContacts::ContactStoreNameL() + { + DP_SDA( "CPresencePluginContacts::ContactStoreNameL()" ); + + HBufC* storeName = NULL; + CSPSettings* spSettings = CSPSettings::NewLC(); + CSPProperty* property = CSPProperty::NewLC(); + + TInt err = spSettings->FindPropertyL( iServiceId, + EPropertyContactStoreId, + *property ); + + if ( KErrNone == err ) + { + storeName = HBufC::NewL( KSDMASPSMaxPropertyLength ); + TPtr16 storeNamePtr = storeName->Des(); + err = property->GetValue( storeNamePtr ); + } + + CleanupStack::PopAndDestroy( property ); + CleanupStack::PopAndDestroy( spSettings ); + + return storeName; + } + + +// --------------------------------------------------------------------------- +// From class MPresenceContactsContextBase. +// CPresencePluginContacts::Open +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::OpenL() + { + DP_SDA( "CPresencePluginContacts::Open()" ); + iContactManager->ContactStoresL().OpenAllL( *this ); + } + + +// --------------------------------------------------------------------------- +// From class MPresenceContactsContextBase. +// CPresencePluginContacts::Search +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::SearchL() + { + DP_SDA( "CPresencePluginContacts::Search()" ); + iContactOperation = iContactManager->FindL( + *iSearchText, *iFieldTypeRefList, *this ); + } + + +// --------------------------------------------------------------------------- +// From class MPresenceContactsContextBase. +// CPresencePluginContacts::ContactLinkArray +// --------------------------------------------------------------------------- +// +const MVPbkContactLinkArray& CPresencePluginContacts::ContactLinkArrayL() + { + if ( NULL == iContactLinkArray ) + { + User::Leave( KErrNotReady ); + } + return *iContactLinkArray; + } + + +// --------------------------------------------------------------------------- +// From class MPresenceContactsContextBase. +//CPresencePluginContacts::RetrieveContactL +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::RetrieveContactL( + const MVPbkContactLink& aContactLink ) + { + DP_SDA( "CPresencePluginContacts::RetrieveContactL()" ); + iContactOperation = + iContactManager->RetrieveContactL( aContactLink, *this ); + } + + +// --------------------------------------------------------------------------- +// From class MVPbkContactStoreListObserver. +// CPresencePluginContacts::OpenComplete +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::OpenComplete() + { + DP_SDA( "CPresencePluginContacts::OpenComplete()" ); + iStateHandler->State()->Complete(); + } + + +// --------------------------------------------------------------------------- +// From class MVPbkContactStoreObserver. +// CPresencePluginContacts::StoreReady +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::StoreReady( + MVPbkContactStore& /*aContactStore*/ ) + { + DP_SDA( "CPresencePluginContacts::StoreReady()" ); + } + + +// --------------------------------------------------------------------------- +// From class MVPbkContactStoreObserver. +// CPresencePluginContacts::StoreUnavailable +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::StoreUnavailable( + MVPbkContactStore& /*aContactStore*/, TInt /*aReason*/ ) + { + DP_SDA( "CPresencePluginContacts::StoreUnavailable()" ); + } + + +// --------------------------------------------------------------------------- +// From class MVPbkContactStoreObserver. +// CPresencePluginContacts::HandleStoreEventL +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::HandleStoreEventL( + MVPbkContactStore& /*aContactStore*/, + TVPbkContactStoreEvent /*aStoreEvent*/ ) + { + DP_SDA( "CPresencePluginContacts::HandleStoreEventL()" ); + } + + +// --------------------------------------------------------------------------- +// From class MVPbkContactFindObserver. +// CPresencePluginContacts::FindCompleteL +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::FindCompleteL( MVPbkContactLinkArray* aResults ) + { + DP_SDA( "CPresencePluginContacts::FindCompleteL()" ); + + delete iContactLinkArray; + iContactLinkArray = NULL; + iContactLinkArray = aResults; + + delete iContactOperation; + iContactOperation = NULL; + + iStateHandler->State()->Complete(); + } + + +// --------------------------------------------------------------------------- +// From class MVPbkContactFindObserver. +// CPresencePluginContacts::FindFailed +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::FindFailed( TInt aError ) + { + DP_SDA( "CPresencePluginContacts::FindFailed()" ); + + delete iContactOperation; + iContactOperation = NULL; + + iStateHandler->State()->Error( aError ); + } + + +// --------------------------------------------------------------------------- +// From class MVPbkSingleContactOperationObserver. +// CPresencePluginContacts::VPbkSingleContactOperationComplete +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::VPbkSingleContactOperationComplete( + MVPbkContactOperationBase& aOperation, + MVPbkStoreContact* aContact ) + { + DP_SDA( "CPresencePluginContacts::VPbkSingleContactOperationComplete()" ); + + if ( iContactOperation == &aOperation ) + { + delete iContactOperation; + iContactOperation = NULL; + } + + TInt error = iStoreContactArray.Append( aContact ); + if ( KErrNone != error ) + { + delete aContact; + aContact = NULL; + iStateHandler->State()->Error( error ); + } + else + { + iStateHandler->State()->Complete(); + } + } + + +// --------------------------------------------------------------------------- +// From class MVPbkSingleContactOperationObserver. +// CPresencePluginContacts::VPbkSingleContactOperationFailed +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::VPbkSingleContactOperationFailed( + MVPbkContactOperationBase& aOperation, + TInt aError ) + { + DP_SDA( "CPresencePluginContacts::VPbkSingleContactOperationFailed()" ); + + if ( iContactOperation == &aOperation ) + { + delete iContactOperation; + iContactOperation = NULL; + } + + iStateHandler->State()->Error( aError); + } + + +// --------------------------------------------------------------------------- +// From class CActive. +// CPresencePluginContacts::RunL +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::RunL() + { + DP_SDA2( "CPresencePluginContacts::RunL - status %d", iStatus.Int() ); + + TBool result( EFalse ); + TBool found( EFalse ); + CPresencePluginLocalstore* localStore = NULL; + TInt error = iStatus.Int(); + + switch( iOperation ) + { + case EOperationIsPresenceStoredToContacts: + DP_SDA( "CPresencePluginContacts::RunL -EOperationIsPresenceStoredToContacts" ); + + if ( KErrNone == error ) + { + localStore = CPresencePluginLocalstore::NewLC( *iServiceName ); + + for ( TInt i( 0 ); ( i < iStoreContactArray.Count() ) && !found; i++ ) + { + MVPbkContactLink* link = iStoreContactArray[ i ]->CreateLinkLC(); + CVPbkContactIdConverter* converter = + CVPbkContactIdConverter::NewL( link->ContactStore() ); + CleanupStack::PushL( converter ); + + TInt32 id = converter->LinkToIdentifier( *link ); + if ( localStore->SeekRowAtContactColL( id ) ) + { + found = ETrue; + result = ETrue; + } + CleanupStack::PopAndDestroy( converter ); + CleanupStack::PopAndDestroy(); // link + } + + CleanupStack::PopAndDestroy( localStore ); + } + if ( KErrNotFound == error ) + { + error = KErrNone; + } + iObserver->RequestComplete( &result, iOperation, error ); + break; + default: + break; + } + // Operation completed. + // State handler not needet anymore + delete iStateHandler; + iStateHandler = NULL; + // Close contact stores + iContactManager->ContactStoresL().CloseAll( *this ); + + User::RequestComplete( iClientStatus, error ); + } + + +// --------------------------------------------------------------------------- +// From class CActive. +// CPresencePluginContacts::DoCancel +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::DoCancel() + { + if ( iClientStatus && *iClientStatus == KRequestPending ) + { + User::RequestComplete( iClientStatus, KErrCancel ); + } + iStateHandler->Complete( KErrCancel ); + } + + +// --------------------------------------------------------------------------- +// From class CActive. +// CPresencePluginContacts::RunError +// --------------------------------------------------------------------------- +// +TInt CPresencePluginContacts::RunError( TInt aError ) + { + DP_SDA2( "CPresencePluginContacts::RunError - status %d", aError ); + User::RequestComplete( iClientStatus, aError ); + return KErrNone; + } + +// End of file