* Bug 16148: xmlSetValues() <= setPreferencesValue()
[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 // Copyright (C) 2012 - 2016 - Scilab Enterprises
5 //
6 // This file is hereby licensed under the terms of the GNU GPL v2.0,
7 // pursuant to article 5.3.4 of the CeCILL v.2.1.
8 // This file was originally licensed under the terms of the CeCILL v2.1,
9 // and continues to be available under such terms.
10 // For more information, see the COPYING file which you should have received
11 // along with this program.
12
13 // Set preferences values
14 // - xpath is something like "//web/body/proxy", the target must be a single node
15 // - kv is a matrix of strings 2xN: keys are in the first row and values in the
16 //   seconde one.
17 // - doc (optional): the prefs xml document where to set the values
18 //                   (take care: in this case xmlWrite is not called)
19 //
20 function setPreferencesValue(xpath, kv, doc)
21
22     warnobsolete("xmlSetValues()", "6.1.x")
23     rhs = argn(2);
24
25     if (rhs ~= 2 & rhs ~= 3) then
26         error(msprintf(gettext("%s: Wrong number of input arguments: %d or %d expected.\n"), "setPreferencesValue", 2, 3));
27     end
28
29     if type(xpath) <> 10 then
30         error(msprintf(gettext("%s: Wrong type for input argument #%d: String expected.\n"), "setPreferencesValue", 1));
31     end
32
33     if type(kv) <> 10 then
34         error(msprintf(gettext("%s: Wrong type for input argument #%d: Matrix of strings expected.\n"), "setPreferencesValue", 2));
35     end
36
37     if (size(kv, "r") ~= 2) then
38         error(msprintf(gettext("%s: Wrong size for input argument #%d: a 2xN matrix expected.\n"), "setPreferencesValue", 2));
39     end
40
41     if rhs == 2 then
42         try
43             doc = xmlRead(SCIHOME + "/XConfiguration.xml");
44         catch
45             error(msprintf(gettext("%s: Invalid XConfiguration.xml file.\n"), "setPreferencesValue"));
46         end
47     elseif typeof(doc) ~= "XMLDoc" then
48         error(msprintf(gettext("%s: Wrong type for input argument #%d: A XMLDoc expected.\n"), "setPreferencesValue", 3));
49     end
50
51     try
52         xp = xmlXPath(doc, xpath);
53     catch
54         if rhs == 2 then
55             xmlDelete(doc);
56         end
57         error(msprintf(gettext("%s: Invalid XPath request.\n"), "setPreferencesValue"));
58     end
59
60     if xp.size ~= 1 then
61         if rhs == 2 then
62             xmlDelete(doc);
63         end
64         error(msprintf(gettext("%s: Invalid XPath request."), "setPreferencesValue"));
65     end
66
67     node = xp(1);
68     if node.type ~= "XML_ELEMENT_NODE" then
69         if rhs == 2 then
70             xmlDelete(doc);
71         end
72         error(msprintf(gettext("%s: Target node is not a XML_ELEMENT_NODE."), "setPreferencesValue"));
73     end
74
75     attr = node.attributes;
76     for i = 1:size(kv, "c")
77         v = attr(kv(1, i));
78         if v ~= [] then
79             attr(kv(1, i)) = kv(2, i);
80         else
81             if rhs == 2 then
82                 xmlDelete(doc);
83             end
84             error(msprintf(gettext("%s: Invalid attribute name: %s."), "setPreferencesValue", kv(1, i)));
85         end
86     end
87
88     if rhs == 2 then
89         xmlWrite(doc);
90         xmlDelete(doc);
91     end
92 endfunction