vpnengine/kmdserver/src/kmdeventlogger.cpp
changeset 0 33413c0669b9
--- /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 <e32base.h>
+#include <vpnlogmessages.rsg>
+#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 );
+    }
+