check input argument type in light_create function and clean code 41/12641/3
Antoine ELIAS [Mon, 23 Sep 2013 17:01:48 +0000 (19:01 +0200)]
Change-Id: I91aa9e81516bb9bbe48c5cc6babf844894ef9ee0

scilab/modules/graphics/includes/Light.h
scilab/modules/graphics/sci_gateway/c/sci_light_create.c
scilab/modules/graphics/sci_gateway/c/sci_light_delete.c
scilab/modules/graphics/src/c/Light.c

index f82ca9d..19de369 100644 (file)
@@ -10,6 +10,6 @@
  *\r
  */\r
 \r
-BOOL createLight(long long axes_handle, int type, BOOL visible, double * position, double * direction, double * ambient_color, double * diffuse_color, double * specular_color, long long * pLightHandle);\r
+BOOL createLight(char* fname, long long axes_handle, int type, BOOL visible, double * position, double * direction, double * ambient_color, double * diffuse_color, double * specular_color, long long * pLightHandle);\r
 \r
 BOOL deleteLight(long long light_handle);
\ No newline at end of file
index 5171d38..06bc6d0 100644 (file)
 
 int sci_light_create(char *fname, unsigned long fname_len)
 {
-    char * axes = NULL;
     int type = -1;
-    BOOL visible = TRUE;
-    double * position = NULL;
-    double * direction = NULL;
-    double * ambient_color = NULL;
-    double * diffuse_color = NULL;
-    double * specular_color = NULL;
+    BOOL visible = 1;
+    double* position = NULL;
+    double* direction = NULL;
+    double* ambient_color = NULL;
+    double* diffuse_color = NULL;
+    double* specular_color = NULL;
 
     SciErr sciErr;
     int* piAddr        = NULL;
-    int nbRow, nbCol;
-    int * piBool;
     int length = 0;
-    char str[16];
-    char * pStr = str;
-    char * light;
+    char * pStr = NULL;
     long long light_handle;
-    long long axes_hdl = -1;
-    long long* pAxesHandle = &axes_hdl;
+    long long axesHandle;
     BOOL result;
 
 
     static rhs_opts opts[] =
     {
-
         { -1, "ambient_color", -1, 0, 0, NULL},
         { -1, "diffuse_color", -1, 0, 0, NULL},
         { -1, "direction", -1, 0, 0, NULL},
@@ -61,30 +54,29 @@ int sci_light_create(char *fname, unsigned long fname_len)
 
     if (nbInputArgument(pvApiCtx) == 0)
     {
-        result = createLight(-1, -1, TRUE, NULL, NULL, NULL, NULL, NULL, &light_handle);
+        result = createLight(fname, -1, -1, TRUE, NULL, NULL, NULL, NULL, NULL, &light_handle);
     }
     else
     {
-
         CheckInputArgument(pvApiCtx, 1, 15);
 
-
-        if (checkInputArgumentType(pvApiCtx, 1, sci_handles))
+        sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
+        if (sciErr.iErr)
         {
-            sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
-            if (sciErr.iErr)
-            {
-                return 0;
-            }
-            getMatrixOfHandle(pvApiCtx, piAddr, &nbRow, &nbCol, &pAxesHandle);
+            Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+            return 0;
+        }
 
-            if (pAxesHandle == NULL) return FALSE;
+        if (isHandleType(pvApiCtx, piAddr) == FALSE || isScalar(pvApiCtx, piAddr) == FALSE)
+        {
+            Scierror(999, _("%s: Wrong type for input argument #%d: A graphic handle expected.\n"), fname, 1);
+            return 0;
+        }
 
-            if (nbRow * nbCol != 1)
-            {
-                Scierror(999, _("%s: Wrong size for input argument #%d: A graphic handle expected.\n"), fname, 1);
-                return FALSE;
-            }
+        if (getScalarHandle(pvApiCtx, piAddr, &axesHandle))
+        {
+            Scierror(999, _("%s: Wrong type for input argument #%d: A graphic handle expected.\n"), fname, 1);
+            return 0;
         }
 
         if (getOptionals(pvApiCtx, fname, opts) == 0)
@@ -93,83 +85,89 @@ int sci_light_create(char *fname, unsigned long fname_len)
             return 0;
         }
 
-        if ((opts[6].iPos != -1) && (opts[6].iType == sci_strings) && (opts[6].iCols * opts[6].iRows == 1))
+        if (opts[6].iPos != -1 && opts[6].iType == sci_strings && opts[6].iCols == 1 && opts[6].iRows == 1)
         {
-            sciErr = getMatrixOfString(pvApiCtx, opts[6].piAddr, &nbRow, &nbCol, &length, NULL);
-            if (length < 15 && !sciErr.iErr)
+            if (getAllocatedSingleString(pvApiCtx, opts[6].piAddr, &pStr))
             {
-                sciErr = getMatrixOfString(pvApiCtx, opts[6].piAddr, &nbRow, &nbCol, &length, &pStr);
-                if (stricmp(str, "on") == 0)
-                {
-                    visible = 1;
-                }
-                else if (stricmp(str, "off") == 0)
-                {
-                    visible = 0;
-                }
+                Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 7);
+                return 0;
             }
+
+            if (stricmp(pStr, "on") == 0)
+            {
+                visible = 1;
+            }
+            else if (stricmp(pStr, "off") == 0)
+            {
+                visible = 0;
+            }
+
+            freeAllocatedSingleString(pStr);
         }
 
-        if ((opts[5].iPos != -1) && (opts[5].iType == sci_strings) && (opts[5].iCols * opts[5].iRows == 1))
+        if (opts[5].iPos != -1 && opts[5].iType == sci_strings && opts[5].iCols == 1 && opts[5].iRows == 1)
         {
-            sciErr = getMatrixOfString(pvApiCtx, opts[5].piAddr, &nbRow, &nbCol, &length, NULL);
-            if (length < 15 && !sciErr.iErr)
+            if (getAllocatedSingleString(pvApiCtx, opts[5].piAddr, &pStr))
+            {
+                Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 6);
+                return 0;
+            }
+
+            if (stricmp(pStr, "directional") == 0)
+            {
+                type = 0;
+            }
+            else if (stricmp(pStr, "point") == 0)
             {
-                sciErr = getMatrixOfString(pvApiCtx, opts[5].piAddr, &nbRow, &nbCol, &length, &pStr);
-                if (stricmp(str, "directional") == 0)
-                {
-                    type = 0;
-                }
-                else if (stricmp(str, "point") == 0)
-                {
-                    type = 1;
-                }
+                type = 1;
             }
+
+            freeAllocatedSingleString(pStr);
         }
 
         if ((opts[3].iPos != -1) && (opts[3].iType == sci_matrix) && (opts[3].iCols * opts[3].iRows == 3))
         {
-            sciErr = getMatrixOfDouble(pvApiCtx, opts[3].piAddr, &nbRow, &nbCol, &position);
+            sciErr = getMatrixOfDouble(pvApiCtx, opts[3].piAddr, &opts[3].iCols, &opts[3].iRows, &position);
         }
 
         if ((opts[2].iPos != -1) && (opts[2].iType == sci_matrix) && (opts[2].iCols * opts[2].iRows == 3))
         {
-            sciErr = getMatrixOfDouble(pvApiCtx, opts[2].piAddr, &nbRow, &nbCol, &direction);
+            sciErr = getMatrixOfDouble(pvApiCtx, opts[2].piAddr, &opts[2].iCols, &opts[2].iRows, &direction);
         }
 
         if ((opts[0].iPos != -1) && (opts[0].iType == sci_matrix) && (opts[0].iCols * opts[0].iRows == 3))
         {
-            sciErr = getMatrixOfDouble(pvApiCtx, opts[0].piAddr, &nbRow, &nbCol, &ambient_color);
+            sciErr = getMatrixOfDouble(pvApiCtx, opts[0].piAddr, &opts[0].iCols, &opts[0].iRows, &ambient_color);
         }
 
         if ((opts[1].iPos != -1) && (opts[1].iType == sci_matrix) && (opts[1].iCols * opts[1].iRows == 3))
         {
-            sciErr = getMatrixOfDouble(pvApiCtx, opts[1].piAddr, &nbRow, &nbCol, &diffuse_color);
+            sciErr = getMatrixOfDouble(pvApiCtx, opts[1].piAddr, &opts[1].iCols, &opts[1].iRows, &diffuse_color);
         }
 
         if ((opts[4].iPos != -1) && (opts[4].iType == sci_matrix) && (opts[4].iCols * opts[4].iRows == 3))
         {
-            sciErr = getMatrixOfDouble(pvApiCtx, opts[4].piAddr, &nbRow, &nbCol, &specular_color);
+            sciErr = getMatrixOfDouble(pvApiCtx, opts[4].piAddr, &opts[4].iCols, &opts[4].iRows, &specular_color);
         }
 
