--- /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();
+ }