1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
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  */
15 
16 #ifndef __XMLRHSVALUE_HXX__
17 #define __XMLRHSVALUE_HXX__
18 
19 #include "xmlObjects.h"
20 
21 extern "C"
22 {
23 #include "Scierror.h"
24 #include "api_scilab.h"
25 #include "xml_mlist.h"
26 }
27 
28 namespace org_modules_xml
29 {
30 
31 /**
32  * @file
33  * @author Calixte DENIZET <calixte.denizet@scilab.org>
34  *
35  * Base class for the XML objects.
36  */
37 class XMLRhsValue
38 {
39 
40 public:
41     /**
42      * @anchor get
43      * @param fname the function name
44      * @param addr the Scilab's variable address
45      * @param obj a pointer to the object to retrieve
46      * @return true if all is ok
47      */
get(char * fname,int * addr,XMLDocument ** obj,void * pvApiCtx)48     static bool get(char *fname, int *addr, XMLDocument ** obj, void *pvApiCtx)
49     {
50         return get < XMLDocument > (fname, addr, obj, pvApiCtx);
51     }
52 
53     /**
54      * @ref get
55      */
get(char * fname,int * addr,XMLElement ** obj,void * pvApiCtx)56     static bool get(char *fname, int *addr, XMLElement ** obj, void *pvApiCtx)
57     {
58         return get < XMLElement > (fname, addr, obj, pvApiCtx);
59     }
60 
61     /**
62      * @ref get
63      */
get(char * fname,int * addr,XMLAttr ** obj,void * pvApiCtx)64     static bool get(char *fname, int *addr, XMLAttr ** obj, void *pvApiCtx)
65     {
66         return get < XMLAttr > (fname, addr, obj, pvApiCtx);
67     }
68 
69     /**
70      * @ref get
71      */
get(char * fname,int * addr,XMLNs ** obj,void * pvApiCtx)72     static bool get(char *fname, int *addr, XMLNs ** obj, void *pvApiCtx)
73     {
74         return get < XMLNs > (fname, addr, obj, pvApiCtx);
75     }
76 
77     /**
78      * @ref get
79      */
get(char * fname,int * addr,XMLNodeList ** obj,void * pvApiCtx)80     static bool get(char *fname, int *addr, XMLNodeList ** obj, void *pvApiCtx)
81     {
82         return get < XMLNodeList > (fname, addr, obj, pvApiCtx);
83     }
84 
85     /**
86      * @ref get
87      */
get(char * fname,int * addr,std::string ** obj,void * pvApiCtx)88     static bool get(char *fname, int *addr, std::string ** obj, void *pvApiCtx)
89     {
90         char **str = 0;
91         int row = 0;
92         int col = 0;
93 
94         std::string * code = new std::string("");
95 
96         if (getAllocatedMatrixOfString(pvApiCtx, addr, &row, &col, &str))
97         {
98             delete code;
99             return false;
100         }
101 
102         for (int i = 0; i < row; i++)
103         {
104             for (int j = 0; j < col; j++)
105             {
106                 *code += str[i + row * j];
107             }
108 
109             if (i != row - 1)
110             {
111                 *code += "\n";
112             }
113         }
114         freeAllocatedMatrixOfString(row, col, str);
115         *obj = code;
116 
117         return true;
118     }
119 
120 private:
121 
122     /**
123      * @ref get
124      */
get(char * fname,int * addr,T ** obj,void * pvApiCtx)125     template < class T > static bool get(char *fname, int *addr, T ** obj, void *pvApiCtx)
126     {
127         int id = getXMLObjectId(addr, pvApiCtx);
128 
129         *obj = XMLObject::getFromId < T > (id);
130         if (!*obj)
131         {
132             Scierror(999, "%s: XML object does not exist\n", fname);
133             return false;
134         }
135 
136         return true;
137     }
138 };
139 }
140 
141 #endif
142