diff options
Diffstat (limited to 'tools/lldb-mi/MIUtilSystemWindows.cpp')
-rw-r--r-- | tools/lldb-mi/MIUtilSystemWindows.cpp | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/tools/lldb-mi/MIUtilSystemWindows.cpp b/tools/lldb-mi/MIUtilSystemWindows.cpp new file mode 100644 index 000000000000..5873aad0ec62 --- /dev/null +++ b/tools/lldb-mi/MIUtilSystemWindows.cpp @@ -0,0 +1,151 @@ +//===-- MIUtilSystemWindows.cpp ---------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +//++ +// File: MIUtilSystemWindows.cpp +// +// Overview: CMIUtilSystemWindows implementation. +// +// Environment: Compilers: Visual C++ 12. +// gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1 +// Libraries: See MIReadmetxt. +// +// Copyright: None. +//-- + +#if defined( _MSC_VER ) + +// Third party headers +#include <memory> // std::unique_ptr +#include <Windows.h> +#include <WinBase.h> // ::FormatMessage() + +// In-house headers: +#include "MIUtilSystemWindows.h" +#include "MICmnResources.h" + +//++ ------------------------------------------------------------------------------------ +// Details: CMIUtilSystemWindows constructor. +// Type: Method. +// Args: None. +// Return: None. +// Throws: None. +//-- +CMIUtilSystemWindows::CMIUtilSystemWindows( void ) +{ +} + +//++ ------------------------------------------------------------------------------------ +// Details: CMIUtilSystemWindows destructor. +// Type: Method. +// Args: None. +// Return: None. +// Throws: None. +//-- +CMIUtilSystemWindows::~CMIUtilSystemWindows( void ) +{ +} + +//++ ------------------------------------------------------------------------------------ +// Details: Retrieve the OS system error message for the given system error code. +// Type: Method. +// Args: vError - (R) OS error code value. +// vrwErrorMsg - (W) The error message. +// Return: MIstatus::success - Functional succeeded. +// MIstatus::failure - Functional failed. +// Throws: None. +//-- +bool CMIUtilSystemWindows::GetOSErrorMsg( const MIint vError, CMIUtilString & vrwErrorMsg ) const +{ + // Reset + vrwErrorMsg.clear(); + + const MIuint nBufLen = 1024; + std::unique_ptr< char[] > pBuffer; + pBuffer.reset( new char[ nBufLen ] ); + + // CMIUtilString Format is not used as cannot replicate the behavior of ::FormatMessage which + // can take into account locality while retrieving the error message from the system. + const int nLength = ::FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + nullptr, (DWORD) vError, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), + reinterpret_cast< LPTSTR >( &pBuffer[ 0 ] ), + nBufLen, nullptr ); + bool bOk = MIstatus::success; + if( nLength != 0 ) + vrwErrorMsg = &pBuffer[ 0 ]; + else + bOk = MIstatus::failure; + + return bOk; +} + +//++ ------------------------------------------------------------------------------------ +// Details: Retrieve if possible the OS last error description. +// Type: Method. +// Args: None. +// Return: CMIUtilString - Error description. +// Throws: None. +//-- +CMIUtilString CMIUtilSystemWindows::GetOSLastError( void ) const +{ + CMIUtilString errorMsg; + const DWORD dwLastError = ::GetLastError(); + if( dwLastError != 0 ) + { + if( !GetOSErrorMsg( dwLastError, errorMsg ) ) + errorMsg = MIRSRC( IDE_OS_ERR_RETRIEVING ); + } + else + errorMsg = MIRSRC( IDE_OS_ERR_UNKNOWN ); + + return errorMsg; +} + +//++ ------------------------------------------------------------------------------------ +// Details: Retrieves the fully qualified path for the this application. If the function +// fails the string is filled with the error message. +// Type: Method. +// Args: vrwFileNamePath - (W) The excutable's name and path or last error description. +// Return: MIstatus::success - Functional succeeded. +// MIstatus::failure - Functional failed. +// Throws: None. +//-- +bool CMIUtilSystemWindows::GetExecutablesPath( CMIUtilString & vrwFileNamePath ) const +{ + bool bOk = MIstatus::success; + HMODULE hModule = ::GetModuleHandle( nullptr ); + char pPath[ MAX_PATH ]; + const DWORD nLen = ::GetModuleFileName( hModule, &pPath[ 0 ], MAX_PATH ); + const CMIUtilString strLastErr( GetOSLastError() ); + if( (nLen != 0) && (strLastErr == "Unknown OS error") ) + vrwFileNamePath = &pPath[ 0 ]; + else + { + bOk = MIstatus::failure; + vrwFileNamePath = strLastErr; + } + + return bOk; +} + +//++ ------------------------------------------------------------------------------------ +// Details: Retrieves the fully qualified path for the Log file for this application. +// If the function fails the string is filled with the error message. +// Type: Method. +// Args: vrwFileNamePath - (W) The Log file's name and path or last error description. +// Return: MIstatus::success - Functional succeeded. +// MIstatus::failure - Functional failed. +// Throws: None. +//-- +bool CMIUtilSystemWindows::GetLogFilesPath( CMIUtilString & vrwFileNamePath ) const +{ + return GetExecutablesPath( vrwFileNamePath ); +} + +#endif // #if defined( _MSC_VER ) |