diff -r 3104fc151679 -r 9a48e301e94b uiservicetab/vimpststorage/src/cvimpststoragevpbklocalstore.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiservicetab/vimpststorage/src/cvimpststoragevpbklocalstore.cpp Wed Sep 01 12:33:36 2010 +0100 @@ -0,0 +1,1071 @@ +/* +* 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 local store +* +*/ + +// INCLUDE FILES +#include +#include "cvimpststoragevpbklocalstore.h" + +#include "cvimpststoragevpbkstorehandler.h" + +#include +#include +#include "mvimpststorageserviceview.h" +#include "uiservicetabtracer.h" +#include "tvimpstconsts.h" +#include +#include +#include "cvimpststoragecontact.h" +#include "vimpststorageutils.h" + +#include +#include + + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore:: +// CVIMPSTStorageVPbkLocalStore +// --------------------------------------------------------------------------- +// +CVIMPSTStorageVPbkLocalStore:: CVIMPSTStorageVPbkLocalStore( MVIMPSTStorageServiceCacheWriter& aServiceCacheWriter ): + CActive( CActive::EPriorityIdle ), + iServiceCacheWriter( aServiceCacheWriter ), + iFetchStep( EFetchingUnknown ) + { + TRACER_AUTO; + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::NewL +// --------------------------------------------------------------------------- +// +CVIMPSTStorageVPbkLocalStore* CVIMPSTStorageVPbkLocalStore::NewL( const TDesC& aContactDb, + const TDesC& aServiceName, + MVIMPSTStorageServiceCacheWriter& aServiceCacheWriter ) + { + TRACER_AUTO; + CVIMPSTStorageVPbkLocalStore* self = NewLC( aContactDb, + aServiceName, + aServiceCacheWriter); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::NewLC +// --------------------------------------------------------------------------- +// +CVIMPSTStorageVPbkLocalStore* + CVIMPSTStorageVPbkLocalStore::NewLC( const TDesC& aContactDb, + const TDesC& aServiceName, + MVIMPSTStorageServiceCacheWriter& aServiceCacheWriter ) + { + TRACER_AUTO; + + CVIMPSTStorageVPbkLocalStore* self = + new (ELeave) CVIMPSTStorageVPbkLocalStore(aServiceCacheWriter); + CleanupStack::PushL( self ); + self->ConstructL( aContactDb, aServiceName ); + + return self; + } +// --------------------------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::ConstructL +// --------------------------------------------------------------------------- +// +void CVIMPSTStorageVPbkLocalStore::ConstructL( const TDesC& aContactDb, const TDesC& aServiceName ) + { + TRACER_AUTO; + + iVPbkStoreHandler = CVIMPSTStorageVPbkStoreHandler::NewL( aContactDb ,aServiceName, *this,ETrue ); + TRACE( "iVPbkStoreHandler created" ); + //construct the persistent store name + iLocalDBName = HBufC::NewL( aServiceName.Length()+ KStorageExtn().Length()); + TPtr iLocalDBNamePtr = iLocalDBName->Des(); + iLocalDBNamePtr.Append(aServiceName); + _LIT(KSpecialChar ,"/\\:*?<>\""); + AknTextUtils :: StripCharacters(iLocalDBNamePtr,KSpecialChar); + iLocalDBNamePtr.Append(KStorageExtn()); + TRACE( "iLocalDBNamePtr: %S", &iLocalDBNamePtr ); + MVPbkContactStore* defaultStore = iVPbkStoreHandler->GetDefaultStoreL( aContactDb ); + User::LeaveIfNull(defaultStore); + TRACE("defaultStore retrived" ); + iIdConverter = CVPbkContactIdConverter::NewL(*defaultStore); + TRACE( "iIdConverter created" ); + User::LeaveIfError( iFs.Connect() ); + // Open existing or create new database. + TRACE( "connected to file server" ); + if ( DbExists() ) + { + TRACE( "local db exist" ); + OpenDbL(); + TRACE( "open success" ); + } + else + { + TRACE("local db not exist" ); + DoFreespaceLevelCheckL( KEmptyDbSize ); + CreateDbL(); + TRACE("local db created"); + } + OpenTableL(); + TRACE("OpenTableL success " ); + iColset = iDb.ColSetL( KContactTable ); + TRACE( " iColset is set" ); + + } + +// --------------------------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore:: +// ~CVIMPSTStorageVPbkLocalStore +// --------------------------------------------------------------------------- +// +CVIMPSTStorageVPbkLocalStore::~CVIMPSTStorageVPbkLocalStore() + { + TRACER_AUTO; + + iRetrivedContactArray.ResetAndDestroy(); + TRAP_IGNORE( ResetAndDestroyLocalArrayL() ); + + CloseTable(); + delete iColset; + CloseDb(); + iFs.Close(); + + delete iLocalDBName; + delete iIdConverter; + delete iInviteId; + delete iVPbkStoreHandler; + + } + + // --------------------------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore:: +// ResetAndDestroyLocalArrayL +// --------------------------------------------------------------------------- +// +void CVIMPSTStorageVPbkLocalStore::ResetAndDestroyLocalArrayL() + { + TRACER_AUTO; + TInt count = iFetchContactsToBeAdded.Count(); + while( count ) + { + TVIMPSTContactInfo contactInf = iFetchContactsToBeAdded[ count-1 ]; + iFetchContactsToBeAdded.Remove( count-1 ); + delete contactInf.iUserId; + contactInf.iUserId = NULL; + delete contactInf.iDisplayName; + contactInf.iDisplayName = NULL; + // not exist need to add + iFetchContactsToBeAdded.Compress(); + count = iFetchContactsToBeAdded.Count(); + } + iFetchContactsToBeAdded.Reset(); + + } + +// ---------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::LocalStore +// ---------------------------------------------------------- +// +TBool CVIMPSTStorageVPbkLocalStore::LocalStore() const + { + TRACER_AUTO; + return ETrue; + } +// --------------------------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::HandleVPbkStoreEventL +// --------------------------------------------------------------------------- +// +void CVIMPSTStorageVPbkLocalStore::HandleVPbkStoreEventL(TVIMPSTVPbkStoreEvent aVPbkStoreEvent) + { + TRACER_AUTO; + switch( aVPbkStoreEvent.iEventType ) + { + case EVPbkContactReadCompleted: + { + TRACE( " EVPbkContactReadCompleted started" ); + iServiceCacheWriter.NotifyServiceViewL(TVIMPSTEnums::EStorageContactReadComplete); + if( iFetchStep == EFetchingCalled ) + { + TRACE( " EVPbkContactReadCompleted EFetchingCalled " ); + IssueRequest(); + } + iFetchStep = EContactReadComplete; + TRACE( "EContactReadComplete completed " ); + break; + } + case EVPbkContactReading: + { + // a contact entry has been created in virtual database store + // create the cache contact + TInt32 linkId = iIdConverter->LinkToIdentifier(*aVPbkStoreEvent.iContactLink ); + TDbColNo colNo = iColset->ColNo( KContactId ); + if ( SeekRowL( colNo, linkId ) ) + { + TRACE( "EVPbkContactReading contact" ); + /* + * This is local store, that is phone book and service tab shares only one cdb file. + * in that case, if somebody edits the cdb file from contacts tab, then also we get the + * callback, then checking for entry in db table makes sens.. + */ + /* + * in case when the user adds a contact from the service tab, then it first tries to add it in the + * cdb file, after that we get this callback, then , there is no way that it will be present in the + * db table, in that case, we will not add it in the cache - which is wrong.. + * so we need to make a differentiation, on how the contact was added.. whether from cotnacts tab + * or from the service tab. --- to solve this issue.. we can store the userid in memberVariable.. + * before making a add request to the VPBK (cdb file).. then in this function, we check if + * the contactid is same as the member variable. aVPbkStoreEvent contains the userid that was added. + * then if it matches, then we know that it was added from our service tab.. and then we can add it in our DB. + */ + // contatc found in local database ,add to storage + iServiceCacheWriter.AddContactToCacheL (*aVPbkStoreEvent.iContactLink , + aVPbkStoreEvent.iUserId , + aVPbkStoreEvent.iDisplayName, + aVPbkStoreEvent.iAvatarContent, + TVIMPSTEnums::EStorageContactReading ); + } + + break; + } + case EVPbkContactFetching: + case EVPbkContactAdded: + { + // a contact entry has been created in virtual database store + // create the cache contact + TInt32 linkId = iIdConverter->LinkToIdentifier(*aVPbkStoreEvent.iContactLink ); + TDbColNo colNo = iColset->ColNo( KContactId ); + if( iFetchStep == EFetchingOn ) + { + TRACE( "EVPbkContactFetching contact" ); + WriteToStoreDbL( linkId ); + iServiceCacheWriter.AddContactToCacheL (*aVPbkStoreEvent.iContactLink , + aVPbkStoreEvent.iUserId , + aVPbkStoreEvent.iDisplayName , + aVPbkStoreEvent.iAvatarContent, + TVIMPSTEnums::EStorageContactFetching ); + IssueRequest(); + } + else if ( SeekRowL( colNo, linkId ) ) + { + TRACE( " EVPbkContactAdded start" ); + /* + * This is local store, that is phone book and service tab shares only one cdb file. + * in that case, if somebody edits the cdb file from contacts tab, then also we get the + * callback, then checking for entry in db table makes sens.. + */ + /* + * in case when the user adds a contact from the service tab, then it first tries to add it in the + * cdb file, after that we get this callback, then , there is no way that it will be present in the + * db table, in that case, we will not add it in the cache - which is wrong.. + * so we need to make a differentiation, on how the contact was added.. whether from cotnacts tab + * or from the service tab. --- to solve this issue.. we can store the userid in memberVariable.. + * before making a add request to the VPBK (cdb file).. then in this function, we check if + * the contactid is same as the member variable. aVPbkStoreEvent contains the userid that was added. + * then if it matches, then we know that it was added from our service tab.. and then we can add it in our DB. + */ + // contatc found in local database ,add to storage + iServiceCacheWriter.AddContactToCacheL (*aVPbkStoreEvent.iContactLink , + aVPbkStoreEvent.iUserId , + aVPbkStoreEvent.iDisplayName, + aVPbkStoreEvent.iAvatarContent, + TVIMPSTEnums::EStorageEventContactAddition ); + TRACE( "EVPbkContactAdded completed" ); + } + else if( iInviteId ) + { + TRACE( "iInviteId accepted" ); + if( IsSameContactIdL( *iInviteId, aVPbkStoreEvent.iUserId ) ) + { + WriteToStoreDbL( linkId ); + iServiceCacheWriter.AddContactToCacheL (*aVPbkStoreEvent.iContactLink , + aVPbkStoreEvent.iUserId , + aVPbkStoreEvent.iDisplayName, + aVPbkStoreEvent.iAvatarContent, + TVIMPSTEnums::EStorageEventContactAddition ); + delete iInviteId; + iInviteId = NULL; + } + TRACE( "iInviteId accepted sucess" ); + } + break; + } + case EVPbkContactSynchronizing: + { + TRACE( "EVPbkContactSynchronizing " ); + // a contact entry has been created in virtual database store + // create the cache contact + TInt32 linkId = iIdConverter->LinkToIdentifier(*aVPbkStoreEvent.iContactLink ); + TDbColNo colNo = iColset->ColNo( KContactId ); + if ( SeekRowL( colNo, linkId ) ) + { + /* + * This is local store, that is phone book and service tab shares only one cdb file. + * in that case, if somebody edits the cdb file from contacts tab, then also we get the + * callback, then checking for entry in db table makes sens.. + */ + /* + * in case when the user adds a contact from the service tab, then it first tries to add it in the + * cdb file, after that we get this callback, then , there is no way that it will be present in the + * db table, in that case, we will not add it in the cache - which is wrong.. + * so we need to make a differentiation, on how the contact was added.. whether from cotnacts tab + * or from the service tab. --- to solve this issue.. we can store the userid in memberVariable.. + * before making a add request to the VPBK (cdb file).. then in this function, we check if + * the contactid is same as the member variable. aVPbkStoreEvent contains the userid that was added. + * then if it matches, then we know that it was added from our service tab.. and then we can add it in our DB. + */ + // contatc found in local database ,add to storage + iServiceCacheWriter.AddContactToCacheL (*aVPbkStoreEvent.iContactLink , + aVPbkStoreEvent.iUserId , + aVPbkStoreEvent.iDisplayName, + aVPbkStoreEvent.iAvatarContent, + TVIMPSTEnums::EStorageContactFetching ); + } + if(iFetchStep == EFetchingOn) + { + TRACE( "EVPbkContactSynchronizing fetchin on" ); + IssueRequest(); + } + TRACE(" EVPbkContactSynchronizing completed" ); + break; + } + case EVPbkContactDeleted: + { + TRACE( "EVPbkContactDeleted" ); + TInt32 linkId = iIdConverter->LinkToIdentifier(*aVPbkStoreEvent.iContactLink ); + // a contact entry has been deleted from virtual database store + TDbColNo colNo = iColset->ColNo( KContactId ); + if ( SeekRowL( colNo, linkId ) ) + { + TRACE( "EVPbkContactDeleted found in db" ); + // contatc found in local database ,delete from local database + DeleteContactFromInternalStoreL( linkId ); + TRACE( "EVPbkContactDeleted deleted from db" ); + // delete from cache contact + iServiceCacheWriter.RemoveContactFromCacheL(*aVPbkStoreEvent.iContactLink, + TVIMPSTEnums::EStorageEventDeleteFromPbk ); + TRACE( "EVPbkContactDeleted deleted from cache" ); + } + break; + } + case EVPbkContactChanged: + { + TRACE( "EVPbkContactChanged "); + TInt32 linkId = iIdConverter->LinkToIdentifier(*aVPbkStoreEvent.iContactLink ); + TDbColNo colNo = iColset->ColNo( KContactId ); + if ( SeekRowL( colNo, linkId ) ) + { + TRACE( "EVPbkContactChanged found in local db" ); + // found in the list update it + iServiceCacheWriter.UpdateCacheContactL(*aVPbkStoreEvent.iContactLink , + aVPbkStoreEvent.iUserId , + aVPbkStoreEvent.iDisplayName, + aVPbkStoreEvent.iAvatarContent ); + TRACE( "EVPbkContactChanged changed in cache"); + } + break; + } + case EVPbkContactRetriving: + { + TRACE( "EVPbkContactRetriving"); + // in case of local we allow all + TRACE( "EVPbkContactRetriving valid Id"); + CVIMPSTStorageContact* retrivedContact = CVIMPSTStorageContact::NewL( aVPbkStoreEvent.iUserId , + aVPbkStoreEvent.iDisplayName, + *aVPbkStoreEvent.iContactLink, + aVPbkStoreEvent.iAvatarContent); + iRetrivedContactArray.Append( retrivedContact ); // takes the ownership of retrivedContact + TRACE( "EVPbkContactRetriving valid Id added" ); + // keep the backup of retrieved contacts + // user can add later once it sent to server + break; + } + case EVPbkUnknownChanges: + { + TRACE("EVPbkUnknownChanges start" ); + DeleteAllContactFromInternalStoreL(); + TRACE( " EVPbkUnknownChanges all delete from db" ); + // unknow mean all contact deleted from store + iServiceCacheWriter.RemoveAllCacheContactsL(); + TRACE( " EVPbkUnknownChanges all delete from cache" ); + break; + } + default: + break; + } + + } + + +// -------------------------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::IssueRequest +// -------------------------------------------------------------------------- +// +void CVIMPSTStorageVPbkLocalStore::IssueRequest() + { + TRACER_AUTO; + if( !IsActive() ) + { + TRACE( "SetActive" ); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + SetActive(); + } + + } + +// -------------------------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::RunL +// -------------------------------------------------------------------------- +// +void CVIMPSTStorageVPbkLocalStore::RunL() + { + TRACER_AUTO; + TInt count = iFetchContactsToBeAdded.Count(); + TRACE( "count to be added = %d ",count ); + if( !count ) + { + TRACE(" fetch completed " ); + iFetchStep = EContactReadComplete; + iServiceCacheWriter.NotifyServiceViewL( TVIMPSTEnums::EStorageContactFetchComplete ); + TRACE( "fetch completed notification sent" ); + } + else + { + TRACE( "fetch in progress" ); + iFetchStep = EFetchingOn; + TVIMPSTContactInfo contactInfoToAdd = iFetchContactsToBeAdded[0]; + MVIMPSTStorageContact* exist = iServiceCacheWriter.FindCacheContactByUserId( *contactInfoToAdd.iUserId ); + if( exist ) + { + // contact is already exist ,send the notification about this + iServiceCacheWriter.NotifyServiceViewL(TVIMPSTEnums::EStorageContactFetchExistInStore, exist ); + TRACE( " fetch in progress id exist" ); + // process next + IssueRequest(); + } + else + { + TRACE( "fetch in progress create id in store called" ); + // pass the display NAme in place of NULL + iVPbkStoreHandler->CreateVPbkContactL( *contactInfoToAdd.iUserId, *contactInfoToAdd.iDisplayName ); // process always 0th item + } + iFetchContactsToBeAdded.Remove( 0 ); + delete contactInfoToAdd.iUserId; + contactInfoToAdd.iUserId = NULL; + delete contactInfoToAdd.iDisplayName; + contactInfoToAdd.iDisplayName = NULL ; + iFetchContactsToBeAdded.Compress(); + TRACE( "fetch in progress iFetchContactsToBeAdded ,one entry removed" ); + } + + } + +// -------------------------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::DoCancel +// -------------------------------------------------------------------------- +// +void CVIMPSTStorageVPbkLocalStore::DoCancel() + { + TRACER_AUTO; + } + +// -------------------------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::RunError +// -------------------------------------------------------------------------- +// +TInt CVIMPSTStorageVPbkLocalStore::RunError( TInt aError ) + { + TRACER_AUTO; + return aError; + } + +////////////////////////////////////////////////////////// +// --------------------------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::CreateVPbkContactL +// --------------------------------------------------------------------------- +// +TInt CVIMPSTStorageVPbkLocalStore::CreateVPbkContactL(const TDesC& aUserId, + const TDesC& aDisplayName , + TBool aInvitationAutoAccept /* = EFalse */ ) + { + TRACER_AUTO; + TInt error = KErrGeneral; + if( aInvitationAutoAccept) + { + TRACE("autoaccept add contact" ); + delete iInviteId; + iInviteId = NULL; + iInviteId = aUserId.AllocL(); + error = iVPbkStoreHandler->CreateVPbkContactL( *iInviteId,aDisplayName ); + } + TRACE( "error = %d",error ); + + return error; + } + +// --------------------------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::RemoveVPbkContactL +// --------------------------------------------------------------------------- +// +TInt CVIMPSTStorageVPbkLocalStore::RemoveVPbkContactL(const MVPbkContactLink& aContactLink) + { + TRACER_AUTO;; + TInt error = KErrNotFound; + // text now holds the name (or first field of the contact) + TInt32 linkId = iIdConverter->LinkToIdentifier(aContactLink); + // a contact entry has been deleted from virtual database store + TDbColNo colNo = iColset->ColNo( KContactId ); + if ( SeekRowL( colNo, linkId ) ) + { + TRACE( "link exist in db" ); + // contatc found in local database ,delete from local database + DeleteContactFromInternalStoreL( linkId ); + TRACE( "link deleted from db" ); + // delete from cache contact + error = iServiceCacheWriter.RemoveContactFromCacheL(aContactLink, + TVIMPSTEnums::EStorageEventContactDelete ); + TRACE( "link deleted from cache" ); + } + TRACE("error %d",error ); + + return error; + } + +// --------------------------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::RemoveAllVPbkContactsL +// --------------------------------------------------------------------------- +// +TInt CVIMPSTStorageVPbkLocalStore::RemoveAllVPbkContactsL() + { + TRACER_AUTO; + iRetrivedContactArray.ResetAndDestroy(); + DeleteAllContactFromInternalStoreL(); + TRACE( "all contacts deleted from db" ); + iServiceCacheWriter.RemoveAllCacheContactsL(); + TRACE( "all contacts deleted from cache" ); + + return KErrNone;// local store : delete from local store ,own user has changed + } +// --------------------------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::RetrieveVPbkXSPIdL +// --------------------------------------------------------------------------- +// +TInt CVIMPSTStorageVPbkLocalStore::RetrieveVPbkXSPIdL(const TDesC8& aPackedLinks ) + { + TRACER_AUTO; + iRetrivedContactArray.ResetAndDestroy(); + TRACE( " iRetrivedContactArray Reset" ); + iVPbkStoreHandler->RetrieveVPbkContactL( aPackedLinks ); + TRACE( "iRetrivedContactArray count= %d " ,iRetrivedContactArray.Count() ); + + return iRetrivedContactArray.Count(); + } + + // --------------------------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::GetRetrieveVPbkXSPIdL +// --------------------------------------------------------------------------- +// +const TDesC& CVIMPSTStorageVPbkLocalStore::GetRetrieveVPbkXSPIdL(TInt aIndex ) + { + TRACER_AUTO; + TRACE( "aIndex = %d" ,aIndex ); + MVIMPSTStorageContact* contact = NULL; + if( aIndex >= 0 && aIndex < iRetrivedContactArray.Count() ) + { + contact = iRetrivedContactArray[ aIndex ]; + } + + return contact ? contact->UserId() : KNullDesC ; + } +// --------------------------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::CreateRetriveVPbkContactL +// --------------------------------------------------------------------------- +// +TInt CVIMPSTStorageVPbkLocalStore::CreateRetriveVPbkContactL( TInt aIndexToUse ) + { + TRACER_AUTO; + if( aIndexToUse < 0 && aIndexToUse >= iRetrivedContactArray.Count() ) + { + TRACE( " argument error" ); + return KErrArgument; + } + TInt error = KErrAlreadyExists; + MVIMPSTStorageContact* retrivedContact = iRetrivedContactArray[ aIndexToUse ]; + + MVPbkContactLink* contactLink = retrivedContact->ContactLink(); + MVIMPSTStorageContact* exist = NULL; + if( contactLink ) + { + exist = iServiceCacheWriter.FindCacheContactByLink( *contactLink ); + } + if( !exist ) + { + TRACE( "adding to cache" ); + MVPbkContactLink* link = retrivedContact->ContactLink(); + if( link ) + { + CVIMPSTStorageContact* contactToAdd = CVIMPSTStorageContact::NewL( retrivedContact->UserId() , + retrivedContact->Name(), + *link, + retrivedContact->AvatarContent() + ); + CleanupStack::PushL( contactToAdd ); + TInt32 linkId = iIdConverter->LinkToIdentifier( *link ); + error = iServiceCacheWriter.AddStorageContactToCacheL( contactToAdd ); // contactToAdd ownership is transfered + TRACE( " adding to cache done" ); + if( error == KErrNone ) + { + CleanupStack::Pop(); // contactToAdd , Ownership is transfered to AddStorageContactToCacheL + WriteToStoreDbL( linkId ); + } + else + { + CleanupStack::PopAndDestroy(); // contactToAdd + } + TRACE( " adding to db done" ); + } + } + TRACE( "error =%d" ,error ); + + return error; + } + +// --------------------------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::deleteRetriveVPbkContactL +// --------------------------------------------------------------------------- +// +TInt CVIMPSTStorageVPbkLocalStore::deleteRetriveVPbkContactL( TInt aIndexToUse ) + { + TRACER_AUTO; + if( aIndexToUse < 0 && aIndexToUse >= iRetrivedContactArray.Count() ) + { + TRACE( "argument error" ); + return KErrArgument; + } + MVIMPSTStorageContact* retrivedContact = iRetrivedContactArray[ aIndexToUse ]; + MVPbkContactLink* contactLink = retrivedContact->ContactLink(); + // delete from cache contact + CVPbkContactLinkArray* contactsToDelete = CVPbkContactLinkArray::NewLC(); + MVPbkContactLink* link = contactLink->CloneLC(); + contactsToDelete->AppendL( link ); // takes ownership + CleanupStack::Pop(); // link + TInt error = iVPbkStoreHandler->RemoveVPbkContactL( *contactsToDelete ); + CleanupStack::PopAndDestroy(); // contactsToDelete + + return error; + } +// CVIMPSTStorageVPbkLocalStore::UpdateAvatarFieldDataL() +// --------------------------------------------------------------------------- +// +TInt CVIMPSTStorageVPbkLocalStore::UpdateAvatarFieldDataL(const MVPbkContactLink& aContactLink, + const TDesC8& aAvatartData ) + { + TRACER_AUTO; + return iVPbkStoreHandler->UpdateAvatarFieldDataL( aContactLink, aAvatartData ); + } + +// --------------------------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::RemoveAvatarFieldL() +// --------------------------------------------------------------------------- +// +TInt CVIMPSTStorageVPbkLocalStore::RemoveAvatarFieldL(MVPbkStoreContact& aStoreContact) + { + TRACER_AUTO; + return iVPbkStoreHandler->RemoveAvatarFieldL( aStoreContact ); + } + +// --------------------------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::AddVPbkFetchContactsL() +// --------------------------------------------------------------------------- +// +void CVIMPSTStorageVPbkLocalStore::AddVPbkFetchContactsL( RArray & aFirstNameList, + RArray &aServiceField ) + { + TRACER_AUTO; + // in case of server contacts delete all contacts + ResetAndDestroyLocalArrayL(); + TInt count = aServiceField.Count(); + TRACE( " count=%d" ,count ); + for( TInt i = 0; i storagePath; + + storagePath.Append( KDbPath ); + storagePath.Append( *iLocalDBName ); + TBool ret = ETrue; + TInt err( temp.Open( iFs, *(&storagePath), EFileShareReadersOrWriters|EFileRead ) ); + TInt size( 0 ); + if ( err == KErrNone ) + { + temp.Size( size ); + } + temp.Close(); + if ( (size == 0) || ( err != KErrNone ) ) + { + ret = EFalse; + } + + return ret; + } + + +// ----------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::CreateDbL +// ----------------------------------------------------------- +// +void CVIMPSTStorageVPbkLocalStore::CreateDbL() + { + TRACER_AUTO; + TBuf< KMaxPath > storagePath; + storagePath.Append( KDbPath ); + iFs.MkDirAll( storagePath ); // make sure the directory exists + storagePath.Append( *iLocalDBName ); + iFs.SetAtt( *iLocalDBName ,KEntryAttHidden|KEntryAttSystem , KEntryAttNormal); + iFileStore = CPermanentFileStore::ReplaceL( iFs, storagePath, EFileShareReadersOrWriters|EFileWrite ); + + iFileStore->SetTypeL( iFileStore->Layout() ); + + TStreamId streamId( 0 ); + TRAPD( err, streamId = iDb.CreateL( iFileStore ) ); + + if( err ) + { + TRACE( " err = %d" ,err ); + delete iFileStore; + iFileStore = NULL; + + // remember to keep this updated + iFs.Delete( storagePath ); + User::Leave( err ); + } + + iFileStore->SetRootL( streamId ); + TInt err2( iFileStore->Commit() ); + User::LeaveIfError( err2 ); + + TRAPD( err3, CreateTablesL() ); + if( err3 ) + { + delete iFileStore; + iFileStore = NULL; + iDb.Close(); + iFs.Delete( storagePath ); + User::Leave( err3 ); + } + + } + +// ----------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::OpenDbL +// ----------------------------------------------------------- +// +void CVIMPSTStorageVPbkLocalStore::OpenDbL() + { + TRACER_AUTO; + TBuf< KMaxPath > storagePath; + storagePath.Append( KDbPath ); + storagePath.Append( *iLocalDBName ); + iFileStore = CPermanentFileStore::OpenL( iFs, storagePath, EFileShareReadersOrWriters|EFileWrite ); + iFileStore->SetTypeL( iFileStore->Layout() ); + iDb.OpenL( iFileStore, iFileStore->Root() ); + + } + +// ----------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::CloseDb +// ----------------------------------------------------------- +// +void CVIMPSTStorageVPbkLocalStore::CloseDb() + { + TRACER_AUTO; + delete iFileStore; + iFileStore = NULL; + iDb.Close(); + + } + +// ----------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::CreateTablesL +// ----------------------------------------------------------- +// +void CVIMPSTStorageVPbkLocalStore::CreateTablesL() + { + TRACER_AUTO; + CDbColSet* contactId = CDbColSet::NewLC(); + + AddColumnL( KContactId, EDbColInt32, contactId ); + + TInt err = iDb.CreateTable( KContactTable, *contactId ); + TRACE( "err = %d" ,err ); + User::LeaveIfError( err ); + + CleanupStack::PopAndDestroy( contactId ); + + } + +// ----------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::AddColumnL +// ----------------------------------------------------------- +// +void CVIMPSTStorageVPbkLocalStore::AddColumnL( const TDesC& aName, TDbColType aType, CDbColSet* aColset ) + { + TRACER_AUTO; + TDbCol column( aName, aType ); + aColset->AddL( column ); + + } + +// ----------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::DoFreespaceLevelCheckL +// ----------------------------------------------------------- +// +void CVIMPSTStorageVPbkLocalStore::DoFreespaceLevelCheckL( TInt aSize ) + { + TRACER_AUTO; + if ( SysUtil::FFSSpaceBelowCriticalLevelL( &iFs, aSize ) ) + { + User::Leave( KErrDiskFull ); + } + + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::DeleteAllContactFromInternalStoreL +// ----------------------------------------------------------------------------- +// +void CVIMPSTStorageVPbkLocalStore::DeleteAllContactFromInternalStoreL() + { + TRACER_AUTO; + iColset->ColNo( KContactId ); + iTable.LastL(); + while( !iTable.IsEmptyL() ) + { + iTable.GetL(); + iTable.DeleteL(); + iDb.Compact(); + // delete alwasy first item untill table is empty + iTable.LastL(); + } + + } +// ---------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::DeleteContactFromInternalStoreL +// ---------------------------------------------------------- +// +void CVIMPSTStorageVPbkLocalStore::DeleteContactFromInternalStoreL( TInt32& aIdentifier ) + { + TRACER_AUTO; + TDbColNo colNo = iColset->ColNo( KContactId ); + if ( SeekRowL( colNo, aIdentifier ) ) + { + iTable.DeleteL(); + iDb.Compact(); + TRACE( "found deleted" ); + } + + } + +// ---------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::WriteToStoreDbL +// ---------------------------------------------------------- +// +void CVIMPSTStorageVPbkLocalStore::WriteToStoreDbL( TInt32& aIdentifier ) + { + TRACER_AUTO; + TDbColNo colNo = iColset->ColNo( KContactId ); + if (!SeekRowL( colNo, aIdentifier ) ) + { + iTable.InsertL(); + + colNo = iColset->ColNo( KContactId ); + iTable.SetColL( colNo, aIdentifier ); + + // Write row to table + TRAPD( err, iTable.PutL() ); + if( err != KErrNone ) + { + // recover + iTable.Cancel(); + iTable.Reset(); + } + } + + } +// ---------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::OpenTableL +// ---------------------------------------------------------- +// +void CVIMPSTStorageVPbkLocalStore::OpenTableL() + { + TRACER_AUTO; + TInt err( iTable.Open( iDb, KContactTable ) ); + if ( err != KErrNone ) + { + TRACE( " err =%d" ,err ); + iTable.Close(); + User::Leave( err ); + } + + } + +// ---------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::CloseTable +// ---------------------------------------------------------- +// +void CVIMPSTStorageVPbkLocalStore::CloseTable() + { + TRACER_AUTO; + iTable.Close(); + + } + +// ---------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::ReadFirstL +// ---------------------------------------------------------- +// +TInt CVIMPSTStorageVPbkLocalStore::ReadFirstL( TInt32& aIdentifier ) + { + TRACER_AUTO; + iTable.BeginningL(); + + return ReadNextL( aIdentifier ); + } + +// ---------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::ReadNextL +// ---------------------------------------------------------- +// +TInt CVIMPSTStorageVPbkLocalStore::ReadNextL( TInt32& aIdentifier ) + { + TRACER_AUTO; + TInt err = KErrNotFound; + if ( iTable.NextL() ) + { + TRAP( err, ReadCurrentL( aIdentifier ) ); + // For some reason ReadCurrentL leaves with KErrEof, + // even if the contact was read succesfully. + } + TRACE( " err = %d" ,err ); + + return err; + } + + +// ---------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::ReadCurrentL +// ---------------------------------------------------------- +// +void CVIMPSTStorageVPbkLocalStore::ReadCurrentL( TInt32& aIdentifier ) + { + TRACER_AUTO; + iTable.GetL(); + // Get Column number for contact data size + TDbColNo colNo = iColset->ColNo( KContactId ); + aIdentifier = iTable.ColInt32(colNo); + + } + +// ---------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::SeekRowL +// ---------------------------------------------------------- +// +TBool CVIMPSTStorageVPbkLocalStore::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; + } +// ---------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::DeleteDatabaseL +// ---------------------------------------------------------- +void CVIMPSTStorageVPbkLocalStore::DeleteDatabaseL() + { + TRACER_AUTO; + TBuf< KMaxPath > storagePath; + storagePath.Append( KDbPath ); + iFs.MkDirAll( storagePath ); + storagePath.Append( *iLocalDBName ); + //close db before deleting it. + CloseDb(); + iFs.Delete( storagePath ); + + } +// ---------------------------------------------------------- +// CVIMPSTStorageVPbkLocalStore::IsSameContactIdL +// ---------------------------------------------------------- +TBool CVIMPSTStorageVPbkLocalStore::IsSameContactIdL(const TDesC& aFirstId, const TDesC& aSecondId ) + { + TRACER_AUTO; + TInt colIndex = aFirstId.Find(_L(":")); + TPtrC firstId = aFirstId.Right( aFirstId.Length() - colIndex -1); + colIndex = aSecondId.Find(_L(":")); + TPtrC secondId = aSecondId.Right( aSecondId.Length() - colIndex -1); + //if( Compare( firstId,secondId ) == 0 ) + if(firstId.Compare(aSecondId) ==0 ) + { + return ETrue; + } + return EFalse; + } +// End of file +