phonebookengines/VirtualPhonebook/VPbkCntModel/src/CAsyncContactOperation.cpp
changeset 0 e686773b3f54
child 15 e8e3147d53eb
--- /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 <cntdb.h>
+#include <cntitem.h>
+#include "CContactStore.h"
+#include "CContact.h"
+#include <CVPbkDiskSpaceCheck.h>
+#include <MVPbkContactStoreProperties.h>
+
+
+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<CContact*>( iClientContact )->SetContact( ci );
+	            const_cast<CContact*>( 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