diff -r 000000000000 -r 09774dfdd46b internetradio2.0/sessionlogsrc/irsessionlogger.cpp --- /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 +#include +#include +#include +#include +#include +#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(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(KSessionLogGranularity); + iNmsLogData = new (ELeave) CArrayPtrFlat(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 amp; + amp.Copy(KAmp); + TBuf8 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 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 + 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 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); + } +