summaryrefslogtreecommitdiff
path: root/src/client
diff options
context:
space:
mode:
authorSimon 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)
commitf05044ab68e51ce9c374f6af09284051efcda449 (patch)
tree6ae35ed5f6f3395593fc0d2c90780d8162f302e7 /src/client
parentd383d6d7e5e1d3ca0856c02ebbcea5e9b8b2ff4e (diff)
downloadpowder-f05044ab68e51ce9c374f6af09284051efcda449.zip
powder-f05044ab68e51ce9c374f6af09284051efcda449.tar.gz
APIRequest, Aync methods for client, Profile edit/viewer (WIP)
Diffstat (limited to 'src/client')
-rw-r--r--src/client/Client.cpp55
-rw-r--r--src/client/Client.h5
-rw-r--r--src/client/UserInfo.h22
-rw-r--r--src/client/requestbroker/APIRequest.cpp77
-rw-r--r--src/client/requestbroker/APIRequest.h15
-rw-r--r--src/client/requestbroker/APIResultParser.h16
-rw-r--r--src/client/requestbroker/RequestBroker.cpp12
-rw-r--r--src/client/requestbroker/RequestBroker.h4
8 files changed, 186 insertions, 20 deletions
diff --git a/src/client/Client.cpp b/src/client/Client.cpp
index a43c45b..dcd4903 100644
--- a/src/client/Client.cpp
+++ b/src/client/Client.cpp
@@ -39,10 +39,13 @@
#include "client/SaveInfo.h"
#include "client/SaveFile.h"
#include "client/GameSave.h"
+#include "client/UserInfo.h"
#include "search/Thumbnail.h"
#include "preview/Comment.h"
#include "ClientListener.h"
#include "requestbroker/RequestBroker.h"
+#include "requestbroker/APIRequest.h"
+#include "requestbroker/APIResultParser.h"
#include "cajun/reader.h"
#include "cajun/writer.h"
@@ -1178,26 +1181,42 @@ std::vector<unsigned char> Client::GetSaveData(int saveID, int saveDate)
return saveData;
}
-VideoBuffer * Client::GetAvatar(std::string username)
+RequestBroker::Request * Client::GetUserInfoAsync(std::string username)
{
- lastError = "";
- int dataStatus;
- int dataLength = 0;
- unsigned char * data;
- std::stringstream urlStream;
- urlStream << "http://" << STATICSERVER << "/avatars/" << username << ".pti";
-
- data = (unsigned char *)http_simple_get((char *)urlStream.str().c_str(), &dataStatus, &dataLength);
- if(data && dataStatus == 200)
+ class UserInfoParser: public APIResultParser
{
- std::vector<char> responseData(data, data+dataLength);
- return format::PTIToVideoBuffer(responseData);
- }
- else if(data)
- {
- free(data);
- }
- return NULL;
+ virtual void * ProcessResponse(unsigned char * data, int dataLength)
+ {
+ try
+ {
+ std::istringstream dataStream((char*)data);
+ json::Object objDocument;
+ json::Reader::Read(objDocument, dataStream);
+ json::Object tempUser = objDocument["User"];
+
+ json::Number userIDTemp = tempUser["ID"];
+ json::String usernameTemp = tempUser["Username"];
+ json::String bioTemp = tempUser["Biography"];
+ //json::Number ageTemp = tempUser["Age"];
+
+ return new UserInfo(
+ userIDTemp.Value(),
+ 0,//ageTemp.Value(),
+ usernameTemp.Value(),
+ bioTemp.Value());
+ }
+ catch (json::Exception &e)
+ {
+ return 0;
+ }
+ }
+ virtual void Cleanup(void * objectPtr)
+ {
+ delete (UserInfo*)objectPtr;
+ }
+ virtual ~UserInfoParser() { }
+ };
+ return new APIRequest("http://" SERVER "/User.json?Name=" + username, new UserInfoParser());
}
LoginStatus Client::Login(std::string username, std::string password, User & user)
diff --git a/src/client/Client.h b/src/client/Client.h
index c824d28..f00083d 100644
--- a/src/client/Client.h
+++ b/src/client/Client.h
@@ -12,6 +12,8 @@
#include "cajun/elements.h"
+#include "requestbroker/RequestBroker.h"
+
class Thumbnail;
class SaveInfo;
class SaveFile;
@@ -126,7 +128,8 @@ public:
RequestStatus AddComment(int saveID, std::string comment);
- VideoBuffer * GetAvatar(std::string username);
+ //Retrieves a "UserInfo" object
+ RequestBroker::Request * GetUserInfoAsync(std::string username);
unsigned char * GetSaveData(int saveID, int saveDate, int & dataLength);
std::vector<unsigned char> GetSaveData(int saveID, int saveDate);
diff --git a/src/client/UserInfo.h b/src/client/UserInfo.h
new file mode 100644
index 0000000..edd6659
--- /dev/null
+++ b/src/client/UserInfo.h
@@ -0,0 +1,22 @@
+#ifndef USERINFO_H_
+#define USERINFO_H_
+
+#include <string>
+
+class UserInfo
+{
+public:
+ int ID;
+ int Age;
+ std::string Username;
+ std::string Biography;
+ UserInfo(int id, int age, std::string username, std::string biography):
+ ID(id),
+ Age(age),
+ Username(username),
+ Biography(biography)
+ { }
+};
+
+
+#endif /* USER_H_ */
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;