vpnengine/sit/src/realiapconnobserver.cpp
changeset 0 33413c0669b9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vpnengine/sit/src/realiapconnobserver.cpp	Thu Dec 17 09:14:51 2009 +0200
@@ -0,0 +1,151 @@
+/*
+* Copyright (c) 2003-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:   Task handler for listening to the real interface 
+*
+*/
+
+// @file realiapconnobserver.cpp
+
+#include "realiapconnobserver.h"
+#include "log.h"
+
+CRealIapConnObserver* CRealIapConnObserver::NewL(MTaskHandlerManager* aManager,
+                                                 const TTaskArrivedEventData& aTaskInfo)
+    {
+    CRealIapConnObserver* self = new (ELeave) CRealIapConnObserver(aManager, aTaskInfo);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(); // self
+    return self;
+    }
+
+CRealIapConnObserver::CRealIapConnObserver(MTaskHandlerManager* aManager,
+                                           const TTaskArrivedEventData& aTaskInfo)
+    : CTaskHandler(aManager, aTaskInfo, EObserveRealIapConnCancelEvent, &iEventSpecDes)
+    {
+    }
+
+void CRealIapConnObserver::ConstructL()
+    {
+    CActiveScheduler::Add(this);
+    User::LeaveIfError(iEventMediator.Connect());
+    }
+    
+CRealIapConnObserver::~CRealIapConnObserver()
+    {
+    Cancel();
+    iEventMediator.Close();
+    }
+
+void CRealIapConnObserver::StartTaskHandling()
+    {
+    GotoState(KStateStartObserving);
+    }
+
+void CRealIapConnObserver::ChangeStateL()
+    {
+    switch (NextState())
+        {
+        case KStateStartObserving:
+            StateStartObservingL();
+            break;
+
+        case KStateFinishObserving:
+            StateFinishObserving();
+            break;
+
+        default:
+            User::Panic(KSitName, EPanicInvalidTaskHandlerState);
+        }
+    }
+
+void CRealIapConnObserver::CancelOngoingOperation()
+    {
+    TPckg<TUint32> connInfoDes(iEventSpecDes().iVpnIapId);
+        
+    switch (CurrState())
+        {
+        case KStateStartObserving:
+            // Cancel connection observation
+            iEventMediator.CancelListening(EKmdRealIapConnDownEvent, connInfoDes);
+            break;
+
+        case KStateFinishObserving:
+            // There's no ongoing external request to cancel
+            break;
+
+        default:
+            User::Panic(KSitName, EPanicInvalidTaskHandlerState);
+        }
+    }
+    
+void CRealIapConnObserver::StateStartObservingL()
+    {
+    SetCurrState(KStateStartObserving);
+
+    TPckg<TUint32> connInfoDes(iEventSpecDes().iVpnIapId);
+    iEventMediator.ListenToEvent(EKmdRealIapConnDownEvent, connInfoDes, *this);
+    }
+
+void CRealIapConnObserver::EventOccured(TInt aStatus, TEventType aType, TDesC8* aData)
+    {
+    LOG(Log::Printf(_L("CRealIapConnObserver::EventOccured\n")));
+    
+    if (aType == EKmdRealIapConnDownEvent)
+        {
+        // An erroneous aStatus would indicate that the event listening
+        // itself would have failed somehow. We interpret that so that
+        // in that case we just wouldn't get a notice if the real IAP
+        // connection goes down. If it would go down, application
+        // data would cease to move and the application or the user
+        // would notice that at some point and close the VPN connection.
+        if (aStatus == KErrNone)
+            {
+            LOG(Log::Printf(_L("CRealIapConnObserver::EventOccured (KMD informed that real IAP is down\n")));
+            
+            TEventData eventData;
+            TPckg<TEventData> eventDataDes(eventData);
+            eventDataDes.Copy(*aData);
+
+            iStatus = eventData.iTaskStatus;
+            
+            GotoState(KStateFinishObserving);
+            }
+        }
+    else
+        {
+        // Call the base class implementation to handle the event
+        CTaskHandler::EventOccured(aStatus, aType, aData);
+        }
+    }
+
+void CRealIapConnObserver::StateFinishObserving()
+    {
+    SetCurrState(KStateFinishObserving);
+    
+    TaskComplete(iStatus.Int());
+    }
+
+void CRealIapConnObserver::ReportResult(TInt aStatus)
+    {
+    // Report the connection shutdown with status
+    // information to the Event Mediator
+
+    TObserveRealIapConnEventData eventData;
+
+    eventData.iTaskStatus = aStatus;
+
+    TPckg<TObserveRealIapConnEventData> eventDataDes(eventData);
+    ReportEvent(EObserveRealIapConnEvent, iEventSpecDes, eventDataDes);
+    }