]> git.lizzy.rs Git - irrlicht.git/blob - source/Irrlicht/CMemoryFile.cpp
Revert "Fix: Listbox was sometimes sending EGET_LISTBOX_SELECTED_AGAIN instead of...
[irrlicht.git] / source / Irrlicht / CMemoryFile.cpp
1 // Copyright (C) 2002-2012 Nikolaus Gebhardt\r
2 // This file is part of the "Irrlicht Engine".\r
3 // For conditions of distribution and use, see copyright notice in irrlicht.h\r
4 \r
5 #include "CMemoryFile.h"\r
6 #include "irrString.h"\r
7 \r
8 namespace irr\r
9 {\r
10 namespace io\r
11 {\r
12 \r
13 \r
14 CMemoryReadFile::CMemoryReadFile(const void* memory, long len, const io::path& fileName, bool d)\r
15 : Buffer(memory), Len(len), Pos(0), Filename(fileName), deleteMemoryWhenDropped(d)\r
16 {\r
17         #ifdef _DEBUG\r
18         setDebugName("CMemoryReadFile");\r
19         #endif\r
20 }\r
21 \r
22 \r
23 CMemoryReadFile::~CMemoryReadFile()\r
24 {\r
25         if (deleteMemoryWhenDropped)\r
26                 delete [] (c8*)Buffer;\r
27 }\r
28 \r
29 \r
30 //! returns how much was read\r
31 size_t CMemoryReadFile::read(void* buffer, size_t sizeToRead)\r
32 {\r
33         long amount = static_cast<long>(sizeToRead);\r
34         if (Pos + amount > Len)\r
35                 amount -= Pos + amount - Len;\r
36 \r
37         if (amount <= 0)\r
38                 return 0;\r
39 \r
40         c8* p = (c8*)Buffer;\r
41         memcpy(buffer, p + Pos, amount);\r
42 \r
43         Pos += amount;\r
44 \r
45         return static_cast<size_t>(amount);\r
46 }\r
47 \r
48 //! changes position in file, returns true if successful\r
49 //! if relativeMovement==true, the pos is changed relative to current pos,\r
50 //! otherwise from begin of file\r
51 bool CMemoryReadFile::seek(long finalPos, bool relativeMovement)\r
52 {\r
53         if (relativeMovement)\r
54         {\r
55                 if (Pos + finalPos < 0 || Pos + finalPos > Len)\r
56                         return false;\r
57 \r
58                 Pos += finalPos;\r
59         }\r
60         else\r
61         {\r
62                 if (finalPos < 0 || finalPos > Len)\r
63                         return false;\r
64 \r
65                 Pos = finalPos;\r
66         }\r
67 \r
68         return true;\r
69 }\r
70 \r
71 \r
72 //! returns size of file\r
73 long CMemoryReadFile::getSize() const\r
74 {\r
75         return Len;\r
76 }\r
77 \r
78 \r
79 //! returns where in the file we are.\r
80 long CMemoryReadFile::getPos() const\r
81 {\r
82         return Pos;\r
83 }\r
84 \r
85 \r
86 //! returns name of file\r
87 const io::path& CMemoryReadFile::getFileName() const\r
88 {\r
89         return Filename;\r
90 }\r
91 \r
92 \r
93 CMemoryWriteFile::CMemoryWriteFile(void* memory, long len, const io::path& fileName, bool d)\r
94 : Buffer(memory), Len(len), Pos(0), Filename(fileName), deleteMemoryWhenDropped(d)\r
95 {\r
96         #ifdef _DEBUG\r
97         setDebugName("CMemoryWriteFile");\r
98         #endif\r
99 }\r
100 \r
101 \r
102 CMemoryWriteFile::~CMemoryWriteFile()\r
103 {\r
104         if (deleteMemoryWhenDropped)\r
105                 delete [] (c8*)Buffer;\r
106 }\r
107 \r
108 \r
109 //! returns how much was written\r
110 size_t CMemoryWriteFile::write(const void* buffer, size_t sizeToWrite)\r
111 {\r
112         long amount = (long)sizeToWrite;\r
113         if (Pos + amount > Len)\r
114                 amount -= Pos + amount - Len;\r
115 \r
116         if (amount <= 0)\r
117                 return 0;\r
118 \r
119         c8* p = (c8*)Buffer;\r
120         memcpy(p + Pos, buffer, amount);\r
121 \r
122         Pos += amount;\r
123 \r
124         return (size_t)amount;\r
125 }\r
126 \r
127 \r
128 \r
129 //! changes position in file, returns true if successful\r
130 //! if relativeMovement==true, the pos is changed relative to current pos,\r
131 //! otherwise from begin of file\r
132 bool CMemoryWriteFile::seek(long finalPos, bool relativeMovement)\r
133 {\r
134         if (relativeMovement)\r
135         {\r
136                 if (Pos + finalPos < 0 || Pos + finalPos > Len)\r
137                         return false;\r
138 \r
139                 Pos += finalPos;\r
140         }\r
141         else\r
142         {\r
143                 if (finalPos < 0 || finalPos > Len)\r
144                         return false;\r
145 \r
146                 Pos = finalPos;\r
147         }\r
148 \r
149         return true;\r
150 }\r
151 \r
152 \r
153 //! returns where in the file we are.\r
154 long CMemoryWriteFile::getPos() const\r
155 {\r
156         return Pos;\r
157 }\r
158 \r
159 \r
160 //! returns name of file\r
161 const io::path& CMemoryWriteFile::getFileName() const\r
162 {\r
163         return Filename;\r
164 }\r
165 \r
166 bool CMemoryWriteFile::flush()\r
167 {\r
168         return true; // no buffering, so nothing to do\r
169 }\r
170 \r
171 IReadFile* createMemoryReadFile(const void* memory, long size, const io::path& fileName, bool deleteMemoryWhenDropped)\r
172 {\r
173         CMemoryReadFile* file = new CMemoryReadFile(memory, size, fileName, deleteMemoryWhenDropped);\r
174         return file;\r
175 }\r
176 \r
177 \r
178 IWriteFile* createMemoryWriteFile(void* memory, long size, const io::path& fileName, bool deleteMemoryWhenDropped)\r
179 {\r
180         CMemoryWriteFile* file = new CMemoryWriteFile(memory, size, fileName, deleteMemoryWhenDropped);\r
181         return file;\r
182 }\r
183 \r
184 \r
185 } // end namespace io\r
186 } // end namespace irr\r
187 \r