summaryrefslogtreecommitdiffstats
path: root/src/Common
diff options
context:
space:
mode:
Diffstat (limited to 'src/Common')
-rw-r--r--src/Common/Application.cpp12
-rw-r--r--src/Common/Application.h6
-rw-r--r--src/Common/CMakeLists.txt2
-rw-r--r--src/Common/StorageBackend.h47
-rw-r--r--src/Common/StorageManager.cpp56
-rw-r--r--src/Common/StorageManager.h61
-rw-r--r--src/Common/XmlData.cpp23
-rw-r--r--src/Common/XmlData.h4
8 files changed, 209 insertions, 2 deletions
diff --git a/src/Common/Application.cpp b/src/Common/Application.cpp
index fdbcbeb..428d9e8 100644
--- a/src/Common/Application.cpp
+++ b/src/Common/Application.cpp
@@ -22,6 +22,7 @@
#include "ModuleManager.h"
#include "RequestManager.h"
#include "SystemManager.h"
+#include "StorageManager.h"
#include "UserManager.h"
#include <libxml/parser.h>
@@ -29,14 +30,21 @@
namespace Mad {
namespace Common {
-Application::Application(bool server) : authManager(new AuthManager), moduleManager(new ModuleManager(this)), requestManager(new RequestManager(this, server)),
-systemManager(new SystemManager), userManager(new UserManager(this)) {
+Application::Application(bool server) {
xmlInitParser();
+
+ authManager = new AuthManager;
+ moduleManager = new ModuleManager(this);
+ requestManager = new RequestManager(this, server);
+ storageManager = new StorageManager(this);
+ systemManager = new SystemManager;
+ userManager = new UserManager(this);
}
Application::~Application() {
delete userManager;
delete systemManager;
+ delete storageManager;
delete requestManager;
delete moduleManager;
delete authManager;
diff --git a/src/Common/Application.h b/src/Common/Application.h
index 39cf2de..a8edd1b 100644
--- a/src/Common/Application.h
+++ b/src/Common/Application.h
@@ -30,6 +30,7 @@ namespace Common {
class AuthManager;
class ModuleManager;
class RequestManager;
+class StorageManager;
class SystemManager;
class UserManager;
@@ -38,6 +39,7 @@ class MAD_COMMON_EXPORT Application : public Core::Application {
AuthManager *authManager;
ModuleManager *moduleManager;
RequestManager *requestManager;
+ StorageManager *storageManager;
SystemManager *systemManager;
UserManager *userManager;
@@ -58,6 +60,10 @@ class MAD_COMMON_EXPORT Application : public Core::Application {
return requestManager;
}
+ StorageManager* getStorageManager() const {
+ return storageManager;
+ }
+
SystemManager* getSystemManager() const {
return systemManager;
}
diff --git a/src/Common/CMakeLists.txt b/src/Common/CMakeLists.txt
index 493081d..dd12a36 100644
--- a/src/Common/CMakeLists.txt
+++ b/src/Common/CMakeLists.txt
@@ -35,6 +35,8 @@ mad_library(Common
RequestHandler.cpp RequestHandler.h
RequestHandlerGroup.h
RequestManager.cpp RequestManager.h
+ StorageBackend.h
+ StorageManager.cpp StorageManager.h
SystemBackend.h
SystemManager.cpp SystemManager.h
UserConfigBackend.h
diff --git a/src/Common/StorageBackend.h b/src/Common/StorageBackend.h
new file mode 100644
index 0000000..027109e
--- /dev/null
+++ b/src/Common/StorageBackend.h
@@ -0,0 +1,47 @@
+/*
+ * StorageBackend.h
+ *
+ * Copyright (C) 2009 Matthias Schiffer <matthias@gamezock.de>
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef MAD_COMMON_STORAGEBACKEND_H_
+#define MAD_COMMON_STORAGEBACKEND_H_
+
+#include "XmlData.h"
+#include <Core/Exception.h>
+
+#include <boost/shared_ptr.hpp>
+
+namespace Mad {
+namespace Common {
+
+class StorageManager;
+
+class StorageBackend {
+ protected:
+ friend class StorageManager;
+
+ virtual void store(const std::string &type, const std::string &name, const XmlData *data) throw (Core::Exception) = 0;
+ virtual boost::shared_ptr<XmlData> load(const std::string &type, const std::string &name) throw (Core::Exception) = 0;
+
+ public:
+ virtual ~StorageBackend() {}
+};
+
+}
+}
+
+#endif /* MAD_COMMON_STORAGEBACKEND_H_ */
diff --git a/src/Common/StorageManager.cpp b/src/Common/StorageManager.cpp
new file mode 100644
index 0000000..a1610fe
--- /dev/null
+++ b/src/Common/StorageManager.cpp
@@ -0,0 +1,56 @@
+/*
+ * StorageManager.cpp
+ *
+ * Copyright (C) 2009 Matthias Schiffer <matthias@gamezock.de>
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "StorageManager.h"
+#include "StorageBackend.h"
+
+#include <boost/thread/locks.hpp>
+
+namespace Mad {
+namespace Common {
+
+void StorageManager::setBackend(boost::shared_ptr<StorageBackend> newBackend) {
+ boost::lock_guard<boost::shared_mutex> lock(mutex);
+ backend = newBackend;
+}
+
+void StorageManager::unsetBackend(boost::shared_ptr<StorageBackend> oldBackend) {
+ boost::lock_guard<boost::shared_mutex> lock(mutex);
+ if(backend == oldBackend)
+ backend.reset();
+}
+
+void StorageManager::store(const std::string &type, const std::string &name, const XmlData *data) throw (Core::Exception) {
+ boost::shared_lock<boost::shared_mutex> lock(mutex);
+ if(!backend)
+ throw Core::Exception(Core::Exception::NOT_IMPLEMENTED);
+
+ backend->store(type, name, data);
+}
+
+boost::shared_ptr<XmlData> StorageManager::load(const std::string &type, const std::string &name) throw (Core::Exception) {
+ boost::shared_lock<boost::shared_mutex> lock(mutex);
+ if(!backend)
+ throw Core::Exception(Core::Exception::NOT_IMPLEMENTED);
+
+ return backend->load(type, name);
+}
+
+}
+}
diff --git a/src/Common/StorageManager.h b/src/Common/StorageManager.h
new file mode 100644
index 0000000..c81c707
--- /dev/null
+++ b/src/Common/StorageManager.h
@@ -0,0 +1,61 @@
+/*
+ * StorageManager.h
+ *
+ * Copyright (C) 2009 Matthias Schiffer <matthias@gamezock.de>
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef MAD_COMMON_DATAMANAGER_H_
+#define MAD_COMMON_DATAMANAGER_H_
+
+#include "export.h"
+
+#include "XmlData.h"
+
+#include <Core/Exception.h>
+
+#include <boost/shared_ptr.hpp>
+#include <boost/thread/shared_mutex.hpp>
+
+namespace Mad {
+namespace Common {
+
+class Application;
+class StorageBackend;
+
+class MAD_COMMON_EXPORT StorageManager {
+ private:
+ friend class Application;
+
+ Application *application;
+
+ boost::shared_ptr<StorageBackend> backend;
+
+ boost::shared_mutex mutex;
+
+ StorageManager(Application *application0) : application(application0) {}
+
+ public:
+ void setBackend(boost::shared_ptr<StorageBackend> newBackend);
+ void unsetBackend(boost::shared_ptr<StorageBackend> oldBackend);
+
+ void store(const std::string &type, const std::string &name, const XmlData *data) throw (Core::Exception);
+ boost::shared_ptr<XmlData> load(const std::string &type, const std::string &name) throw (Core::Exception);
+};
+
+}
+}
+
+#endif /* MAD_COMMON_DATAMANAGER_H_ */
diff --git a/src/Common/XmlData.cpp b/src/Common/XmlData.cpp
index 4d1da6e..aa3fcdf 100644
--- a/src/Common/XmlData.cpp
+++ b/src/Common/XmlData.cpp
@@ -19,6 +19,9 @@
#include "XmlData.h"
#include "Base64Encoder.h"
+
+#include <cerrno>
+#include <cstdio>
#include <cstdlib>
#include <cstring>
@@ -267,6 +270,15 @@ XmlData::XmlData(const Net::Packet &packet) {
entry = new Entry(rootNode);
}
+XmlData::XmlData(const std::string &filename) throw (Core::Exception) {
+ doc = xmlParseFile(filename.c_str());
+ if(!doc)
+ throw Core::Exception(Core::Exception::NOT_AVAILABLE);
+
+ rootNode = xmlDocGetRootElement(doc);
+ entry = new Entry(rootNode);
+}
+
XmlData& XmlData::operator=(const XmlData &o) {
delete entry;
xmlFreeDoc(doc);
@@ -305,5 +317,16 @@ Net::Packet XmlData::toPacket(boost::uint16_t requestId) const {
return packet;
}
+void XmlData::toFile(const std::string &filename) const throw (Core::Exception) {
+ std::FILE *file = std::fopen(filename.c_str(), "w");
+ if(!file)
+ throw Core::Exception(Core::Exception::INTERNAL_ERRNO, errno);
+
+ if(!xmlDocDump(file, doc))
+ throw Core::Exception(Core::Exception::NOT_AVAILABLE);
+
+ std::fclose(file);
+}
+
}
}
diff --git a/src/Common/XmlData.h b/src/Common/XmlData.h
index 6be2b1d..51e5327 100644
--- a/src/Common/XmlData.h
+++ b/src/Common/XmlData.h
@@ -23,6 +23,7 @@
#include "export.h"
#include <Net/Packet.h>
+#include <Core/Exception.h>
#include <map>
#include <string>
@@ -438,6 +439,7 @@ class MAD_COMMON_EXPORT XmlData {
XmlData();
XmlData(const XmlData &o);
XmlData(const Net::Packet &packet);
+ XmlData(const std::string &filename) throw (Core::Exception);
XmlData& operator=(const XmlData &o);
@@ -477,6 +479,8 @@ class MAD_COMMON_EXPORT XmlData {
}
Net::Packet toPacket(boost::uint16_t requestId) const;
+
+ void toFile(const std::string &filename) const throw (Core::Exception);
};
template <> MAD_COMMON_EXPORT std::string XmlData::Entry::get<std::string>(const std::string &name) const;