diff -r 000000000000 -r 33413c0669b9 vpnengine/kmdserver/src/kmdeventlogger.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vpnengine/kmdserver/src/kmdeventlogger.cpp Thu Dec 17 09:14:51 2009 +0200 @@ -0,0 +1,305 @@ +/* +* 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: KMD event logger +* +*/ + + +#include +#include +#include "eventviewer.h" +#include "ikedebug.h" +#include "vpnclientuids.h" + +// CLASS HEADER +#include "kmdeventlogger.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CKmdEventLogger* CKmdEventLogger::NewL( MIkeDebug& aDebug ) + { + CKmdEventLogger* self = new ( ELeave ) CKmdEventLogger( aDebug ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Destructor. +// --------------------------------------------------------------------------- +// +CKmdEventLogger::~CKmdEventLogger() + { + iEventMediator.Close(); + } + +// --------------------------------------------------------------------------- +// Constructor. +// --------------------------------------------------------------------------- +// +CKmdEventLogger::CKmdEventLogger( MIkeDebug& aDebug ) + : iDebug( aDebug ) + { + } + +// --------------------------------------------------------------------------- +// Second phase construction. +// --------------------------------------------------------------------------- +// +void CKmdEventLogger::ConstructL() + { + User::LeaveIfError( iEventMediator.Connect() ); + } + +// --------------------------------------------------------------------------- +// From class MKmdEventLoggerIf +// Writes event to event log. +// --------------------------------------------------------------------------- +// +void CKmdEventLogger::LogEvent( TLogCategory aCategory, + TInt aMsgId, + TInt aStatus, + TUint32 aVpnIapId, + const TInetAddr* aGwIp, + const TInetAddr* aLocalAddr ) + { + TUid uid = TUid::Uid( KUidKmdServer ); + + TBuf<40> ipAddr16; + TBuf8<40> ipAddr; + TBuf8<40> localIpAddr; + TIapName vpnAccessPointName; + TInt addrIndex = KErrNotFound; + TInt iapIndex = KErrNotFound; + TInt statusIndex = KErrNotFound; + TInt realIpIndex = KErrNotFound; + TInt desCount = 0; + TUint8* pointers[4]; + TInt lengths[4]; + + switch ( aMsgId ) + { + case R_VPN_MSG_VPN_GW_NO_RESP: + case R_VPN_MSG_VPN_GW_AUTH_FAIL: + case R_VPN_MSG_VPN_GW_AUTH_OK: + addrIndex = 0; + iapIndex = 1; + break; + + case R_VPN_MSG_VPN_GW_ERR_RESP_RECEIVED: + case R_VPN_MSG_SENT_ERROR_RESPONSE: + addrIndex = 0; + iapIndex = 1; + statusIndex = 2; + break; + + case R_VPN_MSG_DATA_DROPPED_DUE_POLICY: + addrIndex = 0; + statusIndex = 1; + break; + + case R_VPN_MSG_ADDR_INFO_FOR_VPN_AP: + iapIndex = 0; + addrIndex = 1; + realIpIndex = 2; + statusIndex = 3; + break; + + case R_VPN_MSG_REAL_IAP_ACT_FAILED: + realIpIndex = 0; + iapIndex = 1; + statusIndex = 2; + break; + + default: + break; + } + + if ( addrIndex != KErrNotFound ) + { + desCount ++; + pointers[addrIndex] = (TUint8*)ipAddr.Ptr(); + if ( aGwIp ) + { + aGwIp->Output(ipAddr16); + ipAddr.Copy(ipAddr16); + lengths[addrIndex] = ipAddr.Length(); + } + else + { + lengths[addrIndex] = 0; + } + } + + if ( statusIndex != KErrNotFound ) + { + desCount ++; + pointers[statusIndex] = (TUint8*)&aStatus; + lengths[statusIndex] = sizeof(aStatus); + } + + if ( iapIndex != KErrNotFound ) + { + // + // VPN IAP id shall be converted to VPN access point name using + // eventviewer API. + // + desCount ++; + pointers[iapIndex] = (TUint8*)vpnAccessPointName.Ptr(); + if ( aVpnIapId != 0 ) + { + EventViewer::GetIapName(aVpnIapId, vpnAccessPointName); + lengths[iapIndex] = vpnAccessPointName.Length(); + } + else + { + lengths[iapIndex] = 0; + } + } + + if ( realIpIndex != KErrNotFound ) + { + desCount ++; + pointers[realIpIndex] = (TUint8*)localIpAddr.Ptr(); + ipAddr16.SetLength(0); + if ( aLocalAddr != NULL ) + { + aLocalAddr->Output(ipAddr16); + } + localIpAddr.Copy(ipAddr16); + lengths[realIpIndex] = localIpAddr.Length(); + } + + TInt ret( KErrNone ); + + switch ( desCount ) + { + case 0: + { + ret = iEventMediator.ReportLogEvent( uid, + aCategory, + aMsgId, + 0 ); + } + break; + + case 1: + { + TPtr8 parm1(pointers[0], lengths[0], lengths[0]); + ret = iEventMediator.ReportLogEvent( uid, + aCategory, + aMsgId, + 1, + &parm1 ); + } + break; + + case 2: + { + TPtr8 parm1(pointers[0], lengths[0], lengths[0]); + TPtr8 parm2(pointers[1], lengths[1], lengths[1]); + ret = iEventMediator.ReportLogEvent( uid, + aCategory, + aMsgId, + 2, + &parm1, + &parm2 ); + } + break; + + case 3: + { + TPtr8 parm1(pointers[0], lengths[0], lengths[0]); + TPtr8 parm2(pointers[1], lengths[1], lengths[1]); + TPtr8 parm3(pointers[2], lengths[2], lengths[2]); + ret = iEventMediator.ReportLogEvent( uid, + aCategory, + aMsgId, + 3, + &parm1, + &parm2, + &parm3 ); + } + break; + + case 4: + { + TPtr8 parm1(pointers[0], lengths[0], lengths[0]); + TPtr8 parm2(pointers[1], lengths[1], lengths[1]); + TPtr8 parm3(pointers[2], lengths[2], lengths[2]); + TPtr8 parm4(pointers[3], lengths[3], lengths[3]); + ret = iEventMediator.ReportLogEvent( uid, + aCategory, + aMsgId, + 4, + &parm1, + &parm2, + &parm3, + &parm4 ); + } + break; + + default: + ret = ret; + break; + + } + + DEBUG_LOG3( _L("Logging event %x with %d parameters, report status = %d"), + aMsgId, desCount, ret ); + + } + +// --------------------------------------------------------------------------- +// From class MKmdEventLoggerIf +// Writes event to event log. +// --------------------------------------------------------------------------- +// +void CKmdEventLogger::LogEvent( TKmdLogCategory aCategory, + TInt aMsgId, + TInt aStatus, + TUint32 aVpnIapId, + const TInetAddr* aGwIp, + const TInetAddr* aLocalAddr ) + { + TLogCategory logCategory; + switch ( aCategory ) + { + case KLogInfo: + logCategory = EInfo; + break; + case KLogWarning: + logCategory = EWarning; + break; + case KLogError: + logCategory = EError; + break; + default: + logCategory = EDebug; + break; + } + + LogEvent( logCategory, + aMsgId, + aStatus, + aVpnIapId, + aGwIp, + aLocalAddr ); + } +