reorder children in save/load from xml
[scilab.git] / scilab / modules / gui / sci_gateway / cpp / sci_saveGui.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2014 - Scilab Enterprises - Antoine ELIAS
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.1-en.txt
10  *
11  */
12
13 extern "C" {
14 #include "gw_gui.h"
15 #include "api_scilab.h"
16 #include "Scierror.h"
17 #include "localization.h"
18 #include "createGraphicObject.h"
19 #include "getGraphicObjectProperty.h"
20 #include "graphicObjectProperties.h"
21 #include "HandleManagement.h"
22 #include "BOOL.h"
23 }
24
25 int sci_saveGui(char *fname, unsigned long fname_len)
26 {
27     SciErr sciErr;
28     int* piAddr1 = NULL;
29     long long hFig = 0;
30     int iFig = 0;
31
32     int iType = 0;
33     int* piType = &iType;
34     int* piAddr2 = NULL;
35     char* pstFile = NULL;
36
37     int* piAddr3 = NULL;
38     int bReserve = 0;
39
40     int iRhs = nbInputArgument(pvApiCtx);
41
42     CheckInputArgument(pvApiCtx, 2, 3);
43     CheckOutputArgument(pvApiCtx, 1, 1);
44
45     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr1);
46     if (sciErr.iErr)
47     {
48         printError(&sciErr, 0);
49         return 1;
50     }
51
52     if (isHandleType(pvApiCtx, piAddr1) == 0 || isScalar(pvApiCtx, piAddr1) == 0)
53     {
54         Scierror(999, _("%s: Wrong size for input argument #%d: A single handle expected.\n"), fname, 1);
55         return 1;
56     }
57
58     if (getScalarHandle(pvApiCtx, piAddr1, &hFig))
59     {
60         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
61         return 1;
62     }
63
64     iFig = getObjectFromHandle((long)hFig);
65     if (iFig == 0)
66     {
67         Scierror(999, _("%s: The handle is not or no more valid.\n"), fname);
68         return 0;
69     }
70
71     getGraphicObjectProperty(iFig, __GO_TYPE__, jni_int, (void**)&piType);
72     if (piType == NULL || iType != __GO_FIGURE__)
73     {
74         Scierror(999, _("%s: Wrong type for input argument #%d: Figure handle expected.\n"), fname, 1);
75         return 1;
76     }
77
78     sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddr2);
79     if (sciErr.iErr)
80     {
81         printError(&sciErr, 0);
82         return 1;
83     }
84
85     if (isStringType(pvApiCtx, piAddr2) == 0 || isScalar(pvApiCtx, piAddr2) == 0)
86     {
87         Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, 2);
88         return 1;
89     }
90
91     if (getAllocatedSingleString(pvApiCtx, piAddr2, &pstFile))
92     {
93         if (pstFile)
94         {
95             freeAllocatedSingleString(pstFile);
96         }
97
98         Scierror(202, _("%s: Wrong type for argument #%d: A string expected.\n"), fname, 2);
99         return 1;
100     }
101
102     //reverse flag
103     if (iRhs == 3)
104     {
105         sciErr = getVarAddressFromPosition(pvApiCtx, 3, &piAddr3);
106         if (sciErr.iErr)
107         {
108             printError(&sciErr, 0);
109             return 1;
110         }
111
112         if (isBooleanType(pvApiCtx, piAddr3) == 0 || isScalar(pvApiCtx, piAddr3) == 0)
113         {
114             Scierror(999, _("%s: Wrong size for input argument #%d: A boolean expected.\n"), fname, 3);
115             return 1;
116         }
117
118         if (getScalarBoolean(pvApiCtx, piAddr3, &bReserve))
119         {
120             Scierror(202, _("%s: Wrong type for argument #%d: A string expected.\n"), fname, 3);
121             return 1;
122         }
123     }
124
125     char* ret = xmlsave(iFig, pstFile, (BOOL) bReserve);
126     freeAllocatedSingleString(pstFile);
127
128     if (ret[0] != '\0')
129     {
130         Scierror(202, _("%s: %s.\n"), fname, ret);
131         free(ret);
132         return 1;
133     }
134
135     free(ret);
136     createScalarBoolean(pvApiCtx, iRhs + 1, 1);
137     AssignOutputVariable(pvApiCtx, 1) = iRhs + 1;
138     ReturnArguments(pvApiCtx);
139     return 0;
140 }