From 039c218a7b1f2eae4f8e8305bc8e8bf70a67beab Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 17 Sep 2008 05:33:01 +0200 Subject: Interface der Request-Klassen verbessert; muss noch vereinfacht werden --- src/Common/Request.h | 61 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 4 deletions(-) (limited to 'src/Common/Request.h') 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 +#include "RequestBase.h" +#include "Exception.h" + +#include +#include namespace Mad { namespace Common { -class Request : public RequestHandler { +template class Request : public RequestBase { + private: + sigc::signal&> finished; + + std::auto_ptr res; + Exception exp; + + protected: + typedef sigc::slot&> 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 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 : public RequestBase { + private: + sigc::signal&> finished; + + bool isFinished; + Exception exp; + + protected: + typedef sigc::slot&> 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; + } }; } -- cgit v1.2.3