customization/ScreenSaverAdapter/ScreenSaverServer/src/ScreenSaverServer.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:40:12 +0200
changeset 0 3ce708148e4d
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2007 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: Implementation of customization components
*
*/
 


#include "ScreenSaverServer.h"
#include "ScreenSaverClientServer.h"
#include "ScreenSaverSession.h"

#include "debug.h"





// ----------------------------------------------------------------------------------------
// Server startup code
// ----------------------------------------------------------------------------------------
static void RunServerL()
	{
	// naming the server thread after the server helps to debug panics
	__UHEAP_MARK;

	User::LeaveIfError(User::RenameThread(KDMSSServerName)); 

	// create and install the active scheduler

	CActiveScheduler* s=new(ELeave) CActiveScheduler;
	CleanupStack::PushL(s);
	CActiveScheduler::Install(s);
	__UHEAP_MARK;

	// create the server (leave it on the cleanup stack)
	CServer2 *t = CScreenSaverServer::NewLC();
	// Initialisation complete, now signal the client

	RProcess::Rendezvous(KErrNone);

	// Ready to run
	RDEBUG("CScreenSaverServer is running");
	CActiveScheduler::Start();


	// Cleanup the server and scheduler
	CleanupStack::PopAndDestroy(t);
	__UHEAP_MARKEND;

	CleanupStack::PopAndDestroy(s);
	__UHEAP_MARKEND;
	}

// Server process entry-point
TInt E32Main()
	{
	__UHEAP_MARK;
	RDEBUG("CScreenSaverServer: E32Main");
	CTrapCleanup* cleanup=CTrapCleanup::New();
	TInt r=KErrNoMemory;
	if (cleanup)
		{
		TRAP(r,RunServerL());
		RDEBUG_2("CScreenSaverServer closed with code: %d", r);
		delete cleanup;
		}
	__UHEAP_MARKEND;
	return r;
	}




// -----------------------------------------------------------------------------
// CShutDown::CShutdown()
// -----------------------------------------------------------------------------

inline CShutdown::CShutdown()
	:CTimer(-1)
	{
	CActiveScheduler::Add(this);
	}
	
	
// -----------------------------------------------------------------------------
// CShutDown::ConstructL()
// -----------------------------------------------------------------------------

inline void CShutdown::ConstructL()
	{
	CTimer::ConstructL();
	}

// -----------------------------------------------------------------------------
// CShutDown::Start()
// -----------------------------------------------------------------------------

inline void CShutdown::Start()
	{
	
	RDEBUG( "creenSaverServer: starting shutdown timeout" );
	
	After(KScreenSaverServerShutdownDelay);
	//SetActive();
	}

// -----------------------------------------------------------------------------
// CShutDown::RunL()
// -----------------------------------------------------------------------------

void CShutdown::RunL()
	{
	RDEBUG( "creenSaverServer timeout ... closing" );
	CActiveScheduler::Stop();
	}




CServer2* CScreenSaverServer::NewLC()
	{
	RDEBUG("CScreenSaverServer::NewLC - start");
	
	CScreenSaverServer* self=new(ELeave) CScreenSaverServer;
	CleanupStack::PushL(self);
	self->ConstructL();
	RDEBUG("CScreenSaverServer::NewLC - end");
	return self;
	}



void CScreenSaverServer::ConstructL()
	{
	RDEBUG("CScreenSaverServer::ConstructL start");
	
	StartL(KDMSSServerName);
	iShutdown.ConstructL();
	iShutdown.Start();	
	
	RDEBUG("CScreenSaverServer::ConstructL end");
	}


CScreenSaverServer::CScreenSaverServer() :CServer2(0)
	{
	RDEBUG("CScreenSaverServer::CScreenSaverServer()");
	}
	// -----------------------------------------------------------------------------
// CApplicationManagementServer::AddSession()
// -----------------------------------------------------------------------------

void CScreenSaverServer::AddSession()
	{
	// A new session is being created
	RDEBUG( "CScreenSaverServer::AddSession" );
	++iSessionCount;
	
	// Cancel the shutdown timer if it was running
	iShutdown.Cancel();
	}


// -----------------------------------------------------------------------------
// CApplicationManagementServer::DropSession()
// -----------------------------------------------------------------------------

void CScreenSaverServer::DropSession()
	{
	// A session is being destroyed
	RDEBUG( "CScreenSaverServer::DropSession" );

	// Start the shutdown timer if it is the last session
	if ( --iSessionCount == 0 )
		{
			iShutdown.Start();
		}
	}




CScreenSaverServer::~CScreenSaverServer()
	{
	RDEBUG("CScreenSaverServer::CScreenSaverServer()");
	}



CSession2* CScreenSaverServer::NewSessionL(const TVersion&,const RMessage2&) const
	{
	RDEBUG("CScreenSaverServer::NewSessionL");
	return new (ELeave) CScreenSaverSession();
	}


void CScreenSaverServer::GetAvailableScreenSaversL(RImplInfoPtrArray& aScreenSaverList)
	{
	RDEBUG("CScreenSaverServer::GetAvailableScreenSavers()");
	CScreensaverPluginInterfaceDefinition::ListImplementationsL( aScreenSaverList );
	REComSession::FinalClose();
	}