browserutilities/favouritesengine/ClientServer/srvsrc/FavouritesSrv.cpp
changeset 0 dd21522fd290
child 36 0ed94ceaa377
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/favouritesengine/ClientServer/srvsrc/FavouritesSrv.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,381 @@
+/*
+* Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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: 
+*      Implementation of class FavouritesSrv
+*      
+*
+*/
+
+
+// INCLUDE FILES
+
+#include "FavouritesSession.h"
+#include "FavouritesSrv.h"
+#include "FavouritesSrvSession.h"
+#include "FavouritesDef.h"
+#include "FavouritesLogger.h"
+#include "Timeout.h"
+#include "FavouritesUtil.h"
+#include "BackupObserver.h"
+#include "FavouritesMsg.h"
+
+#ifdef __MYSERVER_NO_PROCESSES__
+
+// ==================== LOCAL FUNCTIONS ====================
+
+/**
+* WINS thread entry function.
+* @param aPtr Not used.
+* @return Error code.
+*/
+LOCAL_C TInt ThreadEntryFunc( TAny* /*aPtr*/ )
+    {
+    return FavouritesSrv::Run();
+    }
+
+#endif
+
+/**
+* Stop the Active Scheduler.
+* @param aPtr Not used.
+* @return KErrNone.
+*/
+LOCAL_C TInt StopScheduler( TAny* /*aPtr*/ )
+    {
+    // Called by the exit timer, after all clients disconnected (plus a small
+    // delay). Stop the scheduler, this will enable he thread exit.
+    FLOG(( _L("StopScheduler") ));
+    CActiveScheduler::Stop();
+    return KErrNone;
+    }
+
+/**
+* Create a server.
+* @param Pointer to created server (if created) returned here.
+* @return Error code.
+*/
+LOCAL_C TInt CreateServer( CFavouritesSrv*& aServer )
+    {
+    // Server is not allowed to be created if Secure Backup is in progress
+    
+    TBool backupInProgress = EFalse; // This useless initialization is done 
+        // because of RVCT compiler warning so do not delete it.
+
+    TRAPD( err, backupInProgress = FavouritesUtil::IsBackupInProgressL());
+
+    if(!err)
+        {
+        if(!backupInProgress)
+            {
+            // The TRAP is not working in the same stack frame where the
+            // CTrapCleanup was created. This is why we need this function.
+            TRAP( err, aServer = CFavouritesSrv::NewL() );
+            }
+        else
+            {
+            err = KErrLocked;
+            }
+        }
+
+    return err;
+    }
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// FavouritesSrv::Start
+// ---------------------------------------------------------
+//
+TInt FavouritesSrv::Start()
+    {
+    FLOG(( _L("FavouritesSrv::Start") ));
+    TInt err( KErrNone );
+#ifdef __MYSERVER_NO_PROCESSES__
+    RThread server;
+    err = server.Create
+        (
+        KFavouritesSrvName,
+        ThreadEntryFunc,
+        KFavouritesSrvStackSize,
+        KFavouritesSrvMinHeapSize,
+        KFavouritesSrvMaxHeapSize,
+        NULL,
+        EOwnerProcess
+        );
+    FLOG(( _L("  thread created (%d)"), err ));
+#else
+    RProcess server;
+    err = server.Create
+        (
+        KFavouritesSrvExe,
+        KNullDesC,
+        TUidType( KNullUid, KNullUid, KFavouritesUid ),
+        EOwnerThread
+        );
+    FLOG(( _L("  process created (%d)"), err ));
+#endif
+    if ( !err )
+        {
+        TRequestStatus status;
+        server.Rendezvous( status );
+        if ( status != KRequestPending )
+            {
+            FLOG(( _L("FavouritesSrv::Start: abort startup") ));
+            server.Kill( 0 );   // Abort startup.
+            }
+        else
+            {
+            FLOG(( _L("FavouritesSrv::Start: resume server") ));
+            server.Resume();    // Logon OK - start the server.
+            }
+        User::WaitForRequest( status ); // Wait for start or death.
+        // We can't use the 'exit reason' if the server panicked as this
+        // is the panic 'reason' and may be '0' which cannot be distinguished
+        // from KErrNone.
+        err = (server.ExitType() == EExitPanic) ? KErrGeneral : status.Int();
+        server.Close();
+        }
+    FLOG(( _L("FavouritesSrv::Start: returns (%d)"), err ));
+    return err;
+    }
+
+// ---------------------------------------------------------
+// FavouritesSrv::Run
+// ---------------------------------------------------------
+//
+EXPORT_C TInt FavouritesSrv::Run()
+    {
+    FLOG(( _L("FavouritesSrv::Run") ));
+    __UHEAP_MARK;
+
+    CTrapCleanup* trapCleanup = NULL;
+    CActiveScheduler* activeScheduler = NULL;
+    CFavouritesSrv* server = NULL;
+
+    TInt err = User::RenameThread( KFavouritesSrvName );
+    if ( !err )
+        {
+        // Create a trap cleanup, make and install an active scheduler.
+        err = KErrNoMemory;
+        trapCleanup = CTrapCleanup::New();
+        if ( trapCleanup )
+            {
+            activeScheduler = new CActiveScheduler();
+            if ( activeScheduler )
+                {
+                CActiveScheduler::Install( activeScheduler );
+                err = CreateServer( server );   // Not pushed (no leaving).
+                if ( !err )
+                    {
+                    err = server->Start( KFavouritesSrvName );
+                    FLOG(( _L("  server started: (%d)"), err ));
+                    }
+                }
+            }
+        }
+    // Let the caller know how it went.
+#ifdef __MYSERVER_NO_PROCESSES__
+    RThread::Rendezvous( err );
+#else
+    RProcess::Rendezvous( err );
+#endif
+    if ( !err )
+        {
+        FLOG(( _L("FavouritesSrv::Run: starting active scheduler") ));
+        CActiveScheduler::Start();
+        FLOG(( _L("FavouritesSrv::Run: active scheduler stopped") ));
+        }
+        
+    CActiveScheduler::Install( NULL );
+    delete activeScheduler;
+    
+    FLOG(( _L("delete server") ));
+    
+    delete server;
+    
+    delete trapCleanup;
+
+    __UHEAP_MARKEND;
+    FLOG(( _L("FavouritesSrv::Run returns (%d)"), err ));
+    return err;
+    }
+
+// ================= MEMBER FUNCTIONS =======================
+
+// Platform security
+	
+// Custom check is applied to all IPCs. As IPC ids contain not only the ids
+// but other information is embadded into them.
+	
+static const int KRangeCount = 1;
+
+static const TInt SecurityRanges[KRangeCount] = 
+	{
+	EFavengNullFunction,
+	};
+	
+static const TUint8 SecurityRangesPolicy[KRangeCount] =
+	{
+	CPolicyServer::ECustomCheck
+	};
+
+static const CPolicyServer::TPolicy Policy =
+	{
+	CPolicyServer::EAlwaysPass,
+	KRangeCount,
+	SecurityRanges,
+	SecurityRangesPolicy,
+	NULL,
+	};
+
+// ---------------------------------------------------------
+// CFavouritesSrv::CustomSecurityCheckL
+// ---------------------------------------------------------
+//
+CPolicyServer::TCustomResult CFavouritesSrv::CustomSecurityCheckL(
+	const RMessage2& aMsg, TInt& /*aAction*/, TSecurityInfo& /*aMissing*/)
+	{
+		TFavouritesMsg msg( aMsg.Function() );
+		
+		TFavouritesFunction func = msg.Function();
+		
+		TCustomResult ret = EFail;
+		
+		if(func > EFavengTestCapabilityStart && 
+		   func < EFavengTestCapabilityEnd)
+			{
+			if(aMsg.HasCapability(ECapabilityAllFiles))
+               	{
+               	ret = EPass;
+               	}
+			}
+		else if(func > EFavengReadCapabilityStart && 
+		   func < EFavengReadCapabilityEnd)
+			{
+			if(aMsg.HasCapability(ECapabilityReadUserData))
+               	{
+               	ret = EPass;
+               	}
+			}
+		else if(func > EFavengWriteCapabilityStart && 
+		   func < EFavengWriteCapabilityEnd)
+			{
+			if(aMsg.HasCapability(ECapabilityWriteUserData))
+               	{
+               	ret = EPass;
+               	}
+			}
+        else
+            {
+            // Left empty by design
+            }
+		
+		return ret;
+	}
+	
+// ---------------------------------------------------------
+// CFavouritesSrv::NewL
+// ---------------------------------------------------------
+//
+CFavouritesSrv* CFavouritesSrv::NewL()
+    {
+    CFavouritesSrv* srv = new (ELeave) CFavouritesSrv();
+    CleanupStack::PushL( srv );
+    srv->ConstructL();
+    CleanupStack::Pop();
+    return srv;
+    }
+
+// ---------------------------------------------------------
+// CFavouritesSrv::~CFavouritesSrv
+// ---------------------------------------------------------
+//
+CFavouritesSrv::~CFavouritesSrv()
+    {
+    delete iExitTimer;
+    delete iBackupObserver;
+    }
+
+// ---------------------------------------------------------
+// CFavouritesSrv::SessionClosed
+// ---------------------------------------------------------
+//
+void CFavouritesSrv::SessionClosed()
+    {
+    FLOG(( _L("CFavouritesSrv::SessionClosed") ));
+    iSessionIter.SetToFirst();
+    iSessionIter++;
+    if ( iSessionIter++ == 0 )
+        {
+        // Schedule exit when last client has closed.
+        iExitTimer->Cancel();   // Safety code: cancel if running.
+        FLOG(( _L("  start exit timer") ));
+        iExitTimer->After
+            ( TTimeIntervalMicroSeconds32( KFavouritesSrvExitDelay ) );
+        }
+    }
+
+// ---------------------------------------------------------
+// CFavouritesSrv::PanicClient()
+// ---------------------------------------------------------
+//
+void CFavouritesSrv::PanicClient( TInt aCode )
+    {
+    iReceivedMessage.Panic( KFavouritesSrvName, aCode );
+    }
+
+// ---------------------------------------------------------
+// CFavouritesSrv::CFavouritesSrv
+// ---------------------------------------------------------
+//
+CFavouritesSrv::CFavouritesSrv() : 
+	CPolicyServer(CActive::EPriorityStandard, Policy, ESharableSessions)
+    {
+    }
+
+// ---------------------------------------------------------
+// CFavouritesSrv::ConstructL
+// ---------------------------------------------------------
+//
+void CFavouritesSrv::ConstructL()
+    {
+    FLOG(( _L("CFavouritesSrv::ConstructL") ));
+    iExitTimer = CTimeout::NewL
+        ( CActive::EPriorityStandard, TCallBack( StopScheduler, NULL ) );
+    FLOG(( _L("  start exit timer") ));
+    iExitTimer->After
+        ( TTimeIntervalMicroSeconds32( KFavouritesSrvExitDelay ) );
+
+    iBackupObserver = CBackupObserver::NewL();
+    }
+
+// ---------------------------------------------------------
+// CFavouritesSrv::NewSessionL
+// ---------------------------------------------------------
+//
+CSession2* CFavouritesSrv::NewSessionL
+( const TVersion& aVersion, const RMessage2& /*aMessage*/ ) const
+    {
+    FLOG(( _L("CFavouritesSrv::NewSessionL") ));
+    if ( !User::QueryVersionSupported
+        ( RFavouritesSession::Version(), aVersion ) )
+        {
+        User::Leave( KErrNotSupported );
+        }
+    CSession2* session = CFavouritesSession::NewL();
+    iExitTimer->Cancel();   // We have a client, cancel exit (if pending).
+    return session;
+    }
+
+//  End of File