OLD | NEW |
1 #include <stdexcept> | 1 #include <stdexcept> |
2 #include <functional> | 2 #include <functional> |
3 #include <wctype.h> | 3 #include <wctype.h> |
4 // <thread> is C++11, but implemented in VS2012 | 4 // <thread> is C++11, but implemented in VS2012 |
5 #include <thread> | 5 #include <thread> |
6 | 6 |
7 #include "installer-lib.h" | 7 #include "installer-lib.h" |
8 #include "process.h" | 8 #include "process.h" |
9 | 9 |
10 //------------------------------------------------------- | 10 //------------------------------------------------------- |
11 // process_by_name_CI | |
12 //------------------------------------------------------- | |
13 process_by_name_CI::process_by_name_CI( const wchar_t * name ) | |
14 : name( name ), length( wcslen( name ) ) | |
15 {} | |
16 | |
17 bool process_by_name_CI::operator()( const PROCESSENTRY32W & process ) | |
18 { | |
19 return 0 == wcsncmpi( process.szExeFile, name, length ) ; | |
20 } | |
21 | |
22 //------------------------------------------------------- | |
23 // process_by_any_exe_name_CI | |
24 //------------------------------------------------------- | |
25 bool process_by_any_exe_name_CI::operator()( const PROCESSENTRY32W & process ) | |
26 { | |
27 return names.find( process.szExeFile ) != names.end() ; | |
28 } | |
29 | |
30 //------------------------------------------------------- | |
31 // wcscmpi | |
32 //------------------------------------------------------- | |
33 int wcscmpi( const wchar_t * s1, const wchar_t * s2 ) | |
34 { | |
35 // Note: Equality of character sequences is case-insensitive in all predicates
below. | |
36 // Loop invariant: s1[0..j) == s2[0..j) | |
37 const size_t LIMIT( 65535 ) ; // Runaway limit of 2^16 - 1 should be acceptabl
y long. | |
38 for ( size_t j = 0 ; j < LIMIT ; ++j ) | |
39 { | |
40 wchar_t c1 = towupper( *s1++ ) ; | |
41 wchar_t c2 = towupper( *s2++ ) ; | |
42 if ( c1 != c2 ) | |
43 { | |
44 // Map to -1/+1 because c2 - c1 may not fit into an 'int'. | |
45 return ( c1 < c2 ) ? -1 : 1 ; | |
46 } | |
47 else | |
48 { | |
49 if ( c1 == L'\0' ) | |
50 { | |
51 // Assert length( s1 ) == length( s2 ) == j | |
52 // Assert strings are equal at length < n | |
53 return 0 ; | |
54 } | |
55 } | |
56 } | |
57 // Assert j == LIMIT | |
58 // Assert s1[0..LIMIT) == s2[0..LIMIT) | |
59 // Both strings are longer than 64K, which violates the precondition | |
60 throw std::runtime_error( "String arguments too long for wcscmpi" ) ; | |
61 } | |
62 | |
63 //------------------------------------------------------- | |
64 // wcsncmpi | |
65 //------------------------------------------------------- | |
66 int wcsncmpi( const wchar_t * s1, const wchar_t * s2, unsigned int n ) | |
67 { | |
68 // Note: Equality of character sequences is case-insensitive in all predicates
below. | |
69 // Loop invariant: s1[0..j) == s2[0..j) | |
70 for ( unsigned int j = 0 ; j < n ; ++j ) | |
71 { | |
72 wchar_t c1 = towupper( *s1++ ) ; | |
73 wchar_t c2 = towupper( *s2++ ) ; | |
74 if ( c1 != c2 ) | |
75 { | |
76 // Map to -1/+1 because c2 - c1 may not fit into an 'int'. | |
77 return ( c1 < c2 ) ? -1 : 1 ; | |
78 } | |
79 else | |
80 { | |
81 if ( c1 == L'\0' ) | |
82 { | |
83 // Assert length( s1 ) == length( s2 ) == j | |
84 // Assert strings are equal at length < n | |
85 return 0 ; | |
86 } | |
87 } | |
88 } | |
89 // Assert j == n | |
90 // Assert s1[0..n) == s2[0..n) | |
91 // The semantics of n-compare ignore everything after the first 'n' characters
. | |
92 return 0 ; | |
93 } | |
94 | |
95 //------------------------------------------------------- | |
96 // creator_process | 11 // creator_process |
97 //------------------------------------------------------- | 12 //------------------------------------------------------- |
98 DWORD creator_process( HWND window ) | 13 DWORD creator_process( HWND window ) |
99 { | 14 { |
100 DWORD pid ; | 15 DWORD pid ; |
101 DWORD r = GetWindowThreadProcessId( window, & pid ) ; | 16 DWORD r = GetWindowThreadProcessId( window, & pid ) ; |
102 if ( r == 0 ) | 17 if ( r == 0 ) |
103 { | 18 { |
104 // Assert GetWindowThreadProcessId returned an error | 19 // Assert GetWindowThreadProcessId returned an error |
105 // If the window handle is invalid, we end up here. | 20 // If the window handle is invalid, we end up here. |
(...skipping 19 matching lines...) Expand all Loading... |
125 PROCESSENTRY32W * Snapshot::next() | 40 PROCESSENTRY32W * Snapshot::next() |
126 { | 41 { |
127 return ::Process32NextW( handle, & process ) ? ( & process ) : 0 ; | 42 return ::Process32NextW( handle, & process ) ? ( & process ) : 0 ; |
128 } | 43 } |
129 | 44 |
130 void Snapshot::refresh() | 45 void Snapshot::refresh() |
131 { | 46 { |
132 handle = ::CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ) ; | 47 handle = ::CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ) ; |
133 } | 48 } |
134 | 49 |
135 | |
136 //------------------------------------------------------- | 50 //------------------------------------------------------- |
137 // send_message, send_endsession_messages | 51 // send_message, send_endsession_messages |
138 //------------------------------------------------------- | 52 //------------------------------------------------------- |
139 /** | 53 /** |
140 * Default process exit wait time (per message) 5000 ms | 54 * Default process exit wait time (per message) 5000 ms |
141 * | 55 * |
142 * 5 seconds is time that the system will wait before it considers a process non
-responsive. | 56 * 5 seconds is time that the system will wait before it considers a process non
-responsive. |
143 */ | 57 */ |
144 static const unsigned int timeout = 5000 ; // milliseconds | 58 static const unsigned int timeout = 5000 ; // milliseconds |
145 | 59 |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 if ( ! is_running() ) | 293 if ( ! is_running() ) |
380 { | 294 { |
381 return true ; | 295 return true ; |
382 } | 296 } |
383 } | 297 } |
384 // Assert is_running() | 298 // Assert is_running() |
385 } | 299 } |
386 // No control path leaves the for-loop. | 300 // No control path leaves the for-loop. |
387 } ; | 301 } ; |
388 | 302 |
OLD | NEW |