--- /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
+
+