usbmgmt/usbmgr/device/classdrivers/ncm/classimplementation/ncmpktdrv/pktdrv/src/ncmsharedstatemanager.cpp
changeset 28 f1fd07aa74c9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/device/classdrivers/ncm/classimplementation/ncmpktdrv/pktdrv/src/ncmsharedstatemanager.cpp	Wed Jul 07 14:16:40 2010 +0800
@@ -0,0 +1,234 @@
+/*
+* 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 "ncmsharedstatemanager.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "ncmsharedstatemanagerTraces.h"
+#endif
+
+
+
+#ifdef _DEBUG
+_LIT(KPanicSharedState, "SharedStatePanic");
+#endif
+
+CNcmSharedStateManager* CNcmSharedStateManager::NewL(MShareStateObserver& aEngine)
+    {
+    CNcmSharedStateManager* self = new(ELeave) CNcmSharedStateManager(aEngine);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CNcmSharedStateManager::CNcmSharedStateManager(MShareStateObserver& aEngine) : CActive(CActive::EPriorityStandard),
+                                          iNotifyMsg(RMessage2()), iEngine(aEngine)
+    {
+    CActiveScheduler::Add(this);
+    }
+
+
+CNcmSharedStateManager::~CNcmSharedStateManager()
+    {
+    OstTraceFunctionEntry0(CNCMSHAREDSTATEMANAGER_CNCMSHAREDSTATEMANAGER);
+
+    Cancel();
+
+    iProperty.Close();
+    iProperty.Delete(KKeyNcmConnectionEvent);
+
+    delete iCoexistBearer;
+    OstTraceFunctionExit0(CNCMSHAREDSTATEMANAGER_CNCMSHAREDSTATEMANAGER_DUP01);
+    }
+
+
+void CNcmSharedStateManager::ConstructL()
+    {
+    OstTraceFunctionEntry0(CNCMSHAREDSTATEMANAGER_CONSTRUCTL);
+
+    TInt  ccStartRequested  = ENcmStartRequested;
+    User::LeaveIfError(RProperty::Get(KUsbmanSvrUid, KKeyNcmSharedState, ccStartRequested));
+    if (ccStartRequested != ENcmStartRequested)
+        {
+        User::Leave(KErrNotReady);
+        }
+
+    User::LeaveIfError(iProperty.Define(KKeyNcmConnectionEvent, RProperty::EByteArray, KAllowAllPolicy, KNetworkControlPolicy));
+    User::LeaveIfError(iProperty.Attach(RProcess().SecureId(), KKeyNcmConnectionEvent, EOwnerThread));
+
+    iCoexistBearer = CNcmCoexistBearerWatcher::NewL();
+
+    iNcmState().iIapId = 0;
+    OstTraceFunctionExit0(CNCMSHAREDSTATEMANAGER_CONSTRUCTL_DUP01);
+    }
+
+/**
+Maintains the shared state between the NCM class controller and packet driver.
+*/
+void CNcmSharedStateManager::RunL()
+    {
+    TInt err = iStatus.Int();
+
+    OstTrace1(TRACE_NORMAL, CNCMSHAREDSTATEMANAGER_RUNL, "iStatus.Int()=%d", iStatus.Int());
+
+    if (KErrNone == err)
+        {
+        DoDhcpProvisionRequest();
+        }
+    else if (KErrCancel != err)
+        {
+        NotifyNcmDisconnected(err);
+        }
+    }
+
+/**
+Stop checking the shared state
+*/
+void CNcmSharedStateManager::DoCancel()
+    {
+    iCoexistBearer->Cancel();
+    }
+
+TInt CNcmSharedStateManager::NotifyDhcpProvisionRequested()
+    {
+    OstTraceFunctionEntry0(CNCMSHAREDSTATEMANAGER_NOTIFYDHCPPROVISIONREQUESTED);
+
+    TInt ret = iCoexistBearer->SetIpOverUsbActive(iStatus);
+
+    if (ret == KErrCompletion)
+        {
+        return DoDhcpProvisionRequest();
+        }
+    else if (ret == KErrNone)
+        {
+        //notify the upper apps BTPAN is used by others.
+        NotifyNcmDisconnected(KErrInUse);
+        SetActive();
+        }
+    else
+        {
+        NotifyNcmDisconnected(ret);
+        }
+
+    OstTraceFunctionEntry0(CNCMSHAREDSTATEMANAGER_NOTIFYDHCPPROVISIONREQUESTED_DUP01);
+    return ret;
+    }
+
+TInt CNcmSharedStateManager::DoDhcpProvisionRequest()
+    {
+    if (iNotifyMsg.IsNull())
+        {
+        __ASSERT_DEBUG(0, User::Panic(KPanicSharedState, __LINE__));
+
+        //return AlreadyExists, so that Engine can start immediately.
+        return KErrAlreadyExists;
+        }
+    else
+        {
+        iNotifyMsg.Complete(KErrNone);
+        iNotifyMsg = RMessage2();
+        }
+
+    return KErrNone;
+    }
+
+
+void CNcmSharedStateManager::NotifyNcmConnected()
+    {
+    iNcmState().iState = ENcmStateConnected;
+    iProperty.Set(iNcmState);
+    }
+
+void CNcmSharedStateManager::NotifyNcmDisconnected(TInt aReason)
+    {
+    iNcmState().iState = ENcmStateDisconnected;
+    iNcmState().iErrCode = aReason;
+    iProperty.Set(iNcmState);
+
+    if (iCoexistBearer->IsIpOverUsbActived())
+        {
+        iCoexistBearer->SetIpOverUsbDeactive();
+        }
+    else
+        {
+        Cancel();
+        }
+    }
+
+TInt CNcmSharedStateManager::SetStateValue(TInt aType, TInt aValue)
+    {
+    OstTraceExt2(TRACE_NORMAL, CNCMSHAREDSTATEMANAGER_SETSTATEVALUE, "SetStateValue: type=%d, val=%d", aType, aValue);
+
+    const TInt KTypeIapId = 0;
+    const TInt KTypeDhcpReturn = 1;
+    TInt ret = KErrNone;
+    switch(aType)
+        {
+        case KTypeIapId:
+            //don't assign more than once.
+            __ASSERT_DEBUG(iNcmState().iIapId==0, User::Panic(KPanicSharedState, __LINE__));
+            iNcmState().iIapId = aValue;
+            break;
+
+        case KTypeDhcpReturn:
+            if (KErrNone == aValue)
+                {
+                iEngine.NotifyDhcpStarted();
+                }
+            else
+                {
+                OstTrace1(TRACE_WARNING, CNCMSHAREDSTATEMANAGER_SETSTATEVALUE_DUP01, "Dhcp Provision Request return error:%d", aValue);
+                NotifyNcmDisconnected(aValue);
+                }
+            break;
+
+        default:
+            OstTraceExt2(TRACE_ERROR, CNCMSHAREDSTATEMANAGER_SETSTATEVALUE_DUP02, "unknow type:%d, value:%d", aType, aValue);
+            __ASSERT_DEBUG(0, User::Panic(KPanicSharedState, __LINE__));
+            break;
+        }
+
+    return ret;
+    }
+
+TInt CNcmSharedStateManager::RegisterNotify(const RMessage2& aMsg)
+    {
+    if (!iNotifyMsg.IsNull())
+        {
+        return KErrInUse;
+        }
+
+    iNotifyMsg = aMsg;
+
+    return KErrNone;
+    }
+
+TInt CNcmSharedStateManager::DeRegisterNotify()
+    {
+    if (iNotifyMsg.IsNull())
+        {
+        return KErrNotReady;
+        }
+    else
+        {
+        iNotifyMsg.Complete(KErrCancel);
+        iNotifyMsg = RMessage2();
+        }
+
+    return KErrNone;
+    }