-        result = createLight(*pAxesHandle, type, visible, position, direction, ambient_color, diffuse_color, specular_color, &light_handle);
+        result = createLight(fname, axesHandle, type, visible, position, direction, ambient_color, diffuse_color, specular_color, &light_handle);
 
     }
 
-    if (result == FALSE) return FALSE;
-
-
-    nbRow = 1;
-    nbCol = 1;
+    if (result == FALSE)
+    {
+        //error msg come from createLight
+        return 0;
+    }
 
-    sciErr = createMatrixOfHandle(pvApiCtx, nbInputArgument(pvApiCtx) + 1, nbRow, nbCol, &light_handle);
-    if (sciErr.iErr)
+    if (createScalarHandle(pvApiCtx, nbInputArgument(pvApiCtx) + 1, light_handle))
     {
-        return FALSE;
+        Scierror(999, _("%s: Memory allocation error.\n"), fname);
+        return 0;
     }
 
     AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1;
     ReturnArguments(pvApiCtx);
-    return TRUE;
+    return 0;
 
 }
index 7fea7b7..0b8a82c 100644 (file)
@@ -23,40 +23,26 @@ int sci_light_delete(char *fname, unsigned long fname_len)
     SciErr sciErr;
     int* piAddr        = NULL;
     int nbRow, nbCol;
