0027838: Foundation Classes - support wchar_t* input within TCollection_AsciiString...
[occt.git] / src / OSD / OSD_Process.cxx
CommitLineData
b311480e 1// Copyright (c) 1998-1999 Matra Datavision
973c2be1 2// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 3//
973c2be1 4// This file is part of Open CASCADE Technology software library.
b311480e 5//
d5f74e42 6// This library is free software; you can redistribute it and/or modify it under
7// the terms of the GNU Lesser General Public License version 2.1 as published
973c2be1 8// by the Free Software Foundation, with special exception defined in the file
9// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10// distribution for complete text of the license and disclaimer of any warranty.
b311480e 11//
973c2be1 12// Alternatively, this file may be used under the terms of Open CASCADE
13// commercial license or contractual agreement.
7fd59977 14
57c28b61 15#ifndef _WIN32
7fd59977 16
42cf5bc1 17
7fd59977 18#include <OSD_Environment.hxx>
42cf5bc1 19#include <OSD_OSDError.hxx>
20#include <OSD_Path.hxx>
21#include <OSD_Process.hxx>
22#include <OSD_WhoAmI.hxx>
23#include <Quantity_Date.hxx>
24#include <TCollection_AsciiString.hxx>
7fd59977 25
26const OSD_WhoAmI Iam = OSD_WProcess;
27
28#include <errno.h>
7fd59977 29#include <stdlib.h>
03155c18 30#include <sys/param.h>
31#include <sys/time.h>
32#include <pwd.h> // For command getpwuid
33#include <unistd.h>
7fd59977 34
35OSD_Process::OSD_Process(){
36}
37
38
98160038 39Standard_Integer OSD_Process::Spawn (const TCollection_AsciiString& cmd,
7fd59977 40 const Standard_Boolean /*ShowWindow*/)
41{
98160038 42 return system(cmd.ToCString());
7fd59977 43}
44
45
46void OSD_Process::TerminalType(TCollection_AsciiString& Name){
47TCollection_AsciiString which="TERM";
48OSD_Environment term (which,"");
49
50 term.Value();
51 which = term.Value();
52 Name = term.Name();
53}
54
55
56// Get date of system date
57
58Quantity_Date OSD_Process::SystemDate(){
59Quantity_Date result;
60Standard_Integer month=0,day=0,year=0,hh=0,mn=0,ss=0;
61struct tm transfert;
62struct timeval tval;
63struct timezone tzone;
64int status;
65
66 status = gettimeofday( &tval, &tzone );
67 if (status == -1) myError.SetValue (errno, Iam, "GetSystem");
68 else {
69 memcpy(&transfert, localtime((time_t *)&tval.tv_sec), sizeof(struct
70tm));
71 month = transfert.tm_mon + 1; // Add to January (month #1)
72 day = transfert.tm_mday;
73 year = transfert.tm_year;
74 hh = transfert.tm_hour;
75 mn = transfert.tm_min ;
76 ss = transfert.tm_sec ;
77}
78
79 result.SetValues ( month, day, year+1900, hh, mn, ss);
80 return (result);
81}
82
83
84Standard_Integer OSD_Process::ProcessId(){
85 return (getpid());
86}
87
7fd59977 88TCollection_AsciiString OSD_Process::UserName(){
89 struct passwd *infos;
90 infos = getpwuid(getuid());
91 TCollection_AsciiString result=infos->pw_name;
92
93 return(result);
94}
95
96Standard_Boolean OSD_Process::IsSuperUser (){
97 if (getuid()) {
98 return Standard_False;
99 }
100 else {
101 return Standard_True;
102 }
103}
104
105
106OSD_Path OSD_Process::CurrentDirectory(){
107char cwd[MAXPATHLEN+1] ;
108OSD_Path result;
109TCollection_AsciiString Name;
110
111 if (!getcwd(cwd,MAXPATHLEN+1))
112 myError.SetValue (errno, Iam, "Where");
113 else {
114 Name = cwd;
115
116// JPT : August,20 1993. This code has been replaced by #ifdef ... #endif
117// position = Name.SearchFromEnd(".");
118// if (position != -1){
119// Ext = Name;
120// Ext.Remove(1,position);
121// Name.Remove( position,Ext.Length()+1);
122// }
123// result.SetValues("","","","","",Name,Ext);
124// End
125
126#if defined(vax) || defined(__vms)
127 Standard_Integer iDisk = Name.Search(":");
128 if (iDisk){
129 TCollection_AsciiString Disk;
130 TCollection_AsciiString Directory;
131 Disk = Name.SubString(1,iDisk-1);
132 Directory = Name.SubString(iDisk+1,Name.Length());
133 result.SetValues("","","",Disk,Directory,"","");
134 }
135#else
136 Name += TCollection_AsciiString("/");
137 result = OSD_Path(Name);
138 // result.SetValues("","","","",Name,"","");
139#endif
140
141 }
142return (result);
143}
144
145
146void OSD_Process::SetCurrentDirectory(const OSD_Path& where){
147TCollection_AsciiString Name;
148int status;
149
150 where.SystemName(Name);
151
152 status = chdir (Name.ToCString());
153 if (status == -1) myError.SetValue(errno, Iam, "Move to directory");
154}
155
156
157void OSD_Process::Reset(){
158 myError.Reset();
159}
160
161Standard_Boolean OSD_Process::Failed()const{
162 return( myError.Failed());
163}
164
165void OSD_Process::Perror() {
166 myError.Perror();
167}
168
169
170Standard_Integer OSD_Process::Error()const{
171 return( myError.Error());
172}
173
174#else
175
176//------------------------------------------------------------------------
177//------------------- WNT Sources of OSD_Path ---------------------------
178//------------------------------------------------------------------------
179
180//it is important to undefine NOUSER and enforce including <windows.h> before
181//Standard_Macro.hxx defines it and includes <windows.h> causing compilation errors
182#ifdef NOUSER
183#undef NOUSER /* we need SW_HIDE from windows.h */
184#endif
185#include <windows.h>
186
187#ifdef SetCurrentDirectory
188# undef SetCurrentDirectory /* undefine SetCurrentDirectory from <winbase.h> to correctly include <OSD_Process.hxx> */
189#endif
190#include <OSD_Process.hxx>
191
192#include <OSD_Path.hxx>
193#include <Quantity_Date.hxx>
d9ff84e8 194#include <Standard_PExtCharacter.hxx>
195#include <TCollection_ExtendedString.hxx>
7fd59977 196
197#include <OSD_WNT_1.hxx>
198#include <LMCONS.H> /// pour UNLEN ( see MSDN about GetUserName() )
199
7c65581d 200#if defined(_MSC_VER)
201 #pragma warning( disable : 4700 )
202#endif
7fd59977 203
204void _osd_wnt_set_error ( OSD_Error&, OSD_WhoAmI, ... );
205
206OSD_Process :: OSD_Process () {
207
208} // end constructor
209
98160038 210
211Standard_Integer OSD_Process::Spawn (const TCollection_AsciiString& cmd,
7fd59977 212 const Standard_Boolean ShowWindow /* = Standard_True */) {
742cc8b0 213#ifndef OCCT_UWP
7fd59977 214 STARTUPINFO si;
215 PROCESS_INFORMATION pi;
98160038 216 DWORD aRes = 0;
7fd59977 217
218 ZeroMemory ( &si, sizeof ( STARTUPINFO ) );
219
220 si.cb = sizeof ( STARTUPINFO );
221 //============================================
222 //---> Added by Stephane Routelous ( stephane.routelous@altavista.net ) [16.03.01]
223 //---> Reason : to allow to hide the window
224 if ( !ShowWindow )
225 {
226 si.dwFlags = STARTF_USESHOWWINDOW;
227 si.wShowWindow = SW_HIDE;
228 }
229 //<--- End Added by Stephane Routelous ( stephane.routelous@altavista.net ) [16.03.01]
230 //============================================
231
232 if (!CreateProcess (
233 NULL, (char *)cmd.ToCString (), NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi
234 )
98160038 235 ) {
7fd59977 236
237 _osd_wnt_set_error ( myError, OSD_WProcess );
98160038 238 aRes = myError.Error();
239 }
7fd59977 240 else {
241
242 CloseHandle ( pi.hThread );
243
244 WaitForSingleObject ( pi.hProcess, INFINITE );
98160038 245 GetExitCodeProcess (pi.hProcess, &aRes);
7fd59977 246 CloseHandle ( pi.hProcess );
247
248 } // end else
249
98160038 250 return aRes;
742cc8b0 251#else
252 (void)cmd;
253 (void)ShowWindow;
254 return 0;
255#endif
7fd59977 256} // end OSD_Process :: Spawn
257
258void OSD_Process :: TerminalType ( TCollection_AsciiString& Name ) {
259
d9ff84e8 260 Name = "WIN32 console";
7fd59977 261
262} // end OSD_Process :: TerminalType
263
264Quantity_Date OSD_Process :: SystemDate () {
265
266 Quantity_Date retVal;
267 SYSTEMTIME st;
268
269 GetLocalTime ( &st );
270
271 retVal.SetValues (
272 st.wMonth, st.wDay, st.wYear, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds
273 );
274
275 return retVal;
276
277} // end OSD_Process :: SystemDate
278
7fd59977 279TCollection_AsciiString OSD_Process :: UserName ()
280{
742cc8b0 281#ifndef OCCT_UWP
7fd59977 282 Standard_PCharacter pBuff = new char[UNLEN + 1];
283 DWORD dwSize = UNLEN + 1;
284 TCollection_AsciiString retVal;
285 if ( !GetUserName ( pBuff, &dwSize ) )
286 {
287 _osd_wnt_set_error ( myError, OSD_WProcess );
288 }
289 else
290 {
291 TCollection_AsciiString theTmpUserName(pBuff,(int)dwSize -1 );
292 retVal = theTmpUserName;
293 }
294 delete [] pBuff;
295 return retVal;
742cc8b0 296#else
297 return "";
298#endif
7fd59977 299} // end OSD_Process :: UserName
300
301Standard_Boolean OSD_Process :: IsSuperUser () {
742cc8b0 302#ifndef OCCT_UWP
7fd59977 303 Standard_Boolean retVal = FALSE;
304 PSID pSIDadmin;
305 HANDLE hProcessToken = INVALID_HANDLE_VALUE;
302f96fb 306 PTOKEN_GROUPS pTKgroups = NULL;
7fd59977 307
308 if ( !OpenProcessToken (
309 GetCurrentProcess (),
310 TOKEN_QUERY, &hProcessToken
311 ) ||
312 ( pTKgroups = ( PTOKEN_GROUPS )GetTokenInformationEx (
313 hProcessToken, TokenGroups
314 )
315 ) == NULL
316 )
317
318 _osd_wnt_set_error ( myError, OSD_WProcess );
319
320 else {
321
322 pSIDadmin = AdminSid ();
323
324 for ( int i = 0; i < ( int )pTKgroups -> GroupCount; ++i )
325
326 if ( EqualSid ( pTKgroups -> Groups[ i ].Sid, pSIDadmin ) ) {
327
328 retVal = TRUE;
329 break;
330
331 } // end if
332
333 } // end else
334
335 if ( hProcessToken != INVALID_HANDLE_VALUE ) CloseHandle ( hProcessToken );
336 if ( pTKgroups != NULL ) FreeTokenInformation ( pTKgroups );
337
338 return retVal;
742cc8b0 339#else
340 return FALSE;
341#endif
7fd59977 342} // end OSD_Process :: IsSuperUser
343
344Standard_Integer OSD_Process :: ProcessId () {
345
346 return ( Standard_Integer )GetCurrentProcessId ();
347
348} // end OSD_Process :: ProcessId
349
350OSD_Path OSD_Process :: CurrentDirectory () {
a8195d65 351 OSD_Path anCurrentDirectory;
742cc8b0 352#ifndef OCCT_UWP
a8195d65 353 DWORD dwSize = PATHLEN + 1;
d9ff84e8 354 Standard_WideChar* pBuff = new wchar_t[dwSize];
7fd59977 355
fb0b0531 356 if (GetCurrentDirectoryW (dwSize, pBuff) > 0)
d9ff84e8 357 {
358 // conversion to UTF-8 is performed inside
fb0b0531 359 TCollection_AsciiString aPath (pBuff);
d9ff84e8 360 anCurrentDirectory = OSD_Path ( aPath );
361 }
a8195d65 362 else
363 _osd_wnt_set_error ( myError, OSD_WProcess );
7fd59977 364
a8195d65 365 delete[] pBuff;
742cc8b0 366#endif
a8195d65 367 return anCurrentDirectory;
7fd59977 368} // end OSD_Process :: CurrentDirectory
369
370void OSD_Process :: SetCurrentDirectory ( const OSD_Path& where ) {
371
7fd59977 372 TCollection_AsciiString path;
373
374 where.SystemName ( path );
d9ff84e8 375 TCollection_ExtendedString pathW(path);
7fd59977 376
fb0b0531 377 if (!::SetCurrentDirectoryW (pathW.ToWideString()))
7fd59977 378
379 _osd_wnt_set_error ( myError, OSD_WProcess );
380
381} // end OSD_Process :: SetCurrentDirectory
382
383Standard_Boolean OSD_Process :: Failed () const {
384
385 return myError.Failed ();
386
387} // end OSD_Process :: Failed
388
389void OSD_Process :: Reset () {
390
391 myError.Reset ();
392
393} // end OSD_Process :: Reset
394
395void OSD_Process :: Perror () {
396
397 myError.Perror ();
398
399} // end OSD_Process :: Perror
400
401Standard_Integer OSD_Process :: Error () const {
402
403 return myError.Error ();
404
405} // end OSD_Process :: Error
406
407#endif