bluetooth/btcomm/src/sockservconnector.cpp
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btcomm/src/sockservconnector.cpp	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,153 @@
+// Copyright (c) 2004-2009 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:
+// sockservconnector.cpp - all the active connector code
+// 
+//
+
+#include <e32math.h>
+
+#include "btcomm.h"
+#include "btcommactive.h"
+#include "btcommutil.h"
+
+
+TInt StartConnector(RSocketServ& aSockServ)
+	{
+	TInt err = aSockServ.Connect();
+	if(err == KErrNone)
+		{
+		err = aSockServ.ShareAuto();
+		if(err != KErrNone)
+			{
+			aSockServ.Close();
+			}
+		}
+		
+	return err;
+	}
+
+TInt RunConnectorThread(TAny* aArg)
+	{
+	// Add the thread id to the end of the the thread name
+	// to ensure it is unique.
+	TName threadName(KConnectorThreadName);
+	RThread thread;
+	threadName.AppendNum(static_cast<TUint>(thread.Id()), EHex);
+
+	// We can carry on even if this errors
+	User::RenameThread(threadName);
+	
+	return StartConnector(*reinterpret_cast<RSocketServ*>(aArg));
+	}
+	
+//==============================================================================
+
+CSockServConnector* CSockServConnector::NewL(RSocketServ& aSockServ)
+	{
+	CSockServConnector* self = new(ELeave) CSockServConnector(aSockServ);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+void CSockServConnector::ConstructL()
+	{
+	}
+
+CSockServConnector::~CSockServConnector()
+	{
+	Cancel();
+	}
+
+void CSockServConnector::SockServConnect(TRequestStatus& aStatus)
+	{
+	TThreadFunction connectorThreadFunction(RunConnectorThread);
+	iClientStatus = &aStatus;
+	*iClientStatus = KRequestPending;
+
+	// Once we've connected this thread it is renamed to ensure
+	// its name is unique.
+	TInt err = iConnectorThread.Create(KConnectorThreadName, connectorThreadFunction,KDefaultStackSize,KMinHeapSize,1024*1000, &iSockServ, EOwnerThread);
+
+	if(err != KErrNone)
+		{
+		User::RequestComplete(iClientStatus, err);
+		}
+	else
+		{
+		// Set up the configuration of the thread
+		iConnectorThread.SetPriority(RThread().Priority());
+		
+		// Stick ourselves on the scheduler jit so we're not
+		// cluttering up the queue when we don't want to be 
+		// run.
+		CActiveScheduler::Add(this);
+		
+		// Set ourselves to be notified on death of connector thread.
+		iConnectorThread.Logon(iStatus);
+		SetActive();
+
+		// Mark connector thread ready to run
+		iConnectorThread.Resume();
+		}
+	}
+
+void CSockServConnector::RunL()
+	{
+	// Remove ourselves from the active scheduler so we
+	// don't get in the way of other active objects
+	Deque();
+	
+	// if the thread returned something other than
+	// KErrNone then the Esock connect & share didn't
+	// succeed.  Go to RunError to notify client and
+	// tidy up.
+	User::LeaveIfError(iStatus.Int());
+	
+	// The exit reason was zero, but the thread 
+	// terminated abnormally.
+	if(iConnectorThread.ExitType() != EExitKill)
+		{
+		User::Leave(KErrGeneral);
+		}
+
+	NotifyAndClose(KErrNone);
+	}
+	
+TInt CSockServConnector::RunError(TInt aError)
+	{
+	// let client know about result, and gulp
+	NotifyAndClose(aError);
+	return KErrNone;
+	}
+	
+void CSockServConnector::NotifyAndClose(TInt aError)
+	{
+	// tell client the result
+	User::RequestComplete(iClientStatus, aError);
+	// close connector thread
+	iConnectorThread.Close();	
+	}
+
+void CSockServConnector::DoCancel()
+	{
+	BTCommUtil::Panic(EBTCommESockSessionAttachNotDone);
+	}
+
+// We make this ao high priority because we want to get the session connected asap so we can
+// make some progress servicing other requests.
+CSockServConnector::CSockServConnector(RSocketServ& aSockServ) : CActive (EPriorityHigh), iSockServ(aSockServ)
+	{
+	}