phonebookengines/contactsmodel/cntsrv/src/CCntSession.Cpp
changeset 0 e686773b3f54
child 24 0ba2181d7c28
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/contactsmodel/cntsrv/src/CCntSession.Cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,229 @@
+// Copyright (c) 2005-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:
+//
+
+/**
+ @file
+ @internalComponent
+ @released
+*/
+
+#include "CCntSession.h"
+#include "CCntDbManagerController.h"
+#include "CCntStateMachine.h"
+#include "CCntBackupRestoreAgent.h"
+#include "CCntPackager.h"
+#include "CViewSubSessions.h"
+#include "CCntIpcCodes.h"
+#include "CCntRequest.h"
+#include "CCntEventQueue.h"
+#include <cntdef.h>  // for tcontactitemid.
+#include "CIniFileManager.h"
+#include "CntSpeedDials.h"
+#include "cntviewprivate.h"
+#include <cntviewstore.h>
+#include "CCntLogger.h"
+#include "CCntMsgHandler.h"
+#include "CCntItemMsgHandler.h"
+#include "CCntEventMsgHandler.h"
+#include "CCntTransactionMsgHandler.h"
+#include "CCntFileManagerMsgHandler.h"
+#include "CCntPropertiesMsgHandler.h"
+#include "CCntViewMsgHandler.h"
+
+
+#define KPhoneBookServerUid 0x102030A1
+
+extern void DebugLogIPC(const TDesC& aMethod, TInt aOpCode, TUint aSessionId, TInt aErrCode);
+
+
+CCntSession::CCntSession(CCntPackager& aPackager, TUint aSessionId)
+	: iPackager(aPackager),
+	iTimeOut(KOneSecond),
+	iSessionId(aSessionId)
+	{
+	}
+
+	
+CCntSession* CCntSession::NewL(CCntPackager& aPackager, TUint aSessionId)
+	{
+	CCntSession* CntSession = new (ELeave) CCntSession(aPackager, aSessionId);
+	CleanupStack::PushL(CntSession);
+	CntSession->ConstructL();
+	CleanupStack::Pop(CntSession);
+	return CntSession;
+	}
+	
+	
+void CCntSession::ConstructL()
+	{
+	CContactItemViewDef* itemDef = CContactItemViewDef::NewLC(CContactItemViewDef::EIncludeFields, CContactItemViewDef::EIncludeHiddenFields);
+	itemDef->AddL(KUidContactFieldMatchAll);
+	iView = CContactViewDef::NewL(itemDef);
+	CleanupStack::Pop(itemDef);
+	
+	// Message handlers
+    CCntItemMsgHandler* itemMsgHandler = CCntItemMsgHandler::NewLC(*this);
+	CCntEventMsgHandler* eventMsgHandler = CCntEventMsgHandler::NewLC(*this);
+	CCntTransactionMsgHandler* transMsgHandler = CCntTransactionMsgHandler::NewLC(*this);
+	CCntFileManagerMsgHandler* fileMsgHandler = CCntFileManagerMsgHandler::NewLC(*this);
+	CCntPropertiesMsgHandler* propMsgHandler = CCntPropertiesMsgHandler::NewLC(*this);
+	CCntViewMsgHandler* viewMsgHandler = CCntViewMsgHandler::NewLC(*this);
+	
+	/** 
+	iMsgHandlerArray takes ownership of Message Handlers.
+	*/	
+	iMsgHandlerArray.InsertL(itemMsgHandler, ECntItemMsgHandler);
+	iMsgHandlerArray.InsertL(eventMsgHandler, ECntEventMsgHandler);
+	iMsgHandlerArray.InsertL(transMsgHandler, ECntTransactionMsgHandler);
+	iMsgHandlerArray.InsertL(fileMsgHandler, ECntFileManagerMsgHandler);
+	iMsgHandlerArray.InsertL(propMsgHandler, ECntPropertiesMsgHandler);
+	iMsgHandlerArray.InsertL(viewMsgHandler, ECntViewMsgHandler);
+	
+	// Pop Message handlers on CleanupStack
+	CleanupStack::Pop(6, itemMsgHandler);
+	}
+
+
+/**
+Maps to RSessionBase::Close() called on client-side.
+*/
+CCntSession::~CCntSession()
+	{
+	if(iManager) // CCntDbManager instance only allocated on open/replace/create
+		{
+		// Unlock any contact items that have not been explicity unlocked by this
+		// session prior to this point.
+		TRAP_IGNORE(SessionUnlockL());
+		iManager->GetPersistenceLayer().ContactProperties().SessionDeleted(iSessionId);
+		
+		// Un-register for database event notifications.
+		iManager->UnRegisterDatabaseEventObserver(*this);
+
+		if (CSession2::Server())
+			{
+			// Call the Database Manager Controller to close the database and
+			// destroy the CCntDbManager instance associated with this session.
+			Server().Controller().CloseDatabase(*iManager);
+			}
+
+		}
+
+ 	delete iView;
+ 	
+	iMsgHandlerArray.ResetAndDestroy();
+	iMsgHandlerArray.Close();
+
+	if (CSession2::Server())
+		{
+		Server().SessionClosing();
+		}
+	}
+
+
+void CCntSession::SessionUnlockL()
+	{
+	CReqInternalSessionUnlock* request = CReqInternalSessionUnlock::NewLC(iSessionId);
+	iManager->StateMachineL().ProcessRequestL(request);  // ownership transferred
+	
+	// ProcessRequestL received ownership of the request, the request only need
+	// to be popped from CleanupStack.		
+	CleanupStack::Pop(request);
+	}
+
+
+/**
+Top level client session function code parser. Delegates to message handlers,
+if the op code is not handled by the 1st message handler, it is delegated to the 2nd
+message handler.  If the op code is not handled by the 2nd message handler, it
+delegates to the 3rd and so on.
+
+The delegation to message handlers is prioritised. This results in quick handling of critical
+operations.
+
+Message handlers return KErrNotFound if op code is not handled. If KErrNotFound then op code is
+delegated to the next handler. The last message handler leaves with KErrNotFound if op code not
+handled. The leave is caught in the ServiceError() method.
+*/
+void CCntSession::ServiceL(const RMessage2& aMessage)
+	{
+	#if defined(__PROFILE_DEBUG__)
+		RDebug::Print(_L("[CNTMODEL] MTD: CCntSession::ServiceL"));
+	#endif 
+		
+	// The most likely operation is a ContactItem CRUD operation.
+	
+     DEBUG_PRINT4(__VERBOSE_DEBUG__,_L("[CNTMODEL] IPC"), aMessage.Function(), iSessionId, KErrNone);
+
+	TSecureId ClientSID = aMessage.SecureId();
+	if (ClientSID == KPhoneBookServerUid && iManager)
+		{
+		iManager->GetPersistenceLayer().ContactProperties().DisableSynchroniser(iSessionId);			
+		}
+		
+	// Delegate to message handlers.
+	for (TInt index = 0; index < iMsgHandlerArray.Count(); index++) 
+		{
+		TInt retCode = iMsgHandlerArray[index]->HandleMessageL(aMessage);
+		
+		/** Message handled or if message handler returned KErrNotFound,
+		delegate to next handler.
+		*/
+		if(retCode == KErrNone)
+			{
+			break;
+			}
+		}
+	}
+
+
+/**
+We just complete the message with the error code.
+*/
+void CCntSession::ServiceError(const RMessage2& aMessage, TInt aError)
+	{
+	
+	DEBUG_PRINT4(__VERBOSE_DEBUG__,_L("[CNTMODEL] IPC_ERROR"), aMessage.Function(), iSessionId, aError);
+
+	aMessage.Complete(aError);
+	}
+
+	
+/**
+Process a database event.  At this level we queue the event for consumption by
+the client.
+*/
+void CCntSession::HandleDatabaseEventL(TContactDbObserverEvent aEvent)
+	{
+	/**
+	Delegate to CntEventMsgHandler.
+	*/	
+	CCntEventMsgHandler* eventMsgHandler = static_cast<CCntEventMsgHandler*>(iMsgHandlerArray[ECntEventMsgHandler]);
+	eventMsgHandler->QueueEvent(aEvent);
+	}
+
+
+void CCntSession::UnRegisterDatabaseEventObserver()
+	{
+	// This session is not going to be interested in database event
+	// notifications so un-register it.
+	
+	if(iManager == NULL) 
+		{
+		User::Leave(KErrNotReady);
+		}
+		
+	iManager->UnRegisterDatabaseEventObserver(*this);
+	}
+