Crossfire Server, Trunk  1.75.0
AssetCollector.cpp
Go to the documentation of this file.
1 /*
2  * Crossfire -- cooperative multi-player graphical RPG and adventure game
3  *
4  * Copyright (c) 2020 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 "AssetCollector.h"
14 
15 #ifndef WIN32 /* ---win32 exclude headers */
16 #include <dirent.h>
17 #include <sys/stat.h>
18 #include "autoconf.h"
19 #endif
20 
21 #include "global.h"
22 #include "compat.h"
23 #include "Utils.h"
24 #include <string.h>
25 #include "microtar.h"
26 
27 #include "PngLoader.h"
28 
31 }
32 
34  for (auto loader : m_loaders) {
35  delete loader;
36  }
38 }
39 
40 void AssetCollector::processFiles(const std::vector<std::string>& files) {
41  for (const auto &file : files) {
42  for (auto loader : m_loaders) {
43  if (loader->willLoad(file)) {
44  if (bufferreader_init_from_file(m_reader, file.c_str(), "Unable to open asset file %s: %s\n", llevError) == NULL) {
45  continue;
46  }
47  loader->load(m_reader, file);
48  }
49  }
50  }
51 }
52 
53 
54 void AssetCollector::collect(const std::string& directory) {
55  DIR *dp;
56  struct dirent *d;
57  struct stat sb;
58 
59  char full_path[PATH_MAX];
60  std::vector<std::string> names[2];
61  int type;
62 
63  dp = opendir(directory.c_str());
64  if (dp == NULL) {
65  return;
66  }
67 
68  while ((d = readdir(dp)) != NULL) {
69 
70  if (d->d_name[0] == 0 || d->d_name[0] == '.' || strcmp(d->d_name, "dev") == 0 || strcmp(d->d_name, "trashbin") == 0)
71  continue;
72 
73  snprintf(full_path, sizeof(full_path), "%s/%s", directory.c_str(), d->d_name);
74  stat(full_path, &sb);
75  type = S_ISDIR(sb.st_mode) ? 0 : 1;
76  names[type].push_back(full_path);
77  }
78  (void)closedir(dp);
79 
80  for (type = 0; type < 2; type++) {
81  std::sort(names[type].begin(), names[type].end());
82  }
83 
84  processFiles(names[1]);
85 
86  for (const auto &dir : names[0]) {
87  collect(dir);
88  }
89 }
90 
91 void AssetCollector::load(BufferReader *reader, const std::string &filename) {
92  for (AssetLoader *loader : m_loaders) {
93  if (loader->willLoad(filename)) {
94  loader->load(reader, filename);
95  }
96  }
97 }
global.h
llevError
@ llevError
Error, serious thing.
Definition: logger.h:11
AssetCollector::load
virtual void load(BufferReader *reader, const std::string &filename) override
Load assets from the specified reader.
Definition: AssetCollector.cpp:91
bufferreader_destroy
void bufferreader_destroy(BufferReader *br)
Destroy a BufferReader.
Definition: bufferreader.cpp:40
AssetLoader
Abstract buffer handler, processing a BufferReader.
Definition: AssetLoader.h:24
AssetCollector::m_loaders
std::vector< AssetLoader * > m_loaders
Registered loaders.
Definition: AssetCollector.h:54
AssetCollector::collect
void collect(const std::string &directory)
Recurse in the specified directory, finding all files and calling loaders to process them.
Definition: AssetCollector.cpp:54
AssetCollector::m_reader
BufferReader * m_reader
Reader used to load files.
Definition: AssetCollector.h:55
AssetCollector::AssetCollector
AssetCollector()
Constructor.
Definition: AssetCollector.cpp:29
bufferreader_init_from_file
BufferReader * bufferreader_init_from_file(BufferReader *br, const char *filepath, const char *failureMessage, LogLevel failureLevel)
Initialize or create a BufferReader from a file path.
Definition: bufferreader.cpp:65
opendir
DIR * opendir(const char *)
files
the server will also quite happily load unpacked files as long as they have the right file which is convenient if you want to edit your maps and archetypes live It also contains a few files
Definition: server-directories.txt:53
Utils.h
microtar.h
AssetCollector::processFiles
void processFiles(const std::vector< std::string > &files)
Process a list of files.
Definition: AssetCollector.cpp:40
readdir
struct dirent * readdir(DIR *)
compat.h
d
How to Install a Crossfire Server on you must install a python script engine on your computer Python is the default script engine of Crossfire You can find the python engine you have only to install them The VisualC Crossfire settings are for d
Definition: INSTALL_WIN32.txt:13
AssetCollector::~AssetCollector
virtual ~AssetCollector()
Destructor.
Definition: AssetCollector.cpp:33
PngLoader.h
bufferreader_create
BufferReader * bufferreader_create()
Create a new BufferReader.
Definition: bufferreader.cpp:31
closedir
int closedir(DIR *)
BufferReader
Definition: bufferreader.cpp:21
AssetCollector.h
is_valid_types_gen.type
list type
Definition: is_valid_types_gen.py:25
autoconf.h