--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ccservices/cmsservices/cmsengine/Server/src/cmsfindlinkedcontact.cpp Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,377 @@
+/*
+* Copyright (c) 2009 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: This class provides interface to find the First Contact in DefaultCntDbUri
+* which is linked to an XSPId.
+*
+*/
+
+
+// INCLUDES
+#include <MVPbkContactStore.h>
+#include <CVPbkContactManager.h>
+#include <VPbkContactStoreUris.h>
+#include <CVPbkContactLinkArray.h>
+#include <MVPbkContactStoreList.h>
+#include <CVPbkFieldTypeRefsList.h>
+#include <VPbkEng.rsg>
+
+#include <MVPbkContactOperationBase.h>
+#include <MVPbkContactStoreProperties.h>
+#include <TVPbkWordParserCallbackParam.h>
+#include <CVPbkContactStoreUriArray.h>
+#include "cmsfindlinkedcontact.h"
+#include "cmsdebug.h"
+
+#include <MVPbkStoreContact.h>
+#include <MVPbkContactStore.h>
+#include <MVPbkContactStoreProperties.h>
+#include <VPbkContactStoreUris.h>
+#include <MVPbkContactFieldUriData.h>
+#include <MVPbkContactLink.h>
+
+// CONSTANTS
+const TInt KArrayGranularity = 2;
+
+
+// ----------------------------------------------------------
+// CCmsLinkedContact::NewL
+//
+// ----------------------------------------------------------
+//
+CCmsFindLinkedContact* CCmsFindLinkedContact::NewL( CVPbkContactManager& aContactManager )
+ {
+ CCmsFindLinkedContact* self = new ( ELeave ) CCmsFindLinkedContact(
+ aContactManager );
+ return self;
+ }
+
+
+// ----------------------------------------------------------
+// CCmsFindLinkedContact::CCmsFindLinkedContact
+//
+// ----------------------------------------------------------
+//
+CCmsFindLinkedContact::CCmsFindLinkedContact( CVPbkContactManager& aContactManager )
+: CActive( CActive::EPriorityHigh ),
+iContactManager( aContactManager ),
+iState( ERetreiveXSPInfo )
+
+ {
+ CActiveScheduler::Add( this );
+ }
+
+// ----------------------------------------------------------
+// CCmsFindLinkedContact::~CCmsFindLinkedContact
+//
+// ----------------------------------------------------------
+//
+CCmsFindLinkedContact::~CCmsFindLinkedContact()
+ {
+ if ( iWait.IsStarted() )
+ {
+ iWait.AsyncStop();
+ }
+ Cancel();
+ delete iContactLink;
+ iOperationArray.ResetAndDestroy();
+ delete iRetreivedXSPContact;
+ }
+
+// ----------------------------------------------------------
+// CCmsFindLinkedContact::FetchLinkedContactL
+//
+// ----------------------------------------------------------
+//
+const MVPbkContactLink& CCmsFindLinkedContact::FetchLinkedContactL(
+ const MVPbkContactLink& aXSPContactLink )
+ {
+ __ASSERT_DEBUG (ERetreiveXSPInfo == iState,
+ User::Leave( KErrGeneral ));
+
+ //if the XSP contact is linked to the a contact in DefaultCntDbUri(),
+ // then we return the contact in DefaultCntDbUri()
+ //else we return the same XSP Contact
+ if ( iContactLink )
+ {
+ delete iContactLink;
+ iContactLink = NULL;
+ }
+ iContactLink = aXSPContactLink.CloneLC();
+ CleanupStack::Pop();
+ if ( !iWait.IsStarted() )
+ {
+ //Start the operation
+ IssueRequest();
+
+ //Start waiting here till the operation completes
+ iWait.Start();
+ }
+
+ __ASSERT_DEBUG (NULL != iContactLink,
+ User::Leave( KErrGeneral ));
+ //return the contact link
+ return *iContactLink;
+ }
+
+
+// --------------------------------------------------------------------------
+// CCmsFindLinkedContact::IssueRequest
+// --------------------------------------------------------------------------
+//
+void CCmsFindLinkedContact::IssueRequest()
+ {
+ TRequestStatus* status = &iStatus;
+ User::RequestComplete( status, KErrNone );
+ SetActive();
+ }
+
+
+// --------------------------------------------------------------------------
+// CCmsFindLinkedContact::RunL
+// --------------------------------------------------------------------------
+//
+void CCmsFindLinkedContact::RunL()
+ {
+ PRINT1( _L( "CCmsFindLinkedContact::RunL(): %d" ), iState );
+ switch( iState )
+ {
+ case ERetreiveXSPInfo:
+ {
+ MVPbkContactOperationBase* operation =
+ iContactManager.RetrieveContactL( *iContactLink, *this );
+ CleanupStack::PushL( operation );
+ iOperationArray.AppendL( operation );
+ CleanupStack::Pop( operation );
+ break;
+ }
+
+ case EFindLinkedContact:
+ {
+ __ASSERT_DEBUG (NULL != iRetreivedXSPContact,
+ User::Leave( KErrGeneral ));
+ RetreiveAndFindLinkedContactL( *iRetreivedXSPContact );
+ break;
+ }
+
+ case EComplete:
+ {
+ if ( iWait.IsStarted() )
+ {
+ iWait.AsyncStop();
+ }
+ break;
+ }
+ default:
+ {
+ // Do nothing
+ break;
+ }
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CCmsFindLinkedContact::DoCancel
+// --------------------------------------------------------------------------
+//
+void CCmsFindLinkedContact::DoCancel()
+ {
+ }
+
+// --------------------------------------------------------------------------
+// CVIMPSTStorageVPbkStoreHandler::RunError
+// --------------------------------------------------------------------------
+//
+TInt CCmsFindLinkedContact::RunError( TInt /*aError*/ )
+ {
+ return KErrNone;
+ }
+
+
+// ----------------------------------------------------------
+// CCmsFindLinkedContact::RetreiveAndFindLinkedContactL
+//
+// ----------------------------------------------------------
+//
+void CCmsFindLinkedContact::RetreiveAndFindLinkedContactL(
+ const MVPbkStoreContact& aXSPContact )
+ {
+ TInt fieldCount = aXSPContact.Fields().FieldCount();
+
+ HBufC* xspId = NULL;
+ //Retreive the XSP Id of the Contact
+ for( TInt index = 0 ; index < fieldCount ; index++ )
+ {
+ const MVPbkStoreContactField& contactField = aXSPContact.Fields().FieldAt(index);
+ const MVPbkFieldType* fieldType = contactField.BestMatchingFieldType();
+
+ if ( fieldType &&
+ ( fieldType->FieldTypeResId() == R_VPBK_FIELD_TYPE_IMPP ))
+ {
+ //Found the XSP Id
+ xspId = MVPbkContactFieldUriData::Cast(
+ contactField.FieldData()).Uri().AllocLC();
+ break;
+ }
+ }
+
+ if (xspId)
+ {
+ //Find the Contact in DefaultCntDbUri() which is linked to the xspId
+
+ CVPbkFieldTypeRefsList* fieldTypeRefList = CVPbkFieldTypeRefsList::NewL();
+ TCallBack parser( CCmsFindLinkedContact::WordParserL, this );
+ CleanupStack::PushL( fieldTypeRefList );
+ fieldTypeRefList->AppendL( *iContactManager.FieldTypes().Find( R_VPBK_FIELD_TYPE_IMPP ) );
+
+ //Append the XSP Id that needs to be searched
+ CDesCArrayFlat* searchString = new( ELeave) CDesCArrayFlat( 1 );
+ CleanupStack::PushL( searchString );
+ searchString->AppendL( *xspId );
+
+ //The Store to search is DefaultCntDbUri()
+ CDesCArrayFlat* xSPStoresArray = new (ELeave)
+ CDesCArrayFlat( KArrayGranularity );
+ CleanupStack::PushL( xSPStoresArray );
+ xSPStoresArray->AppendL( VPbkContactStoreUris::DefaultCntDbUri() );
+
+ //Start the find operation of the XSP id from the stores mentioned in xSPStoresArray
+ MVPbkContactOperationBase* xSPFindOperation = iContactManager.FindL(
+ *searchString, *fieldTypeRefList, *this, parser, *xSPStoresArray );
+
+ CleanupStack::PopAndDestroy( 4 ); //xSPStoresArray, searchString, fieldTypeRefList, xspId
+
+ CleanupStack::PushL( xSPFindOperation );
+ iOperationArray.AppendL( xSPFindOperation );
+ CleanupStack::Pop( xSPFindOperation );
+
+ }
+ else
+ {
+ iState = EComplete;
+ IssueRequest();
+ }
+ }
+
+
+// ----------------------------------------------------------
+// CCmsFindLinkedContact::WordParser
+//
+// ----------------------------------------------------------
+//
+TInt CCmsFindLinkedContact::WordParserL( TAny* aWordParserParam )
+ {
+ TVPbkWordParserCallbackParam* param =
+ static_cast<TVPbkWordParserCallbackParam*>( aWordParserParam );
+ TPtrC data( param->iStringToParse->Ptr() );
+
+ PRINT1( _L( "CCmsFindLinkedContact::WordParserL(): %S" ), &data );
+
+ param->iWordArray->AppendL( data );
+ return 0;
+ }
+
+// ----------------------------------------------------------
+// CCmsFindLinkedContact::VPbkSingleContactOperationComplete
+//
+// ----------------------------------------------------------
+//
+void CCmsFindLinkedContact::VPbkSingleContactOperationComplete(
+ MVPbkContactOperationBase& /*aOperation*/,
+ MVPbkStoreContact* aContact )
+ {
+ PRINT( _L( "Start CCmsFindLinkedContact::VPbkSingleContactOperationComplete()" ) );
+
+ //We were successfull in finding the Contact
+ //now its time to retreive the XSP ID from this contact
+ //and initiate the find operation of the XSP Id
+ iRetreivedXSPContact = aContact;
+ iState = EFindLinkedContact;
+ IssueRequest();
+
+ PRINT( _L( "End CCmsFindLinkedContact::VPbkSingleContactOperationComplete()" ) );
+ }
+
+// ----------------------------------------------------------
+// CCmsFindLinkedContact::~CCmsFindLinkedContact
+//
+// ----------------------------------------------------------
+//
+void CCmsFindLinkedContact::VPbkSingleContactOperationFailed(
+ MVPbkContactOperationBase& /*aOperation*/,
+ TInt aError )
+ {
+ PRINT1( _L( "CCmsFindLinkedContact::VPbkSingleContactOperationFailed(): Error: %d" ),
+ aError );
+ //We were not successfull in finding the XSP Contact
+ //there is no point in proceeding so complete this operation
+ iState = EComplete;
+ IssueRequest();
+ }
+
+// ----------------------------------------------------------
+// CCmsFindLinkedContact::FindFromStoreSucceededL
+//
+// ----------------------------------------------------------
+//
+void CCmsFindLinkedContact::FindFromStoreSucceededL( MVPbkContactStore& /*aStore*/,
+ MVPbkContactLinkArray* aResults )
+ {
+ PRINT1( _L( "CCmsFindLinkedContact::FindCompleteL() - Count: %d" ), aResults->Count() );
+ //callback from FindL operation success
+ TInt count( aResults->Count() );
+ if( count > 0 )
+ {
+ //Found atleast one contact
+ if ( iContactLink )
+ {
+ delete iContactLink;
+ iContactLink = NULL;
+ }
+ //choose the First Found Item
+ iContactLink = aResults->At( 0 ).CloneLC();
+ CleanupStack::Pop();
+ }
+ delete aResults;
+ aResults = NULL;
+ PRINT( _L( "End CCmsFindLinkedContact::FindCompleteL()" ) );
+ }
+
+// ----------------------------------------------------------
+// CCmsFindLinkedContact::FindFromStoreFailed
+//
+// ----------------------------------------------------------
+//
+void CCmsFindLinkedContact::FindFromStoreFailed(
+ MVPbkContactStore& /*aStore*/, TInt aError )
+ {
+ //callback from FindL operation failure
+ PRINT1( _L( "CCmsFindLinkedContact::FindFailed() - Error: %d" ), aError );
+ }
+
+// ----------------------------------------------------------
+// CCmsFindLinkedContact::FindFromStoresOperationComplete
+//
+// ----------------------------------------------------------
+//
+void CCmsFindLinkedContact::FindFromStoresOperationComplete()
+ {
+ //Final callback from FindL operation that denotes the end
+ //of the operation
+ iState = EComplete;
+ IssueRequest();
+ PRINT( _L( "CCmsFindLinkedContact::FindFromStoresOperationComplete()" ) );
+ }
+
+
+// End of File