32aa5636e080ec39c8d8c653b5076621759858bd
[blender.git] / source / blender / collada / ErrorHandler.cpp
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): Nathan Letwory.
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 /** \file blender/collada/ErrorHandler.cpp
24  *  \ingroup collada
25  */
26 #include "ErrorHandler.h"
27 #include <iostream>
28
29 #include "COLLADASaxFWLIError.h"
30 #include "COLLADASaxFWLSaxParserError.h"
31 #include "COLLADASaxFWLSaxFWLError.h"
32
33 #include "GeneratedSaxParserParserError.h"
34
35 #include <string.h>
36
37 #include "BLI_utildefines.h"
38
39 //--------------------------------------------------------------------
40 ErrorHandler::ErrorHandler() : mError(false)
41 {
42 }
43
44 //--------------------------------------------------------------------
45 ErrorHandler::~ErrorHandler()
46 {
47 }
48
49 //--------------------------------------------------------------------
50 bool ErrorHandler::handleError(const COLLADASaxFWL::IError *error)
51 {
52         bool isError = false;
53         
54         if (error->getErrorClass() == COLLADASaxFWL::IError::ERROR_SAXPARSER) {
55                 COLLADASaxFWL::SaxParserError *saxParserError = (COLLADASaxFWL::SaxParserError *) error;
56                 const GeneratedSaxParser::ParserError& parserError = saxParserError->getError();
57
58                 // Workaround to avoid wrong error
59                 if (parserError.getErrorType() == GeneratedSaxParser::ParserError::ERROR_VALIDATION_MIN_OCCURS_UNMATCHED) {
60                         if (STREQ(parserError.getElement(), "effect")) {
61                                 isError = false;
62                         }
63                 }
64                 if (parserError.getErrorType() == GeneratedSaxParser::ParserError::ERROR_VALIDATION_SEQUENCE_PREVIOUS_SIBLING_NOT_PRESENT) {
65                         if (!(STREQ(parserError.getElement(), "extra") &&
66                               STREQ(parserError.getAdditionalText().c_str(), "sibling: fx_profile_abstract")))
67                         {
68                                 isError = false;
69                         }
70                 }
71
72                 if (parserError.getErrorType() == GeneratedSaxParser::ParserError::ERROR_COULD_NOT_OPEN_FILE) {
73                         std::cout << "Couldn't open file" << std::endl;
74                 }
75
76                 std::cout << "Schema validation error: " << parserError.getErrorMessage() << std::endl;
77         }
78         else if (error->getErrorClass() == COLLADASaxFWL::IError::ERROR_SAXFWL) {
79                 COLLADASaxFWL::SaxFWLError *saxFWLError = (COLLADASaxFWL::SaxFWLError *) error;
80                 /*
81                  * Accept non critical errors as warnings (i.e. texture not found)
82                  * This makes the importer more graceful, so it now imports what makes sense.
83                  */
84                 isError = (saxFWLError->getSeverity() != COLLADASaxFWL::IError::SEVERITY_ERROR_NONCRITICAL);
85                 std::cout << "Sax FWL Error: " << saxFWLError->getErrorMessage() << std::endl;
86         }
87         else {
88                 std::cout << "opencollada error: " << error->getFullErrorMessage() << std::endl;
89         }
90
91         mError |= isError;
92
93         return isError; // let OpenCollada decide when to abort
94 }