/* Copyright (C) 2005-2007 Feeling Software Inc. Portions of the code are: Copyright (C) 2005-2007 Sony Computer Entertainment America MIT License: http://www.opensource.org/licenses/mit-license.php */ /** @file FUError.h This file contains the FUError class. */ #ifndef _FU_ERROR_H_ #define _FU_ERROR_H_ #ifndef _FU_EVENT_H_ #include "FUtils/FUEvent.h" #endif // _FU_EVENT_H_ #ifndef _FU_CRITICAL_SECTION_H_ #include "FUtils/FUCriticalSection.h" #endif // _FU_CRITICAL_SECTION_H_ /** Windows API defines this. */ #undef ERROR /** This class deals with error message generated by FCollada. The constructor and the destructor are private: this class is meant to be used as a namespace. All error handler is wrapped around a critical section to work correctly in a multi-threaded environment. @ingroup FUtils */ class FCOLLADA_EXPORT FUError { public: /** Error code used to retrieve localized error message. */ enum Code { // // Errors // ERROR_DEFAULT_ERROR = 0, ERROR_MALFORMED_XML, ERROR_PARSING_FAILED, ERROR_INVALID_ELEMENT, ERROR_MISSING_ELEMENT, /*[0, 4]*/ ERROR_UNKNOWN_ELEMENT, ERROR_MISSING_INPUT, ERROR_INVALID_URI, ERROR_WRITE_FILE, ERROR_MISSING_PROPERTY, /*[5, 9]*/ NO_MATCHING_PLUGIN, ERROR_ANIM_CURVE_DRIVER_MISSING, ERROR_SOURCE_SIZE, ERROR_IB_MATRIX_MISSING, ERROR_VCOUNT_MISSING, ERROR_V_ELEMENT_MISSING, ERROR_JC_BPMC_NOT_EQUAL, ERROR_INVALID_VCOUNT, ERROR_PARSING_PROG_ERROR, ERROR_UNKNOWN_CHILD, ERROR_UNKNOWN_GEO_CH, ERROR_UNKNOWN_MESH_ID, ERROR_INVALID_U_KNOT, ERROR_INVALID_V_KNOT, ERROR_NOT_ENOUGHT_V_KNOT, ERROR_NOT_ENOUGHT_U_KNOT, ERROR_INVALID_CONTROL_VERTICES, ERROR_NO_CONTROL_VERTICES, ERROR_UNKNOWN_POLYGONS, WARNING_NO_POLYGON, ERROR_NO_VERTEX_INPUT, ERROR_NO_VCOUNT, ERROR_MISPLACED_VCOUNT, ERROR_UNKNOWN_PH_ELEMENT, ERROR_INVALID_FACE_COUNT, ERROR_DUPLICATE_ID, ERROR_INVALID_CVS_WEIGHTS, ERROR_INVALID_SPLINE, ERROR_UNKNOWN_EFFECT_CODE, ERROR_BAD_FLOAT_VALUE, ERROR_BAD_BOOLEAN_VALUE, ERROR_BAD_FLOAT_PARAM, ERROR_BAD_FLOAT_PARAM2, ERROR_BAD_FLOAT_PARAM3, ERROR_BAD_FLOAT_PARAM4, ERROR_BAD_MATRIX, ERROR_PROG_NODE_MISSING, ERROR_INVALID_TEXTURE_SAMPLER, ERROR_PARAM_NODE_MISSING, ERROR_INVALID_IMAGE_FILENAME, ERROR_UNKNOWN_TEXTURE_SAMPLER, ERROR_COMMON_TECHNIQUE_MISSING, ERROR_TECHNIQUE_NODE_MISSING, ERROR_PHYSICS_MODEL_CYCLE_DETECTED, // max only errors ERROR_MAX_CANNOT_RESIZE_MUT_LIST, // //Warnings // WARNING_UNSUPPORTED_TEXTURE_UVS, // Warnings WARNING_MISSING_URI_TARGET, WARNING_UNKNOWN_CHILD_ELEMENT, WARNING_UNKNOWN_AC_CHILD_ELEMENT, WARNING_BASE_NODE_TYPE, WARNING_INST_ENTITY_MISSING, WARNING_INVALID_MATERIAL_BINDING, WARNING_UNKNOWN_MAT_ID, WARNING_RIGID_CONSTRAINT_MISSING, WARNING_INVALID_ANIM_LIB, WARNING_INVALID_ANIM_TARGET, WARNING_UNKNOWN_ANIM_LIB_ELEMENT, WARNING_INVALID_SE_PAIR, WARNING_CURVES_MISSING, WARNING_EMPTY_ANIM_CLIP, WARNING_UNKNOWN_CAM_ELEMENT, WARNING_NO_STD_PROG_TYPE, WARNING_PARAM_ROOT_MISSING, WARNING_UNKNOWN_CAM_PROG_TYPE, WARNING_UNKNOWN_CAM_PARAM, WARNING_UNKNOWN_LIGHT_LIB_ELEMENT, WARNING_UNKNOWN_LIGHT_TYPE_VALUE, WARNING_UNKNOWN_LT_ELEMENT, WARNING_UNKNOWN_LIGHT_PROG_PARAM, WARNING_INVALID_CONTROLLER_LIB_NODE, WARNING_CONTROLLER_TYPE_CONFLICT, WARNING_SM_BASE_MISSING, WARNING_UNKNOWN_MC_PROC_METHOD, WARNING_UNKNOWN_MC_BASE_TARGET_MISSING, WARNING_UNKNOWN_MORPH_TARGET_TYPE, WARNING_TARGET_GEOMETRY_MISSING, WARNING_CONTROLLER_TARGET_MISSING, WARNING_UNKNOWN_SC_VERTEX_INPUT, WARNING_INVALID_TARGET_GEOMETRY_OP, WARNING_INVALID_JOINT_INDEX, WARNING_INVALID_WEIGHT_INDEX, WARNING_UNKNOWN_JOINT, WARNING_UNKNOWN_GL_ELEMENT, WARNING_EMPTY_GEOMETRY, WARNING_MESH_VERTICES_MISSING, WARNING_VP_INPUT_NODE_MISSING, WARNING_GEOMETRY_VERTICES_MISSING, WARNING_MESH_TESSELLATION_MISSING, WARNING_INVALID_POLYGON_MAT_SYMBOL, WARNING_EXTRA_VERTEX_INPUT, WARNING_UNKNOWN_POLYGONS_INPUT, WARNING_UNKNOWN_POLYGON_CHILD, WARNING_INVALID_PRIMITIVE_COUNT, WARNING_INVALID_GEOMETRY_SOURCE_ID, WARNING_EMPTY_SOURCE, WARNING_EMPTY_POLYGONS, WARNING_SPLINE_CONTROL_INPUT_MISSING, WARNING_CONTROL_VERTICES_MISSING, WARNING_VARYING_SPLINE_TYPE, WARNING_UNKNOWN_EFFECT_ELEMENT, WARNING_UNSUPPORTED_PROFILE, WARNING_SID_MISSING, WARNING_INVALID_ANNO_TYPE, WARNING_GEN_REF_ATTRIBUTE_MISSING, WARNING_MOD_REF_ATTRIBUTE_MISSING, WARNING_SAMPLER_NODE_MISSING, WARNING_EMPTY_SURFACE_SOURCE, WARNING_EMPTY_INIT_FROM, WARNING_EMPTY_IMAGE_NAME, WARNING_UNKNOWN_PASS_ELEMENT, WARNING_UNKNOWN_PASS_SHADER_ELEMENT, WARNING_UNAMED_EFFECT_PASS_SHADER, WARNING_UNKNOWN_EPS_STAGE, WARNING_INVALID_PROFILE_INPUT_NODE, WARNING_UNKNOWN_STD_MAT_BASE_ELEMENT, WARNING_TECHNIQUE_MISSING, WARNING_UNKNOWN_MAT_INPUT_SEMANTIC, WARNING_UNKNOWN_INPUT_TEXTURE, WARNING_UNSUPPORTED_SHADER_TYPE, WARNING_UNKNOWN_MAT_PARAM_NAME, WARNING_UNKNOWN_TECHNIQUE_ELEMENT, WARNING_UNKNOWN_IMAGE_LIB_ELEMENT, WARNING_UNKNOWN_TEX_LIB_ELEMENT, WARNING_UNKNOWN_CHANNEL_USAGE, WARNING_UNKNOWN_INPUTE_SEMANTIC, WARNING_UNKNOWN_IMAGE_SOURCE, WARNING_UNKNOWN_MAT_LIB_ELEMENT, WARNING_UNSUPPORTED_REF_EFFECTS, WARNING_EMPTY_INSTANCE_EFFECT, WARNING_EFFECT_MISSING, WARNING_UNKNOWN_FORCE_FIELD_ELEMENT, WARNING_UNKNOWN_ELEMENT, WARNING_INVALID_BOX_TYPE, WARNING_INVALID_PLANE_TYPE, WARNING_INVALID_SPHERE_TYPE, WARNING_INVALID_CAPSULE_TYPE, WARNING_INVALID_TCAPSULE_TYPE, WARNING_INVALID_TCYLINDER_TYPE, WARNING_UNKNOWN_PHYS_MAT_LIB_ELEMENT, WARNING_UNKNOWN_PHYS_LIB_ELEMENT, WARNING_CORRUPTED_INSTANCE, WARNING_UNKNOWN_PRB_LIB_ELEMENT, WARNING_PHYS_MAT_INST_MISSING, WARNING_PHYS_MAT_DEF_MISSING, WARNING_UNKNOWN_RGC_LIB_ELEMENT, WARNING_INVALID_NODE_TRANSFORM, WARNING_RF_NODE_MISSING, WARNING_RF_REF_NODE_MISSING, WARNING_TARGET_BS_NODE_MISSING, WARNING_TARGE_BS_REF_NODE_MISSING, WARNING_UNKNOW_PS_LIB_ELEMENT, WARNING_FCDGEOMETRY_INST_MISSING, WARNING_INVALID_SHAPE_NODE, WARNING_SHAPE_NODE_MISSING, WARNING_UNKNOW_NODE_ELEMENT_TYPE, WARNING_CYCLE_DETECTED, WARNING_INVALID_NODE_INST, WARNING_INVALID_WEAK_NODE_INST, WARNING_UNSUPPORTED_EXTERN_REF, WARNING_UNEXPECTED_ASSET, WARNING_INVALID_TRANSFORM, WARNING_TARGET_SCENE_NODE_MISSING, WARNING_UNSUPPORTED_EXTERN_REF_NODE, WARNING_XREF_UNASSIGNED, WARNING_MASS_AND_DENSITY_MISSING, // //Debug // DEBUG_LOAD_SUCCESSFUL, DEBUG_WRITE_SUCCESSFUL, ERROR_CUSTOM_STRING = 5000 }; /** Error level defines supported error message levels in FCollada */ enum Level { DEBUG_LEVEL = 0, WARNING_LEVEL = 1, ERROR_LEVEL = 2, LEVEL_COUNT }; /** Callback functor definition. */ typedef IFunctor3 FUErrorFunctor; private: static FUCriticalSection criticalSection; static FUEvent3 onErrorEvent; static FUEvent3 onWarningEvent; static FUEvent3 onDebugEvent; static fm::string customErrorString; static FUError::Level fatalLevel; // This class is not meant to be constructed. FUError(); ~FUError(); public: /** Logs and error message. @param errorLevel The error level of this error. Different callback is called for corresponding error level. @param errorCode The error code for the error message @param line The line number to indicate where the error has occured @return Whether the error is non-fatal. */ static bool Error(FUError::Level errorLevel, uint32 errorCode, uint32 line = 0); /** Add callback for error messages. @param errorLevel The error level whose callback is to be set. @param callback Callback to be called when FCollada generates error message. */ static void AddErrorCallback(FUError::Level errorLevel, FUErrorFunctor* callback); /** Adds a new callback that handles the event. @param errorLevel The error level whose callback is to be set. @param handle The object that contains the member function. @param _function The member function to callback. */ template static void AddErrorCallback(FUError::Level errorLevel, Class* handle, void (Class::*_function)(FUError::Level, uint32, uint32)) { AddErrorCallback(errorLevel, new FUFunctor3(handle, _function)); } /** Adds a new callback that handles the event. @param errorLevel The error level whose callback is to be set. @param _function The static function to callback. */ static void AddErrorCallback(FUError::Level errorLevel, void (*_function)(FUError::Level, uint32, uint32)) { AddErrorCallback(errorLevel, new FUStaticFunctor3(_function)); } /** Removes and releases a callback for error messages. @param errorLevel The error level whose callback is to be removed. @param object The object that contains the callback. @param function Callback that was registered to be called when FCollada generates error message. */ static void RemoveErrorCallback(FUError::Level errorLevel, void* object, void* function); /** Removes and releases a callback for error messages. @param errorLevel The error level whose callback is to be removed. @@param handle The object that contains the member function. @param _function The member function callback to unregister. */ template static void RemoveErrorCallback(FUError::Level errorLevel, Class* handle, void (Class::*_function)(FUError::Level, uint32, uint32)) { void* function = *(void**)(size_t)&_function; RemoveErrorCallback(errorLevel, (void*) handle, function); } /** Removes and releases a static callback for error messages. @param errorLevel The error level whose callback is to be removed. @@param _function The static function callback to unregister. */ static void RemoveErrorCallback(FUError::Level errorLevel, void (*_function)(FUError::Level, uint32, uint32)) { void* function = *(void**)(size_t)&_function; RemoveErrorCallback(errorLevel, NULL, function); } /** Retrieves the string description of the error code @param errorCode The error code whose string description is to be obtained. @Return The string description in raw pointer to array of characters. */ static const char* GetErrorString(FUError::Code errorCode); /** Sets the error string for the custom error (ERROR_CUSTOM_STRING) Used mainly for the FUDebug structure. We encourage applications to also use it in conjunction with the FUErrorLog class. @param customErrorString. */ static void SetCustomErrorString(const char* customErrorString); /** Retrieves the level at which errors are considered fatal. @return The fatality level. */ static FUError::Level GetFatalityLevel() { return fatalLevel; } /** Sets the level at which errors will cancel the processing of a COLLADA document. @param _fatalLevel The fatality level. Is it highly recommended to leave this value at 'FUError::ERROR_LEVEL'. */ static void SetFatalityLevel(FUError::Level _fatalLevel) { fatalLevel = _fatalLevel; } }; /** This class is used as an example of error-handling. It simply retrieves and concatenates the english error strings. @ingroup FUtils */ class FCOLLADA_EXPORT FUErrorSimpleHandler { private: FUSStringBuilder message; FUError::Level localFatalityLevel; bool fails; public: /** Constructor. @param fatalLevel The minimum error level which will cause the simple handler to consider the process to be a failure. */ FUErrorSimpleHandler(FUError::Level fatalLevel = FUError::ERROR_LEVEL); /** Destructor. */ ~FUErrorSimpleHandler(); /** Retrieves the complete error string. The complete error string is the concatenation of all the indivual errors encountered. @see FUError::GetErrorString @return The complete error string. */ inline const char* GetErrorString() const { return message.ToCharPtr(); } /** Retrieves whether the process was successful. @return Whether the process was successful. */ inline bool IsSuccessful() const { return !fails; } private: void OnError(FUError::Level errorLevel, uint32 errorCode, uint32 lineNumber); }; #endif // _FU_ERROR_H_