summaryrefslogtreecommitdiff
path: root/contrib/llvm-project/lldb/tools/lldb-mi/MICmnLogMediumFile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/lldb/tools/lldb-mi/MICmnLogMediumFile.cpp')
-rw-r--r--contrib/llvm-project/lldb/tools/lldb-mi/MICmnLogMediumFile.cpp385
1 files changed, 385 insertions, 0 deletions
diff --git a/contrib/llvm-project/lldb/tools/lldb-mi/MICmnLogMediumFile.cpp b/contrib/llvm-project/lldb/tools/lldb-mi/MICmnLogMediumFile.cpp
new file mode 100644
index 000000000000..7fbe28f3fe0f
--- /dev/null
+++ b/contrib/llvm-project/lldb/tools/lldb-mi/MICmnLogMediumFile.cpp
@@ -0,0 +1,385 @@
+//===-- MICmnLogMediumFile.cpp ----------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// 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();
+}