-    char * light;
-    long long* pLightHandle = NULL;
+    long long lightHandle = 0;
     BOOL result;
 
-
     CheckInputArgument(pvApiCtx, 1, 1);
 
-    if (checkInputArgumentType(pvApiCtx, 1, sci_handles))
+    sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
+    if (sciErr.iErr)
     {
-        sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
-        if (sciErr.iErr)
-        {
-            return 0;
-        }
-        getMatrixOfHandle(pvApiCtx, piAddr, &nbRow, &nbCol, &pLightHandle);
-        if (pLightHandle == NULL) return FALSE;
-
-        if (nbRow * nbCol != 1)
-        {
-            Scierror(999, _("%s: Wrong size for input argument #%d: A graphic handle expected.\n"), fname, 1);
-            return FALSE;
-        }
-
-        result = deleteLight(*pLightHandle);
-        if (result == FALSE)
-        {
-            return FALSE;
-        }
+        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+        return 0;
     }
-    else
+
+    if (getScalarHandle(pvApiCtx, piAddr, &lightHandle))
     {
         Scierror(999, _("%s: Wrong type for argument %d: A graphic handle expected.\n"), fname, 1);
-        return FALSE;
+        return 0;
     }
 
-    return TRUE;
+    deleteLight(lightHandle);
+
+    AssignOutputVariable(pvApiCtx, 1) = 0;
+    ReturnArguments(pvApiCtx);
 }
index a4af3dc..32e59be 100644 (file)
@@ -18,7 +18,9 @@
 #include "graphicObjectProperties.h"\r
 #include "HandleManagement.h"\r
 #include "CurrentSubwin.h"\r
