libraries/btserial/src/server/btserialserver.cpp
changeset 0 7f656887cf89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libraries/btserial/src/server/btserialserver.cpp	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,104 @@
+// btserialserver.cpp
+// 
+// Copyright (c) 2008 - 2010 Accenture. All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the "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:
+// Accenture - Initial contribution
+//
+
+#include "btserialserver.h"
+#include "btserialsession.h"
+#include <fshell/btincomingserial.h>
+
+static void RunServerL(RServer2* aServerPtr)
+//
+// Perform all server initialisation, in particular creation of the
+// scheduler and server and then run the scheduler
+//
+	{
+	// naming the server thread after the server helps to debug panics
+	User::LeaveIfError(RThread::RenameMe(KBtSerialServerThreadName));
+	//
+	// create and install the active scheduler we need
+	CActiveScheduler* s=new(ELeave) CActiveScheduler;
+	CleanupStack::PushL(s);
+	CActiveScheduler::Install(s);
+	//
+	// create the server (leave it on the cleanup stack)
+	CServer2* server = CBtSerialServer::NewLC();
+	*aServerPtr = server->Server();
+	//
+	// Initialisation complete, now signal the client
+	RThread::Rendezvous(KErrNone);
+	//
+	// Ready to run
+	CActiveScheduler::Start();
+	//
+	// Cleanup the server and scheduler
+	CleanupStack::PopAndDestroy(2);
+	}
+
+TInt ServerThread(TAny* aRServerPtr)
+//
+// Server process entry-point
+//
+	{
+	__UHEAP_MARK;
+	//
+	CTrapCleanup* cleanup=CTrapCleanup::New();
+	TInt r=KErrNoMemory;
+	if (cleanup)
+		{
+		RServer2* serverPtr = static_cast<RServer2*>(aRServerPtr);
+		
+		TRAP(r,RunServerL(serverPtr));
+		delete cleanup;
+		}
+	//
+	__UHEAP_MARKEND;
+	return r;
+	}
+
+//______________________________________________________________________________
+//						CBtSerialServer
+CServer2* CBtSerialServer::NewLC()
+	{
+	CBtSerialServer* self=new(ELeave) CBtSerialServer;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+	
+inline CBtSerialServer::CBtSerialServer()
+	:CServer2(0,EUnsharableSessions)
+	{
+	}
+
+
+
+void CBtSerialServer::ConstructL()
+	{
+	StartL(KNullDesC);
+	}
+
+
+CSession2* CBtSerialServer::NewSessionL(const TVersion&,const RMessage2&) const
+	{
+	if (iSession)
+		{
+		User::Leave(KErrAlreadyExists);
+		}
+	const_cast<CBtSerialServer*>(this)->iSession = new(ELeave) CBtSerialSession();
+	return iSession;
+	}
+
+void CBtSerialServer::DropSession()
+	{
+	iSession = NULL;
+	CActiveScheduler::Stop();
+	}
+