0ad607e21e3e14b3587a22f81c46ffca72acb412
[scilab.git] / scilab / modules / ast / src / cpp / system_env / sci_home.cpp
1 /*
2 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 *  Copyright (C) 2010 - DIGITEO - Antoine ELIAS
4 *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13 *
14 */
15
16
17 #include "configvariable.hxx"
18
19 #include "string.hxx"
20 #include "context.hxx"
21
22 extern "C"
23 {
24 #include "sci_malloc.h"
25 #include "sci_home.h"
26 #include "os_string.h"
27 #include "charEncoding.h"
28 #include "PATH_MAX.h"
29 #include "machine.h"
30 #include "version.h"
31 #include "setenvc.h"
32 #include "getenvc.h"
33 #include "setenvvar.h"
34 #include "getshortpathname.h"
35 }
36
37 /*--------------------------------------------------------------------------*/
38 wchar_t* getSCIHOMEW(void)
39 {
40     return os_wcsdup(ConfigVariable::getSCIHOME().c_str());
41 }
42 /*--------------------------------------------------------------------------*/
43 char* getSCIHOME(void)
44 {
45     std::wstring tmpSCIHOME = ConfigVariable::getSCIHOME();
46     if (tmpSCIHOME == L"")
47     {
48         tmpSCIHOME = L"empty_SCIHOME";
49     }
50     return wide_string_to_UTF8(tmpSCIHOME.c_str());
51 }
52 /*--------------------------------------------------------------------------*/
53 void setSCIHOME(const char* _sci_home)
54 {
55     wchar_t* pstTemp = to_wide_string(_sci_home);
56     setSCIHOMEW(pstTemp);
57     FREE(pstTemp);
58 }
59 /*--------------------------------------------------------------------------*/
60 void setSCIHOMEW(const wchar_t* _sci_home)
61 {
62     //add SCI value in context as variable
63     types::String *pS = new types::String(_sci_home);
64     symbol::Context::getInstance()->put(symbol::Symbol(L"SCIHOME"), pS);
65
66     std::wstring sci_home(_sci_home);
67     ConfigVariable::setSCIHOME(sci_home);
68 }
69
70 /*--------------------------------------------------------------------------*/
71 wchar_t* computeSCIHOMEW(void)
72 {
73     char* pstTemp = computeSCIHOME();
74     wchar_t* pstReturn = to_wide_string(pstTemp);
75     FREE(pstTemp);
76     return pstReturn;
77 }
78 /*--------------------------------------------------------------------------*/
79 #ifdef _MSC_VER
80 char* computeSCIHOME(void)
81 {
82 #define BASEDIR "Scilab"
83     int ierr = 0;
84     int buflen = PATH_MAX;
85     int iflag = 0;
86
87     char USERPATHSCILAB[PATH_MAX];
88     char SCIHOMEPATH[PATH_MAX * 2];
89     char* SHORTUSERHOMESYSTEM = NULL;
90
91     char USERHOMESYSTEM[PATH_MAX];
92
93     BOOL bConverted = FALSE;
94
95     getenvc(&ierr, "APPDATA", USERHOMESYSTEM, &buflen, &iflag);
96
97     /* if APPDATA not found we try with USERPROFILE */
98     if (ierr)
99     {
100         getenvc(&ierr, "USERPROFILE", USERHOMESYSTEM, &buflen, &iflag);
101     }
102
103     /* convert long path to short path format : remove some special characters */
104     SHORTUSERHOMESYSTEM = getshortpathname(USERHOMESYSTEM, &bConverted);
105     if (SHORTUSERHOMESYSTEM)
106     {
107         if (!isdir(SHORTUSERHOMESYSTEM))
108         {
109             /* last chance, we try to get default all users profile */
110             getenvc(&ierr, "ALLUSERSPROFILE", USERHOMESYSTEM, &buflen, &iflag);
111             if (ierr)
112             {
113                 delete []SHORTUSERHOMESYSTEM;
114                 return NULL;
115             }
116
117             /* convert long path to short path format : remove some special characters */
118             SHORTUSERHOMESYSTEM = getshortpathname(USERHOMESYSTEM, &bConverted);
119
120             if ((!SHORTUSERHOMESYSTEM) || !isdir(SHORTUSERHOMESYSTEM))
121             {
122                 if (SHORTUSERHOMESYSTEM)
123                 {
124                     delete []SHORTUSERHOMESYSTEM;
125                 }
126                 return NULL;
127             }
128         }
129     }
130     else
131     {
132         if (SHORTUSERHOMESYSTEM)
133         {
134             delete []SHORTUSERHOMESYSTEM;
135         }
136         return NULL;
137     }
138
139     /* checks that directory exists */
140     os_strcpy(USERHOMESYSTEM, SHORTUSERHOMESYSTEM);
141     if (SHORTUSERHOMESYSTEM)
142     {
143         delete []SHORTUSERHOMESYSTEM;
144     }
145
146     /* Set SCIHOME environment variable */
147     os_sprintf(USERPATHSCILAB, "%s%s%s", USERHOMESYSTEM, DIR_SEPARATOR, BASEDIR);
148     os_sprintf(SCIHOMEPATH, "%s%s%s", USERPATHSCILAB, DIR_SEPARATOR, SCI_VERSION_STRING);
149
150     /* creates directory if it does not exists */
151     if (!isdir(SCIHOMEPATH))
152     {
153         if (!isdir(USERPATHSCILAB))
154         {
155             createdirectory(USERPATHSCILAB);
156         }
157
158         if (createdirectory(SCIHOMEPATH))
159         {
160
161             return os_strdup(SCIHOMEPATH);
162         }
163     }
164     else
165     {
166         return os_strdup(SCIHOMEPATH);
167     }
168
169     return NULL;
170 }
171 #else
172 char* computeSCIHOME(void)
173 {
174 #define BASEDIR ".Scilab"
175     int ierr   = 0;
176     int buflen = PATH_MAX;
177     int iflag  = 0;
178     char USERPATHSCILAB[PATH_MAX];
179     char USERHOMESYSTEM[PATH_MAX];
180     char SCIHOMEPATH[PATH_MAX * 2];
181     char HOME[] = "HOME";
182
183     getenvc(&ierr, HOME, USERHOMESYSTEM, &buflen, &iflag);
184     if (ierr)
185     {
186         return NULL;
187     }
188
189     /* Set SCIHOME environment variable */
190     sprintf(USERPATHSCILAB, "%s%s%s", USERHOMESYSTEM, DIR_SEPARATOR, BASEDIR);
191     sprintf(SCIHOMEPATH, "%s%s%s", USERPATHSCILAB, DIR_SEPARATOR, SCI_VERSION_STRING);
192
193     /* creates directory if it does not exists */
194     if (!isdir(SCIHOMEPATH))
195     {
196         if (!isdir(USERPATHSCILAB))
197         {
198             createdirectory(USERPATHSCILAB);
199         }
200
201         if (createdirectory(SCIHOMEPATH))
202         {
203             return os_strdup(SCIHOMEPATH);
204         }
205     }
206     else
207     {
208         return os_strdup(SCIHOMEPATH);
209     }
210
211     return NULL;
212 }
213 #endif
214
215 /*--------------------------------------------------------------------------*/
216 char* getenvSCIHOME(void)
217 {
218     int ierr, iflag = 0;
219     int lbuf = PATH_MAX;
220     char *SciHome = new char[PATH_MAX];
221
222     if (SciHome)
223     {
224         getenvc(&ierr, "SCIHOME", SciHome, &lbuf, &iflag);
225
226         if (ierr == 1)
227         {
228             return NULL;
229         }
230     }
231     return SciHome;
232 }
233 /*--------------------------------------------------------------------------*/
234 wchar_t* getenvSCIHOMEW(void)
235 {
236     char *SciHome = getenvSCIHOME();
237     wchar_t* pstTemp = to_wide_string(SciHome);
238     delete[] SciHome;
239     return pstTemp;
240 }
241 /*--------------------------------------------------------------------------*/
242 void putenvSCIHOMEW(const wchar_t* _sci_home)
243 {
244     char* pstTemp = wide_string_to_UTF8(_sci_home);
245     putenvSCIHOME(pstTemp);
246     FREE(pstTemp);
247     return;
248 }
249
250 void putenvSCIHOME(const char* _sci_home)
251 {
252     char *ShortPath = NULL;
253     char *CopyOfDefaultPath = NULL;
254
255     /* to be sure that it's unix 8.3 format */
256     /* c:/progra~1/scilab-5.0 */
257     BOOL bConvertOK = FALSE;
258     ShortPath = getshortpathname(_sci_home, &bConvertOK);
259
260     CopyOfDefaultPath = new char[strlen(_sci_home) + 1];
261     AntislashToSlash(ShortPath, CopyOfDefaultPath);
262
263     setenvc("SCIHOME", ShortPath);
264
265     delete[] CopyOfDefaultPath;
266     FREE(ShortPath);
267 }
268
269 /*--------------------------------------------------------------------------*/
270 void defineSCIHOME()
271 {
272     wchar_t* sci_home = computeSCIHOMEW();
273     setSCIHOMEW(sci_home);
274     putenvSCIHOMEW(sci_home);
275     FREE(sci_home);
276 }