-\r
+#include "Scierror.h"\r
+#include "localization.h"\r
+#include "BuildObjects.h"\r
 \r
 BOOL isValidType(int type)\r
 {\r
@@ -30,31 +32,50 @@ BOOL isValidColor(double * color)
     if (color != NULL)\r
     {\r
         return (color[0] >= 0.0 && color[0] <= 1.0) &&\r
-            (color[1] >= 0.0 && color[1] <= 1.0) &&\r
-            (color[2] >= 0.0 && color[2] <= 1.0);\r
+               (color[1] >= 0.0 && color[1] <= 1.0) &&\r
+               (color[2] >= 0.0 && color[2] <= 1.0);\r
     }\r
     return FALSE;\r
 }\r
 \r
-BOOL createLight(long long axes_handle, int type, BOOL visible, double * position, double * direction, double * ambient_color, double * diffuse_color, double * specular_color, long long * pLightHandle)\r
+BOOL createLight(char* fname, long long axes_handle, int type, BOOL visible, double * position, double * direction, double * ambient_color, double * diffuse_color, double * specular_color, long long * pLightHandle)\r
 {\r
     const char * axes;\r
     char * light;\r
     int * piType = &type;\r
+    int hType = 0;\r
+    int * pihType = &hType;\r
     int * piVisible = &visible;\r
 \r
-    if (pLightHandle == NULL) return FALSE;\r
+    if (pLightHandle == NULL)\r
+    {\r
+        return FALSE;\r
+    }\r
 \r
     axes = getObjectFromHandle(axes_handle);\r
     if (axes == NULL)\r
     {\r
-        axes = getCurrentSubWin();\r
-        if (axes == NULL) return FALSE;\r
+        axes = getOrCreateDefaultSubwin();\r
+        if (axes == NULL)\r
+        {\r
+            Scierror(999, _("%s: The handle is not or no more valid.\n"), fname);\r
+            return FALSE;\r
+        }\r
     }\r
 \r
-    light = createGraphicObject(__GO_LIGHT__);\r
+    //check handle type\r
+    getGraphicObjectProperty(axes, __GO_TYPE__, jni_int, (void **)&pihType);\r
+    if (hType != __GO_AXES__)\r
+    {\r
+        Scierror(999, _("The parent has to be a SUBWIN\n"));\r
+        return FALSE;\r
+    }\r
 \r
-    if (light == NULL) return FALSE;\r
+    light = createGraphicObject(__GO_LIGHT__);\r
+    if (light == NULL)\r
+    {\r
+        return FALSE;\r
+    }\r
 \r
     setGraphicObjectProperty(light, __GO_VISIBLE__, piVisible, jni_bool, 1);\r
 \r
@@ -87,10 +108,14 @@ BOOL createLight(long long axes_handle, int type, BOOL visible, double * positio
     {\r
         setGraphicObjectProperty(light, __GO_SPECULARCOLOR__, specular_color, jni_double_vector, 3);\r
     }\r
-    \r
+\r
+    //return handle\r
     *pLightHandle = getHandle(light);\r
 \r
+    //set light as child of axes\r
     setGraphicObjectRelationship(axes, light);\r
+\r
+    //release memory\r
     releaseGraphicObjectProperty(__GO_PARENT__, light, jni_string, 1);\r
 \r
     return TRUE;\r
@@ -104,11 +129,17 @@ BOOL deleteLight(long long light_handle)
     const char * uid = NULL;\r
 \r
     uid = getObjectFromHandle(light_handle);\r
-    if (uid == NULL) return FALSE;\r
+    if (uid == NULL)\r
+    {\r
+        return FALSE;\r
+    }\r
 \r
     getGraphicObjectProperty(uid, __GO_TYPE__, jni_int, (void **)&piType);\r
 \r
-    if (iType != __GO_LIGHT__) return FALSE;\r
+    if (iType != __GO_LIGHT__)\r
+    {\r
+        return FALSE;\r
+    }\r
 \r
     deleteGraphicObject((char*)uid);\r
 \r