internetradio2.0/sessionlogsrc/irsessionlogger.cpp
changeset 0 09774dfdd46b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/internetradio2.0/sessionlogsrc/irsessionlogger.cpp	Mon Apr 19 14:01:53 2010 +0300
@@ -0,0 +1,1224 @@
+/*
+* Copyright (c) 2006-2007 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:  ?Description
+*
+*/
+
+
+#include <coemain.h>
+#include <ezgzip.h>
+#include <sysutil.h>
+#include <utf.h>
+#include <etel3rdparty.h>
+#include <imcvcodc.h>
+#include "irdebug.h"
+#include "irreportsettings.h"
+#include "irsessiondb.h"
+#include "irsessionlogger.h"
+#include "irsessionloggerutility.h"
+#include "irsettings.h"
+#include "irnmslogdb.h"
+#include "irnmslogger.h"
+#include "irdbstatusobserver.h"
+#include "irphoneinfo.h"
+
+const TUint KFieldPosition = 5;
+const TInt KAmpMaxLength = 5;
+const TInt KFormatBuffMaxLength = 6;
+const TInt KMaxUrlSize = 256;
+
+const TUint KSessionLogGranularity = 4;
+const TUint KNmsLogGranularity = 5;
+
+const TUint KSessionLogThreshold = 5; // Session Log Maximum 15
+const TUint KNmsLogThreshold = 5;     // Nms Log Maximum 15
+
+// ---------------------------------------------------------------------------
+// Function: OpenL
+// Two phase constructor returns the instance of CIRReportGenerator
+// this is a single ton implementation
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CIRReportGenerator* CIRReportGenerator::OpenL()
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::OpenL" );
+    CIRReportGenerator* reportGenerator = reinterpret_cast<CIRReportGenerator*>(Dll::Tls());
+    
+    if (reportGenerator)
+        {
+        User::LeaveIfError(reportGenerator->Open());
+	    IRLOG_INFO( "CIRReportGenerator::OpenL - Opened singleton for new user." );
+        }
+    else
+        {
+        reportGenerator = new (ELeave) CIRReportGenerator;
+        CleanupClosePushL(*reportGenerator);
+        reportGenerator->ConstructL();
+        User::LeaveIfError(Dll::SetTls(reportGenerator));
+        CleanupStack::Pop(reportGenerator);
+	    IRLOG_INFO( "CIRSessionLogger::OpenL - Created the CIRReportGenerator singleton." );
+        }
+	IRLOG_DEBUG( "CIRReportGenerator::OpenL - Exiting." );
+    return reportGenerator;
+	}
+
+
+// ---------------------------------------------------------------------------
+// Function: ~CIRReportGenerator
+// default destructor
+// ---------------------------------------------------------------------------
+//
+CIRReportGenerator::~CIRReportGenerator()	
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::~CIRReportGenerator" );
+	
+	delete iImeiBase64;
+	iImeiBase64 = NULL;
+	
+	delete iPhoneInfo;
+	iPhoneInfo = NULL;
+	
+	//operation settings instance is removed
+	if( iSettingsData )
+		{
+		iSettingsData->Close(); // delete is handled like this.
+		}
+	
+	delete iSessionLog;
+	delete iNmsLog;
+	
+	delete iLogSessionDb;
+	delete iNmsLogDb;
+	
+	//session data is also removed
+	if (iSessionData)
+	    {
+	    iSessionData->ResetAndDestroy();
+	    }
+	delete iSessionData;
+	
+	//NmsLog data is also removed
+	if (iNmsLogData)
+	    {
+	    iNmsLogData->ResetAndDestroy();
+	    }
+	delete iNmsLogData;
+    
+	iBrowseLog.Close(); //browse log array is closed
+	iLogFile.Close();
+	//file session is closed
+	iFsSession.Close();
+	delete iPreviousSessionLog;
+	delete iPreviousNmsLog;
+	Dll::FreeTls();
+	IRLOG_DEBUG( "CIRReportGenerator::~CIRReportGenerator - Exiting." );	
+	}
+
+// ---------------------------------------------------------------------------
+// Function: ConstructL
+// Two phase constructor
+// ---------------------------------------------------------------------------
+//	
+void CIRReportGenerator::ConstructL()		
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::ConstructL" );
+	iSessionEndCalled = 0;
+	//file session is connected
+	//Create the IROperation Settings Instance
+	iSettingsData = CIRSettings::OpenL();
+	
+	User::LeaveIfError(iFsSession.Connect());
+	
+	//session logger is created
+	iSessionLog = CIRSessionLogger::NewL();
+   	//session logger is created
+	iNmsLog = CIRNmsLogger::NewL();
+	
+    //session db is created
+    iLogSessionDb = CIRSessionDb::NewL();
+    //NmsLog db is created
+    iNmsLogDb = CIRNmsLogDb::NewL();
+    
+    iSessFile =iSettingsData->PrivatePath();
+	iSessFile.Append(KSession);
+  	TInt error = iLogSessionDb->CreateDbConditional(iSessFile);
+	if ( error )
+		{
+		iSessionDbCreationFailed = ETrue;
+		}
+	else
+		{
+		iSessionDbCreationFailed = EFalse;	
+		}
+  
+    iNmsLogFile =iSettingsData->PrivatePath();
+	iNmsLogFile.Append(KNmsLog);
+  	TInt nmsError = iNmsLogDb->CreateDbConditional(iNmsLogFile);
+	if ( nmsError )
+		{
+		iNmsDbCreationFailed = ETrue;
+		}
+	else
+		{
+		iNmsDbCreationFailed = EFalse;	
+		}
+  
+  	//session log for five session are to be stored
+  	//and is stored in session data  	
+	iSessionData = new (ELeave) CArrayPtrFlat<CIRSessionLogger>(KSessionLogGranularity);
+	iNmsLogData = new (ELeave) CArrayPtrFlat<CIRNmsLogger>(KNmsLogGranularity);
+		
+	iPhoneInfo = CPhoneInfo::NewL(this);
+	iPhoneInfo->StartUpdating();
+	
+	IRLOG_DEBUG( "CIRReportGenerator::ConstructL - Exiting." );	
+	}
+
+// ---------------------------------------------------------------------------
+// Function: CIRReportGenerator
+// default constructor
+// ---------------------------------------------------------------------------
+//
+CIRReportGenerator::CIRReportGenerator():iPhoneInfo(NULL),
+                                         iDbStatusObserver(NULL),
+                                         iNmsLogDbUpdated(EFalse),
+                                         iSessionLogDbUpdated(EFalse),
+                                         iUnComfirmedReportSent(EFalse),
+                                         iSessionLogUpdationFailed(EFalse),
+                                         iNmsLogUpdationFailed(EFalse),
+                                         iSessionDbCreationFailed(EFalse),
+                                         iNmsDbCreationFailed(EFalse),
+                                         iImeiBase64(NULL)
+	{
+	//No Implementation	
+	}
+
+// ---------------------------------------------------------------------------
+// Function: LogServerResult
+// logs server connection result
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIRReportGenerator::LogServerResult(const TDesC& aUrl,TResponse aResult)	
+	{
+	iSessionLog->LogServerResult(aUrl,aResult);
+	}
+
+// ---------------------------------------------------------------------------
+// Function: LogSongRecog
+// logs song recog
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIRReportGenerator::LogSongRecog()  
+    {
+    //taking the session start time in GMT    
+    iSongRecogTimestamp.UniversalTime();
+    TTimeIntervalSeconds offset(iSettingsData->TimeCorrection());
+    iSongRecogTimestamp -= offset;
+    iDate = iSongRecogTimestamp.DateTime();
+    TBuf<64> songRecogTimestamp;
+    FormatDateTime(songRecogTimestamp,iDate);
+    iSessionLog->LogSongRecog(songRecogTimestamp);
+    }
+
+// ---------------------------------------------------------------------------
+// Function: UpdateCurrentBrowseNetwork
+// logs network browsing
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIRReportGenerator::UpdateCurrentBrowseNetwork(TInt aNetwork)
+	{
+	iCurrentBrowseNetwork = aNetwork;
+	}
+
+// ---------------------------------------------------------------------------
+// Function: LogBrowse
+// logs browse url and status information
+// ---------------------------------------------------------------------------
+//	
+EXPORT_C void CIRReportGenerator::LogBrowse(const TDesC8& aUrl,TInt aStatus)	
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::LogBrowse" );
+	//browse url is copied
+	iRBrowseLog.iBrowseUrl.Copy(aUrl);
+	//time stamp in GMT is onbtained
+	iBrowseLogTimeStamp.UniversalTime();
+
+	TInt time_val = 0;
+    time_val = iSettingsData->TimeCorrection();
+	TTimeIntervalSeconds offset(time_val);
+
+	iBrowseLogTimeStamp -= offset;
+	iDate = iBrowseLogTimeStamp.DateTime();
+	//formated
+	FormatDateTime(iRBrowseLog.iTimeStamp,iDate);
+	_LIT(KFormat,"%d");
+	(iRBrowseLog.iCurrentNetwork).Format(KFormat,
+									iCurrentBrowseNetwork);	
+	//status is stored
+	iRBrowseLog.iStatus = aStatus;
+	TRAP_IGNORE(iBrowseLog.AppendL(iRBrowseLog))
+	IRLOG_DEBUG( "CIRReportGenerator::LogBrowse - Exiting." );
+	}
+
+// ---------------------------------------------------------------------------
+// Function: SessionStartedL
+// starts a new session
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIRReportGenerator::SessionStartedL()
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::SessionStartedL" );
+	//gets the session id for new session
+	iSessionLog->ResetResource();
+	
+	iSessionLog->UpdateSessionId(iSettingsData->GetLogRunningNo());
+	iSettingsData->SetLogRunningNoL();
+	iFileWritePos = 0;	
+	
+	iLogFilePath = iSettingsData->PrivatePath();
+	iLogFilePath.Append(KLogFileName);
+    //taking the session start time in GMT    
+	iSessionStartTime.UniversalTime();
+	iSessionLog->UpdateSessionStartGMTTime();
+	TTimeIntervalSeconds offset(iSettingsData->TimeCorrection());
+	iSessionStartTime -= offset;
+	iDate = iSessionStartTime.DateTime();
+	FormatDateTime(iSessionLog->StartTime(),iDate);
+	iSessionLog->UnMarkSession();
+	//collect the neccessary information	
+	CollectSettingsData();
+	iSessionLogUpdationFailed = EFalse;
+	//start adding the intial information in db	
+	IRLOG_DEBUG( "CIRReportGenerator::SessionStartedL - Exiting." );	
+	}
+// ---------------------------------------------------------------------------
+// Function: NmsLogStartedL
+// starts a new nmslog
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIRReportGenerator::NmsLogStartedL()
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::SessionStartedL" );
+	iNmsTimestamp.UniversalTime();
+	TInt time_val = 0;
+	time_val = iSettingsData->TimeCorrection();
+	TTimeIntervalSeconds offset(time_val);
+
+	iNmsTimestamp -= offset;
+	iDate = iNmsTimestamp.DateTime();
+	//formated
+	FormatDateTime(iNmsLog->StartTime(),iDate);	
+	iNmsLogUpdationFailed = EFalse;
+	//start adding the intial information in db	
+	IRLOG_DEBUG( "CIRReportGenerator::SessionStartedL - Exiting." );	
+	}
+
+// ---------------------------------------------------------------------------
+// Function: SessionEnd
+// marks the a session
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIRReportGenerator::SessionEndL( TBool aForcedTermination )
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::SessionEndL" );
+	iSessionEndCalled++;
+	//session end
+	if( aForcedTermination )
+		{
+		//forced ending of session log
+		ForcedSessionEndedL();
+		}
+	else
+		{
+		//unforced ending of session log
+		iSessionLog->EndLogging();
+		UnForceSessionEndedL(iSessionLog);	
+		}	
+
+	IRLOG_DEBUG( "CIRReportGenerator::SessionEndL - Exiting." );
+	}
+
+// ---------------------------------------------------------------------------
+// Function: UpdateTerminatedBy
+// updates the termination status
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIRReportGenerator::UpdateTerminatedBy(TTerminationStatus 
+	aTerminatedBy)
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::UpdateTerminatedBy" );
+	iSessionLog->UpdateTerminationStatus(aTerminatedBy);		
+	}
+
+// ---------------------------------------------------------------------------
+// Function: GetConnectedFrom
+// connected information is stored
+// ---------------------------------------------------------------------------
+//	
+EXPORT_C void CIRReportGenerator::UpdateConnectedFrom(TConnectedFrom aConnectedFrom)
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::UpdateConnectedFrom" );
+	iSessionLog->GetConnectedFrom(aConnectedFrom);
+	}
+	
+// ---------------------------------------------------------------------------
+// Function: BrowseUrl
+// logs browse url and result
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIRReportGenerator::BrowseUrl(const TDesC& aBrowseUrl,
+													TInt aStatus)
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::BrowseUrl" );
+	_LIT(KAmp,"&amp;");
+	TBuf8<KAmpMaxLength> amp;
+	amp.Copy(KAmp);	
+	TBuf8<KMaxUrlSize> url;
+	url.Copy(aBrowseUrl);
+	_LIT8(KAmpnd,"&");
+	TInt pos = url.Find(KAmpnd);
+	if(pos > 0)
+		{
+		url.Replace(pos,1,amp);	
+		}
+	LogBrowse(url,aStatus);
+	IRLOG_DEBUG( "CIRReportGenerator::BrowseUrl - Exiting." );
+	}
+
+// ---------------------------------------------------------------------------
+// Function: UpdateChannelID
+// updates the channel id
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIRReportGenerator::UpdateChannelID(TInt aChanneldID)
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::UpdateChannelID" );
+	iSessionLog->UpdateChannelID(aChanneldID);
+	}
+
+// ---------------------------------------------------------------------------
+// Function: UpdateCurrentNetwork
+// updates the current network
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIRReportGenerator::UpdateCurrentNetwork(TInt aCurrentNetwork)
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::UpdateCurrentNetwork" );
+	iSessionLog->UpdateCurrentNetwork(aCurrentNetwork);
+	}
+
+// ---------------------------------------------------------------------------
+// Function: UpdateHomeOperator
+// updates the home network
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIRReportGenerator::UpdateHomeOperator(TInt aHomeOperator)
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::UpdateHomeOperator" );
+	iSessionLog->UpdateHomeOperator(aHomeOperator);
+	}
+
+// ---------------------------------------------------------------------------
+// Function: MarkSessionStart
+// updates the termination status
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIRReportGenerator::MarkSessionStart()
+	{
+	iSessionStartTime.UniversalTime();
+
+	TInt time_val = 0;
+	time_val = iSettingsData->TimeCorrection();
+	TTimeIntervalSeconds offset(time_val);
+	
+	iSessionStartTime -= offset; 
+	iDate = iSessionStartTime.DateTime();
+	FormatDateTime(iSessionLog->StartTime(),iDate);
+	//setting session start time
+	iSessionLog->UpdateSessionStartGMTTime();
+	iSessionLog->MarkSession();		
+	if( iPreviousSessionLog )
+		{
+		//if previous session exist it added to the log
+		TRAP_IGNORE( UnForceSessionEndedL(iPreviousSessionLog) )
+		delete iPreviousSessionLog;
+		iPreviousSessionLog = NULL;	
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// Function: HandleStopEvents
+// function handles session state changes
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIRReportGenerator::HandleStopEvents(TBool aIsSessionProgressing )
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::HandleStopEvents" );
+	if( !aIsSessionProgressing )
+		{
+		iSessionLog->HandleStopEvents();
+		}
+	else
+		{
+		iSessionLog->HandleStartEvents();
+		}
+	IRLOG_DEBUG( "CIRReportGenerator::HandleStopEvents - Exiting." );
+	}
+
+// ---------------------------------------------------------------------------
+// Function: ReStorePreviousSession
+// restore the previous session
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CIRReportGenerator::ReStorePreviousSession()
+	{
+	if( iPreviousSessionLog )
+		{
+		//if previous session exist that is restored
+		//ETrue is returned.
+		iSessionLog->GetBackedUp(*iPreviousSessionLog);
+		delete iPreviousSessionLog;
+		iPreviousSessionLog = NULL;
+		return ETrue;	
+		}
+	else
+		{
+		//if previous session doesn't exist EFalse is returned
+		return EFalse;	
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// Function: UpdateConnectionType
+// updates the connection type
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIRReportGenerator::UpdateConnectionType(const TDesC& 
+	aConnectionType)
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::UpdateConnectionType" );
+	iSessionLog->UpdateConnectionType(aConnectionType);
+	}
+
+// ---------------------------------------------------------------------------
+// Function: UpdateNmsType
+// updates the connection type
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIRReportGenerator::UpdateNmsType(const TDesC& aNmsType)
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::UpdateNmsType" );
+	iNmsLog->UpdateNmsType(aNmsType);
+	}
+
+// ---------------------------------------------------------------------------
+// Function: SetDbStatusObserser
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIRReportGenerator::SetDbStatusObserser(MIRLogDbStatusObserver *aDbStatusObserver)
+{
+    iDbStatusObserver = aDbStatusObserver;
+}	
+
+// ---------------------------------------------------------------------------
+// Function: reportSent
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIRReportGenerator::ReportSent()
+{
+    iUnComfirmedReportSent = ETrue;
+}	
+
+
+// ---------------------------------------------------------------------------
+// Function : ReponseFromISDSObtained
+// This function is called when session log is successfully sent
+// removes all session log entries from sessiondb
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIRReportGenerator::ReponseFromISDSObtained()
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::ReponseFromISDSObtained" );
+	iUnComfirmedReportSent = EFalse;
+	TRAP_IGNORE(iLogSessionDb->DeleteAllSessionL())
+	TRAP_IGNORE(iNmsLogDb->DeleteAllNmsLogL())
+	for(TInt i = 0; i < iBrowseLogsCntToXml; i++)
+		{
+		if(iBrowseLog.Count() > 0)
+			iBrowseLog.Remove(0);
+		}
+	}	
+
+// ---------------------------------------------------------------------------
+// Function: CollectSettingsData
+// collect information during starting of session
+// like irid, version information.
+// ---------------------------------------------------------------------------
+//
+void CIRReportGenerator::CollectSettingsData()
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::CollectSettingsData" );
+	_LIT(KData,"1.0");
+	_LIT(KIRID,"NO IRID");
+	
+	
+
+		//gets irid from opsetting
+		TRAP_IGNORE( iIRId.Copy(iSettingsData->GetIRIDL()) );
+		//if length of irid is zero "no irid" is assigned
+		if((iIRId).Length() == 0)
+			{
+			iIRId.Copy(KIRID);
+			}
+		//version copied
+		iReportVersion.Copy(KData);
+	IRLOG_DEBUG( "CIRReportGenerator::CollectSettingsData - Exiting." );
+	}
+
+// ---------------------------------------------------------------------------
+// Function: WriteToXmlL
+// gathers the information and generates sesion log file and zip file
+// file will be stored in private path
+// ---------------------------------------------------------------------------
+//	
+void CIRReportGenerator::WriteToXmlL()
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::WriteToXmlL" );	
+	//1. log file is created
+    User::LeaveIfError(iLogFile.Replace(iFsSession,iLogFilePath,EFileWrite));	
+	iLogFile.Seek(ESeekStart,iFileWritePos);
+	
+	
+    //2. Write file header.
+    iUniCodeBuf.Copy(KXmlHeader);
+    CnvUtfConverter::ConvertFromUnicodeToUtf8(iUTF8Buffer,iUniCodeBuf);	
+	WriteBufferToLogFile();
+	
+	//3. Write Version + IRID + IMEI
+	iUniCodeBuf.Copy(KRPSTARTTAG);
+	iFileWritePos =	iUniCodeBuf.Find(KField);
+	//3.1 Write Version
+	iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,iReportVersion);
+	iFileWritePos =	iUniCodeBuf.Find(KField);
+	//3.2 Write IRID
+	RBuf tempIRID;
+	TRAP_IGNORE( tempIRID.Create(iSettingsData->GetIRIDL()) );
+	if((tempIRID).Length() != 0)
+		{
+		iIRId.Copy(tempIRID);
+		}
+	tempIRID.Close();
+	iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,iIRId);
+    //3.3 Write IMEI
+	iFileWritePos = iUniCodeBuf.Find(KField);
+	if(NULL == iImeiBase64)
+	    {
+	    iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,KNullDesC);
+	    }
+	else
+	    {
+	    iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,*iImeiBase64);	    
+	    }    
+	CnvUtfConverter::ConvertFromUnicodeToUtf8(iUTF8Buffer,iUniCodeBuf);
+	WriteBufferToLogFile();
+	
+	//4. Write session log
+	if(!iSessionLogUpdationFailed)
+		{
+		for(TInt count = 0; count<(iSessionData->Count()); count++)
+			{
+			WriteSessionData(count);		
+			}
+		}
+	
+	//5. Write browse log			
+	WriteBrowseLog();
+
+	//6. Write nms log  
+	if(!iNmsLogUpdationFailed)
+		{
+		iUniCodeBuf.Copy(KNMSLOGSTARTTAG);
+		CnvUtfConverter::ConvertFromUnicodeToUtf8(iUTF8Buffer,iUniCodeBuf);
+		WriteBufferToLogFile();
+
+		for(TInt count = 0; count<(iNmsLogData->Count()); count++)
+			{
+			WriteNmsLogData(count);		
+			}
+		iUniCodeBuf.Copy(KNMSLOGENDTAG);
+		CnvUtfConverter::ConvertFromUnicodeToUtf8(iUTF8Buffer,iUniCodeBuf);
+		WriteBufferToLogFile();		
+		}
+
+	//7. Write file ending
+	iUniCodeBuf.Copy(KRPENDTAG);
+	CnvUtfConverter::ConvertFromUnicodeToUtf8(iUTF8Buffer,iUniCodeBuf);
+	WriteBufferToLogFile();
+	
+	iLogFile.Close();
+	ZipFileL();
+	
+	iBrowseLogsCntToXml = iBrowseLog.Count();
+	
+	IRLOG_DEBUG( "CIRReportGenerator::WriteToXmlL - Exiting." );
+	}
+// ---------------------------------------------------------------------------
+// Function: WriteNmsLogtoXmlL
+// logs nmsEvents to Xml file
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIRReportGenerator::WriteNmsLogtoXmlL()
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::WriteNmsLogtoXmlL" );
+	if(iSessionEndCalled == 0)
+		{
+		ForcedSessionEndedL();
+		iSessionEndCalled++;
+		}
+	iNmsEventFlag = ETrue;
+	UnForceSessionEndedL(iSessionLog);
+	iNmsEventFlag = EFalse;
+	IRLOG_DEBUG( "CIRReportGenerator::WriteNmsLogtoXmlL - Leaving" );
+	}
+
+// ---------------------------------------------------------------------------
+// Function: WriteSessionData
+// gathers session log data and writes to XML file
+// ---------------------------------------------------------------------------
+//
+void CIRReportGenerator::WriteSessionData(TInt aIndex)
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::WriteSessionData" );
+	
+	ASSERT( aIndex >= 0 && aIndex < iSessionData->Count() );
+	TBuf<KFormatBuffMaxLength> FormatBuff;
+	_LIT(KConvert,"%d");
+	
+	// 1. session start time is copied
+	iUniCodeBuf.Copy(KSESSIONSTARTTAG);
+	iFileWritePos =	iUniCodeBuf.Find(KField);	
+	iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,(iSessionData->
+		At(aIndex))->StartTime());
+	
+	// 2. session duration is copied
+	iFileWritePos =	iUniCodeBuf.Find(KField);	
+	TInt duration = (iSessionData->At(aIndex))->SessionDuration();
+	FormatBuff.Format(KConvert,duration);
+	iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,FormatBuff);
+	
+	// 3. termination status is copied
+	iFileWritePos =	iUniCodeBuf.Find(KField);
+	iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,(iSessionData->
+		At(aIndex))->TerminationStatus());
+	
+	// 4. connected from information is copied
+	iFileWritePos =	iUniCodeBuf.Find(KField);
+	iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,(iSessionData->
+		At(aIndex))->ConnectedFrom());
+	
+	// 5. session id is copied
+	iFileWritePos =	iUniCodeBuf.Find(KField);
+	FormatBuff.Format(KConvert,(iSessionData->At(aIndex))->SessionId());
+	iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,FormatBuff);
+	
+	// 6. channel id is copied
+	iFileWritePos =	iUniCodeBuf.Find(KField);
+	FormatBuff.Format(KConvert,(iSessionData->At(aIndex))->ChannelID());
+	iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,FormatBuff);
+	CnvUtfConverter::ConvertFromUnicodeToUtf8(iUTF8Buffer,iUniCodeBuf);
+	
+	WriteBufferToLogFile();
+		
+	// 8. Write ServerResult    
+	TInt ServerResultCount = (iSessionData->At(aIndex))->
+		SessionData().Count();
+	for(TInt count=0; count < ServerResultCount;count++)
+		{
+		//channel server urls are copied for the session			
+		iUniCodeBuf.Copy(KSERVERRESULTTAG);
+		iFileWritePos =	iUniCodeBuf.Find(KField);
+		iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,(iSessionData->
+		At(aIndex)->SessionData()[count].iServerUrl));
+			
+		//status is copied
+		iFileWritePos =	iUniCodeBuf.Find(KField);
+		iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,(iSessionData->
+			At(aIndex)->SessionData()[count].iServerResult));
+		CnvUtfConverter::ConvertFromUnicodeToUtf8(iUTF8Buffer,iUniCodeBuf);
+		//writting the information to the xml file	
+		WriteBufferToLogFile();
+		}
+    
+	// 9. connection type is copied
+	iUniCodeBuf.Copy(KCONNECTIONTAG);
+	iFileWritePos =	iUniCodeBuf.Find(KField);
+	iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,(iSessionData->
+		At(aIndex))->ConnectionType());
+	
+	// 10. current network is copied
+	iFileWritePos =	iUniCodeBuf.Find(KField);
+	FormatBuff.Format(KConvert,(iSessionData->At(aIndex))->
+			CurrentNetwork());
+	iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,FormatBuff);
+	
+    // 11. home operator is copied
+	iFileWritePos =	iUniCodeBuf.Find(KField);
+	FormatBuff.Format(KConvert,(iSessionData->At(aIndex))->HomeOperator());
+	iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,FormatBuff);
+	CnvUtfConverter::ConvertFromUnicodeToUtf8(iUTF8Buffer,iUniCodeBuf);
+	
+	WriteBufferToLogFile();
+	
+    // 12. Write Song Recog Log
+    iUniCodeBuf.Copy(KSONGRECOGLOGSTARTTAG);	
+    CnvUtfConverter::ConvertFromUnicodeToUtf8(iUTF8Buffer,iUniCodeBuf);
+    WriteBufferToLogFile();	
+	
+    TInt songRecogLogCount = (iSessionData->At(aIndex))->
+        SongRecogLog().Count();
+    for(TInt count=0; count < songRecogLogCount; count++)
+        {        
+        iUniCodeBuf.Copy(KSONGRECOGEVENTTAG);
+        iFileWritePos = iUniCodeBuf.Find(KField);
+        iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,(iSessionData->
+        At(aIndex)->SongRecogLog()[count].iTimeStamp));
+        CnvUtfConverter::ConvertFromUnicodeToUtf8(iUTF8Buffer,iUniCodeBuf);
+        WriteBufferToLogFile();
+        }
+
+    iUniCodeBuf.Copy(KSONGRECOGLOGENDTAG);
+    CnvUtfConverter::ConvertFromUnicodeToUtf8(iUTF8Buffer,iUniCodeBuf);
+    WriteBufferToLogFile();
+    
+    // write ending tag </session>
+	iUniCodeBuf.Copy(KSESSIONENDTAG);
+	//tags are also written into xml file
+	CnvUtfConverter::ConvertFromUnicodeToUtf8(iUTF8Buffer,iUniCodeBuf);
+	WriteBufferToLogFile();
+	IRLOG_DEBUG( "CIRReportGenerator::WriteSessionData - Exiting." );			
+	}	
+
+// ---------------------------------------------------------------------------
+// Function: WriteBrowseLog
+// gathers browse log data and writes to XML file
+// ---------------------------------------------------------------------------
+//	
+ void CIRReportGenerator::WriteBrowseLog()
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::WriteBrowseLog" );
+	//browse log
+	//browse log tag is written
+	iUniCodeBuf.Copy(KBROWSESTARTTAG);
+	CnvUtfConverter::ConvertFromUnicodeToUtf8(iUTF8Buffer,iUniCodeBuf);
+	WriteBufferToLogFile();
+	for(TInt count = 0; count < (iBrowseLog.Count());count++)
+		{
+		//browse log url is copied				
+		iUniCodeBuf.Copy(KBROWSETAG);
+		iFileWritePos =	iUniCodeBuf.Find(KField);
+		iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,
+			(iBrowseLog).operator[](count).iBrowseUrl);
+		iFileWritePos =	iUniCodeBuf.Find(KField);
+		//browse log time stamp is copied
+		iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,
+			(iBrowseLog).operator[](count).iTimeStamp);
+		iFileWritePos =	iUniCodeBuf.Find(KField);
+		//browse log current network is copied
+		iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,
+			(iBrowseLog).operator[](count).iCurrentNetwork);
+	    CnvUtfConverter::ConvertFromUnicodeToUtf8(iUTF8Buffer,iUniCodeBuf);
+	    //browse log is written to xml
+		WriteBufferToLogFile();
+		}
+	
+	//browse log end tag is copied	
+	iUniCodeBuf.Copy(KBROWSEENDTAG);
+	CnvUtfConverter::ConvertFromUnicodeToUtf8(iUTF8Buffer,iUniCodeBuf);
+	WriteBufferToLogFile();
+	IRLOG_DEBUG( "CIRReportGenerator::WriteBrowseLog - Exiting." );
+	}
+
+// ---------------------------------------------------------------------------
+// Function: ZipFileL
+// generates the zip file from the input xml file
+// output file is in gzip format and is stored in private path
+// ---------------------------------------------------------------------------
+//	
+ void CIRReportGenerator::ZipFileL()
+ 	{
+ 	IRLOG_DEBUG( "CIRReportGenerator::ZipFileL" );
+ 	//input file is the xml file in private path and output is a gzip file stored 
+ 	//private path
+ 	//xml file
+	RFile iplogfile;
+	//getting path of zip file
+	TFileName gzipfilepath = iSessionLog->FileName();
+	gzipfilepath.Append(KGZipLogFileName);
+	
+		iLogFilePath = iSettingsData->PrivatePath();
+		iLogFilePath.Append(KLogFileName);
+
+	//input file is opened
+	TInt error = iplogfile.Open(iFsSession,iLogFilePath,EFileStream | EFileRead);
+	CleanupClosePushL( iplogfile );
+	
+	if( KErrNone != error )
+		{
+		User::LeaveIfError(error);	
+		}
+	
+	//generating zip file
+	
+	TInt fileSize(0);
+	TInt err = iplogfile.Size( fileSize );
+	
+	if(!err)
+		{	
+		TParse zipParse;
+		zipParse.Set( iLogFilePath, NULL, NULL );
+		
+		TPtrC zipDrive = zipParse.Drive();
+		
+		TChar driveChar = zipDrive[0];
+		TInt driveNum(0);
+		RFs::CharToDrive( driveChar, driveNum );
+		
+		TDriveInfo driveInfo;
+		TInt driveErr = iplogfile.Drive( driveNum, driveInfo );
+	       if( !driveErr
+	    	&& driveNum != EDriveZ
+	    	&& !SysUtil::DiskSpaceBelowCriticalLevelL(
+	    			 &CCoeEnv::Static()->FsSession(), iUTF8Buffer.Size(), driveNum ) )
+			{
+			// disk space is not below critical level
+			// Next generate the zip file
+			CEZFileToGZip* zip = CEZFileToGZip::NewLC(iFsSession,gzipfilepath, iplogfile);
+ 	while(zip->DeflateL())
+		{
+		}
+	CleanupStack::PopAndDestroy(zip);
+			}
+		else
+			{
+			// disk space is below critical level
+			// Do not generate the zip file
+			}
+		}
+
+	//file is closed 
+	CleanupStack::PopAndDestroy(); // iplogfile
+	IRLOG_DEBUG( "CIRReportGenerator::ZipFileL - Exiting." );	
+	}
+	
+// ---------------------------------------------------------------------------
+// Function: FormatDateTime
+// formats the date time given in "%d-%d-%d %d:%d:%d GMT\n" format
+// copies the result to a descriptor
+// ---------------------------------------------------------------------------
+//
+void CIRReportGenerator::FormatDateTime(TDes& aBuffer,TDateTime aDateTime)
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::FormatDateTime" );          
+	_LIT(KFormatTxt,"%d-%d-%d %d:%d:%d GMT\n");
+    aBuffer.Format(KFormatTxt,aDateTime.Year(),TInt(aDateTime.Month()+1), 
+		//Format the month as a TInt to preserve locale independence
+        //aDateTime.Day()+1, 
+        aDateTime.Day()+1, 
+        // Day and month ranges begin at zero (0-30 and 0-11), 
+        // so add one when formatting
+        aDateTime.Hour(), aDateTime.Minute(), aDateTime.Second()
+        //aDateTime.MicroSecond()
+        );
+    IRLOG_DEBUG( "CIRReportGenerator::FormatDateTime - Exiting." );
+	}
+
+// ---------------------------------------------------------------------------
+// Function: WriteBufferToLogFile
+// Writes the content of iUTF8Buffer to iLogFile
+// ---------------------------------------------------------------------------
+//
+void CIRReportGenerator::WriteBufferToLogFile()
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::WriteBufferToLogFile" );   
+	// Get the drive where iLogFile is located.
+
+	TInt driveNumber(0);
+	TDriveInfo driveInfo;
+	
+	TInt err = iLogFile.Drive( driveNumber, driveInfo );
+
+	// Write the log file only if:
+	// Drive was fetched successflly,
+	// the drive is not Z
+	// and free disk space is not below critical level (128kB)
+
+	if( !err && driveNumber!=EDriveZ )
+		{
+		TBool ret = ETrue;
+	    TRAP_IGNORE( ret = SysUtil::DiskSpaceBelowCriticalLevelL( 
+	    &CCoeEnv::Static()->FsSession(),iUTF8Buffer.Size(), driveNumber ))
+	    if( !ret )
+			{
+			iLogFile.Write( iUTF8Buffer );
+			}
+		else
+			{
+			// Do not write the session log.
+			}
+		}
+	else
+		{
+		// Do not write the session log.
+		}
+	IRLOG_DEBUG( "CIRReportGenerator::WriteBufferToLogFile - Exiting." );
+	}
+
+// ---------------------------------------------------------------------------
+// Function: UnForceSessionEndedL
+// Handles Unforced end of the session
+// ---------------------------------------------------------------------------
+//
+void CIRReportGenerator::UnForceSessionEndedL( CIRSessionLogger* aSession )
+	{
+	// 1. retrieve session log from db
+	if(iSessionDbCreationFailed)
+		{
+		iSessionLogUpdationFailed = ETrue;	
+		}
+	else
+		{
+		if(iNmsEventFlag)
+			{
+			TRAPD(error,
+			//count is stored	
+			iLogSessionDb->GetAllSessionL(*iSessionData);
+			);
+			if(error)
+				{
+				iSessionLogUpdationFailed = ETrue;	
+				}	
+			}
+		else
+			{
+			TRAPD( error,
+                    //loads the information into the db at the end of the session
+                    iLogSessionDb->AddSessionStartL(*aSession);
+                    //count is stored	
+                    iLogSessionDb->GetAllSessionL(*iSessionData);
+                 );
+            if(error)
+                {
+                iSessionLogUpdationFailed = ETrue;	
+                }	
+            else
+			    {
+                TInt count = iSessionData->Count();
+                if((count>0) && (count%KSessionLogThreshold == 0))
+                    {
+                    iSessionLogDbUpdated = ETrue;
+                    }
+                }
+			}
+		}
+
+    // 2. retrieve nms log from db	
+	if(iNmsDbCreationFailed)
+		{
+		iNmsLogUpdationFailed = ETrue;	
+		}
+	else
+		{
+		if(!iNmsEventFlag)
+			{
+			TRAPD( error, iNmsLogDb->GetAllNmsLogL(*iNmsLogData) );
+			if(error)
+				{
+				iNmsLogUpdationFailed = ETrue;	
+				}	
+			}
+		else
+			{
+			TRAPD( error,
+                    //loads the information into the db at the end of the session
+                    iNmsLogDb->AddNmsLogStartL(*iNmsLog);
+                    //count is stored	
+                    iNmsLogDb->GetAllNmsLogL(*iNmsLogData);
+                 );
+			if(error)
+				{
+				iNmsLogUpdationFailed = ETrue;	
+				}
+            else
+                {
+                TInt count = iNmsLogData->Count();
+                if((count>0) && (count%KNmsLogThreshold == 0))
+                    {
+                    iNmsLogDbUpdated = ETrue;
+                    }
+                }
+			}
+		}
+
+	//xml file is created and is zipped
+	WriteToXmlL();
+	
+	if( iDbStatusObserver && 
+	       ( iNmsLogDbUpdated ||
+	         iSessionLogDbUpdated ||
+	         iUnComfirmedReportSent
+	       )
+	  )
+	    {
+	  	iDbStatusObserver->LogDbNeedFlush();
+	  	iNmsLogDbUpdated = EFalse;
+	  	iSessionLogDbUpdated = EFalse;
+	    }
+	}
+
+// ---------------------------------------------------------------------------
+// Function: ForcedSessionEndedL
+// Handles forced end of the session
+// ---------------------------------------------------------------------------
+//
+void CIRReportGenerator::ForcedSessionEndedL()
+	{
+	iSessionLog->EndLogging();
+	iPreviousSessionLog = CIRSessionLogger::NewL();
+	iPreviousSessionLog->GetBackedUp(*iSessionLog);
+	iPreviousNmsLog = CIRNmsLogger::NewL();
+	iPreviousNmsLog->GetBackedUp(*iNmsLog);
+	}
+
+/**
+ * The following methods are for Nms Event Usage Logging 
+ */
+// ---------------------------------------------------------------------------
+// Function: UpdateNmsCurrentNetwork
+// logs network during Music Store launching
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIRReportGenerator::UpdateNmsCurrentNetwork(TInt aNetwork)
+	{
+	iNmsLog->UpdateCurrentNetwork(aNetwork);
+	}
+	
+// ---------------------------------------------------------------------------
+// Function: UpdateNmsHomeOperator
+// logs network during Music Store Launching
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIRReportGenerator::UpdateNmsHomeOperator(TInt aNetwork)
+	{
+	iNmsLog->UpdateHomeOperator(aNetwork);
+	}
+	
+// ---------------------------------------------------------------------------
+// Function: UpdateNmsChannelID
+// updates the channel id
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIRReportGenerator::UpdateNmsChannelID(TInt aChanneldID)
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::UpdateNmsChannelID" );
+	iNmsLog->UpdateChannelID(aChanneldID);
+	}
+
+// ---------------------------------------------------------------------------
+// Function: WriteNmsLogData
+// gathers Nmslog data and writes to XML file
+// ---------------------------------------------------------------------------
+//
+void CIRReportGenerator::WriteNmsLogData(TInt aIndex)
+	{
+	IRLOG_DEBUG( "CIRReportGenerator::WriteNmsLogData" );
+	TBuf<KFormatBuffMaxLength> FormatBuff;
+	_LIT(KConvert,"%d");
+
+	//NmsEvent Tag is written
+	iUniCodeBuf.Copy(KNMSEVENTTAG);
+
+	iFileWritePos =	iUniCodeBuf.Find(KField);	
+	//Nms Event timestamp is copied
+	iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,(iNmsLogData->
+	At(aIndex))->StartTime());
+
+	//channel id is copied
+	iFileWritePos =	iUniCodeBuf.Find(KField);
+    ASSERT( aIndex >= 0 && aIndex < iNmsLogData->Count() );
+	FormatBuff.Format(KConvert,(iNmsLogData->At(aIndex))->ChannelID());
+	iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,FormatBuff);
+
+	//type is copied
+	iFileWritePos =	iUniCodeBuf.Find(KField);
+	iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,(iNmsLogData->
+	At(aIndex))->NmsType());
+	iFileWritePos =	iUniCodeBuf.Find(KField);
+
+	//current network is copied
+	ASSERT( aIndex >= 0 && aIndex < iNmsLogData->Count() );
+	FormatBuff.Format(KConvert,(iNmsLogData->At(aIndex))->
+	CurrentNetwork());
+	iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,FormatBuff);
+	iFileWritePos =	iUniCodeBuf.Find(KField);
+
+	//home operator is copied
+	ASSERT( aIndex >= 0 && aIndex < iNmsLogData->Count() );
+	FormatBuff.Format(KConvert,(iNmsLogData->At(aIndex))->HomeOperator());
+	iUniCodeBuf.Replace(iFileWritePos,KFieldPosition,FormatBuff);
+
+	CnvUtfConverter::ConvertFromUnicodeToUtf8(iUTF8Buffer,iUniCodeBuf);
+	//writting the information to the xml file	
+	WriteBufferToLogFile();
+
+	IRLOG_DEBUG( "CIRReportGenerator::WriteNmsLogData - Exiting." );
+	}	
+
+// ---------------------------------------------------------------------------
+// Function: ImeiUpdated
+// From MIRPhoneInfoObserver
+// ---------------------------------------------------------------------------
+//
+void CIRReportGenerator::ImeiUpdatedL(const TDesC& aImei)
+    {
+    if(0 == aImei.Length())
+        {
+        iPhoneInfo->StartUpdating();
+        return;
+        }
+    // prepare base64 codec input
+    HBufC8 *imei = HBufC8::NewLC( aImei.Length() );
+    TPtr8 imeiPtr = imei->Des();    
+    imeiPtr.Copy(aImei);
+    
+    // prepare base64 codec output
+    HBufC8 *buffer = HBufC8::NewLC( aImei.Length() * 2 );
+    TPtr8 bufferPtr = buffer->Des();
+    
+    // Encoding
+    TImCodecB64 base64Codec;
+    base64Codec.Initialise();
+    base64Codec.Encode(*imei, bufferPtr);
+    
+    // store to data member
+    if(NULL == iImeiBase64)
+        {
+        iImeiBase64 = HBufC16::NewL( aImei.Length() * 2 );
+        }
+    TPtr imeiBase64Ptr = iImeiBase64->Des();
+    imeiBase64Ptr.Copy(bufferPtr);
+    
+    CleanupStack::PopAndDestroy(buffer);
+    CleanupStack::PopAndDestroy(imei);
+    }
+