1 /*
2     Copyright (c) 2008-2009 NetAllied Systems GmbH
3 
4     This file is part of COLLADASaxFrameworkLoader.
5 
6     Licensed under the MIT Open Source License,
7     for details please see LICENSE file or the website
8     http://www.opensource.org/licenses/mit-license.php
9 */
10 
11 #include "COLLADASaxFWLStableHeaders.h"
12 #include "COLLADASaxFWLVersionParser.h"
13 #include "COLLADASaxFWLFileLoader.h"
14 #include "COLLADASaxFWLRootParser14.h"
15 #include "COLLADASaxFWLRootParser15.h"
16 
17 #include "GeneratedSaxParserUtils.h"
18 
19 namespace COLLADASaxFWL
20 {
21     const StringHash HASH_NAMESPACE_COLLADA_14 = 221035537;
22     const StringHash HASH_NAMESPACE_COLLADA_15 = 234671633;
23     const StringHash HASH_ELEMENT_COLLADA = 138479041;
24     const StringHash HASH_ATTRIBUTE_XMLNS = 8340307;
25 
26     size_t XMLPARSER_BUFFERSIZE = 64*1024;
27 
28     enum LibraryFlags
29     {
30         COLLADA_NO_FLAGS                     = 0,
31         COLLADA_ASSET                        = 1<< 0,
32         COLLADA_LIBRARY_ANIMATION_CLIPS      = 1<< 1,
33         COLLADA_LIBRARY_ANIMATIONS           = 1<< 2,
34         COLLADA_LIBRARY_ARTICULATED_SYSTEMS  = 1<< 3,
35         COLLADA_LIBRARY_CAMERAS              = 1<< 4,
36         COLLADA_LIBRARY_CONTROLLERS          = 1<< 5,
37         COLLADA_LIBRARY_EFFECTS              = 1<< 6,
38         COLLADA_LIBRARY_FORCE_FIELDS         = 1<< 7,
39         COLLADA_LIBRARY_FORMULAS             = 1<< 8,
40         COLLADA_LIBRARY_GEOMETRIES           = 1<< 9,
41         COLLADA_LIBRARY_IMAGES               = 1<<10,
42         COLLADA_LIBRARY_JOINTS               = 1<<11,
43         COLLADA_LIBRARY_KINEMATICS_MODELS    = 1<<12,
44         COLLADA_LIBRARY_KINEMATICS_SCENES    = 1<<13,
45         COLLADA_LIBRARY_LIGHTS               = 1<<14,
46         COLLADA_LIBRARY_MATERIALS            = 1<<15,
47         COLLADA_LIBRARY_NODES                = 1<<16,
48         COLLADA_LIBRARY_PHYSICS_MATERIALS    = 1<<17,
49         COLLADA_LIBRARY_PHYSICS_MODELS       = 1<<18,
50         COLLADA_LIBRARY_PHYSICS_SCENES       = 1<<19,
51         COLLADA_LIBRARY_VISUAL_SCENES        = 1<<20,
52         COLLADA_SCENE                        = 1<<21
53     };
54 
55     struct LibraryFlagsFunctionMapPair14
56     {
57         LibraryFlags flag;
58         const COLLADASaxFWL14::ColladaParserAutoGen14Private::ElementFunctionMap& functionMap;
59     };
60 
61     struct LibraryFlagsFunctionMapPair15
62     {
63         LibraryFlags flag;
64         const COLLADASaxFWL15::ColladaParserAutoGen15Private::ElementFunctionMap& functionMap;
65     };
66 
67 
68     // COLLADA 1.4
69     LibraryFlagsFunctionMapPair14 COLLADA_ASSET_PAIR_14 = {COLLADA_ASSET, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__asset__allChildren() };
70     LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_ANIMATION_CLIPS_PAIR_14 = {COLLADA_LIBRARY_ANIMATION_CLIPS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_animation_clips__allChildren() };
71     LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_ANIMATIONS_PAIR_14 = {COLLADA_LIBRARY_ANIMATIONS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_animations__allChildren() };
72     //	LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_ARTICULATED_SYSTEMS_PAIR_14 = {COLLADA_LIBRARY_ARTICULATED_SYSTEMS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_articulated_systems__allChildren() };
73     LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_CAMERAS_PAIR_14 = {COLLADA_LIBRARY_CAMERAS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_cameras__allChildren() };
74     LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_CONTROLLERS_PAIR_14 = {COLLADA_LIBRARY_CONTROLLERS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_controllers__allChildren() };
75     LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_EFFECTS_PAIR_14 = {COLLADA_LIBRARY_EFFECTS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_effects__allChildren() };
76     LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_FORCE_FIELDS_PAIR_14 = {COLLADA_LIBRARY_FORCE_FIELDS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_force_fields__allChildren() };
77     //	LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_FORMULAS_PAIR_14 = {COLLADA_LIBRARY_FORMULAS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_formulas__allChildren() };
78     LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_GEOMETRIES_PAIR_14 = {COLLADA_LIBRARY_GEOMETRIES, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_geometries__allChildren() };
79     LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_IMAGES_PAIR_14 = {COLLADA_LIBRARY_IMAGES, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_images__allChildren() };
80     //	LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_JOINTS_PAIR_14 = {COLLADA_LIBRARY_JOINTS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_joints__allChildren() };
81     //	LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_KINEMATICS_MODELS_PAIR_14 = {COLLADA_LIBRARY_KINEMATICS_MODELS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_kinematics_models__allChildren() };
82     //	LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_KINEMATICS_SCENES_PAIR_14 = {COLLADA_LIBRARY_KINEMATICS_SCENES, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_kinematics_scenes__allChildren() };
83     LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_LIGHTS_PAIR_14 = {COLLADA_LIBRARY_LIGHTS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_lights__allChildren() };
84     LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_MATERIALS_PAIR_14 = {COLLADA_LIBRARY_MATERIALS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_materials__allChildren() };
85     LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_NODES_PAIR_14 = {COLLADA_LIBRARY_NODES, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_nodes__allChildren() };
86     LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_PHYSICS_MATERIALS_PAIR_14 = {COLLADA_LIBRARY_PHYSICS_MATERIALS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_physics_materials__allChildren() };
87     LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_PHYSICS_MODELS_PAIR_14 = {COLLADA_LIBRARY_PHYSICS_MODELS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_physics_models__allChildren() };
88     LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_PHYSICS_SCENES_PAIR_14 = {COLLADA_LIBRARY_PHYSICS_SCENES, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_physics_scenes__allChildren() };
89     LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_VISUAL_SCENES_PAIR_14 = {COLLADA_LIBRARY_VISUAL_SCENES, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_visual_scenes__allChildren() };
90     LibraryFlagsFunctionMapPair14 COLLADA_SCENE_PAIR_14 = {COLLADA_SCENE, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__scene__allChildren() };
91 
92 
93     // COLLADA 1.5
94     LibraryFlagsFunctionMapPair15 COLLADA_ASSET_PAIR_15 = {COLLADA_ASSET, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__asset__allChildren() };
95     LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_ANIMATION_CLIPS_PAIR_15 = {COLLADA_LIBRARY_ANIMATION_CLIPS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_animation_clips__allChildren() };
96     LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_ANIMATIONS_PAIR_15 = {COLLADA_LIBRARY_ANIMATIONS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_animations__allChildren() };
97     //	LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_ARTICULATED_SYSTEMS_PAIR_15 = {COLLADA_LIBRARY_ARTICULATED_SYSTEMS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_articulated_systems__allChildren() };
98     LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_CAMERAS_PAIR_15 = {COLLADA_LIBRARY_CAMERAS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_cameras__allChildren() };
99     LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_CONTROLLERS_PAIR_15 = {COLLADA_LIBRARY_CONTROLLERS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_controllers__allChildren() };
100     LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_EFFECTS_PAIR_15 = {COLLADA_LIBRARY_EFFECTS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_effects__allChildren() };
101     LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_FORCE_FIELDS_PAIR_15 = {COLLADA_LIBRARY_FORCE_FIELDS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_force_fields__allChildren() };
102     //	LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_FORMULAS_PAIR_15 = {COLLADA_LIBRARY_FORMULAS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_formulas__allChildren() };
103     LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_GEOMETRIES_PAIR_15 = {COLLADA_LIBRARY_GEOMETRIES, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_geometries__allChildren() };
104     LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_IMAGES_PAIR_15 = {COLLADA_LIBRARY_IMAGES, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_images__allChildren() };
105     //	LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_JOINTS_PAIR_15 = {COLLADA_LIBRARY_JOINTS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_joints__allChildren() };
106     //	LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_KINEMATICS_MODELS_PAIR_15 = {COLLADA_LIBRARY_KINEMATICS_MODELS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_kinematics_models__allChildren() };
107     //	LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_KINEMATICS_SCENES_PAIR_15 = {COLLADA_LIBRARY_KINEMATICS_SCENES, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_kinematics_scenes__allChildren() };
108     LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_LIGHTS_PAIR_15 = {COLLADA_LIBRARY_LIGHTS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_lights__allChildren() };
109     LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_MATERIALS_PAIR_15 = {COLLADA_LIBRARY_MATERIALS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_materials__allChildren() };
110     LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_NODES_PAIR_15 = {COLLADA_LIBRARY_NODES, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_nodes__allChildren() };
111     LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_PHYSICS_MATERIALS_PAIR_15 = {COLLADA_LIBRARY_PHYSICS_MATERIALS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_physics_materials__allChildren() };
112     LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_PHYSICS_MODELS_PAIR_15 = {COLLADA_LIBRARY_PHYSICS_MODELS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_physics_models__allChildren() };
113     LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_PHYSICS_SCENES_PAIR_15 = {COLLADA_LIBRARY_PHYSICS_SCENES, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_physics_scenes__allChildren() };
114     LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_VISUAL_SCENES_PAIR_15 = {COLLADA_LIBRARY_VISUAL_SCENES, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_visual_scenes__allChildren() };
115     LibraryFlagsFunctionMapPair15 COLLADA_SCENE_PAIR_15 = {COLLADA_SCENE, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__scene__allChildren() };
116 
117 
118     LibraryFlagsFunctionMapPair14 libraryFlagsFunctionMapMap14[] = {COLLADA_ASSET_PAIR_14,
119         COLLADA_LIBRARY_ANIMATION_CLIPS_PAIR_14,
120         COLLADA_LIBRARY_ANIMATIONS_PAIR_14,
121         COLLADA_LIBRARY_CAMERAS_PAIR_14,
122         COLLADA_LIBRARY_CONTROLLERS_PAIR_14,
123         COLLADA_LIBRARY_EFFECTS_PAIR_14,
124         COLLADA_LIBRARY_FORCE_FIELDS_PAIR_14,
125         COLLADA_LIBRARY_GEOMETRIES_PAIR_14,
126         COLLADA_LIBRARY_IMAGES_PAIR_14,
127         COLLADA_LIBRARY_LIGHTS_PAIR_14,
128         COLLADA_LIBRARY_MATERIALS_PAIR_14,
129         COLLADA_LIBRARY_NODES_PAIR_14,
130         COLLADA_LIBRARY_PHYSICS_MATERIALS_PAIR_14,
131         COLLADA_LIBRARY_PHYSICS_MODELS_PAIR_14,
132         COLLADA_LIBRARY_PHYSICS_SCENES_PAIR_14,
133         COLLADA_LIBRARY_VISUAL_SCENES_PAIR_14,
134         COLLADA_SCENE_PAIR_14};
135 
136     LibraryFlagsFunctionMapPair15 libraryFlagsFunctionMapMap15[] = {COLLADA_ASSET_PAIR_15,
137         COLLADA_LIBRARY_ANIMATION_CLIPS_PAIR_15,
138         COLLADA_LIBRARY_ANIMATIONS_PAIR_15,
139         COLLADA_LIBRARY_CAMERAS_PAIR_15,
140         COLLADA_LIBRARY_CONTROLLERS_PAIR_15,
141         COLLADA_LIBRARY_EFFECTS_PAIR_15,
142         COLLADA_LIBRARY_FORCE_FIELDS_PAIR_15,
143         COLLADA_LIBRARY_GEOMETRIES_PAIR_15,
144         COLLADA_LIBRARY_IMAGES_PAIR_15,
145         COLLADA_LIBRARY_LIGHTS_PAIR_15,
146         COLLADA_LIBRARY_MATERIALS_PAIR_15,
147         COLLADA_LIBRARY_NODES_PAIR_15,
148         COLLADA_LIBRARY_PHYSICS_MATERIALS_PAIR_15,
149         COLLADA_LIBRARY_PHYSICS_MODELS_PAIR_15,
150         COLLADA_LIBRARY_PHYSICS_SCENES_PAIR_15,
151         COLLADA_LIBRARY_VISUAL_SCENES_PAIR_15,
152         COLLADA_SCENE_PAIR_15};
153 
154     size_t libraryFlagsFunctionMapMapSize14 = sizeof(libraryFlagsFunctionMapMap14)/sizeof(LibraryFlagsFunctionMapPair14);
155     size_t libraryFlagsFunctionMapMapSize15 = sizeof(libraryFlagsFunctionMapMap15)/sizeof(LibraryFlagsFunctionMapPair15);
156 
157     template<class Flags>
setInFirstUnsetInSecond(int firstFlags,int secondFlags,Flags flag)158     bool setInFirstUnsetInSecond(int firstFlags, int secondFlags, Flags flag)
159     {
160         return ( (firstFlags & flag) != 0 ) && ( (secondFlags & flag) == 0 );
161     }
162 
163     //------------------------------
164     template<class FlagsMapPair, class ElementFunctionMap>
createFunctionMap(int flags,int & parsedFlags,ElementFunctionMap & functionMap,FlagsMapPair * flagsMapMap,size_t flagsMapMapSize)165     void createFunctionMap( int flags, int& parsedFlags, ElementFunctionMap& functionMap, FlagsMapPair* flagsMapMap, size_t flagsMapMapSize )
166     {
167         // A combination of ObjectFlags, indicating which objects will have been parsed, after load()
168         // has been called. These will be contained for sure.
169         // We need this to ensure that objects that are store by the Loader ( visual scene, library nodes,
170         // effects, cameras, lights) are parsed only once.
171         int afterLoadParsedObjectFlags = parsedFlags | flags;
172 
173         if ( (flags & Loader::ALL_OBJECTS_MASK ) != Loader::ALL_OBJECTS_MASK )
174         {
175             // we need to set a customized function map, since we don't need all COLLADA libraries
176             //determine which COLLADA elements we need to parse to get all date needed to parse objects in mObjectFlags
177             int requiredFunctionMaps = 0;
178 
179             if ( (flags & Loader::ASSET_FLAG) != 0 )
180             {
181                 requiredFunctionMaps|= COLLADA_ASSET;
182             }
183 
184             if ( (flags & Loader::SCENE_FLAG) != 0 )
185             {
186                 requiredFunctionMaps|= COLLADA_SCENE;
187             }
188 
189             if ( setInFirstUnsetInSecond(flags, parsedFlags, Loader::VISUAL_SCENES_FLAG) )
190             {
191                 requiredFunctionMaps|= COLLADA_LIBRARY_VISUAL_SCENES;
192                 requiredFunctionMaps|= COLLADA_LIBRARY_ANIMATIONS;
193             }
194 
195             if ( setInFirstUnsetInSecond(flags, parsedFlags, Loader::LIBRARY_NODES_FLAG) )
196             {
197                 requiredFunctionMaps|= COLLADA_LIBRARY_NODES;
198                 requiredFunctionMaps|= COLLADA_LIBRARY_ANIMATIONS;
199             }
200 
201             if ( (flags & Loader::GEOMETRY_FLAG) != 0 )
202             {
203                 requiredFunctionMaps|= COLLADA_LIBRARY_GEOMETRIES;
204             }
205 
206             if ( (flags & Loader::MATERIAL_FLAG) != 0 )
207             {
208                 requiredFunctionMaps|= COLLADA_LIBRARY_MATERIALS;
209             }
210 
211             if ( setInFirstUnsetInSecond(flags, parsedFlags, Loader::EFFECT_FLAG) )
212             {
213                 requiredFunctionMaps|= COLLADA_LIBRARY_EFFECTS;
214                 requiredFunctionMaps|= COLLADA_LIBRARY_ANIMATIONS;
215             }
216 
217             if ( (flags & Loader::CAMERA_FLAG) != 0 )
218             {
219                 requiredFunctionMaps|= COLLADA_LIBRARY_CAMERAS;
220                 //requiredFunctionMaps|= COLLADA_LIBRARY_ANIMATIONS;
221             }
222 
223             if ( (flags & Loader::IMAGE_FLAG) != 0 )
224             {
225                 requiredFunctionMaps|= COLLADA_LIBRARY_IMAGES;
226             }
227 
228             if ( (flags & Loader::LIGHT_FLAG) != 0 )
229             {
230                 requiredFunctionMaps|= COLLADA_LIBRARY_LIGHTS;
231             }
232 
233             if ( (flags & Loader::ANIMATION_FLAG) != 0 )
234             {
235                 requiredFunctionMaps|= COLLADA_LIBRARY_ANIMATIONS;
236             }
237 
238             if ( (flags & Loader::ANIMATION_LIST_FLAG) != 0 )
239             {
240                 requiredFunctionMaps|= COLLADA_LIBRARY_ANIMATIONS;
241 
242                 requiredFunctionMaps|= COLLADA_LIBRARY_VISUAL_SCENES;
243                 afterLoadParsedObjectFlags |= Loader::VISUAL_SCENES_FLAG;
244 
245                 requiredFunctionMaps|= COLLADA_LIBRARY_NODES;
246                 afterLoadParsedObjectFlags |= Loader::LIBRARY_NODES_FLAG;
247 
248                 requiredFunctionMaps|= COLLADA_LIBRARY_EFFECTS;
249                 afterLoadParsedObjectFlags |= Loader::EFFECT_FLAG;
250 
251                 //requiredFunctionMaps|= COLLADA_LIBRARY_CAMERAS;
252                 //requiredFunctionMaps|= COLLADA_LIBRARY_LIGHTS;
253             }
254 
255             if ( (flags & Loader::CONTROLLER_FLAG) != 0 )
256             {
257                 requiredFunctionMaps|= COLLADA_LIBRARY_CONTROLLERS;
258 
259                 requiredFunctionMaps|= COLLADA_LIBRARY_VISUAL_SCENES;
260                 afterLoadParsedObjectFlags |= Loader::VISUAL_SCENES_FLAG;
261 
262                 requiredFunctionMaps|= COLLADA_LIBRARY_NODES;
263                 afterLoadParsedObjectFlags |= Loader::LIBRARY_NODES_FLAG;
264             }
265 
266             if ( (flags & Loader::SKIN_CONTROLLER_DATA_FLAG) != 0 )
267             {
268                 requiredFunctionMaps|= COLLADA_LIBRARY_CONTROLLERS;
269             }
270 
271 
272             // Fills function map
273             for ( size_t i = 0; i < flagsMapMapSize; ++i )
274             {
275                 const FlagsMapPair& libraryFlagsFunctionMapPair = flagsMapMap[i];
276                 if ( (requiredFunctionMaps & libraryFlagsFunctionMapPair.flag) != 0 )
277                 {
278                     functionMap.insert(libraryFlagsFunctionMapPair.functionMap.begin(), libraryFlagsFunctionMapPair.functionMap.end());
279                 }
280             }
281 
282             parsedFlags = afterLoadParsedObjectFlags;
283         }
284     }
285 
286     //------------------------------
createFunctionMap14()287     void VersionParser::createFunctionMap14()
288     {
289         createFunctionMap<LibraryFlagsFunctionMapPair14, COLLADASaxFWL14::ColladaParserAutoGen14Private::ElementFunctionMap>( mFlags, mParsedFlags, mFunctionMap14, libraryFlagsFunctionMapMap14, libraryFlagsFunctionMapMapSize14 );
290     }
291     //------------------------------
createFunctionMap15()292     void VersionParser::createFunctionMap15()
293     {
294         createFunctionMap<LibraryFlagsFunctionMapPair15, COLLADASaxFWL15::ColladaParserAutoGen15Private::ElementFunctionMap>( mFlags, mParsedFlags, mFunctionMap15, libraryFlagsFunctionMapMap15, libraryFlagsFunctionMapMapSize15 );
295     }
296 
297     //------------------------------
VersionParser(GeneratedSaxParser::IErrorHandler * errorHandler,FileLoader * fileLoader,int flags,int & parsedFlags)298     VersionParser::VersionParser(GeneratedSaxParser::IErrorHandler* errorHandler,
299         FileLoader* fileLoader,
300         int flags,
301         int& parsedFlags)
302         : GeneratedSaxParser::Parser( errorHandler )
303         , mPrivateParser14( 0 )
304         , mPrivateParser15( 0 )
305         , mFileLoader( fileLoader )
306         , mFlags( flags )
307         , mParsedFlags( parsedFlags )
308     {
309 
310     }
311 
312     //------------------------------
~VersionParser()313     VersionParser::~VersionParser()
314     {
315 
316     }
317 
318     //------------------------------
createAndLaunchParser()319     bool VersionParser::createAndLaunchParser()
320     {
321         const COLLADABU::URI& fileURI = mFileLoader->getFileUri();
322         String nativePath = fileURI.toNativePath();
323         const char* fileName = nativePath.c_str();
324 #if defined(GENERATEDSAXPARSER_XMLPARSER_LIBXML)
325         GeneratedSaxParser::LibxmlSaxParser versionSaxParser( this );
326 #elif defined(GENERATEDSAXPARSER_XMLPARSER_EXPAT)
327         GeneratedSaxParser::ExpatSaxParser versionSaxParser( this, XMLPARSER_BUFFERSIZE );
328 #endif
329         bool success = versionSaxParser.parseFile( fileName );
330 
331  //       mFileLoader->postProcess();
332 
333         delete mPrivateParser14;
334         delete mPrivateParser15;
335 
336         mFileLoader->setPrivateParser( (COLLADASaxFWL14::ColladaParserAutoGen14Private*)0 );
337         mFileLoader->setPrivateParser( (COLLADASaxFWL15::ColladaParserAutoGen15Private*)0 );
338 
339         return success;
340     }
341 
342     //------------------------------
createAndLaunchParser(const char * buffer,int length)343     bool VersionParser::createAndLaunchParser( const char* buffer, int length )
344     {
345         const COLLADABU::URI& uri = mFileLoader->getFileUri();
346         const char* uriString = uri.originalStr().c_str();
347 //        const char* uriString = uri.getURIString().c_str();
348 #if defined(GENERATEDSAXPARSER_XMLPARSER_LIBXML)
349         GeneratedSaxParser::LibxmlSaxParser versionSaxParser( this );
350 #elif defined(GENERATEDSAXPARSER_XMLPARSER_EXPAT)
351         GeneratedSaxParser::ExpatSaxParser versionSaxParser( this, XMLPARSER_BUFFERSIZE );
352 #endif
353         bool success = versionSaxParser.parseBuffer( uriString, buffer, length );
354 
355         //       mFileLoader->postProcess();
356 
357         delete mPrivateParser14;
358         delete mPrivateParser15;
359 
360         mFileLoader->setPrivateParser( (COLLADASaxFWL14::ColladaParserAutoGen14Private*)0 );
361         mFileLoader->setPrivateParser( (COLLADASaxFWL15::ColladaParserAutoGen15Private*)0 );
362 
363         return success;
364     }
365 
366     //------------------------------
elementBegin(const ParserChar * elementName,const ParserAttributes & attributes)367     bool VersionParser::elementBegin( const ParserChar* elementName, const ParserAttributes& attributes )
368     {
369         StringHashPair hashPair = GeneratedSaxParser::Utils::calculateStringHashWithNamespace( elementName );
370         StringHash elementHash = hashPair.second;
371 
372         if ( elementHash == HASH_ELEMENT_COLLADA )
373         {
374             if ( attributes.attributes )
375             {
376                 const ParserChar** attributeArray = attributes.attributes;
377                 while (true)
378                 {
379                     const ParserChar * attribute = *attributeArray;
380                     if ( !attribute )
381                         break;
382                     StringHashPair hashPair = GeneratedSaxParser::Utils::calculateStringHashWithNamespace(attribute);
383                     attributeArray++;
384                     if ( !attributeArray )
385                         return false;
386                     const ParserChar* attributeValue = *attributeArray;
387                     attributeArray++;
388 
389                     StringHash prefix = hashPair.first;
390                     StringHash name = hashPair.second;
391                     if ( (prefix == 0 && name == HASH_ATTRIBUTE_XMLNS) || prefix == HASH_ATTRIBUTE_XMLNS )
392                     {
393                         StringHash attrVal = GeneratedSaxParser::Utils::calculateStringHash( attributeValue );
394                         if ( attrVal == HASH_NAMESPACE_COLLADA_14 )
395                         {
396 							mFileLoader->setCOLLADAVersion(COLLADA_14);
397                             return parse14( elementName, attributes );
398                         }
399                         else if ( attrVal == HASH_NAMESPACE_COLLADA_15 )
400                         {
401 							mFileLoader->setCOLLADAVersion(COLLADA_15);
402                             return parse15( elementName, attributes );
403                         }
404                     }
405                 }
406             }
407             return false;
408         }
409 
410         return true;
411     }
412 
413     //------------------------------
elementEnd(const ParserChar * elementName)414     bool VersionParser::elementEnd( const ParserChar* elementName )
415     {
416         return true;
417     }
418 
419     //------------------------------
textData(const ParserChar * text,size_t textLength)420     bool VersionParser::textData( const ParserChar* text, size_t textLength )
421     {
422         return true;
423     }
424 
425     //------------------------------
parse14(const ParserChar * elementName,const ParserAttributes & attributes)426     bool VersionParser::parse14( const ParserChar* elementName, const ParserAttributes& attributes )
427     {
428         createFunctionMap14();
429 
430         // note: rootParser is created with new because it is deleted in IFilePartLoader::~IFilePartLoader()
431         RootParser14* rootParser = new RootParser14( mFileLoader );
432         mFileLoader->setParserImpl( rootParser );
433         mPrivateParser14 = new COLLADASaxFWL14::ColladaParserAutoGen14Private( rootParser, (GeneratedSaxParser::IErrorHandler*)mFileLoader->getErrorHandler() );
434         mFileLoader->setPrivateParser( mPrivateParser14 );
435 
436         //privateParser.setCallbackObject( &rootParser );
437 		mPrivateParser14->registerUnknownElementHandler( &mFileLoader->mExtraDataElementHandler );
438 
439         if ( !mFunctionMap14.empty() )
440         {
441             mPrivateParser14->setElementFunctionMap( &mFunctionMap14 );
442         }
443 
444         getSaxParser()->setParser( mPrivateParser14 );
445 
446         return mPrivateParser14->elementBegin( elementName, attributes );
447     }
448     //------------------------------
parse15(const ParserChar * elementName,const ParserAttributes & attributes)449     bool VersionParser::parse15( const ParserChar* elementName, const ParserAttributes& attributes )
450     {
451         createFunctionMap15();
452 
453         // note: rootParser is created with new because it is deleted in IFilePartLoader::~IFilePartLoader()
454         RootParser15* rootParser = new RootParser15( mFileLoader );
455         mFileLoader->setParserImpl( rootParser );
456         mPrivateParser15 = new COLLADASaxFWL15::ColladaParserAutoGen15Private( rootParser, (GeneratedSaxParser::IErrorHandler*)mFileLoader->getErrorHandler() );
457         mFileLoader->setPrivateParser( mPrivateParser15 );
458 
459         //privateParser.setCallbackObject( &rootParser );
460 		mPrivateParser15->registerUnknownElementHandler( &mFileLoader->mExtraDataElementHandler );
461 
462         if ( !mFunctionMap15.empty() )
463         {
464             mPrivateParser15->setElementFunctionMap( &mFunctionMap15 );
465         }
466 
467         getSaxParser()->setParser( mPrivateParser15 );
468 
469         return mPrivateParser15->elementBegin( elementName, attributes );
470     }
471 
472 	//------------------------------
getElementHash(size_t level) const473 	COLLADASaxFWL14::StringHash VersionParser::getElementHash( size_t level /*= 0 */ ) const
474 	{
475 		if ( mPrivateParser14 )
476 		{
477 			return mPrivateParser14->getElementHash( level );
478 		}
479 		if ( mPrivateParser15 )
480 		{
481 			return mPrivateParser15->getElementHash( level );
482 		}
483 		return 0;
484 	}
485 }
486