pimprotocols/phonebooksync/Server/DeleteContactFromICC.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:29:52 +0100
branchRCL_3
changeset 20 f4a778e096c2
parent 0 e686773b3f54
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

// Copyright (c) 2002-2009 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:
// Contains the implementation for the Active Object class used by the
// Phonebook Synchroniser to delete an ICC Contact.
// 
//

/**
 @file
 @internalComponent
*/

#include "common.h"
#include "Phonebook.h"
#include "PhonebookManager.h"
#include "SyncContactICCEntry.h"
#include "phbksyncsvr.h"
#include "phbksynclog.h"
#include "SyncEngineSession.h"
#include "SyncEngineServer.h"
#include "phbksyncsess.h"
#include "DeleteContactFromICC.h"


/**
 *  Static factory method used to create a CDeleteContactFromICC object.
 *
 *  @param aSession           Reference to the engine session.
 *  @param aPhonebookManager  Reference to the Phonebook Manager which stores
 *                            all the phonebook parameters.
 *  @param aDb                Reference to the database.
 *  @param aPhone             Handle to the phone object.
 *  @param aPhonebookUid      Phonebook UID for the contact to be deleted from.
 *  @param aClientMessage     Handle to the engine message request.
 */
CDeleteContactFromICC* CDeleteContactFromICC::NewL(CSyncEngineSession& aSession,
												   CPhoneBookManager& aPhonebookManager,
												   CContactDatabase& aDb,
												   RMobilePhone& aPhone,
												   TUid aPhonebookUid,
												   const RMessage2& aClientMessage)
	{
	CDeleteContactFromICC*  self = new(ELeave) CDeleteContactFromICC(aSession,
																	 aPhonebookManager,
																	 aDb,
																	 aPhone,
																	 aPhonebookUid,
																	 aClientMessage);
	CleanupStack::PushL(self);
	self->ConstructL();
	CleanupStack::Pop(self);

	return self;
	} // CDeleteContactFromICC::NewL


/**
 *  Standard constructor.
 *
 *  @param aSession           Reference to the engine session.
 *  @param aPhonebookManager  Reference to the Phonebook Manager which stores
 *                            all the phonebook parameters.
 *  @param aPhone             Handle to the phone object.
 *  @param aDb                Reference to the database.
 *  @param aPhonebookUid      Phonebook UID for the contact to be deleted from.
 *  @param aClientMessage     Handle to the engine message request.
 */
CDeleteContactFromICC::CDeleteContactFromICC(CSyncEngineSession& aSession,
											 CPhoneBookManager& aPhonebookManager,
											 CContactDatabase& aDb,
											 RMobilePhone& aPhone,
											 TUid aPhonebookUid,
											 const RMessage2& aClientMessage)
  : CActive(EPriorityNormal),
	iSession(aSession),
	iPhonebookManager(aPhonebookManager),
	iDb(aDb),
	iPhone(aPhone),
	iPhonebookUid(aPhonebookUid),
	iClientMessage(aClientMessage),
	iState(EDeleteContactFromICCStateIdle),
	iContactId(KNullContactId),
	iSlotNum(0)
	{
	// NOP
	} // CDeleteContactFromICC::CDeleteContactFromICC


/**
 *  Standard destructor. This will cancel any pending active requests.
 */
CDeleteContactFromICC::~CDeleteContactFromICC()
	{
	LOGACTIVE1(_L8("~CDeleteContactFromICC()"));

 	Cancel();
	} // CDeleteContactFromICC::~CDeleteContactFromICC


/**
 *  Second phase constructor.
 */
void CDeleteContactFromICC::ConstructL()
	{
	User::LeaveIfError(iPhonebookManager.GetPhoneBookStore(iPhonebookUid, iPhone, iPhonebookStore));

	CActiveScheduler::Add(this);
	} // CDeleteContactFromICC::ConstructL


/** 
 *  Delete an ICC entry.
 *
 *  @param aContactId  TContactItemId item to delete from the ICC.
 */
