diff -r 000000000000 -r 29b1cd4cb562 bluetooth/btcomm/src/sockservconnector.cpp --- /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 + +#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(thread.Id()), EHex); + + // We can carry on even if this errors + User::RenameThread(threadName); + + return StartConnector(*reinterpret_cast(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) + { + }