aboutsummaryrefslogtreecommitdiff
path: root/backends/networking
diff options
context:
space:
mode:
authorAlexander Tkachev2016-05-17 01:19:49 +0600
committerAlexander Tkachev2016-08-24 16:07:55 +0600
commit03217cd5c3de3c17739a246f5967dfd4a14eb120 (patch)
treed62ee38b8a5d8146bc7bd7f64b68c3dc8c2291e5 /backends/networking
parent9c22b7cc64a3bd074f7cec012bd2f29f210d4ccf (diff)
downloadscummvm-rg350-03217cd5c3de3c17739a246f5967dfd4a14eb120.tar.gz
scummvm-rg350-03217cd5c3de3c17739a246f5967dfd4a14eb120.tar.bz2
scummvm-rg350-03217cd5c3de3c17739a246f5967dfd4a14eb120.zip
CLOUD: Add CurlJsonRequest
Now we can do REST API request by creating CurlJsonRequest and waiting for it to call our callback. Passed pointer is Common::JSONValue. This commit also does some minor variable renaming fixes.
Diffstat (limited to 'backends/networking')
-rw-r--r--backends/networking/curl/connectionmanager.cpp26
-rw-r--r--backends/networking/curl/curljsonrequest.cpp64
-rw-r--r--backends/networking/curl/curljsonrequest.h46
3 files changed, 123 insertions, 13 deletions
diff --git a/backends/networking/curl/connectionmanager.cpp b/backends/networking/curl/connectionmanager.cpp
index b7b7112c7f..ceff8b62a4 100644
--- a/backends/networking/curl/connectionmanager.cpp
+++ b/backends/networking/curl/connectionmanager.cpp
@@ -46,25 +46,25 @@ NetworkReadStream *ConnectionManager::makeRequest(const char *url) {
}
void ConnectionManager::handle() {
- int U;
- curl_multi_perform(_multi, &U);
+ int transfersRunning;
+ curl_multi_perform(_multi, &transfersRunning);
- int Q;
+ int messagesInQueue;
CURLMsg *curlMsg;
- while ((curlMsg = curl_multi_info_read(_multi, &Q))) {
- if (curlMsg->msg == CURLMSG_DONE) {
- CURL *e = curlMsg->easy_handle;
+ while ((curlMsg = curl_multi_info_read(_multi, &messagesInQueue))) {
+ CURL *easyHandle = curlMsg->easy_handle;
- NetworkReadStream *stream;
- curl_easy_getinfo(e, CURLINFO_PRIVATE, &stream);
- if (stream) stream->done();
+ NetworkReadStream *stream;
+ curl_easy_getinfo(easyHandle, CURLINFO_PRIVATE, &stream);
+ if (stream) stream->done(); //I'm not sure it's OK to notify "done()" on failure
- debug("ConnectionManager: SUCCESS (%d - %s)", curlMsg->data.result, curl_easy_strerror(curlMsg->data.result));
- curl_multi_remove_handle(_multi, e);
+ if (curlMsg->msg == CURLMSG_DONE) {
+ debug("ConnectionManager: SUCCESS (%d - %s)", curlMsg->data.result, curl_easy_strerror(curlMsg->data.result));
} else {
- debug("ConnectionManager: FAILURE (CURLMsg (%d))", curlMsg->msg);
- //TODO: notify stream on this case also
+ debug("ConnectionManager: FAILURE (CURLMsg (%d))", curlMsg->msg);
}
+
+ curl_multi_remove_handle(_multi, easyHandle);
}
}
diff --git a/backends/networking/curl/curljsonrequest.cpp b/backends/networking/curl/curljsonrequest.cpp
new file mode 100644
index 0000000000..acd9675aed
--- /dev/null
+++ b/backends/networking/curl/curljsonrequest.cpp
@@ -0,0 +1,64 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#define FORBIDDEN_SYMBOL_ALLOW_ALL
+
+#include "backends/networking/curl/curljsonrequest.h"
+#include "backends/networking/curl/networkreadstream.h"
+#include "common/debug.h"
+#include "common/json.h"
+#include <curl/curl.h>
+
+namespace Networking {
+
+CurlJsonRequest::CurlJsonRequest(Callback cb, const char *url) : Request(cb), _stream(0) {
+ _url = url;
+}
+
+CurlJsonRequest::~CurlJsonRequest() {
+ if (_stream) delete _stream;
+}
+
+bool CurlJsonRequest::handle(ConnectionManager &manager) {
+ if (!_stream) _stream = manager.makeRequest(_url);
+
+ if (_stream) {
+ const int kBufSize = 16*1024;
+ char buf[kBufSize+1];
+ uint32 readBytes = _stream->read(buf, kBufSize);
+ if (readBytes != 0) _contents += Common::String(buf, readBytes);
+ if (_stream->eos()) {
+ //TODO: check that stream's CURL easy handle's HTTP response code is 200 OK
+ debug("CurlJsonRequest: contents:\n%s", _contents.c_str());
+ if (_callback) {
+ Common::JSONValue *json = Common::JSON::parse(_contents.c_str()); //TODO: somehow fix JSON to work with UTF-8
+ debug("CurlJsonRequest: JSONValue pointer = %p", json);
+ _callback(json); //potential memory leak, free it in your callbacks!
+ }
+ return true;
+ }
+ }
+
+ return false;
+}
+
+} //end of namespace Networking
diff --git a/backends/networking/curl/curljsonrequest.h b/backends/networking/curl/curljsonrequest.h
new file mode 100644
index 0000000000..73e0144c64
--- /dev/null
+++ b/backends/networking/curl/curljsonrequest.h
@@ -0,0 +1,46 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef BACKENDS_NETWORKING_CURL_CURLJSONREQUEST_H
+#define BACKENDS_NETWORKING_CURL_CURLJSONREQUEST_H
+
+#include "backends/cloud/request.h"
+
+namespace Networking {
+
+class NetworkReadStream;
+
+class CurlJsonRequest : public Cloud::Request {
+ const char *_url;
+ NetworkReadStream *_stream;
+ Common::String _contents;
+
+public:
+ CurlJsonRequest(Callback cb, const char *url);
+ virtual ~CurlJsonRequest();
+
+ virtual bool handle(ConnectionManager &manager);
+};
+
+} //end of namespace Networking
+
+#endif