From 06a102072470b9cfd56c7ca4700c4316370ae9ac Mon Sep 17 00:00:00 2001 From: Gio Date: Thu, 22 Dec 2016 00:33:34 +0100 Subject: [PATCH 1/4] Add workaround to see debug messages from native code in android service --- libretroshare/src/libretroshare.pro | 2 + libretroshare/src/util/androiddebug.h | 117 +++++++++++++++++++++ retroshare-android-service/src/service.cpp | 6 ++ 3 files changed, 125 insertions(+) create mode 100644 libretroshare/src/util/androiddebug.h diff --git a/libretroshare/src/libretroshare.pro b/libretroshare/src/libretroshare.pro index 16b5a84c5..35b34481c 100644 --- a/libretroshare/src/libretroshare.pro +++ b/libretroshare/src/libretroshare.pro @@ -910,4 +910,6 @@ android-g++ { INCLUDEPATH += $$NDK_TOOLCHAIN_PATH/sysroot/usr/include DEPENDPATH += $$NDK_TOOLCHAIN_PATH/sysroot/usr/include PRE_TARGETDEPS += $$NDK_TOOLCHAIN_PATH/sysroot/usr/lib/libcrypto.a + + HEADERS += util/androiddebug.h } diff --git a/libretroshare/src/util/androiddebug.h b/libretroshare/src/util/androiddebug.h new file mode 100644 index 000000000..2e429b99f --- /dev/null +++ b/libretroshare/src/util/androiddebug.h @@ -0,0 +1,117 @@ +#pragma once +/* + * Redirect plain stdout and stderr to Android debug + * Copyright (C) 2016 Gioacchino Mazzurco + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +// Inspired by: https://codelab.wordpress.com/2014/11/03/how-to-use-standard-output-streams-for-logging-in-android-apps/ + +#include +#include +#include +#include // for O_NONBLOCK +#include +#include +#include + +/** + * On Android stdout and stderr of native code is discarded, instancing this + * class at the beginning of the main of your program to get them (stdout and + * stderr) on logcat output. + */ +class AndroidStdIOCatcher +{ +public: + AndroidStdIOCatcher(const std::string& dTag = "RetroShare", + android_LogPriority stdout_pri = ANDROID_LOG_INFO, + android_LogPriority stderr_pri = ANDROID_LOG_ERROR) : + tag(dTag), cout_pri(stdout_pri), cerr_pri(stderr_pri), should_stop(false) + { + // make stdout line-buffered + //setvbuf(stdout, 0, _IOLBF, 0); + + // make stdout and stderr unbuffered + setvbuf(stdout, 0, _IONBF, 0); + setvbuf(stderr, 0, _IONBF, 0); + + // create the pipes and redirect stdout and stderr + pipe2(pout_fd, O_NONBLOCK); + dup2(pout_fd[1], STDOUT_FILENO); + + pipe2(perr_fd, O_NONBLOCK); + dup2(perr_fd[1], STDERR_FILENO); + + // spawn the logging thread + pthread_create(&thr, 0, thread_func, this); + pthread_detach(thr); + } + + ~AndroidStdIOCatcher() + { + should_stop = true; + pthread_join(thr, NULL); + } + +private: + const std::string tag; + const android_LogPriority cout_pri; + const android_LogPriority cerr_pri; + + int pout_fd[2]; + int perr_fd[2]; + pthread_t thr; + std::atomic should_stop; + + static void *thread_func(void* instance) + { + __android_log_write(ANDROID_LOG_INFO, "RetroShare", "Android debugging start"); + + AndroidStdIOCatcher &i = *static_cast(instance); + + std::string out_buf; + std::string err_buf; + + while (!i.should_stop) + { + for(char c; read(i.pout_fd[0], &c, 1) == 1;) + { + out_buf += c; + if(c == '\n') + { + __android_log_write(i.cout_pri, i.tag.c_str(), out_buf.c_str()); + out_buf.clear(); + } + } + + for(char c; read(i.perr_fd[0], &c, 1) == 1;) + { + err_buf += c; + if(c == '\n') + { + __android_log_write(i.cerr_pri, i.tag.c_str(), err_buf.c_str()); + err_buf.clear(); + } + } + + usleep(10000); + } + + __android_log_write(ANDROID_LOG_INFO, "RetroShare", "Android debugging stop"); + + return NULL; + } +}; + diff --git a/retroshare-android-service/src/service.cpp b/retroshare-android-service/src/service.cpp index 9359af904..d3759dc61 100644 --- a/retroshare-android-service/src/service.cpp +++ b/retroshare-android-service/src/service.cpp @@ -21,6 +21,7 @@ #ifdef __ANDROID__ # include +# include "util/androiddebug.h" #endif #include "retroshare/rsinit.h" @@ -28,10 +29,15 @@ #include "api/ApiServerLocal.h" #include "api/RsControlModule.h" + using namespace resource_api; int main(int argc, char *argv[]) { +#ifdef __ANDROID__ + AndroidStdIOCatcher dbg; (void) dbg; +#endif + QCoreApplication a(argc, argv); ApiServer api; RsControlModule ctrl_mod(argc, argv, api.getStateTokenServer(), &api, true); From 3de3becb9b3c1441aea552c63fe75eb8064e066f Mon Sep 17 00:00:00 2001 From: Gioacchino Mazzurco Date: Thu, 22 Dec 2016 13:47:08 +0100 Subject: [PATCH 2/4] Cleanup #ifdef mess in RsAccountsDetail::PathDataDirectory() --- libretroshare/src/rsserver/rsaccounts.cc | 33 ++++++++++-------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/libretroshare/src/rsserver/rsaccounts.cc b/libretroshare/src/rsserver/rsaccounts.cc index cc4f5a6b2..6cec8c570 100644 --- a/libretroshare/src/rsserver/rsaccounts.cc +++ b/libretroshare/src/rsserver/rsaccounts.cc @@ -743,10 +743,7 @@ static bool checkAccount(std::string accountdir, AccountDetails &account,std::ma { std::string dataDirectory; -/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ -#ifndef WINDOWS_SYS - - #ifdef __APPLE__ +#ifdef __APPLE__ /* NOTE: OSX also qualifies as BSD... so this #ifdef must be before the BSD check. */ /* For OSX, applications are Bundled in a directory... @@ -767,7 +764,7 @@ static bool checkAccount(std::string accountdir, AccountDetails &account,std::ma dataDirectory += "/Contents/Resources"; std::cerr << "getRetroshareDataDirectory() OSX: " << dataDirectory; - #elif (defined(BSD) && (BSD >= 199103)) +#elif (defined(BSD) && (BSD >= 199103)) /* For BSD, the default is LOCALBASE which will be set * before compilation via the ports/pkg-src mechanisms. * For compilation without ports/pkg-src it is set to @@ -775,17 +772,7 @@ static bool checkAccount(std::string accountdir, AccountDetails &account,std::ma */ dataDirectory = "/usr/local/share/retroshare"; std::cerr << "getRetroshareDataDirectory() BSD: " << dataDirectory; - - #else - /* For Linux, the data directory is set in libretroshare.pro */ - #ifndef DATA_DIR - #error DATA_DIR variable not set. Cannot compile. - #endif - dataDirectory = DATA_DIR; - std::cerr << "getRetroshareDataDirectory() Linux: " << dataDirectory << std::endl; - - #endif -#else +#elif defined(WINDOWS_SYS) // if (RsInitConfig::portable) // { // /* For Windows Portable, files must be in the data directory */ @@ -805,21 +792,29 @@ static bool checkAccount(std::string accountdir, AccountDetails &account,std::ma /* Use RetroShare's exe dir */ dataDirectory = "."; + +#elif defined(DATA_DIR) + dataDirectory = DATA_DIR; + // For all other OS the data directory must be set in libretroshare.pro +#else +# error "For your target OS automatic data dir discovery is not supported, cannot compile if DATA_DIR variable not set." #endif -/******************************** WINDOWS/UNIX SPECIFIC PART ******************/ if (!check) + { + std::cerr << "getRetroshareDataDirectory() unckecked: " << dataDirectory << std::endl; return dataDirectory; + } /* Make sure the directory exists, else return emptyString */ if (!RsDirUtil::checkDirectory(dataDirectory)) { - std::cerr << "Data Directory not Found: " << dataDirectory << std::endl; + std::cerr << "getRetroshareDataDirectory() not found: " << dataDirectory << std::endl; dataDirectory = ""; } else { - std::cerr << "Data Directory Found: " << dataDirectory << std::endl; + std::cerr << "getRetroshareDataDirectory() found: " << dataDirectory << std::endl; } return dataDirectory; From 2c10e206b8e08e2b66614c19f3f46b8e0f131514 Mon Sep 17 00:00:00 2001 From: Gioacchino Mazzurco Date: Thu, 22 Dec 2016 13:47:44 +0100 Subject: [PATCH 3/4] qml-app: Added button to deny friendship --- .../src/qml/TrustedNodesView.qml | 41 ++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/retroshare-qml-app/src/qml/TrustedNodesView.qml b/retroshare-qml-app/src/qml/TrustedNodesView.qml index 59a536cc8..2971bb27f 100644 --- a/retroshare-qml-app/src/qml/TrustedNodesView.qml +++ b/retroshare-qml-app/src/qml/TrustedNodesView.qml @@ -18,22 +18,13 @@ import QtQuick 2.0 import QtQuick.Controls 1.4 -import org.retroshare.qml_components.LibresapiLocalClient 1.0 import "jsonpath.js" as JSONPath Item { - function refreshData() { rsApi.request("/peers/*", "") } - + function refreshData() { rsApi.request("/peers/*", "", function(par) { jsonModel.json = par.response }) } onFocusChanged: focus && refreshData() - LibresapiLocalClient - { - id: rsApi - onGoodResponseReceived: jsonModel.json = msg - Component.onCompleted: { openConnection(apiSocketPath) } - } - JSONListModel { id: jsonModel @@ -46,11 +37,33 @@ Item anchors.top: parent.top anchors.bottom: bottomButton.top model: jsonModel.model - delegate: Text + delegate: Item { - text: model.name - onTextChanged: color = JSONPath.jsonPath(JSON.parse(jsonModel.json), "$.data[?(@.pgp_id=='"+model.pgp_id+"')].locations[*].is_online").reduce(function(cur,acc){return cur || acc}, false) ? "lime" : "darkslategray" - } + height: 50 + Row + { + height: 30 + Text + { + text: model.name + onTextChanged: color = JSONPath.jsonPath(JSON.parse(jsonModel.json), "$.data[?(@.pgp_id=='"+model.pgp_id+"')].locations[*].is_online").reduce(function(cur,acc){return cur || acc}, false) ? "lime" : "darkslategray" + } + + Rectangle + { + height: parent.height + width: parent.height + color: "red" + + MouseArea + { + height: parent.height + width: parent.height + onClicked: rsApi.request("/peers/"+model.pgp_id+"/delete") + } + } + } + } } Button From 1b032e0a4fe23966e20515918513e64b9e62d9de Mon Sep 17 00:00:00 2001 From: Gioacchino Mazzurco Date: Thu, 22 Dec 2016 13:49:13 +0100 Subject: [PATCH 4/4] qml-app: remove deprecated usage of LibresapiLocalClient in ChatView --- retroshare-qml-app/src/qml/ChatView.qml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/retroshare-qml-app/src/qml/ChatView.qml b/retroshare-qml-app/src/qml/ChatView.qml index 3194d97a8..7f6139b9b 100644 --- a/retroshare-qml-app/src/qml/ChatView.qml +++ b/retroshare-qml-app/src/qml/ChatView.qml @@ -66,14 +66,7 @@ Item onClicked: { var jsonData = {"chat_id":chatView.chatId, "msg":msgComposer.text} - sendRsApi.request("/chat/send_message", JSON.stringify(jsonData)) - } - - LibresapiLocalClient - { - id: sendRsApi - onGoodResponseReceived: { msgComposer.text = ""; console.log(msg)} - Component.onCompleted: { openConnection(apiSocketPath) } + rsApi.request("/chat/send_message", JSON.stringify(jsonData), function(par) { msgComposer.text = ""; console.log(msg) }) } }