diff -r 000000000000 -r e686773b3f54 phonebookengines/VirtualPhonebook/VPbkCntModel/src/CAsyncContactOperation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/VirtualPhonebook/VPbkCntModel/src/CAsyncContactOperation.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,209 @@ +/* +* Copyright (c) 2002-2007 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: The virtual phonebook asynchronous contact operation +* +*/ + + + +// INCLUDES +#include "CAsyncContactOperation.h" +#include +#include +#include "CContactStore.h" +#include "CContact.h" +#include +#include + + +namespace VPbkCntModel { + +const TInt KDiskSpaceNeedUnknown = 0; + +inline CAsyncContactOperation::CAsyncContactOperation + ( CContactStore& aContactStore ) : + CAsyncOneShot( CActive::EPriorityIdle ), + iContactStore( aContactStore ), + iOpCode( MVPbkContactObserver::EContactOperationUnknown ) + { + } + +CAsyncContactOperation* CAsyncContactOperation::NewL + ( CContactStore& aContactStore ) + { + CAsyncContactOperation* self = + new(ELeave) CAsyncContactOperation( aContactStore ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +CAsyncContactOperation::~CAsyncContactOperation() + { + CActive::Cancel(); + delete iDiskSpaceChecker; + iFs.Close(); + } + +void CAsyncContactOperation::ConstructL() + { + User::LeaveIfError( iFs.Connect() ); + // Get contact store location drive for disk space check + const TPtrC ptr( iContactStore.StoreProperties().Uri().Component + ( TVPbkContactStoreUriPtr::EContactStoreUriStoreDrive ) ); + TInt drive( EDriveA ); // c is usually the default location + User::LeaveIfError( iFs.CharToDrive + ( ptr[0], drive) ); + iDiskSpaceChecker = VPbkEngUtils::CVPbkDiskSpaceCheck::NewL( iFs, drive ); + } + +void CAsyncContactOperation::PrepareL + ( MVPbkContactObserver::TContactOp aOpCode, + TContactItemId aContactId, + MVPbkContactObserver& aObserver ) + { + if ( IsActive() ) + { + User::Leave( KErrInUse ); + } + iTargetContactId = aContactId; + iOpCode = aOpCode; + iObserver = &aObserver; + iClientContact = NULL; + } + +void CAsyncContactOperation::PrepareL + ( MVPbkContactObserver::TContactOp aOpCode, + const CContact& aContact, + MVPbkContactObserver& aObserver ) + { + if ( IsActive() ) + { + User::Leave( KErrInUse ); + } + iOpCode = aOpCode; + iObserver = &aObserver; + iClientContact = &aContact; + } + +void CAsyncContactOperation::Cancel( CContactItem* aContact ) + { + if ( iClientContact && + aContact == iClientContact->NativeContact() ) + { + // Do not call CActive::Cancel(), it is not desired since not all + // operations are affected. The client contact is just not + // valid anymore, so let's reset it. + iClientContact = NULL; + } + } + +void CAsyncContactOperation::DoCancel() + { + iOpCode = MVPbkContactObserver::EContactOperationUnknown; + } + +void CAsyncContactOperation::RunL() + { + MVPbkContactObserver::TContactOpResult result; + result.iOpCode = iOpCode; + result.iStoreContact = NULL; + result.iExtension = NULL; + + switch( iOpCode ) + { + case MVPbkContactObserver::EContactRead: + { + CContactItem* ci = + iContactStore.NativeDatabase().ReadContactLC( iTargetContactId ); + result.iStoreContact = CContact::NewL( iContactStore, ci ); + CleanupStack::Pop( ci ); + break; + } + + case MVPbkContactObserver::EContactReadAndLock: + { + CContactItem* ci = + iContactStore.NativeDatabase().OpenContactLX( iTargetContactId ); + CleanupStack::PushL( ci ); + CContact* contact = CContact::NewL( iContactStore, ci ); + result.iStoreContact = contact; + contact->SetModified(); + CleanupStack::Pop( 2 ); // ci, lock + break; + } + + case MVPbkContactObserver::EContactDelete: + { + iContactStore.NativeDatabase().DeleteContactL( iTargetContactId ); + break; + } + + case MVPbkContactObserver::EContactLock: + { + if( iClientContact ) + { + CContactItem* ci = iContactStore.NativeDatabase().OpenContactLX( + iClientContact->NativeContact()->Id() ); + CleanupStack::PushL( ci ); + const_cast( iClientContact )->SetContact( ci ); + const_cast( iClientContact )->SetModified(); + CleanupStack::Pop( 2 ); // ci, lock + } + break; + } + + case MVPbkContactObserver::EContactCommit: + { + if( iClientContact ) + { + iDiskSpaceChecker->DiskSpaceCheckL( KDiskSpaceNeedUnknown ); + if (iClientContact->IsNewContact()) + { + iContactStore.NativeDatabase().AddNewContactL( + *iClientContact->NativeContact() ); + } + else + { + iContactStore.NativeDatabase().CommitContactL( + *iClientContact->NativeContact() ); + } + } + break; + } + case MVPbkContactObserver::EContactSetOwn: + { + iContactStore.NativeDatabase().SetOwnCardL( *iClientContact->NativeContact() ); + break; + } + default: + { + // Operation was canceled + return; + } + } + + iObserver->ContactOperationCompleted( result ); + } + +TInt CAsyncContactOperation::RunError( TInt aError ) + { + iObserver->ContactOperationFailed( iOpCode, aError, EFalse ); + return KErrNone; + } + +} // namespace VPbkCntModel + +//End of file