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