//===-- MICmnBase.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
//
//===----------------------------------------------------------------------===//

// Third party headers
#include <stdarg.h>

// In-house headers:
#include "MICmnBase.h"
#include "MICmnLog.h"
#include "MICmnStreamStderr.h"

//++
// Details: CMICmnBase constructor.
// Type:    Method.
// Args:    None.
// Return:  None.
// Throws:  None.
//--
CMICmnBase::CMICmnBase()
    : m_strMILastErrorDescription(CMIUtilString()), m_bInitialized(false),
      m_pLog(&CMICmnLog::Instance()), m_clientUsageRefCnt(0) {}

//++
// Details: CMICmnBase destructor.
// Type:    Overrideable.
// Args:    None.
// Return:  None.
// Throws:  None.
//--
CMICmnBase::~CMICmnBase() { m_pLog = NULL; }

//++
// Details: Retrieve whether *this object has an error description set.
// Type:    Method.
// Args:    None.
// Return:  bool    - True = Yes already defined, false = empty description.
// Throws:  None.
//--
bool CMICmnBase::HaveErrorDescription() const {
  return m_strMILastErrorDescription.empty();
}

//++
// Details: Retrieve MI's last error condition.
// Type:    Method.
// Args:    None.
// Return:  CMIUtilString & - Text description.
// Throws:  None.
//--
const CMIUtilString &CMICmnBase::GetErrorDescription() const {
  return m_strMILastErrorDescription;
}

//++
// Details: Set MI's error condition description. This may be accessed by
// clients and
//          seen by users.  Message is available to the client using the server
//          and sent
//          to the Logger.
// Type:    Method.
// Args:    vrTxt   - (R) Text description.
// Return:  None.
// Throws:  None.
//--
void CMICmnBase::SetErrorDescription(const CMIUtilString &vrTxt) const {
  m_strMILastErrorDescription = vrTxt;
  if (!vrTxt.empty()) {
    const CMIUtilString txt(CMIUtilString::Format("Error: %s", vrTxt.c_str()));
    CMICmnStreamStderr::Instance().Write(txt);
  }
}

//++
// Details: Set MI's error condition description. This may be accessed by
// clients and
//          seen by users.  Message is available to the client using the server
//          and sent
//          to the Logger.
// Type:    Method.
// Args:    vrTxt   - (R) Text description.
// Return:  None.
// Throws:  None.
//--
void CMICmnBase::SetErrorDescriptionNoLog(const CMIUtilString &vrTxt) const {
  m_strMILastErrorDescription = vrTxt;
}

//++
// Details: Clear MI's error condition description.
// Type:    Method.
// Args:    None.
// Return:  None.
// Throws:  None.
//--
void CMICmnBase::ClrErrorDescription() const {
  m_strMILastErrorDescription.clear();
}

//++
// Details: Set MI's error condition description. This may be accessed by
// clients and
//          seen by users. Message is available to the client using the server
//          and sent
//          to the Logger.
// Type:    Method.
// Args:    vFormat - (R) Format string.
//          ...     - (R) Variable number of CMIUtilString type objects.
// Return:  None.
// Throws:  None.
//--
void CMICmnBase::SetErrorDescriptionn(const char *vFormat, ...) const {
  va_list args;
  va_start(args, vFormat);
  CMIUtilString strResult = CMIUtilString::FormatValist(vFormat, args);
  va_end(args);

  SetErrorDescription(strResult);
}
