pimprotocols/phonebooksync/inc/phbksyncsvr.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 27 May 2010 12:45:19 +0300
changeset 37 fd64c38c277d
parent 0 e686773b3f54
permissions -rw-r--r--
Revision: 201019 Kit: 2010121

// 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:
// Header file for the Phonebook Synchroniser Server server side Session
// classes.
// 
//

/**
 @file
 @internalComponent
*/

#ifndef __PHBKSYNCSRV_H__
#define __PHBKSYNCSRV_H__

#include <commsdattypesv1_1.h>
#include <e32property.h>
#include <etelsat.h>
#include <f32file.h>

#include "common.h"
#include "SyncEngineClient.h"


/**
 *  Name of the server. The '!' means it is a protected server.
 */
_LIT(PHBKSYNC_SERVER_NAME, "!PhBkSyncServer");


/**
 *  Only bits 5-7 needed for TON.
 */
const TInt KEtsiTonPosition = 0x70;


/**
 *  Following literals are used for the INI file...
 */
_LIT8(KPhBkSyncPhonebook, "Phonebook");
_LIT8(KPhBkSyncHiddenName, "**********");


//
// Forward declarations...
//
class CPhoneBookSession;
class CGetPhoneStoreInfo;
class CNotifySecurityEvent;
class CNotifyLockInfoChange;
class CNotifySATUpdates;
class CNotifyAppInfoChange;
class CNotifyBackupAndRestore;
class CSyncEngineRequest;
class CPhoneBookSyncStarter;


/**
 *  Structure to hold information for Sync State Notifications.
 */
typedef struct
	{
	CPhoneBookSession*  iSession;
	RMessage2  iMessage;
	TUid  iPhonebookUid;
	} TCacheStateNotification;


/**
 *  The Phonebook Synchroniser Server class. This class provides the front end
 *  server implementation which handles all basic (and quick) requests and
 *  forwards the longer requests to the Background Sync Engine.
 *
 *  The class provides all the services required by class CPhoneBookSession.
 */
