From 19d63c89c7d9f6e2ad9da9258d651a8826f37975 Mon Sep 17 00:00:00 2001
From: Alexander N <alpha-beta-release@gmx.net>
Date: Fri, 12 Apr 2013 14:07:09 +0000
Subject: [PATCH] raise HeaderError if, file header is invalid.

---
 io_scene_ms3d/__init__.py    |  2 +-
 io_scene_ms3d/ms3d_export.py | 20 +++++++++------
 io_scene_ms3d/ms3d_import.py | 50 ++++++++++++++++++++++++------------
 io_scene_ms3d/ms3d_spec.py   |  5 ++++
 io_scene_ms3d/ms3d_ui.py     | 18 +++++++------
 5 files changed, 61 insertions(+), 34 deletions(-)

diff --git a/io_scene_ms3d/__init__.py b/io_scene_ms3d/__init__.py
index 35f7c41e6..be6054768 100644
--- a/io_scene_ms3d/__init__.py
+++ b/io_scene_ms3d/__init__.py
@@ -23,7 +23,7 @@ bl_info = {
     'description': "Import / Export MilkShape3D MS3D files"\
             " (conform with MilkShape3D v1.8.4)",
     'author': "Alexander Nussbaumer",
-    'version': (0, 97, 0),
+    'version': (0, 98, 0),
     'blender': (2, 66, 0),
     'location': "File > Import & File > Export",
     'warning': "",
diff --git a/io_scene_ms3d/ms3d_export.py b/io_scene_ms3d/ms3d_export.py
index d29f3e2c2..50390f54a 100644
--- a/io_scene_ms3d/ms3d_export.py
+++ b/io_scene_ms3d/ms3d_export.py
@@ -180,11 +180,13 @@ class Ms3dExporter():
             if self.options_verbose in Ms3dUi.VERBOSE_NORMAL:
                 print("write - exception in try block\n  type: '{0}'\n"
                         "  value: '{1}'".format(type, value, traceback))
+                if self.report:
+                    self.report({'WARNING', 'ERROR', }, "write - exception.")
 
             if t2 is None:
                 t2 = time()
 
-            raise
+            return False
 
         else:
             pass
@@ -194,7 +196,7 @@ class Ms3dExporter():
             print(ms3d_str['SUMMARY_EXPORT'].format(
                     (t3 - t1), (t2 - t1), (t3 - t2)))
 
-        return {"FINISHED"}
+        return True
 
 
     ###########################################################################
@@ -385,14 +387,16 @@ class Ms3dExporter():
                                     weights.append(blender_weight)
                                 elif count == 3:
                                     bone_ids.append(ms3d_index)
-                                    self.report(
-                                            {'WARNING', 'INFO'},
-                                            ms3d_str['WARNING_EXPORT_SKIP_WEIGHT'])
+                                    if self.report and self.options_verbose in Ms3dUi.VERBOSE_NORMAL:
+                                        self.report(
+                                                {'WARNING', 'INFO'},
+                                                ms3d_str['WARNING_EXPORT_SKIP_WEIGHT'])
                                 else:
                                     # only first three weights will be supported / four bones
-                                    self.report(
-                                            {'WARNING', 'INFO'},
-                                            ms3d_str['WARNING_EXPORT_SKIP_WEIGHT_EX'])
+                                    if self.report and self.options_verbose in Ms3dUi.VERBOSE_NORMAL:
+                                        self.report(
+                                                {'WARNING', 'INFO'},
+                                                ms3d_str['WARNING_EXPORT_SKIP_WEIGHT_EX'])
                                     break
                                 count += 1
 
diff --git a/io_scene_ms3d/ms3d_import.py b/io_scene_ms3d/ms3d_import.py
index c9e87c231..e824aba1c 100644
--- a/io_scene_ms3d/ms3d_import.py
+++ b/io_scene_ms3d/ms3d_import.py
@@ -56,6 +56,7 @@ from io_scene_ms3d.ms3d_spec import (
         Ms3dModel,
         Ms3dVertexEx2,
         Ms3dVertexEx3,
+        Ms3dHeader,
         )
 from io_scene_ms3d.ms3d_utils import (
         select_all,
@@ -160,16 +161,27 @@ class Ms3dImporter():
                 print(statistics)
                 print("##########################################################")
 
+        except Ms3dHeader.HeaderError:
+            msg = "read - invalid file format."
+            if self.options_verbose in Ms3dUi.VERBOSE_NORMAL:
+                print(msg)
+                if self.report:
+                    self.report({'WARNING', 'ERROR', }, msg)
+
+            return False
+
         except Exception:
             type, value, traceback = exc_info()
             if self.options_verbose in Ms3dUi.VERBOSE_NORMAL:
                 print("read - exception in try block\n  type: '{0}'\n"
                         "  value: '{1}'".format(type, value, traceback))
+                if self.report:
+                    self.report({'WARNING', 'ERROR', }, "read - exception.")
 
             if t2 is None:
                 t2 = time()
 
-            raise
+            return False
 
         else:
             pass
@@ -180,7 +192,7 @@ class Ms3dImporter():
             print(ms3d_str['SUMMARY_IMPORT'].format(
                     (t3 - t1), (t2 - t1), (t3 - t2)))
 
-        return {"FINISHED"}
+        return True
 
 
     ###########################################################################
@@ -495,35 +507,39 @@ class Ms3dImporter():
                         bmv_new[layer_extra] = bmv[layer_extra]
                         vert_index = length_verts
                         length_verts += 1
-                        self.report({'WARNING', 'INFO'},
-                                ms3d_str['WARNING_IMPORT_EXTRA_VERTEX_NORMAL'].format(
-                                bmv.normal, blender_normal))
+                        if self.report and self.options_verbose in Ms3dUi.VERBOSE_NORMAL:
+                            self.report({'WARNING', 'INFO'},
+                                    ms3d_str['WARNING_IMPORT_EXTRA_VERTEX_NORMAL'].format(
+                                    bmv.normal, blender_normal))
                     bmv = bmv_new
 
                 if [[x] for x in bmv_list if x == bmv]:
-                    self.report(
-                            {'WARNING', 'INFO'},
-                            ms3d_str['WARNING_IMPORT_SKIP_VERTEX_DOUBLE'].format(
-                                    ms3d_triangle_index))
+                    if self.report and self.options_verbose in Ms3dUi.VERBOSE_NORMAL:
+                        self.report(
+                                {'WARNING', 'INFO'},
+                                ms3d_str['WARNING_IMPORT_SKIP_VERTEX_DOUBLE'].format(
+                                        ms3d_triangle_index))
                     continue
                 bmv_list.append(bmv)
                 bmf_normal += bmv.normal
 
             if len(bmv_list) < 3:
-                self.report(
-                        {'WARNING', 'INFO'},
-                        ms3d_str['WARNING_IMPORT_SKIP_LESS_VERTICES'].format(
-                                ms3d_triangle_index))
+                if self.report and self.options_verbose in Ms3dUi.VERBOSE_NORMAL:
+                    self.report(
+                            {'WARNING', 'INFO'},
+                            ms3d_str['WARNING_IMPORT_SKIP_LESS_VERTICES'].format(
+                                    ms3d_triangle_index))
                 continue
 
             bmf_normal.normalize()
 
             bmf = bm.faces.get(bmv_list)
             if bmf is not None:
-                self.report(
-                        {'WARNING', 'INFO'},
-                        ms3d_str['WARNING_IMPORT_SKIP_FACE_DOUBLE'].format(
-                                ms3d_triangle_index))
+                if self.report and self.options_verbose in Ms3dUi.VERBOSE_NORMAL:
+                    self.report(
+                            {'WARNING', 'INFO'},
+                            ms3d_str['WARNING_IMPORT_SKIP_FACE_DOUBLE'].format(
+                                    ms3d_triangle_index))
                 continue
 
             bmf = bm.faces.new(bmv_list)
diff --git a/io_scene_ms3d/ms3d_spec.py b/io_scene_ms3d/ms3d_spec.py
index d5d5d7875..d5eadbee2 100644
--- a/io_scene_ms3d/ms3d_spec.py
+++ b/io_scene_ms3d/ms3d_spec.py
@@ -351,6 +351,10 @@ class Ms3dHeader:
         Ms3dIo.write_string(raw_io, Ms3dIo.LENGTH_ID, self.id)
         Ms3dIo.write_dword(raw_io, self.version)
 
+    class HeaderError(Exception):
+        pass
+
+
 
 ###############################################################################
 class Ms3dVertex:
@@ -1740,6 +1744,7 @@ class Ms3dModel:
         self.header.read(raw_io)
         if (self.header != Ms3dHeader()):
             debug_out.append("\nwarning, invalid file header\n")
+            raise Ms3dHeader.HeaderError
 
         _number_vertices = Ms3dIo.read_word(raw_io)
         if (_number_vertices > Ms3dSpec.MAX_VERTICES):
diff --git a/io_scene_ms3d/ms3d_ui.py b/io_scene_ms3d/ms3d_ui.py
index 8506b61df..70a79008b 100644
--- a/io_scene_ms3d/ms3d_ui.py
+++ b/io_scene_ms3d/ms3d_ui.py
@@ -392,7 +392,7 @@ class Ms3dImportOperator(Operator, ImportHelper):
     def execute(self, blender_context):
         """ start executing """
         from io_scene_ms3d.ms3d_import import (Ms3dImporter, )
-        Ms3dImporter(
+        finished = Ms3dImporter(
                 report=self.report,
                 verbose=self.verbose,
                 use_extended_normal_handling=self.use_extended_normal_handling,
@@ -405,9 +405,10 @@ class Ms3dImportOperator(Operator, ImportHelper):
                         blender_context,
                         self.filepath
                         )
-
-        blender_context.scene.update()
-        return {"FINISHED"}
+        if finished:
+            blender_context.scene.update()
+            return {"FINISHED"}
+        return {"CANCELLED"}
 
     def invoke(self, blender_context, event):
         blender_context.window_manager.fileselect_add(self)
@@ -595,7 +596,7 @@ class Ms3dExportOperator(Operator, ExportHelper):
     def execute(self, blender_context):
         """start executing"""
         from io_scene_ms3d.ms3d_export import (Ms3dExporter, )
-        Ms3dExporter(
+        finished = Ms3dExporter(
                 self.report,
                 verbose=self.verbose,
                 use_blender_names=self.use_blender_names,
@@ -611,9 +612,10 @@ class Ms3dExportOperator(Operator, ExportHelper):
                         blender_context,
                         self.filepath
                         )
-
-        blender_context.scene.update()
-        return {"FINISHED"}
+        if finished:
+            blender_context.scene.update()
+            return {"FINISHED"}
+        return {"CANCELLED"}
 
     #
     def invoke(self, blender_context, event):
-- 
GitLab