void CDeleteContactFromICC::DoIccDelete(TContactItemId aContactId)
	{
	LOGACTIVE2(_L8("CDeleteContactFromICC::DoIccDelete(0x%08x)"), aContactId);

	//
	// Check that we are not in use!
	//
	if (iState != EDeleteContactFromICCStateIdle)
		{
		PhBkSyncPanic(EPhBkSyncPanicDoIccDeleteError);
		}

	//
	// Store the Contact UID for later and find the slot number.
	//
	TInt  result;
	
	iContactId = aContactId;

	result = iPhonebookManager.GetSlotNumFromContactId(iPhonebookUid, aContactId, iSlotNum);
	if (result != KErrNone)
		{
		iSession.Server().CompleteDoIccDelete(result);
		return;
		}

	//
	// Request the slot entry to be deleted from the phonebook store...
	//
	iPhonebookStore.Delete(iStatus, iSlotNum);
	iState = EDeleteContactFromICCStateWaitForDelete;
	SetActive();

	LOGACTIVETIMESTAMP();
	} // CDeleteContactFromICC::DoIccDelete


/** 
 *  Standard Active Object RunL() method to process delete requests.
 */
void CDeleteContactFromICC::RunL()
	{
	LOGACTIVE2(_L8("CDeleteContactFromICC::RunL(): iStatus=%d"),
			   iStatus.Int());
	LOGACTIVETIMESTAMP();

	switch (iState)
		{
		case EDeleteContactFromICCStateWaitForDelete:
			{
			if (iStatus.Int() == KErrNone  ||
				iStatus.Int() == KErrCancel)
				{
				//
				// Update the entry in the table...
				//
				TInt  result;
				
				result = iPhonebookManager.UpdateEntryInTable(iPhonebookUid, iSlotNum,
															  KNullContactId, ESlotEmpty);
 				if (result != KErrNone)
 					{
 					PhBkSyncPanic(EPhBkSyncPanicUpdateEntryInTableError);
 					}

				//
				// Decrement the number of used entries for this phonebook...
				//
				result = iPhonebookManager.AdjustPhoneBookInfoUsedEntries(iPhonebookUid, -1);
 				if (result != KErrNone)
 					{
 					PhBkSyncPanic(EPhBkSyncPanicUpdateEntryInTableError);
 					}
 				}

			//
			// Return to the idle state and complete the request...
			//
			iState = EDeleteContactFromICCStateIdle;
			iSession.Server().CompleteDoIccDelete(iStatus.Int());
			}
			break;

		case EDeleteContactFromICCStateWaitForCancel:
			{
			//
			// Return to the idle state and complete the request...
			//
			iState = EDeleteContactFromICCStateIdle;
			iSession.Server().CompleteDoIccDelete(iStatus.Int());
			}
			break;

		default:
			{
			PhBkSyncPanic(EPhBkSyncPanicDoIccDeleteError);
			}
			break;
		}
	} // CDeleteContactFromICC::RunL


/** 
 *  Standard Active Object DoCancel method called when the objects Cancel()
 *  method is called.
 */
void CDeleteContactFromICC::DoCancel()
	{
	LOGACTIVE1(_L8("CDeleteContactFromICC::DoCancel()"));

 	if (iState == EDeleteContactFromICCStateWaitForDelete)
		{
		iPhonebookStore.CancelAsyncRequest(EMobilePhoneStoreDelete);
 		iState = EDeleteContactFromICCStateWaitForCancel;
		}
	} // CDeleteContactFromICC::DoCancel


/**
 *  Standard Active Object RunError method called when the objects RunL()
 *  method leaves.
 *
 *  Hopefully this method should never be called.
 *
 *  @param aError  Leave code from the RunL().
 *
 *  @return  KErrNone is returned although the server will panic first.
 */
TInt CDeleteContactFromICC::RunError(TInt aError)
	{
#ifdef _DEBUG
	LOGACTIVE2(_L8("CDeleteContactFromICC::RunError(%d)"), aError);
#else
	(void) aError;
#endif

	PhBkSyncPanic(EPhBkSyncPanicUnexpectedLeave);

	return KErrNone;	
	} // CDeleteContactFromICC::RunError