diff -r 000000000000 -r 33413c0669b9 vpnengine/kmdserver/src/iachangeobserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vpnengine/kmdserver/src/iachangeobserver.cpp Thu Dec 17 09:14:51 2009 +0200 @@ -0,0 +1,139 @@ +/* +* Copyright (c) 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: active object, that monitors internal address change +* +*/ + + +#include "ikedebug.h" +#include "ikepluginsessionif.h" +#include "internaladdress.h" +#include "eventmediatorapi.h" + +// CLASS HEADER +#include "iachangeobserver.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CIaChangeObserver* CIaChangeObserver::NewL( TUint32 aVpnIapId, + const TInetAddr& aDnsServerAddr, + MIkePluginSessionIf& aIkePluginSession, + MIkeDebug& aDebug ) + { + CIaChangeObserver* self = new (ELeave) CIaChangeObserver( aVpnIapId, + aDnsServerAddr, + aIkePluginSession, + aDebug ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + + } + +// --------------------------------------------------------------------------- +// Destructor. +// --------------------------------------------------------------------------- +// +CIaChangeObserver::~CIaChangeObserver() + { + Cancel(); + iEventMediator.Close(); + } + +// --------------------------------------------------------------------------- +// Constructor. +// --------------------------------------------------------------------------- +// +CIaChangeObserver::CIaChangeObserver( TUint32 aVpnIapId, + const TInetAddr& aDnsServerAddr, + MIkePluginSessionIf& aIkePluginSession, + MIkeDebug& aDebug ) + : CActive( EPriorityStandard ), + iVpnIapId( aVpnIapId ), + iDnsServerAddr( aDnsServerAddr ), + iIkePluginSession( aIkePluginSession ), + iDebug( aDebug ) + { + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// Constructor. +// --------------------------------------------------------------------------- +// +void CIaChangeObserver::ConstructL() + { + User::LeaveIfError( iEventMediator.Connect() ); + } + +// --------------------------------------------------------------------------- +// Requests asynchronous internal address change notification. +// --------------------------------------------------------------------------- +// +void CIaChangeObserver::StartObserving() + { + iIkePluginSession.NotifyInternalAddressChanged( iInternalAddress, + iStatus ); + SetActive(); + } + +// --------------------------------------------------------------------------- +// From class CActive +// Handles completion of asynchronous notification request. +// --------------------------------------------------------------------------- +// +void CIaChangeObserver::RunL() + { + __ASSERT_DEBUG( iStatus.Int() == KErrNone || + iStatus.Int() == KErrCancel, + User::Invariant() ); + + if ( iStatus.Int() == KErrNone ) + { + // VPN NET id is not needed in reporting internal address change. + TConnectionInfo connectionInfo( iVpnIapId, 0 ); + TConnectionInfoBuf pckgConnectionInfo( connectionInfo ); + + TVPNAddressPckg pckgVpnAddress( iInternalAddress ); + TInt err = iEventMediator.ReportEvent( EKmdAddressChangeEvent, + pckgConnectionInfo, + pckgVpnAddress ); + err = err; + +#ifdef _DEBUG + TBuf<80> txt_addr; + iInternalAddress.iVPNIfAddr.OutputWithScope(txt_addr); + DEBUG_LOG3(_L("Internal address changed to %S, VPN IAP id=%d, err=%d"), + &txt_addr, iVpnIapId, err ); +#endif + + StartObserving(); + } + } + +// --------------------------------------------------------------------------- +// From class CActive +// Handles cancellation of asynchronous notification request. +// --------------------------------------------------------------------------- +// +void CIaChangeObserver::DoCancel() + { + iIkePluginSession.CancelNotifyInternalAddressChanged(); + } +