diff -r 2b7283837edb -r 3104fc151679 uiservicetab/vimpststorage/src/cvimpststoragevpbkstorehandler.cpp --- a/uiservicetab/vimpststorage/src/cvimpststoragevpbkstorehandler.cpp Thu Aug 19 09:41:53 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1318 +0,0 @@ -/* -* 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: Class that provides handling of vpbk store -* -*/ - - -// INCLUDE FILES -#include "cvimpststoragevpbkstorehandler.h" - -#include "mvimpststoragevpbkstorehandler.h" - -//vpbk interfaces -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "uiservicetabtracer.h" -#include "tvimpstconsts.h" -#include - -// ================= MEMBER FUNCTIONS ======================= - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler:: -// CVIMPSTStorageVPbkStoreHandler -// --------------------------------------------------------------------------- -// -CVIMPSTStorageVPbkStoreHandler:: CVIMPSTStorageVPbkStoreHandler( MVIMPSTStorageVPbkStoreHandler& aStoreHandler,TBool aLocalStore ): - CActive( CActive::EPriorityIdle ), - iStoreHandler(aStoreHandler ), - iStoreEventType( EVPbkUnknownEvent ), - iFetcingIndex( 0 ), - iLocalStore( aLocalStore ) - { - TRACER_AUTO; - CActiveScheduler::Add( this ); - } - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::ConstructL -// --------------------------------------------------------------------------- -// -void CVIMPSTStorageVPbkStoreHandler::ConstructL(const TDesC& aStoreName,const TDesC& aServiceName ) - { - TRACER_AUTO; - iAddIdInProgress = NULL; - iStoreName = aStoreName.AllocL(); - iServiceName = aServiceName.AllocL(); - CVPbkContactStoreUriArray* uriArray = CVPbkContactStoreUriArray::NewLC(); - uriArray->AppendL( TVPbkContactStoreUriPtr( aStoreName ) ); - if( !uriArray->IsIncluded( TVPbkContactStoreUriPtr( KPhoneBookDbURI ) ) ) - { - TRACE( "phonebook store apended" ); - uriArray->AppendL( TVPbkContactStoreUriPtr( KPhoneBookDbURI ) ); - } - iContactManager = CVPbkContactManager::NewL( *uriArray, NULL ); - CleanupStack::PopAndDestroy( uriArray ); - TRACE( "iContactManager created" ); - iStores = &iContactManager->ContactStoresL(); - iStores->OpenAllL( *this ); - TRACE( " OpenAllL called" ); - iSortOrderManager = CPbk2SortOrderManager::NewL( iContactManager->FieldTypes(), NULL ); - - } - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::NewL -// --------------------------------------------------------------------------- -// -CVIMPSTStorageVPbkStoreHandler* CVIMPSTStorageVPbkStoreHandler::NewL( const TDesC& aContactDb, - const TDesC& aServiceName, - MVIMPSTStorageVPbkStoreHandler& aStoreHandler, - TBool aLocalStore ) - { - TRACER_AUTO; - CVIMPSTStorageVPbkStoreHandler* self = NewLC( aContactDb ,aServiceName, aStoreHandler,aLocalStore ); - CleanupStack::Pop( self ); - - return self; - } - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::NewLC -// --------------------------------------------------------------------------- -// -CVIMPSTStorageVPbkStoreHandler* CVIMPSTStorageVPbkStoreHandler::NewLC( const TDesC& aContactDb, - const TDesC& aServiceName, - MVIMPSTStorageVPbkStoreHandler& aStoreHandler, - TBool aLocalStore ) - { - TRACER_AUTO; - CVIMPSTStorageVPbkStoreHandler* self = - new (ELeave) CVIMPSTStorageVPbkStoreHandler( aStoreHandler ,aLocalStore ); - CleanupStack::PushL( self ); - self->ConstructL( aContactDb,aServiceName ); - - return self; - } - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler:: -// ~CVIMPSTStorageVPbkStoreHandler -// --------------------------------------------------------------------------- -// -CVIMPSTStorageVPbkStoreHandler:: ~CVIMPSTStorageVPbkStoreHandler() - { - TRACER_AUTO; - if( iWait.IsStarted() ) - { - iWait.AsyncStop(); - } - Cancel(); - ResetAndDestroyRArray(); - iUnCommittedVPbkContacts.ResetAndDestroy(); - delete iAddIdInProgress; - delete iContactOperation; - delete iContactLink; - delete iStoreContact; - delete iContactView; - if ( iContactManager ) - { - TRAP_IGNORE( iContactManager->ContactStoresL().CloseAll( *this ) ); - TRACE( "CloseAll called" ); - delete iContactManager; - } - delete iStoreName; - delete iSortOrderManager; - delete iServiceName; - - } - // --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::ContactViewReady -// --------------------------------------------------------------------------- -// -void CVIMPSTStorageVPbkStoreHandler::ContactViewReady( - MVPbkContactViewBase& aView ) - { - TRACER_AUTO; - if ( iContactView == &aView && ( iStoreEventType == EVPbkUnknownEvent ) ) - { - iStoreEventType = EVPbkContactReading ; - TRAP_IGNORE( HandleContactViewReadyL( *iContactView ) ); - } - - } - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::ContactViewUnavailable -// --------------------------------------------------------------------------- -// -void CVIMPSTStorageVPbkStoreHandler::ContactViewUnavailable( - MVPbkContactViewBase& /*aView*/ ) - { - TRACER_AUTO; - } - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::ContactAddedToView -// --------------------------------------------------------------------------- -// -void CVIMPSTStorageVPbkStoreHandler::ContactAddedToView( - MVPbkContactViewBase& /*aView*/, - TInt /*aIndex*/, const MVPbkContactLink& /*aContactLink*/ ) - { - TRACER_AUTO; - } - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::ContactRemovedFromView -// --------------------------------------------------------------------------- -// -void CVIMPSTStorageVPbkStoreHandler::ContactRemovedFromView( - MVPbkContactViewBase& /*aView*/, - TInt /*aIndex*/, const MVPbkContactLink& /*aContactLink*/ ) - { - TRACER_AUTO; - } - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::ContactViewError -// --------------------------------------------------------------------------- -// -void CVIMPSTStorageVPbkStoreHandler::ContactViewError( - MVPbkContactViewBase& /*aView*/, - TInt /*aError*/, TBool /*aErrorNotified*/ ) - { - TRACER_AUTO; - } - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::StoreReady -// --------------------------------------------------------------------------- -// -void CVIMPSTStorageVPbkStoreHandler::StoreReady( - MVPbkContactStore& /*aContactStore*/ ) - { - TRACER_AUTO; - } - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::StoreUnavailable -// --------------------------------------------------------------------------- -// -void CVIMPSTStorageVPbkStoreHandler::StoreUnavailable( - MVPbkContactStore& /*aContactStore*/, - TInt /*aReason*/ ) - { - TRACER_AUTO; - } - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::HandleStoreEventL -// --------------------------------------------------------------------------- -// -MVPbkContactStore* CVIMPSTStorageVPbkStoreHandler::GetDefaultStoreL( const TDesC& aUri ) - { - TRACER_AUTO; - return iStores->Find( TVPbkContactStoreUriPtr( aUri ) ); - } - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::HandleStoreEventL -// --------------------------------------------------------------------------- -// -void CVIMPSTStorageVPbkStoreHandler::HandleStoreEventL( - MVPbkContactStore& aContactStore , - TVPbkContactStoreEvent aStoreEvent ) - { - TRACER_AUTO; - if( iStore == &aContactStore ) - { - TRACE( "store event" ); - switch( aStoreEvent.iEventType ) - { - case TVPbkContactStoreEvent::EContactAdded: - { - TRACE( "EContactAdded event"); - delete iContactLink; - iContactLink = NULL; - MVPbkContactLink* contactLink = aStoreEvent.iContactLink->CloneLC(); - iContactLink = contactLink; - CleanupStack::Pop(); // contactLink - IssueRequest(); // complete the request - TRACE( " EContactAdded done" ); - break; - } - case TVPbkContactStoreEvent::EContactDeleted: - { - TRACE( "EContactDeleted event" ); - MVPbkContactLink* contactLink = aStoreEvent.iContactLink->CloneLC(); - delete iContactLink; - iContactLink = NULL; - iContactLink = contactLink; - CleanupStack::Pop(); // contactLink - TVIMPSTVPbkStoreEvent storeEvent(EVPbkContactDeleted, iContactLink ); - iStoreHandler.HandleVPbkStoreEventL( storeEvent ) ; - TRACE( "EContactDeleted done" ); - break; - } - case TVPbkContactStoreEvent::EContactChanged: - { - TRACE( " EContactChanged event" ); - delete iContactLink; - iContactLink = NULL; - MVPbkContactLink* contactLink = aStoreEvent.iContactLink->CloneLC(); - iContactLink = contactLink; - CleanupStack::Pop(); // contactLink - iStoreEventType = EVPbkContactChanged; - IssueRequest(); // complete the request which will begin retriving the iContactLink - TRACE("EContactChanged done"); - break; - } - case TVPbkContactStoreEvent::EUnknownChanges: - { - TRACE( " EUnknownChanges event" ); - iStoreEventType = EVPbkUnknownChanges; - TVIMPSTVPbkStoreEvent storeEvent(iStoreEventType); - iStoreHandler.HandleVPbkStoreEventL( storeEvent ) ; - TRACE( "EUnknownChanges done" ); - break; - } - default: - break; - } - } - - } -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::OpenComplete -// --------------------------------------------------------------------------- -// -void CVIMPSTStorageVPbkStoreHandler::OpenComplete() - { - TRACER_AUTO; - // stores OpenAll completed - TRAP_IGNORE( DoHnadleOpenCompleteL() ); - - } - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::DoHnadleOpenCompleteL -// --------------------------------------------------------------------------- -// -void CVIMPSTStorageVPbkStoreHandler::DoHnadleOpenCompleteL() - { - TRACER_AUTO; - iStore = GetDefaultStoreL( *iStoreName ) ; - CVPbkContactViewDefinition* viewDefinition = - CVPbkContactViewDefinition::NewL(); - CleanupStack::PushL( viewDefinition ); - viewDefinition->SetType( EVPbkContactsView ); - viewDefinition->SetUriL( *iStoreName ); - if ( iStore ) - { - TRACE( "store view creating"); - MVPbkContactView* tmpView = iStore->CreateViewLC( - *viewDefinition, - *this, - iSortOrderManager->SortOrder() ); - CleanupStack::Pop(); // tmpView - TRACE( "store view created"); - iContactView = tmpView; - } - CleanupStack::PopAndDestroy(); //viewDefinition, can not pop ny name - - } - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::ContactOperationCompleted -// --------------------------------------------------------------------------- -// -void CVIMPSTStorageVPbkStoreHandler::ContactOperationCompleted( - TContactOpResult /*aResult*/ ) - { - TRACER_AUTO; - // called when contact commit is successful - iOperationError = KErrNone; - if( iWait.IsStarted() ) - { - iWait.AsyncStop(); - } - TRAP_IGNORE( CommitNextPendingContactsL() ); - - } - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::ContactOperationFailed -// --------------------------------------------------------------------------- -// -void CVIMPSTStorageVPbkStoreHandler::ContactOperationFailed( - TContactOp /*aOpCode*/, TInt aErrorCode, TBool /*aErrorNotified*/ ) - { - TRACER_AUTO; - // called when contact commit is unsuccessful - iOperationError = aErrorCode; - if( iWait.IsStarted() ) - { - iWait.AsyncStop(); - } - TRAP_IGNORE( CommitNextPendingContactsL() ); - - } - - -// -------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::StepComplete -// -------------------------------------------------------------------------- -// -void CVIMPSTStorageVPbkStoreHandler::StepComplete( - MVPbkContactOperationBase& /*aOperation*/, - TInt /*aStepSize*/ ) - { - TRACER_AUTO; - // called when batch operation call - iOperationError = KErrNone; - - } - - -// -------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::StepFailed -// -------------------------------------------------------------------------- -// -TBool CVIMPSTStorageVPbkStoreHandler::StepFailed( - MVPbkContactOperationBase& /*aOperation*/, - TInt /*aStepSize*/, - TInt aError ) - { - TRACER_AUTO; - // called when batch operation call - iOperationError = aError; - - return EFalse; - } - -// -------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::OperationComplete -// -------------------------------------------------------------------------- -// -void CVIMPSTStorageVPbkStoreHandler::OperationComplete( - MVPbkContactOperationBase& aOperation ) - { - TRACER_AUTO; - // called when batch operation call for opening the multiple store - if ( &aOperation == iContactOperation ) - { - delete iContactOperation; - iContactOperation = NULL; - } - iOperationError = KErrNone; - if( iWait.IsStarted() ) - { - iWait.AsyncStop(); - } - - } - -//---------------------------------------------------------------------- -//CVIMPSTStorageVPbkStoreHandler::VPbkSingleContactOperationComplete() -//---------------------------------------------------------------------- -void CVIMPSTStorageVPbkStoreHandler::VPbkSingleContactOperationComplete( MVPbkContactOperationBase& aOperation, - MVPbkStoreContact* aContact ) - { - TRACER_AUTO; - // called when contact details is retrived - TRAP_IGNORE( DoHnadleSingleContactOperationCompleteL( aOperation, aContact ) ); - - } - -//---------------------------------------------------------------------- -//CVIMPSTStorageVPbkStoreHandler::DoHnadleSingleContactOperationCompleteL() -//---------------------------------------------------------------------- -void CVIMPSTStorageVPbkStoreHandler::DoHnadleSingleContactOperationCompleteL( MVPbkContactOperationBase& aOperation, - MVPbkStoreContact* aContact ) - { - TRACER_AUTO; - TRACE( "StoreEventType: %d",iStoreEventType); - // called when contact details is retrived - if( iStoreContact ) - { - delete iStoreContact; - iStoreContact = NULL; - } - iStoreContact = aContact ; // iStoreContact owns thea Contact - if( ( &aOperation == iContactOperation) && iStoreContact ) - { - TRACE( "inside if (operation) "); - if( iWait.IsStarted() ) - { - iWait.AsyncStop(); - } - delete iContactOperation; - iContactOperation = NULL; - TRACE( " before iCommitOperationInProgress: %d",iCommitOperationInProgress); - iCommitOperationInProgress = EFalse; - TRACE( "After iCommitOperationInProgress: %d",iCommitOperationInProgress); - - if( iStoreEventType != EVPbkUpdatingAvatar ) - { - TRACE( " inside if (iStoreEventType != EVPbkUpdatingAvatar ) "); - if( !iLocalStore && iStoreEventType == EVPbkContactRetriving ) - { - TRACE( " EVPbkContactRetriving"); - RetriveFieldDataAndSendEventL( *iStoreContact ); - } - else - { - TRACE( "inside else start"); - HBufC* userId = GetContactFieldDataLC( *iStoreContact, R_VPBK_FIELD_TYPE_IMPP ); - HBufC* firstname = GetContactFieldDataLC( *iStoreContact,R_VPBK_FIELD_TYPE_FIRSTNAME ); - HBufC* lastname = GetContactFieldDataLC( *iStoreContact,R_VPBK_FIELD_TYPE_LASTNAME ); - - HBufC* disname = NULL; - /* - * There are three scenarios where I can form the Display name. - * 1. First and last name are present. - * 2. First name is present but no last name is present. - * 3. Lastname is there and no first name. - * 4. if none, then assigning NULL - */ - if ( firstname && lastname ) - { - disname = HBufC::NewLC( firstname->Des().Length() + lastname->Des().Length()+ 1 ); - TPtr disnamePtr( disname->Des() ); - disnamePtr.Append(*firstname); - if(firstname->Length() && lastname->Length() ) - { - disnamePtr.Append(KSpace); - } - disnamePtr.Append(*lastname); - } - else - { - disname = KNullDesC().AllocLC(); - } - HBufC8* avatarContent = GetContactBinaryFieldDataLC( *iStoreContact,R_VPBK_FIELD_TYPE_THUMBNAILPIC ); - TRACE( "iStoreHandler.HandleVPbkStoreEventL: %d", iStoreEventType); - TPtr useridPtr = userId->Des(); - TRACE( "inside else UserId : %S", &useridPtr); - TVIMPSTVPbkStoreEvent storeEvent(iStoreEventType, - iContactLink, - NULL, - *userId, - *disname, - *avatarContent); - iStoreHandler.HandleVPbkStoreEventL( storeEvent ) ; - CleanupStack::PopAndDestroy(5); // disname,lastname,firstname,userId,avatarContent - TRACE( " inside else end"); - } - delete iAddIdInProgress; - iAddIdInProgress = NULL; - } - - iOperationError = KErrNone; - if( iStoreEventType == EVPbkContactReading && iContactView ) - { - TRACE( " if after iOperationError"); - HandleContactViewReadyL( *iContactView ); - } - - else if(!iCommitOperationInProgress ) - { - TRACE( "else if after if after iOperationError"); - CommitNextPendingContactsL();// commit only if any pending contact - } - - } - } -//---------------------------------------------------------------------- -//CVIMPSTStorageVPbkStoreHandler::VPbkSingleContactOperationComplete() -//---------------------------------------------------------------------- -void CVIMPSTStorageVPbkStoreHandler::VPbkSingleContactOperationFailed( MVPbkContactOperationBase& aOperation, - TInt aError) - { - TRACER_AUTO; - if( &aOperation == iContactOperation ) - { - delete iContactOperation; - iContactOperation = NULL; - } - iOperationError = aError; - iCommitOperationInProgress = EFalse; - if( iWait.IsStarted() ) - { - iWait.AsyncStop(); - } - TRAP_IGNORE( CommitNextPendingContactsL() );// commit only if any pending contact - - } -// -------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::HandleContactViewReadyL -// -------------------------------------------------------------------------- -// -void CVIMPSTStorageVPbkStoreHandler::HandleContactViewReadyL( MVPbkContactViewBase& aView ) - { - TRACER_AUTO; - TInt contactCount = aView.ContactCountL(); - TRACE( "begin"); - if( contactCount == iFetcingIndex && iStoreEventType == EVPbkContactReading ) - { - TRACE( "reading completed" ); - iStoreEventType = EVPbkContactReadCompleted; - TVIMPSTVPbkStoreEvent storeEvent(iStoreEventType); - iStoreHandler.HandleVPbkStoreEventL( storeEvent ) ; - } - else if( iFetcingIndex < contactCount && iFetcingIndex>=0 ) - { - TRACE( " reading"); - const MVPbkViewContact& contact = aView.ContactAtL( iFetcingIndex ); - MVPbkContactLink* contactLink = contact.CreateLinkLC(); - delete iContactLink; - iContactLink = NULL; - iContactLink = contactLink; - CleanupStack::Pop(); // contactLink - IssueRequest(); - iFetcingIndex++; - } - - } -// -------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::IssueRequest -// -------------------------------------------------------------------------- -// -void CVIMPSTStorageVPbkStoreHandler::IssueRequest() - { - TRACER_AUTO; - if( !IsActive() ) - { - TRequestStatus* status = &iStatus; - User::RequestComplete( status, KErrNone ); - SetActive(); - } - - } - -// -------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::RunL -// -------------------------------------------------------------------------- -// -void CVIMPSTStorageVPbkStoreHandler::RunL() - { - TRACER_AUTO; - if( iContactLink ) - { - delete iContactOperation; - iContactOperation = NULL; - iContactOperation = iContactManager->RetrieveContactL( *iContactLink, *this ); - } - - } - -// -------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::DoCancel -// -------------------------------------------------------------------------- -// -void CVIMPSTStorageVPbkStoreHandler::DoCancel() - { - TRACER_AUTO; - } - -// -------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::RunError -// -------------------------------------------------------------------------- -// -TInt CVIMPSTStorageVPbkStoreHandler::RunError( TInt aError ) - { - TRACER_AUTO; - return aError; - } - -////////////////////////////////////////////////////////// -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::CreateVPbkContactL -// --------------------------------------------------------------------------- -// -TInt CVIMPSTStorageVPbkStoreHandler::CreateVPbkContactL(const TDesC& aUserId, - const TDesC& aDisplayName ) - { - TRACER_AUTO; - TRACE( "aUserId = %S", &aUserId ); - - if( iAddIdInProgress && iAddIdInProgress->Compare( aUserId ) == 0 ) - { - TPtr iAddIdInProgressPtr = iAddIdInProgress->Des(); - TRACE("iAddIdInProgressPtr = %S", &iAddIdInProgressPtr ); - TRACE("already Adding" ); - return KErrAlreadyExists; - } - TRACE( "After If" ); - delete iAddIdInProgress; - iAddIdInProgress = NULL; - iAddIdInProgress = aUserId.AllocL(); - - if(iStore) - { - MVPbkStoreContact* storedContact = iStore->CreateNewContactLC(); //1 - if( !storedContact ) - { - return NULL; - } - if(aUserId.Length()!= 0) - { - TRACE( " valid xsp Id" ); - TInt prefixLocation = aUserId.Locate( ':' ); - const MVPbkContactStoreProperties& storeProperties = storedContact->ParentStore().StoreProperties(); - const MVPbkFieldTypeList& supportedFieldTypes = storeProperties.SupportedFields(); - TInt fieldCount = supportedFieldTypes.FieldTypeCount(); - - for( TInt index = 0 ; index < fieldCount ; index++ ) - { - const MVPbkFieldType* fieldType = &(supportedFieldTypes.FieldTypeAt(index)); - if ( fieldType && ( fieldType->FieldTypeResId() == R_VPBK_FIELD_TYPE_IMPP )) - { - TRACE(" XSP Id-IMMP field creating" ); - MVPbkStoreContactField* fielduri = storedContact->CreateFieldLC(*fieldType); //2 - // Check for prefix and remove if found - //append the internettelephoney field. - HBufC* fieldData = NULL; - TInt serFieldLength = aUserId.Length(); - if( prefixLocation >=0 && ( prefixLocation < serFieldLength ) ) - { - fieldData = aUserId.Right(serFieldLength - prefixLocation - 1).AllocLC(); //3 - } - else - { - fieldData = aUserId.AllocLC(); // 3 - } - if (fieldData) - { - TPtr fieldDataPtr( fieldData->Des() ); - MVPbkContactFieldUriData& address = MVPbkContactFieldUriData::Cast( fielduri->FieldData() ); - // TODO check here about servicename:userId - address.SetUriL(*iServiceName,*fieldData); - // fielduri ownership is transfered to storedContact - storedContact->AddFieldL(fielduri); - CleanupStack::PopAndDestroy(fieldData); //3 - CleanupStack::Pop(); //fielduri 2 - }//End if (fieldData) - else - { - CleanupStack::PopAndDestroy(); //2 fielduri - } - TRACE( " XSP Id-IMMP field created" ); - }//end of if - else if ( fieldType && - ( fieldType->FieldTypeResId() == R_VPBK_FIELD_TYPE_FIRSTNAME )) - { - TRACE( " first name field creating" ); - HBufC* firstName = NULL; - - // if there is no display name then allocate hte user id as displayname. - if(!(aDisplayName.Length())) - { - // if aServiceField is sip:user1@ouped111147.nmp.nokia.com, then - // rippedaServiceField will be user1@ouped111147.nmp.nokia.com - TPtrC rippedaServiceField = aUserId.Mid(prefixLocation+1); - //append first name. - TInt atLocation = rippedaServiceField.Locate( '@' ); - if( atLocation > 0 && ( atLocation < rippedaServiceField.Length() ) ) - { - // atLocation must be greater that 0 - firstName = rippedaServiceField.Left( atLocation ).AllocLC() ; //2 - } - else - { - firstName = rippedaServiceField.AllocLC(); //2 - } - } - // there is a display name hence allocate it. - else - { - firstName = aDisplayName.AllocLC();//2 - } - - if (firstName) - { - MVPbkStoreContactField* firstNamefield = storedContact->CreateFieldLC(*fieldType); //2 - MVPbkContactFieldTextData& firstNameText = MVPbkContactFieldTextData::Cast( firstNamefield->FieldData() ); - firstNameText.SetTextL(*firstName); - storedContact->AddFieldL(firstNamefield); // firstNamefield ownership transfered to storedContact - CleanupStack::Pop(); //firstNamefield 2 - CleanupStack::PopAndDestroy(firstName); // 3 - }//End if (firstName) - - TRACE( "first name field created" ); - }//end of if. - }//end of for. - TRACE( "iCommitOperationInProgress = %d",iCommitOperationInProgress ); - if( iCommitOperationInProgress ) - { - TRACE("inside if" ); - iUnCommittedVPbkContacts.AppendL( storedContact ); //takes ownership - CleanupStack::Pop(); //storedContact - } - else - { - TRACE( "inside else"); - iCommitOperationInProgress = ETrue; - if(iStoreContact) - { - delete iStoreContact; - iStoreContact = NULL; - } - TRACE( "contact fields added" ); - iStoreContact = storedContact; - CleanupStack::Pop(); //storedContact - iStoreContact->CommitL(*this); - iStoreEventType = EVPbkContactAdded; - } - TRACE( "contact commited"); - //Start the wait untill adding of new contact is complete - } - } - //return the added contact - TRACE( "iOperationError =%d",iOperationError ); - - return iOperationError; - } - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::CommitNextPendingContactsL -// --------------------------------------------------------------------------- -// -void CVIMPSTStorageVPbkStoreHandler::CommitNextPendingContactsL() - { - - TRACER_AUTO; - TRACE("iStoreEventType = %d",iStoreEventType ); - if( !iCommitOperationInProgress && iUnCommittedVPbkContacts.Count() && iStoreEventType != EVPbkUpdatingAvatar) - { - TRACE( " Commit next" ); - iCommitOperationInProgress = ETrue; - if(iStoreContact) - { - delete iStoreContact; - iStoreContact = NULL; - } - TRACE( "comming..." ); - iStoreContact = iUnCommittedVPbkContacts[0]; - iUnCommittedVPbkContacts.Remove(0); - iUnCommittedVPbkContacts.Compress(); - iStoreContact->CommitL(*this); - iStoreEventType = EVPbkContactSynchronizing; - TRACE( " Commit called" ); - } - else if(!iCommitOperationInProgress && iPendingAvatars.Count() && iStoreEventType != EVPbkUpdatingAvatar) - { - TRACE( "Commit next pending avatar" ); - TVIMPSTAvatarData avatarData = iPendingAvatars[0]; - UpdateAvatarFieldDataL( *avatarData.iContactLink, *avatarData.iAvatarContent ); - iPendingAvatars.Remove( 0 ); - delete avatarData.iContactLink; - avatarData.iContactLink = NULL; - delete avatarData.iAvatarContent; - avatarData.iAvatarContent = NULL; - iPendingAvatars.Compress(); - } - - } - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::RemoveVPbkContactL -// --------------------------------------------------------------------------- -// -TInt CVIMPSTStorageVPbkStoreHandler::RemoveVPbkContactL(const CVPbkContactLinkArray& aContactLinkArray ) - { - TRACER_AUTO; - // text now holds the name (or first field of the contact) - delete iContactOperation; - iContactOperation = NULL; - iContactOperation = iContactManager->DeleteContactsL(aContactLinkArray, *this ); - if( !iWait.IsStarted() ) - { - iWait.Start(); - } - TRACE( "iOperationError=%d",iOperationError ); - - return iOperationError; - } - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::RetrieveVPbkContactL -// --------------------------------------------------------------------------- -// -TInt CVIMPSTStorageVPbkStoreHandler::RetrieveVPbkContactL(const TDesC8& aPackedLinks) - { - TRACER_AUTO; - iStoreEventType = EVPbkContactRetriving; - CVPbkContactLinkArray* linkArray = CVPbkContactLinkArray::NewLC(aPackedLinks, *iStores ); - // text now holds the name (or first field of the contact) - TInt count = linkArray->Count(); - TRACE( "count=%d",count ); - for ( TInt i=0; iAt( i ).CloneLC(); - iContactLink = cloneLink; - CleanupStack::Pop(); // cloneLink - - delete iContactOperation; - iContactOperation = NULL; - - iContactOperation = iContactManager->RetrieveContactL( *iContactLink, *this ); - if( !iWait.IsStarted() ) - { - iWait.Start(); - } - } - CleanupStack::PopAndDestroy();//linkArray - - return iOperationError; - } - - - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::UpdateAvatarFieldDataL() -// --------------------------------------------------------------------------- -// -TInt CVIMPSTStorageVPbkStoreHandler::UpdateAvatarFieldDataL(const MVPbkContactLink& aContactLink, - const TDesC8& aAvatartData ) - { - TRACER_AUTO; - - // local variable caz cant push member variable to cleanup stack - MVPbkContactLink* cloneLink = aContactLink.CloneLC(); - TRACE( "iCommitOperationInProgress: %d",iCommitOperationInProgress ); - TRACE( "iUnCommittedVPbkContacts: %d",iUnCommittedVPbkContacts.Count() ); - if(iCommitOperationInProgress || iUnCommittedVPbkContacts.Count() || iStoreEventType == EVPbkUpdatingAvatar ) - { - TRACE( "Inside if" ); - TVIMPSTAvatarData avatarData = { - cloneLink, - aAvatartData.AllocL() - }; - iPendingAvatars.Append( avatarData ); - CleanupStack::Pop(); // cloneLink - return KErrInUse; - } - iCommitOperationInProgress = ETrue; - TRACE( "Inside after if" ); - delete iContactLink; - iContactLink = NULL; - iContactLink = cloneLink; - CleanupStack::Pop(); // cloneLink - - //before updating the avatar, check if there are any pending operation already, if there are any, - // then delete them and create the next one. - if(iContactOperation) - { - delete iContactOperation; - iContactOperation = NULL; - } - iStoreEventType = EVPbkUpdatingAvatar; - iContactOperation = iContactManager->RetrieveContactL( *iContactLink, *this ); - if( !iWait.IsStarted() ) - { - iWait.Start(); - } - // exception KErrInUse If another asynchronous operation is - // already in progress. - // exception KErrAccessDenied if the contact can not be modified. - iStoreContact->LockL(*this); - - - //wait till lock operation is succeded - if(!iWait.IsStarted() ) - { - iWait.Start(); - } - TInt fieldcount = iStoreContact->Fields().FieldCount(); - for( TInt j = 0 ; j < fieldcount ; j++ ) - { - const MVPbkFieldType* fieldType = iStoreContact->Fields().FieldAt(j).BestMatchingFieldType(); - if( fieldType->FieldTypeResId() == R_VPBK_FIELD_TYPE_THUMBNAILPIC ) - { - iStoreContact->RemoveField(j); - break; - } - } - if( aAvatartData.Length() ) - { - const MVPbkContactStoreProperties& storeProperties = iStoreContact->ParentStore().StoreProperties(); - const MVPbkFieldTypeList& supportedFieldTypes = storeProperties.SupportedFields(); - TInt fieldCount = supportedFieldTypes.FieldTypeCount(); - for( TInt index = 0 ; index < fieldCount ; index++ ) - { - const MVPbkFieldType* fieldType = &( supportedFieldTypes.FieldTypeAt(index) ); - //find the relevant voip fields/email id fileds. - if ( fieldType && ( fieldType->FieldTypeResId() == R_VPBK_FIELD_TYPE_THUMBNAILPIC ) ) - { - //updating avatar field in the virtual phonebook - //found the required fieldtype - MVPbkStoreContactField* storeField = iStoreContact->CreateFieldLC(*fieldType); - // The aField instance can not be used after AddFieldL - //storeField ownership is transferred - TInt fieldIndex = iStoreContact->AddFieldL(storeField); - MVPbkContactFieldData& dataField = iStoreContact->Fields().FieldAt( fieldIndex ).FieldData(); - MVPbkContactFieldBinaryData& data = MVPbkContactFieldBinaryData::Cast(dataField); - data.SetBinaryDataL(aAvatartData); - CleanupStack::Pop(); // storeField - break; - } - } - } - TRACE( "Inside after if(avatardata.length)" ); - iStoreEventType = EVPbkContactChanged; - TRACE( "Inside after if(avatardata.length ): %d",iStoreEventType ); - iStoreContact->CommitL(*this); - //wait for delete Avatar operation to complete. - if(!iWait.IsStarted() ) - { - iWait.Start(); - } - - return iOperationError; - } - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::RemoveAvatarFieldL() -// --------------------------------------------------------------------------- -// -TInt CVIMPSTStorageVPbkStoreHandler::RemoveAvatarFieldL(MVPbkStoreContact& aStoreContact) - { - TRACER_AUTO; - aStoreContact.LockL(*this); - //wait till lock operation is succeded - if(!iWait.IsStarted() ) - { - iWait.Start(); - } - TInt fieldcount = aStoreContact.Fields().FieldCount(); - for( TInt j = 0 ; j < fieldcount ; j++ ) - { - const MVPbkFieldType* fieldType = aStoreContact.Fields().FieldAt(j).BestMatchingFieldType(); - if( fieldType->FieldTypeResId() == R_VPBK_FIELD_TYPE_THUMBNAILPIC ) - { - aStoreContact.RemoveField(j); - break; - } - } - aStoreContact.CommitL(*this); - //wait for delete Avatar operation to complete. - if(!iWait.IsStarted() ) - { - iWait.Start(); - } - TRACE( "iOperationError =%d",iOperationError ); - - return iOperationError; - } - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::GetContactFieldDataLC() -// --------------------------------------------------------------------------- -// -HBufC* CVIMPSTStorageVPbkStoreHandler::GetContactFieldDataLC(const MVPbkStoreContact& aContact, - TInt aFieldResId ) - { - TRACER_AUTO; - HBufC* retValue = NULL; - const MVPbkStoreContactFieldCollection& fieldCollection = aContact.Fields(); - TInt fieldCount = fieldCollection.FieldCount(); - TRACE( " fieldCount%d",fieldCount ); - for( TInt index = 0 ; index < fieldCount ; index++ ) - { - const MVPbkStoreContactField& field = fieldCollection.FieldAt( index ); - const MVPbkFieldType* fieldType = field.BestMatchingFieldType(); - //find the relevant xSP field - if ( fieldType && ( fieldType->FieldTypeResId() == aFieldResId ) ) - { - const MVPbkContactFieldData& fieldData = field.FieldData(); - switch( fieldData.DataType() ) - { - case EVPbkFieldStorageTypeText: - { - TRACE(" Text" ); - retValue = MVPbkContactFieldTextData::Cast(fieldData).Text().AllocLC(); - break; - } - case EVPbkFieldStorageTypeUri: - { - TRACE(" Uri "); - retValue = MVPbkContactFieldUriData::Cast(fieldData).Text().AllocLC(); - break; - } - - }//End switch - if( aFieldResId == R_VPBK_FIELD_TYPE_IMPP && retValue ) - { - TRACE( " IMPP fild found"); - // TODO RAMC : Nikhil/Mukesh - // in case of srver contacts it also find the first valid xsp id - // not valid through NULL - // which can be clarified - // earlier it show selection query in UI which one to use - TPtrC scheme = MVPbkContactFieldUriData::Cast(fieldData).Scheme(); - if( scheme.Compare( *iServiceName ) == 0 ) - { - TRACE( " actual xsp Id found"); - // actual xsp id found break the loop and return - break; - } - else - { - // actual xsp not yet found continue looking - CleanupStack::PopAndDestroy(); // retValue; - retValue = NULL; - } - } - else if( retValue ) - { - // break this loop once the given aFieldResId is found - // with valid data - break; - } - } - } - if( !retValue ) - { - TRACE( " NULL value"); - // if NULL assign valid ptr - retValue = KNullDesC().AllocLC(); - } - - return retValue;// ownership is return to caller - } - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::GetContactBinaryFieldDataLC() -// --------------------------------------------------------------------------- -// -HBufC8* CVIMPSTStorageVPbkStoreHandler::GetContactBinaryFieldDataLC(const MVPbkStoreContact& aContact, - TInt aFieldResId ) - { - TRACER_AUTO; - HBufC8* retValue = NULL; - const MVPbkStoreContactFieldCollection& fieldCollection = aContact.Fields(); - TInt fieldCount = fieldCollection.FieldCount(); - TRACE( "fieldCount%d",fieldCount ); - for( TInt index = 0 ; index < fieldCount ; index++ ) - { - const MVPbkStoreContactField& field = fieldCollection.FieldAt( index ); - const MVPbkFieldType* fieldType = field.BestMatchingFieldType(); - //find the relevant xSP field - if ( fieldType && ( fieldType->FieldTypeResId() == aFieldResId ) ) - { - const MVPbkContactFieldData& fieldData = field.FieldData(); - switch( fieldData.DataType() ) - { - case EVPbkFieldStorageTypeBinary: - { - TRACE( " Text" ); - retValue = MVPbkContactFieldBinaryData::Cast(fieldData).BinaryData().AllocLC(); - break; - } - }//End switch - if( retValue ) - { - // break this loop once the given aFieldResId is found - // with valid data - break; - } - } - } - if( !retValue ) - { - TRACE( " NULL value"); - // if NULL assign valid ptr - retValue = KNullDesC8().AllocLC(); - } - - return retValue;// ownership is return to caller - } - - -// --------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::RetriveFieldDataAndSendEventL -// -// --------------------------------------------------------- -void CVIMPSTStorageVPbkStoreHandler::RetriveFieldDataAndSendEventL(const MVPbkStoreContact& aContact ) - { - TRACER_AUTO; - HBufC* retValue = NULL; - const MVPbkStoreContactFieldCollection& fieldCollection = aContact.Fields(); - TInt fieldCount = fieldCollection.FieldCount(); - for( TInt index = 0 ; index < fieldCount ; index++ ) - { - const MVPbkStoreContactField& field = fieldCollection.FieldAt( index ); - const MVPbkFieldType* fieldType = field.BestMatchingFieldType(); - //find the relevant xSP field - //if ( fieldType && ( fieldType->FieldTypeResId() == aFieldResId ) ) - if ( fieldType && (( fieldType->FieldTypeResId() == R_VPBK_FIELD_TYPE_IMPP ) - || (fieldType->FieldTypeResId() == R_VPBK_FIELD_TYPE_LANDPHONEHOME ) - ||(fieldType->FieldTypeResId() == R_VPBK_FIELD_TYPE_MOBILEPHONEHOME ) - ||(fieldType->FieldTypeResId() == R_VPBK_FIELD_TYPE_LANDPHONEWORK ) - ||(fieldType->FieldTypeResId() == R_VPBK_FIELD_TYPE_MOBILEPHONEWORK ) - ||(fieldType->FieldTypeResId() == R_VPBK_FIELD_TYPE_VOIPWORK ) - ||(fieldType->FieldTypeResId() == R_VPBK_FIELD_TYPE_VOIPHOME ) - ||(fieldType->FieldTypeResId() == R_VPBK_FIELD_TYPE_LANDPHONEGEN ) - ||(fieldType->FieldTypeResId() == R_VPBK_FIELD_TYPE_MOBILEPHONEGEN ) - ||(fieldType->FieldTypeResId() == R_VPBK_FIELD_TYPE_VOIPGEN ) - ||(fieldType->FieldTypeResId() == R_VPBK_FIELD_TYPE_SIP ) )) - { - const MVPbkContactFieldData& fieldData = field.FieldData(); - switch( fieldData.DataType() ) - { - case EVPbkFieldStorageTypeText: - { - TRACE( "Text" ); - retValue = MVPbkContactFieldTextData::Cast(fieldData).Text().AllocLC(); - break; - } - case EVPbkFieldStorageTypeUri: - { - TRACE( "begin" ) ; - retValue = MVPbkContactFieldUriData::Cast(fieldData).Text().AllocLC(); - break; - } - - }//End switch - if( retValue ) - { - TRACE( " begin" ); - TVIMPSTVPbkStoreEvent storeEvent(iStoreEventType, - NULL, - NULL, - *retValue, - KNullDesC ); - iStoreHandler.HandleVPbkStoreEventL( storeEvent ) ; - CleanupStack::PopAndDestroy(); // retValue; - retValue = NULL; - } - } - } - - } - -// --------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::RemoveAllVPbkContactsL -// -// --------------------------------------------------------- -TInt CVIMPSTStorageVPbkStoreHandler::RemoveAllVPbkContactsL() - { - TRACER_AUTO; - TRACE( " before if" ); - if(iAddIdInProgress) - { - TPtr iAddIdInProgressPtr = iAddIdInProgress->Des(); - TRACE( "iAddIdInProgressPtr = %S", &iAddIdInProgressPtr ); - delete iAddIdInProgress; - iAddIdInProgress = NULL; - } - // intialize it to efalse as, somewhere it would have missed. - iCommitOperationInProgress = EFalse; - TRACE( " After if"); - TInt count = 0; - if( iContactView ) - { - count = iContactView->ContactCountL(); - } - TRACE( "count = %d",count) ; - TPtr iStoreNamePtr(iStoreName->Des() ); - TInt index = iStoreNamePtr.Find(_L(":") ); - if( index >= 0 && count ) - { - TPtrC store = iStoreNamePtr.Right( iStoreNamePtr.Length() - index -3 ); - CContactIdArray* contactIds = CContactIdArray::NewLC(); - CContactDatabase* contactDb = NULL; - //Open the database - TRAPD(err, contactDb = CContactDatabase::OpenL( store ) ); - if(err == KErrNone ) - { - CleanupStack::PushL( contactDb ); - // rest if already old ids exist - contactIds->Reset(); - TContactIter iterator(*contactDb); - TContactItemId contactId = iterator.FirstL(); - while(contactId != KNullContactId) - { - TRACE( "in side while" ); - // store into iContactIds for later deletion of contacts - contactIds->AddL(contactId ); - // get the next contactids - contactId = iterator.NextL(); - } - contactDb->DeleteContactsL(*contactIds); - // reset old ids - contactIds->Reset(); - CleanupStack::PopAndDestroy( contactDb ); - } - CleanupStack::PopAndDestroy( contactIds ); - } - - return count; - } - -// --------------------------------------------------------------------------- -// CVIMPSTStorageVPbkStoreHandler::ResetAndDestroyRArray -// --------------------------------------------------------------------------- -// -void CVIMPSTStorageVPbkStoreHandler::ResetAndDestroyRArray() - { - TRACER_AUTO; - TInt count = iPendingAvatars.Count(); - while( count ) - { - TVIMPSTAvatarData contactInf = iPendingAvatars[ 0 ]; - iPendingAvatars.Remove(0 ); - delete contactInf.iAvatarContent; - contactInf.iAvatarContent = NULL; - delete contactInf.iContactLink; - contactInf.iContactLink = NULL; - // not exist need to add - iPendingAvatars.Compress(); - count = iPendingAvatars.Count(); - } - iPendingAvatars.Reset(); - - } -// End of file