summaryrefslogtreecommitdiffstats
path: root/src/Common/Request.h
diff options
context:
space:
mode:
authorMatthias Schiffer <matthias@gamezock.de>2008-09-17 05:33:01 +0200
committerMatthias Schiffer <matthias@gamezock.de>2008-09-17 05:33:01 +0200
commit039c218a7b1f2eae4f8e8305bc8e8bf70a67beab (patch)
tree362a59253abd77b5e41800d73a7c5dacf18617f7 /src/Common/Request.h
parenta0cffb5475d35f0a19b95af2ce56bf6c90c82256 (diff)
downloadmad-039c218a7b1f2eae4f8e8305bc8e8bf70a67beab.tar
mad-039c218a7b1f2eae4f8e8305bc8e8bf70a67beab.zip
Interface der Request-Klassen verbessert; muss noch vereinfacht werden
Diffstat (limited to 'src/Common/Request.h')
-rw-r--r--src/Common/Request.h61
1 files changed, 57 insertions, 4 deletions
diff --git a/src/Common/Request.h b/src/Common/Request.h
index 3d4be63..fa6b619 100644
--- a/src/Common/Request.h
+++ b/src/Common/Request.h
@@ -20,15 +20,68 @@
#ifndef MAD_COMMON_REQUEST_H_
#define MAD_COMMON_REQUEST_H_
-#include "RequestHandler.h"
-#include <stdint.h>
+#include "RequestBase.h"
+#include "Exception.h"
+
+#include <memory>
+#include <sigc++/hide.h>
namespace Mad {
namespace Common {
-class Request : public RequestHandler {
+template<typename T = void> class Request : public RequestBase {
+ private:
+ sigc::signal<void,const Request<T>&> finished;
+
+ std::auto_ptr<T> res;
+ Exception exp;
+
+ protected:
+ typedef sigc::slot<void,const Request<T>&> slot_type;
+
+ Request(slot_type slot) : exp(Exception::NOT_FINISHED) {
+ finished.connect(slot);
+ finished.connect(sigc::hide(signalFinished().make_slot()));
+ }
+
+ void finish(std::auto_ptr<T> result) {res = result; finished(*this);}
+ void finish(const T& result) {res.reset(new T(result)); finished(*this);}
+ void finishWithError(const Exception &e) {exp = e; finished(*this);}
+
+ public:
+ const T& getResult() const throw(Exception) {
+ if(res.get())
+ return *res;
+
+ throw exp;
+ }
+};
+
+template<> class Request<void> : public RequestBase {
+ private:
+ sigc::signal<void,const Request<void>&> finished;
+
+ bool isFinished;
+ Exception exp;
+
+ protected:
+ typedef sigc::slot<void,const Request<void>&> slot_type;
+
+ Request(slot_type slot) : isFinished(false), exp(Exception::NOT_FINISHED) {
+ finished.connect(slot);
+ finished.connect(sigc::hide(signalFinished().make_slot()));
+ }
+
+ void finish() {isFinished = true; finished(*this);}
+ void finishWithError(const Exception &e) {exp = e; finished(*this);}
+
public:
- virtual bool sendRequest(Net::Connection *connection, uint16_t requestId) = 0;
+ void getResult() const throw(Exception) {
+ if(isFinished)
+ return;
+
+ throw exp;
+ }
};
}