diff --git a/src/client/ring_signal.cpp b/src/client/ring_signal.cpp index dd03668cb4cab6e12352014eb2d1d360b3f7bcad..01416ada5c22e8b443d80923fc669684d14c16df 100644 --- a/src/client/ring_signal.cpp +++ b/src/client/ring_signal.cpp @@ -79,6 +79,7 @@ getSignalHandlers() exported_callback<DRing::ConfigurationSignal::Error>(), #ifdef __ANDROID__ exported_callback<DRing::ConfigurationSignal::GetHardwareAudioFormat>(), + exported_callback<DRing::ConfigurationSignal::GetAppDataPath>(), #endif /* Presence */ diff --git a/src/dring/configurationmanager_interface.h b/src/dring/configurationmanager_interface.h index 1de64f7bf3c599b858de9e19a22d22c3a555f07f..0a77fa3da90dd826e891fcef4574ae8a08471c1b 100644 --- a/src/dring/configurationmanager_interface.h +++ b/src/dring/configurationmanager_interface.h @@ -210,10 +210,18 @@ struct ConfigurationSignal { using cb_type = void(const std::string& /*account_id*/, const std::string& /*certId*/, const std::string& /*state*/); }; #ifdef __ANDROID__ + /** + * These are special getters for Android so the daemon can retreive + * some informations only accessible through Java APIs + */ struct GetHardwareAudioFormat { constexpr static const char* name = "GetHardwareAudioFormat"; using cb_type = void(std::vector<int32_t>* /* params_ret */); }; + struct GetAppDataPath { + constexpr static const char* name = "GetAppDataPath"; + using cb_type = void(const std::string& name, std::vector<std::string>* /* path_ret */); + }; #endif }; diff --git a/src/fileutils.cpp b/src/fileutils.cpp index d5d7beb3696a7f76188429b3fcab2719b9efdfcd..7b4f7d985b156cb6d8e877e5cdcf38f445f6df20 100644 --- a/src/fileutils.cpp +++ b/src/fileutils.cpp @@ -39,6 +39,10 @@ #include "logger.h" #include "intrin.h" +#ifdef __ANDROID__ +#include "client/ring_signal.h" +#endif + #include <sys/types.h> #include <sys/stat.h> @@ -90,22 +94,6 @@ bool check_dir(const char *path) return true; } -#ifdef __ANDROID__ -static char *program_dir = "/data/data/cx.ring"; -#else -static char *program_dir = NULL; -#endif - -void set_program_dir(char *program_path) -{ - program_dir = dirname(program_path); -} - -const char *get_program_dir() -{ - return program_dir; -} - #ifndef _WIN32 /* Lock a file region */ static int @@ -322,6 +310,18 @@ FileHandle::~FileHandle() } } +#ifdef __ANDROID__ +static std::string files_path; +static std::string cache_path; +static std::string config_path; +#else +static char *program_dir = NULL; +void set_program_dir(char *program_path) +{ + program_dir = dirname(program_path); +} +#endif + std::string get_cache_dir() { @@ -331,7 +331,11 @@ get_cache_dir() return cache_home; } else { #ifdef __ANDROID__ - return get_home_dir() + DIR_SEPARATOR_STR + PACKAGE; + std::vector<std::string> paths; + emitSignal<DRing::ConfigurationSignal::GetAppDataPath>("cache", &paths); + if (not paths.empty()) + cache_path = paths[0]; + return cache_path; #elif defined(__APPLE__) return get_home_dir() + DIR_SEPARATOR_STR + "Library" + DIR_SEPARATOR_STR + "Caches" @@ -347,7 +351,11 @@ std::string get_home_dir() { #if defined __ANDROID__ - return get_program_dir(); + std::vector<std::string> paths; + emitSignal<DRing::ConfigurationSignal::GetAppDataPath>("files", &paths); + if (not paths.empty()) + files_path = paths[0]; + return files_path; #elif defined _WIN32 WCHAR path[MAX_PATH]; if (SUCCEEDED(SHGetFolderPathW(nullptr, CSIDL_PROFILE, nullptr, 0, path))) { @@ -356,7 +364,7 @@ get_home_dir() WideCharToMultiByte(CP_ACP, 0, path, -1, tmp, MAX_PATH, &DefChar, nullptr); return std::string(tmp); } - return get_program_dir(); + return program_dir; #else // 1) try getting user's home directory from the environment @@ -381,7 +389,11 @@ std::string get_data_dir() { #ifdef __ANDROID__ - return get_program_dir(); + std::vector<std::string> paths; + emitSignal<DRing::ConfigurationSignal::GetAppDataPath>("files", &paths); + if (not paths.empty()) + files_path = paths[0]; + return files_path; #elif defined(__APPLE__) return get_home_dir() + DIR_SEPARATOR_STR + "Library" + DIR_SEPARATOR_STR + "Application Support" @@ -397,6 +409,42 @@ get_data_dir() #endif } +std::string +get_config_dir() +{ +#ifdef __ANDROID__ + std::vector<std::string> paths; + emitSignal<DRing::ConfigurationSignal::GetAppDataPath>("config", &paths); + if (not paths.empty()) + config_path = paths[0]; + return config_path; +#else +#ifdef __APPLE__ + std::string configdir = fileutils::get_home_dir() + DIR_SEPARATOR_STR + + "Library" + DIR_SEPARATOR_STR + "Application Support" + + DIR_SEPARATOR_STR + PACKAGE; +#else + std::string configdir = fileutils::get_home_dir() + DIR_SEPARATOR_STR + + ".config" + DIR_SEPARATOR_STR + PACKAGE; +#endif + + const std::string xdg_env(XDG_CONFIG_HOME); + if (not xdg_env.empty()) + configdir = xdg_env + DIR_SEPARATOR_STR + PACKAGE; + +#ifndef _WIN32 + if (mkdir(configdir.data(), 0700) != 0) { +#else + if (fileutils::recursive_mkdir(configdir.data()) != true) { +#endif + // If directory creation failed + if (errno != EEXIST) + RING_DBG("Cannot create directory: %s!", configdir.c_str()); + } + return configdir; +#endif +} + #ifdef _WIN32 bool recursive_mkdir(const std::string& path) diff --git a/src/fileutils.h b/src/fileutils.h index d784e7b3c8e1dfbaf146367341211b3d95160acc..bd8fc64f0e2aa4ce5e7730e12717f5b2099bc474 100644 --- a/src/fileutils.h +++ b/src/fileutils.h @@ -54,12 +54,12 @@ namespace ring { namespace fileutils { - std::string get_data_dir(); std::string get_home_dir(); + std::string get_config_dir(); + std::string get_data_dir(); std::string get_cache_dir(); bool check_dir(const char *path); void set_program_dir(char *program_path); - const char *get_program_dir(); std::string expand_path(const std::string &path); bool isDirectoryWritable(const std::string &directory); diff --git a/src/manager.cpp b/src/manager.cpp index e19296e908949879721865035ce89259879a6e53..47f2114ad2be317893c9af633413ad4730bde1cf 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -2017,33 +2017,8 @@ Manager::getTelephoneFile() std::string Manager::retrieveConfigPath() const { -#ifdef __ANDROID__ - std::string configdir = "/data/data/cx.ring"; -#elif __APPLE__ - std::string configdir = fileutils::get_home_dir() + DIR_SEPARATOR_STR - + "Library" + DIR_SEPARATOR_STR + "Application Support" - + DIR_SEPARATOR_STR + PACKAGE; -#else - std::string configdir = fileutils::get_home_dir() + DIR_SEPARATOR_STR + - ".config" + DIR_SEPARATOR_STR + PACKAGE; -#endif - - const std::string xdg_env(XDG_CONFIG_HOME); - if (not xdg_env.empty()) - configdir = xdg_env + DIR_SEPARATOR_STR + PACKAGE; - -#ifndef _WIN32 - if (mkdir(configdir.data(), 0700) != 0) { -#else - if (fileutils::recursive_mkdir(configdir.data()) != true) { -#endif - // If directory creation failed - if (errno != EEXIST) - RING_DBG("Cannot create directory: %s!", configdir.c_str()); - } - static const char * const PROGNAME = "dring"; - return configdir + DIR_SEPARATOR_STR + PROGNAME + ".yml"; + return fileutils::get_config_dir() + DIR_SEPARATOR_STR + PROGNAME + ".yml"; } /**