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