diff -r d27dfa8884ad -r da2cedce4920 analyzetool/commandlineengine/src/CATMmp.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/analyzetool/commandlineengine/src/CATMmp.cpp Tue May 25 14:22:58 2010 +0300 @@ -0,0 +1,396 @@ +/* +* 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: Class responsible of handling mmp files. +* +*/ + + +#include "../inc/CATMmp.h" + +CATMmp::CATMmp() +{ + LOG_FUNC_ENTRY("CATMmp::CATMmp"); +} + +CATMmp::~CATMmp() +{ + LOG_FUNC_ENTRY("CATMmp::~CATMmp"); +} + +// ----------------------------------------------------------------------------- +// CATMmp::IsMmpEdited +// Checks is the file edited by AT +// ----------------------------------------------------------------------------- +bool CATMmp::IsMmpEdited( bool bBackup) +{ + LOG_FUNC_ENTRY("CATMmp::IsMmpEdited"); + // Stream to read file + ifstream in; + // Temp char array to read line + char cTemp[MAX_LINE_LENGTH]; + // Open file + if ( bBackup ) + in.open( CreateMmpBackupPath().c_str() ); + else + in.open( m_sMmpFile.c_str() ); + // Is file open ok + if( ! in.good() ) + { + cout << AT_MSG << "Error, can not open file " + << m_sMmpFile << endl; + in.close(); + return false; + } + // Search edit start line + bool bEdited=false; + const char* cFind = MMPFILECHANGES[0].c_str(); + while( ! bEdited && in.good() ) + { + // Get line + in.getline( cTemp, MAX_LINE_LENGTH ); + // Compare to first line in changes + if ( strstr( cTemp, cFind) ) + { + bEdited = true; + // Stop looking any further + break; + } + } + // Close file and return result + in.close(); + return bEdited; +} + +// ----------------------------------------------------------------------------- +// CATMmp::EditMmpFile +// Makes AnalyzeTool changes to given mmp file +// ----------------------------------------------------------------------------- +bool CATMmp::EditMmpFile(const string& sTargetType, const string& sId) +{ + LOG_FUNC_ENTRY("CATMmp::EditMmpFile"); + + if ( ! RemoveWriteProtections() ) + return false; + + // Stream where to add changes + ofstream out; + + // Open mmp file for editing (append changes to the end) + out.open( m_sMmpFile.c_str(), ios::out | ios::app ); + + // File open ok? + if( !out.good() ) + { + cout << AT_MSG << "Error, can not open file " + << m_sMmpFile; + out.close(); + return false; + } + + // Write lines to mmp file + if ( sTargetType.compare( "dll" ) == 0 || sTargetType.compare( "lib" ) == 0 ) + { + // DLL changes + int size = sizeof( MMPFILECHANGES_DLL ) / sizeof( string ); + for( int i = 0; i < size; i++ ) + { + out << endl << MMPFILECHANGES_DLL[i]; + } + out << endl; + } + else + { + // Other than DLL changes + int size = sizeof( MMPFILECHANGES ) / sizeof( string ); + for( int i = 0; i < size; i++ ) + { + // After second line of changes add also source statement + out << endl << MMPFILECHANGES[i]; + if ( i == 1 ) + { + out << endl + << "SOURCE " + << AT_TEMP_CPP_LOWER_START + << sId + << AT_TEMP_CPP_LOWER_END; + } + } + out << endl; + } + // Close stream + out.close(); + + cout << AT_MSG << "Mmp file : " << m_sMmpFile << " edited." << endl; + + return true; +} + +// ----------------------------------------------------------------------------- +// CATMmp::BackupMmpFile +// Backups the mmp file to path/atool_temp/filename.mmp.tmp +// Calling this function results always to +// - none edited mmp +// - none edited backup +// - If mmp is write protected. Create writable copy from it. Backup the write +// procted one. +// ----------------------------------------------------------------------------- +bool CATMmp::BackupMmpFile( ) +{ + LOG_FUNC_ENTRY("CATMmp::BackupMmpFile"); + + if ( ! RemoveWriteProtections() ) + return false; + + // Backup path+filename + string sBackup = CreateMmpBackupPath(); + + // Backup mmp. + if ( CopyFile( m_sMmpFile.c_str() , sBackup.c_str(), false ) == 0 ) + { + // Log and return false if failed to copy file + LOG_STRING( "error copyfile " << m_sMmpFile << " to " << sBackup ); + return false; + } + + // If backup now edited remove changes from it. + if ( IsMmpEdited( true ) ) + { + if ( ! RemoveMmpFileChanges( true ) ) + return false; + } + + return true; +} +// ----------------------------------------------------------------------------- +// CATMmp::RestoreMmpFile +// Restores the mmp file from backup +// ----------------------------------------------------------------------------- +bool CATMmp::RestoreMmpFile() +{ + LOG_FUNC_ENTRY("CATMmp::RestoreMmpFile"); + + if ( ! RemoveWriteProtections() ) + return false; + + if ( CopyFile( CreateMmpBackupPath().c_str() , m_sMmpFile.c_str(), false ) == 0 ) + { + // Log and return false if failed to copy file + LOG_STRING("error copyfile " << CreateMmpBackupPath() << " to " << m_sMmpFile ); + return false; + } + else + cout << AT_MSG << "Mmp file : " << m_sMmpFile << " restored." << endl; + return true; +} + +// ----------------------------------------------------------------------------- +// CATMmp::RemoveMmpFileChanges +// Removes AT changes from given mmp file +// ----------------------------------------------------------------------------- +bool CATMmp::RemoveMmpFileChanges(bool bBackup) +{ + LOG_FUNC_ENTRY("CATMmp::RemoveMmpFileChanges"); + + if ( ! RemoveWriteProtections() ) + return false; + + // File reading stream + ifstream in; + // Vector to hold file data + vector vLines; + // Open file + if ( bBackup ) + in.open( CreateMmpBackupPath().c_str(), ios::in ); + else + in.open( m_sMmpFile.c_str(), ios::in ); + // Check file open ok + if ( ! in.good() ) + { + cout << AT_MSG << "Error, opening file"; + if ( bBackup ) + cout << CreateMmpBackupPath(); + else + cout << m_sMmpFile; + cout << endl; + return false; + } + // Read file to temporary stream except AT changes + char cLine[MAX_LINE_LENGTH]; + // Boolean to know read or not + bool bRead = true; + // Integer to confirm that AT changes were succefully found and + // not read even if they are found multiple times + int iSuccessfull = 0; + // Number of 'lines' in mmp changes + int iChangesSize = sizeof( MMPFILECHANGES ) / sizeof( string ); + // First mmp changes line + string sFirstLine = MMPFILECHANGES[0]; + // Last mmp changes line + string sLastLine = MMPFILECHANGES[iChangesSize-1]; + while( in.good() ) + { + in.getline( cLine, MAX_LINE_LENGTH ); + // Check start of AT changes + if( strstr( cLine, sFirstLine.c_str() ) != 0 ) + { + // Remove last linefeed + vector::iterator it = vLines.end(); + it--; + if ( it->size() == 0 ) + vLines.erase( vLines.end()-1, vLines.end() ); + // Stop reading + bRead = false; + iSuccessfull+=3; + } + // Read lines outside AT changes + if ( bRead ) + { + // Gather all other lines except the AT edits + vLines.push_back( string(cLine) ); + } + // Check end of AT changes + if( strstr( cLine, sLastLine.c_str() ) != 0 ) + { + // Get empty line + in.getline( cLine, MAX_LINE_LENGTH ); + // Continue reading + bRead = true; + iSuccessfull-=1; + } + } + // Close reading file stream + in.close(); + // To check all went ok iSuccesfull%2 = 0 + if ( iSuccessfull%2 != 0 && iSuccessfull >= 2 ) + { + cout << AT_MSG << "Error, removing mmp changes from "; + if ( bBackup ) + cout << CreateMmpBackupPath(); + else + cout << m_sMmpFile; + cout << endl; + return false; + } + // Overwrite current mmp file + ofstream out; + // Open file (truncates old data) + if ( bBackup ) + out.open( CreateMmpBackupPath().c_str(), ios::trunc ); + else + out.open( m_sMmpFile.c_str(), ios::trunc ); + // Is open ok + if( ! out.good() ) + { + cout << AT_MSG << "Error, opening file "; + if ( bBackup ) + cout << CreateMmpBackupPath(); + else + cout << m_sMmpFile; + cout << endl; + } + // Write lines to file + for( vector::iterator it = vLines.begin() ; it != vLines.end() ; it++ ) + { + out << *it << endl; + } + // Close + out.close(); + // Return true + return true; +} +// ----------------------------------------------------------------------------- +// CATMmp::VerifyAndRecover +// Wont change mmp if it is not edited +// Replaces mmp file using backup if it exists and it is +// not edited otherwise removes changes from mmp file. +// ----------------------------------------------------------------------------- +bool CATMmp::VerifyAndRecover() +{ + LOG_FUNC_ENTRY("CATMmp::VerifyAndRecover"); + // Is it edited + if ( IsMmpEdited() ) + { + string sBackup = CreateMmpBackupPath(); + if ( FileExists( sBackup.c_str() ) ) + { + // Is backup edited + if ( ! IsMmpEdited( true ) ) + { + // Replace original with backup + return RestoreMmpFile(); + } + } + // Remove changes from original + return RemoveMmpFileChanges(); + } + // Non edited original + return true; +} + +// ----------------------------------------------------------------------------- +// CATMmp::CreateMmpBackupPath +// Creates string containing full path to backup mmp file +// ----------------------------------------------------------------------------- +string CATMmp::CreateMmpBackupPath() +{ + LOG_FUNC_ENTRY("CATMmp::CreateMmpBackupPath"); + // backup path+filename + string sBackup; + sBackup.append( GetPathOrFileName( false, m_sMmpFile ) ); + sBackup.append( AT_TEMP_DIR ); + sBackup.append( "\\" ); + // Add mmp file name to it and .tmp + sBackup.append( GetPathOrFileName( true, m_sMmpFile ) ); + // Add .tmp + sBackup.append( ".tmp" ); + // Return it + return sBackup; +} + +// ----------------------------------------------------------------------------- +// CATMmp::RemoveWriteProtections +// Removes write protection of mmp file and backup if exists. +// ----------------------------------------------------------------------------- +bool CATMmp::RemoveWriteProtections() +{ + LOG_LOW_FUNC_ENTRY("CATMmp::RemoveWriteProtections"); + + // Backup path+filename + string sBackup = CreateMmpBackupPath(); + + // Check is mmp read-only + if ( IsFileReadOnly( m_sMmpFile.c_str() ) ) + { + if( ! SetFileWritable( m_sMmpFile.c_str() ) ) + { + LOG_STRING( "error setting mmp file writable" << m_sMmpFile ); + return false; + } + } + + // Check is there a backup if is remove any write protection from it. + if ( FileExists( sBackup.c_str() ) ) + { + if ( IsFileReadOnly( sBackup.c_str() ) ) + { + if( ! SetFileWritable( sBackup.c_str() ) ) + { + LOG_STRING( "error setting mmp file writable" << sBackup ); + return false; + } + } + } + return true; +} +// End of file