vpnengine/sit/src/extender.cpp
branchRCL_3
changeset 22 9f4e37332ce5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vpnengine/sit/src/extender.cpp	Thu Aug 19 10:54:34 2010 +0300
@@ -0,0 +1,413 @@
+/*
+* 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: Extended functinality for policy provision process.
+*
+*/
+#include <cmmanagerext.h>
+#include <cmconnectionmethodext.h>
+#include <cmdestinationext.h>
+#include <cmconnectionmethoddef.h>
+#include <centralrepository.h>
+
+#include "sit.h"
+#include "extender.h"
+#include "log.h"
+#include "vpnconnstarter.h"
+#include "extenderhelper.h"
+
+
+CExtender* CExtender::NewL()
+    {
+    LOG(Log::Printf(_L("CExtender::NewL - begin\n")));
+    CExtender* self = new (ELeave) CExtender();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(); // self
+    LOG(Log::Printf(_L("CExtender::NewL - end\n")));
+    return self;
+    }
+    
+CExtender::~CExtender()
+    {
+    LOG(Log::Printf(_L("CExtender::~CExtender\n")));
+    Cancel();
+    
+    iVpnExtServ.Close();
+    iNotifier.Close();
+    delete iExtenderHelper;
+    }
+    
+CExtender::CExtender() : CActive(EPriorityNormal)
+    {
+    
+    }
+
+void CExtender::ConstructL()
+    {
+    CActiveScheduler::Add(this);    
+    User::LeaveIfError(iVpnExtServ.Connect());
+    User::LeaveIfError(iNotifier.Connect());
+    }
+
+void CExtender::DoCancel()
+    {
+    CancelOngoingOperation();
+    }
+
+void CExtender::RunL()
+    {
+     ChangeStateL();
+    }
+
+void CExtender::GotoState(TInt aState)
+    {
+    SetNextState(aState);
+    SetActive();
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete(status, KErrNone);
+    }
+    
+void CExtender::SetCurrState(TInt aState)
+    {
+    iCurrState = aState;
+    }
+
+void CExtender::SetNextState(TInt aState)
+    {
+    iNextState = aState;
+    }
+
+TInt CExtender::CurrState()
+    {
+    return iCurrState;
+    }
+
+TInt CExtender::NextState()
+    {
+    return iNextState;
+    }
+
+TInt CExtender::RunError(TInt aError)
+    {
+    LOG(Log::Printf(_L("CExtender::RunError - error = %d\n"), aError));
+    ProcessComplete(aError);
+    return KErrNone;
+    }
+
+void CExtender::ChangeStateL()
+    {
+    switch (NextState())
+        {
+        case KStateCheckPolicyUpdateAvailability:
+            StateCheckPolicyUpdateAvailabilityL();
+            break;
+     
+        case KStateAfterAskUpdateConfirmation:
+            StateAfterAskUpdateConfirmationL();
+            break;
+
+        case KStateUpdatePolicy:
+            StateUpdatePolicyL();
+            break;
+            
+        case KStateAfterUpdatePolicy:
+            StateAfterUpdatePolicyL();
+            break;
+
+        case KStateShowUpdateCompleteNote:
+            StateShowUpdateCompleteNote();
+            break;
+
+        case KStateAfterShowUpdateCompleteNote:
+            StateAfterShowUpdateCompleteNote();
+            break;
+           
+        case KStateShowApActFailureNote:
+            StateShowApActFailureNote();
+            break;
+                    
+        case KStateAfterShowApActFailureNote:
+            StateAfterShowApActFailureNote();
+            break;
+   
+        default:
+            User::Panic(KSitName, EPanicInvalidTaskHandlerState);
+        }   
+    }
+
+void CExtender::CancelOngoingOperation()
+    {
+    switch (CurrState())
+        {
+        case KStateShowApActFailureNote:
+        case KStateAskUpdateConfirmation:
+        case KStateShowUpdateCompleteNote:
+            LOG(Log::Printf(_L("CExtender::CancelOngoingOperation - cancelling notifier\n")));
+            iNotifier.CancelNotifier(KUidVpnDialogNotifier);
+            break;
+            
+        case KStateCheckPolicyUpdateAvailability:
+        case KStateUpdatePolicy:
+        case KStateAfterUpdatePolicy:    
+            LOG(Log::Printf(_L("CExtender::CancelOngoingOperation - cancelling Policy Provision operation\n")));
+            iVpnExtServ.CancelPolicyProvision();
+            iExtenderHelper->Cancel();
+            break;
+            
+        case KStateAfterShowApActFailureNote:
+        case KStateAfterAskUpdateConfirmation:
+        case KStateAfterCheckPolicyUpdateAvailability:
+        case KStateAfterShowUpdateCompleteNote:
+            LOG(Log::Printf(_L("CExtender::CancelOngoingOperation - cancelling nothing\n")));
+            // Nothing to cancel
+            break;
+            
+        default:
+            User::Panic(KSitName, EPanicInvalidTaskHandlerState);
+        }
+    }
+
+void CExtender::OnVpnApActStart(CVpnConnStarter* aVpnConnStarter)
+    {
+    LOG(Log::Printf(_L("CExtender::OnVpnApActStart\n")));
+    iVpnConnStarter = aVpnConnStarter;
+
+    // Prevent the deletion of the iVpnConnStarter task
+    // handler (that owns us) as long as we are running
+    iVpnConnStarter->SetDelayedTaskEnd(ETrue);
+    }
+
+void CExtender::OnVpnApActCancel()
+    {
+    LOG(Log::Printf(_L("CExtender::OnVpnApActCancel\n")));
+
+    // Allow the deletion of the iVpnConnStarter task handler
+    // (the activation has been cancelled in which case
+    // automatic policy updating process will not be
+    // performed and thus the task handler can be deleted
+    // right away after cancel)
+    iVpnConnStarter->SetDelayedTaskEnd(EFalse);
+    }
+
+void CExtender::OnVpnApActEnd(const TVpnPolicyId* aPolicyId, TInt aStatus, TUint32 aRealIapId)
+    {
+    LOG(Log::Printf(_L("CExtender::OnVpnApActEnd\n")));
+    iPolicyId.Copy(*aPolicyId);
+    iRealIapId = aRealIapId;
+
+    iVpnActStatus = aStatus;
+    
+    if (iVpnActStatus != KErrNone && iVpnActStatus != KErrCancel)
+        {
+        // Report the failure to the system
+        // (management session runner if such is present)
+        // First show a VPN connection activation failure note
+        GotoState(KStateShowApActFailureNote);
+        }
+    else if (iVpnActStatus == KErrCancel)
+        {
+        // The user has cancelled the VPN connection activation,
+        // in that case the automatic policy update operation is
+        // not performed
+        EndTask();
+        }
+    else
+        {
+        // Begin the combined policy update and
+        // certificate enrollment process right away
+        //GotoState(KStateCheckPolicyUpdateAvailability);
+        EndTask();
+        }
+    }
+
+void CExtender::StateShowApActFailureNote()
+    {
+    LOG(Log::Printf(_L("CExtender::StateShowApActFailureNote\n")));
+    SetCurrState(KStateShowApActFailureNote);
+    iStatus = KRequestPending;
+    SetActive();
+        
+    TRequestStatus* ownStatus = &iStatus;
+    User::RequestComplete(ownStatus, KErrNone);
+
+    SetNextState(KStateAfterShowApActFailureNote);
+    }
+
+void CExtender::StateAfterShowApActFailureNote()
+    {
+    LOG(Log::Printf(_L("CExtender::StateAfterShowApActFailureNote\n")));
+    SetCurrState(KStateAfterShowApActFailureNote);
+
+    iNotifier.CancelNotifier(KUidVpnDialogNotifier);
+    
+    // Begin the combined policy update
+    // and certificate enrollment process
+    GotoState(KStateCheckPolicyUpdateAvailability);
+    }
+
+
+void CExtender::StateCheckPolicyUpdateAvailabilityL()
+    {
+    LOG(Log::Printf(_L("CExtender::StateCheckPolicyUpdateAvailabilityL\n")));
+    SetCurrState(KStateCheckPolicyUpdateAvailability);
+
+    LOG(Log::Printf(_L(" Doing the policy update.\n")));
+ 
+       
+    TAgileProvisionPolicy vpnPolicyName;
+    User::LeaveIfError(iVpnExtServ.GetPolicyName(vpnPolicyName));
+   
+    if ( iPolicyId.Compare(vpnPolicyName.iPolicyName) == 0 )
+       {
+        SetCurrState(KStateAskUpdateConfirmation);
+
+        TVpnDialogInfo dialogInfo(TVpnDialog::EPolicyUpdateConfirmation, 0);
+        iDialogInfoDes() = dialogInfo;
+       
+        iNotifier.StartNotifierAndGetResponse(iStatus, KUidVpnDialogNotifier,
+                                             iDialogInfoDes, iDialogResponseDes);
+
+        SetActive();
+        SetNextState(KStateAfterAskUpdateConfirmation);
+        }
+    else
+        {
+        EndTask();
+        }
+    }
+
+
+void CExtender::StateAfterAskUpdateConfirmationL()
+    {
+    LOG(Log::Printf(_L("CExtender::StateAfterAskUpdateConfirmationL\n")));        
+    SetCurrState(KStateAfterAskUpdateConfirmation);
+    
+    iNotifier.CancelNotifier(KUidVpnDialogNotifier);
+
+    // If the user pressed Cancel or an
+    // error occurred, we stop here
+    User::LeaveIfError(iStatus.Int());
+    
+    iShowCompletionNote = ETrue;
+    GotoState(KStateUpdatePolicy);
+    }
+    
+void CExtender::StateUpdatePolicyL()
+    {
+    LOG(Log::Printf(_L("CExtender::StateUpdatePolicy\n")));
+    SetCurrState(KStateUpdatePolicy);
+    
+   if ( iExtenderHelper == NULL)
+       iExtenderHelper=CExtenderHelper::NewL();
+   
+    iExtenderHelper->StartNotifierL(this);
+   
+        
+    iVpnExtServ.SynchronizePolicyServer(iStatus);
+    
+    SetActive();
+    SetNextState(KStateAfterUpdatePolicy);
+    }
+
+void CExtender::StateAfterUpdatePolicyL()
+    {
+    LOG(Log::Printf(_L("CExtender::StateAfterUpdatePolicyL\n")));    
+  
+    
+    if (iStatus != KErrNone)
+        {
+        User::Leave(iStatus.Int());
+        }
+
+    ProcessComplete(KErrNone);
+    }
+
+void CExtender::ProcessComplete(TInt aStatus)
+    {
+    LOG(Log::Printf(_L("CExtender::ProcessComplete - status = %d\n"), aStatus));        
+    iFinalStatus = aStatus;
+    GotoState(KStateShowUpdateCompleteNote);
+    }
+
+void CExtender::StateShowUpdateCompleteNote()
+    {
+    LOG(Log::Printf(_L("CExtender::StateShowUpdateCompleteNote\n")));    
+    SetCurrState(KStateShowUpdateCompleteNote);
+
+    if (!iShowCompletionNote || iFinalStatus == KErrCancel)
+        {
+         EndTask();
+        }
+    else if ( iFinalStatus == KErrNone )
+        {
+               
+        TVpnDialogInfo dialogInfo(TNoteDialog::EInfo, TVpnNoteDialog::EPolicyUpdateSucceeded);
+                                iDialogInfoDes() = dialogInfo;
+                                
+        iNotifier.StartNotifierAndGetResponse(iStatus, KUidVpnDialogNotifier,
+                                           iDialogInfoDes, iDialogResponseDes);
+
+        SetActive();
+        SetNextState(KStateAfterShowUpdateCompleteNote);
+        
+        }
+    else
+        {
+        TVpnDialogInfo dialogInfo(TNoteDialog::EInfo, TVpnNoteDialog::EPolicyUpdateFailed);
+                iDialogInfoDes() = dialogInfo;
+        
+        iNotifier.StartNotifierAndGetResponse(iStatus, KUidVpnDialogNotifier,
+                                          iDialogInfoDes, iDialogResponseDes);
+
+        SetActive();
+        SetNextState(KStateAfterShowUpdateCompleteNote);
+        }
+    
+    
+    }
+
+void CExtender::StateAfterShowUpdateCompleteNote()
+    {
+    LOG(Log::Printf(_L("CExtender::StateAfterShowUpdateCompleteNote\n")));    
+    SetCurrState(KStateAfterShowUpdateCompleteNote);
+    
+    iNotifier.CancelNotifier(KUidVpnDialogNotifier);
+    
+    EndTask();
+    }
+
+TCmSettingSelection CExtender::GetPolicyServerSelectionL()
+    {
+
+   // Get policy server details
+    // from the Policy Provision server configuration
+    TAgileProvisionApiServerSettings vpnPolicyServerDetails;
+    User::LeaveIfError(iVpnExtServ.ServerDetails(vpnPolicyServerDetails));
+
+    
+    // Return the server selection
+    return vpnPolicyServerDetails.iSelection;
+    }
+    
+void CExtender::EndTask()
+    {
+    LOG(Log::Printf(_L("CExtender::EndTask\n")));    
+    // Allow the deletion of the CVpnConStarter task handler
+    iVpnConnStarter->SetDelayedTaskEnd(EFalse);
+
+    // We're done and the enclosing connection starter
+    // object is now free to go (causing the deletion
+    // of this extender object as well)
+    iVpnConnStarter->TaskDone();
+    }