Bug 13023 fixed: xs2pdf crashed under Windows when target file is already open 77/13177/2
Calixte DENIZET [Tue, 19 Nov 2013 09:38:54 +0000 (10:38 +0100)]
Change-Id: Ie74c9447844b2042e73301723b2859bf0f068511

scilab/CHANGES_5.5.X
scilab/modules/graphic_export/src/java/org/scilab/modules/graphic_export/Export.java
scilab/modules/graphic_export/src/java/org/scilab/modules/graphic_export/FileExporter.java

index d234b41..54cac8b 100644 (file)
@@ -155,6 +155,8 @@ Scilab Bug Fixes
 
 * Bug #13022 fixed - Vectorial export did not clip large segments.
 
+* Bug #13023 fixed - xs2pdf crashed under Windows when the target file was already open.
+
 * Bug #13027 fixed - There was no autowrap into array in JIMS.
 
 * Bug #13032 fixed - Fixed CMATVIEW help example and created one for CMAT3D.
index 0e0e620..4a37bfe 100644 (file)
@@ -24,6 +24,7 @@ import java.awt.image.BufferedImage;
 import java.io.BufferedOutputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
@@ -74,6 +75,7 @@ public class Export {
     public static final int INVALID_FILE = 2;
     public static final int MEMORY_ERROR = 3;
     public static final int UNKNOWN_ERROR = 4;
+    public static final int FILENOTFOUND_ERROR = 5;
 
     private static final float DEFAULT_JPEG_COMPRESSION = 0.95f;
 
@@ -182,6 +184,9 @@ public class Export {
         try {
             return exportVectorial(uid, types[type], f, params, headless);
         } catch (IOException e) {
+            if (e instanceof FileNotFoundException) {
+                return FILENOTFOUND_ERROR;
+            }
             return IOEXCEPTION_ERROR;
         }
     }
@@ -203,6 +208,10 @@ public class Export {
             int height = dims[1];
 
             Graphics2D g2d = exporter.getGraphics2D(width, height, file, params);
+            if (g2d == null) {
+                return FILENOTFOUND_ERROR;
+            }
+
             params.setParamsOnGraphics(g2d);
 
             Canvas canvas = G2DCanvasFactory.createCanvas(g2d, width, height);
@@ -220,6 +229,8 @@ public class Export {
                 exporter.write();
             } catch (OutOfMemoryError e) {
                 return MEMORY_ERROR;
+            } catch (IOException e) {
+                throw e;
             } catch (Throwable e) {
                 return UNKNOWN_ERROR;
             } finally {
@@ -244,6 +255,8 @@ public class Export {
                 }
             } catch (OutOfMemoryError e) {
                 return MEMORY_ERROR;
+            } catch (IOException e) {
+                throw e;
             } catch (Throwable e) {
                 return UNKNOWN_ERROR;
             } finally {
@@ -284,6 +297,9 @@ public class Export {
         try {
             exportBitmap(uid, types[type], f, fromScreen, params);
         } catch (IOException e) {
+            if (e instanceof FileNotFoundException) {
+                return FILENOTFOUND_ERROR;
+            }
             return IOEXCEPTION_ERROR;
         }
 
index 9f18734..54bcc36 100644 (file)
@@ -54,6 +54,8 @@ public class FileExporter {
                 return Messages.gettext("Unable to create export file, not enough memory. Decreasing the number of elements or the size of the figure should fix this error.");
             case Export.UNKNOWN_ERROR :
                 return Messages.gettext("Unable to create export file, please fill a bug report at http://bugzilla.scilab.org.");
+            case Export.FILENOTFOUND_ERROR :
+                return Messages.gettext("Unable to create export file, the file cannot be created or is locked by an other process.");
             default :
                 return "";
         }