Prefs: create XConfiguration.xml file only when SCIHOME exists and is writable (https...
[scilab.git] / scilab / modules / preferences / macros / setPreferencesValue.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2014 - Scilab Enterprises - Calixte DENIZET
3 //
4 // This file must be used under the terms of the CeCILL.
5 // This source file is licensed as described in the file COPYING, which
6 // you should have received as part of this distribution.  The terms
7 // are also available at
8 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
9
10 // Set preferences values
11 // - xpath is something like "//web/body/proxy", the target must be a single node
12 // - kv is a matrix of strings 2xN: keys are in the first row and values in the
13 //   seconde one.
14 // - doc (optional): the prefs xml document where to set the values
15 //                   (take care: in this case xmlWrite is not called)
16 //
17 function setPreferencesValue(xpath, kv, doc)
18     rhs = argn(2);
19
20     if (rhs ~= 2 & rhs ~= 3) then
21         error(msprintf(gettext("%s: Wrong number of input arguments: %d or %d expected.\n"), "setPreferencesValue", 2, 3));
22     end
23
24     if type(xpath) <> 10 then
25         error(msprintf(gettext("%s: Wrong type for input argument #%d: String expected.\n"), "setPreferencesValue", 1));
26     end
27
28     if type(kv) <> 10 then
29         error(msprintf(gettext("%s: Wrong type for input argument #%d: Matrix of strings expected.\n"), "setPreferencesValue", 2));
30     end
31
32     if (size(kv, "r") ~= 2) then
33         error(msprintf(gettext("%s: Wrong size for input argument #%d: a 2xN matrix expected.\n"), "setPreferencesValue", 2));
34     end
35
36     if rhs == 2 then
37         try
38             doc = xmlRead(SCIHOME + "/XConfiguration.xml");
39         catch
40             error(msprintf(gettext("%s: Invalid XConfiguration.xml file.\n"), "setPreferencesValue"));
41         end
42     elseif typeof(doc) ~= "XMLDoc" then
43         error(msprintf(gettext("%s: Wrong type for input argument #%d: A XMLDoc expected.\n"), "setPreferencesValue", 3));
44     end
45
46     try
47         xp = xmlXPath(doc, xpath);
48     catch
49         if rhs == 2 then
50             xmlDelete(doc);
51         end
52         error(msprintf(gettext("%s: Invalid XPath request.\n"), "setPreferencesValue"));
53     end
54
55     if xp.size ~= 1 then
56         if rhs == 2 then
57             xmlDelete(doc);
58         end
59         error(msprintf(gettext("%s: Invalid XPath request."), "setPreferencesValue"));
60     end
61
62     node = xp(1);
63     if node.type ~= "XML_ELEMENT_NODE" then
64         if rhs == 2 then
65             xmlDelete(doc);
66         end
67         error(msprintf(gettext("%s: Target node is not a XML_ELEMENT_NODE."), "setPreferencesValue"));
68     end
69
70     attr = node.attributes;
71     for i = 1:size(kv, "c")
72         v = attr(kv(1, i));
73         if v ~= [] then
74             attr(kv(1, i)) = kv(2, i);
75         else
76             if rhs == 2 then
77                 xmlDelete(doc);
78             end
79             error(msprintf(gettext("%s: Invalid attribute name: %s."), "setPreferencesValue", kv(1, i)));
80         end
81     end
82
83     if rhs == 2 then
84         xmlWrite(doc);
85         xmlDelete(doc);
86     end
87 endfunction