diff -r 608f67c22514 -r 896e9dbc5f19 internetradio2.0/irsessionlog/src/irsessionlogger.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/internetradio2.0/irsessionlog/src/irsessionlogger.cpp Wed Aug 18 09:40:26 2010 +0300 @@ -0,0 +1,1173 @@ +/* +* Copyright (c) 2009 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: The implementation for presentation elements. +* +*/ + + +#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; + + //CIRSessionDb object is deleted + delete iLogSessionDb; + + //CIRNmsLogDb object is deleted + 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(); + Dll::FreeTls(); + IRLOG_DEBUG( "CIRReportGenerator::~CIRReportGenerator - Exiting." ); + } + +// --------------------------------------------------------------------------- +// Function: ConstructL +// Two phase constructor +// --------------------------------------------------------------------------- +// +void CIRReportGenerator::ConstructL() + { + IRLOG_DEBUG( "CIRReportGenerator::ConstructL" ); + //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() + { + IRLOG_DEBUG( "CIRReportGenerator::SessionEndL" ); + 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(); + } + +// --------------------------------------------------------------------------- +// 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: 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.CreateL( 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 ) + { + TInt nmsLogCount = iNmsLogData->Count(); + if(nmsLogCount > 0) + { + iUniCodeBuf.Copy(KNMSLOGSTARTTAG); + CnvUtfConverter::ConvertFromUnicodeToUtf8(iUTF8Buffer,iUniCodeBuf); + WriteBufferToLogFile(); + + for(TInt count = 0; count < nmsLogCount; 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" ); + 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 + TInt songRecogLogCount = ( iSessionData->At( aIndex ) )-> + SongRecogLog().Count(); + if(songRecogLogCount > 0) + { + iUniCodeBuf.Copy(KSONGRECOGLOGSTARTTAG); + CnvUtfConverter::ConvertFromUnicodeToUtf8(iUTF8Buffer,iUniCodeBuf); + WriteBufferToLogFile(); + + 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 + TInt browseLogCount = iBrowseLog.Count(); + if(browseLogCount > 0) + { + iUniCodeBuf.Copy(KBROWSESTARTTAG); + CnvUtfConverter::ConvertFromUnicodeToUtf8(iUTF8Buffer,iUniCodeBuf); + WriteBufferToLogFile(); + for(TInt count = 0; count < browseLogCount; 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; + } + } + +/** + * 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 ); + } +