--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btcomm/src/locker.cpp Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,125 @@
+// Copyright (c) 1997-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:
+// Locker.cpp - all the active connector code
+//
+//
+
+#include <cs_port.h>
+#include "btcomm.h"
+#include "btcommactive.h"
+
+CBTPortLocker *CBTPortLocker::NewL(CBTPortProxy *aParent)
+/**
+ Create new CBTPortLocker.
+ This function creates a new CBTPortLocker active object.
+**/
+ {
+ CBTPortLocker *cc;
+ cc=new (ELeave) CBTPortLocker();
+ CleanupStack::PushL(cc);
+ cc->InitL(aParent);
+ CleanupStack::Pop();
+ CActiveScheduler::Add(cc);
+ return cc;
+ }
+
+void CBTPortLocker::InitL(CBTPortProxy *aParent)
+ {
+ iPortProxy=aParent;
+ }
+
+CBTPortLocker::~CBTPortLocker()
+/**
+ CBTPortLocker destructor.
+**/
+ {
+ Cancel();
+ }
+
+void CBTPortLocker::RunL()
+/**
+ CBTPortLocker RunL.
+ Active status cleared. We can now call the DoLockedAction
+ function on the corresponding port proxy object.
+**/
+ {
+ if(iStatus==KErrNone)
+ iPortProxy->DoLockedAction();
+ }
+
+void CBTPortLocker::LockSession()
+/**
+ CBTPortLocker LockSession.
+ This function initiates the process of making the session exclusive
+ on the socket server.
+**/
+ {
+ if(!IsActive())
+ {
+ // We need to complete this request either by actually getting a
+ // lock on ESock if we've got a handle, or by just completing the
+ // request if we don't. It's fine to do the DoLockedAction()
+ // without a locker if we don't have an ESock handle, as we can't
+ // be making any requests to ESock.
+ if(iPortProxy->iSockServ.Handle())
+ {
+ iPortProxy->iSockServ.SetExclusiveMode(iStatus);
+ SetActive();
+ }
+ else
+ {
+ SetActive();
+ TRequestStatus* status = &iStatus;
+ User::RequestComplete(status, KErrNone);
+ }
+ }
+ iLockOn=ETrue;
+ }
+
+void CBTPortLocker::UnlockSession()
+/**
+ CBTPortLocker UnlockSession.
+**/
+ {
+ if(iPortProxy->iSockServ.Handle())
+ iPortProxy->iSockServ.ClearExclusiveMode();
+ iLockOn=EFalse;
+ }
+
+void CBTPortLocker::DoCancel()
+/**
+ CBTPortLocker DoCancel.
+ Nothing to cancel.
+**/
+ {
+ }
+
+CBTPortLocker::CBTPortLocker()
+ : CActive (1020)
+/**
+ CBTPortLocker private c'tor.
+ Note that this active object is set with a priority
+ of 1020 which is higher than any other active object
+ running on the c32 active scheduler (note IrCOMM locker
+ has a priority of 1000). This means that this active
+ object will always be first in the scheduler's
+ list of completed actions when it is completes.
+**/
+ {
+ }
+
+TBool CBTPortLocker::IsSessionLocked()
+ {
+ return iLockOn;
+ }