syncmlfw/common/sosserver/src/nsmlsosserver.cpp
changeset 0 b497e44ab2fc
--- /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 <f32file.h>
+#include <e32math.h>
+
+#include <nsmldebug.h>
+#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
+