webservices/wslogger/src/senlogger.cpp
changeset 0 62f9d29f7211
child 20 32ab7ae9ec94
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webservices/wslogger/src/senlogger.cpp	Thu Jan 07 16:19:19 2010 +0200
@@ -0,0 +1,488 @@
+/*
+* Copyright (c) 2002-2005 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:          
+*
+*/
+
+
+
+
+
+
+
+
+
+
+#include "senlogger.h"
+//#include <flogger.h>
+#include <f32file.h>
+#include <s32file.h> 
+#include <versit.h>
+
+namespace
+    {
+    const TInt KColumnWidth = 100; // used in WriteAll() methods.
+     _LIT(KPath,"C:\\SenLogConfig.txt");
+     _LIT(  KClientIdFmt,  "- Client[%d] %S");
+     
+     _LIT(  KClientIdFmtNextLine,  "Client(%d):");
+     
+     _LIT8( KClientIdFmt8, "- Client[%d] %S");
+     _LIT8( KClientIdFmtNextLine8, "Client(%d):");
+    }
+
+EXPORT_C TInt CSenLogger::CreateL(TInt aChannel, TInt aLevel, const TDesC& aLogDir, const TDesC& aLogFileName)
+     {
+	 return CreateL( aChannel, aLevel, aLogDir, aLogFileName, EFileLoggingModeOverwrite );
+     }
+EXPORT_C TInt CSenLogger::CreateL(TInt aChannel, TInt aLevel, const TDesC& aLogDir, const TDesC& aLogFileName, TFileLoggingMode aMode)
+    {
+    TInt index(KErrNotFound);
+    //	  CSenLogger* pSenLogger = (CSenLogger*)Dll::Tls();
+    CSenLogger* pSenLogger = NULL;
+    TWsTls* tls = (TWsTls*)Dll::Tls();
+    if( !tls )
+        {
+        tls = new (ELeave) TWsTls();
+        tls->iLogger = NULL;
+        tls->iProxy = NULL;
+        Dll::SetTls( tls );
+        }
+    pSenLogger = tls->iLogger;    
+	if ( !pSenLogger )
+  		{
+  		pSenLogger = new (ELeave) CSenLogger();
+        if ( pSenLogger )
+            {
+            //      		  Dll::SetTls(pSenLogger);
+            tls->iLogger = pSenLogger;
+      		pSenLogger->iCount = 0;
+      		//reading the configuration file for the logging levels!!!
+      		
+      		/*the file has the  following format
+      		* ==============================================================================
+      		  * LogChannel LogLevel
+      		    1000 0
+      		    2000 1
+      		      .
+      		      .
+      		      .
+      		      .
+      		      .
+      		      ....
+      		    18000 2
+      		   this means first you need to write the channel followed by the corresponding logging level after a space
+      		 
+      		 the file has to be located under C:\Config.txt
+      		 * ==============================================================================*/
+      		 
+      
+      		TInt res;
+      	    RFs fs;
+      	    res=fs.Connect();
+      	      if(res==KErrNone)
+				{
+      	     
+                RFileReadStream readStream;
+      	        res=readStream.Open(fs,KPath,EFileRead|EFileStreamText);
+      	   		if(res==KErrNone)
+      	     		{
+      	      		TInt error;
+      	      		TBool result;
+      	      		TInt retVal;
+      	      		
+      	      		CLineReader *readLine = CLineReader::NewL(readStream);
+                    CleanupStack::PushL(readLine);
+      	    		
+                	do
+      	    		    {
+      	      		    result=readLine->ReadLineL(0,error);
+      	      		    
+      	       	        if(result==CLineReader::ELineHasContent)
+      	       			    {
+      	       			    
+              	      		TInt *key = new (ELeave) TInt;
+              	      	
+          	      		
+      	       			    TLex8 lexBuf(readLine->iBufPtr);
+      	     			    retVal = lexBuf.Val(*key);
+      	     			    
+      	     			    if(retVal!=0)
+      	     			        {
+      	     			        delete key;
+                             
+      	     			        continue;
+      	     			        }
+      	     			    else
+      	     			        {
+                  	      		TInt *value = new (ELeave) TInt;
+                  	      
+      	      		
+  	     			            lexBuf.SkipSpace();
+  	     			            retVal=lexBuf.Val(*value);
+  	     			            if(retVal==0)
+	  	     			            {
+  	     			    	        retVal = pSenLogger->iMap.Append(key,value);
+  	     			    	        if(retVal != KErrNone)
+  	     			    	            {
+  	     			    	            delete key;
+  	     			    	            delete value;
+      	    		                   
+  	     			    	            }
+  	     			    	   
+  		     			            }
+  		     			         else
+  		     			            {
+  		     			              delete key;
+  	     			    	          delete value;
+  		     			                
+  		     			            }
+      	     			    	
+      	     			        }
+      	       			    }
+      	       			 
+      	    		    }while(error!=KErrEof);
+      	    		 
+      	    		 CleanupStack::PopAndDestroy(readLine);
+      	      	     readStream.Close();
+      	     		}
+      	     
+      	      	fs.Close();
+      	      	}
+            }
+        else
+            {
+            return KErrGeneral;
+            }
+  		}
+  	else
+  	    {
+  	    index = pSenLogger->ChannelIndex(aChannel);
+  	    }	
+  	
+  	if (index == KErrNotFound)
+  	    {
+  	    TInt channelIndex;
+        TLog* pTLog = new (ELeave) TLog;
+        CleanupStack::PushL(pTLog);
+        pTLog->iChannel=aChannel;
+        channelIndex=pSenLogger->iMap.Find(aChannel);
+        if(channelIndex==KErrNotFound)
+        {
+        pTLog->iLevel=aLevel;
+        }
+        else
+        {
+        pTLog->iLevel=*(pSenLogger->iMap.ValueAt(channelIndex));
+        }
+        pTLog->iCount=1;
+        pTLog->iLog.Connect();
+        pTLog->iLog.CreateLog(aLogDir, aLogFileName, aMode);
+        pTLog->iLog.Write(_L("SenTLSLogger - Log file opened"));
+#ifdef EKA
+        pSenLogger->iLogs.AppendL(pTLog);
+#else
+        User::LeaveIfError(pSenLogger->iLogs.Append(pTLog));
+	  
+#endif
+        CleanupStack::Pop(pTLog);
+  	    }
+  	else
+  	    {
+  	    pSenLogger->iLogs[index]->iCount++;
+  	    }
+  	pSenLogger->iCount++;
+    
+    return KErrNone;
+    }
+
+EXPORT_C void CSenLogger::Destroy(TInt aChannel)
+    {
+    //	CSenLogger* pSenLogger = (CSenLogger*)Dll::Tls();
+    CSenLogger* pSenLogger = NULL;
+    TWsTls* tls = (TWsTls*)Dll::Tls();
+    if( tls )
+        {
+        pSenLogger = tls->iLogger;
+        }
+	if ( pSenLogger )
+	    {
+	    
+	    TInt index = pSenLogger->ChannelIndex(aChannel);
+	    if (index != KErrNotFound)
+	        {
+	        pSenLogger->iLogs[index]->iCount--;
+	        if (pSenLogger->iLogs[index]->iCount <= 0)
+	            {
+                pSenLogger->iLogs[index]->iLog.Write(_L("SenTLSLogger - Log file closed."));
+                pSenLogger->iLogs[index]->iLog.CloseLog();
+                pSenLogger->iLogs[index]->iLog.Close();
+                delete pSenLogger->iLogs[index];
+                pSenLogger->iLogs.Remove(index);
+	            }
+            }
+	        pSenLogger->iCount--;
+	        if (pSenLogger->iCount <= 0)
+	            {
+	            pSenLogger->iLogs.Close();
+	            delete pSenLogger;
+            tls->iLogger = NULL;
+            if( !tls->iLogger && !tls->iProxy )
+                {
+	            delete tls;
+                Dll::FreeTls();	            
+	            }
+	        }
+	    }
+    }
+
+// 16-bit variants    
+    
+EXPORT_C void CSenLogger::Write(TInt aChannel, TInt aLevel, const TDesC16& aText)
+    {
+    RFileLogger* pLogger = Logger(aChannel, aLevel);
+    if ( pLogger )
+        {
+        pLogger->Write(aText);
+        }
+    }
+
+EXPORT_C void CSenLogger::WriteAll(TInt aChannel, TInt aLevel, const TDesC16& aText)
+    {
+    RFileLogger* pLogger = Logger(aChannel, aLevel);
+    if ( pLogger )
+        {
+        TInt i = 0;
+        TInt lineAmount(KColumnWidth);
+        TInt length = aText.Length();
+        while(i<aText.Length())
+            {
+            if ( length - i < KColumnWidth )
+                {
+                lineAmount = length - i;    
+                }
+            pLogger->Write(aText.Mid(i, lineAmount));
+            i += KColumnWidth;
+            }
+        }
+    }
+
+EXPORT_C void CSenLogger::WriteFormat(TInt aChannel, TInt aLevel, TRefByValue<const TDesC16> aFmt,...)
+    {
+    RFileLogger* pLogger = Logger(aChannel, aLevel);
+    if (pLogger)
+        {
+        VA_LIST list;
+        VA_START(list,aFmt);
+        pLogger->WriteFormat(aFmt, list);
+        }    
+    }
+    
+EXPORT_C void CSenLogger::WriteFormat(TInt aChannel, TInt aLevel, TRefByValue<const TDesC16> aFmt, VA_LIST& aList)
+    {
+    RFileLogger* pLogger = Logger(aChannel, aLevel);
+    if (pLogger)
+        {
+        pLogger->WriteFormat(aFmt, aList);
+        }    
+    }
+
+
+// Client ID spesific logging methods    
+EXPORT_C void CSenLogger::WriteWithClientId(TInt aClientId, TInt aChannel, TInt aLevel, const TDesC16& aText)
+    {
+    WriteFormat( aChannel, aLevel, KClientIdFmt, aClientId, &aText );
+    }
+
+EXPORT_C void CSenLogger::WriteAllWithClientId(TInt aClientId, TInt aChannel, TInt aLevel, const TDesC16& aText)
+    {
+    // Write client id on separate line, for clarity & simplicity
+    WriteFormat( aChannel, aLevel, KClientIdFmtNextLine, aClientId);
+    WriteAll( aChannel, aLevel, aText );
+    }
+
+EXPORT_C void CSenLogger::WriteFormatWithClientId(TInt aClientId, TInt aChannel, TInt aLevel, TRefByValue<const TDesC16> aFmt, ...)
+    {
+    // Write client id on separate line, for clarity & simplicity
+    WriteFormat( aChannel, aLevel, KClientIdFmtNextLine, aClientId);
+    VA_LIST list;
+    VA_START(list,aFmt);
+    WriteFormat( aChannel, aLevel, aFmt, list);
+    }
+    
+EXPORT_C void CSenLogger::WriteFormatWithClientId(TInt aClientId, TInt aChannel, TInt aLevel, TRefByValue<const TDesC16> aFmt, VA_LIST& aList)
+    {
+    WriteFormat( aChannel, aLevel, KClientIdFmtNextLine, aClientId);
+    WriteFormat( aChannel, aLevel, aFmt, aList);
+    }
+
+EXPORT_C void CSenLogger::WriteFormatWithClientIdToMainLogs(TInt aClientId, TInt aLevel, TRefByValue<const TDesC16> aFmt,...)
+    {
+    VA_LIST list;
+    VA_START(list,aFmt);
+    WriteFormatWithClientId( aClientId, KSenClientSessionLogChannelBase+aClientId, aLevel, aFmt, list );
+    WriteFormatWithClientId( aClientId, KSenCoreServiceManagerLogChannelBase, aLevel, aFmt, list );
+    }
+
+EXPORT_C void CSenLogger::WriteFormatWithClientIdToMainLogs(TInt aClientId, TInt aLevel, TRefByValue<const TDesC16> aFmt, VA_LIST& aList)
+    {
+    WriteFormatWithClientId( aClientId, KSenClientSessionLogChannelBase+aClientId, aLevel, aFmt, aList );
+    WriteFormatWithClientId( aClientId, KSenCoreServiceManagerLogChannelBase, aLevel, aFmt, aList );
+    }
+    
+// 8-bit variants    
+
+EXPORT_C void CSenLogger::Write(TInt aChannel, TInt aLevel, const TDesC8& aText)
+    {
+    RFileLogger* pLogger = Logger(aChannel, aLevel);
+    if (pLogger)
+        {
+        pLogger->Write(aText);
+        }
+    }
+
+EXPORT_C void CSenLogger::WriteAll(TInt aChannel, TInt aLevel, const TDesC8& aText)
+    {
+    RFileLogger* pLogger = Logger(aChannel, aLevel);
+    if ( pLogger )
+        {
+        TInt i = 0;
+        TInt lineAmount(KColumnWidth);
+        TInt length = aText.Length();
+        while(i<aText.Length())
+            {
+            if ( length - i < KColumnWidth )
+                {
+                lineAmount = length - i;    
+                }
+            pLogger->Write(aText.Mid(i, lineAmount));
+            i += KColumnWidth;
+            }
+        }
+    }
+
+
+EXPORT_C void CSenLogger::WriteFormat(TInt aChannel, TInt aLevel, TRefByValue<const TDesC8> aFmt,...)
+    {
+    RFileLogger* pLogger = Logger(aChannel, aLevel);
+    if (pLogger)
+        {
+        VA_LIST list;
+        VA_START(list,aFmt);
+        pLogger->WriteFormat(aFmt, list);
+        }    
+    }
+
+EXPORT_C void CSenLogger::WriteFormat(TInt aChannel, TInt aLevel, TRefByValue<const TDesC8> aFmt, VA_LIST& aList)
+    {
+    RFileLogger* pLogger = Logger(aChannel, aLevel);
+    if (pLogger)
+        {
+        pLogger->WriteFormat(aFmt, aList);
+        }    
+    }
+
+EXPORT_C void CSenLogger::WriteWithClientId(TInt aClientId, TInt aChannel, TInt aLevel, const TDesC8& aText)
+    {
+    WriteFormat( aChannel, aLevel, KClientIdFmt8, aClientId, &aText );    	
+    }
+
+EXPORT_C void CSenLogger::WriteAllWithClientId(TInt aClientId, TInt aChannel, TInt aLevel, const TDesC8& aText)
+    {
+    // Write client id on separate line, for clarity & simplicity
+    WriteFormat( aChannel, aLevel, KClientIdFmtNextLine8, aClientId);
+    WriteAll( aChannel, aLevel, aText );
+    }
+
+EXPORT_C void CSenLogger::WriteFormatWithClientId(TInt aClientId, TInt aChannel, TInt aLevel, TRefByValue<const TDesC8> aFmt,...)
+    {
+    // Write client id on separate line, for clarity & simplicity
+    WriteFormat( aChannel, aLevel, KClientIdFmtNextLine8, aClientId);
+    VA_LIST list;
+    VA_START(list,aFmt);
+    WriteFormat( aChannel, aLevel, aFmt, list);
+    }
+    
+EXPORT_C void CSenLogger::WriteFormatWithClientId(TInt aClientId, TInt aChannel, TInt aLevel, TRefByValue<const TDesC8> aFmt, VA_LIST& aList)
+    {
+    WriteFormat( aChannel, aLevel, KClientIdFmtNextLine8, aClientId);
+    WriteFormat( aChannel, aLevel, aFmt, aList);
+    }
+
+EXPORT_C void CSenLogger::WriteFormatWithClientIdToMainLogs(TInt aClientId, TInt aLevel, TRefByValue<const TDesC8> aFmt, ...)
+    {
+    VA_LIST list;
+    VA_START(list,aFmt);
+    WriteFormatWithClientId( aClientId, KSenClientSessionLogChannelBase+aClientId, aLevel, aFmt, list );
+    WriteFormatWithClientId( aClientId, KSenCoreServiceManagerLogChannelBase, aLevel, aFmt, list );
+    }
+
+EXPORT_C void CSenLogger::WriteFormatWithClientIdToMainLogs(TInt aClientId, TInt aLevel, TRefByValue<const TDesC8> aFmt, VA_LIST& aList)
+    {
+    WriteFormatWithClientId( aClientId, KSenClientSessionLogChannelBase+aClientId, aLevel, aFmt, aList );
+    WriteFormatWithClientId( aClientId, KSenCoreServiceManagerLogChannelBase, aLevel, aFmt, aList );
+    }
+
+
+RFileLogger* CSenLogger::Logger(TInt aChannel, TInt aLevel)
+    {
+//    CSenLogger* pSenLogger = (CSenLogger*)Dll::Tls();
+    CSenLogger* pSenLogger = NULL;
+    TWsTls* tls = (TWsTls*)Dll::Tls();
+    if( tls )
+        {
+        pSenLogger = tls->iLogger;
+        }
+	if ( pSenLogger )
+	    {
+        TInt index = pSenLogger->ChannelIndex(aChannel);
+        if (index != KErrNotFound)
+            {
+            if (pSenLogger->iLogs[index]->iLevel >= aLevel)
+                {
+                return &pSenLogger->iLogs[index]->iLog;
+                }
+            }
+	    }
+	return NULL;
+    }
+
+TInt CSenLogger::ChannelIndex(TInt aChannel) const
+    {
+    TInt index(KErrNotFound);
+    TInt count=iLogs.Count();
+    for (TInt i=0; i<count; i++)      	    
+        {
+        if (iLogs[i]->iChannel == aChannel)
+            {
+            index = i;
+            break;
+            }
+        }
+    return index;    
+    }
+
+EXPORT_C CSenLogger::CSenLogger()
+    : iCount(0),iMap(1,1)
+    {
+    }
+
+CSenLogger::~CSenLogger()
+    {
+   
+    iMap.Reset();
+    }
+
+// END OF FILE
+