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