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