d0e65a1d6f5febdb76efefd6e279dac5892fb63c
[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     wchar_t *wHOME = _wgetenv(L"HOME");
121     if (wHOME == NULL)
122     {
123         wchar_t *wUserProfile = _wgetenv(L"USERPROFILE");
124         if (wUserProfile)
125         {
126             return SetEnvironmentVariableW(L"HOME", wUserProfile);
127         }
128         else
129         {
130             /* if USERPROFILE is not defined , we use default profile */
131             wchar_t *wAllUsersProfile = _wgetenv(L"ALLUSERSPROFILE");
132             if (wAllUsersProfile)
133             {
134                 return SetEnvironmentVariableW(L"HOME", wUserProfile);
135             }
136             else
137             {
138                 BOOL bRes = FALSE;
139                 wchar_t *wDefault = to_wide_string(DefaultPath);
140                 if (wDefault)
141                 {
142                     bRes = SetEnvironmentVariableW(L"HOME", wDefault);
143                     FREE(wDefault);
144                     wDefault = NULL;
145                 }
146                 return bRes;
147             }
148         }
149     }
150     return TRUE;
151 }
152 /*--------------------------------------------------------------------------*/
153 BOOL Set_SOME_ENVIRONMENTS_VARIABLES_FOR_SCILAB(void)
154 {
155     BOOL bOK = TRUE;
156
157 #ifdef _MSC_VER
158     _putenv ("COMPILER=VC++");
159 #endif
160
161     /* WIN32 variable Environment */
162 #ifdef _WIN32
163     _putenv ("WIN32=OK");
164 #endif
165
166     /* WIN64 variable Environment */
167 #ifdef _WIN64
168     _putenv ("WIN64=OK");
169 #endif
170
171     if ( GetSystemMetrics(SM_REMOTESESSION) )
172     {
173         _putenv ("SCILAB_MSTS_SESSION=OK");
174     }
175
176     return bOK;
177 }
178 /*--------------------------------------------------------------------------*/
179 BOOL IsTheGoodShell(void)
180 {
181     char shellCmd[PATH_MAX];
182     char drive[_MAX_DRIVE];
183     char dir[_MAX_DIR];
184     char fname[_MAX_FNAME];
185     char ext[_MAX_EXT];
186
187     strcpy(shellCmd, "");
188     strcpy(fname, "");
189     GetEnvironmentVariable("ComSpec", shellCmd, PATH_MAX);
190     os_splitpath(shellCmd, drive, dir, fname, ext);
191
192     if (_stricmp(fname, "cmd") == 0)
193     {
194         return TRUE;
195     }
196
197     return FALSE;
198 }
199 /*--------------------------------------------------------------------------*/
200 BOOL Set_Shell(void)
201 {
202     BOOL bOK = FALSE;
203     char env[_MAX_DRIVE + _MAX_DIR + _MAX_FNAME + _MAX_EXT + 10];
204     char *WINDIRPATH = NULL;
205
206     WINDIRPATH = getenv ("SystemRoot");
207     sprintf(env, "ComSpec=%s\\system32\\cmd.exe", WINDIRPATH);
208
209     if (_putenv (env))
210     {
211         bOK = FALSE;
212     }
213     else
214     {
215         bOK = TRUE;
216     }
217
218     if (WINDIRPATH)
219     {
220         FREE(WINDIRPATH);
221         WINDIRPATH = NULL;
222     }
223     return bOK;
224 }
225 /*--------------------------------------------------------------------------*/
226 static BOOL AddScilabBinDirectoryToPATHEnvironnementVariable(char *DefaultPath)
227 {
228 #define SCILAB_BIN_PATH "%s/bin"
229 #define NEW_PATH "PATH=%s;%s"
230
231     BOOL bOK = FALSE;
232     char *PATH = NULL;
233     char *env = NULL;
234     char scilabBinPath[MAX_PATH];
235     char *scilabBinPathConverted;
236
237     PATH = getenv("PATH");
238
239     env = (char*) MALLOC(sizeof(char) * (strlen(NEW_PATH) + strlen(PATH) +
240                                          strlen(DefaultPath) + 1));
241     if (env)
242     {
243         sprintf(scilabBinPath, SCILAB_BIN_PATH, DefaultPath);
244
245         scilabBinPathConverted = (char*) MALLOC(MAX_PATH * sizeof(char));
246 #ifdef _MSC_VER
247         scilabBinPathConverted = strsub(scilabBinPath, "/", "\\");
248 #else
249         scilabBinPathConverted = strdup(scilabBinPath);
250 #endif
251         if (stristr(PATH, scilabBinPathConverted) == 0)
252         {
253             sprintf(env, NEW_PATH, scilabBinPathConverted, PATH);
254             if (_putenv (env))
255             {
256                 bOK = FALSE;
257             }
258             else
259             {
260                 bOK = TRUE;
261             }
262             FREE(env);
263             env = NULL;
264         }
265
266         FREE(scilabBinPathConverted);
267     }
268     return bOK;
269 }
270 /*--------------------------------------------------------------------------*/