diff -r 000000000000 -r b497e44ab2fc syncmlfw/common/sosserver/src/nsmlsosserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/syncmlfw/common/sosserver/src/nsmlsosserver.cpp Thu Dec 17 09:07:52 2009 +0200 @@ -0,0 +1,213 @@ +/* +* 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 "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: Symbian OS Server source. +* +*/ + + +#include +#include + +#include +#include "nsmlsosserver.h" + +GLDEF_C TInt E32Main() // main function called by E32 + { + return LaunchServer(); + } + +// -------------------------------------------------------------------------- +// EXPORT_C TInt LaunchServer() +// -------------------------------------------------------------------------- +// +TInt LaunchServer() + { + // check server not already started + TFindServer findSOSServer( KSOSServerName ); + TFullName name; + if ( findSOSServer.Next(name) == KErrNone ) + { // found server already + return KErrGeneral; + } + + // create server thread + RSemaphore signal; + signal.CreateLocal(0); + + // randomize server thread's name + TName threadName( KSOSServerThread ); + threadName.AppendNum( Math::Random(), EHex ); + + RThread thread; + TInt res = thread.Create( threadName, // name of thread + CNSmlSOSServer::ThreadFunction, // thread function + KDefaultStackSize, NULL, + &signal ); // parameter to thread function + + if ( res != KErrNone ) + { + thread.Close(); + return res; + } + // start thread + thread.SetPriority(EPriorityMuchMore); // set priority + thread.Resume(); + thread.Close(); + signal.Wait(); + signal.Close(); + + return res; + } + +// -------------------------------------------------------------------------- +// void CNSmlSOSServer::PanicServer( TNSmlSOSServerPanic aPanic ) +// -------------------------------------------------------------------------- +// +void CNSmlSOSServer::PanicServer( TNSmlSOSServerPanic aPanic ) + { + _LIT(KTxtSOSServer,"SOSServer"); + User::Panic(KTxtSOSServer,aPanic); + } + +// -------------------------------------------------------------------------- +// TInt CNSmlSOSServer::ThreadFunction(TAny* aStarted) +// -------------------------------------------------------------------------- +// +TInt CNSmlSOSServer::ThreadFunction( TAny* aStarted ) + { +#ifdef __CLIENT_API_MT_ + __UHEAP_MARK; +#endif // __CLIENT_API_MT_ + + // create cleanup stack + CTrapCleanup* cleanup = CTrapCleanup::New(); + if ( !cleanup ) + { + PanicServer(ECleanupCreateError); + } + + DBG_BEGIN(); + _DBG_FILE("CNSmlSOSServer::ThreadFunction(): CleanupStack created."); + + // convert argument to semaphore + RSemaphore& started= *(RSemaphore*) aStarted; + + // construct and install active scheduler + CActiveScheduler* scheduler = new CActiveScheduler; + __ASSERT_ALWAYS( scheduler,PanicServer(EMainSchedulerError) ); + CActiveScheduler::Install( scheduler ); + + // construct server + CNSmlSOSServer* server = NULL; + TRAPD( err, server = CNSmlSOSServer::NewL()); + + RProcess::Rendezvous( err ); + + // start handling requests + CActiveScheduler::Start(); + + started.Signal(); + + _DBG_FILE("CNSmlSOSServer::ThreadFunction(): CActiveScheduler stopped"); + + delete server; + delete scheduler; + delete cleanup; + +#ifdef __CLIENT_API_MT_ + __UHEAP_MARKEND; +#endif // __CLIENT_API_MT_ + + return err; + } + +// -------------------------------------------------------------------------- +// CNSmlSOSServer* CNSmlSOSServer::NewL() +// -------------------------------------------------------------------------- +// +CNSmlSOSServer* CNSmlSOSServer::NewL() + { + _DBG_FILE("CNSmlSOSServer::NewL(): begin"); + + CNSmlSOSServer* self = new (ELeave) CNSmlSOSServer(); + CleanupStack::PushL(self); + self->ConstructL(); + self->StartL(KSOSServerName); + CleanupStack::Pop(); // self + + _DBG_FILE("CNSmlSOSServer::NewL(): end"); + + return self; + } + +// -------------------------------------------------------------------------- +// CNSmlSOSServer::CNSmlSOSServer() +// -------------------------------------------------------------------------- +// +CNSmlSOSServer::CNSmlSOSServer() : CServer2(EPriorityStandard, ESharableSessions) + { + } + +// -------------------------------------------------------------------------- +// void CNSmlSOSServer::ConstructL() +// -------------------------------------------------------------------------- +// +void CNSmlSOSServer::ConstructL() + { + iHandler = CNSmlSOSHandler::NewL(); + iBackup = CNSmlSOSBackup::NewL(iHandler); + iObjConIndex = CObjectConIx::NewL(); + } + +// -------------------------------------------------------------------------- +// CNSmlSOSServer::~CNSmlSOSServer() +// -------------------------------------------------------------------------- +// +CNSmlSOSServer::~CNSmlSOSServer() + { + delete iBackup; + delete iHandler; + delete iObjConIndex; + } + +// -------------------------------------------------------------------------- +// CSession2* CNSmlSOSServer::NewSessionL( const TVersion& aVersion, const RMessage2& aMessage ) const +// -------------------------------------------------------------------------- +// +CSession2* CNSmlSOSServer::NewSessionL( const TVersion& aVersion, const RMessage2& /*aMessage*/ ) const + { + _DBG_FILE("CNSmlSOSServer::NewSessionL(): begin"); + TVersion v(KNSmlSOSServerVersionMajor, KNSmlSOSServerVersionMinor, 0); + if( !User::QueryVersionSupported(v,aVersion) ) + { + User::Leave(KErrNotSupported); + } + + iBackup->Subscribe(); + + _DBG_FILE("CNSmlSOSServer::NewSessionL(): end"); + return CNSmlSOSSession::NewL( (CNSmlSOSServer*)this, iHandler ); + } + +// -------------------------------------------------------------------------- +// CObjectCon* CNSmlSOSServer::NewContainerL() +// -------------------------------------------------------------------------- +// +CObjectCon* CNSmlSOSServer::NewContainerL() + { + return iObjConIndex->CreateL(); + } + +//End of File +