* Bug 15433 fixed: getPreferencesValue() => xmlGetValues() in [xml]
[scilab.git] / scilab / modules / preferences / macros / getPreferencesValue.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2014 - Scilab Enterprises - Calixte DENIZET
3 // Copyright (C) 2017 - Samuel GOUGEON
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 function values = getPreferencesValue(xpath, attributes, doc)
15
16     warnobsolete("xmlGetValues", "6.1");
17     rhs = argn(2);
18
19     if (rhs ~= 2 & rhs ~= 3) then
20         msg = _("%s: Wrong number of input arguments: %d or %d expected.\n")
21         error(msprintf(msg, "getPreferencesValue", 2, 3));
22     end
23
24     if type(xpath) <> 10 then
25         msg = _("%s: Wrong type for input argument #%d: String expected.\n")
26         error(msprintf(msg, "getPreferencesValue", 1));
27     end
28
29     if type(attributes) <> 10 then
30         msg = _("%s: Wrong type for input argument #%d: Matrix of strings expected.\n")
31         error(msprintf(msg, "getPreferencesValue", 2));
32     end
33
34     if rhs == 2 then
35         doc = SCIHOME + "/XConfiguration.xml"
36     end
37     doc0 = doc
38     delDoc = (rhs == 2 | type(doc0)==10)
39     if type(doc)==10 then
40         if isfile(doc)
41             try
42                 doc = xmlRead(doc0);
43             catch
44                 msg = _("%s: Invalid ""%s"" file.\n")
45                 error(msprintf(msg, "getPreferencesValue", tokens(doc0,["/" "\"])($)));
46             end
47         else
48             msg = _("%s: The file ""%s"" does not exist.\n")
49             error(msprintf(msg, "getPreferencesValue", doc));
50         end
51     elseif typeof(doc) ~= "XMLDoc" then
52         msg = _("%s: Wrong type for input argument #%d: A XMLDoc expected.\n")
53         error(msprintf(msg, "getPreferencesValue", 3));
54     end
55
56     try
57         xp = xmlXPath(doc, xpath);
58     catch
59         if delDoc then
60             xmlDelete(doc);
61         end
62         msg = gettext("%s: Invalid XPath request.\n")
63         error(msprintf(msg, "getPreferencesValue"));
64     end
65
66     if xp.size == 0 then
67         if delDoc then
68             xmlDelete(doc);
69         end
70         msg = gettext("%s: Invalid XPath request.")
71         error(msprintf(msg, "getPreferencesValue"));
72     end
73
74     values = [];
75     for i = 1 : xp.size
76         node = xp(i);
77         if node.type ~= "XML_ELEMENT_NODE" then
78             if delDoc then
79                 xmlDelete(doc);
80             end
81             msg = gettext("%s: Target node is not a XML_ELEMENT_NODE.")
82             error(msprintf(msg, "getPreferencesValue"));
83         end
84
85         attr = node.attributes;
86         for j = 1:size(attributes,"*")
87             a = attributes(j)
88             v = attr(a);
89             if v ~= [] then
90                 values(i,j) = v;
91             else
92                 if delDoc then
93                     xmlDelete(doc);
94                 end
95                 msg = gettext("%s: Invalid attribute name: %s.")
96                 error(msprintf(msg, "getPreferencesValue", a));
97             end
98         end
99     end
100     if xp.size==1 then
101         values = matrix(values, size(attributes));
102     end
103     if delDoc then
104         xmlDelete(doc);
105     end
106 endfunction