Crossfire Server, Trunk
ModifiedAssetsManager.h
Go to the documentation of this file.
1 /*
2  * Crossfire -- cooperative multi-player graphical RPG and adventure game
3  *
4  * Copyright (c) 2021-2022 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 #ifndef MODIFIEDASSETSMANAGER_H
14 #define MODIFIEDASSETSMANAGER_H
15 
16 #include <set>
17 #include <algorithm>
18 #include "AssetWriter.h"
19 #include <QFile>
20 
21 template<class T>
23 public:
25  virtual ~ModifiedAssetsManager() { delete myWriter; }
26 
27  const std::map<std::string, std::set<const T*> >& origins() const { return myOrigins; }
28 
29  std::vector<std::string> files() const {
30  std::vector<std::string> files;
31  for (const auto &origin : myOrigins) {
32  files.push_back(origin.first);
33  }
34  return files;
35  }
36 
37  std::string originOf(const T *asset) const {
38  for (auto file : myOrigins) {
39  if (file.second.count(asset) > 0) {
40  return file.first;
41  }
42  }
43  return std::string();
44  }
45 
46  void assetDefined(const T *asset, const std::string &filename) {
47  for (auto it : myOrigins) {
48  it.second.erase(asset);
49  }
50  myOrigins[filename.c_str()].insert(asset);
51  }
52 
53  void assetModified(T *asset) { myDirty.insert(asset); }
54 
56  for (auto a : myDirty) {
57  for (auto file : myOrigins) {
58  if (file.second.count(a) > 0) {
59  write(file.first, file.second);
60  }
61  }
62  }
63 
64  myDirty.clear();
65  }
66 
67  bool hasPendingChanges() const { return !myDirty.empty(); }
68 
73  std::vector<T *> dirtyAssetsWithNoOrigin() const {
74  std::vector<T *> assets;
75  std::copy_if(myDirty.cbegin(), myDirty.cend(), std::back_inserter(assets), [this] (const auto &dirty) {
76  return this->originOf(dirty).empty();
77  });
78  return assets;
79  }
80 
81 protected:
82  void write(const std::string &filename, std::set<const T*> assets) {
83  auto buf = stringbuffer_new();
84  for (auto asset = assets.begin(); asset != assets.end(); asset++) {
85  myWriter->write(*asset, buf);
86  }
87 
88  size_t length = stringbuffer_length(buf);
89  char *data = stringbuffer_finish(buf);
90 
91  QFile out(QString(filename.data()));
92  out.open(QIODevice::WriteOnly);
93  out.write(data, length);
94  free(data);
95  }
96 
97 private:
99  std::map<std::string, std::set<const T*> > myOrigins;
100  std::set<T *> myDirty;
101 };
102 
103 #endif /* MODIFIEDASSETSMANAGER_H */
ModifiedAssetsManager::origins
const std::map< std::string, std::set< const T * > > & origins() const
Definition: ModifiedAssetsManager.h:27
ModifiedAssetsManager::myOrigins
std::map< std::string, std::set< const T * > > myOrigins
Definition: ModifiedAssetsManager.h:99
ModifiedAssetsManager::~ModifiedAssetsManager
virtual ~ModifiedAssetsManager()
Definition: ModifiedAssetsManager.h:25
stringbuffer_length
size_t stringbuffer_length(StringBuffer *sb)
Definition: stringbuffer.cpp:218
AssetWriter.h
disinfect.a
a
Definition: disinfect.py:13
stringbuffer_new
StringBuffer * stringbuffer_new(void)
Definition: stringbuffer.cpp:57
ModifiedAssetsManager::hasPendingChanges
bool hasPendingChanges() const
Definition: ModifiedAssetsManager.h:67
ModifiedAssetsManager::files
std::vector< std::string > files() const
Definition: ModifiedAssetsManager.h:29
mad_mage_user.file
file
Definition: mad_mage_user.py:15
ModifiedAssetsManager::originOf
std::string originOf(const T *asset) const
Definition: ModifiedAssetsManager.h:37
buf
StringBuffer * buf
Definition: readable.cpp:1565
ModifiedAssetsManager::dirtyAssetsWithNoOrigin
std::vector< T * > dirtyAssetsWithNoOrigin() const
Definition: ModifiedAssetsManager.h:73
stringbuffer_finish
char * stringbuffer_finish(StringBuffer *sb)
Definition: stringbuffer.cpp:76
ModifiedAssetsManager::saveModifiedAssets
void saveModifiedAssets()
Definition: ModifiedAssetsManager.h:55
ModifiedAssetsManager::write
void write(const std::string &filename, std::set< const T * > assets)
Definition: ModifiedAssetsManager.h:82
navar-midane_time.data
data
Definition: navar-midane_time.py:11
make_face_from_files.out
out
Definition: make_face_from_files.py:81
ModifiedAssetsManager::assetModified
void assetModified(T *asset)
Definition: ModifiedAssetsManager.h:53
ModifiedAssetsManager
Definition: ModifiedAssetsManager.h:22
ModifiedAssetsManager::assetDefined
void assetDefined(const T *asset, const std::string &filename)
Definition: ModifiedAssetsManager.h:46
ModifiedAssetsManager::ModifiedAssetsManager
ModifiedAssetsManager(AssetWriter< T > *writer)
Definition: ModifiedAssetsManager.h:24
ModifiedAssetsManager::myWriter
AssetWriter< T > * myWriter
Definition: ModifiedAssetsManager.h:98
ModifiedAssetsManager::myDirty
std::set< T * > myDirty
Definition: ModifiedAssetsManager.h:100
AssetWriter
Definition: AssetWriter.h:22