Able to retrieve an access token. Next implement fetching all songs. I left a TODO.

This commit was merged in pull request #56.
This commit is contained in:
kdeng00
2019-10-03 20:35:59 -04:00
parent 3c8064dfd2
commit 77ecf4ca12
10 changed files with 257 additions and 152 deletions
+25 -29
View File
@@ -15,13 +15,16 @@ cmake_minimum_required(VERSION 3.4.1)
set (SOURCES
Demo.cpp
SongRepository.cpp
Tok.cpp
)
)
set (HEADERS
model/Song.h
model/User.h
SongRepository.h
Tok.h
)
)
set(JSON_BuildTests OFF CACHE INTERNAL "")
@@ -29,13 +32,12 @@ set(JSON_BuildTests OFF CACHE INTERNAL "")
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/json)
add_library(native-lib
SHARED
add_library(native-lib SHARED
# Provides a relative path to your source file(s).
${SOURCES}
${HEADERS}
)
# Provides a relative path to your source file(s).
${SOURCES}
${HEADERS}
)
# Searches for a specified prebuilt library and stores the path as a
@@ -44,27 +46,26 @@ add_library(native-lib
# you want to add. CMake verifies that the library exists before
# completing its build.
find_library( # Sets the name of the path variable.
log-lib
find_library(log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log
)
# Specifies the name of the NDK library that
# you want CMake to locate.
log )
# message(${CMAKE_ANDROID_ARCH_ABI})
set (CURL_LIBRARY
${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/android/${ANDROID_ABI}
)
)
set (CURL_INCLUDE_DIR
${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/android/include/curl
${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/android/include
)
)
add_library(boo STATIC IMPORTED)
set_target_properties(boo PROPERTIES IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/android/${ANDROID_ABI}/libcurl.a")
#find_package(CURL REQUIRED)
set_target_properties(boo PROPERTIES IMPORTED_LOCATION
"${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/android/${ANDROID_ABI}/libcurl.a"
)
include_directories(${CURL_INCLUDE_DIR})
@@ -72,15 +73,10 @@ include_directories(${CURL_INCLUDE_DIR})
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.
#target_include_directories(native-lib PUBLIC ${CURL_INCLUDE_DIR})
target_link_libraries( # Specifies the target library.
native-lib
PRIVATE nlohmann_json::nlohmann_json
boo
#${CURL_LIBRARIES}
target_link_libraries(native-lib PRIVATE
# Links the target library to the log library
# included in the NDK.
${log-lib}
nlohmann_json::nlohmann_json
boo
${log-lib}
z
)
)
+21 -115
View File
@@ -20,134 +20,40 @@
#include "model/Song.h"
#include "model/User.h"
#include "Tok.h"
std::string fetchToken();
model::Song initSong();
model::User initUser();
size_t funcTest(void*, size_t, size_t, char*);
//size_t funcTest(void*, size_t, size_t, std::string&);
int demoCall();
void printSong(const model::Song&);
std::string fetchToken(const std::string&, const std::string&, const std::string&);
std::string fetchToken()
std::string fetchToken(const std::string& username, const std::string& password,
const std::string& apiUri)
{
auto user = initUser();
nlohmann::json usr;
usr["username"] = user.username;
usr["password"] = user.password;
model::User user(username, password);
manager::Tok tokMgr;
CURL *curl;
CURLcode res;
auto token = tokMgr.fetchToken(user, apiUri);
curl = curl_easy_init();
return token;
std::string tok;
if (curl) {
const auto url = "";
char resp[2048];
curl_easy_setopt(curl, CURLOPT_URL, url);
const std::string a = usr.dump();
//std::string r;
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, a.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, funcTest);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, resp);
//curl_easy_setopt(curl, CURLOPT_WRITEDATA, r);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
const std::string i = resp;
auto s = nlohmann::json::parse(i);
tok = s["token"].get<std::string>();
return tok;
}
return "";
}
model::Song initSong()
{
model::Song song;
song.title = "hello";
song.artist = "some artist";
return song;
}
model::User initUser()
{
model::User user;
user.username = "";
user.password = "";
return user;
}
size_t funcTest(void* ptr, size_t size, size_t nmemb, char *e)
{
std::memcpy(e, ptr, nmemb);
e[nmemb] = '\0';
return nmemb;
}
size_t funcTest(void* ptr, size_t size, size_t nmemb, std::string& e)
{
e = (char*) ptr;
return nmemb;
}
int demoCall()
{
model::Song song = initSong();
std::cout << "testing" << std::endl;
printSong(song);
return 0;
}
void printSong(const model::Song& song)
{
std::cout << "\nsong information" << std::endl;
std::cout << "title: " << song.title << std::endl;
std::cout << "artist: " << song.artist << std::endl;
std::cout << "album: " << song.album << std::endl;
std::cout << "genre: " << song.genre << std::endl;
std::cout << "year: " << song.year << std::endl;
}
extern "C"
JNIEXPORT void
JNICALL
Java_com_example_mear_activities_MainActivity_test(
JNIEnv *env,
jobject /* this */) {
demoCall();
}
extern "C"
JNIEXPORT void
JNIEXPORT jstring
JNICALL
Java_com_example_mear_activities_DemoStreamActivity_test(
Java_com_example_mear_activities_DemoStreamActivity_logUser(
JNIEnv *env,
jobject /* this */) {
jobject thisObj,
jstring username,
jstring password,
jstring apiUri ) {
auto tok = fetchToken();
const std::string usr = env->GetStringUTFChars(username, NULL);
const std::string pass = env->GetStringUTFChars(password, NULL);
const std::string api = env->GetStringUTFChars(apiUri, NULL);
auto token = fetchToken(usr, pass, api);
return env->NewStringUTF(token.c_str());
}
+16
View File
@@ -0,0 +1,16 @@
//
// Created by brahmix on 10/3/19.
//
#include "SongRepository.h"
namespace repository {
// TODO: implement this
std::vector<model::Song> SongRepository::fetchSongs(const std::string& token,
const std::string& uri)
{
std::vector<model::Song> songs;
return songs;
}
}
+23
View File
@@ -0,0 +1,23 @@
//
// Created by brahmix on 10/3/19.
//
#ifndef MEAR_SONGREPOSITORY_H
#define MEAR_SONGREPOSITORY_H
#include <string>
#include <vector>
#include "model/Song.h"
namespace repository {
class SongRepository {
public:
std::vector<model::Song> fetchSongs(const std::string&, const std::string&);
private:
};
}
#endif //MEAR_SONGREPOSITORY_H
+66
View File
@@ -3,3 +3,69 @@
//
#include "Tok.h"
#include <cstring>
#include <curl/curl.h>
#include <nlohmann/json.hpp>
namespace manager {
std::string Tok::fetchToken(const model::User &user, const std::string& uri) {
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if (!curl) {
return "none";
}
char resp[2048];
const auto loginUri = fetchLoginUri(uri);
const auto obj = userJsonString(user);
curl_easy_setopt(curl, CURLOPT_URL, loginUri.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, obj.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, respBodyRetriever);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, resp);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
if (res == CURLE_OK) {
auto s = nlohmann::json::parse(resp);
return s["token"].get<std::string>();
}
return "failure";
}
std::string Tok::fetchLoginUri(const std::string& baseUri)
{
std::string uri(baseUri);
uri.append("/api/v1/login");
return uri;
}
std::string Tok::userJsonString(const model::User& user)
{
nlohmann::json usr;
usr["username"] = user.username;
usr["password"] = user.password;
return usr.dump();
}
size_t Tok::respBodyRetriever(void* ptr, size_t size, size_t nmemb, char *e)
{
std::memcpy(e, ptr, nmemb);
e[nmemb] = '\0';
return nmemb;
}
}
+13 -2
View File
@@ -7,9 +7,20 @@
#include <string>
class Tok {
#include "model/User.h"
};
namespace manager {
class Tok {
public:
std::string fetchToken(const model::User&, const std::string&);
private:
std::string fetchLoginUri(const std::string&);
std::string userJsonString(const model::User&);
static size_t respBodyRetriever(void*, size_t, size_t, char*);
};
}
#endif //MEAR_TOK_H
+4 -1
View File
@@ -5,11 +5,14 @@
#ifndef MEAR_USER_H
#define MEAR_USER_H
//#include "../../../../../../../../Android/Sdk/ndk/20.0.5594570/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/string"
namespace model {
struct User
{
User() = default;
User(const std::string& user, const std::string& pass) :
username(user), password(pass) { }
std::string username;
std::string password;
};