--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/TransferAdapter2/Src/PEngPacketLogger.h Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,447 @@
+/*
+* Copyright (c) 2003 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: this class writes the given data fragemnt to xml file.
+*
+*/
+
+#ifndef __PENGPACKETLOGGER_H__
+#define __PENGPACKETLOGGER_H__
+
+// INCLUDES
+#include "PresenceDebugPrint.h"
+#include <F32File.h>
+
+
+// CONSTS
+_LIT( KLogsFolder, "C:\\logs\\peng\\" ); // CSI: 25 #
+_LIT( KLogsOut, "_Out_" );
+_LIT( KLogsIn, "_In_" );
+_LIT( KLogsNotify, "_Notf_" );
+_LIT( KLogsSuffix, ".xml" );
+_LIT( KUnderLine, "_" );
+_LIT( KNotifFileName, "_Notf_*.xml" );
+_LIT( KAllFilesMask, "*.*" );
+
+// for logging
+_LIT8( KLog_WVEngineError, "<WVEngineErrorCode>%d</WVEngineErrorCode>" );
+_LIT8( KLog_PecOpCode, "<PEC><OpCode>%d</OpCode>" );
+_LIT8( KLog_WVEngOpCode, "<WVEngineOpCode>%d</WVEngineOpCode>" );
+_LIT8( KLog_ConnectionId, "<ConnectionId>%d</ConnectionId>" );
+_LIT8( KLog_TransTime, "<TransactionTime>%d:%d:%d:%d</TransactionTime>" );
+_LIT8( KLog_Tag_UserName, "<UserName>" );
+_LIT8( KLog_Tag_End_UserName, "</UserName>" );
+_LIT8( KLog_Tag_ServAddress, "<ServerAddress>" );
+_LIT8( KLog_Tag_End_ServAddress, "</ServerAddress>" );
+_LIT8( KLog_Tag_End_Pec, "</PEC>" );
+
+
+const TInt KConnIdLength = 2;
+const TInt KOpIdLength = 4;
+const TInt KNotifyIdLength = 3;
+const TInt KErrorCodeLength = 60;
+const TInt KLogsFileNameLength = 50;
+
+
+// CLASS DECLARATION
+/**
+ * Writes the given data fragemnt to xml file.
+ *
+ * @lib PEngTraAdap.lib
+ * @since 2.1
+ */
+class PEngPacketLogger
+ {
+ public: // Logging functions
+
+ /**
+ * Writes a send packet.
+ *
+ * @param aData The buffer.
+ * @param aOpCode The Operation id.
+ *
+ * @since 3.0
+ * @return returns connection id, if it was gained again
+ */
+ inline static TInt WriteOutPacket( const TDesC8& aData,
+ TInt aOpCode,
+ TInt aWVEngOpCode,
+ TInt aConnectionId,
+ const TDesC& aUserName,
+ const TDesC& aUrl )
+ {
+ return DoWrite( aData,
+ aOpCode,
+ aWVEngOpCode,
+ KLogsOut,
+ aConnectionId,
+ aUserName,
+ aUrl );
+ }
+
+
+ /**
+ * Writes a received packet.
+ *
+ * @param aData The buffer.
+ * @param aOpCode The Operation id.
+ *
+ * @since 3.0
+ */
+ inline static TInt WriteInPacket( const TDesC8& aData,
+ TInt aOpCode,
+ TInt aWVEngOpCode,
+ TInt aConnectionId,
+ const TDesC& aUserName,
+ const TDesC& aUrl )
+ {
+ return DoWrite( aData,
+ aOpCode,
+ aWVEngOpCode,
+ KLogsIn,
+ aConnectionId,
+ aUserName,
+ aUrl );
+ }
+
+
+ /**
+ * Writes a notification packet.
+ *
+ * @param aData The buffer.
+ * @param aOpCode The Operation id.
+ *
+ * @since 3.0
+ */
+ inline static TInt WriteNotifyPacket( const TDesC8& aData,
+ TInt aOpCode,
+ TInt aConnectionId,
+ const TDesC& aUserName,
+ const TDesC& aUrl )
+ {
+ return DoWriteNotification( aData,
+ aOpCode,
+ KLogsNotify,
+ aConnectionId,
+ aUserName,
+ aUrl );
+ }
+
+ inline static TInt WriteError( TInt aErrorCode,
+ TInt aOpCode,
+ TInt aWVEngOpCode,
+ TInt aConnectionId,
+ const TDesC& aUserName,
+ const TDesC& aUrl )
+ {
+ TBuf8<KErrorCodeLength> buf;
+ buf.Format( KLog_WVEngineError, aErrorCode );
+ return DoWrite( buf,
+ aOpCode,
+ aWVEngOpCode,
+ KLogsIn,
+ aConnectionId,
+ aUserName,
+ aUrl );
+ }
+
+ /**
+ * Get connection id
+ *
+ * @since 3.0
+ * @return connection id
+ */
+ inline static TInt GetConnectionId()
+ {
+ return ResolveConnectionId();
+ }
+
+ private: // Implementation
+
+ /**
+ *
+ */
+ inline static TInt ConnectFs( RFs& aFs )
+ {
+ if ( aFs.Connect() != KErrNone )
+ {
+ return KErrNotFound;
+ }
+
+ TEntry entry;
+ if ( aFs.Entry( KLogsFolder, entry ) != KErrNone )
+ {
+ //directory doesn't exist
+ aFs.Close();
+ return KErrNotFound;
+ }
+ return KErrNone;
+ }
+
+ /**
+ *
+ */
+ inline static void AppendNum( TDes& aDes, TInt aValue, TInt aDigits )
+ {
+ TInt marker( aValue );
+ TBuf<5> value;
+ for ( TInt x( 0 ) ; x < aDigits ; ++x )
+ {
+ TBuf<1> oneDig;
+ TInt numVal( marker % 10 );
+ marker /= 10;
+ oneDig.Num( numVal );
+ value.Insert( 0, oneDig );
+ }
+ aDes.Append( value );
+ }
+
+ inline static TInt WriteToFile(
+ RFs& aFs,
+ const TDesC& aFileName,
+ const TDesC8& aData,
+ TInt aOpCode,
+ TInt aWVEngOpCode,
+ TInt aConnectionId,
+ const TDesC& aUserName,
+ const TDesC& aUrl )
+ {
+ PENG_DP( D_PENG_LIT( "PEC:TransAdap Log File: " ), &aFileName );
+ RFile f;
+ if ( f.Create( aFs, aFileName, EFileWrite ) != KErrNone )
+ {
+ return aConnectionId;
+ }
+ TBuf8<0x300> buf;
+ buf.Format( KLog_PecOpCode, aOpCode );
+ buf.AppendFormat( KLog_WVEngOpCode, aWVEngOpCode );
+ buf.AppendFormat( KLog_ConnectionId, aConnectionId );
+ // write time
+ TTime time;
+ time.HomeTime();
+ TDateTime dayTime( time.DateTime() );
+ buf.AppendFormat( KLog_TransTime,
+ dayTime.Hour(),
+ dayTime.Minute(),
+ dayTime.Second(),
+ dayTime.MicroSecond() );
+ buf.Append( KLog_Tag_UserName );
+ buf.Append( aUserName );
+ buf.Append( KLog_Tag_End_UserName );
+ buf.Append( KLog_Tag_ServAddress );
+ buf.Append( aUrl );
+ buf.Append( KLog_Tag_End_ServAddress );
+
+ f.Write( buf );
+ f.Write( aData );
+ buf.Copy( KLog_Tag_End_Pec );
+ f.Write( buf );
+ f.Close();
+ return aConnectionId;
+ }
+ /**
+ * Writes packet.
+ * @since 3.0
+ */
+ inline static TInt DoWrite( const TDesC8& aData,
+ TInt aOpCode,
+ TInt aWVEngOpCode,
+ const TDesC& aFileNameBase,
+ TInt aConnectionId,
+ const TDesC& aUserName,
+ const TDesC& aUrl )
+ {
+ RFs fs;
+ TInt err( ConnectFs( fs ) );
+ if ( err != KErrNone )
+ {
+ return err;
+ }
+
+ //locate free file name
+ TInt connectionId( aConnectionId );
+ if ( connectionId == KErrNotFound )
+ {
+ connectionId = ResolveConnectionId();
+ }
+ if ( connectionId < 0 )
+ {
+ return connectionId;
+ }
+
+ // test file name freelance
+ TBuf<KLogsFileNameLength> fileName;
+ fileName.Copy( KLogsFolder );
+ AppendNum( fileName, connectionId, KConnIdLength );
+ fileName.Append( aFileNameBase );
+ AppendNum( fileName, aOpCode, KOpIdLength );
+ fileName.Append( KLogsSuffix );
+ TEntry entry;
+ if ( fs.Entry( fileName, entry ) == KErrNone )
+ {
+ fs.Delete( fileName );
+ }
+ err = WriteToFile( fs,
+ fileName,
+ aData,
+ aOpCode,
+ aWVEngOpCode,
+ connectionId,
+ aUserName,
+ aUrl );
+ fs.Close();
+ return err;
+ }
+
+ /**
+ * Writes packet.
+ * @since 3.0
+ */
+ inline static TInt DoWriteNotification( const TDesC8& aData,
+ TInt aOpCode,
+ const TDesC& aFileNameBase,
+ TInt aConnectionId,
+ const TDesC& aUserName,
+ const TDesC& aUrl )
+ {
+ RFs fs;
+ TInt err( ConnectFs( fs ) );
+ if ( err != KErrNone )
+ {
+ return err;
+ }
+
+ //locate free file name
+ TInt connectionId( aConnectionId );
+ if ( connectionId == KErrNotFound )
+ {
+ connectionId = ResolveConnectionId();
+ }
+ if ( connectionId < 0 )
+ {
+ return connectionId;
+ }
+
+ //locate free file name
+ CDir* dirList = NULL;
+ TBuf<15> wildCard;
+ AppendNum( wildCard, connectionId, KConnIdLength );
+ wildCard.Append( KNotifFileName );
+ TInt counter( 0 );
+ TFindFile ff( fs );
+ if ( ff.FindWildByDir( wildCard, KLogsFolder, dirList ) == KErrNone )
+ {
+ TInt count( dirList->Count() );
+ for ( TInt x ( 0 ) ; x < count ; ++x )
+ {
+ if ( ( *dirList )[x].IsDir() )
+ {
+ continue;
+ }
+ TLex check;
+ check.Assign( ( *dirList )[x].iName.Mid( 8, 3 ) );
+ TInt foundCount( KErrNotFound );
+ if ( ( KErrNone == check.Val( foundCount ) ) && ( foundCount >= counter ) )
+ {
+ counter = foundCount + 1;
+ }
+ }
+ }
+ delete dirList;
+
+ TBuf<KLogsFileNameLength> fileName;
+ fileName.Append( KLogsFolder );
+ AppendNum( fileName, connectionId, KConnIdLength );
+ fileName.Append( aFileNameBase );
+ AppendNum( fileName, counter, KNotifyIdLength );
+ fileName.Append( KUnderLine );
+ AppendNum( fileName, aOpCode, KOpIdLength );
+ fileName.Append( KLogsSuffix );
+
+ err = WriteToFile( fs,
+ fileName,
+ aData,
+ 0,
+ 0,
+ connectionId,
+ aUserName,
+ aUrl );
+ fs.Close();
+ return err;
+ }
+
+ inline static TInt ResolveConnectionId()
+ {
+ RFs fs;
+ TInt err( ConnectFs( fs ) );
+ if ( err != KErrNone )
+ {
+ return err;
+ }
+
+ //locate free connection Id
+ TFindFile ff( fs );
+ CDir* dirList = NULL;
+ TInt connectionId( 0 );
+ if ( ff.FindWildByDir( KAllFilesMask, KLogsFolder, dirList ) == KErrNone )
+ {
+ TInt count( dirList->Count() );
+ for ( TInt x ( 0 ) ; x < count ; ++x )
+ {
+ if ( ( *dirList )[x].IsDir() )
+ {
+ continue;
+ }
+ TLex check;
+ TInt foundId( KErrNotFound );
+ TPtrC fileName( ( *dirList )[x].iName );
+ if (
+ (
+ ( KErrNotFound != fileName.FindF( KLogsIn ) )
+ &&
+ ( ( *dirList )[x].iName.Length() > 6 )
+ )
+ ||
+ (
+ ( KErrNotFound != fileName.FindF( KLogsOut ) )
+ &&
+ ( ( *dirList )[x].iName.Length() > 7 )
+ )
+ ||
+ (
+ ( KErrNotFound != fileName.FindF( KLogsNotify ) )
+ &&
+ ( ( *dirList )[x].iName.Length() > 10 )
+ )
+ )
+ {
+ check.Assign( fileName.Left( 2 ) );
+ check.Val( foundId );
+ }
+ if ( foundId >= connectionId )
+ {
+ connectionId = foundId + 1;
+ }
+ }
+ fs.Close();
+ delete dirList;
+ return connectionId;
+ }
+ fs.Close();
+ delete dirList;
+ return connectionId;
+ }
+ };
+#endif // __PENGPACKETLOGGER_H__
+
+