Use hxx extensions instead of hpp
[scilab.git] / scilab / modules / xml / sci_gateway / cpp / sci_xmlSetAttributes.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - Scilab Enterprises - Calixte Denizet
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #include "xml.h"
14
15 extern "C"
16 {
17 #include "gw_xml.h"
18 #include "Scierror.h"
19 #include "api_scilab.h"
20 #include "xml_mlist.h"
21 #include "localization.h"
22 }
23
24 #include "XMLObject.hxx"
25
26 using namespace org_modules_xml;
27
28 /*--------------------------------------------------------------------------*/
29 int sci_xmlSetAttributes(char *fname, unsigned long fname_len)
30 {
31     int id;
32     SciErr err;
33     int *addr = 0;
34     XMLObject *obj = 0;
35     char **keyValue = 0;
36     int rows;
37     int cols;
38
39     CheckLhs(1, 1);
40     CheckRhs(2, 2);
41
42     err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
43     if (err.iErr)
44     {
45         printError(&err, 0);
46         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
47         return 0;
48     }
49
50     if (!isXMLAttr(addr, pvApiCtx) && !isXMLElem(addr, pvApiCtx) && !isXMLList(addr, pvApiCtx) && !isXMLSet(addr, pvApiCtx))
51     {
52         Scierror(999, gettext("%s: Wrong type for input argument #%d: A XMLAttr or a XMLElem or a XMLList or a XMLSet expected.\n"), fname, 1);
53         return 0;
54     }
55
56     id = getXMLObjectId(addr, pvApiCtx);
57     obj = XMLObject::getFromId < XMLObject > (id);
58     if (!obj)
59     {
60         Scierror(999, gettext("%s: XML attribute does not exist.\n"), fname);
61         return 0;
62     }
63
64     err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
65     if (err.iErr)
66     {
67         printError(&err, 0);
68         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
69         return 0;
70     }
71
72     if (!isStringType(pvApiCtx, addr))
73     {
74         Scierror(999, gettext("%s: Wrong type for input argument #%d: Matrix of strings expected.\n"), fname, 2);
75         return 0;
76     }
77
78     if (getAllocatedMatrixOfString(pvApiCtx, addr, &rows, &cols, &keyValue))
79     {
80         return 0;
81     }
82
83     if (rows == 0 || (cols != 2 && cols != 3))
84     {
85         freeAllocatedMatrixOfString(rows, cols, keyValue);
86         Scierror(999, gettext("%s: Wrong size for input argument #%d: Matrix nx2 or nx3 of strings expected.\n"), fname, 2);
87         return 0;
88     }
89
90     if (cols == 2)
91     {
92         obj->setAttributeValue(const_cast < const char **>(keyValue), const_cast < const char **>(keyValue + rows), rows);
93     }
94     else
95     {
96         obj->setAttributeValue(const_cast < const char **>(keyValue), const_cast < const char **>(keyValue + rows),
97                                const_cast < const char **>(keyValue + 2 * rows), rows);
98     }
99     freeAllocatedMatrixOfString(rows, cols, keyValue);
100
101     obj->createOnStack(Rhs + 1, pvApiCtx);
102     LhsVar(1) = Rhs + 1;
103     PutLhsVar();
104
105     return 0;
106 }