Use hxx extensions instead of hpp
[scilab.git] / scilab / modules / xml / sci_gateway / cpp / sci_xmlWrite.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2011 - 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 "XMLObject.hxx"
14 #include "XMLDocument.hxx"
15 #include "XMLElement.hxx"
16
17 extern "C"
18 {
19 #include <string.h>
20 #include "gw_xml.h"
21 #include "Scierror.h"
22 #include "api_scilab.h"
23 #include "xml_mlist.h"
24 #include "libxml/tree.h"
25 #include "expandPathVariable.h"
26 #include "MALLOC.h"
27 #include "localization.h"
28 #ifdef _MSC_VER
29 #include "strdup_windows.h"
30 #endif
31 }
32
33 using namespace org_modules_xml;
34
35 /*--------------------------------------------------------------------------*/
36 int sci_xmlWrite(char *fname, unsigned long fname_len)
37 {
38     org_modules_xml::XMLDocument * doc = 0;
39     xmlDoc *document = 0;
40     SciErr err;
41     int *addr = 0;
42     char *path = 0;
43     char *expandedPath = 0;
44     int indent = 1;
45     int ret = 0;
46
47     CheckLhs(1, 1);
48     CheckRhs(1, 3);
49
50     err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
51     if (err.iErr)
52     {
53         printError(&err, 0);
54         Scierror(999, gettext("%s: Can not read input argument #%d.\n"), fname, 1);
55         return 0;
56     }
57
58     if (!isXMLDoc(addr, pvApiCtx))
59     {
60         Scierror(999, gettext("%s: Wrong type for input argument #%d: A %s expected.\n"), fname, 1, "XMLDoc");
61         return 0;
62     }
63
64     doc = XMLObject::getFromId<org_modules_xml::XMLDocument>(getXMLObjectId(addr, pvApiCtx));
65     if (!doc)
66     {
67         Scierror(999, gettext("%s: XML Document does not exist.\n"), fname);
68         return 0;
69     }
70     document = doc->getRealDocument();
71
72     if (Rhs >= 2)
73     {
74         err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
75         if (err.iErr)
76         {
77             printError(&err, 0);
78             Scierror(999, gettext("%s: Can not read input argument #%d.\n"), fname, 2);
79             return 0;
80         }
81
82         if (Rhs == 2 && !isStringType(pvApiCtx, addr) && !isBooleanType(pvApiCtx, addr))
83         {
84             Scierror(999, gettext("%s: Wrong type for input argument #%d: A string or a boolean expected.\n"), fname, 2);
85             return 0;
86         }
87
88         if (Rhs == 3 && !isStringType(pvApiCtx, addr))
89         {
90             Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
91             return 0;
92         }
93
94         if (isStringType(pvApiCtx, addr))
95         {
96             if (!checkVarDimension(pvApiCtx, addr, 1, 1))
97             {
98                 Scierror(999, gettext("%s: Wrong dimension for input argument #%d: A string expected.\n"), fname, 2);
99                 return 0;
100             }
101
102             if (getAllocatedSingleString(pvApiCtx, addr, &path) != 0)
103             {
104                 Scierror(999, gettext("%s: No more memory.\n"), fname);
105                 return 0;
106             }
107
108             if (!strlen(path))
109             {
110                 freeAllocatedSingleString(path);
111                 Scierror(999, gettext("%s: Wrong size for input argument #%d: Non-empty string expected.\n"), fname, 2);
112                 return 0;
113             }
114
115             expandedPath = expandPathVariable(path);
116
117             freeAllocatedSingleString(path);
118         }
119         else
120         {
121             if (!document->URL)
122             {
123                 Scierror(999, gettext("%s: The XML Document has not an URI and there is no second argument.\n"), fname);
124                 return 0;
125             }
126
127             if (!isBooleanType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
128             {
129                 Scierror(999, gettext("%s: Wrong dimension for input argument #%d: A boolean expected.\n"), fname, 2);
130                 return 0;
131             }
132
133             expandedPath = strdup((const char *)document->URL);
134             getScalarBoolean(pvApiCtx, addr, &indent);
135         }
136
137         if (Rhs == 3)
138         {
139             err = getVarAddressFromPosition(pvApiCtx, 3, &addr);
140             if (err.iErr)
141             {
142                 printError(&err, 0);
143                 FREE(expandedPath);
144                 Scierror(999, gettext("%s: Can not read input argument #%d.\n"), fname, 3);
145                 return 0;
146             }
147
148             if (!isBooleanType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
149             {
150                 FREE(expandedPath);
151                 Scierror(999, gettext("%s: Wrong type for input argument #%d: A boolean expected.\n"), fname, 3);
152                 return 0;
153             }
154
155             getScalarBoolean(pvApiCtx, addr, &indent);
156         }
157     }
158     else
159     {
160         if (!document->URL)
161         {
162             Scierror(999, gettext("%s: The XML Document has not an URI and there is no second argument.\n"), fname);
163             return 0;
164         }
165         expandedPath = strdup((const char *)document->URL);
166     }
167
168     xmlThrDefIndentTreeOutput(1);
169     ret = xmlSaveFormatFile(expandedPath, document, indent);
170     if (ret == -1)
171     {
172         Scierror(999, gettext("%s: Cannot write the file: %s\n"), fname, expandedPath);
173         FREE(expandedPath);
174         return 0;
175     }
176
177     FREE(expandedPath);
178
179     LhsVar(1) = 0;
180     PutLhsVar();
181
182     return 0;
183 }
184
185 /*--------------------------------------------------------------------------*/