* [Bug #14714] fixed - Crash/Leak when deleting datatip
[scilab.git] / scilab / modules / gui / sci_gateway / cpp / sci_datatipremove.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - Gustavo Barbosa Libotte <gustavolibotte@gmail.com>
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 #include "DatatipDelete.hxx"
17 #include "ScilabView.hxx"
18
19 extern "C"
20 {
21 #include "api_scilab.h"
22 #include "getScilabJavaVM.h"
23 #include "localization.h"
24 #include "Scierror.h"
25 #include "gw_gui.h"
26 #include "setGraphicObjectProperty.h"
27 #include "getGraphicObjectProperty.h"
28 #include "graphicObjectProperties.h"
29 #include "HandleManagement.h"
30 #include "FigureList.h"
31 #include "CurrentFigure.h"
32 #include "BuildObjects.h"
33 }
34
35 using namespace org_scilab_modules_gui_datatip;
36
37 int sci_datatipremove(char *fname, void* pvApiCtx)
38 {
39     int iFigureUID      = 0;
40     int iDatatipUID     = 0;
41     int iPolylineUID    = 0;
42     double* pdblReal    = NULL;
43     int* piAddr         = NULL;
44     long long llHandle  = 0;
45     int indexPos        = 0;
46     int iErr            = 0;
47     int nbRow           = 0;
48     int nbCol           = 0;
49     int iType           = 0;
50     int *piType         = &iType;
51     int iDatatipCount   = 0;
52     int *piDatatipCount = &iDatatipCount;
53
54     SciErr sciErr;
55     CheckInputArgument(pvApiCtx, 1, 2);
56     CheckOutputArgument(pvApiCtx, 0, 1);
57
58     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
59     if (sciErr.iErr)
60     {
61         printError(&sciErr, 0);
62         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
63         return 1;
64     }
65
66     iErr = getScalarHandle(pvApiCtx, piAddr, &llHandle);
67     if (iErr)
68     {
69         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
70         return 1;
71     }
72
73     if (nbInputArgument(pvApiCtx) == 1)
74     {
75         iFigureUID = getCurrentFigure();
76         iDatatipUID = getObjectFromHandle((unsigned long) llHandle);
77
78         if (checkInputArgumentType(pvApiCtx, 1, sci_handles))
79         {
80             getGraphicObjectProperty(iDatatipUID, __GO_TYPE__, jni_int, (void**) &piType);
81             if (iType == __GO_DATATIP__)
82             {
83                 DatatipDelete::datatipRemoveProgramHandler(getScilabJavaVM(), iDatatipUID, iFigureUID);
84             }
85             else
86             {
87                 Scierror(999, _("%s: Wrong type for input argument #%d: A '%s' handle expected.\n"), fname, 1, "Datatip");
88                 return 1;
89             }
90         }
91         else
92         {
93             Scierror(999, _("%s: Wrong type for input argument #%d: A handle expected.\n"), fname, 1);
94             return 1;
95         }
96     }
97     else if (nbInputArgument(pvApiCtx) == 2)
98     {
99         iPolylineUID = getObjectFromHandle((unsigned long) llHandle);
100
101         if (checkInputArgumentType(pvApiCtx, 1, sci_handles))
102         {
103             getGraphicObjectProperty(iPolylineUID, __GO_TYPE__, jni_int, (void**) &piType);
104             if (iType == __GO_POLYLINE__)
105             {
106
107                 sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddr);
108                 if (sciErr.iErr)
109                 {
110                     printError(&sciErr, 0);
111                     return 1;
112                 }
113
114                 sciErr = getMatrixOfDouble(pvApiCtx, piAddr, &nbRow, &nbCol, &pdblReal);
115                 if (sciErr.iErr)
116                 {
117                     printError(&sciErr, 0);
118                     return 1;
119                 }
120
121                 if (checkInputArgumentType(pvApiCtx, 2, sci_matrix))
122                 {
123
124                     if (nbRow * nbCol == 1)
125                     {
126                         indexPos = (int) pdblReal[0];
127                         getGraphicObjectProperty(iPolylineUID, __GO_DATATIPS_COUNT__, jni_int, (void**) &piDatatipCount);
128                         if (indexPos > 0 && indexPos <= iDatatipCount)
129                         {
130                             DatatipDelete::datatipRemoveProgramIndex(getScilabJavaVM(), iPolylineUID, indexPos);
131                         }
132                         else
133                         {
134                             Scierror(999, _("%s: Invalid value for datatip index %d.\n"), fname, indexPos);
135                             return 1;
136                         }
137
138                     }
139                     else
140                     {
141                         Scierror(999, _("%s: Wrong size for input argument #%d: A scalar expected.\n"), fname, 2);
142                         return 1;
143
144                     }
145                 }
146                 else
147                 {
148                     Scierror(999, _("%s: Wrong type for input argument #%d: A scalar expected.\n"), fname, 2);
149                     return 1;
150                 }
151             }
152             else
153             {
154                 Scierror(999, _("%s: Wrong type for input argument #%d: A '%s' handle expected.\n"), fname, 1, "Polyline");
155                 return 1;
156             }
157         }
158         else
159         {
160             Scierror(999, _("%s: Wrong type for input argument #%d: A handle expected.\n"), fname, 1);
161             return 1;
162         }
163     }
164     else
165     {
166         Scierror(999, _("%s: Wrong number for input argument: %d or %d expected.\n"), fname, 1, 2);
167         return 1;
168     }
169
170     AssignOutputVariable(pvApiCtx, 1) = 0;
171     ReturnArguments(pvApiCtx);
172     return 0;
173 }