class CPhoneBookServer : public CPolicyServer
	{
	friend class CPhoneBookSyncStarter;
		
private:
	/**
	 *  Configuration level of the server.
	 */
	enum TServerConfiguration
		{
		/** Not configured for use */
		EServerConfigurationNone = 0,
		/** Not configured, configuring to Idle configuration */
		EServerConfigurationConfiguringToIdle = 1,
		/** Configured only to support existing session closures */
		EServerConfigurationIdle = 2,
		/** Idle config, configuring to full running configuration */
		EServerConfigurationConfiguringToFull = 3,
		/** Full running configuration */
		EServerConfigurationFull = 4
		};

public:
	static CPhoneBookServer* NewL();

	void HandleBackupOrRestoreStarting();
	void HandleBackupOrRestoreComplete();

	void AddSessionL(CPhoneBookSession* aSession);
	void DropSession(CPhoneBookSession* aSession);

	void DoSynchronisationL(CPhoneBookSession& aSession,
							const RMessage2& aMessage,
							TUid aPhonebookUid);
	TInt GetContactFormatL(TUid aPhonebookUid,
						   RPhoneBookSession::TContactFieldsV3& aContactFields);
	TInt GetSyncModeL(TUid aPhonebookUid,
					  RPhoneBookSession::TPhonebookSyncMode& aSyncMode);
	TInt SetSyncModeL(TUid aPhonebookUid,
					  RPhoneBookSession::TPhonebookSyncMode aSyncMode);
	void DeleteCntFromICCL(CPhoneBookSession& aSession,
						   const RMessage2& aMessage,
						   TContactItemId  aContactId);
	void WriteCntToICCL(CPhoneBookSession& aSession,
						const RMessage2& aMessage,
						TInt aSlotNum, TContactItemId aTemplateId);
	TInt ValidateContactL(TContactItemId aContactId,
						  MContactSynchroniser::TValidateOperation aValidateOp);
	TInt UpdateLookupTableL(TUid aPhonebookUid, TContactItemId aContactId,
							TInt aSlotNum);
	TInt GetPhoneBookIdL(TUid aPhonebookUid,
						 RPhoneBookSession::TSyncIdType aSyncIdType,
						 TContactItemId& aContactItemId);
	TInt GetCacheStateL(TUid aPhonebookUid,
						RPhoneBookSession::TSyncState& aSyncState);
	TInt DbgMarkHeap() const;
	TInt DbgCheckHeap(TInt aCount) const;
	TInt DbgMarkEnd(TInt aCount) const;
	TInt DbgFailNext(TInt aCount) const;
	TInt DoSynchronisationCancelL(CPhoneBookSession& aSession,
								  TUid aPhonebookUid);
	TInt DeleteCntFromICCCancelL(CPhoneBookSession& aSession,
								 TUid aPhonebookUid);
	TInt WriteCntToICCCancelL(CPhoneBookSession& aSession, TUid aPhonebookUid);
	void NotifyCacheStateChangeL(CPhoneBookSession& aSession,
								 const RMessage2& aMessage,
								 TUid aPhonebookUid);
	TInt NotifyCacheStateChangeCancelL(CPhoneBookSession& aSession,
							 		   TUid aPhonebookUid);
	TInt GetLastSyncErrorL(TUid aPhonebookUid, TInt& aLastSyncError);
	TInt GetNumSlotsL(TUid aPhonebookUid, TInt& aNumSlots);
	TInt GetNumFreeSlotsL(TUid aPhonebookUid, TInt& aNumFreeSlots);
	TInt GetFreeSlotsL(TUid aPhonebookUid, RArray<TInt>& aFreeSlots);
	TInt GetSlotIdL(TUid aPhonebookUid, TInt aSlotNum,
					TContactItemId& aContactItemId);
	TInt ShutdownServer(TBool aConditional);

	void CompleteNotifyStateChange(TUid aPhonebookUid);
	void CompleteGetPhoneStoreInfo(TInt aRetVal, RMobilePhoneBookStore::TMobilePhoneBookInfoV5& aStoreInfo,
		                           TUid aPhonebook);
	void CompleteNotifySecurityEvent(TInt aRetVal, RMobilePhone::TMobilePhoneSecurityEvent aSecurityEvent);
	void CompleteNotifyLockInfoChange(TInt aRetVal, RMobilePhone::TMobilePhoneLock& aLock,
                                      RMobilePhone::TMobilePhoneLockInfoV1& aLockInfo);
	void CompleteNotifySATUpdates(TInt aRetVal, RSat::TRefreshType aRefreshType, 
		                           RArray<TUid>& aPhonebookList);
	void CompleteNotifyAppInfoChange(TInt aRetVal, TBool aInitialValue,
									 RMobilePhone::TAID& aActiveUsimAID);

	inline TUint32 ICCCaps();
	inline TBool IsV2Tsy();
	inline TBool IsV5Tsy();
	inline TBool IsV2Sat();
	inline TBool IsUsimAppTsy();

	void QueueEngineRequestL(TPhonebookSyncRequest aPhonebookSyncRequest,
							 TUid aPhonebookUid,
							 TContactItemId aContactId,
							 CPhoneBookSession* aClientSession,
							 const RMessage2& aClientMessage);
	void StartNextEngineRequest();
	void CompleteEngineRequest(CSyncEngineRequest& aEngineRequest);
	void CancelEngineRequest(TPhonebookSyncRequest aPhonebookSyncRequest,
							 TUid aPhonebookUid,
							 TContactItemId aContactId,
							 CPhoneBookSession* aClientSession);
	TBool IsEngineRequestQueued(TPhonebookSyncRequest aPhonebookSyncRequest,
								TUid aPhonebookUid,
								TBool aIncludeUserRequests,
								TBool aIncludeActiveRequests);
	void QueueAutoSyncRequest(TUid aPhonebookUid);

private:
	CPhoneBookServer();
	~CPhoneBookServer();

	void ConstructL();

	void ConnectToEtelL();
	void ConfigureServerL(TServerConfiguration aLevel);
	void AttemptToConfigureServerL(TServerConfiguration aLevel);
	CSession2* NewSessionL(const TVersion& aVersion,const RMessage2&/*aMessage*/) const;
	TInt RunError(TInt aError);


	TServerConfiguration  iServerConfigLevel;

	RTelServer  iEtelServer;
	TUint32  iICCCaps;
	RMobilePhone iPhone;
	RSat iSat;
	TBool  iIsV2Tsy;
	TBool  iIsV5Tsy;
	TBool  iIsV2SAT;
	TBool  iIsUsimAppTsy;

	TBool iIsSatSupported;

	CGetPhoneStoreInfo*  iGetPhoneStoreInfo;
	CNotifyLockInfoChange*  iNotifyLockInfoChange;
	CNotifySecurityEvent*  iGetSecurityEvent;
	CNotifySATUpdates*  iNotifySatUpdates;
	CNotifyAppInfoChange*  iNotifyAppInfoChange;
	CNotifyBackupAndRestore*  iNotifyBackupAndRestore;
	CPhoneBookSyncStarter*  iPhoneBookSyncStarter;

	RPointerArray<CPhoneBookSession>  iSessionArray;

	CPhoneBookManager*  iPhonebookManager;

	RMobilePhone::TAID  iActiveUsimAID;

	//
	// Variables to control shutdown of the server...
	//
	TBool  iShouldShutdownServer;
	TBool  iShouldShutdownUnconditionally;

	//
	// Connection to the Background Sync Engine...
	//
	RSyncEngineSession  iSyncEngine;
	RPointerArray<CSyncEngineRequest>  iSyncEngineRequestArray;
	
	//
	// List of notification requests and on which phonebook UIDs.
	//
	RArray<TCacheStateNotification>  iCacheStateNotificationArray;

	//
	// Policy server information...
	//
	static const TInt  iRanges[];
	static const TUint8  iElementsIndex[];
	static const CPolicyServer::TPolicyElement  iElements[];
	static const CPolicyServer::TPolicy  iPolicy;
	};  


