summaryrefslogtreecommitdiffstats
path: root/lldb/tools/lldb-mi/MIUtilSystemWindows.cpp
blob: 5873aad0ec62e781ceeab327a22698bc4ff604cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
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 )
OpenPOWER on IntegriCloud