1 // Copyright (C) 2002-2005 Nikolaus Gebhardt
2 // This file is part of the "Irrlicht Engine" and the "irrXML" project.
3 // For conditions of distribution and use, see copyright notice in irrlicht.h and/or irrXML.h
4 
5 // Need to include Assimp, too. We're using Assimp's version of fast_atof
6 // so we need stdint.h. But no PCH.
7 
8 
9 #include "irrXML.h"
10 #include "irrString.h"
11 #include "irrArray.h"
12 #include "./../../code/fast_atof.h"
13 #include "CXMLReaderImpl.h"
14 
15 namespace irr
16 {
17 namespace io
18 {
19 
20 //! Implementation of the file read callback for ordinary files
21 class CFileReadCallBack : public IFileReadCallBack
22 {
23 public:
24 
25 	//! construct from filename
CFileReadCallBack(const char * filename)26 	CFileReadCallBack(const char* filename)
27 		: File(0), Size(0), Close(true)
28 	{
29 		// open file
30 		File = fopen(filename, "rb");
31 
32 		if (File)
33 			getFileSize();
34 	}
35 
36 	//! construct from FILE pointer
CFileReadCallBack(FILE * file)37 	CFileReadCallBack(FILE* file)
38 		: File(file), Size(0), Close(false)
39 	{
40 		if (File)
41 			getFileSize();
42 	}
43 
44 	//! destructor
~CFileReadCallBack()45 	virtual ~CFileReadCallBack()
46 	{
47 		if (Close && File)
48 			fclose(File);
49 	}
50 
51 	//! Reads an amount of bytes from the file.
read(void * buffer,int sizeToRead)52 	virtual int read(void* buffer, int sizeToRead)
53 	{
54 		if (!File)
55 			return 0;
56 
57 		return (int)fread(buffer, 1, sizeToRead, File);
58 	}
59 
60 	//! Returns size of file in bytes
getSize()61 	virtual int getSize()
62 	{
63 		return Size;
64 	}
65 
66 private:
67 
68 	//! retrieves the file size of the open file
getFileSize()69 	void getFileSize()
70 	{
71 		fseek(File, 0, SEEK_END);
72 		Size = ftell(File);
73 		fseek(File, 0, SEEK_SET);
74 	}
75 
76 	FILE* File;
77 	int Size;
78 	bool Close;
79 
80 }; // end class CFileReadCallBack
81 
82 
83 
84 // FACTORY FUNCTIONS:
85 
86 
87 //! Creates an instance of an UFT-8 or ASCII character xml parser.
createIrrXMLReader(const char * filename)88 IrrXMLReader* createIrrXMLReader(const char* filename)
89 {
90 	return new CXMLReaderImpl<char, IXMLBase>(new CFileReadCallBack(filename));
91 }
92 
93 
94 //! Creates an instance of an UFT-8 or ASCII character xml parser.
createIrrXMLReader(FILE * file)95 IrrXMLReader* createIrrXMLReader(FILE* file)
96 {
97 	return new CXMLReaderImpl<char, IXMLBase>(new CFileReadCallBack(file));
98 }
99 
100 
101 //! Creates an instance of an UFT-8 or ASCII character xml parser.
createIrrXMLReader(IFileReadCallBack * callback)102 IrrXMLReader* createIrrXMLReader(IFileReadCallBack* callback)
103 {
104 	return new CXMLReaderImpl<char, IXMLBase>(callback, false);
105 }
106 
107 
108 //! Creates an instance of an UTF-16 xml parser.
createIrrXMLReaderUTF16(const char * filename)109 IrrXMLReaderUTF16* createIrrXMLReaderUTF16(const char* filename)
110 {
111 	return new CXMLReaderImpl<char16, IXMLBase>(new CFileReadCallBack(filename));
112 }
113 
114 
115 //! Creates an instance of an UTF-16 xml parser.
createIrrXMLReaderUTF16(FILE * file)116 IrrXMLReaderUTF16* createIrrXMLReaderUTF16(FILE* file)
117 {
118 	return new CXMLReaderImpl<char16, IXMLBase>(new CFileReadCallBack(file));
119 }
120 
121 
122 //! Creates an instance of an UTF-16 xml parser.
createIrrXMLReaderUTF16(IFileReadCallBack * callback)123 IrrXMLReaderUTF16* createIrrXMLReaderUTF16(IFileReadCallBack* callback)
124 {
125 	return new CXMLReaderImpl<char16, IXMLBase>(callback, false);
126 }
127 
128 
129 //! Creates an instance of an UTF-32 xml parser.
createIrrXMLReaderUTF32(const char * filename)130 IrrXMLReaderUTF32* createIrrXMLReaderUTF32(const char* filename)
131 {
132 	return new CXMLReaderImpl<char32, IXMLBase>(new CFileReadCallBack(filename));
133 }
134 
135 
136 //! Creates an instance of an UTF-32 xml parser.
createIrrXMLReaderUTF32(FILE * file)137 IrrXMLReaderUTF32* createIrrXMLReaderUTF32(FILE* file)
138 {
139 	return new CXMLReaderImpl<char32, IXMLBase>(new CFileReadCallBack(file));
140 }
141 
142 
143 //! Creates an instance of an UTF-32 xml parser.
createIrrXMLReaderUTF32(IFileReadCallBack * callback)144 IrrXMLReaderUTF32* createIrrXMLReaderUTF32(IFileReadCallBack* callback)
145 {
146 	return new CXMLReaderImpl<char32, IXMLBase>(callback, false);
147 }
148 
149 
150 } // end namespace io
151 } // end namespace irr
152