--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/device/classdrivers/ncm/classimplementation/ncmpktdrv/pktdrv/src/ncmcoexistbearerwatcher.cpp Tue Aug 31 17:01:47 2010 +0300
@@ -0,0 +1,203 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+#include "ncmcoexistbearerwatcher.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "ncmcoexistbearerwatcherTraces.h"
+#endif
+
+
+#ifdef _DEBUG
+_LIT(KCoBearerPanic, "CoexistBearerPanic");
+#endif
+
+CNcmCoexistBearerWatcher* CNcmCoexistBearerWatcher::NewL()
+ {
+ CNcmCoexistBearerWatcher* self = new(ELeave) CNcmCoexistBearerWatcher();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CNcmCoexistBearerWatcher::CNcmCoexistBearerWatcher() : CActive(CActive::EPriorityStandard)
+ {
+ CActiveScheduler::Add(this);
+ }
+
+
+CNcmCoexistBearerWatcher::~CNcmCoexistBearerWatcher()
+ {
+ Cancel();
+ iProperty.Close();
+ }
+
+
+void CNcmCoexistBearerWatcher::ConstructL()
+ {
+ OstTraceFunctionEntry0(CNCMCOEXISTBEARERWATCHER_CONSTRUCTL);
+
+ const TUint KIPBearerCoexistenceProperty = 0x10286a95;
+
+ TInt err = iProperty.Define(KIPBearerCoexistenceProperty, RProperty::EInt, KAllowAllPolicy, KNetworkControlPolicy);
+ if ( (err != KErrNone) && (err != KErrAlreadyExists) )
+ {
+ OstTrace1( TRACE_ERROR, CNCMCOEXISTBEARERWATCHER_CONSTRUCTL_DUP02, "Failed to define the property;err=%d", err );
+ User::Leave(err);
+ }
+
+ TSecureId thisSID = RProcess().SecureId();
+ User::LeaveIfError(iProperty.Attach(thisSID, KIPBearerCoexistenceProperty));
+ User::LeaveIfError(iProperty.Get(reinterpret_cast<TInt&>(iBearerState)));
+
+ OstTraceFunctionExit0(CNCMCOEXISTBEARERWATCHER_CONSTRUCTL_DUP01);
+ }
+
+
+TInt CNcmCoexistBearerWatcher::SetIpOverUsbActive(TRequestStatus& aStatus)
+ {
+ OstTraceFunctionEntry0(CNCMCOEXISTBEARERWATCHER_SETIPOVERUSBACTIVE);
+
+ TInt ret = DoActive();
+ OstTrace1(TRACE_NORMAL, CNCMCOEXISTBEARERWATCHER_SETIPOVERUSBACTIVE_DUP01, "DoActive()=%d.", ret);
+
+ if (KErrNone == ret)
+ {
+ OstTraceFunctionExitExt(CNCMCOEXISTBEARERWATCHER_SETIPOVERUSBACTIVE_DUP02, this, KErrCompletion);
+ return KErrCompletion;
+ }
+ else if (KErrInUse == ret)
+ {
+ iReportStatus = &aStatus;
+ *iReportStatus = KRequestPending;
+
+ iProperty.Subscribe(iStatus);
+ SetActive();
+ return KErrNone;
+ }
+
+ OstTraceFunctionExitExt(CNCMCOEXISTBEARERWATCHER_SETIPOVERUSBACTIVE_DUP03, this, ret);
+ return ret;
+ }
+/**
+ * do Set IP Over USB Actived.
+ */
+TInt CNcmCoexistBearerWatcher::DoActive()
+ {
+ __ASSERT_DEBUG(iBearerState != EIPBearerIPOverUSB, User::Panic(KCoBearerPanic, __LINE__));
+
+ _LIT(KIPBearerCoexistenceMutex, "IPBearerCoexistenceMutex");
+ RMutex gMutex;
+ TInt error = gMutex.CreateGlobal(KIPBearerCoexistenceMutex);
+ if ( error != KErrNone )
+ {
+ if( error == KErrAlreadyExists )
+ {
+ error = gMutex.OpenGlobal(KIPBearerCoexistenceMutex);
+ if(error != KErrNone)
+ {
+ OstTrace1(TRACE_ERROR, CNCMCOEXISTBEARERWATCHER_DOACTIVE, "Failed to open global mutex, error=%d", error);
+ return KErrNotReady;
+ }
+ }
+ else
+ {
+ OstTrace1(TRACE_ERROR, CNCMCOEXISTBEARERWATCHER_DOACTIVE_DUP01, "Failed to create a global mutex, error=%d", error);
+ return KErrNotReady;
+ }
+ }
+
+ gMutex.Wait();
+ error = iProperty.Get(reinterpret_cast<TInt&>(iBearerState));
+ if (error != KErrNone)
+ {
+ OstTrace1(TRACE_ERROR, CNCMCOEXISTBEARERWATCHER_DOACTIVE_DUP02, "Failed to get property value, error=%d", error);
+ }
+ else
+ {
+ if (iBearerState == EIPBearerNoneActive)
+ {
+ error = iProperty.Set(EIPBearerIPOverUSB);
+ if (error != KErrNone)
+ {
+ OstTrace1(TRACE_ERROR, CNCMCOEXISTBEARERWATCHER_DOACTIVE_DUP03, "Failed to set property value, error=%d", error);
+ }
+ else
+ {
+ iBearerState = EIPBearerIPOverUSB;
+ }
+ }
+ else
+ {
+ error = KErrInUse;
+ __ASSERT_DEBUG(iBearerState != EIPBearerIPOverUSB, User::Panic(KCoBearerPanic, __LINE__));
+ OstTrace1(TRACE_WARNING, CNCMCOEXISTBEARERWATCHER_DOACTIVE_DUP04, "Failed to set CoexistIPBearer to IPOverUsb since iBearerState=%d", iBearerState);
+ }
+ }
+
+ gMutex.Signal();
+ gMutex.Close();
+
+ return error;
+ }
+
+TInt CNcmCoexistBearerWatcher::SetIpOverUsbDeactive()
+ {
+ __ASSERT_DEBUG(iBearerState==EIPBearerIPOverUSB, User::Panic(KCoBearerPanic, __LINE__));
+
+ TInt err = iProperty.Set(EIPBearerNoneActive);
+ OstTrace1(TRACE_NORMAL, CNCMCOEXISTBEARERWATCHER_SETIPOVERUSBDEACTIVE, "Stop using Coexistence Bearer, result=%d", err);
+ iBearerState = EIPBearerNoneActive;
+
+ return err;
+ }
+
+void CNcmCoexistBearerWatcher::RunL()
+ {
+ OstTrace1(TRACE_NORMAL, CNCMCOEXISTBEARERWATCHER_RUNL, "iStatus.Int()=%d", iStatus.Int());
+
+ if (KErrNone == iStatus.Int())
+ {
+ TInt ret = DoActive();
+ OstTrace1(TRACE_NORMAL, CNCMCOEXISTBEARERWATCHER_RUNL_DUP01, "DoActive()=%d", ret);
+ if (KErrNone == ret)
+ {
+ User::RequestComplete(iReportStatus, KErrNone);
+ }
+ else if (KErrInUse == ret)
+ {
+ iProperty.Subscribe(iStatus);
+ SetActive();
+ }
+ else
+ {
+ User::RequestComplete(iReportStatus, ret);
+ }
+ }
+ else if (KErrCancel != iStatus.Int())
+ {
+ User::RequestComplete(iReportStatus, iStatus.Int());
+ }
+ }
+
+void CNcmCoexistBearerWatcher::DoCancel()
+ {
+ OstTraceFunctionEntry0(CNCMCOEXISTBEARERWATCHER_DOCANCEL);
+ iProperty.Cancel();
+ User::RequestComplete(iReportStatus, KErrCancel);
+ }