imservices/instantmessagingcache/imcacheserver/src/cimcacheserver.cpp
changeset 0 e6b17d312c8b
child 1 b610b446cb01
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imservices/instantmessagingcache/imcacheserver/src/cimcacheserver.cpp	Thu Dec 17 08:54:49 2009 +0200
@@ -0,0 +1,288 @@
+/*
+* Copyright (c) 2008 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:  instantmessagingcache server class implementation
+*
+*/
+
+#define __INCLUDE_CAPABILITY_NAMES__
+#define __INCLUDE_ALL_SUPPORTED_CAPABILITIES__
+
+//  INCLUDE FILES
+#include "cimcacheserver.h"
+
+#include "ccacheserveractivehelper.h"
+#include "cimcachesession.h"
+#include "mimcachemessageheader.h"
+#include "timcachemessagefactory.h"
+#include "cimcachemessageheader.h"
+#include "cimcachemessagebase.h"
+// logs
+#include "imcachedebugtrace.h" //logs
+
+// ==============================================================
+// =============== PLATSEC POLICY CONFIGURATION =================
+// ==============================================================
+
+static const TInt KIMCachePlatSecRangeCount = 2;
+
+//Ranges for the Request values
+static const TInt KIMCachePlatSecRanges[ KIMCachePlatSecRangeCount ] =
+    {
+    0,
+    EIMCacheOperationLast
+    };
+
+
+// Element indexes for the defined ranges
+static const TUint8 KIMCachePlatSecElementsIndex[ KIMCachePlatSecRangeCount ] =
+    {
+    0,
+    CPolicyServer::ENotSupported
+    };
+
+
+// Policy elements
+static const CPolicyServer::TPolicyElement KIMCachePlatSecElements[] =
+    {
+        {
+        _INIT_SECURITY_POLICY_C2( ECapabilityReadUserData,
+                                  ECapabilityWriteUserData ),
+        -5 //CPolicyServer::EFailClient
+        }
+    };
+
+
+// The platsec policy
+static const CPolicyServer::TPolicy KIMCachePlatSecPolicy =
+    {
+    // Shortcut to the index into Elements,that is used to check a connection attempt
+    0,
+
+    // Number of ranges in the iRanges array
+    KIMCachePlatSecRangeCount,
+
+    // A pointer to an array of ordered ranges of request numbers
+    KIMCachePlatSecRanges,
+
+    // A pointer to an array of TUint8 values specifying
+    // the appropriate action to take for each range in iRanges
+    KIMCachePlatSecElementsIndex,
+
+    // A pointer to an array of distinct policy elements
+    KIMCachePlatSecElements
+    };
+
+
+// ==============================================================
+// ======================= SERVER  ==============================
+// ==============================================================
+
+// -----------------------------------------------------------------------------
+// CIMCacheServer::ExecuteL
+// -----------------------------------------------------------------------------
+//
+void CIMCacheServer::ExecuteL()
+    {
+    TRACE( T_LIT( "CIMCacheServer::ExecuteL() begin") );
+    // start scheduler
+    CActiveScheduler* pA = new( ELeave )CActiveScheduler;
+    CleanupStack::PushL( pA );
+    CActiveScheduler::Install( pA );
+
+
+    // create server
+    CIMCacheServer* server = new( ELeave ) CIMCacheServer();
+    CleanupStack::PushL( server );
+    server->InitializeL(*server);
+    server->StartL( KIMCacheServerName );
+
+
+    //Signal client that we are started
+    RProcess().Rendezvous( KErrNone );
+
+    // Execute the server
+    // Codescanner warning: using CActiveScheduler::Start (id:3)
+    // this has to be called for server starting.
+    CActiveScheduler::Start(); // CSI: 3 # See above
+
+    //Cleanup
+    CleanupStack::PopAndDestroy( server );//server
+    CleanupStack::PopAndDestroy( pA );
+    CActiveScheduler::Install( NULL );
+    TRACE( T_LIT( "CIMCacheServer::ExecuteL() end") );
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCacheServer::~CIMCacheServer
+// -----------------------------------------------------------------------------
+//
+CIMCacheServer::~CIMCacheServer()
+    {
+    TRACE( T_LIT( "CIMCacheServer::~CIMCacheServer() begin") );
+   
+    iSessions.Close();
+    
+	delete iActiveHelper;
+	
+	#if _BullseyeCoverage
+    	cov_write();
+	#endif
+    TRACE( T_LIT( "CIMCacheServer::~CIMCacheServer() end") );
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCacheServer::CIMCacheServer
+// -----------------------------------------------------------------------------
+//
+
+CIMCacheServer::CIMCacheServer()
+    : CPolicyServer( CActive::EPriorityStandard,
+                     KIMCachePlatSecPolicy )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCacheServer::NewSessionL
+// -----------------------------------------------------------------------------
+//
+CSession2* CIMCacheServer::NewSessionL( const TVersion &aVersion,
+                                          const RMessage2& /*aMessage*/ ) const
+    {
+    TRACE( T_LIT( "CIMCacheServer::NewSessionL() begin") );
+    TVersion srvVersion( KIMCacheVersionMajor,
+                         KIMCacheVersionMinor,
+                         KIMCacheVersionBuild );
+
+	if( !User::QueryVersionSupported( aVersion, srvVersion ) )
+        {
+        User::Leave( KErrNotSupported );
+        }
+	CIMCacheSession* session = CIMCacheSession::NewL();	
+     
+    TRACE( T_LIT( "CIMCacheServer::NewSessionL() end session[%d] created"), session );
+    return session;
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCacheServer::SessionCreatedL
+// -----------------------------------------------------------------------------
+//
+void CIMCacheServer::SessionCreatedL( CIMCacheSession* aSession )
+    {
+    TRACE( T_LIT( "CIMCacheServer::SessionCreatedL begin aSession[%d]"),aSession );
+    iSessionCount++;
+    TInt err = iSessions.Find( aSession );
+    if(err == KErrNotFound )
+	    {
+	    iSessions.AppendL( aSession );
+	    }
+    TRACE( T_LIT( "CIMCacheServer::SessionCreatedL() end") );
+      }
+// -----------------------------------------------------------------------------
+// CIMCacheServer::SessionDied
+// -----------------------------------------------------------------------------
+//
+void CIMCacheServer::SessionDied( CIMCacheSession* aSession )
+    {
+    TRACE( T_LIT( "CIMCacheServer::SessionDied() begin") );
+    TInt count = iSessions.Count();
+      for( TInt i = 0; i < count; i++ )
+			{
+			if( iSessions[i] == aSession )
+				{
+				iSessions.Remove( i );
+				break;
+				}
+			}
+	iSessionCount--;
+	if( iSessionCount == 0 )
+		{
+		// Codescanner warning: using CActiveScheduler::Stop ( Id: 4)
+		// it is required to stop the server
+		CActiveScheduler::Stop(); // CSI: 4 # See above
+		}
+	TRACE( T_LIT( "CIMCacheServer::SessionDied() end") );
+    }
+// -----------------------------------------------------------------------------
+// CIMCacheManager::GetActiveHelper
+// Pass pointer to toc array to client.
+// -----------------------------------------------------------------------------
+//
+CCacheServerActiveHelper* CIMCacheServer::GetActiveHelper()
+	{
+    return iActiveHelper;
+	}
+
+// -----------------------------------------------------------------------------
+// CIMCacheServer::InitializeL
+// -----------------------------------------------------------------------------
+//
+void CIMCacheServer::InitializeL(CIMCacheServer& aServer)
+    {
+    TRACE( T_LIT( "CIMCacheServer::InitializeL begin") );
+    
+    iActiveHelper = CCacheServerActiveHelper::NewL( aServer );
+    
+    TRACE( T_LIT( "CIMCacheServer::InitializeL end") );
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCacheServer::PackAndNotifyEventL
+// -----------------------------------------------------------------------------
+// send notication to all if registration is valid
+ 
+void CIMCacheServer::PackAndNotifyEventL(TIMCacheOperationsCode aChangeType,
+                                         TInt aServiceId,
+										 MIMCacheMessageHeader* aChatHeader /*=NULL*/, 
+									 	 CIMCacheMessageBase* aMessage /*=NULL*/ ) 
+	{
+	TInt count = iSessions.Count();
+	for(TInt i = 0; i<count; i++ )
+		{
+		if( aServiceId == iSessions[i]->ServiceId() )
+		    {
+		    // send changes to only those session which are has same service Id
+		    iSessions[i]->PackAndNotifyEventL(aChangeType , aChatHeader, aMessage);	
+		    }
+		}
+	}
+
+
+// ==============================================================
+// ====================== ENTRY POINT ===========================
+// ==============================================================
+GLDEF_C TInt E32Main()
+    {
+    TRACE( T_LIT("E32Main - enter") );
+
+    User::RenameThread( KIMCacheServerName );
+
+    CTrapCleanup* tc = CTrapCleanup::New();
+    if( !tc )
+        {
+        return KErrNoMemory;
+        }
+
+    TRAPD( err, CIMCacheServer::ExecuteL() );
+    delete tc;
+
+    TRACE( T_LIT("E32Main - exit: %d"), err );
+    return err;
+    }
+
+
+
+//  END OF FILE
+
+