## Targets
SET(TARGET_CAPMGR "capmgr")
SET(TARGET_LIB_COMMON "capmgr-common")
-SET(TARGET_LIB_CLIENT "capmgr-client")
INCLUDE(FindPkgConfig)
INCLUDE(ApplyPkgConfig)
PKG_CHECK_MODULES(PKGMGR_INFO_DEPS REQUIRED pkgmgr-info)
PKG_CHECK_MODULES(SQLITE_DEPS REQUIRED sqlite3)
-FIND_PACKAGE(Boost REQUIRED COMPONENTS filesystem program_options system)
+FIND_PACKAGE(Boost REQUIRED COMPONENTS filesystem system)
FIND_PACKAGE(GTest REQUIRED)
ADD_SUBDIRECTORY(src)
-ADD_SUBDIRECTORY(tools)
%description
Tizen Capability Manager
-%package devel
-Summary: Capability Manager development files
-Group: Application Framework/Package Management
-Requires: %{name} = %{version}
-
-%description devel
-This package contains header files of capability manager library
-
%package tests
Summary: Unit-tests for capmgr
Requires: %{name} = %{version}
%license LICENSE
%defattr(-,root,root,-)
%{_bindir}/capmgr
-%{_bindir}/capmgr-test
-%{_libdir}/libcapmgr-client.so.*
-%{_libdir}/libcapmgr-common.so.*
+%{_libdir}/libcapmgr-common.so*
%{_sysconfdir}/dbus-1/system.d/%{name}.conf
%{_unitdir}/%{name}.service
%{_unitdir}/multi-user.target.wants/%{name}.service
%{_tmpfilesdir}/%{name}.conf
-%files devel
-%{_includedir}/%{name}.h
-%{_libdir}/pkgconfig/%{name}.pc
-%{_libdir}/libcapmgr-client.so
-%{_libdir}/libcapmgr-common.so
-
%files tests
%{_bindir}/capmgr-ut/*
/opt/share/capmgr-ut/*
ADD_SUBDIRECTORY(capmgr)
-ADD_SUBDIRECTORY(client)
ADD_SUBDIRECTORY(common)
ADD_SUBDIRECTORY(unit_tests)
+++ /dev/null
-AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} CLIENT_SRCS)
-INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../)
-
-ADD_LIBRARY(${TARGET_LIB_CLIENT} SHARED
- ${CLIENT_SRCS}
-)
-
-APPLY_PKG_CONFIG(${TARGET_LIB_CLIENT} PUBLIC
- AUL_DEPS
- BUNDLE_DEPS
- DLOG_DEPS
- GIO_DEPS
- GLIB_DEPS
-)
-
-SET_TARGET_PROPERTIES(${TARGET_LIB_CLIENT} PROPERTIES VERSION ${FULLVER})
-SET_TARGET_PROPERTIES(${TARGET_LIB_CLIENT} PROPERTIES SOVERSION ${MAJORVER})
-TARGET_LINK_LIBRARIES(${TARGET_LIB_CLIENT} PUBLIC ${TARGET_LIB_COMMON})
-
-INSTALL(TARGETS ${TARGET_LIB_CLIENT} DESTINATION ${LIB_INSTALL_DIR})
-CONFIGURE_FILE(capmgr.pc.in capmgr.pc @ONLY)
-INSTALL(FILES capmgr.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig)
-INSTALL(DIRECTORY include/ DESTINATION ${INCLUDEDIR} FILES_MATCHING PATTERN "*.h")
+++ /dev/null
-prefix=@PREFIX@
-exec_prefix=@EXEC_PREFIX@
-libdir=@LIBDIR@
-includedir=@INCLUDEDIR@
-
-Name: capmgr
-Description: capability-manager API
-Version: @FULLVER@
-Requires: capi-base-common
-Libs: -L${libdir} -lcapmgr-client
-Cflags: -I${includedir}
+++ /dev/null
-// Copyright (c) 2018 Samsung Electronics Co., Ltd All Rights Reserved
-// Use of this source code is governed by a apache 2.0 license that can be
-// found in the LICENSE file.
-
-#include <aul_svc.h>
-#include <bundle.h>
-#include <bundle_internal.h>
-#include <glib.h>
-
-#include <cstring>
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "client/dbus.h"
-#include "client/include/capmgr.h"
-#include "common/sql_connection.h"
-#include "common/sql_statement.h"
-#include "common/sqlite_connection.h"
-#include "common/utils/logging.h"
-
-#define API __attribute__((visibility("default")))
-
-namespace {
-
-const char kDBPath[] = "/run/capmgr/capmgr.db";
-
-} // namespace
-
-struct capmgr_device_s {
- std::string device_id;
- std::string model_name;
- std::string device_name;
- std::string platform_ver;
- std::string profile;
- std::string sw_ver;
-};
-
-struct capmgr_app_control_s {
- capmgr_device_h device;
- bundle* b;
-};
-
-struct capmgr_package_info_s {
- std::string pkgid;
- std::string label;
- std::string version;
- std::vector<std::string> appid_list;
-};
-
-API int capmgr_device_foreach_devices(capmgr_device_foreach_cb cb,
- void* user_data) {
- if (!cb)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- std::unique_ptr<capmgr::SQLConnection> sql_conn(
- new capmgr::SQLiteConnection(kDBPath, true));
-
- const char kQueryForeachDevices[] =
- "SELECT device_id, model_name, device_name, platform_ver,"
- " profile, sw_ver "
- "FROM devices";
- std::shared_ptr<capmgr::SQLStatement> stmt = sql_conn->PrepareStatement(
- kQueryForeachDevices);
- if (!stmt)
- return CAPMGR_ERROR_IO_ERROR;
-
- while (stmt->Step() == capmgr::SQLStatement::StepResult::ROW) {
- struct capmgr_device_s dev;
- int idx = 0;
- dev.device_id = stmt->GetColumnString(idx++);
- dev.model_name = stmt->GetColumnString(idx++);
- dev.device_name = stmt->GetColumnString(idx++);
- dev.platform_ver = stmt->GetColumnString(idx++);
- dev.profile = stmt->GetColumnString(idx++);
- dev.sw_ver = stmt->GetColumnString(idx++);
- if (cb(&dev, user_data))
- break;
- }
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_device_clone(const capmgr_device_h device,
- capmgr_device_h* device_clone) {
- if (!device || !device_clone)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- try {
- struct capmgr_device_s* clone = new struct capmgr_device_s;
-
- clone->device_id = device->device_id;
- clone->model_name = device->model_name;
- clone->device_name = device->device_name;
- clone->platform_ver = device->platform_ver;
- clone->profile = device->profile;
- clone->sw_ver = device->sw_ver;
-
- *device_clone = clone;
- } catch (const std::bad_alloc& e) {
- LOG(ERROR) << e.what();
- return CAPMGR_ERROR_OUT_OF_MEMORY;
- }
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_device_destroy(capmgr_device_h device) {
- if (!device)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- delete device;
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_device_get_device_id(capmgr_device_h device,
- char** device_id) {
- if (!device || !device_id)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- *device_id = strdup(device->device_id.c_str());
- if (*device_id == nullptr)
- return CAPMGR_ERROR_OUT_OF_MEMORY;
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_device_get_model_name(capmgr_device_h device,
- char** model_name) {
- if (!device || !model_name)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- *model_name = strdup(device->model_name.c_str());
- if (*model_name == nullptr)
- return CAPMGR_ERROR_OUT_OF_MEMORY;
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_device_get_device_name(capmgr_device_h device,
- char** device_name) {
- if (!device || !device_name)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- *device_name = strdup(device->device_name.c_str());
- if (*device_name == nullptr)
- return CAPMGR_ERROR_OUT_OF_MEMORY;
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_device_get_platform_ver(capmgr_device_h device,
- char** platform_ver) {
- if (!device || !platform_ver)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- *platform_ver = strdup(device->platform_ver.c_str());
- if (*platform_ver == nullptr)
- return CAPMGR_ERROR_OUT_OF_MEMORY;
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_device_get_profile(capmgr_device_h device, char** profile) {
- if (!device || !profile)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- *profile = strdup(device->profile.c_str());
- if (*profile == nullptr)
- return CAPMGR_ERROR_OUT_OF_MEMORY;
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_device_get_sw_ver(capmgr_device_h device,
- char** sw_ver) {
- if (!device || !sw_ver)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- *sw_ver = strdup(device->sw_ver.c_str());
- if (*sw_ver == nullptr)
- return CAPMGR_ERROR_OUT_OF_MEMORY;
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_app_control_create(capmgr_app_control_h* app_control) {
- if (!app_control)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- try {
- struct capmgr_app_control_s* control = new struct capmgr_app_control_s;
- control->b = bundle_create();
- if (!control->b) {
- delete control;
- return CAPMGR_ERROR_OUT_OF_MEMORY;
- }
- int r = aul_svc_set_operation(control->b, AUL_SVC_OPERATION_DEFAULT);
- if (r != AUL_SVC_RET_OK) {
- bundle_free(control->b);
- delete control;
- return CAPMGR_ERROR_OUT_OF_MEMORY;
- }
- *app_control = control;
- } catch (const std::bad_alloc& e) {
- LOG(ERROR) << e.what();
- return CAPMGR_ERROR_OUT_OF_MEMORY;
- }
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_app_control_clone(const capmgr_app_control_h app_control,
- capmgr_app_control_h* app_control_clone) {
- if (!app_control || !app_control_clone)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- try {
- struct capmgr_app_control_s* clone = new struct capmgr_app_control_s;
-
- int ret = capmgr_device_clone(app_control->device, &clone->device);
- if (ret != CAPMGR_ERROR_NONE) {
- delete clone;
- return CAPMGR_ERROR_OUT_OF_MEMORY;
- }
-
- clone->b = bundle_dup(app_control->b);
- if (!clone->b) {
- capmgr_app_control_destroy(clone);
- return CAPMGR_ERROR_OUT_OF_MEMORY;
- }
-
- *app_control_clone = clone;
- } catch (const std::bad_alloc& e) {
- LOG(ERROR) << e.what();
- return CAPMGR_ERROR_OUT_OF_MEMORY;
- }
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_app_control_destroy(capmgr_app_control_h app_control) {
- if (!app_control)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- capmgr_device_destroy(app_control->device);
- bundle_free(app_control->b);
- delete app_control;
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_app_control_get_operation(capmgr_app_control_h app_control,
- char** operation) {
- if (!app_control || !operation)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- const char* val = aul_svc_get_operation(app_control->b);
- if (!val)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- *operation = strdup(val);
- if (*operation == nullptr)
- return CAPMGR_ERROR_OUT_OF_MEMORY;
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_app_control_get_uri(capmgr_app_control_h app_control,
- char** uri) {
- if (!app_control || !uri)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- const char* val = aul_svc_get_uri(app_control->b);
- if (!val)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- *uri = strdup(val);
- if (*uri == nullptr)
- return CAPMGR_ERROR_OUT_OF_MEMORY;
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_app_control_get_mime(capmgr_app_control_h app_control,
- char** mime) {
- if (!app_control || !mime)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- const char* val = aul_svc_get_mime(app_control->b);
- if (!val)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- *mime = strdup(val);
- if (*mime == nullptr)
- return CAPMGR_ERROR_OUT_OF_MEMORY;
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_app_control_get_appid(capmgr_app_control_h app_control,
- char** appid) {
- if (!app_control || !appid)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- const char* val = aul_svc_get_appid(app_control->b);
- if (!val)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- *appid = strdup(val);
- if (*appid == nullptr)
- return CAPMGR_ERROR_OUT_OF_MEMORY;
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_app_control_get_extra_data(capmgr_app_control_h app_control,
- const char* key, char** value) {
- if (!app_control || !key || !value)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- // TODO(jeremy.jang): handle reserved key
-
- const char* val = aul_svc_get_data(app_control->b, key);
- if (!val) {
- LOG(ERROR) << "There is no extra data of key(" << key << ")";
- return CAPMGR_ERROR_INVALID_PARAMETER;
- }
-
- *value = strdup(val);
- if (*value == nullptr)
- return CAPMGR_ERROR_OUT_OF_MEMORY;
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_app_control_set_device(capmgr_app_control_h app_control,
- const capmgr_device_h device) {
- if (!app_control || !device)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- int ret = capmgr_device_clone(device, &app_control->device);
- if (ret != CAPMGR_ERROR_NONE)
- return CAPMGR_ERROR_OUT_OF_MEMORY;
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_app_control_set_operation(capmgr_app_control_h app_control,
- const char* operation) {
- if (!app_control || !operation)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- int r = aul_svc_set_operation(app_control->b, operation);
- if (r != AUL_SVC_RET_OK)
- return CAPMGR_ERROR_OUT_OF_MEMORY;
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_app_control_set_uri(capmgr_app_control_h app_control,
- const char* uri) {
- if (!app_control || !uri)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- int r = aul_svc_set_uri(app_control->b, uri);
- if (r != AUL_SVC_RET_OK)
- return CAPMGR_ERROR_OUT_OF_MEMORY;
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_app_control_set_mime(capmgr_app_control_h app_control,
- const char* mime) {
- if (!app_control || !mime)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- int r = aul_svc_set_mime(app_control->b, mime);
- if (r != AUL_SVC_RET_OK)
- return CAPMGR_ERROR_OUT_OF_MEMORY;
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_app_control_set_appid(capmgr_app_control_h app_control,
- const char* appid) {
- if (!app_control || !appid)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- int r = aul_svc_set_appid(app_control->b, appid);
- if (r != AUL_SVC_RET_OK)
- return CAPMGR_ERROR_OUT_OF_MEMORY;
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_app_control_add_extra_data(capmgr_app_control_h app_control,
- const char* key, const char* value) {
- if (!app_control || !key || !value)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- // TODO(jeremy.jang): handle reserved key
-
- int r = aul_svc_add_data(app_control->b, key, value);
- if (r != AUL_SVC_RET_OK)
- return CAPMGR_ERROR_OUT_OF_MEMORY;
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_app_control_remove_extra_data(capmgr_app_control_h app_control,
- const char* key) {
- if (!app_control || !key)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- // TODO(jeremy.jang): handle reserved key
-
- int r = bundle_del(app_control->b, key);
- if (r != BUNDLE_ERROR_NONE)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- return CAPMGR_ERROR_NONE;
-}
-
-struct cbdata {
- capmgr_app_control_h request;
- capmgr_app_control_reply_cb cb;
- void* user_data;
-};
-
-void capmgr_dbus_callback(GVariant* result, void* user_data) {
- LOG(DEBUG) << "Dbus callback for client called";
-
- // TODO(jeremy.jang): some data maybe returned
- GVariantIter* iter;
- guchar* data;
- guint len;
- g_variant_get(result, "(ayu)", &iter, &len);
- if (!iter)
- LOG(ERROR) << "Some error occurred";
-
- data = reinterpret_cast<guchar*>(g_try_malloc(len));
- if (!data) {
- LOG(ERROR) << "Out of memory";
- return;
- }
-
- for (unsigned int i = 0; i < len; i++) {
- if (!g_variant_iter_loop(iter, "y", &data[i])) {
- LOG(ERROR) << "Failed to get data from GVariant!";
- break;
- }
- }
- g_variant_iter_free(iter);
-
- struct cbdata* cbdata = reinterpret_cast<struct cbdata*>(user_data);
- struct capmgr_app_control_s* reply = new struct capmgr_app_control_s;
- reply->b = bundle_decode(data, len);
- if (!reply->b) {
- LOG(ERROR) << "Invalid bundle data!";
- capmgr_app_control_destroy(cbdata->request);
- delete cbdata;
- return;
- }
- reply->device = cbdata->request->device;
-
- // TODO(jeremy.jang): need to receive aul_svc result code
- cbdata->cb(cbdata->request, reply, CAPMGR_APP_CONTROL_RESULT_OK,
- cbdata->user_data);
-
- capmgr_app_control_destroy(cbdata->request);
- delete cbdata;
-}
-
-API int capmgr_app_control_send(capmgr_app_control_h app_control,
- capmgr_app_control_reply_cb cb, void* user_data) {
- if (!app_control || !app_control->device || !cb)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- bundle_raw* raw;
- int len;
- int r = bundle_encode(app_control->b, &raw, &len);
- if (r != BUNDLE_ERROR_NONE) {
- LOG(ERROR) << "Failed to encode bundle: " << r;
- return CAPMGR_ERROR_INVALID_PARAMETER;
- }
-
- // send app_control
- GVariantBuilder* array_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
- for (int i = 0; i < len; i++)
- g_variant_builder_add(array_builder, "y", raw[i]);
- GVariant* gv = g_variant_new("(sayu)",
- app_control->device->device_id.c_str(), array_builder, len);
- g_variant_builder_unref(array_builder);
- bundle_free_encoded_rawdata(&raw);
- if (!gv) {
- LOG(ERROR) << "Failed to create GVariant";
- return CAPMGR_ERROR_INVALID_PARAMETER;
- }
- g_variant_ref_sink(gv);
-
- capmgr_app_control_h clone;
- r = capmgr_app_control_clone(app_control, &clone);
- if (r != CAPMGR_ERROR_NONE) {
- LOG(ERROR) << "Failed to clone app control request: " << r;
- return r;
- }
-
- struct cbdata* cbdata = new struct cbdata;
- cbdata->request = clone;
- cbdata->cb = cb;
- cbdata->user_data = user_data;
-
- if (!capmgr::ProxyCallAsync("SendRemoteAppControl", gv, capmgr_dbus_callback,
- cbdata)) {
- LOG(ERROR) << "Failed to dbus method call";
- delete cbdata;
- capmgr_app_control_destroy(clone);
- g_variant_unref(gv);
- // errcode?
- return CAPMGR_ERROR_INVALID_PARAMETER;
- }
-
- g_variant_unref(gv);
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_package_info_get_pkgid(capmgr_package_info_h remote_package_info,
- char** pkgid) {
- if (!remote_package_info || !pkgid ||
- remote_package_info->pkgid.empty())
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- *pkgid = strdup(remote_package_info->pkgid.c_str());
- if (*pkgid == nullptr)
- return CAPMGR_ERROR_OUT_OF_MEMORY;
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_package_info_get_label(capmgr_package_info_h remote_package_info,
- char** label) {
- if (!remote_package_info || !label ||
- remote_package_info->label.empty())
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- *label = strdup(remote_package_info->label.c_str());
- if (*label == nullptr)
- return CAPMGR_ERROR_OUT_OF_MEMORY;
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_package_info_get_version(
- capmgr_package_info_h remote_package_info, char** version) {
- if (!remote_package_info || !version ||
- remote_package_info->version.empty())
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- *version = strdup(remote_package_info->version.c_str());
- if (*version == nullptr)
- return CAPMGR_ERROR_OUT_OF_MEMORY;
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_package_info_foreach_packages(const capmgr_device_h device,
- capmgr_package_info_foreach_package_cb cb,
- void* user_data) {
- std::map<std::string, capmgr_package_info_s> pkg_map;
-
- if (!cb)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- std::unique_ptr<capmgr::SQLConnection> sql_conn(
- new capmgr::SQLiteConnection(kDBPath, true));
-
- const char kQueryForeachPackages[] =
- "SELECT appid, pkgid, label, version FROM remote_app_info WHERE "
- "device_id = ?";
-
- std::shared_ptr<capmgr::SQLStatement> stmt = sql_conn->PrepareStatement(
- kQueryForeachPackages);
- if (!stmt)
- return CAPMGR_ERROR_IO_ERROR;
-
- if (stmt->BindString(1, device->device_id)) {
- while (stmt->Step() == capmgr::SQLStatement::StepResult::ROW) {
- struct capmgr_package_info_s info;
- std::string appid;
- int idx = 0;
- appid = stmt->GetColumnString(idx++);
- info.pkgid = stmt->GetColumnString(idx++);
- info.label = stmt->GetColumnString(idx++);
- info.version = stmt->GetColumnString(idx++);
-
- auto search_info = pkg_map.find(appid);
- if (search_info != pkg_map.end()) {
- info.appid_list.emplace_back(appid);
- pkg_map.emplace(appid, info);
- } else {
- struct capmgr_package_info_s found = search_info->second;
- found.appid_list.emplace_back(appid);
- }
- }
- }
-
- for (auto it = pkg_map.begin(); it != pkg_map.end(); it++) {
- struct capmgr_package_info_s info = it->second;
- if (cb(&info, user_data))
- break;
- }
-
- return CAPMGR_ERROR_NONE;
-}
-
-API int capmgr_package_info_foreach_applications(
- const capmgr_package_info_h remote_pkg_info,
- capmgr_package_info_foreach_app_cb cb,
- void* user_data) {
- if (!cb)
- return CAPMGR_ERROR_INVALID_PARAMETER;
-
- return CAPMGR_ERROR_NONE;
-}
+++ /dev/null
-// Copyright (c) 2018 Samsung Electronics Co., Ltd All Rights Reserved
-// Use of this source code is governed by a apache 2.0 license that can be
-// found in the LICENSE file.
-
-#include "client/dbus.h"
-
-#include <glib.h>
-#include <gio/gio.h>
-
-#include "common/utils/logging.h"
-
-namespace {
-
-const char kDBusServiceName[] = "org.tizen.capmgr";
-const char kDBusObjectPath[] = "/org/tizen/capmgr";
-const char kDBusInterfaceName[] = "org.tizen.capmgr";
-
-struct cbdata {
- capmgr::DBusCallback cb;
- void* user_data;
-};
-
-void MethodCallback(GObject* source_object, GAsyncResult* res,
- gpointer user_data) {
- LOG(DEBUG) << "Got a response from capmgr";
- GDBusProxy* proxy = reinterpret_cast<GDBusProxy*>(source_object);
- GError* error = nullptr;
- GVariant* result = g_dbus_proxy_call_finish(proxy, res, &error);
-
- if (error) {
- LOG(ERROR) << "g_dbus_proxy_call_finish() failed: " << error->message;
- return;
- }
-
- struct cbdata* cbdata = reinterpret_cast<struct cbdata*>(user_data);
- cbdata->cb(result, cbdata->user_data);
- delete cbdata;
-}
-
-} // namespace
-
-namespace capmgr {
-
-bool ProxyCallAsync(const char* method, GVariant* params, DBusCallback cb,
- void* user_data) {
- GError* error = nullptr;
- GDBusConnection* conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, nullptr, &error);
- if (!conn || error) {
- LOG(ERROR) << "g_bus_get_sync() failed: " << error->message;
- return false;
- }
- GDBusProxy* proxy = g_dbus_proxy_new_sync(conn,
- G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, nullptr,
- kDBusServiceName, kDBusObjectPath, kDBusInterfaceName, nullptr,
- &error);
- if (!proxy || error) {
- LOG(ERROR) << "g_dbus_proxy_new_sync() failed: " << error->message;
- g_object_unref(conn);
- return false;
- }
-
- // will be freed at MethodCallback()
- struct cbdata* cbdata = new struct cbdata;
- cbdata->cb = cb;
- cbdata->user_data = user_data;
-
- g_dbus_proxy_call(proxy, method,
- params, G_DBUS_CALL_FLAGS_NONE, -1, nullptr, MethodCallback, cbdata);
-
- g_object_unref(proxy);
- g_dbus_connection_flush_sync(conn, nullptr, nullptr);
- g_object_unref(conn);
-
- return true;
-}
-
-} // namespace capmgr
+++ /dev/null
-// Copyright (c) 2018 Samsung Electronics Co., Ltd All Rights Reserved
-// Use of this source code is governed by a apache 2.0 license that can be
-// found in the LICENSE file.
-
-#ifndef CLIENT_DBUS_H_
-#define CLIENT_DBUS_H_
-
-#include <glib.h>
-
-#include "client/include/capmgr.h"
-
-namespace capmgr {
-
-typedef void (*DBusCallback)(GVariant* result, void* user_data);
-
-bool ProxyCallAsync(const char* method, GVariant* params, DBusCallback cb,
- void* user_data);
-
-} // namespace capmgr
-
-#endif // CLIENT_DBUS_H_
+++ /dev/null
-// Copyright (c) 2018 Samsung Electronics Co., Ltd All Rights Reserved
-// Use of this source code is governed by a apache 2.0 license that can be
-// found in the LICENSE file.
-
-#ifndef CLIENT_INCLUDE_CAPMGR_H_
-#define CLIENT_INCLUDE_CAPMGR_H_
-
-#include <tizen.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-/**
- * @brief
- */
-typedef enum {
- CAPMGR_ERROR_NONE = TIZEN_ERROR_NONE,
- CAPMGR_ERROR_INVALID_PARAMETER = TIZEN_ERROR_INVALID_PARAMETER,
- CAPMGR_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY,
- CAPMGR_ERROR_IO_ERROR = TIZEN_ERROR_IO_ERROR,
-} capmgr_error_e;
-
-typedef enum {
- CAPMGR_APP_CONTROL_RESULT_OK,
-} capmgr_app_control_result_e;
-
-/**
- * @brief
- */
-typedef struct capmgr_device_s* capmgr_device_h;
-
-/**
- * @brief
- */
-typedef struct capmgr_app_control_s* capmgr_app_control_h;
-
-/**
- * @brief
- */
-typedef struct capmgr_package_info_s* capmgr_package_info_h;
-
-/**
- * @brief
- */
-typedef int (*capmgr_device_foreach_cb)(const capmgr_device_h device,
- void* user_data);
-
-/**
- * @brief
- */
-typedef int (*capmgr_app_control_reply_cb)(const capmgr_app_control_h request,
- const capmgr_app_control_h reply, capmgr_app_control_result_e result,
- void* user_data);
-
-/**
- * @brief
- */
-typedef int (*capmgr_package_info_foreach_package_cb)(
- const capmgr_package_info_h remote_package_info, void* user_data);
-
-/**
- * @brief
- */
-typedef int (*capmgr_package_info_foreach_app_cb)(
- const char* appid, void* user_data);
-
-/**
- * @brief
- */
-int capmgr_device_foreach_devices(capmgr_device_foreach_cb cb,
- void* user_data);
-
-/**
- * @brief
- */
-int capmgr_device_clone(const capmgr_device_h device,
- capmgr_device_h* device_clone);
-
-/**
- * @brief
- */
-int capmgr_device_destroy(capmgr_device_h device);
-
-/**
- * @brief
- */
-int capmgr_device_get_device_id(capmgr_device_h device, char** device_id);
-
-/**
- * @brief
- */
-int capmgr_device_get_model_name(capmgr_device_h device, char** model_name);
-
-/**
- * @brief
- */
-int capmgr_device_get_device_name(capmgr_device_h device, char** device_name);
-
-/**
- * @brief
- */
-int capmgr_device_get_platform_ver(capmgr_device_h device, char** platform_ver);
-
-/**
- * @brief
- */
-int capmgr_device_get_profile(capmgr_device_h device, char** profile);
-
-/**
- * @brief
- */
-int capmgr_device_get_sw_ver(capmgr_device_h device, char** sw_ver);
-
-/**
- * @brief
- */
-int capmgr_device_get_platform_version(capmgr_device_h device,
- char** platform_version);
-
-/**
- * @brief
- */
-int capmgr_app_control_create(capmgr_app_control_h* app_control);
-
-/**
- * @brief
- */
-int capmgr_app_control_clone(const capmgr_app_control_h app_control,
- capmgr_app_control_h* app_control_clone);
-
-/**
- * @brief
- */
-int capmgr_app_control_destroy(capmgr_app_control_h app_control);
-
-/**
- * @brief
- */
-int capmgr_app_control_get_device(capmgr_app_control_h app_control,
- capmgr_device_h* device);
-
-/**
- * @brief
- */
-int capmgr_app_control_get_operation(capmgr_app_control_h app_control,
- char** operation);
-
-/**
- * @brief
- */
-int capmgr_app_control_get_uri(capmgr_app_control_h app_control,
- char** uri);
-
-/**
- * @brief
- */
-int capmgr_app_control_get_mime(capmgr_app_control_h app_control,
- char** mime);
-
-/**
- * @brief
- */
-int capmgr_app_control_get_appid(capmgr_app_control_h app_control,
- char** appid);
-
-/**
- * @brief
- */
-int capmgr_app_control_get_extra_data(capmgr_app_control_h app_control,
- const char* key, char** value);
-
-/**
- * @brief
- */
-int capmgr_app_control_set_device(capmgr_app_control_h app_control,
- const capmgr_device_h device);
-
-/**
- * @brief
- */
-int capmgr_app_control_set_operation(capmgr_app_control_h app_control,
- const char* operation);
-
-/**
- * @brief
- */
-int capmgr_app_control_set_uri(capmgr_app_control_h app_control,
- const char* uri);
-
-/**
- * @brief
- */
-int capmgr_app_control_set_mime(capmgr_app_control_h app_control,
- const char* mime);
-
-/**
- * @brief
- */
-int capmgr_app_control_set_appid(capmgr_app_control_h app_control,
- const char* appid);
-
-/**
- * @brief
- */
-int capmgr_app_control_add_extra_data(capmgr_app_control_h app_control,
- const char* key, const char* value);
-
-/**
- * @brief
- */
-int capmgr_app_control_remove_extra_data(capmgr_app_control_h app_control,
- const char* key);
-
-/**
- * @brief
- */
-int capmgr_app_control_send(capmgr_app_control_h app_control,
- capmgr_app_control_reply_cb cb, void* user_data);
-
-/**
- * @brief
- */
-int capmgr_package_info_foreach_packages(const capmgr_device_h device,
- capmgr_package_info_foreach_package_cb cb, void* user_data);
-
-/**
- * @brief
- */
-int capmgr_package_info_foreach_applications(
- const capmgr_package_info_h remote_package_info,
- capmgr_package_info_foreach_app_cb cb, void* user_data);
-
-/**
- * @brief
- */
-int capmgr_package_info_get_pkgid(capmgr_package_info_h remote_package_info,
- char** pkgid);
-
-/**
- * @brief
- */
-int capmgr_package_info_get_label(capmgr_package_info_h remote_package_info,
- char** label);
-
-
-/**
- * @brief
- */
-int capmgr_package_info_get_version(capmgr_package_info_h remote_package_info,
- char** version);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // CLIENT_INCLUDE_CAPMGR_H_
+++ /dev/null
-SET(CAPMGR_TEST "capmgr-test")
-
-AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} TOOLS_SRCS)
-INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../src/)
-
-ADD_EXECUTABLE(${CAPMGR_TEST} ${TOOLS_SRCS})
-
-APPLY_PKG_CONFIG(${CAPMGR_TEST} PUBLIC
- GIO_DEPS
- GLIB_DEPS
- Boost
-)
-
-TARGET_LINK_LIBRARIES(${CAPMGR_TEST} PUBLIC ${TARGET_LIB_CLIENT})
-
-INSTALL(TARGETS ${CAPMGR_TEST} DESTINATION bin)
+++ /dev/null
-// Copyright (c) 2018 Samsung Electronics Co., Ltd All Rights Reserved
-// Use of this source code is governed by a apache 2.0 license that can be
-// found in the LICENSE file.
-
-#include <glib.h>
-#include <gio/gio.h>
-
-#include <boost/program_options.hpp>
-
-#include <iostream>
-
-#include "client/include/capmgr.h"
-
-namespace bpo = boost::program_options;
-
-namespace {
-
-const char kDBusServiceName[] = "org.tizen.capmgr";
-const char kDBusObjectPath[] = "/org/tizen/capmgr";
-const char kDBusInterfaceName[] = "org.tizen.capmgr";
-
-struct cbdata {
- capmgr_device_h* device;
- std::string device_id;
-};
-
-class Client {
- public:
- Client();
- ~Client();
-
- void CapExchange(GVariant* params);
- void SendAppControl(const std::string& device_id, const std::string& appid);
- void SendFile(const std::string& device_id, const std::string& file_path);
- void ListDevices();
-
- private:
- GVariant* ProxyCallSync(const char* method, GVariant* params);
- void WaitForResult();
- void Quit();
-
- static int AppControlCb(const capmgr_app_control_h request,
- const capmgr_app_control_h reply, capmgr_app_control_result_e result,
- void* user_data);
-
- GMainLoop* loop_;
- GDBusConnection* conn_;
- GDBusProxy* proxy_;
-};
-
-int DeviceForeachCb(const capmgr_device_h device, void* user_data) {
- char* device_id = nullptr;
- char* model_name = nullptr;
- char* device_name = nullptr;
- char* platform_ver = nullptr;
- char* profile = nullptr;
- char* sw_ver = nullptr;
-
- int ret = capmgr_device_get_device_id(device, &device_id);
- if (ret != CAPMGR_ERROR_NONE)
- std::cout << "Failed to get device id" << std::endl;
-
- ret = capmgr_device_get_model_name(device, &model_name);
- if (ret != CAPMGR_ERROR_NONE)
- std::cout << "Failed to get model name" << std::endl;
-
- ret = capmgr_device_get_device_name(device, &device_name);
- if (ret != CAPMGR_ERROR_NONE)
- std::cout << "Failed to get device name" << std::endl;
-
- ret = capmgr_device_get_platform_ver(device, &platform_ver);
- if (ret != CAPMGR_ERROR_NONE)
- std::cout << "Failed to get platform version" << std::endl;
-
- ret = capmgr_device_get_profile(device, &profile);
- if (ret != CAPMGR_ERROR_NONE)
- std::cout << "Failed to get profile" << std::endl;
-
- ret = capmgr_device_get_sw_ver(device, &sw_ver);
- if (ret != CAPMGR_ERROR_NONE)
- std::cout << "Failed to get sw version" << std::endl;
-
- if (user_data) {
- struct cbdata* cbdata = reinterpret_cast<struct cbdata*>(user_data);
- if (!strcmp(device_id, cbdata->device_id.c_str())) {
- ret = capmgr_device_clone(device, cbdata->device);
- if (ret != CAPMGR_ERROR_NONE)
- std::cout << "capmgr_device_clone() failed: " << ret << std::endl;
- }
- } else {
- std::cout << "==============================================" << std::endl;
- std::cout << "DeviceID: " << device_id << std::endl
- << "Model name: " << model_name << std::endl
- << "Device name: " << device_name << std::endl
- << "Platform version: " << platform_ver << std::endl
- << "Profile: " << profile << std::endl
- << "SW version: " << sw_ver << std::endl;
- }
-
- free(device_id);
- free(model_name);
- free(device_name);
- free(platform_ver);
- free(profile);
- free(sw_ver);
-
- return 0;
-}
-
-Client::Client() {
- loop_ = g_main_loop_new(nullptr, FALSE);
-
- GError* error = nullptr;
- conn_ = g_bus_get_sync(G_BUS_TYPE_SYSTEM, nullptr, &error);
- if (!conn_ || error) {
- std::cout << "g_bus_get_sync() failed: " << error->message << std::endl;
- exit(1);
- }
-
- proxy_ = g_dbus_proxy_new_sync(conn_, G_DBUS_PROXY_FLAGS_NONE, nullptr,
- kDBusServiceName, kDBusObjectPath, kDBusInterfaceName, nullptr, &error);
- if (!proxy_ || error) {
- std::cout << "g_dbus_proxy_new_sync() failed: " << error->message
- << std::endl;
- exit(1);
- }
-}
-
-Client::~Client() {
- g_object_unref(proxy_);
- g_dbus_connection_flush_sync(conn_, nullptr, nullptr);
- g_object_unref(conn_);
- g_main_loop_unref(loop_);
-}
-
-void Client::CapExchange(GVariant* params) {
- GVariant* ret = ProxyCallSync("ExchangeCapabilities", params);
- if (!ret)
- return;
-
- g_variant_unref(ret);
-}
-
-void Client::SendAppControl(const std::string& device_id,
- const std::string& appid) {
- if (device_id.empty()) {
- std::cout << "Target device is missing!" << std::endl;
- return;
- }
-
- capmgr_device_h device = nullptr;
- struct cbdata cbdata = {&device, device_id};
- int ret = capmgr_device_foreach_devices(DeviceForeachCb, &cbdata);
- if (ret != CAPMGR_ERROR_NONE) {
- std::cout << "capmgr_device_foreach_devices() failed: " << ret
- << std::endl;
- return;
- }
-
- if (*cbdata.device == nullptr) {
- std::cout << "There is no such device!" << std::endl;
- return;
- }
-
- capmgr_app_control_h ac;
- ret = capmgr_app_control_create(&ac);
- if (ret != CAPMGR_ERROR_NONE) {
- std::cout << "capmgr_app_control_create() failed: " << ret << std::endl;
- capmgr_device_destroy(device);
- return;
- }
-
- ret = capmgr_app_control_set_device(ac, device);
- if (ret != CAPMGR_ERROR_NONE) {
- std::cout << "capmgr_app_control_set_device() failed: " << ret
- << std::endl;
- capmgr_device_destroy(device);
- capmgr_app_control_destroy(ac);
- return;
- }
-
- ret = capmgr_app_control_set_appid(ac, appid.c_str());
- if (ret != CAPMGR_ERROR_NONE) {
- std::cout << "capmgr_app_control_set_appid() failed: " << ret
- << std::endl;
- capmgr_device_destroy(device);
- capmgr_app_control_destroy(ac);
- return;
- }
-
- ret = capmgr_app_control_send(ac, &Client::AppControlCb, this);
- if (ret != CAPMGR_ERROR_NONE)
- std::cout << "capmgr_app_control_set_appid() failed: " << ret
- << std::endl;
-
- capmgr_device_destroy(device);
- capmgr_app_control_destroy(ac);
-
- WaitForResult();
-}
-
-void Client::ListDevices() {
- int ret = capmgr_device_foreach_devices(DeviceForeachCb, nullptr);
- if (ret != CAPMGR_ERROR_NONE)
- std::cout << "capmgr_device_foreach_devices() failed: " << ret
- << std::endl;
-}
-
-void Client::SendFile(const std::string& device_id,
- const std::string& file_path) {
- if (device_id.empty()) {
- std::cout << "Target device is missing!" << std::endl;
- return;
- }
-
- if (file_path.empty()) {
- std::cout << "File path is missing!" << std::endl;
- return;
- }
-
- std::cout << "Send file " << file_path << " to " << device_id << std::endl;
-
- GVariant* params = g_variant_new("(ss)", device_id.c_str(),
- file_path.c_str());
- if (!params) {
- std::cout << "out of memory" << std::endl;
- return;
- }
-
- GVariant* ret = ProxyCallSync("SendFile", params);
-
- g_object_unref(params);
- g_object_unref(ret);
-}
-
-GVariant* Client::ProxyCallSync(const char* method, GVariant* params) {
- GError* error = nullptr;
- GVariant* ret = g_dbus_proxy_call_sync(proxy_, method,
- params, G_DBUS_CALL_FLAGS_NONE, -1, nullptr, &error);
- if (error) {
- std::cout << "g_dbus_proxy_call_sync of " << method << " failed: "
- << error->message << std::endl;
- }
- return ret;
-}
-
-void Client::WaitForResult() {
- g_main_loop_run(loop_);
-}
-
-void Client::Quit() {
- g_main_loop_quit(loop_);
-}
-
-int Client::AppControlCb(const capmgr_app_control_h request,
- const capmgr_app_control_h reply, capmgr_app_control_result_e result,
- void* user_data) {
- std::cout << "AppControlCb called" << std::endl;
-
- char* data;
- int ret = capmgr_app_control_get_extra_data(reply, "REPLY", &data);
- if (ret != CAPMGR_ERROR_NONE) {
- std::cout << "Failed to get extra data from appcontrol reply: " << ret
- << std::endl;
- } else {
- std::cout << "Get reply from remote app: " << data << std::endl;
- free(data);
- }
-
- Client* client = static_cast<Client*>(user_data);
- client->Quit();
- return 0;
-}
-
-} // namespace
-
-int main(int argc, char* argv[]) {
- bpo::options_description options("Allowed options");
- bpo::variables_map opt_map;
-
- ::Client client;
- try {
- options.add_options()
- ("help,h", "help")
- ("capexchange,c", "capability exchange")
- ("device,d", bpo::value<std::string>(), "device id")
- ("send-appcontrol,s", bpo::value<std::string>(),
- "send remote app-control")
- ("list-devices,l", "list remote devices")
- ("send-file,f", bpo::value<std::string>(), "send file");
- bpo::store(bpo::parse_command_line(argc, argv, options), opt_map);
-
- if (opt_map.count("help"))
- std::cout << options << std::endl;
- else if (opt_map.count("capexchange"))
- client.CapExchange(nullptr);
- else if (opt_map.count("send-appcontrol"))
- client.SendAppControl(opt_map["device"].as<std::string>(),
- opt_map["send-appcontrol"].as<std::string>());
- else if (opt_map.count("list-devices"))
- client.ListDevices();
- else if (opt_map.count("send-file"))
- client.SendFile(opt_map["device"].as<std::string>(),
- opt_map["send-file"].as<std::string>());
- else
- std::cout << options << std::endl;
- } catch (...) {
- std::cout << "Exception occured" << std::endl;
- }
-
- return 0;
-}