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