[vlmc-devel] [PATCH 6/6] Added GoogleDrive.

Paweł Wegner pawel.wegner95 at gmail.com
Mon May 9 13:29:49 CEST 2016


---
 src/GoogleDrive.cpp | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/GoogleDrive.h   |  28 +++++++++++++
 src/Makefile.am     |   3 +-
 test/main.cpp       |   3 +-
 4 files changed, 148 insertions(+), 2 deletions(-)
 create mode 100644 src/GoogleDrive.cpp
 create mode 100644 src/GoogleDrive.h

diff --git a/src/GoogleDrive.cpp b/src/GoogleDrive.cpp
new file mode 100644
index 0000000..4571a00
--- /dev/null
+++ b/src/GoogleDrive.cpp
@@ -0,0 +1,116 @@
+#include "GoogleDrive.h"
+
+#include <jsoncpp/json/json.h>
+#include <cstring>
+#include <curlpp/Easy.hpp>
+#include <curlpp/Options.hpp>
+#include <iostream>
+#include <sstream>
+
+using namespace curlpp::options;
+
+namespace cloudstorage {
+
+GoogleDrive::GoogleDrive() {
+  set_client_id(
+      "646432077068-hmvk44qgo6d0a64a5h9ieue34p3j2dcv.apps.googleusercontent."
+      "com");
+  set_client_secret("1f0FG5ch-kKOanTAv1Bqdp9U");
+}
+
+void GoogleDrive::set_client_secret(const std::string& client_secret) {
+  client_secret_ = client_secret;
+}
+
+const std::string& GoogleDrive::client_secret() const { return client_secret_; }
+
+std::string GoogleDrive::authorizeLibraryUrl() const {
+  std::string response_type = "code";
+  std::string scope = "https://www.googleapis.com/auth/drive";
+  std::string url = "https://accounts.google.com/o/oauth2/auth?";
+  addParameter(url, "response_type", response_type);
+  addParameter(url, "client_id", client_id());
+  addParameter(url, "redirect_uri", redirect_uri());
+  addParameter(url, "scope", scope);
+  return url;
+}
+
+// TODO
+std::vector<ICloudStorage::File> GoogleDrive::listDirectory(
+    const std::string&) const {
+  return {};
+}
+
+std::unique_ptr<ICloudStorage::Token> GoogleDrive::requestAccessToken() const {
+  curlpp::Easy request;
+  std::stringstream stream;
+  request.setOpt<Url>("https://accounts.google.com/o/oauth2/token");
+  request.setOpt(curlpp::options::WriteStream(&stream));
+  std::string post_data;
+  addParameter(post_data, "grant_type", "authorization_code");
+  addParameter(post_data, "client_secret", client_secret());
+  addParameter(post_data, "code", authorization_code());
+  addParameter(post_data, "client_id", client_id());
+  addParameter(post_data, "redirect_uri", redirect_uri());
+  request.setOpt(curlpp::options::PostFields(post_data));
+  request.perform();
+
+  Json::Value response;
+  stream >> response;
+
+  if (response.isMember("access_token")) {
+    std::unique_ptr<Token> token(new Token(
+        response["access_token"].asString(), response["expires_in"].asInt(),
+        response["refresh_token"].asString()));
+    return token;
+  }
+
+  return nullptr;
+}
+
+std::unique_ptr<ICloudStorage::Token> GoogleDrive::refreshToken() const {
+  if (!access_token()) return nullptr;
+
+  curlpp::Easy request;
+  std::stringstream stream;
+  request.setOpt(curlpp::options::WriteStream(&stream));
+  request.setOpt<Url>("https://accounts.google.com/o/oauth2/token");
+  std::string post_data;
+  addParameter(post_data, "refresh_token", access_token()->refresh_token());
+  addParameter(post_data, "client_id", client_id());
+  addParameter(post_data, "client_secret", client_secret());
+  addParameter(post_data, "grant_type", "refresh_token");
+  request.setOpt(curlpp::options::PostFields(post_data));
+  request.perform();
+  Json::Value response;
+  stream >> response;
+  if (response.isMember("access_token")) {
+    std::unique_ptr<Token> token(new Token(response["access_token"].asString(),
+                                           response["expires_in"].asInt(),
+                                           access_token()->refresh_token()));
+    return token;
+  }
+
+  return nullptr;
+}
+
+bool GoogleDrive::validateToken(ICloudStorage::Token* token) const {
+  curlpp::Easy request;
+  std::stringstream stream;
+  request.setOpt(curlpp::options::WriteStream(&stream));
+  std::string url = "https://www.googleapis.com/oauth2/v3/tokeninfo?";
+  addParameter(url, "access_token", token->token());
+  request.setOpt<Url>(url);
+  request.perform();
+
+  Json::Value response;
+  stream >> response;
+
+  if (response.isMember("expires_in")) {
+    token->set_expires_in(atoi(response["expires_in"].asCString()));
+    return true;
+  } else
+    return false;
+}
+
+}  // namespace cloudstorage
diff --git a/src/GoogleDrive.h b/src/GoogleDrive.h
new file mode 100644
index 0000000..090f158
--- /dev/null
+++ b/src/GoogleDrive.h
@@ -0,0 +1,28 @@
+#ifndef GOOGLEDRIVE_H
+#define GOOGLEDRIVE_H
+
+#include "ICloudStorage.h"
+
+namespace cloudstorage {
+
+class GoogleDrive : public ICloudStorage {
+ public:
+  GoogleDrive();
+
+  void set_client_secret(const std::string&);
+  const std::string& client_secret() const;
+
+  std::string authorizeLibraryUrl() const;
+  std::vector<File> listDirectory(const std::string& path) const;
+
+  std::unique_ptr<Token> requestAccessToken() const;
+  std::unique_ptr<Token> refreshToken() const;
+  bool validateToken(Token*) const;
+
+ private:
+  std::string client_secret_;
+};
+
+}  // namespace cloudstorage
+
+#endif  // GOOGLEDRIVE_H
diff --git a/src/Makefile.am b/src/Makefile.am
index 45f2256..3dfc17a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -7,7 +7,8 @@ AM_CXXFLAGS = \
 
 lib_LTLIBRARIES = libcloudstorage.la
 libcloudstorage_la_SOURCES = \
-	ICloudStorage.cpp ICloudStorage.h
+	ICloudStorage.cpp ICloudStorage.h \
+	GoogleDrive.cpp GoogleDrive.h
 
 libcloudstorage_la_LIBADD = \
 	$(libcurlpp_LIBS) \
diff --git a/test/main.cpp b/test/main.cpp
index accdc73..c31ac52 100644
--- a/test/main.cpp
+++ b/test/main.cpp
@@ -1,5 +1,6 @@
-#include <ICloudStorage.h>
+#include <GoogleDrive.h>
 
 int main() {
+  cloudstorage::GoogleDrive gdrive;
   return 0;
 }
-- 
2.7.4



More information about the Vlmc-devel mailing list