--- /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,"&");
+ 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);
+ }
+