* Bug #15456 fixed: Xcos 5.5.x files did not load properly 20/19820/6
Clément DAVID [Thu, 1 Mar 2018 17:16:17 +0000 (18:16 +0100)]
A loaded schema should be visible and should not crash Scilab. Fix :
 - Superblock diagrams as dictionary data twice
 - OPAR parameters decoding
 - Simulation with not connected links
 - Link's points and labels placement with a non-zero origin
 - ZCOS content.xml encoding as UTF-8

Change-Id: Ie07b3547cae165ad01e0d904a2167e26b665b60c

scilab/CHANGES.md
scilab/modules/scicos/macros/scicos_scicos/scicos_flat.sci
scilab/modules/scicos/src/cpp/view_scilab/GraphicsAdapter.cpp
scilab/modules/scicos/src/cpp/view_scilab/ModelAdapter.cpp
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/ScilabTypeCoder.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/sax/JGraphXHandler.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/scicos/BlockElement.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/scicos/DiagramElement.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/spec/ContentEntry.java

index e3ff36c..1e348db 100644 (file)
@@ -558,10 +558,12 @@ Known issues
 * [#15402](http://bugzilla.scilab.org/show_bug.cgi?id=15402): The `range()` page was not fixed against the bug 1904 for the french and portuguese versions.
 * [#15405](http://bugzilla.scilab.org/show_bug.cgi?id=15405): Accessing int64 hdf5 values crashed scilab.
 * [#15413](http://bugzilla.scilab.org/show_bug.cgi?id=15413): Deleting some ranges (rows, columns, pages, ..) in a structures array failed.
-* [#15418](http://bugzilla.scilab.org/show_bug.cgi?id=15418): With `colordef('black')` and colordef('none')`, black title and labels were invisible on the black background.
+* [#15418](http://bugzilla.scilab.org/show_bug.cgi?id=15418): With `colordef('black')` and `colordef('none')`, black title and labels were invisible on the black background.
 * [#15420](http://bugzilla.scilab.org/show_bug.cgi?id=15420): insertion at negative index did not trigger an error.
+* [#15456](http://bugzilla.scilab.org/show_bug.cgi?id=15456): Xcos 5.5.x files did not load properly.
 * [#15459](http://bugzilla.scilab.org/show_bug.cgi?id=15459): Generating code from an Xcos superblock generated warnings.
 
+
 ### Bugs fixed in 6.0.0:
 * [#592](http://bugzilla.scilab.org/show_bug.cgi?id=592): `linspace(a, b, n<=0)` returned `b` instead of `[]`
 * [#2835](http://bugzilla.scilab.org/show_bug.cgi?id=2835): On negative "initial event", EVTDLY_c took no notice of the input.
index a1f2c77..0233f1c 100644 (file)
@@ -364,11 +364,16 @@ function  [cor,corinv,links_table,cur_fictitious,sco_mat,ok, IN, OUT, EIN, EOUT]
     for k=Links
         o=scs_m.objs(k);
         f=0
+
         if o.from(1)<0|o.from(1)>MaxBlock then //Link coming from a superblock input port
+        elseif o.from(1) == 0 then //not connected links
+            continue;
         else
             o.from(1)=cor(o.from(1));
         end
         if o.to(1)<0 |o.to(1)>MaxBlock then //Link going to a superblock output port
+        elseif o.to(1) == 0 then //not connected links
+            continue;
         else
             o.to(1)=cor(o.to(1)),
         end
index e7aa4af..b9b798c 100644 (file)
@@ -170,7 +170,8 @@ struct exprs
         types::InternalType* res;
         if (!vec2var(exprs, res))
         {
-            return 0;
+            // if invalid data, return a valid value
+            return types::Double::Empty();
         }
         return res;
     }
index c0921ea..d9ea9b0 100644 (file)
@@ -79,7 +79,8 @@ types::InternalType* get_with_vec2var(const ModelAdapter& adaptor, const Control
     types::InternalType* res;
     if (!vec2var(prop_content, res))
     {
-        return nullptr;
+        // if invalid data, return a valid value
+        return types::Double::Empty();
     }
 
     return res;
index b6ab5bc..eb66ae5 100644 (file)
@@ -148,6 +148,9 @@ public class ScilabTypeCoder {
     private void encode(ScilabDouble var, VectorOfDouble vec) {
         // Header
         encodeHeader(var, vec, ScilabTypeEnum.sci_matrix);
+        if (var.getHeight() * var.getWidth() == 0) {
+            return;
+        }
 
         // specific flag for managing the complex case
         if (var.isReal()) {
@@ -207,6 +210,9 @@ public class ScilabTypeCoder {
 
         // Header
         encodeHeader(var, vec, ScilabTypeEnum.sci_ints);
+        if (var.getHeight() * var.getWidth() == 0) {
+            return;
+        }
 
         // push the data on a pre-allocated space
         final int requiredBytes = sizeof * var.getHeight() * var.getWidth();
@@ -242,6 +248,9 @@ public class ScilabTypeCoder {
     private void encode(ScilabBoolean var, VectorOfDouble vec) {
         // header
         encodeHeader(var, vec, ScilabTypeEnum.sci_boolean);
+        if (var.getHeight() * var.getWidth() == 0) {
+            return;
+        }
 
         // put all the boolean as int accordingly to Scilab 6 implementation
         final int requiredBytes = Integer.BYTES * var.getHeight() * var.getWidth();
@@ -261,6 +270,9 @@ public class ScilabTypeCoder {
     private void encode(ScilabString var, VectorOfDouble vec) {
         // header
         encodeHeader(var, vec, ScilabTypeEnum.sci_strings);
+        if (var.getHeight() * var.getWidth() == 0) {
+            return;
+        }
 
         // add the offset table which contains the offset of each UTF-8 encoded strings
         int offsetTableStart = vec.size();
@@ -330,6 +342,16 @@ public class ScilabTypeCoder {
                 throw new IllegalArgumentException();
         }
 
+        // corner-case [] is a ScilabDouble
+        if (matrix != null && matrix.getHeight() * matrix.getWidth() == 0) {
+            vec.add(ScilabTypeEnum.sci_matrix.swigValue());
+            vec.add(2);
+            vec.add(0);
+            vec.add(0);
+            vec.add(0); // isComplex is part of []
+            return;
+        }
+
         vec.add(as.swigValue());
         if (matrix instanceof ScilabInteger) {
             vec.add(((ScilabInteger) matrix).getPrec().swigValue());
@@ -613,13 +635,13 @@ public class ScilabTypeCoder {
                 }
             case sci_boolean:
                 if (height * width == 0) {
-                    return new ScilabBoolean();
+                    return new ScilabDouble();
                 } else {
                     return new ScilabBoolean(new boolean[height][width]);
                 }
             case sci_ints:
                 if (height * width == 0) {
-                    return new ScilabInteger();
+                    return new ScilabDouble();
                 } else {
                     switch (ScilabIntegerTypeEnum.swigToEnum(precision)) {
                         case sci_int8:
@@ -643,7 +665,7 @@ public class ScilabTypeCoder {
                 }
             case sci_strings:
                 if (height * width == 0) {
-                    return new ScilabString();
+                    return new ScilabDouble();
                 } else {
                     return new ScilabString(new String[height][width]);
                 }
index 2ccc5d8..b753232 100644 (file)
@@ -96,8 +96,8 @@ class JGraphXHandler implements ScilabHandler {
 
                         VectorOfDouble parentGeom = new VectorOfDouble(4);
                         saxHandler.controller.getObjectProperty(parentUID[0], saxHandler.controller.getKind(parentUID[0]), ObjectProperties.GEOMETRY, parentGeom);
-                        g.setX(parentGeom.get(0) + g.getX() * parentGeom.get(2));
-                        g.setY(parentGeom.get(1) + g.getY() * parentGeom.get(3));
+                        g.setX(g.getX() * parentGeom.get(2));
+                        g.setY(g.getY() * parentGeom.get(3));
                     }
                 }
 
@@ -156,6 +156,19 @@ class JGraphXHandler implements ScilabHandler {
                             geom.put(1, geom.get(1) + p.getY());
                             saxHandler.controller.setObjectProperty(annotation[0], Kind.ANNOTATION, ObjectProperties.GEOMETRY, geometry);
                         }
+
+                        // translate control-points
+                        if (kind == Kind.LINK) {
+                            VectorOfDouble controlPoints = new VectorOfDouble();
+                            saxHandler.controller.getObjectProperty(uid, kind, ObjectProperties.CONTROL_POINTS, controlPoints);
+
+                            DoubleBuffer points = controlPoints.asByteBuffer(0, controlPoints.size()).asDoubleBuffer();
+                            for (int i = 0; i < controlPoints.size(); i += 2) {
+                                points.put(i, points.get(i) + p.getX());
+                                points.put(i + 1, points.get(i + 1) + p.getY());
+                            }
+                            saxHandler.controller.setObjectProperty(uid, kind, ObjectProperties.CONTROL_POINTS, controlPoints);
+                        }
                     }
 
                 }
index 6493384..04d175f 100644 (file)
@@ -51,6 +51,9 @@ public final class BlockElement extends AbstractElement<BasicBlock> {
     /** Mutable field to easily get the data through methods */
     private ScilabMList data;
 
+    /** In-progress decoded diagram */
+    private final XcosDiagram diag;
+
     /** Element used to decode/encode Scicos model part into a BasicBlock */
     private final BlockModelElement modelElement;
 
@@ -74,6 +77,7 @@ public final class BlockElement extends AbstractElement<BasicBlock> {
      */
     public BlockElement(final JavaController controller, final XcosDiagram diag) {
         super(controller);
+        this.diag = diag;
 
         modelElement = new BlockModelElement(controller, diag);
         graphicElement = new BlockGraphicElement(controller, diag);
@@ -110,6 +114,14 @@ public final class BlockElement extends AbstractElement<BasicBlock> {
             block = XcosCellFactory.createBlock(controller, func, interfunction, controller.createObject(Kind.BLOCK), Kind.BLOCK);
         }
 
+        // associate the parent - children relation before decoding it.
+        long[] parentDiagram = {0};
+        if (diag.getKind() == Kind.BLOCK) {
+            controller.getObjectProperty(diag.getUID(), diag.getKind(), ObjectProperties.PARENT_DIAGRAM, parentDiagram);
+            controller.setObjectProperty(block.getUID(), block.getKind(), ObjectProperties.PARENT_BLOCK, diag.getUID());
+        }
+        controller.setObjectProperty(block.getUID(), block.getKind(), ObjectProperties.PARENT_DIAGRAM, parentDiagram[0]);
+
         block = beforeDecode(element, block);
 
         /*
index 1fa0b41..3055108 100644 (file)
@@ -193,7 +193,7 @@ public final class DiagramElement extends AbstractElement<XcosDiagram> {
 
         // Fill the diagram attributes
         ScicosParametersElement params = new ScicosParametersElement(controller);
-        params.decode(base.get(1), new ScicosParameters(Xcos.findRoot(diag), new ScicosObjectOwner(diag.getUID(), diag.getKind())));
+        params.decode(base.get(1), new ScicosParameters(Xcos.findRoot(controller, diag), new ScicosObjectOwner(controller, diag.getUID(), diag.getKind())));
 
         // Decode the objs attributes
         decodeObjs(diag);
index 3edf693..8d83676 100644 (file)
@@ -24,7 +24,6 @@ import java.util.zip.ZipOutputStream;
 import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
-import javax.xml.transform.stream.StreamResult;
 import org.scilab.modules.commons.xml.ScilabXMLOutputFactory;
 import org.scilab.modules.xcos.graph.XcosDiagram;
 import org.scilab.modules.xcos.io.sax.XcosSAXHandler;
@@ -84,8 +83,7 @@ public class ContentEntry implements Entry {
          */
         try {
             final XMLOutputFactory factory = ScilabXMLOutputFactory.newInstance();
-            final StreamResult result = new StreamResult(stream);
-            final XMLStreamWriter writer = factory.createXMLStreamWriter(result);
+            final XMLStreamWriter writer = factory.createXMLStreamWriter(stream, "UTF-8");
 
             LOG.entering("XMLStreamWriter", "write");
             new XcosWriter(pack.getDictionary(), writer).write(content.getUID(), content.getKind());