diff options
Diffstat (limited to 'src/Common/Request.h')
-rw-r--r-- | src/Common/Request.h | 61 |
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; + } }; } |