/**
 *  Simple Active Object to start the configuration of the server.
 *  This is used to break any deadlock between CntModel starting
 *  PhoneBookSync and PhoneBookSync starting CntModel.
 */
class CPhoneBookSyncStarter : public CAsyncOneShot
	{
public:
	CPhoneBookSyncStarter(CPhoneBookServer& aServer);

private:
	virtual void RunL();
	
	CPhoneBookServer&  iServer;
	};


/**
 *  Specialised Active Scheduler to cleanly handle leaves of the Active
 *  Objects.
 */
class CPhoneBookSyncScheduler : public CActiveScheduler
	{
public:
	static CPhoneBookSyncScheduler* NewL();
	void Error(TInt aError) const;
	};


//
// Old unsupported PhBkSync server thread.
//
IMPORT_C TInt PhBkSyncServerThread(TAny* aArg);


/**
 *  Indicates whether V2 functionality is supported by the TSY. 
 *
 *  @return Boolean indicating whether V2 functionality is supported by the phone. 
 */
inline TBool CPhoneBookServer::IsV2Tsy()
	{
	return iIsV2Tsy;
	} // CPhoneBookServer::IsV2Tsy

	
/**
 *  Indicates whether V5 functionality is supported by the TSY. 
 *
 *  @return Boolean indicating whether V5 functionality is supported by the phone. 
 */
inline TBool CPhoneBookServer::IsV5Tsy()
	{
	return iIsV5Tsy;
	} // CPhoneBookServer::IsV5Tsy		


/**
 *  Indicates whether V2 SAT is supported by the TSY. 
 *
 *  @return Boolean indicating whether V2 SAT is supported 
 */
inline TBool CPhoneBookServer::IsV2Sat()
	{
	return iIsV2SAT;
	} // CPhoneBookServer::IsV2Sat


/**
 *  Indicates whether USIM App is supported by the TSY. 
 *
 *  @return Boolean indicating whether USIM App is supported 
 */
inline TBool CPhoneBookServer::IsUsimAppTsy()
	{
	return iIsUsimAppTsy;
	} // CPhoneBookServer::IsUsimAppTsy


#endif // __PHBKSYNCSRV_H__