[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [39939] trunk/blender/source/blender: Add parser error handler.

Nathan Letwory nathan at letworyinteractive.com
Mon Sep 5 22:41:59 CEST 2011


Revision: 39939
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=39939
Author:   jesterking
Date:     2011-09-05 20:41:58 +0000 (Mon, 05 Sep 2011)
Log Message:
-----------
Add parser error handler.

OpenCOLLADA is a validating parser, so is pretty strict about document form. The added error handler will print out any errors the parser finds. A pop-up will be shown too, advising the user to check the console for the error log.

Modified Paths:
--------------
    trunk/blender/source/blender/collada/CMakeLists.txt
    trunk/blender/source/blender/collada/DocumentImporter.cpp
    trunk/blender/source/blender/collada/collada.cpp
    trunk/blender/source/blender/windowmanager/intern/wm_operators.c

Added Paths:
-----------
    trunk/blender/source/blender/collada/ErrorHandler.cpp
    trunk/blender/source/blender/collada/ErrorHandler.h

Modified: trunk/blender/source/blender/collada/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/collada/CMakeLists.txt	2011-09-05 19:55:22 UTC (rev 39938)
+++ trunk/blender/source/blender/collada/CMakeLists.txt	2011-09-05 20:41:58 UTC (rev 39939)
@@ -51,6 +51,7 @@
 	DocumentExporter.cpp
 	DocumentImporter.cpp
 	EffectExporter.cpp
+	ErrorHandler.cpp
 	ExtraHandler.cpp
 	ExtraTags.cpp
 	GeometryExporter.cpp
@@ -74,6 +75,7 @@
 	DocumentExporter.h
 	DocumentImporter.h
 	EffectExporter.h
+	ErrorHandler.h
 	ExtraHandler.h
 	ExtraTags.h
 	GeometryExporter.h

Modified: trunk/blender/source/blender/collada/DocumentImporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/DocumentImporter.cpp	2011-09-05 19:55:22 UTC (rev 39938)
+++ trunk/blender/source/blender/collada/DocumentImporter.cpp	2011-09-05 20:41:58 UTC (rev 39939)
@@ -76,6 +76,7 @@
 #include "MEM_guardedalloc.h"
 
 #include "ExtraHandler.h"
+#include "ErrorHandler.h"
 #include "DocumentImporter.h"
 #include "TransformReader.h"
 
@@ -113,17 +114,19 @@
 
 bool DocumentImporter::import()
 {
-	/** TODO Add error handler (implement COLLADASaxFWL::IErrorHandler */
-	COLLADASaxFWL::Loader loader;
+	ErrorHandler errorHandler;
+	COLLADASaxFWL::Loader loader(&errorHandler);
 	COLLADAFW::Root root(&loader, this);
 	ExtraHandler *ehandler = new ExtraHandler(this, &(this->anim_importer));
 	
 	loader.registerExtraDataCallbackHandler(ehandler);
-	
 
 	if (!root.loadDocument(mFilename))
 		return false;
 	
+	if(errorHandler.hasError())
+		return false;
+	
 	/** TODO set up scene graph and such here */
 	
 	mImportStage = Controller;

Added: trunk/blender/source/blender/collada/ErrorHandler.cpp
===================================================================
--- trunk/blender/source/blender/collada/ErrorHandler.cpp	                        (rev 0)
+++ trunk/blender/source/blender/collada/ErrorHandler.cpp	2011-09-05 20:41:58 UTC (rev 39939)
@@ -0,0 +1,90 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/collada/ErrorHandler.cpp
+ *  \ingroup collada
+ */
+#include "ErrorHandler.h"
+#include <iostream>
+
+#include "COLLADASaxFWLIError.h"
+#include "COLLADASaxFWLSaxParserError.h"
+#include "COLLADASaxFWLSaxFWLError.h"
+
+#include "GeneratedSaxParserParserError.h"
+
+#include <string.h>
+
+//--------------------------------------------------------------------
+ErrorHandler::ErrorHandler() : mError(false)
+{
+}
+
+//--------------------------------------------------------------------
+ErrorHandler::~ErrorHandler()
+{
+}
+
+//--------------------------------------------------------------------
+bool ErrorHandler::handleError( const COLLADASaxFWL::IError* error )
+{
+	if ( error->getErrorClass() == COLLADASaxFWL::IError::ERROR_SAXPARSER )
+	{
+		COLLADASaxFWL::SaxParserError* saxParserError = (COLLADASaxFWL::SaxParserError*) error;
+		const GeneratedSaxParser::ParserError& parserError = saxParserError->getError();
+
+		// Workaround to avoid wrong error
+		if ( parserError.getErrorType() == GeneratedSaxParser::ParserError::ERROR_VALIDATION_MIN_OCCURS_UNMATCHED)
+		{
+			if ( strcmp(parserError.getElement(), "effect") == 0 )
+			{
+				return false;
+			}
+		}
+		if ( parserError.getErrorType() == GeneratedSaxParser::ParserError::ERROR_VALIDATION_SEQUENCE_PREVIOUS_SIBLING_NOT_PRESENT)
+		{
+			if ( (strcmp(parserError.getElement(), "extra") == 0) 
+				&& (strcmp(parserError.getAdditionalText().c_str(), "sibling: fx_profile_abstract") == 0)) 
+			{
+				return false;
+			}
+		}
+
+		if ( parserError.getErrorType() == GeneratedSaxParser::ParserError::ERROR_COULD_NOT_OPEN_FILE)
+		{
+			std::cout << "Couldn't open file" << std::endl;
+			mError = true;
+		}
+
+		std::cout << "Schema validation error: " << parserError.getErrorMessage() << std::endl;
+		mError = true;
+	}
+	else if ( error->getErrorClass() == COLLADASaxFWL::IError::ERROR_SAXFWL )
+	{
+		COLLADASaxFWL::SaxFWLError* saxFWLError = (COLLADASaxFWL::SaxFWLError*) error;
+		std::cout << "Sax FWL Error: " << saxFWLError->getErrorMessage() << std::endl;
+		mError = true;
+	}
+	return false;
+}

Added: trunk/blender/source/blender/collada/ErrorHandler.h
===================================================================
--- trunk/blender/source/blender/collada/ErrorHandler.h	                        (rev 0)
+++ trunk/blender/source/blender/collada/ErrorHandler.h	2011-09-05 20:41:58 UTC (rev 39939)
@@ -0,0 +1,58 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/collada/ErrorHandler.h
+ *  \ingroup collada
+ */
+
+#include <string>
+#include <map>
+#include <vector>
+#include <algorithm> // sort()
+
+#include "COLLADASaxFWLIErrorHandler.h"
+
+/** \brief Handler class for parser errors
+ */
+class ErrorHandler : public COLLADASaxFWL::IErrorHandler
+{
+public:
+	/** Constructor. */
+	ErrorHandler();
+
+	/** Destructor. */
+	virtual ~ErrorHandler();
+	/** handle any error thrown by the parser. */
+	bool virtual handleError(const COLLADASaxFWL::IError* error);
+	/** True if there was an error during parsing. */
+	bool hasError() { return mError; }
+private:
+	/** Disable default copy ctor. */
+	ErrorHandler( const ErrorHandler& pre );
+	/** Disable default assignment operator. */
+	const ErrorHandler& operator= ( const ErrorHandler& pre );
+	/** Hold error status. */
+	bool mError;
+};
+

Modified: trunk/blender/source/blender/collada/collada.cpp
===================================================================
--- trunk/blender/source/blender/collada/collada.cpp	2011-09-05 19:55:22 UTC (rev 39938)
+++ trunk/blender/source/blender/collada/collada.cpp	2011-09-05 20:41:58 UTC (rev 39939)
@@ -46,9 +46,9 @@
 	int collada_import(bContext *C, const char *filepath)
 	{
 		DocumentImporter imp (C, filepath);
-		imp.import();
+		if(imp.import()) return 1;
 
-		return 1;
+		return 0;
 	}
 
 	int collada_export(Scene *sce, const char *filepath, int selected)

Modified: trunk/blender/source/blender/windowmanager/intern/wm_operators.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_operators.c	2011-09-05 19:55:22 UTC (rev 39938)
+++ trunk/blender/source/blender/windowmanager/intern/wm_operators.c	2011-09-05 20:41:58 UTC (rev 39939)
@@ -2082,8 +2082,10 @@
 	}
 
 	RNA_string_get(op->ptr, "filepath", filename);
-	collada_import(C, filename);
+	if(collada_import(C, filename)) return OPERATOR_FINISHED;
 	
+	BKE_report(op->reports, RPT_ERROR, "Errors found during parsing COLLADA document. Please see console for error log.");
+	
 	return OPERATOR_FINISHED;
 }
 




More information about the Bf-blender-cvs mailing list