14c851a9eeb3b2206eb56f780922c728fb9c8f09
[scilab.git] / scilab / modules / ast / src / cpp / system_env / 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 #include "string.hxx"
19 #include "context.hxx"
20
21 extern "C"
22 {
23 #include "home.h"
24 #include "sci_malloc.h"
25 #include "os_string.h"
26 #include "charEncoding.h"
27 #include "PATH_MAX.h"
28 #include "machine.h"
29 #include "version.h"
30 #include "setenvc.h"
31 #include "getenvc.h"
32 #include "setenvvar.h"
33 #include "getshortpathname.h"
34 }
35
36 /*--------------------------------------------------------------------------*/
37 wchar_t* getHOMEW(void)
38 {
39     return os_wcsdup(ConfigVariable::getHOME().c_str());
40 }
41 /*--------------------------------------------------------------------------*/
42 char* getHOME(void)
43 {
44     return wide_string_to_UTF8(ConfigVariable::getHOME().c_str());
45 }
46 /*--------------------------------------------------------------------------*/
47 void setHOME(const char* _home)
48 {
49     wchar_t* pstTemp = to_wide_string(_home);
50     setHOMEW(pstTemp);
51     FREE(pstTemp);
52 }
53 /*--------------------------------------------------------------------------*/
54 void setHOMEW(const wchar_t* _home)
55 {
56     //add SCI value in context as variable
57     types::String *pS = new types::String(_home);
58     symbol::Context::getInstance()->put(symbol::Symbol(L"home"), pS);
59
60     std::wstring home(_home);
61     ConfigVariable::setHOME(home);
62 }
63
64 /*--------------------------------------------------------------------------*/
65 wchar_t* computeHOMEW(void)
66 {
67     char* pstTemp = computeHOME();
68     wchar_t* pstReturn = to_wide_string(pstTemp);
69     delete[] pstTemp;
70     return pstReturn;
71 }
72 /*--------------------------------------------------------------------------*/
73 char* computeHOME(void)
74 {
75     char *pstHOME = getenvHOME();
76     if (pstHOME == NULL)
77     {
78         int ierr, iflag = 0;
79         int lbuf = PATH_MAX;
80         char *pstUserProfile = new char[PATH_MAX];
81         getenvc(&ierr, "USERPROFILE", pstUserProfile, &lbuf, &iflag);
82         if (ierr != 1)
83         {
84             return pstUserProfile;
85         }
86         else
87         {
88             /* if USERPROFILE is not defined , we use default profile */
89             getenvc(&ierr, "ALLUSERSPROFILE", pstUserProfile, &lbuf, &iflag);
90             if (ierr != 1)
91             {
92                 return pstUserProfile;
93             }
94             else
95             {
96                 return NULL;
97             }
98         }
99     }
100     return pstHOME;
101 }
102 /*--------------------------------------------------------------------------*/
103 char* getenvHOME(void)
104 {
105     int ierr, iflag = 0;
106     int lbuf = PATH_MAX;
107     char *Home = new char[PATH_MAX];
108
109     if (Home)
110     {
111         getenvc(&ierr, "HOME", Home, &lbuf, &iflag);
112
113         if (ierr == 1)
114         {
115             delete[] Home;
116             return NULL;
117         }
118     }
119     return Home;
120 }
121 /*--------------------------------------------------------------------------*/
122 wchar_t* getenvHOMEW(void)
123 {
124     char *Home = getenvHOME();
125     wchar_t* pstTemp = to_wide_string(Home);
126     delete[] Home;
127     return pstTemp;
128 }
129 /*--------------------------------------------------------------------------*/
130 void putenvHOMEW(const wchar_t* _home)
131 {
132     char* pstTemp = wide_string_to_UTF8(_home);
133     putenvHOME(pstTemp);
134     FREE(pstTemp);
135     return;
136 }
137
138 void putenvHOME(const char* _home)
139 {
140     char *ShortPath = NULL;
141     char *CopyOfDefaultPath = NULL;
142
143     /* to be sure that it's unix 8.3 format */
144     /* c:/progra~1/scilab-5.0 */
145     BOOL bConvertOK = FALSE;
146     ShortPath = getshortpathname(_home, &bConvertOK);
147
148     CopyOfDefaultPath = new char[strlen(_home) + 1];
149     AntislashToSlash(ShortPath, CopyOfDefaultPath);
150
151     setenvc("HOME", ShortPath);
152
153     delete[] CopyOfDefaultPath;
154     FREE(ShortPath);
155 }
156
157 /*--------------------------------------------------------------------------*/
158 void defineHOME()
159 {
160     wchar_t* home = computeHOMEW();
161     setHOMEW(home);
162     putenvHOMEW(home);
163     FREE(home);
164 }