diff -r 2b7283837edb -r 3104fc151679 uiservicetab/vimpstdetailsviewplugin/src/cvimpstdetailscontacthandler.cpp --- a/uiservicetab/vimpstdetailsviewplugin/src/cvimpstdetailscontacthandler.cpp Thu Aug 19 09:41:53 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,822 +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: contact handler class implementaion to virtual phonebook observers - * -*/ - - -#include "cvimpstdetailscontacthandler.h" - -#include "mvimpstdetailsviewcontactobserver.h" -#include "cvimpstdetailsviewplugin.h" - -#include "tvimpstconsts.h" -#include "vimpstdetailsviewpluginuids.hrh" -#include - -// virtual phonebook -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -// cca -#include -#include -#include -#include -// system include -#include -#include - - -#include "uiservicetabtracer.h" -#include "vimpstutils.h" - -// ======== LOCAL FUNCTIONS ======== - -// ======== MEMBER FUNCTIONS ======== - -// --------------------------------------------------------------------------- -// CVIMPSTDetailsContactHandler::NewL -// --------------------------------------------------------------------------- -// -CVIMPSTDetailsContactHandler* CVIMPSTDetailsContactHandler::NewL( MCCAParameter& aParameter , - MVIMPSTDetailsViewContactObserver& aObserver, - const TDesC& aServiceStoreUri, - const TDesC& aServiceName, - TUint aserviceId - ) - { - TRACER_AUTO; - CVIMPSTDetailsContactHandler* self = - new(ELeave) CVIMPSTDetailsContactHandler( aObserver, aserviceId ); - CleanupStack::PushL(self); - self->ConstructL( aParameter, aServiceStoreUri, aServiceName ); - CleanupStack::Pop(self); - return self; - } - -// --------------------------------------------------------------------------- -// CVIMPSTDetailsContactHandler::~CVIMPSTDetailsContactHandler -// --------------------------------------------------------------------------- -// -CVIMPSTDetailsContactHandler::~CVIMPSTDetailsContactHandler() - { - - TRACER_AUTO; - Cancel(); - if (iWait.IsStarted()) - { - iWait.AsyncStop(); - } - delete iLinks; - delete iRetrieveOperation; - delete iXSPUserId; - delete iStoreContact; - if (iStoreList) - { - - TRACE("calling store close"); - iStoreList->CloseAll(*this); - iStoreList = NULL; - } - TRACE("iStoreList deleted"); - delete iServiceStoreUri; - TRACE("iServiceStoreUri deleted"); - delete iContactManager; - TRACE("iContactManager deleted"); - delete iServiceName; - TRACE("iServiceName deleted"); - delete iIdConverter; - - - } - -// --------------------------------------------------------------------------- -// CVIMPSTDetailsContactHandler::CVIMPSTDetailsContactHandler -// --------------------------------------------------------------------------- -// -CVIMPSTDetailsContactHandler::CVIMPSTDetailsContactHandler( - MVIMPSTDetailsViewContactObserver& aObserver,TUint aServiceId ) - : CActive(EPriorityStandard), - iObserver( aObserver ), - iStoreType( EStoreUnkwon ), - iServiceId (aServiceId ) - { - CActiveScheduler::Add(this); - } - -// --------------------------------------------------------------------------- -// CVIMPSTDetailsContactHandler::ConstructL -// --------------------------------------------------------------------------- -// -void CVIMPSTDetailsContactHandler::ConstructL( MCCAParameter& aParameter ,const TDesC& aServiceStoreUri,const TDesC& aServiceName ) - { - - TRACER_AUTO; - CVPbkContactStoreUriArray* uriArray = CVPbkContactStoreUriArray::NewLC(); - TUid launchUid = TUid::Null() ; - iServiceStoreUri = aServiceStoreUri.AllocL(); - iServiceName = aServiceName.AllocL(); - //find whether its a local store or xsp store - if ( iServiceStoreUri && VPbkContactStoreUris::DefaultCntDbUri().Compare( *iServiceStoreUri ) - != 0 ) - { - iStoreType = EStoreServer; // store has xsp store - } - else - { - iStoreType = EStoreLocal; // same as phonebook2 store name - } - launchUid = aParameter.LaunchedViewUid(); - //always load the default store plus the corresponding service store - uriArray->AppendL(TVPbkContactStoreUriPtr(VPbkContactStoreUris::DefaultCntDbUri())); - if( launchUid.iUid != (KVIMPSTDetailsViewPluginImplmentationUid + iServiceId) ) - { - // launched from other than service tab - // need to open service store - if ( iServiceStoreUri ) - { - TPtr serviceStoreNamePtr = iServiceStoreUri->Des(); - uriArray->AppendL( TVPbkContactStoreUriPtr( serviceStoreNamePtr ) ); - TRACE("ServiceStoreUriL() - storename3: %S", &serviceStoreNamePtr); - } - } - - HBufC& contactData = aParameter.ContactDataL(); - - HBufC8* buf = HBufC8::NewLC( contactData.Length() ); - buf->Des().Copy(contactData); - TPtrC8 bufDes( buf->Des() ); - - RDesReadStream readStream( bufDes ); - readStream.PushL(); - - const TInt versionNumber = readStream.ReadUint8L(); - - TInt uriCount = readStream.ReadUint16L(); - TRACE("ServiceStoreUriL() - uriCount = %d", uriCount); - // Read URIs - for ( TInt i = 0; i < uriCount; ++i ) - { - const TInt uriLength = readStream.ReadUint16L(); - HBufC* uriBuffer = HBufC::NewLC(uriLength); - TPtr uriPtr = uriBuffer->Des(); - readStream.ReadL( uriPtr, uriLength ); - if( uriPtr.Length() > 0 ) - { - uriArray->AppendL( TVPbkContactStoreUriPtr( uriPtr ) ); - TRACE("ServiceStoreUriL() - storename4: %S", &uriPtr); - } - CleanupStack::PopAndDestroy( uriBuffer ); - } - CleanupStack::PopAndDestroy(); // readStream - CleanupStack::PopAndDestroy(); // buf - - - iContactManager = CVPbkContactManager::NewL(*uriArray); - CleanupStack::PopAndDestroy(); // uriArray - - iStoreList = &iContactManager->ContactStoresL(); - iStoreList->OpenAllL(*this); - - if( !iWait.IsStarted() ) - { - iWait.Start(); - } - if(iStoreType == EStoreLocal) - { - const TDesC& contactdb = VPbkContactStoreUris::DefaultCntDbUri(); - MVPbkContactStore* contactStore = iStoreList->Find(TVPbkContactStoreUriPtr(contactdb)); - iIdConverter = CVPbkContactIdConverter::NewL(*contactStore); - } - - } - - -// --------------------------------------------------------------------------- -// CVIMPSTDetailsContactHandler::GetDisplayNameLC -// --------------------------------------------------------------------------- -// -HBufC* CVIMPSTDetailsContactHandler::GetDisplayNameLC() - { - TRACER_AUTO; - HBufC* firstName = KNullDesC().AllocL(); - HBufC* lastName = KNullDesC().AllocL(); - HBufC* retValue = NULL; - if( iStoreContact ) - { - MVPbkStoreContactFieldCollection& fieldCollection = iStoreContact->Fields(); - TInt fieldCount = fieldCollection.FieldCount(); - for( TInt i=0; i< fieldCount; i++ ) - { - MVPbkStoreContactField& field = fieldCollection.FieldAt( i ); - const MVPbkFieldType* type = field.BestMatchingFieldType() ; - if( R_VPBK_FIELD_TYPE_FIRSTNAME == type->FieldTypeResId() ) - { - const MVPbkContactFieldData& fieldData = field.FieldData(); - if( fieldData.DataType() == EVPbkFieldStorageTypeText ) - { - delete firstName; - firstName = MVPbkContactFieldTextData::Cast(fieldData).Text().AllocL(); - break; - } - } - } - for( TInt i=0; i< fieldCount; i++ ) - { - MVPbkStoreContactField& field = fieldCollection.FieldAt( i ); - const MVPbkFieldType* type = field.BestMatchingFieldType() ; - if( R_VPBK_FIELD_TYPE_LASTNAME == type->FieldTypeResId() ) - { - const MVPbkContactFieldData& fieldData = field.FieldData(); - if( fieldData.DataType() == EVPbkFieldStorageTypeText ) - { - delete lastName; - lastName = MVPbkContactFieldTextData::Cast(fieldData).Text().AllocL(); - break; - } - } - } - TPtr ptrFirstName = firstName->Des(); - TPtr ptrLastName = lastName->Des(); - if(ptrFirstName.Length() || ptrLastName.Length()) - { - retValue = HBufC::NewLC(ptrFirstName.Length()+ ptrLastName.Length() + 1); - TPtr ptrRet = retValue->Des(); - ptrRet.Append(ptrFirstName); - if(ptrFirstName.Length()) - { - //append one space before appending lastname - ptrRet.Append(' '); - } - ptrRet.Append(ptrLastName); - } - else - { - retValue = VIMPSTUtils::LoadResourceL( R_SERVDETAIL_UNNAMED ); - CleanupStack::PushL(retValue); - } - } - delete firstName; - delete lastName; - return retValue; - } - -// --------------------------------------------------------------------------- -// CVIMPSTDetailsContactHandler:: -// --------------------------------------------------------------------------- -// -void CVIMPSTDetailsContactHandler::SetLinks( - MVPbkContactLinkArray* aLinks, TBool aReadXspId ) - { - - TRACER_AUTO; - delete iLinks; - iLinks = NULL; - iLinks = aLinks; - TRACE("iLinks deleted"); - iCurrentLink = NULL; - - iReadXspId = aReadXspId; - if( iRetrieveOperation ) - { - delete iRetrieveOperation; - iRetrieveOperation = NULL; - TRACE("iRetrieveOperation deleted"); - } - TRACE("calling issue request"); - IssueRequest(); - - } - -// --------------------------------------------------------------------------- -// CVIMPSTDetailsContactHandler::Links -// --------------------------------------------------------------------------- -// -MVPbkContactLinkArray* CVIMPSTDetailsContactHandler::Links() const - { - return iLinks; - } - -// --------------------------------------------------------------------------- -// CVIMPSTDetailsContactHandler::GetXSPUserId -// --------------------------------------------------------------------------- -// -const TDesC& CVIMPSTDetailsContactHandler::GetXSPUserId() - { - if( iXSPUserId ) - { - return *iXSPUserId; - } - return KNullDesC; - } - -// -------------------------------------------------------------------------- -// CVIMPSTDetailsContactHandler::ContactStoresL -// -------------------------------------------------------------------------- -// -MVPbkContactStoreList& CVIMPSTDetailsContactHandler::ContactStoresL() - { - return *iStoreList; - } -// -------------------------------------------------------------------------- -// CVIMPSTDetailsContactHandler::StoreType -// -------------------------------------------------------------------------- -// -TStoreType CVIMPSTDetailsContactHandler::StoreType() - { - return iStoreType; - } - - // ------------------------------------------------------------------------- -// CVIMPSTDetailsContactHandler::CancelOngoingRequest -// -------------------------------------------------------------------------- -// -void CVIMPSTDetailsContactHandler::CancelOngoingRequest() - { - TRACER_AUTO; - delete iRetrieveOperation; - iRetrieveOperation = NULL; - TRACE("iRetrieveOperation deleted"); - delete iXSPUserId; - iXSPUserId = NULL; - TRACE("iXSPUserId deleted"); - delete iStoreContact; - iStoreContact = NULL; - TRACE("iStoreContact deleted"); - delete iLinks; - iLinks = NULL; - - } -// --------------------------------------------------------------------------- -// CVIMPSTDetailsContactHandler::RunL -// --------------------------------------------------------------------------- -// -void CVIMPSTDetailsContactHandler::RunL() - { - - TRACER_AUTO; - TInt index = 0; - if (iLinks && iCurrentLink ) - { - TRACE("next link"); - index = iLinks->Find(*iCurrentLink) + 1; - } - if ( iLinks && index < iLinks->Count() ) - { - TRACE("calling retrive"); - // will get called until the index become equal to count - iCurrentLink = &iLinks->At(index); - TRAPD( err, iRetrieveOperation = iContactManager->RetrieveContactL(*iCurrentLink, *this) ); - TRACE("retrive called err = %d", err); - } - else - { - TRACE("job finished"); - iCurrentLink = NULL; - } - - } - -// --------------------------------------------------------------------------- -// CVIMPSTDetailsContactHandler::RunError -// --------------------------------------------------------------------------- -// -TInt CVIMPSTDetailsContactHandler::RunError(TInt aError) - { - return aError; - } - -// --------------------------------------------------------------------------- -// CVIMPSTDetailsContactHandler::DoCancel -// --------------------------------------------------------------------------- -// -void CVIMPSTDetailsContactHandler::DoCancel() - { - } - - -// --------------------------------------------------------------------------- -// CVIMPSTDetailsContactHandler::VPbkSingleContactOperationComplete -// --------------------------------------------------------------------------- -// -void CVIMPSTDetailsContactHandler::VPbkSingleContactOperationComplete( - MVPbkContactOperationBase& /*aOperation*/, - MVPbkStoreContact* aContact) - { - TRACER_AUTO; - TBool isIssueReguest = ETrue; - - delete iRetrieveOperation; - iRetrieveOperation = NULL; - - delete iStoreContact; - iStoreContact = NULL; - iStoreContact = aContact; - - if( iStoreContact && iReadXspId ) - { - MVPbkStoreContactFieldCollection& fieldCollection = iStoreContact->Fields(); - - TInt fieldCount = fieldCollection.FieldCount(); - - for( TInt i=0; i< fieldCount; i++ ) - { - MVPbkStoreContactField& field = fieldCollection.FieldAt( i ); - const MVPbkFieldType* type = field.BestMatchingFieldType() ; - if( R_VPBK_FIELD_TYPE_IMPP == type->FieldTypeResId() ) - { - const MVPbkContactFieldData& fieldData = field.FieldData(); - if( fieldData.DataType() == EVPbkFieldStorageTypeUri ) - { - TPtrC scheme = MVPbkContactFieldUriData::Cast(fieldData).Scheme(); - if(iServiceName->Compare(scheme) == 0) - { - TRACE("EVPbkFieldStorageTypeUri called"); - const MVPbkContactFieldUriData& uri = MVPbkContactFieldUriData::Cast(fieldData); - HBufC* user = NULL; - delete iXSPUserId; - iXSPUserId = NULL; - // call back api is not leaving function - TRAP_IGNORE( user = uri.Uri().AllocL() ; - if( user ) - { - CleanupStack::PushL( user ); - TPtr userPtr( user->Des() ); - TInt index = userPtr.Find( KColon ); - if( index != KErrNotFound ) - { - TInt length = userPtr.Length(); - iXSPUserId = userPtr.Right( length - index - 1 ).AllocL() ; - } - CleanupStack::PopAndDestroy();// user - } - TRACE("EVPbkFieldStorageTypeUri end"); - ); - break; - } - } - } - } - if( iXSPUserId && iContactManager ) - { - - TRACE("search is called"); - // call back api is not leaving function - TRAP_IGNORE( iRetrieveOperation = iContactManager->FindL(*iXSPUserId, iContactManager->FieldTypes(),*this) ); - isIssueReguest = EFalse; - } - else - { - // call back api is not leaving function - TRAP_IGNORE( iObserver.HandleContactUnavailableL() ); - } - } - else if( iStoreContact ) - { - - TRACE("iStoreContact Valid"); - TBool validLink = ETrue; - if( iStoreType == EStoreLocal && iCurrentLink ) - { - //Local Store - // to check whether this contact has been added to the ServiceTab. with the help of db file - validLink = CheckWhetherValidLocalLinkL( *iCurrentLink); - } - if( validLink ) - { - - TRACE("HandleContactReadyL "); - TRAP_IGNORE( iObserver.HandleContactReadyL( *iStoreContact ) ); - } - else - { - - TRACE("No data "); - TRAP_IGNORE( iObserver.HandleContactUnavailableL() ); - } - } - if( isIssueReguest ) - { - IssueRequest(); - } - - } - -// --------------------------------------------------------------------------- -// CVIMPSTDetailsContactHandler::VPbkSingleContactOperationFailed -// --------------------------------------------------------------------------- -// -void CVIMPSTDetailsContactHandler::VPbkSingleContactOperationFailed( - MVPbkContactOperationBase& /*aOperation*/, - TInt /*aError*/) - { - - TRACER_AUTO; - delete iRetrieveOperation; - iRetrieveOperation = NULL; - - TInt index = 0; - if (iLinks && iCurrentLink) - { - index = iLinks->Find(*iCurrentLink) + 1; - - if ( index >= iLinks->Count() ) - { - - TRACE("calling HandleContactUnavailableL start "); - TRAP_IGNORE( iObserver.HandleContactUnavailableL() ); - - TRACE("calling HandleContactUnavailableL end"); - return; - } - } - IssueRequest(); - - } - -// --------------------------------------------------------------------------- -// CVIMPSTDetailsContactHandler::FindCompleteL -// --------------------------------------------------------------------------- -// -void CVIMPSTDetailsContactHandler::FindCompleteL( MVPbkContactLinkArray* aResults ) - { - - TRACER_AUTO; - CVPbkContactLinkArray* linkArray = NULL; - delete iRetrieveOperation; - iRetrieveOperation = NULL; - if( aResults && iServiceStoreUri ) - { - TInt linkCount = aResults->Count(); - for( TInt a=0; a< linkCount; a++ ) - { - const MVPbkContactLink& link = aResults->At( a ) ; - MVPbkContactStore& store = link.ContactStore(); - const MVPbkContactStoreProperties& storeProperty = store.StoreProperties(); - if( storeProperty.Uri().UriDes().Compare( *iServiceStoreUri ) == 0 ) - { - - TRACE("one result found "); - linkArray = CVPbkContactLinkArray::NewLC(); - MVPbkContactLink* clone = link.CloneLC(); - // take ownership clone - linkArray->AppendL(clone); - CleanupStack::Pop(2); // clone, linkArray - TRACE("come out of loop "); - break; - } - } - } - delete aResults; - aResults = NULL; - TRACE("aResults deleted "); - if( linkArray ) - { - // take ownership linkArray - SetLinks( linkArray, EFalse ); - } - else - { - iObserver.HandleContactUnavailableL(); - } - - } -// --------------------------------------------------------------------------- -// CVIMPSTDetailsContactHandler:: -// --------------------------------------------------------------------------- -// -void CVIMPSTDetailsContactHandler::FindFailed( TInt /*aError*/ ) - { - TRACER_AUTO; - TRAP_IGNORE( iObserver.HandleContactUnavailableL() ); // takes ownership of contacts. - } - -// --------------------------------------------------------------------------- -// CVIMPSTDetailsContactHandler:: -// --------------------------------------------------------------------------- -// -void CVIMPSTDetailsContactHandler::IssueRequest(TInt aError) - { - if( !IsActive() ) - { - SetActive(); - TRequestStatus* status = &iStatus; - User::RequestComplete(status, aError); - } - } - -// -------------------------------------------------------------------------- -// CVIMPSTDetailsContactHandler::OpenComplete -// -------------------------------------------------------------------------- -// -void CVIMPSTDetailsContactHandler::OpenComplete() - { - - TRACER_AUTO; - if (iWait.IsStarted()) - { - iWait.AsyncStop(); - } - - } - -// -------------------------------------------------------------------------- -// CVIMPSTDetailsContactHandler::StoreReady -// -------------------------------------------------------------------------- -// -void CVIMPSTDetailsContactHandler::StoreReady(MVPbkContactStore& /*aContactStore*/ ) - { - - TRACER_AUTO; - } - -// -------------------------------------------------------------------------- -// CVIMPSTDetailsContactHandler::StoreUnavailable -// -------------------------------------------------------------------------- -// -void CVIMPSTDetailsContactHandler::StoreUnavailable( - MVPbkContactStore& /*aContactStore*/, - TInt /*aReason*/) - { - - TRACER_AUTO; - if (iWait.IsStarted()) - { - iWait.AsyncStop(); - } - - } - -// ------------------------------------------------------------------------- -// CVIMPSTDetailsContactHandler::HandleStoreEventL -// -------------------------------------------------------------------------- -// -void CVIMPSTDetailsContactHandler::HandleStoreEventL( - MVPbkContactStore& /*aContactStore*/, - TVPbkContactStoreEvent /*aStoreEvent*/) - { - - } - -// ----------------------------------------------------------- -// CVIMPSTDetailsContactHandler::CheckWhetherValidLocalLink -// ----------------------------------------------------------- -// - -TBool CVIMPSTDetailsContactHandler::CheckWhetherValidLocalLinkL( - const MVPbkContactLink& aCurrentLink ) - { - TRACER_AUTO; - TBool validLocalLink = EFalse; - User::LeaveIfError( iFs.Connect() ); - // Open existing or create new database. - if ( DbExists() ) - { - OpenDbL(); - OpenTableL(); - // Get Column number for contact data size - iColset = iDb.ColSetL( KContactTable ); - TInt32 linkId = iIdConverter->LinkToIdentifier(aCurrentLink); - TDbColNo colNo = iColset->ColNo( KContactId ); - validLocalLink = SeekRowL( colNo, linkId ); - CloseDb(); - } - return validLocalLink; - } - -//******************* Database Operations *********************************// -// ----------------------------------------------------------- -// CVIMPSTDetailsContactHandler::DbExists -// ----------------------------------------------------------- -// -TBool CVIMPSTDetailsContactHandler::DbExists() - { - TRACER_AUTO; - TBuf<512> dbName; - RFile temp; - TBuf< KMaxPath > storagePath; - - dbName.Append( iServiceName->Des() ); - dbName.Append( KStorageExtn ); - - storagePath.Append( KDbPath ); - storagePath.Append( dbName ); - - TInt err( temp.Open( iFs, *(&storagePath), EFileShareReadersOrWriters|EFileRead ) ); - - TInt size( 0 ); - if ( err == KErrNone ) - { - temp.Size( size ); - } - - temp.Close(); - - if ( size == 0 ) - { - return EFalse; - } - - return ( err == KErrNone ); - } - - - -// ----------------------------------------------------------- -// CVIMPSTDetailsContactHandler::OpenDbL -// ----------------------------------------------------------- -// -void CVIMPSTDetailsContactHandler::OpenDbL() - { - TRACER_AUTO; - TBuf< KMaxPath > storagePath; - TBuf<512> dbName; - dbName.Append( iServiceName->Des() ); - dbName.Append( KStorageExtn ); - - storagePath.Append( KDbPath ); - storagePath.Append( dbName ); - - iFileStore = CPermanentFileStore::OpenL( iFs, storagePath, EFileShareReadersOrWriters|EFileWrite ); - iFileStore->SetTypeL( iFileStore->Layout() ); - iDb.OpenL( iFileStore, iFileStore->Root() ); - } - -// ----------------------------------------------------------- -// CVIMPSTDetailsContactHandler::CloseDb -// ----------------------------------------------------------- -// -void CVIMPSTDetailsContactHandler::CloseDb() - { - iTable.Close(); - delete iColset; - delete iFileStore; - iFileStore = NULL; - iDb.Close(); - iFs.Close(); - } - -// ---------------------------------------------------------- -// CVIMPSTDetailsContactHandler::SeekRowL -// ---------------------------------------------------------- -// -TBool CVIMPSTDetailsContactHandler::SeekRowL( TDbColNo aColNo, TInt32& aIdentifier ) - { - TRACER_AUTO; - TBool ret = EFalse; - iTable.BeginningL(); - while ( iTable.NextL() ) - { - iTable.GetL(); - if ( iTable.ColInt32( aColNo ) == aIdentifier ) - { - ret = ETrue; - break; - } - } - return ret; - } - -// ---------------------------------------------------------- -// CVIMPSTDetailsContactHandler::OpenTableL -// ---------------------------------------------------------- -// -void CVIMPSTDetailsContactHandler::OpenTableL() - { - TRACER_AUTO; - TInt err( iTable.Open( iDb, KContactTable ) ); - if ( err != KErrNone ) - { - iTable.Close(); - User::Leave( err ); - return; - } - return; - } - -// End of File