diff options
| author | Simon Robertshaw <simon@hardwired.org.uk> | 2013-03-16 17:45:18 (GMT) |
|---|---|---|
| committer | Simon Robertshaw <simon@hardwired.org.uk> | 2013-03-16 17:45:18 (GMT) |
| commit | f05044ab68e51ce9c374f6af09284051efcda449 (patch) | |
| tree | 6ae35ed5f6f3395593fc0d2c90780d8162f302e7 /src/client/requestbroker | |
| parent | d383d6d7e5e1d3ca0856c02ebbcea5e9b8b2ff4e (diff) | |
| download | powder-f05044ab68e51ce9c374f6af09284051efcda449.zip powder-f05044ab68e51ce9c374f6af09284051efcda449.tar.gz | |
APIRequest, Aync methods for client, Profile edit/viewer (WIP)
Diffstat (limited to 'src/client/requestbroker')
| -rw-r--r-- | src/client/requestbroker/APIRequest.cpp | 77 | ||||
| -rw-r--r-- | src/client/requestbroker/APIRequest.h | 15 | ||||
| -rw-r--r-- | src/client/requestbroker/APIResultParser.h | 16 | ||||
| -rw-r--r-- | src/client/requestbroker/RequestBroker.cpp | 12 | ||||
| -rw-r--r-- | src/client/requestbroker/RequestBroker.h | 4 |
5 files changed, 123 insertions, 1 deletions
diff --git a/src/client/requestbroker/APIRequest.cpp b/src/client/requestbroker/APIRequest.cpp new file mode 100644 index 0000000..71d683f --- /dev/null +++ b/src/client/requestbroker/APIRequest.cpp @@ -0,0 +1,77 @@ +#include <iostream> +#include <typeinfo> +#include <cstdlib> +#include "APIRequest.h" +#include "client/HTTP.h" +#include "APIResultParser.h" + +APIRequest::APIRequest(std::string url, APIResultParser * parser, ListenerHandle listener): + RequestBroker::Request(API, listener) +{ + HTTPContext = NULL; + Parser = parser; + URL = url; +} + +RequestBroker::ProcessResponse APIRequest::Process(RequestBroker & rb) +{ + if(HTTPContext) + { + if(http_async_req_status(HTTPContext)) + { + char * data; + int status, data_size; + data = http_async_req_stop(HTTPContext, &status, &data_size); + + if (status == 200 && data) + { + void * resultObject = Parser->ProcessResponse((unsigned char *)data, data_size); + free(data); + + if(resultObject) + { + this->ResultObject = resultObject; + rb.requestComplete(this); + return RequestBroker::Finished; + } + else + { + std::cout << typeid(*this).name() << " Request for " << URL << " could not be parsed" << status << std::endl; + return RequestBroker::Failed; + } + } + else + { +//#ifdef DEBUG + std::cout << typeid(*this).name() << " Request for " << URL << " failed with status " << status << std::endl; +//#endif + if(data) + free(data); + + return RequestBroker::Failed; + } + } + } + else + { + std::cout << typeid(*this).name() << " New Request for " << URL << std::endl; + HTTPContext = http_async_req_start(NULL, (char *)URL.c_str(), NULL, 0, 0); + //RequestTime = time(NULL); + } + return RequestBroker::OK; +} + +APIRequest::~APIRequest() +{ + delete Parser; +} + +void APIRequest::Cleanup() +{ + Request::Cleanup(); + if(ResultObject) + { + Parser->Cleanup(ResultObject); + ResultObject = NULL; + } +}
\ No newline at end of file diff --git a/src/client/requestbroker/APIRequest.h b/src/client/requestbroker/APIRequest.h new file mode 100644 index 0000000..2d41eb6 --- /dev/null +++ b/src/client/requestbroker/APIRequest.h @@ -0,0 +1,15 @@ +#include "RequestBroker.h" + +class APIResultParser; +class APIRequest: public RequestBroker::Request +{ +public: + APIResultParser * Parser; + std::string URL; + void * HTTPContext; + APIRequest(std::string url, APIResultParser * parser, ListenerHandle listener = ListenerHandle(0, 0)); + virtual RequestBroker::ProcessResponse Process(RequestBroker & rb); + virtual ~APIRequest(); + virtual void Cleanup(); +}; + diff --git a/src/client/requestbroker/APIResultParser.h b/src/client/requestbroker/APIResultParser.h new file mode 100644 index 0000000..40c7512 --- /dev/null +++ b/src/client/requestbroker/APIResultParser.h @@ -0,0 +1,16 @@ +#ifndef APIRESULTPARSER_H +#define APIRESULTPARSER_H + +class APIResultParser +{ +public: + //Process the raw API response into a result object to be returned to the requester + virtual void * ProcessResponse(unsigned char * data, int dataLength) { return 0; } + + //A method to clean up the result of ProcessResponse in the event of a callback failure in APIRequest/RequestBroker + virtual void Cleanup(void * objectPtr) { } + + virtual ~APIResultParser() { } +}; + +#endif
\ No newline at end of file diff --git a/src/client/requestbroker/RequestBroker.cpp b/src/client/requestbroker/RequestBroker.cpp index 68427dc..cfa1294 100644 --- a/src/client/requestbroker/RequestBroker.cpp +++ b/src/client/requestbroker/RequestBroker.cpp @@ -114,6 +114,18 @@ void RequestBroker::RetrieveAvatar(std::string username, int width, int height, RetrieveImage(urlStream.str(), width, height, tListener); } +void RequestBroker::Start(Request * request, RequestListener * tListener) +{ + ListenerHandle handle = AttachRequestListener(tListener); + + request->Listener = handle; + pthread_mutex_lock(&requestQueueMutex); + requestQueue.push_back(request); + pthread_mutex_unlock(&requestQueueMutex); + + assureRunning(); +} + void RequestBroker::RetrieveImage(std::string imageUrl, int width, int height, RequestListener * tListener) { ListenerHandle handle = AttachRequestListener(tListener); diff --git a/src/client/requestbroker/RequestBroker.h b/src/client/requestbroker/RequestBroker.h index 003ac37..4c31e89 100644 --- a/src/client/requestbroker/RequestBroker.h +++ b/src/client/requestbroker/RequestBroker.h @@ -16,6 +16,7 @@ typedef std::pair<int, RequestListener*> ListenerHandle; class RequestBroker: public Singleton<RequestBroker> { friend class ImageRequest; + friend class APIRequest; friend class ThumbRenderRequest; public: class Request; @@ -55,6 +56,7 @@ public: void RetrieveThumbnail(int saveID, int saveDate, int width, int height, RequestListener * tListener); void RetrieveThumbnail(int saveID, int width, int height, RequestListener * tListener); void RetrieveAvatar(std::string username, int width, int height, RequestListener * tListener); + void Start(Request * request, RequestListener * tLIstener); bool CheckRequestListener(ListenerHandle handle); ListenerHandle AttachRequestListener(RequestListener * tListener); @@ -63,7 +65,7 @@ public: class Request { public: - enum RequestType { ThumbnailRender, Image }; + enum RequestType { ThumbnailRender, Image, API }; RequestType Type; void * ResultObject; ListenerHandle Listener; |
