utf: windows_tools 2
[scilab.git] / scilab / modules / windows_tools / src / cpp / scilab_windows / SetScilabEnvironmentVariables.cpp
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) INRIA - Allan CORNET
4 * Copyright (C) DIGITEO - 2010 - Allan CORNET
5 *
6 * This file must be used under the terms of the CeCILL.
7 * This source file is licensed as described in the file COPYING, which
8 * you should have received as part of this distribution.  The terms
9 * are also available at
10 * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
11 *
12 */
13
14 /*--------------------------------------------------------------------------*/
15 #include <windows.h>
16 #include <stdio.h>
17 extern "C"
18 {
19 #include "SetScilabEnvironmentVariables.h"
20 #include "PATH_MAX.h"
21 #include "sci_path.h"
22 #include "sci_malloc.h"
23 #include "getScilabDirectory.h"
24 #include "scilabDefaults.h"
25 #include "ConvertSlash.h"
26 #include "charEncoding.h"
27 #include "getshortpathname.h"
28 #include "stristr.h"
29 #include "strsubst.h"
30 #include "os_string.h"
31 }
32 /*--------------------------------------------------------------------------*/
33 static BOOL IsTheGoodShell(void);
34 static BOOL Set_Shell(void);
35 static BOOL Set_SCI_PATH(char *DefaultPath);
36 static BOOL Set_HOME_PATH(char *DefaultPath);
37 static BOOL AddScilabBinDirectoryToPATHEnvironnementVariable(char *DefaultPath);
38 static BOOL Set_SOME_ENVIRONMENTS_VARIABLES_FOR_SCILAB(void);
39 /*--------------------------------------------------------------------------*/
40 /**
41 * Set some environment variablesSCI, and some others
42 */
43 void SciEnvForWindows(void)
44 {
45     char *SCIPathName = getScilabDirectory(TRUE);
46
47     /* Correction Bug 1579 */
48     if (!IsTheGoodShell())
49     {
50         if ( (!Set_Shell()) || (!IsTheGoodShell()))
51         {
52             MessageBox(NULL,
53                        "Please modify ""ComSpec"" environment variable.\ncmd.exe on W2K and more.",
54                        "Warning", MB_ICONWARNING | MB_OK);
55         }
56     }
57
58     SetScilabEnvironmentVariables(SCIPathName);
59     if (SCIPathName)
60     {
61         FREE(SCIPathName);
62         SCIPathName = NULL;
63     }
64 }
65 /*--------------------------------------------------------------------------*/
66 /* set env variables (used when calling scilab from * other programs) */
67 void SetScilabEnvironmentVariables(char *DefaultSCIPATH)
68 {
69     if (DefaultSCIPATH)
70     {
71         Set_SCI_PATH(DefaultSCIPATH);
72         Set_HOME_PATH(DefaultSCIPATH);
73         Set_SOME_ENVIRONMENTS_VARIABLES_FOR_SCILAB();
74         AddScilabBinDirectoryToPATHEnvironnementVariable(DefaultSCIPATH);
75     }
76     else
77     {
78         /* Error */
79         exit(1);
80     }
81
82 }
83 /*--------------------------------------------------------------------------*/
84 BOOL Set_SCI_PATH(char *DefaultPath)
85 {
86     BOOL bOK = FALSE;
87     char *ShortPath = NULL;
88
89     /* to be sure that it's unix 8.3 format */
90     /* c:/progra~1/scilab-5.0 */
91     ShortPath = getshortpathname(DefaultPath, &bOK);
92     if (ShortPath)
93     {
94         char env[PATH_MAX + 1 + 10];
95         AntislashToSlash(ShortPath, ShortPath);
96
97         sprintf (env, "SCI=%s", ShortPath);
98         setSCI(ShortPath);
99
100         if (ShortPath)
101         {
102             FREE(ShortPath);
103             ShortPath = NULL;
104         }
105
106         if (_putenv (env))
107         {
108             bOK = FALSE;
109         }
110         else
111         {
112             bOK = TRUE;
113         }
114     }
115     return bOK;
116 }
117 /*--------------------------------------------------------------------------*/
118 BOOL Set_HOME_PATH(char *DefaultPath)
119 {
120     char *HOME = getenv("HOME");
121     if (HOME == NULL)
122     {
123         char* UserProfile = getenv("USERPROFILE");
124         if (UserProfile)
125         {
126             return SetEnvironmentVariableA("HOME", UserProfile);
127         }
128         else
129         {
130             /* if USERPROFILE is not defined , we use default profile */
131             char *AllUsersProfile = getenv("ALLUSERSPROFILE");
132             if (AllUsersProfile)
133             {
134                 return SetEnvironmentVariableA("HOME", UserProfile);
135             }
136             else
137             {
138                 return SetEnvironmentVariableA("HOME", DefaultPath);
139             }
140         }
141     }
142     return TRUE;
143 }
144 /*--------------------------------------------------------------------------*/
145 BOOL Set_SOME_ENVIRONMENTS_VARIABLES_FOR_SCILAB(void)
146 {
147     BOOL bOK = TRUE;
148
149 #ifdef _MSC_VER
150     _putenv ("COMPILER=VC++");
151 #endif
152
153     /* WIN32 variable Environment */
154 #ifdef _WIN32
155     _putenv ("WIN32=OK");
156 #endif
157
158     /* WIN64 variable Environment */
159 #ifdef _WIN64
160     _putenv ("WIN64=OK");
161 #endif
162
163     if ( GetSystemMetrics(SM_REMOTESESSION) )
164     {
165         _putenv ("SCILAB_MSTS_SESSION=OK");
166     }
167
168     return bOK;
169 }
170 /*--------------------------------------------------------------------------*/
171 BOOL IsTheGoodShell(void)
172 {
173     char shellCmd[PATH_MAX];
174     char drive[_MAX_DRIVE];
175     char dir[_MAX_DIR];
176     char fname[_MAX_FNAME];
177     char ext[_MAX_EXT];
178
179     strcpy(shellCmd, "");
180     strcpy(fname, "");
181     GetEnvironmentVariable("ComSpec", shellCmd, PATH_MAX);
182     os_splitpath(shellCmd, drive, dir, fname, ext);
183
184     if (_stricmp(fname, "cmd") == 0)
185     {
186         return TRUE;
187     }
188
189     return FALSE;
190 }
191 /*--------------------------------------------------------------------------*/
192 BOOL Set_Shell(void)
193 {
194     BOOL bOK = FALSE;
195     char env[_MAX_DRIVE + _MAX_DIR + _MAX_FNAME + _MAX_EXT + 10];
196     char *WINDIRPATH = NULL;
197
198     WINDIRPATH = getenv ("SystemRoot");
199     sprintf(env, "ComSpec=%s\\system32\\cmd.exe", WINDIRPATH);
200
201     if (_putenv (env))
202     {
203         bOK = FALSE;
204     }
205     else
206     {
207         bOK = TRUE;
208     }
209
210     if (WINDIRPATH)
211     {
212         FREE(WINDIRPATH);
213         WINDIRPATH = NULL;
214     }
215     return bOK;
216 }
217 /*--------------------------------------------------------------------------*/
218 static BOOL AddScilabBinDirectoryToPATHEnvironnementVariable(char *DefaultPath)
219 {
220 #define SCILAB_BIN_PATH "%s/bin"
221 #define NEW_PATH "PATH=%s;%s"
222
223     BOOL bOK = FALSE;
224     char *PATH = NULL;
225     char *env = NULL;
226     char scilabBinPath[MAX_PATH];
227     char *scilabBinPathConverted;
228
229     PATH = getenv("PATH");
230
231     env = (char*) MALLOC(sizeof(char) * (strlen(NEW_PATH) + strlen(PATH) +
232                                          strlen(DefaultPath) + 1));
233     if (env)
234     {
235         sprintf(scilabBinPath, SCILAB_BIN_PATH, DefaultPath);
236
237         scilabBinPathConverted = (char*) MALLOC(MAX_PATH * sizeof(char));
238 #ifdef _MSC_VER
239         scilabBinPathConverted = strsub(scilabBinPath, "/", "\\");
240 #else
241         scilabBinPathConverted = strdup(scilabBinPath);
242 #endif
243         if (stristr(PATH, scilabBinPathConverted) == 0)
244         {
245             sprintf(env, NEW_PATH, scilabBinPathConverted, PATH);
246             if (_putenv (env))
247             {
248                 bOK = FALSE;
249             }
250             else
251             {
252                 bOK = TRUE;
253             }
254             FREE(env);
255             env = NULL;
256         }
257
258         FREE(scilabBinPathConverted);
259     }
260     return bOK;
261 }
262 /*--------------------------------------------------------------------------*/