]> git.lizzy.rs Git - irrlicht.git/blob - source/Irrlicht/CLimitReadFile.cpp
Add OpenGL3 renderer
[irrlicht.git] / source / Irrlicht / CLimitReadFile.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 "CLimitReadFile.h"\r
6 #include "irrMath.h"\r
7 #include "irrString.h"\r
8 \r
9 namespace irr\r
10 {\r
11 namespace io\r
12 {\r
13 \r
14 \r
15 CLimitReadFile::CLimitReadFile(IReadFile* alreadyOpenedFile, long pos,\r
16                 long areaSize, const io::path& name)\r
17         : Filename(name), AreaStart(0), AreaEnd(0), Pos(0),\r
18         File(alreadyOpenedFile)\r
19 {\r
20         #ifdef _DEBUG\r
21         setDebugName("CLimitReadFile");\r
22         #endif\r
23 \r
24         if (File)\r
25         {\r
26                 File->grab();\r
27                 AreaStart = pos;\r
28                 AreaEnd = AreaStart + areaSize;\r
29         }\r
30 }\r
31 \r
32 \r
33 CLimitReadFile::~CLimitReadFile()\r
34 {\r
35         if (File)\r
36                 File->drop();\r
37 }\r
38 \r
39 \r
40 //! returns how much was read\r
41 size_t CLimitReadFile::read(void* buffer, size_t sizeToRead)\r
42 {\r
43         if (0 == File)\r
44                 return 0;\r
45 \r
46 #if 1\r
47         long r = AreaStart + Pos;\r
48         long toRead = core::min_(AreaEnd, r + (long)sizeToRead) - core::max_(AreaStart, r);\r
49         if (toRead < 0)\r
50                 return 0;\r
51         File->seek(r);\r
52         r = (long)File->read(buffer, toRead);\r
53         Pos += r;\r
54         return r;\r
55 #else\r
56         const long pos = File->getPos();\r
57 \r
58         if (pos >= AreaEnd)\r
59                 return 0;\r
60 \r
61         if (pos + (long)sizeToRead >= AreaEnd)\r
62                 sizeToRead = AreaEnd - pos;\r
63 \r
64         return File->read(buffer, sizeToRead);\r
65 #endif\r
66 }\r
67 \r
68 \r
69 //! changes position in file, returns true if successful\r
70 bool CLimitReadFile::seek(long finalPos, bool relativeMovement)\r
71 {\r
72 #if 1\r
73         Pos = core::s32_clamp(finalPos + (relativeMovement ? Pos : 0 ), 0, AreaEnd - AreaStart);\r
74         return true;\r
75 #else\r
76         const long pos = File->getPos();\r
77 \r
78         if (relativeMovement)\r
79         {\r
80                 if (pos + finalPos > AreaEnd)\r
81                         finalPos = AreaEnd - pos;\r
82         }\r
83         else\r
84         {\r
85                 finalPos += AreaStart;\r
86                 if (finalPos > AreaEnd)\r
87                         return false;\r
88         }\r
89 \r
90         return File->seek(finalPos, relativeMovement);\r
91 #endif\r
92 }\r
93 \r
94 \r
95 //! returns size of file\r
96 long CLimitReadFile::getSize() const\r
97 {\r
98         return AreaEnd - AreaStart;\r
99 }\r
100 \r
101 \r
102 //! returns where in the file we are.\r
103 long CLimitReadFile::getPos() const\r
104 {\r
105 #if 1\r
106         return Pos;\r
107 #else\r
108         return File->getPos() - AreaStart;\r
109 #endif\r
110 }\r
111 \r
112 \r
113 //! returns name of file\r
114 const io::path& CLimitReadFile::getFileName() const\r
115 {\r
116         return Filename;\r
117 }\r
118 \r
119 \r
120 IReadFile* createLimitReadFile(const io::path& fileName, IReadFile* alreadyOpenedFile, long pos, long areaSize)\r
121 {\r
122         return new CLimitReadFile(alreadyOpenedFile, pos, areaSize, fileName);\r
123 }\r
124 \r
125 \r
126 } // end namespace io\r
127 } // end namespace irr\r
128 \r