Crossfire Server  1.75.0
TarLoader.cpp
Go to the documentation of this file.
1 /*
2  * Crossfire -- cooperative multi-player graphical RPG and adventure game
3  *
4  * Copyright (c) 2020-2021 the Crossfire Development Team
5  *
6  * Crossfire is free software and comes with ABSOLUTELY NO WARRANTY. You are
7  * welcome to redistribute it under certain conditions. For details, please
8  * see COPYING and LICENSE.
9  *
10  * The authors can be reached via e-mail at <crossfire@metalforge.org>.
11  */
12 
13 #include "TarLoader.h"
14 #include "string.h"
15 
16 TarLoader::TarLoader(AssetLoader *loader) : m_loader(loader) {
18 }
19 
22 }
23 
24 static int tar_read(mtar_t *tar, void *data, unsigned size) {
25  BufferReader *reader = static_cast<BufferReader *>(tar->stream);
26  if (tar->pos + size >= bufferreader_data_length(reader)) {
27  return MTAR_EREADFAIL;
28  }
29  memcpy(data, bufferreader_data(reader) + tar->pos, size);
30  return MTAR_ESUCCESS;
31 }
32 
33 static int tar_seek(mtar_t *tar, unsigned pos) {
34  tar->pos = pos;
35  return MTAR_ESUCCESS;
36 }
37 
38 static int tar_close(mtar_t *) {
39  return MTAR_ESUCCESS;
40 }
41 
42 
43 void TarLoader::load(BufferReader *reader, const std::string &filename) {
44  mtar_t tar;
45  mtar_header_t h;
46 
47  memset(&tar, 0, sizeof(tar));
48  tar.stream = reader;
49  tar.read = &tar_read;
50  tar.seek = &tar_seek;
51  tar.close = &tar_close;
52 
53  while ((mtar_read_header(&tar, &h)) == MTAR_ESUCCESS) {
54  if (m_loader->willLoad(h.name)) {
56  m_loader->load(m_reader, filename + ":/" + h.name);
57  }
58  mtar_next(&tar);
59  }
60 
61  mtar_close(&tar);
62 }
void bufferreader_destroy(BufferReader *br)
Destroy a BufferReader.
int mtar_next(mtar_t *tar)
Definition: microtar.cpp:230
BufferReader * bufferreader_create()
Create a new BufferReader.
virtual void load(BufferReader *reader, const std::string &filename)=0
Load assets from the specified reader.
virtual bool willLoad(const std::string &filename)=0
Whether this instance will process or not the specified file.
int(* read)(mtar_t *tar, void *data, unsigned size)
Definition: microtar.h:52
char * bufferreader_data(BufferReader *br)
Get the whole buffer, independently of the calls to bufferreader_next_line().
void * stream
Definition: microtar.h:56
size_t bufferreader_data_length(BufferReader *br)
Return the length of the buffer data.
int mtar_read_header(mtar_t *tar, mtar_header_t *h)
Definition: microtar.cpp:270
int(* close)(mtar_t *tar)
Definition: microtar.h:55
BufferReader * m_reader
Definition: TarLoader.h:20
int(* seek)(mtar_t *tar, unsigned pos)
Definition: microtar.h:54
static int tar_close(mtar_t *)
Definition: TarLoader.cpp:38
AssetLoader * m_loader
Definition: TarLoader.h:21
virtual ~TarLoader()
Definition: TarLoader.cpp:20
static int tar_seek(mtar_t *tar, unsigned pos)
Definition: TarLoader.cpp:33
char name[100]
Definition: microtar.h:44
unsigned pos
Definition: microtar.h:57
virtual void load(BufferReader *reader, const std::string &filename) override
Load assets from the specified reader.
Definition: TarLoader.cpp:43
int mtar_close(mtar_t *tar)
Definition: microtar.cpp:211
static int tar_read(mtar_t *tar, void *data, unsigned size)
Definition: TarLoader.cpp:24
Abstract buffer handler, processing a BufferReader.
Definition: AssetLoader.h:24
void bufferreader_init_from_tar_file(BufferReader *br, mtar_t *tar, mtar_header_t *h)
Initialize a BufferReader from a tar file entry.
TarLoader(AssetLoader *loader)
Definition: TarLoader.cpp:16