1 /**************************************************************************
3 * Copyright 2013-2014 RAD Game Tools and Valve Software
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 **************************************************************************/
26 // File: vogl_blob_manager.h
27 #ifndef VOGL_BLOB_MANAGER_H
28 #define VOGL_BLOB_MANAGER_H
31 #include "vogl_data_stream.h"
32 #include "vogl_miniz_zip.h"
34 enum vogl_blob_manager_type_t
43 enum vogl_blob_manager_flags_t
47 cBMFReadWrite = cBMFReadable | cBMFWritable,
49 cBMFOpenExistingOrCreateNew = 8,
52 //----------------------------------------------------------------------------------------------------------------------
53 // class vogl_blob_manager
54 //----------------------------------------------------------------------------------------------------------------------
55 class vogl_blob_manager
59 virtual ~vogl_blob_manager();
64 m_initialized = false;
68 virtual bool is_initialized() const
73 virtual bool populate(const vogl_blob_manager &other);
75 virtual vogl_blob_manager_type_t get_type() const = 0;
77 vogl::dynamic_string compute_unique_id(const void *pData, uint size, const vogl::dynamic_string &prefix = "", const dynamic_string &ext = "", const uint64_t *pCRC64 = NULL) const;
78 vogl::dynamic_string get_prefix(const vogl::dynamic_string &id) const;
79 vogl::dynamic_string get_extension(const vogl::dynamic_string &id) const;
81 virtual bool get(const dynamic_string &id, vogl::uint8_vec &data) const;
83 virtual vogl::dynamic_string add_buf_compute_unique_id(const void *pData, uint size, const vogl::dynamic_string &prefix, const dynamic_string &ext, const uint64_t *pCRC64 = NULL);
84 virtual vogl::dynamic_string add_stream_compute_unique_id(vogl::data_stream &stream, const vogl::dynamic_string &prefix, const dynamic_string &ext, const uint64_t *pCRC64 = NULL);
86 virtual vogl::dynamic_string add_stream_using_id(vogl::data_stream &stream, const vogl::dynamic_string &id);
88 virtual vogl::dynamic_string add_buf_using_id(const void *pData, uint size, const vogl::dynamic_string &id) = 0;
90 virtual vogl::data_stream *open(const vogl::dynamic_string &id) const = 0;
91 virtual void close(data_stream *pStream) const = 0;
93 virtual bool does_exist(const dynamic_string &id) const = 0;
95 virtual uint64_t get_size(const dynamic_string &id) const = 0;
97 virtual vogl::dynamic_string_array enumerate() const = 0;
99 virtual vogl::dynamic_string copy_file(vogl_blob_manager &src_blob_manager, const vogl::dynamic_string &src_id, const vogl::dynamic_string &dst_id);
104 bool is_readable() const
106 return (m_flags & cBMFReadable) != 0;
108 bool is_writable() const
110 return (m_flags & cBMFWritable) != 0;
112 bool is_read_only() const
114 return (m_flags & cBMFReadWrite) == cBMFReadable;
116 bool is_write_only() const
118 return (m_flags & cBMFReadWrite) == cBMFWritable;
121 bool init(uint32 flags)
123 if ((flags & cBMFReadWrite) == 0)
132 //----------------------------------------------------------------------------------------------------------------------
133 // class vogl_null_blob_manager
134 //----------------------------------------------------------------------------------------------------------------------
135 class vogl_null_blob_manager : public vogl_blob_manager
138 vogl_null_blob_manager()
139 : vogl_blob_manager()
143 virtual ~vogl_null_blob_manager()
147 bool init(uint32 flags)
149 vogl_blob_manager::init(flags);
150 m_initialized = true;
156 return vogl_blob_manager::deinit();
159 virtual vogl_blob_manager_type_t get_type() const
164 virtual vogl::dynamic_string add_buf_using_id(const void *pData, uint size, const vogl::dynamic_string &id)
166 VOGL_NOTE_UNUSED(pData);
167 VOGL_NOTE_UNUSED(size);
171 virtual vogl::data_stream *open(const dynamic_string &id) const
173 VOGL_NOTE_UNUSED(id);
177 virtual void close(vogl::data_stream *pStream) const
179 VOGL_NOTE_UNUSED(pStream);
182 virtual bool does_exist(const vogl::dynamic_string &id) const
184 VOGL_NOTE_UNUSED(id);
188 virtual uint64_t get_size(const vogl::dynamic_string &id) const
190 VOGL_NOTE_UNUSED(id);
194 virtual vogl::dynamic_string_array enumerate() const
196 return vogl::dynamic_string_array();
200 //----------------------------------------------------------------------------------------------------------------------
201 // class vogl_memory_blob_manager
202 //----------------------------------------------------------------------------------------------------------------------
203 class vogl_memory_blob_manager : public vogl_blob_manager
206 vogl_memory_blob_manager();
207 virtual ~vogl_memory_blob_manager();
209 bool init(uint32 flags);
211 virtual bool deinit();
213 virtual vogl_blob_manager_type_t get_type() const
218 virtual vogl::dynamic_string add_buf_using_id(const void *pData, uint size, const vogl::dynamic_string &id);
220 virtual vogl::data_stream *open(const dynamic_string &id) const;
221 virtual void close(vogl::data_stream *pStream) const;
223 virtual bool does_exist(const vogl::dynamic_string &id) const;
225 virtual uint64_t get_size(const vogl::dynamic_string &id) const;
227 virtual vogl::dynamic_string_array enumerate() const;
229 bool create_archive(mz_zip_archive &zip);
230 bool read_archive(mz_zip_archive &zip);
235 vogl::dynamic_string m_id;
236 vogl::uint8_vec m_blob;
239 typedef vogl::map<vogl::dynamic_string, blob, vogl::dynamic_string_less_than_case_sensitive, vogl::dynamic_string_equal_to_case_sensitive> blob_map;
243 //----------------------------------------------------------------------------------------------------------------------
244 // class vogl_loose_file_blob_manager
245 //----------------------------------------------------------------------------------------------------------------------
246 class vogl_loose_file_blob_manager : public vogl_blob_manager
249 vogl_loose_file_blob_manager();
250 virtual ~vogl_loose_file_blob_manager();
252 bool init(uint32 flags);
253 bool init(uint32 flags, const char *pPath);
255 void set_path(const vogl::dynamic_string &path)
259 const vogl::dynamic_string &get_path()
264 virtual bool deinit();
266 virtual vogl_blob_manager_type_t get_type() const
271 virtual vogl::dynamic_string add_buf_using_id(const void *pData, uint size, const vogl::dynamic_string &id);
273 virtual vogl::data_stream *open(const vogl::dynamic_string &id) const;
274 virtual void close(vogl::data_stream *pStream) const;
276 virtual bool does_exist(const vogl::dynamic_string &id) const;
278 virtual uint64_t get_size(const vogl::dynamic_string &id) const;
280 virtual vogl::dynamic_string_array enumerate() const;
283 vogl::dynamic_string get_filename(const vogl::dynamic_string &id) const;
285 dynamic_string m_path;
288 //----------------------------------------------------------------------------------------------------------------------
289 // class vogl_archive_blob_manager
290 //----------------------------------------------------------------------------------------------------------------------
291 class vogl_archive_blob_manager : public vogl_blob_manager
294 vogl_archive_blob_manager();
295 virtual ~vogl_archive_blob_manager();
297 bool init_memory(uint32 flags, const void *pZip_data, size_t size);
299 bool init_heap(uint32 flags);
300 void *deinit_heap(size_t &size);
302 bool init_file(uint32 flags, const char *pFilename, uint64_t file_start_ofs = 0, uint64_t actual_archive_size = 0);
304 // Same as init_file(), but creates a temporary archive. It's up to you to delete the archive.
305 bool init_file_temp(uint32 flags, const char *pPath);
307 bool init_cfile(uint32 flags, FILE *pFile, uint64_t cur_size);
309 const dynamic_string &get_archive_filename() const
311 return m_archive_filename;
314 uint64_t get_archive_size() const;
315 bool write_archive_to_stream(vogl::data_stream &stream) const;
317 // TODO: init_data_stream
319 virtual bool deinit();
321 virtual vogl_blob_manager_type_t get_type() const
326 virtual vogl::dynamic_string add_buf_using_id(const void *pData, uint size, const vogl::dynamic_string &id);
328 virtual vogl::data_stream *open(const vogl::dynamic_string &id) const;
329 virtual void close(vogl::data_stream *pStream) const;
331 virtual bool does_exist(const vogl::dynamic_string &id) const;
333 virtual uint64_t get_size(const vogl::dynamic_string &id) const;
335 virtual vogl::dynamic_string_array enumerate() const;
338 mutable mz_zip_archive m_zip;
339 dynamic_string m_archive_filename;
343 vogl::dynamic_string m_id;
350 blob(const dynamic_string &id, uint file_index, uint64_t size)
351 : m_id(id), m_file_index(file_index), m_size(size)
356 typedef vogl::map<vogl::dynamic_string, blob, vogl::dynamic_string_less_than_case_sensitive, vogl::dynamic_string_equal_to_case_sensitive> blob_map;
359 vogl::dynamic_string get_filename(const vogl::dynamic_string &id) const;
360 bool populate_blob_map();
363 //----------------------------------------------------------------------------------------------------------------------
364 // class vogl_multi_blob_manager
365 //----------------------------------------------------------------------------------------------------------------------
366 class vogl_multi_blob_manager : public vogl_blob_manager
369 vogl_multi_blob_manager();
371 virtual ~vogl_multi_blob_manager();
373 bool init(uint32 flags);
375 void add_blob_manager(vogl_blob_manager *pBlob_manager);
377 void remove_blob_manager(vogl_blob_manager *pBlob_manager);
379 typedef vogl::vector<vogl_blob_manager *> vogl_blob_manager_ptr_vec;
381 const vogl_blob_manager_ptr_vec &get_blob_managers() const
383 return m_blob_managers;
385 vogl_blob_manager_ptr_vec &get_blob_managers()
387 return m_blob_managers;
390 virtual bool deinit();
392 virtual vogl_blob_manager_type_t get_type() const
397 virtual vogl::dynamic_string add_buf_using_id(const void *pData, uint size, const vogl::dynamic_string &id);
399 virtual vogl::data_stream *open(const dynamic_string &id) const;
401 virtual void close(vogl::data_stream *pStream) const;
403 virtual bool does_exist(const vogl::dynamic_string &id) const;
405 virtual uint64_t get_size(const vogl::dynamic_string &id) const;
407 virtual vogl::dynamic_string_array enumerate() const;
410 vogl_blob_manager_ptr_vec m_blob_managers;
413 #endif // VOGL_BLOB_MANAGER_H