* Bug 16148: xmlSetValues() <= setPreferencesValue()
[scilab.git] / scilab / modules / atoms / macros / atomsSetConfig.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2009 - DIGITEO - Pierre MARECHAL <pierre.marechal@scilab.org>
3 // Copyright (C) 2012 - DIGITEO - Allan CORNET
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 // End user function
15
16 // Add toolboxes to the list of packages that are automatically loaded at Scilab start
17 // This function has an impact on the following files :
18 //  -> ATOMSDIR/config
19
20 function nbChanges = atomsSetConfig(field, value)
21
22     rhs        = argn(2);
23     nbChanges      = 0;
24
25     // Check number of input arguments
26     // =========================================================================
27
28     if rhs <> 2 then
29         error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"), "atomsSetConfig", 2));
30     end
31
32     // Check input parameters type
33     // =========================================================================
34
35     if type(field) <> 10 then
36         error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"), "atomsSetConfig", 1));
37     end
38
39     if type(value) <> 10 then
40         error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"), "atomsSetConfig", 2));
41     end
42
43     // field and value must have the same size
44     // =========================================================================
45
46     if or( size(field) <> size(value) ) then
47         error(msprintf(gettext("%s: Incompatible input arguments #%d and #%d: Same sizes expected.\n"), "atomsSetConfig", 1, 2));
48     end
49
50     pref_attrs = ["useProxy", "proxyHost", "proxyPort", "proxyUser", "proxyPassword";
51     "enabled", "host", "port", "user", "password"];
52
53     i=1;
54     for element = field(:)'
55         if strcmp("verbose",element, "i") == 0 then
56             field(i) = convstr(part(element,1),"u") + part(element,2:length(element));
57         else
58             field(i) = convstr(part(element,1),"l") + part(element,2:length(element));
59         end
60         element = field(i);
61
62         if element == "offLine" then
63             // Prior to version 5.4.0, offline was called Offline
64             field(i) = "offline";
65             element = "offline";
66         end
67
68         if element == "useProxy" ..
69             | element == "offline" ..
70             | element == "autoload" ..
71             | element == "autoloadAddAfterInstall" ..
72             | element == "Verbose" ..
73             then
74             select value(i)
75             case "True" then,
76             case "False" then,
77             case "true" then value(i)="True",
78             case "false" then value(i)="False",
79             else
80                 error(msprintf(gettext("%s: Wrong value for input configuration argument: True or False expected.\n"), value(i)));
81             end
82         elseif element == "proxyHost" ..
83             | element == "proxyPort" ..
84             | element == "proxyUser" ..
85             | element == "proxyPassword" ..
86             | element == "downloadTool" ..
87             | element == "downloadTimeout" ..
88             | element == "updateTime" ..
89             then continue;
90         else
91             error(msprintf(gettext("%s: Wrong key for input configuration argument.\n"), element));
92         end
93         i = i + 1;
94     end
95
96     // Load Atoms Internals lib if it's not already loaded
97     // =========================================================================
98     if ~ exists("atomsinternalslib") then
99         load("SCI/modules/atoms/macros/atoms_internals/lib");
100     end
101
102     // Define the path of the file that will record the change
103     // =========================================================================
104     atoms_directory =  atomsPath("system", "user");
105
106     // Does the atoms_directory exist, if not create it
107     // =========================================================================
108
109     if ~ isdir(atoms_directory) then
110         mkdir(atoms_directory);
111     end
112
113     // Get the current config struct
114     // =========================================================================
115
116     config_struct = atomsGetConfig();
117
118     // Loop on field
119     // =========================================================================
120
121     prefs_kv = [];
122     proxy_changes = 0;
123
124     for i=1:size(field, "*")
125
126         if (~isfield(config_struct, field(i))) | (config_struct(field(i)) <> value(i)) then
127             nbChanges = nbChanges + 1;
128         else
129             continue;
130         end
131
132         k = find(field(i) == pref_attrs(1, :));
133         if ~isempty(k) then
134             if field(i) == "useProxy" then
135                 value(i) = convstr(value(i), "l");
136             end
137             prefs_kv = [prefs_kv [pref_attrs(2, k) ; value(i)]];
138             nbChanges = nbChanges - 1;
139             proxy_changes = proxy_changes + 1;
140         else
141             config_struct(field(i)) = value(i);
142         end;
143     end
144
145     if ~isempty(prefs_kv) then
146         xmlSetValues("//web/body/proxy", prefs_kv);
147     end
148
149     // Shortcut
150     // =========================================================================
151     if nbChanges == 0 then
152         nbChanges = proxy_changes;
153         return;
154     end
155
156     // Apply Changes
157     // =========================================================================
158
159     config_fields    = getfield(1, config_struct);
160     config_fields(1:2) = [];
161     config_fields    = gsort(config_fields);
162
163     config_str = [];
164
165     for i=1:size(config_fields, "*")
166         config_str = [ config_str ; config_fields(i) + " = " + config_struct(config_fields(i)) ];
167     end
168
169     mputl(config_str, atoms_directory + "config");
170
171     nbChanges = nbChanges + proxy_changes;
172 endfunction