| //===-- MICmnLogMediumFile.cpp ----------------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| // In-house headers: |
| #include "MICmnLogMediumFile.h" |
| #include "MICmnResources.h" |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: CMICmnLogMediumFile constructor. |
| // Type: Method. |
| // Args: None. |
| // Return: None. |
| // Throws: None. |
| //-- |
| CMICmnLogMediumFile::CMICmnLogMediumFile() |
| : m_constThisMediumName(MIRSRC(IDS_MEDIUMFILE_NAME)), |
| m_constMediumFileNameFormat("lldb-mi-%s.log"), |
| m_strMediumFileName(MIRSRC(IDS_MEDIUMFILE_ERR_INVALID_PATH)), |
| m_strMediumFileDirectory("."), |
| m_fileNamePath(MIRSRC(IDS_MEDIUMFILE_ERR_INVALID_PATH)), |
| m_eVerbosityType(CMICmnLog::eLogVerbosity_Log), |
| m_strDate(CMIUtilDateTimeStd().GetDate()), |
| m_fileHeaderTxt(MIRSRC(IDS_MEDIUMFILE_ERR_FILE_HEADER)) {} |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: CMICmnLogMediumFile destructor. |
| // Type: Overridden. |
| // Args: None. |
| // Return: None. |
| // Throws: None. |
| //-- |
| CMICmnLogMediumFile::~CMICmnLogMediumFile() {} |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Get the singleton instance of *this class. |
| // Type: Static. |
| // Args: None. |
| // Return: CMICmnLogMediumFile - Reference to *this object. |
| // Throws: None. |
| //-- |
| CMICmnLogMediumFile &CMICmnLogMediumFile::Instance() { |
| static CMICmnLogMediumFile instance; |
| |
| return instance; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Initialize setup *this medium ready for use. |
| // Type: Overridden. |
| // Args: None. |
| // Return: MIstatus::success - Functional succeeded. |
| // MIstatus::failure - Functional failed. |
| // Throws: None. |
| //-- |
| bool CMICmnLogMediumFile::Initialize() { |
| m_bInitialized = true; |
| return FileFormFileNamePath(); |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Unbind detach or release resources used by *this medium. |
| // Type: Method. |
| // Args: None. |
| // Return: None. |
| // Throws: None. |
| //-- |
| bool CMICmnLogMediumFile::Shutdown() { |
| if (m_bInitialized) { |
| m_bInitialized = false; |
| m_file.Close(); |
| } |
| return MIstatus::success; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Retrieve the name of *this medium. |
| // Type: Overridden. |
| // Args: None. |
| // Return: CMIUtilString - Text data. |
| // Throws: None. |
| //-- |
| const CMIUtilString &CMICmnLogMediumFile::GetName() const { |
| return m_constThisMediumName; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: The callee client calls the write function on the Logger. The data |
| // to be |
| // written is given out to all the mediums registered. The verbosity |
| // type parameter |
| // indicates to the medium the type of data or message given to it. The |
| // medium has |
| // modes of verbosity and depending on the verbosity set determines |
| // which data is |
| // sent to the medium's output. |
| // Type: Method. |
| // Args: vData - (R) The data to write to the logger. |
| // veType - (R) Verbosity type. |
| // Return: MIstatus::success - Functional succeeded. |
| // MIstatus::failure - Functional failed. |
| // Throws: None. |
| //-- |
| bool CMICmnLogMediumFile::Write(const CMIUtilString &vData, |
| const CMICmnLog::ELogVerbosity veType) { |
| if (m_bInitialized && m_file.IsOk()) { |
| const bool bDoWrite = (m_eVerbosityType & veType); |
| if (bDoWrite) { |
| bool bNewCreated = false; |
| bool bOk = m_file.CreateWrite(m_fileNamePath, bNewCreated); |
| if (bOk) { |
| if (bNewCreated) |
| bOk = FileWriteHeader(); |
| bOk = bOk && FileWriteEnglish(MassagedData(vData, veType)); |
| } |
| return bOk; |
| } |
| } |
| |
| return MIstatus::failure; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Retrieve *this medium's last error condition. |
| // Type: Method. |
| // Args: None. |
| // Return: CString & - Text description. |
| // Throws: None. |
| //-- |
| const CMIUtilString &CMICmnLogMediumFile::GetError() const { |
| return m_strMILastErrorDescription; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Set the verbosity mode for this medium. |
| // Type: Method. |
| // Args: veType - (R) Mask value. |
| // Return: MIstatus::success - Functional succeeded. |
| // MIstatus::failure - Functional failed. |
| // Throws: None. |
| //-- |
| bool CMICmnLogMediumFile::SetVerbosity(const MIuint veType) { |
| m_eVerbosityType = veType; |
| return MIstatus::success; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Get the verbosity mode for this medium. |
| // Type: Method. |
| // Args: veType - (R) Mask value. |
| // Return: CMICmnLog::ELogVerbosity - Mask value. |
| // Throws: None. |
| //-- |
| MIuint CMICmnLogMediumFile::GetVerbosity() const { return m_eVerbosityType; } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Write data to a file English font. |
| // Type: Method. |
| // Args: vData - (R) The data to write to the logger. |
| // Return: None. |
| // Throws: None. |
| //-- |
| bool CMICmnLogMediumFile::FileWriteEnglish(const CMIUtilString &vData) { |
| return m_file.Write(vData); |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Determine and form the medium file's directory path and name. |
| // Type: Method. |
| // Args: None. |
| // Return: MIstatus::success - Functional succeeded. |
| // MIstatus::failure - Functional failed. |
| // Throws: None. |
| //-- |
| bool CMICmnLogMediumFile::FileFormFileNamePath() { |
| ClrErrorDescription(); |
| |
| m_fileNamePath = MIRSRC(IDS_MEDIUMFILE_ERR_INVALID_PATH); |
| |
| CMIUtilDateTimeStd date; |
| m_strMediumFileName = |
| CMIUtilString::Format(m_constMediumFileNameFormat.c_str(), |
| date.GetDateTimeLogFilename().c_str()); |
| |
| #if defined(_MSC_VER) |
| m_fileNamePath = CMIUtilString::Format( |
| "%s\\%s", m_strMediumFileDirectory.c_str(), m_strMediumFileName.c_str()); |
| #else |
| m_fileNamePath = CMIUtilString::Format( |
| "%s/%s", m_strMediumFileDirectory.c_str(), m_strMediumFileName.c_str()); |
| #endif // defined ( _MSC_VER ) |
| |
| return MIstatus::success; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Retrieve the medium file's directory path and name. |
| // Type: Method. |
| // Args: None. |
| // Return: CMIUtilString & - File path. |
| // Throws: None. |
| //-- |
| const CMIUtilString &CMICmnLogMediumFile::GetFileNamePath() const { |
| return m_fileNamePath; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Retrieve the medium file's name. |
| // Type: Method. |
| // Args: None. |
| // Return: CMIUtilString & - File name. |
| // Throws: None. |
| //-- |
| const CMIUtilString &CMICmnLogMediumFile::GetFileName() const { |
| return m_strMediumFileName; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Massage the data to behave correct when submitted to file. Insert |
| // extra log |
| // specific text. The veType is there to allow in the future to parse |
| // the log and |
| // filter in out specific types of message to make viewing the log more |
| // manageable. |
| // Type: Method. |
| // Args: vData - (R) Raw data. |
| // veType - (R) Message type. |
| // Return: CMIUtilString - Massaged data. |
| // Throws: None. |
| //-- |
| CMIUtilString |
| CMICmnLogMediumFile::MassagedData(const CMIUtilString &vData, |
| const CMICmnLog::ELogVerbosity veType) { |
| const CMIUtilString strCr("\n"); |
| CMIUtilString data; |
| const char verbosityCode(ConvertLogVerbosityTypeToId(veType)); |
| const CMIUtilString dt(CMIUtilString::Format("%s %s", m_strDate.c_str(), |
| m_dateTime.GetTime().c_str())); |
| |
| data = CMIUtilString::Format("%c,%s,%s", verbosityCode, dt.c_str(), |
| vData.c_str()); |
| data = ConvertCr(data); |
| |
| // Look for EOL... |
| const size_t pos = vData.rfind(strCr); |
| if (pos == vData.size()) |
| return data; |
| |
| // ... did not have an EOL so add one |
| data += GetLineReturn(); |
| |
| return data; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Convert the Log's verbosity type number into a single char |
| // character. |
| // Type: Method. |
| // Args: veType - (R) Message type. |
| // Return: wchar_t - A letter. |
| // Throws: None. |
| //-- |
| char CMICmnLogMediumFile::ConvertLogVerbosityTypeToId( |
| const CMICmnLog::ELogVerbosity veType) const { |
| char c = 0; |
| if (veType != 0) { |
| MIuint cnt = 0; |
| MIuint number(veType); |
| while (1 != number) { |
| number = number >> 1; |
| ++cnt; |
| } |
| c = 'A' + cnt; |
| } else { |
| c = '*'; |
| } |
| |
| return c; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Retrieve state of whether the file medium is ok. |
| // Type: Method. |
| // Args: None. |
| // Return: True - file ok. |
| // False - file has a problem. |
| // Throws: None. |
| //-- |
| bool CMICmnLogMediumFile::IsOk() const { return m_file.IsOk(); } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Status on the file log medium existing already. |
| // Type: Method. |
| // Args: None. |
| // Return: True - Exists. |
| // False - Not found. |
| // Throws: None. |
| //-- |
| bool CMICmnLogMediumFile::IsFileExist() const { |
| return m_file.IsFileExist(GetFileNamePath()); |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Write the header text the logger file. |
| // Type: Method. |
| // Args: vText - (R) Text. |
| // Return: MIstatus::success - Functional succeeded. |
| // MIstatus::failure - Functional failed. |
| // Throws: None. |
| //-- |
| bool CMICmnLogMediumFile::FileWriteHeader() { |
| return FileWriteEnglish(ConvertCr(m_fileHeaderTxt)); |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Convert any carriage line returns to be compatible with the platform |
| // the |
| // Log file is being written to. |
| // Type: Method. |
| // Args: vData - (R) Text data. |
| // Return: CMIUtilString - Converted string data. |
| // Throws: None. |
| //-- |
| CMIUtilString CMICmnLogMediumFile::ConvertCr(const CMIUtilString &vData) const { |
| const CMIUtilString strCr("\n"); |
| const CMIUtilString &rCrCmpat(GetLineReturn()); |
| |
| if (strCr == rCrCmpat) |
| return vData; |
| |
| const size_t nSizeCmpat(rCrCmpat.size()); |
| const size_t nSize(strCr.size()); |
| CMIUtilString strConv(vData); |
| size_t pos = strConv.find(strCr); |
| while (pos != CMIUtilString::npos) { |
| strConv.replace(pos, nSize, rCrCmpat); |
| pos = strConv.find(strCr, pos + nSizeCmpat); |
| } |
| |
| return strConv; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Set the header text that is written to the logger file at the |
| // beginning. |
| // Type: Method. |
| // Args: vText - (R) Text. |
| // Return: MIstatus::success - Functional succeeded. |
| // MIstatus::failure - Functional failed. |
| // Throws: None. |
| //-- |
| bool CMICmnLogMediumFile::SetHeaderTxt(const CMIUtilString &vText) { |
| m_fileHeaderTxt = vText; |
| |
| return MIstatus::success; |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Retrieve the file current carriage line return characters used. |
| // Type: Method. |
| // Args: None. |
| // Return: CMIUtilString & - Text. |
| // Throws: None. |
| //-- |
| const CMIUtilString &CMICmnLogMediumFile::GetLineReturn() const { |
| return m_file.GetLineReturn(); |
| } |
| |
| //++ |
| //------------------------------------------------------------------------------------ |
| // Details: Set the directory to place the log file. |
| // Type: Method. |
| // Args: vPath - (R) Path to log. |
| // Return: MIstatus::success - Functional succeeded. |
| // MIstatus::failure - Functional failed. |
| // Throws: None. |
| //-- |
| bool CMICmnLogMediumFile::SetDirectory(const CMIUtilString &vPath) { |
| m_strMediumFileDirectory = vPath; |
| |
| return FileFormFileNamePath(); |
| } |