Added aqua_speed for rite geo 50 tryker
[ryzomcore.git] / nel / tools / 3d / pipeline_max / storage_chunks.h
blob45d72fb870408ae05fddd83b04a14825049bb328
1 /**
2 * \file storage_chunks.h
3 * \brief CStorageChunks
4 * \date 2012-08-18 09:20GMT
5 * \author Jan Boon (Kaetemi)
6 * CStorageChunks
7 */
9 /*
10 * Copyright (C) 2012 by authors
12 * This file is part of RYZOM CORE PIPELINE.
13 * RYZOM CORE PIPELINE is free software: you can redistribute it
14 * and/or modify it under the terms of the GNU Affero General Public
15 * License as published by the Free Software Foundation, either
16 * version 3 of the License, or (at your option) any later version.
18 * RYZOM CORE PIPELINE is distributed in the hope that it will be
19 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
20 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Affero General Public License for more details.
23 * You should have received a copy of the GNU Affero General Public
24 * License along with RYZOM CORE PIPELINE. If not, see
25 * <http://www.gnu.org/licenses/>.
28 #ifndef PIPELINE_STORAGE_CHUNKS_H
29 #define PIPELINE_STORAGE_CHUNKS_H
30 #include <nel/misc/types_nl.h>
32 // STL includes
34 // NeL includes
35 #include <nel/misc/stream.h>
37 // Project includes
39 namespace PIPELINE {
40 namespace MAX {
42 /**
43 * \brief CStorageChunks
44 * \date 2012-08-18 09:20GMT
45 * \author Jan Boon (Kaetemi)
46 * CStorageChunks
48 class CStorageChunks
50 private:
51 struct CChunk
53 // Size of the chunk header, 6 for 32 bit, 14 for 64 bit
54 uint8 HeaderSize;
55 // Where the header starts
56 sint32 OffsetBegin;
58 // Identifier
59 uint16 Id;
60 // Size including header size
61 uint32 Size;
63 inline sint32 getSizeWithHeader() const { return (sint32)(Size & 0x7FFFFFFF); }
64 inline sint32 getSize() const { return getSizeWithHeader() - (sint32)HeaderSize; }
65 inline bool isContainer() const { return (Size & 0x80000000) == 0x80000000; }
66 inline sint32 endOfChunk() const { return OffsetBegin + getSizeWithHeader(); }
67 inline sint32 getDataBegin() const { return OffsetBegin + (sint32)HeaderSize; }
70 public:
71 CStorageChunks(NLMISC::IStream &stream, sint64 size = 0);
72 virtual ~CStorageChunks();
74 // Returns true if there's another chunk, false if no more chunks in this container or if the current chunk is not a container
75 bool enterChunk();
76 // Reads and skips chunks until the one with given id is found, or writes a chunk with this id
77 bool enterChunk(uint16 id, bool container);
78 // Returns the number of skipped bytes in read more, returns chunk size including header in write mode
79 sint32 leaveChunk();
81 inline bool is64Bit() const { return m_Is64Bit; }
82 inline void set64Bit(bool enabled = true) { m_Is64Bit = enabled; }
84 inline uint16 getChunkId() const { return currentChunk()->Id; }
85 inline sint32 getChunkSize() const { return currentChunk()->getSize(); }
86 inline bool isChunkContainer() const { return currentChunk()->isContainer(); }
87 inline bool endOfChunk() const { return /*m_Chunks.size() == 1 ? eof() :*/ m_Stream.getPos() >= currentChunk()->endOfChunk(); }
89 inline NLMISC::IStream &stream() { return m_Stream; }
91 private:
92 inline const CChunk *currentChunk() const { return &m_Chunks[m_Chunks.size() - 1]; }
93 inline CChunk *currentChunk() { return &m_Chunks[m_Chunks.size() - 1]; }
95 private:
96 NLMISC::IStream &m_Stream;
97 std::vector<CChunk> m_Chunks;
98 bool m_Is64Bit;
100 }; /* class CStorageChunks */
102 } /* namespace MAX */
103 } /* namespace PIPELINE */
105 #endif /* #ifndef PIPELINE_STORAGE_CHUNKS_H */
107 /* end of file */