From: Yongjin Kim Date: Fri, 19 Jun 2015 02:16:48 +0000 (+0900) Subject: Add 3.0 APIs and sync APIs same as 2.4 X-Git-Tag: submit/tizen/20150619.054506^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=02a2a612180218999103b3a9dcf68b388a24b83c;p=platform%2Fcore%2Fconvergence%2Fservice-adaptor.git Add 3.0 APIs and sync APIs same as 2.4 Change-Id: Ib874d7a4a26a65bd151f3c7cecb1ebfec0f3ae67 Signed-off-by: Yongjin Kim --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 8a55c90..6584338 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,14 +15,14 @@ MESSAGE(">>> Build type: ${CMAKE_BUILD_TYPE}") ########################################################## -# Define BASE LIB +# Define Adaptor ########################################################## -ADD_SUBDIRECTORY(common) +ADD_SUBDIRECTORY(adaptor) ########################################################## -# Define Adaptor +# Define BASE LIB ########################################################## -ADD_SUBDIRECTORY(adaptor) +ADD_SUBDIRECTORY(common) ########################################################## # Define Adaptor API diff --git a/adaptor/CMakeLists.txt b/adaptor/CMakeLists.txt index c435db1..cf3e86f 100644 --- a/adaptor/CMakeLists.txt +++ b/adaptor/CMakeLists.txt @@ -15,30 +15,35 @@ MESSAGE(">>> Build type: ${CMAKE_BUILD_TYPE}") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${VISIBILITY} -fvisibility=hidden") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,--gc-sections") +ADD_DEFINITIONS("-DSERVICE_ADAPTOR_DEBUGGING") +ADD_DEFINITIONS("-D_SERVICE_ADAPTOR_IPC_SERVER") + ########################################################## # Define auth adaptor lib ########################################################## SET(AUTH-LIB "auth-adaptor") SET(AUTH-SRCS + ./auth-adaptor/oauth1_service.c + ./auth-adaptor/oauth2_service.c ./auth-adaptor/auth_adaptor.c ) INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/include - ${CMAKE_SOURCE_DIR}/common + ${CMAKE_SOURCE_DIR}/client ${CMAKE_SOURCE_DIR}/adaptor/auth-adaptor ) INCLUDE(FindPkgConfig) -pkg_check_modules(auth_pkgs REQUIRED dlog glib-2.0) +pkg_check_modules(auth_pkgs REQUIRED dlog glib-2.0 capi-appfw-application) set(EXTRA_CFLAGS "") FOREACH(flag ${auth_pkgs_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") ENDFOREACH(flag) -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -std=gnu99") #message(">>> extra_cflags ${EXTRA_CFLAGS}") #message(">>> result ${CMAKE_C_FLAGS}") @@ -47,7 +52,7 @@ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed") ADD_LIBRARY(${AUTH-LIB} SHARED ${AUTH-SRCS}) -TARGET_LINK_LIBRARIES(${AUTH-LIB} ${auth_pkgs_LDFLAGS} sal-common) +TARGET_LINK_LIBRARIES(${AUTH-LIB} ${auth_pkgs_LDFLAGS}) SET_TARGET_PROPERTIES(${AUTH-LIB} PROPERTIES SOVERSION ${VERSION_MAJOR}) SET_TARGET_PROPERTIES(${AUTH-LIB} PROPERTIES VERSION ${VERSION}) @@ -65,19 +70,18 @@ SET(CONTACT-SRCS INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/include - ${CMAKE_SOURCE_DIR}/common ${CMAKE_SOURCE_DIR}/adaptor/contact-adaptor ) INCLUDE(FindPkgConfig) -pkg_check_modules(contact_pkgs REQUIRED dlog glib-2.0) +pkg_check_modules(contact_pkgs REQUIRED dlog glib-2.0 capi-appfw-application) set(EXTRA_CFLAGS "") FOREACH(flag ${contact_pkgs_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") ENDFOREACH(flag) -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -std=gnu99") #message(">>> extra_cflags ${EXTRA_CFLAGS}") #message(">>> result ${CMAKE_C_FLAGS}") @@ -86,7 +90,7 @@ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed") ADD_LIBRARY(${CONTACT-LIB} SHARED ${CONTACT-SRCS}) -TARGET_LINK_LIBRARIES(${CONTACT-LIB} ${contact_pkgs_LDFLAGS} sal-common) +TARGET_LINK_LIBRARIES(${CONTACT-LIB} ${contact_pkgs_LDFLAGS}) SET_TARGET_PROPERTIES(${CONTACT-LIB} PROPERTIES SOVERSION ${VERSION_MAJOR}) SET_TARGET_PROPERTIES(${CONTACT-LIB} PROPERTIES VERSION ${VERSION}) @@ -100,23 +104,23 @@ INSTALL(TARGETS ${CONTACT-LIB} DESTINATION lib COMPONENT RuntimeLibraries) SET(STORAGE-LIB "storage-adaptor") SET(STORAGE-SRCS ./storage-adaptor/storage_adaptor.c + ./storage-adaptor/cloud_service.c ) INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/include - ${CMAKE_SOURCE_DIR}/common ${CMAKE_SOURCE_DIR}/adaptor/storage-adaptor ) INCLUDE(FindPkgConfig) -pkg_check_modules(storage_pkgs REQUIRED dlog glib-2.0) +pkg_check_modules(storage_pkgs REQUIRED dlog glib-2.0 capi-appfw-application) set(EXTRA_CFLAGS "") FOREACH(flag ${storage_pkgs_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") ENDFOREACH(flag) -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -std=gnu99") #message(">>> extra_cflags ${EXTRA_CFLAGS}") #message(">>> result ${CMAKE_C_FLAGS}") @@ -125,8 +129,45 @@ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed") ADD_LIBRARY(${STORAGE-LIB} SHARED ${STORAGE-SRCS}) -TARGET_LINK_LIBRARIES(${STORAGE-LIB} ${storage_pkgs_LDFLAGS} sal-common) +TARGET_LINK_LIBRARIES(${STORAGE-LIB} ${storage_pkgs_LDFLAGS}) SET_TARGET_PROPERTIES(${STORAGE-LIB} PROPERTIES SOVERSION ${VERSION_MAJOR}) SET_TARGET_PROPERTIES(${STORAGE-LIB} PROPERTIES VERSION ${VERSION}) INSTALL(TARGETS ${STORAGE-LIB} DESTINATION lib COMPONENT RuntimeLibraries) + +########################################################## +# Define resource adaptor lib +########################################################## + +SET(RESOURCE-LIB "resource-adaptor") +SET(RESOURCE-SRCS + ./resource-adaptor/resource_adaptor.c +) + +INCLUDE_DIRECTORIES( + ${CMAKE_SOURCE_DIR}/include + ${CMAKE_SOURCE_DIR}/adaptor/resource-adaptor +) + +INCLUDE(FindPkgConfig) +pkg_check_modules(resource_pkgs REQUIRED dlog glib-2.0 capi-appfw-application) + +set(EXTRA_CFLAGS "") +FOREACH(flag ${resource_pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -std=gnu99") + +#message(">>> extra_cflags ${EXTRA_CFLAGS}") +#message(">>> result ${CMAKE_C_FLAGS}") +#message(">>> ld flag ${resource_pkgs_LDFLAGS}") + +SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed") + +ADD_LIBRARY(${RESOURCE-LIB} SHARED ${RESOURCE-SRCS}) +TARGET_LINK_LIBRARIES(${RESOURCE-LIB} ${resource_pkgs_LDFLAGS}) +SET_TARGET_PROPERTIES(${RESOURCE-LIB} PROPERTIES SOVERSION ${VERSION_MAJOR}) +SET_TARGET_PROPERTIES(${RESOURCE-LIB} PROPERTIES VERSION ${VERSION}) + +INSTALL(TARGETS ${RESOURCE-LIB} DESTINATION lib COMPONENT RuntimeLibraries) diff --git a/adaptor/auth-adaptor/auth_adaptor.c b/adaptor/auth-adaptor/auth_adaptor.c index ccc4d73..450be97 100644 --- a/adaptor/auth-adaptor/auth_adaptor.c +++ b/adaptor/auth-adaptor/auth_adaptor.c @@ -1,39 +1,362 @@ +/* + * Auth Adaptor + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + #include #include #include "auth_adaptor.h" #include "service_adaptor_internal.h" -auth_adaptor_h auth_adaptor_create() +//****************************************************************************** +//* Global variables and defines +//****************************************************************************** + +//****************************************************************************** +//* Private interface +//****************************************************************************** + +//****************************************************************************** +//* Private interface definition +//****************************************************************************** + +static void _auth_adaptor_free_plugin(auth_plugin_h plugin) +{ +} + +//****************************************************************************** +//* Public interface definition +//****************************************************************************** + +API auth_adaptor_h auth_adaptor_create() { + SAL_FN_CALL; + auth_adaptor_h auth = (auth_adaptor_h) g_malloc0(sizeof(auth_adaptor_s)); + g_mutex_init(&auth->mutex); + return auth; } -service_adaptor_error_e auth_adaptor_destroy(auth_adaptor_h auth) +API service_adaptor_error_e auth_adaptor_destroy(auth_adaptor_h auth) { + SAL_FN_CALL; + + RETV_IF(NULL == auth, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + g_mutex_lock(&auth->mutex); + + if (0 != auth->start) + { + auth_adaptor_stop(auth); + } + SAL_FREE(auth); + g_mutex_unlock(&auth->mutex); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API service_adaptor_error_e auth_adaptor_start(auth_adaptor_h auth) +{ + SAL_FN_CALL; + + RETV_IF(NULL == auth, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + g_mutex_lock(&auth->mutex); + + auth->start = 1; + + g_mutex_unlock(&auth->mutex); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API service_adaptor_error_e auth_adaptor_stop(auth_adaptor_h auth) +{ + SAL_FN_CALL; + + RETV_IF(NULL == auth, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + // TODO: notify auth adaptor stop to each plugin + + g_mutex_lock(&auth->mutex); + + auth->start = 0; + + g_mutex_unlock(&auth->mutex); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API service_adaptor_error_e auth_adaptor_register_listener(auth_adaptor_h auth, auth_adaptor_listener_h listener) +{ + SAL_FN_CALL; + + RETV_IF(NULL == auth, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == listener, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + // TODO: register insert/ update/ delete callback for service-adaptor + return SERVICE_ADAPTOR_ERROR_NONE; } -service_adaptor_error_e auth_adaptor_start(auth_adaptor_h auth) +API service_adaptor_error_e auth_adaptor_unregister_listener(auth_adaptor_h auth, auth_adaptor_listener_h listener) { + SAL_FN_CALL; + + RETV_IF(NULL == auth, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == listener, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + // TODO: unregister insert/ update/ delete callback for service-adaptor + return SERVICE_ADAPTOR_ERROR_NONE; } -service_adaptor_error_e auth_adaptor_stop(auth_adaptor_h auth) +API service_adaptor_error_e auth_adaptor_create_plugin(const char *uri, const char *name, const char *package, auth_plugin_h *plugin) { + SAL_FN_CALL; + + RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == name, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == package, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + auth_plugin_h auth_plugin = (auth_plugin_h) g_malloc0(sizeof(auth_plugin_s)); + auth_plugin->uri = strdup(uri); + auth_plugin->name = strdup(name); + auth_plugin->package = strdup(package); + + g_mutex_init(&auth_plugin->mutex); + g_cond_init(&auth_plugin->cond); + + *plugin = auth_plugin; + return SERVICE_ADAPTOR_ERROR_NONE; } -service_adaptor_error_e auth_adaptor_register_listener(auth_adaptor_h auth, auth_adaptor_listener_h listener) +API service_adaptor_error_e auth_adaptor_destroy_plugin(auth_plugin_h plugin) { + SAL_FN_CALL; + + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + SAL_FREE(plugin->uri); + SAL_FREE(plugin->name); + SAL_FREE(plugin); + return SERVICE_ADAPTOR_ERROR_NONE; } -service_adaptor_error_e auth_adaptor_unregister_listener(auth_adaptor_h auth, auth_adaptor_listener_h listener) +API service_adaptor_error_e auth_adaptor_register_plugin_service(auth_plugin_h plugin, GHashTable *service) { + SAL_FN_CALL; + + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == service, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + int ret = SERVICE_ADAPTOR_ERROR_NONE; + + plugin->oauth1 = (oauth1_service_h) g_malloc0(sizeof(oauth1_service_s)); + ret = oauth1_register_service(plugin->oauth1, service); + + if (SERVICE_ADAPTOR_ERROR_NONE != ret) + { + SAL_INFO("could not find the function for oauth 1.0"); + SAL_FREE(plugin->oauth1); + } + + plugin->oauth2 = (oauth2_service_h) g_malloc0(sizeof(oauth2_service_s)); + ret = oauth2_register_service(plugin->oauth2, service); + + if (SERVICE_ADAPTOR_ERROR_NONE != ret) + { + SAL_INFO("could not find the function for oauth 2.0"); + SAL_FREE(plugin->oauth2); + } + return SERVICE_ADAPTOR_ERROR_NONE; } + +API service_adaptor_error_e auth_adaptor_unregister_plugin_service(auth_plugin_h plugin) +{ + SAL_FN_CALL; + + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + if (NULL != plugin->oauth1) + { + oauth1_unregister_service(plugin->oauth1); + SAL_FREE(plugin->oauth1); + } + + if (NULL != plugin->oauth2) + { + oauth2_unregister_service(plugin->oauth2); + SAL_FREE(plugin->oauth2); + } + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API service_adaptor_error_e auth_adaptor_add_plugin(auth_adaptor_h auth, auth_plugin_h plugin) +{ + SAL_FN_CALL; + + RETV_IF(NULL == auth, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + g_mutex_lock(&auth->mutex); + + auth->plugins = g_list_append(auth->plugins, plugin); + + g_mutex_unlock(&auth->mutex); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API service_adaptor_error_e auth_adaptor_remove_plugin(auth_adaptor_h auth, auth_plugin_h plugin) +{ + SAL_FN_CALL; + + RETV_IF(NULL == auth, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + g_mutex_lock(&auth->mutex); + + RETV_IF(NULL == g_list_find(auth->plugins, plugin), SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + auth->plugins = g_list_remove(auth->plugins, plugin); + + _auth_adaptor_free_plugin(plugin); + + g_mutex_unlock(&auth->mutex); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API auth_plugin_h auth_adaptor_get_plugin(auth_adaptor_h auth, const char *uri) +{ + SAL_FN_CALL; + + RETV_IF(NULL == auth, NULL); + RETV_IF(NULL == uri, NULL); + + g_mutex_lock(&auth->mutex); + + auth_plugin_h plugin = NULL; + + for (GList *list = g_list_first(auth->plugins); list != NULL; list = list->next) + { + auth_plugin_h this = (auth_plugin_h) list->data; + + if (0 == strcmp(this->uri, uri)) + { + plugin = this; + break; + } + } + + g_mutex_unlock(&auth->mutex); + + return plugin; +} + +API char *auth_adaptor_get_uri(auth_adaptor_h auth, const char *package) +{ + SAL_FN_CALL; + + RETV_IF(NULL == auth, NULL); + RETV_IF(NULL == package, NULL); + + g_mutex_lock(&auth->mutex); + + char *uri = NULL; + + for (GList *list = g_list_first(auth->plugins); list != NULL; list = list->next) + { + auth_plugin_h this = (auth_plugin_h) list->data; + + if (0 == strcmp(this->package, package)) + { + uri = this->uri; + break; + } + } + + g_mutex_unlock(&auth->mutex); + + return uri; +} + +API service_adaptor_error_e auth_adaptor_ref_plugin(auth_adaptor_h auth, const char *uri) +{ + SAL_FN_CALL; + + RETV_IF(NULL == auth, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + g_mutex_lock(&auth->mutex); + + int ret = SERVICE_ADAPTOR_ERROR_NO_DATA; + + for (GList *list = g_list_first(auth->plugins); list != NULL; list = list->next) + { + auth_plugin_h this = (auth_plugin_h) list->data; + + if (0 == strcmp(this->uri, uri)) + { + ret = SERVICE_ADAPTOR_ERROR_NONE; + // TODO: increase ref count + break; + } + } + + g_mutex_unlock(&auth->mutex); + + return ret; +} + +API service_adaptor_error_e auth_adaptor_unref_plugin(auth_adaptor_h auth, const char *uri) +{ + SAL_FN_CALL; + + RETV_IF(NULL == auth, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + g_mutex_lock(&auth->mutex); + + int ret = SERVICE_ADAPTOR_ERROR_NO_DATA; + + for (GList *list = g_list_first(auth->plugins); list != NULL; list = list->next) + { + auth_plugin_h this = (auth_plugin_h) list->data; + + if (0 == strcmp(this->uri, uri)) + { + ret = SERVICE_ADAPTOR_ERROR_NONE; + // TODO: decrease ref count + break; + } + } + + g_mutex_unlock(&auth->mutex); + + return ret; +} diff --git a/adaptor/auth-adaptor/auth_adaptor.h b/adaptor/auth-adaptor/auth_adaptor.h index 616dc63..c883d73 100644 --- a/adaptor/auth-adaptor/auth_adaptor.h +++ b/adaptor/auth-adaptor/auth_adaptor.h @@ -30,7 +30,13 @@ extern "C" #endif #include +#include +#include +#include + #include "service_adaptor_errors.h" +#include "oauth1_service.h" +#include "oauth2_service.h" /** * @file auth_adaptor.h @@ -49,24 +55,74 @@ extern "C" * @{ */ +#define URI_AUTH "auth" +#define URI_OAUTH1_0 "auth/oauth1.0" +#define URI_OAUTH2_0 "auth/oauth2.0" + +/** + * @brief Describes infromation about Auth Spec + */ +typedef enum _auth_spec_e +{ + AUTH_SPEC_OAUTH1_0 = (1 << 0), + AUTH_SPEC_OAUTH2_0 = (1 << 1), +} auth_spec_e; + +/** + * @brief Describes infromation about Auth Plugin + */ +typedef struct _auth_plugin_s +{ + char *uri; + char *name; + char *package; + + oauth1_service_h oauth1; + oauth2_service_h oauth2; + + GMutex mutex; + GCond cond; + int login; +} auth_plugin_s; +typedef struct _auth_plugin_s *auth_plugin_h; + +/** + * @brief Describes infromation about Auth Adaptor + */ typedef struct _auth_adaptor_s { - int i; + GList *plugins; // auth_plugin_h + + GMutex mutex; + int start; } auth_adaptor_s; -typedef struct auth_adaptor_s *auth_adaptor_h; +typedef struct _auth_adaptor_s *auth_adaptor_h; +/** + * @brief Describes infromation about Auth Adaptor Listener + */ typedef struct _auth_adaptor_listener_s { - int i; + void (*login_cb)(const char *uri, void *user_data); } auth_adaptor_listener_s; -typedef struct auth_adaptor_listener_s *auth_adaptor_listener_h; - -API auth_adaptor_h auth_adaptor_create(); -API service_adaptor_error_e auth_adaptor_destroy(auth_adaptor_h auth); -API service_adaptor_error_e auth_adaptor_start(auth_adaptor_h auth); -API service_adaptor_error_e auth_adaptor_stop(auth_adaptor_h auth); -API service_adaptor_error_e auth_adaptor_register_listener(auth_adaptor_h auth, auth_adaptor_listener_h listener); -API service_adaptor_error_e auth_adaptor_unregister_listener(auth_adaptor_h auth, auth_adaptor_listener_h listener); +typedef struct _auth_adaptor_listener_s *auth_adaptor_listener_h; + +auth_adaptor_h auth_adaptor_create(); +service_adaptor_error_e auth_adaptor_destroy(auth_adaptor_h auth); +service_adaptor_error_e auth_adaptor_start(auth_adaptor_h auth); +service_adaptor_error_e auth_adaptor_stop(auth_adaptor_h auth); +service_adaptor_error_e auth_adaptor_register_listener(auth_adaptor_h auth, auth_adaptor_listener_h listener); +service_adaptor_error_e auth_adaptor_unregister_listener(auth_adaptor_h auth, auth_adaptor_listener_h listener); +service_adaptor_error_e auth_adaptor_create_plugin(const char *uri, const char *name, const char *package, auth_plugin_h *plugin); +service_adaptor_error_e auth_adaptor_destroy_plugin(auth_plugin_h plugin); +service_adaptor_error_e auth_adaptor_register_plugin_service(auth_plugin_h plugin, GHashTable *service); +service_adaptor_error_e auth_adaptor_unregister_plugin_service(auth_plugin_h plugin); +service_adaptor_error_e auth_adaptor_add_plugin(auth_adaptor_h auth, auth_plugin_h plugin); +service_adaptor_error_e auth_adaptor_remove_plugin(auth_adaptor_h auth, auth_plugin_h plugin); +auth_plugin_h auth_adaptor_get_plugin(auth_adaptor_h auth, const char *uri); +char *auth_adaptor_get_uri(auth_adaptor_h auth, const char *package); +service_adaptor_error_e auth_adaptor_ref_plugin(auth_adaptor_h auth, const char *uri); +service_adaptor_error_e auth_adaptor_unref_plugin(auth_adaptor_h auth, const char *uri); /** * @} diff --git a/adaptor/auth-adaptor/oauth1_service.c b/adaptor/auth-adaptor/oauth1_service.c new file mode 100644 index 0000000..0ff7afc --- /dev/null +++ b/adaptor/auth-adaptor/oauth1_service.c @@ -0,0 +1,171 @@ +/* + * oAuth 1.0 Service + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include + +#include + +#include "oauth1_service.h" +#include "auth_adaptor.h" +#include "service_adaptor_errors.h" +#include "service_adaptor_internal.h" + +#include "sal_service_provider.h" +#include "sal_auth_provider.h" + +//****************************************************************************** +//* Global variables and defines +//****************************************************************************** + +typedef struct _app_control_user_data_s +{ + void *callback; + void *user_data; +} app_control_user_data_s; +typedef struct _app_control_user_data_s *app_control_user_data_h; + +typedef int (*_get_access_token)(void *plugin, oauth1_cb callback, void *user_data); +typedef int (*_get_extra_data)(void *plugin, const char *key, oauth1_cb callback, void *user_data); + +//****************************************************************************** +//* Private interface +//****************************************************************************** + +//****************************************************************************** +//* Private interface definition +//****************************************************************************** + +/** + * @brief callback of service plugin + * + * @return void. + */ +static void _oauth1_get_access_token_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data) +{ + SAL_FN_CALL; + + RET_IF(APP_CONTROL_RESULT_FAILED == result); + RET_IF(NULL == user_data); + + char *ret_str = NULL; + app_control_get_extra_data(reply, PLUGIN_RESULT_KEY, &ret_str); + + char *access_token = NULL; + app_control_get_extra_data(reply, OAUTH1_0_ACCESS_TOKEN_KEY, &access_token); + + app_control_user_data_h app_control_user_data = (app_control_user_data_h) user_data; + oauth1_cb callback = (oauth1_cb) app_control_user_data->callback; + + RET_IF(NULL == callback); + + // TODO: move this function for chaning result enum to general + int ret = SERVICE_ADAPTOR_ERROR_NONE; + + if (0 == strcmp(PLUGIN_RESULT_VALUE_FAILURE, ret_str)) + { + ret = SERVICE_ADAPTOR_ERROR_INTERNAL; + } + + oauth1_h oauth1 = (oauth1_h) g_malloc0(sizeof(oauth1_s)); + oauth1->access_token = strdup(access_token); + + callback(ret, oauth1, app_control_user_data->user_data); + + SAL_FN_END; +} + +static int _oauth1_get_access_token(auth_plugin_h plugin, oauth1_cb callback, void *user_data) +{ + SAL_FN_CALL; + + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + app_control_h request; + app_control_create(&request); + + app_control_set_app_id(request, plugin->uri); + app_control_set_operation(request, OAUTH1_0_GET_ACCESS_TOKEN_URI); + + app_control_user_data_h app_control_user_data = (app_control_user_data_h) g_malloc0(sizeof(app_control_user_data_s)); + app_control_user_data->callback = (void *) callback; + app_control_user_data->user_data = user_data; + + int res = app_control_send_launch_request(request, _oauth1_get_access_token_cb, app_control_user_data); + + if (APP_CONTROL_ERROR_NONE != res) + { + return SERVICE_ADAPTOR_ERROR_SYSTEM; + } + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +static int _oauth1_get_extra_data(auth_plugin_h plugin, const char *key, oauth1_cb callback, void *user_data) +{ + SAL_FN_CALL; + + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +//****************************************************************************** +//* Public interface definition +//****************************************************************************** + +API int oauth1_register_service(oauth1_service_h oauth1, GHashTable *service) +{ + SAL_FN_CALL; + + RETV_IF(NULL == oauth1, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + int ret = SERVICE_ADAPTOR_ERROR_NO_DATA; + GHashTableIter iter; + gpointer iter_key, iter_value; + + g_hash_table_iter_init(&iter, service); + while (g_hash_table_iter_next(&iter, &iter_key, &iter_value)) + { + if (0 == strcmp(iter_key, OAUTH1_0_GET_ACCESS_TOKEN_URI)) + { + oauth1->oauth1_get_access_token = (_get_access_token) _oauth1_get_access_token; + ret = SERVICE_ADAPTOR_ERROR_NONE; + } + else if (0 == strcmp(iter_key, OAUTH1_0_GET_EXTRA_DATA_URI)) + { + oauth1->oauth1_get_extra_data = (_get_extra_data) _oauth1_get_extra_data; + ret = SERVICE_ADAPTOR_ERROR_NONE; + } + } + + return ret; +} + +API int oauth1_unregister_service(oauth1_service_h oauth1) +{ + SAL_FN_CALL; + + RETV_IF(NULL == oauth1, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + oauth1->oauth1_get_access_token = NULL; + oauth1->oauth1_get_extra_data = NULL; + + return SERVICE_ADAPTOR_ERROR_NONE; +} diff --git a/adaptor/auth-adaptor/oauth1_service.h b/adaptor/auth-adaptor/oauth1_service.h new file mode 100644 index 0000000..f24bf64 --- /dev/null +++ b/adaptor/auth-adaptor/oauth1_service.h @@ -0,0 +1,104 @@ +/* + * oAuth 1.0 Service + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __OAUTH1_SERVICE_H__ +#define __OAUTH1_SERVICE_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include +#include + +/** + * @brief Describes infromation about oAuth1 Service + * @key name, ... + */ +typedef struct _oauth1_s +{ + char *access_token; + char *operation; +} oauth1_s; +typedef struct _oauth1_s *oauth1_h; + +/** +* @brief Callback for oauth1 API +* +* @param[in] access_token +* @param[in] user_data Passed data from #oauth1_get_access_token() +* @remarks +* @pre oauth1() will invoke this callback. +*/ +typedef void (*oauth1_cb)(int result, oauth1_h oauth1, void *user_data); + +/** + * @brief Describes infromation about oAuth 1.0 Service + * @key access token, ... + */ +typedef struct _oauth1_service_s +{ + int (*oauth1_get_access_token)(void *plugin, oauth1_cb callback, void *user_data); + int (*oauth1_get_extra_data)(void *plugin, const char *key, oauth1_cb callback, void *user_data); +} oauth1_service_s; +typedef struct _oauth1_service_s *oauth1_service_h; + +/*================================================================================================== + FUNCTION PROTOTYPES +==================================================================================================*/ + +/** +* @brief Register oAuth 1.0 Service +* @since_tizen 3.0 +* +* @param[in] oauth1 The oAuth 1.0 service handle +* @param[in] service +* @remarks +* @see oauth1_unregister_service() +* @return 0 on success, otherwise a negative error value +* @retval #SERVICE_ADAPTOR_ERROR_NONE Successful +* @retval #SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER Invalid parameter +* @retval #SERVICE_ADAPTOR_ERROR_UNKNOWN Unknown error +*/ +int oauth1_register_service(oauth1_service_h oauth1, GHashTable *service); + +/** +* @brief Unregister oAuth 1.0 Service +* @since_tizen 3.0 +* +* @param[in] oauth1 The oAuth 1.0 service handle +* @remarks +* @see oauth1_register_service() +* @return 0 on success, otherwise a negative error value +* @retval #SERVICE_ADAPTOR_ERROR_NONE Successful +* @retval #SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER Invalid parameter +* @retval #SERVICE_ADAPTOR_ERROR_UNKNOWN Unknown error +*/ +int oauth1_unregister_service(oauth1_service_h oauth1); + +#ifdef __cplusplus +} +#endif + +#endif /* __OAUTH1_SERVICE_H__ */ diff --git a/adaptor/auth-adaptor/oauth2_service.c b/adaptor/auth-adaptor/oauth2_service.c new file mode 100644 index 0000000..409089e --- /dev/null +++ b/adaptor/auth-adaptor/oauth2_service.c @@ -0,0 +1,114 @@ +/* + * oAuth 2.0 Service + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include + +#include + +#include "oauth2_service.h" +#include "auth_adaptor.h" +#include "service_adaptor_errors.h" +#include "service_adaptor_internal.h" + +#include "sal_auth_provider.h" + +//****************************************************************************** +//* Global variables and defines +//****************************************************************************** + +typedef struct _app_control_user_data_s +{ + void *callback; + void *user_data; +} app_control_user_data_s; +typedef struct _app_control_user_data_s *app_control_user_data_h; + +typedef int (*_get_access_token)(void *plugin, char **access_token, void *user_data); +typedef int (*_get_extra_data)(void *plugin, const char *key, char **value, void *user_data); + +//****************************************************************************** +//* Private interface +//****************************************************************************** + +//****************************************************************************** +//* Private interface definition +//****************************************************************************** + +static int _oauth2_get_access_token(auth_plugin_h plugin, char **access_token, void *user_data) +{ + SAL_FN_CALL; + + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +static int _oauth2_get_extra_data(auth_plugin_h plugin, const char *key, char **value, void *user_data) +{ + SAL_FN_CALL; + + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +//****************************************************************************** +//* Public interface definition +//****************************************************************************** + +API int oauth2_register_service(oauth2_service_h oauth2, GHashTable *service) +{ + SAL_FN_CALL; + + RETV_IF(NULL == oauth2, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + int ret = SERVICE_ADAPTOR_ERROR_NO_DATA; + GHashTableIter iter; + gpointer iter_key, iter_value; + + g_hash_table_iter_init(&iter, service); + while (g_hash_table_iter_next(&iter, &iter_key, &iter_value)) + { + if (0 == strcmp(iter_key, OAUTH2_0_GET_ACCESS_TOKEN_URI)) + { + oauth2->oauth2_get_access_token = (_get_access_token) _oauth2_get_access_token; + ret = SERVICE_ADAPTOR_ERROR_NONE; + } + else if (0 == strcmp(iter_key, OAUTH2_0_GET_EXTRA_DATA_URI)) + { + oauth2->oauth2_get_extra_data = (_get_extra_data) _oauth2_get_extra_data; + ret = SERVICE_ADAPTOR_ERROR_NONE; + } + } + + return ret; +} + +API int oauth2_unregister_service(oauth2_service_h oauth2) +{ + SAL_FN_CALL; + + RETV_IF(NULL == oauth2, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + oauth2->oauth2_get_access_token = NULL; + oauth2->oauth2_get_extra_data = NULL; + + return SERVICE_ADAPTOR_ERROR_NONE; +} diff --git a/adaptor/auth-adaptor/oauth2_service.h b/adaptor/auth-adaptor/oauth2_service.h new file mode 100644 index 0000000..201f807 --- /dev/null +++ b/adaptor/auth-adaptor/oauth2_service.h @@ -0,0 +1,103 @@ +/* + * oAuth 2.0 Service + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __OAUTH2_SERVICE_H__ +#define __OAUTH2_SERVICE_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include +#include + +/** +* @brief Callback for oauth2_get_access_token API +* +* @param[in] access_token +* @param[in] user_data Passed data from #oauth2_get_access_token() +* @remarks +* @pre oauth2_get_access_token() will invoke this callback. +*/ +typedef void (*oauth2_get_access_token_cb)(const char *access_token, void *user_data); + +/** +* @brief Callback for oauth2_get_extra_data API +* +* @param[in] value +* @param[in] user_data Passed data from #oauth2_get_access_token() +* @remarks +* @pre oauth2_get_extra_data() will invoke this callback. +*/ +typedef void (*oauth2_get_extra_data_cb)(const char *value, void *user_data); + +/** + * @brief Describes infromation about oAuth 2.0 Service + * @key access token, ... + */ +typedef struct _oauth2_service_s +{ + int (*oauth2_get_access_token)(void *plugin, char **access_token, void *user_data); + int (*oauth2_get_extra_data)(void *plugin, const char *key, char **value, void *user_data); +} oauth2_service_s; +typedef struct _oauth2_service_s *oauth2_service_h; + +/*================================================================================================== + FUNCTION PROTOTYPES +==================================================================================================*/ + +/** +* @brief Register oAuth 2.0 Service +* @since_tizen 3.0 +* +* @param[in] oauth2 The oAuth 2.0 service handle +* @param[in] service +* @remarks +* @see oauth2_unregister_service() +* @return 0 on success, otherwise a negative error value +* @retval #SERVICE_ADAPTOR_ERROR_NONE Successful +* @retval #SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER Invalid parameter +* @retval #SERVICE_ADAPTOR_ERROR_UNKNOWN Unknown error +*/ +int oauth2_register_service(oauth2_service_h oauth2, GHashTable *service); + +/** +* @brief Unregister oAuth 2.0 Service +* @since_tizen 3.0 +* +* @param[in] oauth2 The oAuth 2.0 service handle +* @remarks +* @see oauth2_register_service() +* @return 0 on success, otherwise a negative error value +* @retval #SERVICE_ADAPTOR_ERROR_NONE Successful +* @retval #SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER Invalid parameter +* @retval #SERVICE_ADAPTOR_ERROR_UNKNOWN Unknown error +*/ +int oauth2_unregister_service(oauth2_service_h oauth2); + +#ifdef __cplusplus +} +#endif + +#endif /* __OAUTH2_SERVICE_H__ */ diff --git a/adaptor/resource-adaptor/resource_adaptor.c b/adaptor/resource-adaptor/resource_adaptor.c new file mode 100644 index 0000000..78e7cca --- /dev/null +++ b/adaptor/resource-adaptor/resource_adaptor.c @@ -0,0 +1,58 @@ +/* + * Resource Adaptor + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include + +#include "resource_adaptor.h" +#include "service_adaptor_internal.h" + +API resource_adaptor_h resource_adaptor_create() +{ + resource_adaptor_h resource = (resource_adaptor_h) g_malloc0(sizeof(resource_adaptor_s)); + + return resource; +} + +API service_adaptor_error_e resource_adaptor_destroy(resource_adaptor_h resource) +{ + SAL_FREE(resource); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API service_adaptor_error_e resource_adaptor_start(resource_adaptor_h resource) +{ + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API service_adaptor_error_e resource_adaptor_stop(resource_adaptor_h resource) +{ + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API service_adaptor_error_e resource_adaptor_register_listener(resource_adaptor_h resource, resource_adaptor_listener_h listener) +{ + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API service_adaptor_error_e resource_adaptor_unregister_listener(resource_adaptor_h resource, resource_adaptor_listener_h listener) +{ + return SERVICE_ADAPTOR_ERROR_NONE; +} diff --git a/adaptor/resource-adaptor/resource_adaptor.h b/adaptor/resource-adaptor/resource_adaptor.h new file mode 100644 index 0000000..bb4081e --- /dev/null +++ b/adaptor/resource-adaptor/resource_adaptor.h @@ -0,0 +1,119 @@ +/* + * Resource Adaptor + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __RESOURCE_ADAPTOR_H__ +#define __RESOURCE_ADAPTOR_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include +#include + +#include "service_adaptor_errors.h" + +/** + * @file resource_adaptor.h + */ + +/** + * @ingroup + * @defgroup + * + * @brief + * + * @section + * \#include + * + *
+ * @{ + */ + +/** + * @brief Handle of Resource Plugin + */ +typedef struct resource_plugin_s *resource_plugin_h; + +/** + * @brief Describes infromation about SmartThings Service + * @key access token, ... + */ + typedef struct _resource_plugin_smartthings_service_s + { + int (*smartthings_get_resource)(resource_plugin_h plugin, char **resource_uri, void *user_data); + } resource_plugin_smartthings_service_s; + typedef struct resource_plugin_smartthings_service_s *resource_plugin_smartthings_service_h; + +/** + * @brief Describes infromation about Resource Plugin + */ +typedef struct _resource_plugin_s +{ + char *uri; + char *name; + + resource_plugin_smartthings_service_h smartthings; + + GMutex mutex; + int start; +} resource_plugin_s; + +/** + * @brief Describes infromation about Resource Adaptor + */ +typedef struct _resource_adaptor_s +{ + GList *plugins; // resource_plugin_h + + GMutex mutex; + int start; +} resource_adaptor_s; +typedef struct resource_adaptor_s *resource_adaptor_h; + +/** + * @brief Describes infromation about Resource Adaptor Listener + */ +typedef struct _resource_adaptor_listener_s +{ + void (*login_cb)(char *uri, void *user_data); +} resource_adaptor_listener_s; +typedef struct resource_adaptor_listener_s *resource_adaptor_listener_h; + +resource_adaptor_h resource_adaptor_create(); +service_adaptor_error_e resource_adaptor_destroy(resource_adaptor_h resource); +service_adaptor_error_e resource_adaptor_start(resource_adaptor_h resource); +service_adaptor_error_e resource_adaptor_stop(resource_adaptor_h resource); +service_adaptor_error_e resource_adaptor_register_listener(resource_adaptor_h resource, resource_adaptor_listener_h listener); +service_adaptor_error_e resource_adaptor_unregister_listener(resource_adaptor_h resource, resource_adaptor_listener_h listener); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __RESOURCE_ADAPTOR_H__ */ diff --git a/adaptor/storage-adaptor/cloud_service.c b/adaptor/storage-adaptor/cloud_service.c new file mode 100644 index 0000000..1f86904 --- /dev/null +++ b/adaptor/storage-adaptor/cloud_service.c @@ -0,0 +1,205 @@ +/* + * Storage Adaptor + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include +#include +#include + +#include + +#include "cloud_service.h" +#include "storage_adaptor.h" +#include "service_adaptor_errors.h" +#include "service_adaptor_internal.h" + +#include "sal_service_provider.h" +#include "sal_storage_provider.h" + +//****************************************************************************** +//* Global variables and defines +//****************************************************************************** + +typedef struct _app_control_user_data_s +{ + cloud_file_h file; + + void *callback; + void *user_data; +} app_control_user_data_s; +typedef struct _app_control_user_data_s *app_control_user_data_h; + +typedef int (*_remove_file)(void *plugin, const char *cloud_path, cloud_file_cb callback, void *user_data); + +//****************************************************************************** +//* Private interface +//****************************************************************************** + +//****************************************************************************** +//* Private interface definition +//****************************************************************************** + +int _make_cloud_file_by_local(const char *local_path, cloud_file_h *file) +{ + SAL_FN_CALL; + + RETV_IF(NULL == local_path, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + struct stat file_info; + RETV_IF(0 != stat(local_path, &file_info), SERVICE_ADAPTOR_ERROR_INTERNAL); + + char *path_tmp = strdup(local_path); + char *dir_path = dirname(path_tmp); + + cloud_file_h cloud_file = (cloud_file_h) g_malloc0(sizeof(cloud_file_s)); + cloud_file->dir_path = dir_path; + cloud_file->local_path = strdup(local_path); + cloud_file->cloud_path = NULL; + cloud_file->size = file_info.st_size; + + if(S_ISDIR(file_info.st_mode)) + { + cloud_file->is_dir = true; + } + + *file = cloud_file; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +int _make_cloud_file_by_cloud(const char *cloud_path, cloud_file_h *file) +{ + SAL_FN_CALL; + + RETV_IF(NULL == cloud_path, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + cloud_file_h cloud_file = (cloud_file_h) g_malloc0(sizeof(cloud_file_s)); + cloud_file->cloud_path = strdup(cloud_path); + + *file = cloud_file; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +/** + * @brief callback of service plugin + * + * @return void. + */ +static void _cloud_remove_file_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data) +{ + SAL_FN_CALL; + + RET_IF(APP_CONTROL_RESULT_FAILED == result); + RET_IF(NULL == user_data); + + char *ret_str = NULL; + app_control_get_extra_data(reply, PLUGIN_RESULT_KEY, &ret_str); + + app_control_user_data_h app_control_user_data = (app_control_user_data_h) user_data; + cloud_file_cb callback = (cloud_file_cb) app_control_user_data->callback; + + RET_IF(NULL == callback); + + // TODO: move this function for chaning result enum to general + int ret = SERVICE_ADAPTOR_ERROR_NONE; + + if (0 == strcmp(PLUGIN_RESULT_VALUE_FAILURE, ret_str)) + { + ret = SERVICE_ADAPTOR_ERROR_INTERNAL; + } + + callback(ret, app_control_user_data->file, app_control_user_data->user_data); + + SAL_FN_END; +} + +static int _cloud_remove_file(storage_plugin_h plugin, const char *cloud_path, cloud_file_cb callback, void *user_data) +{ + SAL_FN_CALL; + + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == cloud_path, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + app_control_h request; + app_control_create(&request); + + app_control_set_app_id(request, plugin->uri); + app_control_set_operation(request, CLOUD_REMOVE_FILE_URI); + + app_control_add_extra_data(request, CLOUD_CLOUD_PATH_KEY, cloud_path); + + cloud_file_h file = NULL; + _make_cloud_file_by_cloud(cloud_path, &file); + file->operation = strdup(CLOUD_REMOVE_FILE_URI); + + app_control_user_data_h app_control_user_data = (app_control_user_data_h) g_malloc0(sizeof(app_control_user_data_s)); + app_control_user_data->file = file; + app_control_user_data->callback = (void *) callback; + app_control_user_data->user_data = user_data; + + int res = app_control_send_launch_request(request, _cloud_remove_file_cb, app_control_user_data); + + if (APP_CONTROL_ERROR_NONE != res) + { + return SERVICE_ADAPTOR_ERROR_SYSTEM; + } + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +//****************************************************************************** +//* Public interface definition +//****************************************************************************** + +API int cloud_register_service(cloud_service_h cloud, GHashTable *service) +{ + SAL_FN_CALL; + + RETV_IF(NULL == cloud, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + int ret = SERVICE_ADAPTOR_ERROR_NO_DATA; + GHashTableIter iter; + gpointer iter_key, iter_value; + + g_hash_table_iter_init(&iter, service); + while (g_hash_table_iter_next(&iter, &iter_key, &iter_value)) + { + if (0 == strcmp(iter_key, CLOUD_REMOVE_FILE_URI)) + { + cloud->cloud_remove_file = (_remove_file) _cloud_remove_file; + ret = SERVICE_ADAPTOR_ERROR_NONE; + } + } + + return ret; +} + +API int cloud_unregister_service(cloud_service_h cloud) +{ + SAL_FN_CALL; + + RETV_IF(NULL == cloud, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + cloud->cloud_remove_file = NULL; + + return SERVICE_ADAPTOR_ERROR_NONE; +} diff --git a/adaptor/storage-adaptor/cloud_service.h b/adaptor/storage-adaptor/cloud_service.h new file mode 100644 index 0000000..731cfc7 --- /dev/null +++ b/adaptor/storage-adaptor/cloud_service.h @@ -0,0 +1,114 @@ +/* + * Cloud Service + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __CLOUD_SERVICE_H__ +#define __CLOUD_SERVICE_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include + +/** + * @brief Describes infromation about Cloud Service + * @key name, ... + */ +typedef struct _cloud_file_s +{ + bool is_dir; + char *dir_path; + char *local_path; + char *cloud_path; + unsigned long long size; + char *operation; + + GList *files; +} cloud_file_s; +typedef struct _cloud_file_s *cloud_file_h; + +/** +* @brief Callback for Cloud File Operation API +* +* @param[in] plugin +* @param[in] path +* @param[in] callback +* @param[in] user_data Passed data from #oauth1_get_access_token() +* @remarks +* @pre cloud_remove_file() will invoke this callback. +*/ +typedef void (*cloud_file_cb)(int result, cloud_file_h cloud_file, void *user_data); + +/** + * @brief Describes infromation about Cloud Service + * @key name, ... + */ +typedef struct _cloud_service_s +{ + int (*cloud_remove_file)(void *plugin, const char *cloud_path, cloud_file_cb callback, void *user_data); + int (*cloud_download_file)(void *plugin, const char *cloud_path, const char *local_path, cloud_file_cb callback, void *user_data); + int (*cloud_upload_file)(void *plugin, const char *local_path, const char *cloud_path, cloud_file_cb callback, void *user_data); + int (*cloud_download_file_thumbnail)(void *plugin, const char *cloud_path, const char *local_path, cloud_file_cb callback, void *user_data); + int (*cloud_get_file_list)(void *plugin, const char *cloud_path, const char *local_path, cloud_file_cb callback, void *user_data); +} cloud_service_s; +typedef struct _cloud_service_s *cloud_service_h; + +/*================================================================================================== + FUNCTION PROTOTYPES +==================================================================================================*/ + +/** +* @brief Register Cloud Service +* @since_tizen 3.0 +* +* @param[in] cloud The Cloud service handle +* @param[in] service +* @remarks +* @see cloud_unregister_service() +* @return 0 on success, otherwise a negative error value +* @retval #SERVICE_ADAPTOR_ERROR_NONE Successful +* @retval #SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER Invalid parameter +* @retval #SERVICE_ADAPTOR_ERROR_UNKNOWN Unknown error +*/ +int cloud_register_service(cloud_service_h cloud, GHashTable *service); + +/** +* @brief Unregister Cloud Service +* @since_tizen 3.0 +* +* @param[in] cloud The Cloud service handle +* @remarks +* @see cloud_register_service() +* @return 0 on success, otherwise a negative error value +* @retval #SERVICE_ADAPTOR_ERROR_NONE Successful +* @retval #SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER Invalid parameter +* @retval #SERVICE_ADAPTOR_ERROR_UNKNOWN Unknown error +*/ +int cloud_unregister_service(cloud_service_h cloud); + +#ifdef __cplusplus +} +#endif + +#endif /* __CLOUD_SERVICE_H__ */ diff --git a/adaptor/storage-adaptor/posix_service.h b/adaptor/storage-adaptor/posix_service.h new file mode 100644 index 0000000..880292b --- /dev/null +++ b/adaptor/storage-adaptor/posix_service.h @@ -0,0 +1,103 @@ +/* + * POSIX Service + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __POSIX_SERVICE_H__ +#define __POSIX_SERVICE_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include + +/** + * @brief Describes infromation about Cloud Service + * @key name, ... + */ +typedef struct _posix_service_s +{ + int (*posix_open_service)(void *plugin, + const char *path, + int flags, + void *user_data); + + int (*posix_read_service)(void *plugin, + const char *path, + char **buf, + size_t size, + off_t offset, + void *user_data); + + int (*posix_write_service)(void *plugin, + const char *path, + const char *buf, + size_t size, + off_t offset, + void *user_data); + + int (*posix_close_service)(void *plugin, + const char *path, + int flags, + void *user_data); +} posix_service_s; +typedef struct _posix_service_s *posix_service_h; + +/*================================================================================================== + FUNCTION PROTOTYPES +==================================================================================================*/ + +/** +* @brief Register Posix Service +* @since_tizen 3.0 +* +* @param[in] cloud The Cloud service handle +* @param[in] service +* @remarks +* @see cloud_unregister_service() +* @return 0 on success, otherwise a negative error value +* @retval #SERVICE_ADAPTOR_ERROR_NONE Successful +* @retval #SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER Invalid parameter +* @retval #SERVICE_ADAPTOR_ERROR_UNKNOWN Unknown error +*/ +int posix_register_service(posix_service_h posix, GHashTable *service); + +/** +* @brief Unregister Cloud Service +* @since_tizen 3.0 +* +* @param[in] cloud The Cloud service handle +* @remarks +* @see cloud_register_service() +* @return 0 on success, otherwise a negative error value +* @retval #SERVICE_ADAPTOR_ERROR_NONE Successful +* @retval #SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER Invalid parameter +* @retval #SERVICE_ADAPTOR_ERROR_UNKNOWN Unknown error +*/ +int posix_unregister_service(posix_service_h posix); + +#ifdef __cplusplus +} +#endif + +#endif /* __POSIX_SERVICE_H__ */ diff --git a/adaptor/storage-adaptor/storage_adaptor.c b/adaptor/storage-adaptor/storage_adaptor.c index 2244d3d..5321fa0 100644 --- a/adaptor/storage-adaptor/storage_adaptor.c +++ b/adaptor/storage-adaptor/storage_adaptor.c @@ -1,39 +1,362 @@ +/* + * Storage Adaptor + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + #include #include #include "storage_adaptor.h" #include "service_adaptor_internal.h" -storage_adaptor_h storage_adaptor_create() +//****************************************************************************** +//* Global variables and defines +//****************************************************************************** + +//****************************************************************************** +//* Private interface +//****************************************************************************** + +//****************************************************************************** +//* Private interface definition +//****************************************************************************** + +static void _storage_adaptor_free_plugin(storage_plugin_h plugin) +{ +} + +//****************************************************************************** +//* Public interface definition +//****************************************************************************** + +API storage_adaptor_h storage_adaptor_create() { - storage_adaptor_h storage = (storage_adaptor_h) g_malloc0(sizeof(storage_adaptor_s)); + SAL_FN_CALL; + + storage_adaptor_h storage = (storage_adaptor_h) g_malloc0(sizeof(storage_adaptor_s)); + + g_mutex_init(&storage->mutex); return storage; } -service_adaptor_error_e storage_adaptor_destroy(storage_adaptor_h storage) +API service_adaptor_error_e storage_adaptor_destroy(storage_adaptor_h storage) { - SAL_FREE(storage); + SAL_FN_CALL; + + RETV_IF(NULL == storage, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + g_mutex_lock(&storage->mutex); + + if (0 != storage->start) + { + storage_adaptor_stop(storage); + } + + SAL_FREE(storage); + + g_mutex_unlock(&storage->mutex); return SERVICE_ADAPTOR_ERROR_NONE; } -service_adaptor_error_e storage_adaptor_start(storage_adaptor_h storage) +API service_adaptor_error_e storage_adaptor_start(storage_adaptor_h storage) { + SAL_FN_CALL; + + RETV_IF(NULL == storage, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + g_mutex_lock(&storage->mutex); + + storage->start = 1; + + g_mutex_unlock(&storage->mutex); + return SERVICE_ADAPTOR_ERROR_NONE; } -service_adaptor_error_e storage_adaptor_stop(storage_adaptor_h storage) +API service_adaptor_error_e storage_adaptor_stop(storage_adaptor_h storage) { + SAL_FN_CALL; + + RETV_IF(NULL == storage, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + // TODO: notify storage adaptor stop to each plugin + + g_mutex_lock(&storage->mutex); + + storage->start = 0; + + g_mutex_unlock(&storage->mutex); + return SERVICE_ADAPTOR_ERROR_NONE; } -service_adaptor_error_e storage_adaptor_register_listener(storage_adaptor_h storage, storage_adaptor_listener_h listener) +API service_adaptor_error_e storage_adaptor_register_listener(storage_adaptor_h storage, storage_adaptor_listener_h listener) { + SAL_FN_CALL; + + RETV_IF(NULL == storage, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == listener, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + // TODO: register insert/ update/ delete callback for service-adaptor + return SERVICE_ADAPTOR_ERROR_NONE; } -service_adaptor_error_e storage_adaptor_unregister_listener(storage_adaptor_h storage, storage_adaptor_listener_h listener) +API service_adaptor_error_e storage_adaptor_unregister_listener(storage_adaptor_h storage, storage_adaptor_listener_h listener) { + SAL_FN_CALL; + + RETV_IF(NULL == storage, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == listener, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + // TODO: unregister insert/ update/ delete callback for service-adaptor + return SERVICE_ADAPTOR_ERROR_NONE; } + +API service_adaptor_error_e storage_adaptor_create_plugin(const char *uri, const char *name, const char *package, storage_plugin_h *plugin) +{ + SAL_FN_CALL; + + RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == name, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == package, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + storage_plugin_h storage_plugin = (storage_plugin_h) g_malloc0(sizeof(storage_plugin_s)); + storage_plugin->uri = strdup(uri); + storage_plugin->name = strdup(name); + storage_plugin->package = strdup(package); + + g_mutex_init(&storage_plugin->mutex); + g_cond_init(&storage_plugin->cond); + + *plugin = storage_plugin; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API service_adaptor_error_e storage_adaptor_destroy_plugin(storage_plugin_h plugin) +{ + SAL_FN_CALL; + + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + SAL_FREE(plugin->uri); + SAL_FREE(plugin->name); + SAL_FREE(plugin); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API service_adaptor_error_e storage_adaptor_register_plugin_service(storage_plugin_h plugin, GHashTable *service) +{ + SAL_FN_CALL; + + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == service, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + int ret = SERVICE_ADAPTOR_ERROR_NONE; + + plugin->cloud = (cloud_service_h) g_malloc0(sizeof(cloud_service_s)); + ret = cloud_register_service(plugin->cloud, service); + + if (SERVICE_ADAPTOR_ERROR_NONE != ret) + { + SAL_INFO("could not find the function for cloud"); + SAL_FREE(plugin->cloud); + } +/* + plugin->posix = (posix_service_h) g_malloc0(sizeof(posix_service_s)); + ret = posix_register_service(plugin->posix, service); + + if (SERVICE_ADAPTOR_ERROR_NONE != ret) + { + SAL_INFO("could not find the function for posix"); + SAL_FREE(plugin->posix); + } +*/ + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API service_adaptor_error_e storage_adaptor_unregister_plugin_service(storage_plugin_h plugin) +{ + SAL_FN_CALL; + + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + if (NULL != plugin->cloud) + { + cloud_unregister_service(plugin->cloud); + SAL_FREE(plugin->cloud); + } +/* + if (NULL != plugin->posix) + { + posix_unregister_service(plugin->posix); + SAL_FREE(plugin->posix); + } +*/ + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API service_adaptor_error_e storage_adaptor_add_plugin(storage_adaptor_h storage, storage_plugin_h plugin) +{ + SAL_FN_CALL; + + RETV_IF(NULL == storage, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + g_mutex_lock(&storage->mutex); + + storage->plugins = g_list_append(storage->plugins, plugin); + + g_mutex_unlock(&storage->mutex); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API service_adaptor_error_e storage_adaptor_remove_plugin(storage_adaptor_h storage, storage_plugin_h plugin) +{ + SAL_FN_CALL; + + RETV_IF(NULL == storage, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + g_mutex_lock(&storage->mutex); + + RETV_IF(NULL == g_list_find(storage->plugins, plugin), SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + storage->plugins = g_list_remove(storage->plugins, plugin); + + _storage_adaptor_free_plugin(plugin); + + g_mutex_unlock(&storage->mutex); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API storage_plugin_h storage_adaptor_get_plugin(storage_adaptor_h storage, const char *uri) +{ + SAL_FN_CALL; + + RETV_IF(NULL == storage, NULL); + RETV_IF(NULL == uri, NULL); + + g_mutex_lock(&storage->mutex); + + storage_plugin_h plugin = NULL; + + for (GList *list = g_list_first(storage->plugins); list != NULL; list = list->next) + { + storage_plugin_h this = (storage_plugin_h) list->data; + + if (0 == strcmp(this->uri, uri)) + { + plugin = this; + break; + } + } + + g_mutex_unlock(&storage->mutex); + + return plugin; +} + +API char *storage_adaptor_get_uri(storage_adaptor_h storage, const char *package) +{ + SAL_FN_CALL; + + RETV_IF(NULL == storage, NULL); + RETV_IF(NULL == package, NULL); + + g_mutex_lock(&storage->mutex); + + char *uri = NULL; + + for (GList *list = g_list_first(storage->plugins); list != NULL; list = list->next) + { + storage_plugin_h this = (storage_plugin_h) list->data; + + if (0 == strcmp(this->package, package)) + { + uri = this->uri; + break; + } + } + + g_mutex_unlock(&storage->mutex); + + return uri; +} + +API service_adaptor_error_e storage_adaptor_ref_plugin(storage_adaptor_h storage, const char *uri) +{ + SAL_FN_CALL; + + RETV_IF(NULL == storage, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + g_mutex_lock(&storage->mutex); + + int ret = SERVICE_ADAPTOR_ERROR_NO_DATA; + + for (GList *list = g_list_first(storage->plugins); list != NULL; list = list->next) + { + storage_plugin_h this = (storage_plugin_h) list->data; + + if (0 == strcmp(this->uri, uri)) + { + ret = SERVICE_ADAPTOR_ERROR_NONE; + // TODO: increase ref count + break; + } + } + + g_mutex_unlock(&storage->mutex); + + return ret; +} + +API service_adaptor_error_e storage_adaptor_unref_plugin(storage_adaptor_h storage, const char *uri) +{ + SAL_FN_CALL; + + RETV_IF(NULL == storage, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + g_mutex_lock(&storage->mutex); + + int ret = SERVICE_ADAPTOR_ERROR_NO_DATA; + + for (GList *list = g_list_first(storage->plugins); list != NULL; list = list->next) + { + storage_plugin_h this = (storage_plugin_h) list->data; + + if (0 == strcmp(this->uri, uri)) + { + ret = SERVICE_ADAPTOR_ERROR_NONE; + // TODO: decrease ref count + break; + } + } + + g_mutex_unlock(&storage->mutex); + + return ret; +} diff --git a/adaptor/storage-adaptor/storage_adaptor.h b/adaptor/storage-adaptor/storage_adaptor.h index 5b52a87..fa08897 100644 --- a/adaptor/storage-adaptor/storage_adaptor.h +++ b/adaptor/storage-adaptor/storage_adaptor.h @@ -1,5 +1,5 @@ /* - * Auth Adaptor + * Storage Adaptor * * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. * @@ -30,7 +30,11 @@ extern "C" #endif #include +#include + #include "service_adaptor_errors.h" +#include "cloud_service.h" +//#include "posix_service.h" /** * @file storage_adaptor.h @@ -49,24 +53,73 @@ extern "C" * @{ */ +#define URI_STORAGE "storage" +#define URI_CLOUD "storage/cloud" +#define URI_POSIX "storage/posix" + +/** + * @brief Describes infromation about Storage Spec + */ +typedef enum _storage_spec_e +{ + STORAGE_SPEC_CLOUD = (1 << 0), + STORAGE_SPEC_POSIX = (1 << 1), +} storage_spec_e; + +/** + * @brief Describes infromation about Storage Plugin + */ +typedef struct _storage_plugin_s +{ + char *uri; + char *name; + char *package; + + cloud_service_h cloud; +// posix_service_h posix; + + GMutex mutex; + GCond cond; +} storage_plugin_s; +typedef struct _storage_plugin_s *storage_plugin_h; + +/** + * @brief Describes infromation about Storage Adaptor + */ typedef struct _storage_adaptor_s { - int i; + GList *plugins; // storage_plugin_h + + GMutex mutex; + int start; } storage_adaptor_s; typedef struct _storage_adaptor_s *storage_adaptor_h; +/** + * @brief Describes infromation about Storage Adaptor Listener + */ typedef struct _storage_adaptor_listener_s { - int i; + void (*create_file_cb)(const char *uri, const char *path, void *user_data); } storage_adaptor_listener_s; typedef struct _storage_adaptor_listener_s *storage_adaptor_listener_h; -API storage_adaptor_h storage_adaptor_create(); -API service_adaptor_error_e storage_adaptor_destroy(storage_adaptor_h storage); -API service_adaptor_error_e storage_adaptor_start(storage_adaptor_h storage); -API service_adaptor_error_e storage_adaptor_stop(storage_adaptor_h storage); -API service_adaptor_error_e storage_adaptor_register_listener(storage_adaptor_h storage, storage_adaptor_listener_h listener); -API service_adaptor_error_e storage_adaptor_unregister_listener(storage_adaptor_h storage, storage_adaptor_listener_h listener); +storage_adaptor_h storage_adaptor_create(); +service_adaptor_error_e storage_adaptor_destroy(storage_adaptor_h storage); +service_adaptor_error_e storage_adaptor_start(storage_adaptor_h storage); +service_adaptor_error_e storage_adaptor_stop(storage_adaptor_h storage); +service_adaptor_error_e storage_adaptor_register_listener(storage_adaptor_h storage, storage_adaptor_listener_h listener); +service_adaptor_error_e storage_adaptor_unregister_listener(storage_adaptor_h storage, storage_adaptor_listener_h listener); +service_adaptor_error_e storage_adaptor_create_plugin(const char *uri, const char *name, const char *package, storage_plugin_h *plugin); +service_adaptor_error_e storage_adaptor_destroy_plugin(storage_plugin_h plugin); +service_adaptor_error_e storage_adaptor_register_plugin_service(storage_plugin_h plugin, GHashTable *service); +service_adaptor_error_e storage_adaptor_unregister_plugin_service(storage_plugin_h plugin); +service_adaptor_error_e storage_adaptor_add_plugin(storage_adaptor_h storage, storage_plugin_h plugin); +service_adaptor_error_e storage_adaptor_remove_plugin(storage_adaptor_h storage, storage_plugin_h plugin); +storage_plugin_h storage_adaptor_get_plugin(storage_adaptor_h storage, const char *uri); +char *storage_adaptor_get_uri(storage_adaptor_h storage, const char *package); +service_adaptor_error_e storage_adaptor_ref_plugin(storage_adaptor_h storage, const char *uri); +service_adaptor_error_e storage_adaptor_unref_plugin(storage_adaptor_h storage, const char *uri); /** * @} diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index b421dab..59925a8 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -15,19 +15,25 @@ SET(VISIBILITY "-DEXPORT_API=\"__attribute__((visibility(\\\"default\\\")))\"") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${VISIBILITY} -fvisibility=hidden") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,--gc-sections") +ADD_DEFINITIONS("-DSERVICE_ADAPTOR_DEBUGGING") +ADD_DEFINITIONS("-D_SERVICE_ADAPTOR_IPC_CLIENT") + ########################################################## # Define Service Adaptor CLIENT ########################################################## -SET(CLIENT-LIB "sal-client") -SET(CLIENT-SRCS - ${CMAKE_SOURCE_DIR}/client/sal_core_api.c +SET(ADAPTOR-CLIENT-LIB "service-adaptor") +SET(ADAPTOR-CLIENT-SRCS + ${CMAKE_SOURCE_DIR}/client/sal_service_adaptor.c + ${CMAKE_SOURCE_DIR}/client/sal_service_task.c + ${CMAKE_SOURCE_DIR}/client/sal_service_auth.c + ${CMAKE_SOURCE_DIR}/client/sal_service_storage.c ) INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/common - ${CMAKE_SOURCE_DIR}/common/ipc + ${CMAKE_SOURCE_DIR}/common/ipc-client ${CMAKE_SOURCE_DIR}/client ${CMAKE_SOURCE_DIR}/adaptor/auth-adaptor ${CMAKE_SOURCE_DIR}/adaptor/contact-adaptor @@ -35,29 +41,83 @@ INCLUDE_DIRECTORIES( ) INCLUDE(FindPkgConfig) -pkg_check_modules(client_pkgs REQUIRED dlog glib-2.0) +pkg_check_modules(adaptor_client_pkgs REQUIRED dlog glib-2.0 capi-appfw-application) -FOREACH(flag ${client_pkgs_CFLAGS}) +FOREACH(flag ${adaptor_client_pkgs_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") ENDFOREACH(flag) -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") - +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -std=gnu99") SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed") -ADD_LIBRARY(${CLIENT-LIB} SHARED ${CLIENT-SRCS}) +ADD_LIBRARY(${ADAPTOR-CLIENT-LIB} SHARED ${ADAPTOR-CLIENT-SRCS}) -TARGET_LINK_LIBRARIES(${CLIENT-LIB} ${client_pkgs_LDFLAGS} sal-common) -SET_TARGET_PROPERTIES(${CLIENT-LIB} PROPERTIES SOVERSION ${VERSION_MAJOR}) -SET_TARGET_PROPERTIES(${CLIENT-LIB} PROPERTIES VERSION ${VERSION}) +TARGET_LINK_LIBRARIES(${ADAPTOR-CLIENT-LIB} ${adaptor_client_pkgs_LDFLAGS} sal-common-client) +SET_TARGET_PROPERTIES(${ADAPTOR-CLIENT-LIB} PROPERTIES SOVERSION ${VERSION_MAJOR}) +SET_TARGET_PROPERTIES(${ADAPTOR-CLIENT-LIB} PROPERTIES VERSION ${VERSION}) -INSTALL(TARGETS ${CLIENT-LIB} DESTINATION lib COMPONENT RuntimeLibraries) +INSTALL(TARGETS ${ADAPTOR-CLIENT-LIB} DESTINATION lib COMPONENT RuntimeLibraries) -SET(SAL-CLIENT-HEADERS +SET(SAL-ADAPTOR-CLIENT-HEADERS ${CMAKE_SOURCE_DIR}/include/service_adaptor.h ${CMAKE_SOURCE_DIR}/include/service_adaptor_types.h ${CMAKE_SOURCE_DIR}/include/service_adaptor_errors.h ${CMAKE_SOURCE_DIR}/include/service_adaptor_internal.h + ${CMAKE_SOURCE_DIR}/client/sal_service_adaptor.h + ${CMAKE_SOURCE_DIR}/client/sal_service_task.h + ${CMAKE_SOURCE_DIR}/client/sal_service_auth.h + ${CMAKE_SOURCE_DIR}/client/sal_service_storage.h + ${CMAKE_SOURCE_DIR}/common/sal_ipc.h + ${CMAKE_SOURCE_DIR}/common/ipc-client/sal_ipc_client.h + ${CMAKE_SOURCE_DIR}/common/ipc-client/sal_ipc_client_core.h + ${CMAKE_SOURCE_DIR}/common/ipc-client/sal_ipc_client_auth.h + ${CMAKE_SOURCE_DIR}/common/ipc-client/sal_ipc_client_storage.h +) + +INSTALL(FILES ${SAL-ADAPTOR-CLIENT-HEADERS} DESTINATION include/service-adaptor) + +########################################################## +# Define Service Provider CLIENT +########################################################## + +SET(PLUGIN-CLIENT-LIB "service-provider") +SET(PLUGIN-CLIENT-SRCS + ${CMAKE_SOURCE_DIR}/client/sal_service_provider.c + ${CMAKE_SOURCE_DIR}/client/sal_auth_provider.c + ${CMAKE_SOURCE_DIR}/client/sal_storage_provider.c +) + +INCLUDE_DIRECTORIES( + ${CMAKE_SOURCE_DIR}/include + ${CMAKE_SOURCE_DIR}/client + ${CMAKE_SOURCE_DIR}/adaptor/auth-adaptor + ${CMAKE_SOURCE_DIR}/adaptor/contact-adaptor + ${CMAKE_SOURCE_DIR}/adaptor/storage-adaptor +) + +INCLUDE(FindPkgConfig) +pkg_check_modules(plugin_client_pkgs REQUIRED dlog glib-2.0 capi-appfw-application) + +FOREACH(flag ${plugin_client_pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -std=gnu99") +SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed") + +ADD_LIBRARY(${PLUGIN-CLIENT-LIB} SHARED ${PLUGIN-CLIENT-SRCS}) + +TARGET_LINK_LIBRARIES(${PLUGIN-CLIENT-LIB} ${plugin_client_pkgs_LDFLAGS}) +SET_TARGET_PROPERTIES(${PLUGIN-CLIENT-LIB} PROPERTIES SOVERSION ${VERSION_MAJOR}) +SET_TARGET_PROPERTIES(${PLUGIN-CLIENT-LIB} PROPERTIES VERSION ${VERSION}) + +INSTALL(TARGETS ${PLUGIN-CLIENT-LIB} DESTINATION lib COMPONENT RuntimeLibraries) + +SET(SAL-PLUGIN-CLIENT-HEADERS + ${CMAKE_SOURCE_DIR}/include/service_provider.h + ${CMAKE_SOURCE_DIR}/client/sal_service_provider.h + ${CMAKE_SOURCE_DIR}/client/sal_auth_provider.h + ${CMAKE_SOURCE_DIR}/client/sal_storage_provider.h ) -INSTALL(FILES ${SAL-CLIENT-HEADERS} DESTINATION include/service-adaptor) +INSTALL(FILES ${SAL-PLUGIN-CLIENT-HEADERS} DESTINATION include/service-provider) diff --git a/client/sal_auth_provider.c b/client/sal_auth_provider.c new file mode 100644 index 0000000..f1cccbd --- /dev/null +++ b/client/sal_auth_provider.c @@ -0,0 +1,109 @@ +/* + * Auth Plugin Client + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include + +#include + +#include "service_adaptor_errors.h" +#include "service_adaptor_internal.h" +#include "sal_service_provider.h" +#include "sal_auth_provider.h" + +API int auth_provider_create(auth_provider_h *provider) +{ + SAL_FN_CALL; + + auth_provider_h auth_provider = (auth_provider_h) g_malloc0(sizeof(auth_provider_s)); + + auth_provider->oauth1_get_access_token = NULL; + auth_provider->oauth1_get_extra_data = NULL; + + auth_provider->oauth2_get_access_token = NULL; + auth_provider->oauth2_get_extra_data = NULL; + + *provider = auth_provider; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API app_control_h auth_provider_message(auth_provider_h provider, const char *operation, void *user_data) +{ + SAL_FN_CALL; + + app_control_h reply = NULL; + + RETV_IF(NULL == provider, reply); + + int ret = SERVICE_ADAPTOR_ERROR_NONE; + + if (0 == strcmp(operation, OAUTH1_0_GET_ACCESS_TOKEN_URI)) + { + app_control_create(&reply); + + char *access_token = NULL; + ret = provider->oauth1_get_access_token(&access_token); + + if (SERVICE_ADAPTOR_ERROR_NONE != ret) + { + SAL_ERR("oauth1_get_access_token() Fail (%d)", ret); + app_control_add_extra_data(reply, PLUGIN_RESULT_KEY, PLUGIN_RESULT_VALUE_FAILURE); + return reply; + } + + app_control_add_extra_data(reply, PLUGIN_RESULT_KEY, PLUGIN_RESULT_VALUE_SUCCESS); + app_control_add_extra_data(reply, OAUTH1_0_ACCESS_TOKEN_KEY, access_token); + } + + return reply; +} + +API int auth_provider_add_extra_data(auth_provider_h provider, app_control_h reply) +{ + SAL_FN_CALL; + + RETV_IF(NULL == provider, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == reply, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + app_control_add_extra_data(reply, PLUGIN_KEY_AUTH, PLUGIN_VALUE_TRUE); + + if (NULL != provider->oauth1_get_access_token) + { + app_control_add_extra_data(reply, OAUTH1_0_GET_ACCESS_TOKEN_URI, PLUGIN_VALUE_TRUE); + } + + if (NULL != provider->oauth1_get_extra_data) + { + app_control_add_extra_data(reply, OAUTH1_0_GET_EXTRA_DATA_URI, PLUGIN_VALUE_TRUE); + } + + if (NULL != provider->oauth2_get_access_token) + { + app_control_add_extra_data(reply, OAUTH2_0_GET_ACCESS_TOKEN_URI, PLUGIN_VALUE_TRUE); + } + + if (NULL != provider->oauth2_get_extra_data) + { + app_control_add_extra_data(reply, OAUTH2_0_GET_EXTRA_DATA_URI, PLUGIN_VALUE_TRUE); + } + + return SERVICE_ADAPTOR_ERROR_NONE; +} diff --git a/client/sal_auth_provider.h b/client/sal_auth_provider.h new file mode 100644 index 0000000..2c91809 --- /dev/null +++ b/client/sal_auth_provider.h @@ -0,0 +1,67 @@ +/* + * Auth Plugin Client + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __AUTH_PLUGIN_CLIENT_H__ +#define __AUTH_PLUGIN_CLIENT_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include + +#include "service_adaptor_errors.h" + +#define OAUTH1_0_ACCESS_TOKEN_KEY "access_token" + +#define OAUTH1_0_GET_ACCESS_TOKEN_URI "http://tizen.org/service-adaptor/auth/oauth1.0/get_access_token" +#define OAUTH1_0_GET_EXTRA_DATA_URI "http://tizen.org/service-adaptor/auth/oauth1.0/get_extra_data" + +#define OAUTH2_0_GET_ACCESS_TOKEN_URI "http://tizen.org/service-adaptor/auth/oauth2.0/get_access_token" +#define OAUTH2_0_GET_EXTRA_DATA_URI "http://tizen.org/service-adaptor/auth/oauth2.0/get_extra_data" + +/** + * @brief Describes infromation about Auth Plugin Handle + */ +typedef struct _auth_provider_s +{ + // oAuth 1.0 + service_adaptor_error_e (*oauth1_get_access_token)(char **access_token); + service_adaptor_error_e (*oauth1_get_extra_data)(const char *key, char **value); + + // oAuth 2.0 + service_adaptor_error_e (*oauth2_get_access_token)(char **access_token); + service_adaptor_error_e (*oauth2_get_extra_data)(const char *key, char **value); +} auth_provider_s; +typedef struct _auth_provider_s *auth_provider_h; + +int auth_provider_create(auth_provider_h *provider); +app_control_h auth_provider_message(auth_provider_h provider, const char *operation, void *user_data); +int auth_provider_add_extra_data(auth_provider_h provider, app_control_h reply); + +#ifdef __cplusplus +} +#endif + +#endif /* __AUTH_PLUGIN_CLIENT_H__ */ diff --git a/client/sal_core_api.c b/client/sal_core_api.c deleted file mode 100644 index e69de29..0000000 diff --git a/client/sal_core_api.h b/client/sal_core_api.h deleted file mode 100644 index e69de29..0000000 diff --git a/client/sal_plugin_api.c b/client/sal_plugin_api.c deleted file mode 100644 index e69de29..0000000 diff --git a/client/sal_restful_api.c b/client/sal_restful_api.c deleted file mode 100644 index e69de29..0000000 diff --git a/client/sal_service_adaptor.c b/client/sal_service_adaptor.c new file mode 100644 index 0000000..971c316 --- /dev/null +++ b/client/sal_service_adaptor.c @@ -0,0 +1,307 @@ +/* + * Service Adaptor + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include + +#include + +#include "service_adaptor_errors.h" +#include "service_adaptor_internal.h" +#include "sal_service_adaptor.h" +#include "sal_service_task.h" +#include "sal_service_task_internal.h" +#include "sal_ipc_client.h" +#include "sal_ipc_client_core.h" +#include "sal_ipc_client_auth.h" + +//****************************************************************************** +//* Global variables and defines +//****************************************************************************** + +/** + * @brief Describes infromation about Adaptor Handle + */ +typedef struct _service_adaptor_s +{ + char *uri; + + GList *plugins; /* char **plugins (uri) */ + GList *started_plugins; /* service_plugin_h **started_plugins */ +} service_adaptor_s; +typedef struct _service_adaptor_s *service_adaptor_h; + +/** + * @brief Describes infromation about Plugin Handle + */ +typedef struct _service_plugin_s +{ + char *uri; +} service_plugin_s; + +service_adaptor_h service_adaptor = NULL; + +//****************************************************************************** +//* Private interface +//****************************************************************************** + +//****************************************************************************** +//* Private interface definition +//****************************************************************************** + +//****************************************************************************** +//* Public interface definition +//****************************************************************************** + +API int service_adaptor_connect() +{ + SAL_FN_CALL; + + service_adaptor = (service_adaptor_h) g_malloc0(sizeof(service_adaptor_s)); + + char *uri = NULL; + + app_get_id(&uri); + + if (NULL == uri) + { + char path[1024] = {0,}; + int path_len = 0; + + path_len = readlink("/proc/self/exe", path, 1024); + RETV_IF(0 == path_len, SERVICE_ADAPTOR_ERROR_SYSTEM); + + uri = strndup(path, path_len); + } + + service_adaptor->uri = strdup(uri); + + int ret = SERVICE_ADAPTOR_ERROR_NONE; + ret = sal_ipc_client_init(); + RETV_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_INTERNAL); + + GList *plugins = NULL; + ret = ipc_service_adaptor_connect(uri, &plugins); + RETV_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_INTERNAL); + + ret = service_task_connect(); + RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, ret, "service_task_connect() Failed"); + + service_adaptor->plugins = plugins; + + SAL_FREE(uri); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_adaptor_disconnect() +{ + SAL_FN_CALL; + + RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + int ret = SERVICE_ADAPTOR_ERROR_NONE; + ret = service_task_disconnect(); + RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, ret, "service_task_disconnect() Failed"); + + ret = ipc_service_adaptor_disconnect(service_adaptor->uri); + RETV_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_INTERNAL); + + ret = sal_ipc_client_deinit(); + RETV_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_INTERNAL); + + // TODO: free memory in adaptor + SAL_FREE(service_adaptor); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_adaptor_foreach_plugin(service_adaptor_plugin_cb callback, void *user_data) +{ + SAL_FN_CALL; + + RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == callback, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + RETV_IF(0 == g_list_length(service_adaptor->plugins), SERVICE_ADAPTOR_ERROR_NO_DATA); + + for (GList *list = g_list_first(service_adaptor->plugins); list != NULL; list = list->next) + { + char * uri = (char *) list->data; + + bool ret = callback(uri, 0, user_data); + RETV_IF(false == ret, SERVICE_ADAPTOR_ERROR_NONE); + } + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_adaptor_get_last_result(int *err) +{ + SAL_FN_CALL; + + RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == err, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_adaptor_get_last_error_message(char **message) +{ + SAL_FN_CALL; + + RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == message, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_plugin_create(const char *uri, service_plugin_h *plugin) +{ + SAL_FN_CALL; + + RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + int ret = ipc_service_plugin_create(uri); + RETV_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + service_plugin_h service_plugin = (service_plugin_h) g_malloc0(sizeof(service_plugin_s)); + + service_plugin->uri = strdup(uri); + + *plugin = service_plugin; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_plugin_destroy(service_plugin_h plugin) +{ + SAL_FN_CALL; + + RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + int ret = ipc_service_plugin_destroy(plugin->uri); + RETV_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + // TODO: free memeory of plugin + SAL_FREE(plugin); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_plugin_add_property(service_plugin_h plugin, const char *key, const char *value) +{ + RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == key, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == value, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_plugin_remove_property(service_plugin_h plugin, const char *key) +{ + RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == key, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_plugin_get_property(service_plugin_h plugin, const char *key, char **value) +{ + RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == key, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == value, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_plugin_login(service_plugin_h plugin, service_plugin_login_cb callback, void *user_data) +{ + SAL_FN_CALL; + + RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == callback, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + // TODO: login this plugin via service adaptor (dbus) + + callback(SERVICE_ADAPTOR_ERROR_NONE, user_data); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_plugin_start(service_plugin_h plugin) +{ + SAL_FN_CALL; + + RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + // TODO: check this plugin via service adaptor (dbus), use or not use?, must be logined. + + service_adaptor->started_plugins = g_list_append(service_adaptor->started_plugins, plugin); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_plugin_stop(service_plugin_h plugin) +{ + SAL_FN_CALL; + + RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + // TODO: notify to stop this plugin to service adaptor (dbus) + + for (GList *list = g_list_first(service_adaptor->started_plugins); list != NULL; list = list->next) + { + service_plugin_h service_plugin = (service_plugin_h) list->data; + + if (0 == strcmp(service_plugin->uri, plugin->uri)) + { + service_adaptor->started_plugins = g_list_remove(service_adaptor->started_plugins, list); + + return SERVICE_ADAPTOR_ERROR_NONE; + } + } + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +int service_plugin_get_uri(service_plugin_h plugin, char **uri) +{ + SAL_FN_CALL; + + RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == g_list_find(service_adaptor->started_plugins, plugin), SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + *uri = strdup(plugin->uri); + + return SERVICE_ADAPTOR_ERROR_NONE; +} diff --git a/client/sal_service_adaptor.h b/client/sal_service_adaptor.h new file mode 100644 index 0000000..4116eee --- /dev/null +++ b/client/sal_service_adaptor.h @@ -0,0 +1,376 @@ +/* + * Service Adaptor + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __SERVICE_ADAPTOR_H__ +#define __SERVICE_ADAPTOR_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include + +/** + * @addtogroup SERVICE_ADAPTOR_MODULE + * @{ + */ + +/** + * @brief Type of service in plugin + */ +typedef enum _service_plugin_type_e +{ + SERVICE_PLUGIN_AUTH = (0x01 << 0), /**< Auth service type flag */ + SERVICE_PLUGIN_STORAGE = (0x01 << 1), /**< Storage service type flag */ +} service_plugin_type_e; + +/** + * @brief Definition for the service_plugin property: The application id be issued from service provider for 3rd party developer. + * @since_tizen 2.4 + * @see service_plugin_add_property() + * @see service_plugin_remove_property() + * @see service_plugin_get_property() + */ +#define SERVICE_PLUGIN_PROPERTY_APP_KEY "http://tizen.org/service-adaptor/plugin/property/app_key" + +/** + * @brief Definition for the service_plugin property: The application password be issued from service provider for 3rd party developer. + * @since_tizen 2.4 + * @see service_plugin_add_property() + * @see service_plugin_remove_property() + * @see service_plugin_get_property() + */ +#define SERVICE_PLUGIN_PROPERTY_APP_SECRET "http://tizen.org/service-adaptor/plugin/property/app_secret" + +/** + * @brief Definition for the service_plugin property: The user id for using specific service. + * @since_tizen 2.4 + * @see service_plugin_add_property() + * @see service_plugin_remove_property() + * @see service_plugin_get_property() + */ +#define SERVICE_PLUGIN_PROPERTY_USER_ID "http://tizen.org/service-adaptor/plugin/property/user_id" + +/** + * @brief The handle for connection and managing handle of Service Plugin + * @details The handle can be created by service_plugin_create()
+ * When a handle is no longer needed, use service_plugin_destroy() + * @see #service_plugin_create() + * @see #service_plugin_destroy() + */ +typedef struct _service_plugin_s *service_plugin_h; + +/** + * @brief Callback for service_adaptor_foreach_plugin API + * + * @param[in] uri The service plugin's unique uri, this value be set by plugin + * @param[in] service_mask Masked value for installed service plugins, this value can be masked multiple enum (#service_plugin_service_type_e) + * @param[in] user_data Passed data from #service_adaptor_foreach_plugin() + * @remarks @a service_mask check using 'bit and' operation with #service_plugin_service_type_e + * @remarks - for example, + * @remarks      if(@a service_mask & SERVICE_PLUGIN_SERVICE_STORAGE) + * @remarks          { @a USING_STORAGE_CODE } + * @remarks Do not release memory of @a plugin_uri + * @see service_plugin_service_type_e + * @return @c true to continue with the next iteration of the loop, + * otherwise @c false to break out of the loop + * @pre service_adaptor_foreach_plugin() will invoke this callback. + */ +typedef bool (*service_adaptor_plugin_cb)(const char *uri, + int service_mask, + void *user_data); + +/** + * @brief Callback for service_plugin_login API + * + * @param[in] result + * @param[in] user_data Passed data from #service_plugin_login() + * @remarks + * @return void + * @pre service_plugin_login() will invoke this callback. + */ +typedef void (*service_plugin_login_cb)(int result, + void *user_data); + +/*================================================================================================== + FUNCTION PROTOTYPES +==================================================================================================*/ + +/** + * @brief Create Service Adaptor + * @since_tizen 2.4 + * + * @param[out] service_adaptor The Service Adaptor handle + * @remarks @a service_adaptor must be released memory using service_adaptor_destroy(), when a program no longer needs any function of Service Adaptor + * @see service_adaptor_destroy() + * @return 0 on success, otherwise a negative error value + * @retval #SERVICE_ADAPTOR_ERROR_NONE Successful + * @retval #SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SERVICE_ADAPTOR_ERROR_UNKNOWN Unknown error + */ +int service_adaptor_connect(); + +/** + * @brief Destroy Service Adaptor + * @details It must called after a program no longer needs any function of Service Adaptor + * @since_tizen 2.4 + * + * @param[in] service_adaptor The handle of Service Adaptor + * @see service_adaptor_create() + * @return 0 on success, otherwise a negative error value + * @retval #SERVICE_ADAPTOR_ERROR_NONE Successful + * @retval #SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SERVICE_ADAPTOR_ERROR_UNKNOWN Unknown error + * @pre @a service_adaptor must be issued by service_adaptor_create() + */ +int service_adaptor_disconnect(); + +/** + * @brief Foreach the list of plugin + * @details Iterate to all installed plugin + * @since_tizen 2.4 + * + * @param[in] callback The callback for foreach plugin + * @param[in] user_data Passed data to callback + * @return 0 on success, otherwise a negative error value + * @retval #SERVICE_ADAPTOR_ERROR_NONE Successful + * @retval #SERVICE_ADAPTOR_ERROR_NO_DATA There is no available plugins + * @retval #SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SERVICE_ADAPTOR_ERROR_UNKNOWN Unknown error + * @pre @a service_adaptor must be issued by service_adaptor_create() + */ +int service_adaptor_foreach_plugin(service_adaptor_plugin_cb callback, + void *user_data); + +/** + * @brief Gets service specfic last result + * @details This function retrieves the last error code that be issued from plugin.
+ * When if API function returns #SERVICE_ADAPTOR_ERROR_PLUGIN_FAILED, gets using this function. + * @since_tizen 2.4 + * + * @param[out] err The error number that is defined service plugin SPEC + * @remarks Thread safe functions + * @remarks The result number's detail specification is defined service plugin or provider. + * @remarks The detail error message can be got using service_adaptor_get_last_error_message() + * @see service_adaptor_get_last_error_message() + * @return 0 on success, otherwise a negative error value + * @retval #SERVICE_ADAPTOR_ERROR_NONE Successful + * @retval #SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SERVICE_ADAPTOR_ERROR_NO_DATA There is no result + * @retval #SERVICE_ADAPTOR_ERROR_UNKNOWN Unknown error + */ +int service_adaptor_get_last_result(int *err); + +/** + * @brief Gets service specfic last result error message + * @details This function retrieves the last error code that be issued from plugin.
+ * When if API function returns #SERVICE_ADAPTOR_ERROR_PLUGIN_FAILED, gets using this function. + * @since_tizen 2.4 + * + * @param[out] message The error message that is defined service plugin SPEC + * @remarks @a message must be released using free() + * @remarks Thread safe functions + * @remarks The result string's detail specification is defined service plugin or provider. + * @see service_adaptor_get_last_result() + * @return 0 on success, otherwise a negative error value + * @retval #SERVICE_ADAPTOR_ERROR_NONE Successful + * @retval #SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SERVICE_ADAPTOR_ERROR_NO_DATA There is no error message + * @retval #SERVICE_ADAPTOR_ERROR_UNKNOWN Unknown error + */ +int service_adaptor_get_last_error_message(char **message); + +/* +int service_adaptor_add_plugin(service_adaptor_h adaptor_client, const char *plugin_uri); +int service_adaptor_remove_plugin(service_adaptor_h adaptor_client, const char *plugin_uri); +int service_adaptor_get_auth(service_adaptor_h adaptor_client, const char *uri, service_auth_h *auth); +*/ + +/** + * @brief Create service plugin handle + * @details Create plugin handle using @a plugin_uri + * @since_tizen 2.4 + * + * @param[in] service_adaptor The handle of Service Adaptor + * @param[in] plugin_uri The specfic string for use plugin, this values are set by plugin + * @param[out] plugin The handle for use Plugin APIs + * @remarks @a plugin must be released memory using service_plugin_destroy() when you no longer needs plugin's API + * @see service_plugin_destroy() + * @return 0 on success, otherwise a negative error value + * @retval #SERVICE_ADAPTOR_ERROR_NONE Successful + * @retval #SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SERVICE_ADAPTOR_ERROR_UNKNOWN Unknown error + * @pre @a service_adaptor must be issued by service_adaptor_create() + */ +int service_plugin_create(const char *uri, service_plugin_h *plugin); + +/** + * @brief Destroy service plugin handle + * @details It must called after a program no longer needs APIs of specfic plugin + * @since_tizen 2.4 + * + * @param[in] plugin The handle for use Plugin APIs + * @see service_adaptor_create_plugin() + * @return 0 on success, otherwise a negative error value + * @retval #SERVICE_ADAPTOR_ERROR_NONE Successful + * @retval #SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SERVICE_ADAPTOR_ERROR_UNKNOWN Unknown error + * @pre @a plugin must be issued by service_adaptor_create_plugin() + */ +int service_plugin_destroy(service_plugin_h plugin); + +/** + * @brief Add Plugin Property + * @details The plguin property is used for plugin's basic or optional requirement.
+ * This value is not used in Adaptor layer, but it can be uesd to important Key for plugin with service provider.
+ * @since_tizen 2.4 + * + * @param[in] plugin The handle for use Plugin APIs + * @param[in] key The key of plugin property + * @param[in] value The value of plugin property that matched @a key + * @remarks Some kind of property key(Not mandatory) is defined in this API (That is named to SERVICE_PLUGIN_PROPERTY_XXX) + * @remarks If the @a key already exists in the property its current value is replaced with the new @a value. + * @remarks @a plugin must be released memory using #service_plugin_destroy() when you no longer needs plugin's API + * @return 0 on success, otherwise a negative error value + * @retval #SERVICE_ADAPTOR_ERROR_NONE Successful + * @retval #SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SERVICE_ADAPTOR_ERROR_UNKNOWN Unknown error + * @see SERVICE_PLUGIN_PROPERTY_APP_KEY + * @see SERVICE_PLUGIN_PROPERTY_APP_SECRET + * @see SERVICE_PLUGIN_PROPERTY_USER_ID + * @pre @a plugin must be issued by service_adaptor_create_plugin() + */ +int service_plugin_add_property(service_plugin_h plugin, + const char *key, + const char *value); + +/** + * @brief Remove Plugin Property + * @since_tizen 2.4 + * + * @param[in] plugin The handle for use Plugin APIs + * @param[in] key The key of plugin property + * @remarks Some kind of property key(Not mandatory) is defined in this API (That is named to SERVICE_PLUGIN_PROPERTY_XXX) + * @return 0 on success, otherwise a negative error value + * @retval #SERVICE_ADAPTOR_ERROR_NONE Successful + * @retval #SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SERVICE_ADAPTOR_ERROR_UNKNOWN Unknown error + * @see SERVICE_PLUGIN_PROPERTY_APP_KEY + * @see SERVICE_PLUGIN_PROPERTY_APP_SECRET + * @see SERVICE_PLUGIN_PROPERTY_USER_ID + */ +int service_plugin_remove_property(service_plugin_h plugin, + const char *key); + +/** + * @brief Gets Plugin Property + * @since_tizen 2.4 + * + * @param[in] plugin The handle for use Plugin APIs + * @param[in] key The key of plugin property + * @param[out] value The value of plugin property that matched @a key + * @remarks Some kind of property key(Not mandatory) is defined in this API (That is named to SERVICE_PLUGIN_PROPERTY_XXX) + * @remarks @a value must be released using free() + * @return 0 on success, otherwise a negative error value + * @retval #SERVICE_ADAPTOR_ERROR_NONE Successful + * @retval #SERVICE_ADAPTOR_ERROR_NO_DATA There is no property + * @retval #SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SERVICE_ADAPTOR_ERROR_UNKNOWN Unknown error + * @see SERVICE_PLUGIN_PROPERTY_APP_KEY + * @see SERVICE_PLUGIN_PROPERTY_APP_SECRET + * @see SERVICE_PLUGIN_PROPERTY_USER_ID + * @pre The function get property already set by service_adaptor_set_plugin_property() + */ +int service_plugin_get_property(service_plugin_h plugin, + const char *key, + char **value); + +/** + * @brief Logins Plugin using Property + * @since_tizen 3.0 + * + * @param[in] plugin The handle for use Plugin APIs + * @param[in] callback The callback for login + * @param[in] user_data Passed data to callback + * @remarks + * @remarks @a value must be released using free() + * @return 0 on success, otherwise a negative error value + * @retval #SERVICE_ADAPTOR_ERROR_NONE Successful + * @retval #SERVICE_ADAPTOR_ERROR_NO_DATA There is no property + * @retval #SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SERVICE_ADAPTOR_ERROR_UNKNOWN Unknown error + * @pre The function get property already set by service_adaptor_set_plugin_property() + */ +int service_plugin_login(service_plugin_h plugin, service_plugin_login_cb callback, void *user_data); + +/** + * @brief Requests start initalization for service plugin + * @since_tizen 2.4 + * + * @param[in] plugin The handle for use Plugin APIs + * @remarks @a service_mask must be input using 'bit or' operation with #service_plugin_service_type_e + * @remarks - for example, + * @remarks      int @a service_mask |= SERVIE_PLUGIN_SERVICE_AUTH; + * @remarks      @a service_mask |= SERVICE_PLUGIN_SERVICE_STORAGE; + * @remarks      int ret = service_plugin_start(@a m_plugin, @a service_mask); + * @remarks If a program needs to stop plugin manually, use #service_plugin_stop().
But in #service_plugin_destroy(), automatically stop service plugin + * @see service_plugin_service_type_e + * @see service_plugin_stop() + * @return 0 on success, otherwise a negative error value + * @return If return value is #SERVICE_ADAPTOR_ERROR_NOT_AUTHOLIZED, request signup to autholization application + * @retval #SERVICE_ADAPTOR_ERROR_NONE Successful + * @retval #SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SERVICE_ADAPTOR_ERROR_NOT_AUTHOLIZED Need atholization + * @retval #SERVICE_ADAPTOR_ERROR_TIMED_OUT Timed out + * @retval #SERVICE_ADAPTOR_ERROR_IPC_UNSTABLE IPC failed with Service Adaptor Daemon + * @retval #SERVICE_ADAPTOR_ERROR_UNKNOWN Unknown error + */ +int service_plugin_start(service_plugin_h plugin); +/** + * @brief Requests stop manually for service plugin + * @since_tizen 2.4 + * + * @param[in] plugin The handle for use Plugin APIs + * @remarks If a program needs to stop plugin manually, use this function.
But in #service_plugin_destroy(), automatically stop service plugin + * @remarks @a plugin must be released memory using #service_plugin_destroy() when you no longer needs plugin's API + * @see service_plugin_start() + * @see service_plugin_destroy() + * @return 0 on success, otherwise a negative error value + * @retval #SERVICE_ADAPTOR_ERROR_NONE Successful + * @retval #SERVICE_ADAPTOR_ERROR_TIMED_OUT Timed out + * @retval #SERVICE_ADAPTOR_ERROR_IPC_UNSTABLE IPC failed with Service Adaptor Daemon + * @retval #SERVICE_ADAPTOR_ERROR_UNKNOWN Unknown error + * @pre service_plugin_start() + */ +int service_plugin_stop(service_plugin_h plugin); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __SERVICE_ADAPTOR_H__ */ diff --git a/client/sal_service_adaptor_internal.h b/client/sal_service_adaptor_internal.h new file mode 100644 index 0000000..1b04bf4 --- /dev/null +++ b/client/sal_service_adaptor_internal.h @@ -0,0 +1,48 @@ +/* + * Service Adaptor Client + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __SERVICE_ADAPTOR_CLIENT_INTERNAL_H__ +#define __SERVICE_ADAPTOR_CLIENT_INTERNAL_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "sal_service_adaptor.h" + +/*================================================================================================== + FUNCTION PROTOTYPES +==================================================================================================*/ + +int service_plugin_get_uri(service_plugin_h plugin, char **uri); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __SERVICE_ADAPTOR_CLIENT_INTERNAL_H__ */ diff --git a/client/sal_service_auth.c b/client/sal_service_auth.c new file mode 100644 index 0000000..72ce859 --- /dev/null +++ b/client/sal_service_auth.c @@ -0,0 +1,228 @@ +/* + * Auth Adaptor Client + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this oauth1 except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include + +#include + +#include "service_adaptor_errors.h" +#include "service_adaptor_internal.h" +#include "sal_service_adaptor.h" +#include "sal_service_adaptor_internal.h" +#include "sal_service_task.h" +#include "sal_service_task_internal.h" +#include "sal_service_auth.h" +#include "sal_service_auth_internal.h" +#include "sal_ipc_client_auth.h" + +//****************************************************************************** +//* Global variables and defines +//****************************************************************************** + +//****************************************************************************** +//* Private interface +//****************************************************************************** + +//****************************************************************************** +//* Private interface definition +//****************************************************************************** + +int service_auth_oauth1_start(service_auth_oauth1_h oauth1) +{ + SAL_FN_CALL; + + RETV_IF(NULL == oauth1, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == oauth1->plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + int ret = SERVICE_ADAPTOR_ERROR_NONE; + char *uri = NULL; + + ret = service_plugin_get_uri(oauth1->plugin, &uri); + RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, ret, "service_plugin_get_uri() Failed(%d)", ret); + + service_auth_oauth1_h auth_oauth1 = NULL; + ret = ipc_service_auth_oauth1(uri, oauth1, &auth_oauth1); + RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, ret, "ipc_service_auth_oauth1() Failed(%d)", ret); + + RETV_IF(NULL == oauth1->callback, SERVICE_ADAPTOR_ERROR_NONE); + + oauth1->callback(SERVICE_ADAPTOR_ERROR_NONE, auth_oauth1, oauth1->user_data); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +int service_auth_oauth1_stop(service_auth_oauth1_h oauth1) +{ + SAL_FN_CALL; + + RETV_IF(NULL == oauth1, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +//****************************************************************************** +//* Public interface definition +//****************************************************************************** + +API int service_auth_oauth1_create(service_plugin_h plugin, service_auth_oauth1_h *oauth1) +{ + SAL_FN_CALL; + + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == oauth1, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + service_auth_oauth1_h auth_oauth1 = (service_auth_oauth1_h) g_malloc0(sizeof(service_auth_oauth1_s)); + auth_oauth1->plugin = plugin; + + *oauth1 = auth_oauth1; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_auth_oauth1_oauth1_clone(service_auth_oauth1_h src_oauth1, service_auth_oauth1_h *dst_oauth1) +{ + SAL_FN_CALL; + + RETV_IF(NULL == src_oauth1, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == dst_oauth1, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + service_auth_oauth1_h auth_oauth1 = (service_auth_oauth1_h) g_malloc0(sizeof(service_auth_oauth1_s)); + auth_oauth1->plugin = src_oauth1->plugin; + auth_oauth1->callback = src_oauth1->callback; + auth_oauth1->access_token = strdup(src_oauth1->access_token); + auth_oauth1->operation = strdup(src_oauth1->operation); + + *dst_oauth1 = auth_oauth1; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_auth_oauth1_oauth1_destroy(service_auth_oauth1_h oauth1) +{ + SAL_FN_CALL; + + RETV_IF(NULL == oauth1, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + SAL_FREE(oauth1->access_token); + SAL_FREE(oauth1->operation); + SAL_FREE(oauth1); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_auth_oauth1_set_callback(service_auth_oauth1_h oauth1, service_auth_oauth1_cb callback, void *user_data) +{ + SAL_FN_CALL; + + RETV_IF(NULL == oauth1, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == callback, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + oauth1->callback = callback; + oauth1->user_data = user_data; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_auth_oauth1_unset_callback(service_auth_oauth1_h oauth1) +{ + SAL_FN_CALL; + + RETV_IF(NULL == oauth1, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + oauth1->callback = NULL; + oauth1->user_data = NULL; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_auth_oauth1_set_access_token(service_auth_oauth1_h oauth1, const char *access_token) +{ + SAL_FN_CALL; + + RETV_IF(NULL == oauth1, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == access_token, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + oauth1->access_token = strdup(access_token); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_auth_oauth1_get_access_token(service_auth_oauth1_h oauth1, char **access_token) +{ + SAL_FN_CALL; + + RETV_IF(NULL == oauth1, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == access_token, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + *access_token = strdup(oauth1->access_token); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_auth_oauth1_set_operation(service_auth_oauth1_h oauth1, const char *operation) +{ + SAL_FN_CALL; + + RETV_IF(NULL == oauth1, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == operation, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + oauth1->operation = strdup(operation); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_auth_oauth1_get_operation(service_auth_oauth1_h oauth1, char **operation) +{ + SAL_FN_CALL; + + RETV_IF(NULL == oauth1, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == operation, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + *operation = strdup(oauth1->operation); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_auth_oauth1_create_task(service_auth_oauth1_h oauth1, service_task_h *task) +{ + SAL_FN_CALL; + + RETV_IF(NULL == oauth1, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == task, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + service_task_h service_task = (service_task_h) g_malloc0(sizeof(service_task_s)); + service_task->oauth1 = oauth1; + + *task = service_task; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_auth_oauth1_destroy_task(service_task_h task) +{ + SAL_FN_CALL; + + RETV_IF(NULL == task, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + SAL_FREE(task); + + return SERVICE_ADAPTOR_ERROR_NONE; +} diff --git a/client/sal_service_auth.h b/client/sal_service_auth.h new file mode 100644 index 0000000..97a5a3a --- /dev/null +++ b/client/sal_service_auth.h @@ -0,0 +1,66 @@ +/* + * Service Auth + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this oauth1 except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __SERVICE_AUTH_H__ +#define __SERVICE_AUTH_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "sal_service_adaptor.h" +#include "sal_service_task.h" + +#define SERVICE_AUTH_OAUTH1_0_GET_ACCESS_TOKEN_URI "http://tizen.org/service-adaptor/auth/oauth1.0/get_access_token" +#define SERVICE_AUTH_OAUTH1_0_GET_EXTRA_DATA_URI "http://tizen.org/service-adaptor/auth/oauth1.0/get_extra_data" + +#define SERVICE_AUTH_OAUTH2_0_GET_ACCESS_TOKEN_URI "http://tizen.org/service-adaptor/auth/oauth2.0/get_access_token" +#define SERVICE_AUTH_OAUTH2_0_GET_EXTRA_DATA_URI "http://tizen.org/service-adaptor/auth/oauth2.0/get_extra_data" + +typedef struct _service_auth_oauth1_s *service_auth_oauth1_h; + +typedef void (*service_auth_oauth1_cb)(int result, service_auth_oauth1_h oauth1, void *user_data); +typedef void (*service_auth_oauth1_get_access_token_cb)(int result, const char *access_token, void *user_data); + +/*================================================================================================== + FUNCTION PROTOTYPES +==================================================================================================*/ + +int service_auth_oauth1_create(service_plugin_h plugin, service_auth_oauth1_h *oauth1); +int service_auth_oauth1_clone(service_auth_oauth1_h src_oauth1, service_auth_oauth1_h *dst_oauth1); +int service_auth_oauth1_destroy(service_auth_oauth1_h oauth1); +int service_auth_oauth1_set_callback(service_auth_oauth1_h oauth1, service_auth_oauth1_cb callback, void *user_data); +int service_auth_oauth1_unset_callback(service_auth_oauth1_h oauth1); +int service_auth_oauth1_set_access_token(service_auth_oauth1_h oauth1, const char *access_token); +int service_auth_oauth1_get_access_token(service_auth_oauth1_h oauth1, char **access_token); +int service_auth_oauth1_set_operation(service_auth_oauth1_h oauth1, const char *operation); +int service_auth_oauth1_get_operation(service_auth_oauth1_h oauth1, char **operation); +int service_auth_oauth1_create_task(service_auth_oauth1_h oauth1, service_task_h *task); +int service_auth_oauth1_destroy_task(service_task_h task); + +#ifdef __cplusplus +} +#endif + +#endif /* __SERVICE_AUTH_H__ */ diff --git a/client/sal_service_auth_internal.h b/client/sal_service_auth_internal.h new file mode 100644 index 0000000..8dbfae1 --- /dev/null +++ b/client/sal_service_auth_internal.h @@ -0,0 +1,58 @@ +/* + * Service Auth Internal + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __SERVICE_AUTH_INTERNAL_H__ +#define __SERVICE_AUTH_INTERNAL_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include + +#include "sal_service_adaptor.h" +#include "sal_service_auth.h" + +typedef struct _service_auth_oauth1_s +{ + service_plugin_h plugin; + service_auth_oauth1_cb callback; + void *user_data; + + char *access_token; + char *operation; +} service_auth_oauth1_s; + +/*================================================================================================== + FUNCTION PROTOTYPES +==================================================================================================*/ + +int service_auth_oauth1_start(service_auth_oauth1_h oauth1); +int service_auth_oauth1_stop(service_auth_oauth1_h oauth1); + +#ifdef __cplusplus +} +#endif + +#endif /* __SERVICE_AUTH_INTERNAL_H__ */ diff --git a/client/sal_service_provider.c b/client/sal_service_provider.c new file mode 100644 index 0000000..5bef6b9 --- /dev/null +++ b/client/sal_service_provider.c @@ -0,0 +1,162 @@ +/* + * Service Plugin Client + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include + +#include + +#include "service_adaptor_errors.h" +#include "service_adaptor_internal.h" +#include "sal_service_provider.h" + +API int service_provider_create(service_provider_h *provider) +{ + SAL_FN_CALL; + + service_provider_h service_provider = (service_provider_h) g_malloc0(sizeof(service_provider_s)); + + service_provider->connect = NULL; + service_provider->disconnect = NULL; + + *provider = service_provider; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_provider_destroy(service_provider_h provider) +{ + SAL_FN_CALL; + + // TODO: free internal value of provider + SAL_FREE(provider); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_provider_set_auth_provider(service_provider_h provider, auth_provider_h auth_provider) +{ + SAL_FN_CALL; + + RETV_IF(NULL == provider, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == auth_provider, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + provider->auth_provider = auth_provider; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_provider_unset_auth_provider(service_provider_h provider) +{ + SAL_FN_CALL; + + RETV_IF(NULL == provider, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + provider->auth_provider = NULL; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_provider_set_storage_provider(service_provider_h provider, storage_provider_h storage_provider) +{ + SAL_FN_CALL; + + RETV_IF(NULL == provider, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == storage_provider, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + provider->storage_provider = storage_provider; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_provider_unset_storage_provider(service_provider_h provider) +{ + SAL_FN_CALL; + + RETV_IF(NULL == provider, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + provider->storage_provider = NULL; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_provider_message(service_provider_h provider, app_control_h app_control, void *user_data) +{ + SAL_FN_CALL; + + RETV_IF(NULL == provider, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + char *operation = NULL; + app_control_get_operation(app_control, &operation); + + RETV_IF(NULL == operation, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + int ret = SERVICE_ADAPTOR_ERROR_NONE; + + app_control_h reply = NULL; + + if (0 == strcmp(operation, PLUGIN_CONNECT_URI)) + { + app_control_create(&reply); + ret = provider->connect(); + + if (SERVICE_ADAPTOR_ERROR_NONE != ret) + { + SAL_ERR("connect() Fail (%d)", ret); + app_control_add_extra_data(reply, PLUGIN_RESULT_KEY, PLUGIN_RESULT_VALUE_FAILURE); + goto catch; + } + + app_control_add_extra_data(reply, PLUGIN_RESULT_KEY, PLUGIN_RESULT_VALUE_SUCCESS); + + auth_provider_add_extra_data(provider->auth_provider, reply); + storage_provider_add_extra_data(provider->storage_provider, reply); + + // TODO: another adaptor + } + else if (0 == strcmp(operation, PLUGIN_DISCONNECT_URI)) + { + app_control_create(&reply); + ret = provider->disconnect(); + + if (SERVICE_ADAPTOR_ERROR_NONE != ret) + { + SAL_ERR("connect() Fail (%d)", ret); + app_control_add_extra_data(reply, PLUGIN_RESULT_KEY, PLUGIN_RESULT_VALUE_FAILURE); + goto catch; + } + + app_control_add_extra_data(reply, PLUGIN_RESULT_KEY, PLUGIN_RESULT_VALUE_SUCCESS); + } + else + { + reply = auth_provider_message(provider->auth_provider, operation, app_control); + TRY_IF(NULL != reply, "auth_plugin_client_message() Finded"); + + reply = storage_provider_message(provider->storage_provider, operation, app_control); + TRY_IF(NULL != reply, "storage_plugin_client_message() Finded"); + } + +catch: + app_control_reply_to_launch_request(reply, app_control, APP_CONTROL_RESULT_SUCCEEDED); + app_control_destroy(reply); + + return SERVICE_ADAPTOR_ERROR_NONE; +} diff --git a/client/sal_service_provider.h b/client/sal_service_provider.h new file mode 100644 index 0000000..bbdad47 --- /dev/null +++ b/client/sal_service_provider.h @@ -0,0 +1,77 @@ +/* + * Service Plugin Client + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __SERVICE_PLUGIN_CLIENT_H__ +#define __SERVICE_PLUGIN_CLIENT_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include + +#include "sal_auth_provider.h" +#include "sal_storage_provider.h" + +#define PLUGIN_RESULT_KEY "result" +#define PLUGIN_RESULT_VALUE_SUCCESS "success" +#define PLUGIN_RESULT_VALUE_FAILURE "failure" + +#define PLUGIN_KEY_AUTH "auth_plugin" +#define PLUGIN_KEY_STORAGE "storage_plugin" +#define PLUGIN_VALUE_TRUE "true" +#define PLUGIN_VALUE_FALSE "false" + +#define PLUGIN_CONNECT_URI "connect" +#define PLUGIN_DISCONNECT_URI "disconnect" + +/** + * @brief Describes infromation about Plugin Handle + */ +typedef struct _service_provider_s +{ + service_adaptor_error_e (*connect)(void); + service_adaptor_error_e (*disconnect)(void); + + auth_provider_h auth_provider; + storage_provider_h storage_provider; + + char *uri; + char *name; +} service_provider_s; +typedef struct _service_provider_s *service_provider_h; + +int service_provider_create(service_provider_h *provider); +int service_provider_destroy(service_provider_h provider); +int service_provider_set_auth_provider(service_provider_h provider, auth_provider_h auth_provider); +int service_provider_unset_auth_provider(service_provider_h provider); +int service_provider_set_storage_provider(service_provider_h provider, storage_provider_h storage_provider); +int service_provider_unset_storage_provider(service_provider_h provider); +int service_provider_message(service_provider_h provider, app_control_h app_control, void *user_data); + +#ifdef __cplusplus +} +#endif + +#endif /* __SERVICE_PLUGIN_CLIENT_H__ */ diff --git a/client/sal_service_storage.c b/client/sal_service_storage.c new file mode 100644 index 0000000..02422cf --- /dev/null +++ b/client/sal_service_storage.c @@ -0,0 +1,313 @@ +/* + * Service Storage + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include + +#include + +#include "service_adaptor_errors.h" +#include "service_adaptor_internal.h" +#include "sal_service_adaptor.h" +#include "sal_service_adaptor_internal.h" +#include "sal_service_task.h" +#include "sal_service_task_internal.h" +#include "sal_service_storage.h" +#include "sal_service_storage_internal.h" +#include "sal_ipc_client_storage.h" + +//****************************************************************************** +//* Global variables and defines +//****************************************************************************** + +//****************************************************************************** +//* Private interface +//****************************************************************************** + +//****************************************************************************** +//* Private interface definition +//****************************************************************************** + +int service_storage_cloud_start(service_storage_cloud_file_h file) +{ + SAL_FN_CALL; + + RETV_IF(NULL == file, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == file->plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + int ret = SERVICE_ADAPTOR_ERROR_NONE; + char *uri = NULL; + + ret = service_plugin_get_uri(file->plugin, &uri); + RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, ret, "service_plugin_get_uri() Failed(%d)", ret); + + service_storage_cloud_file_h cloud_file = NULL; + ret = ipc_service_storage_cloud_file(uri, file, &cloud_file); + RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, ret, "ipc_service_storage_cloud_file() Failed(%d)", ret); + + RETV_IF(NULL == file->callback, SERVICE_ADAPTOR_ERROR_NONE); + + file->callback(SERVICE_ADAPTOR_ERROR_NONE, cloud_file, file->user_data); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +int service_storage_cloud_stop(service_storage_cloud_file_h file) +{ + SAL_FN_CALL; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +//****************************************************************************** +//* Public interface definition +//****************************************************************************** + +API int service_storage_cloud_file_create(service_plugin_h plugin, service_storage_cloud_file_h *file) +{ + SAL_FN_CALL; + + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == file, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + service_storage_cloud_file_h cloud_file = (service_storage_cloud_file_h) g_malloc0(sizeof(service_storage_cloud_file_s)); + cloud_file->plugin = plugin; + + *file = cloud_file; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_storage_cloud_file_clone(service_storage_cloud_file_h src_file, service_storage_cloud_file_h *dst_file) +{ + SAL_FN_CALL; + + RETV_IF(NULL == src_file, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + service_storage_cloud_file_h cloud_file = (service_storage_cloud_file_h) g_malloc0(sizeof(service_storage_cloud_file_s)); + cloud_file->plugin = src_file->plugin; + cloud_file->callback = src_file->callback; + cloud_file->is_dir = src_file->is_dir; + cloud_file->dir_path = strdup(src_file->dir_path); + cloud_file->local_path = strdup(src_file->local_path); + cloud_file->cloud_path = strdup(src_file->cloud_path); + cloud_file->size = src_file->size; + cloud_file->operation = strdup(src_file->operation); + // TODO: g_list_copy_deep() + cloud_file->files = g_list_copy(src_file->files); + + *dst_file = cloud_file; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_storage_cloud_file_destroy(service_storage_cloud_file_h file) +{ + SAL_FN_CALL; + + SAL_FREE(file->dir_path); + SAL_FREE(file->local_path); + SAL_FREE(file->cloud_path); + SAL_FREE(file->operation); + SAL_FREE(file); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_storage_cloud_file_set_callback(service_storage_cloud_file_h file, service_storage_cloud_file_cb callback, void *user_data) +{ + SAL_FN_CALL; + + RETV_IF(NULL == file, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == callback, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + file->callback = callback; + file->user_data = user_data; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_storage_cloud_file_unset_callback(service_storage_cloud_file_h file) +{ + SAL_FN_CALL; + + RETV_IF(NULL == file, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + file->callback = NULL; + file->user_data = NULL; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_storage_cloud_file_set_cloud_path(service_storage_cloud_file_h file, const char *cloud_path) +{ + SAL_FN_CALL; + + RETV_IF(NULL == file, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == cloud_path, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + file->cloud_path = strdup(cloud_path); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_storage_cloud_file_get_cloud_path(service_storage_cloud_file_h file, char **cloud_path) +{ + SAL_FN_CALL; + + RETV_IF(NULL == file, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == cloud_path, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + *cloud_path = strdup(file->cloud_path); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_storage_cloud_file_set_local_path(service_storage_cloud_file_h file, const char *local_path) +{ + SAL_FN_CALL; + + RETV_IF(NULL == file, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == local_path, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + file->local_path = strdup(local_path); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_storage_cloud_file_get_local_path(service_storage_cloud_file_h file, char **local_path) +{ + SAL_FN_CALL; + + RETV_IF(NULL == file, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == local_path, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + *local_path = strdup(file->local_path); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_storage_cloud_file_set_size(service_storage_cloud_file_h file, unsigned long long size) +{ + SAL_FN_CALL; + + RETV_IF(NULL == file, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(0 > size, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + file->size = size; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_storage_cloud_file_get_size(service_storage_cloud_file_h file, unsigned long long *size) +{ + SAL_FN_CALL; + + RETV_IF(NULL == file, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == size, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + *size = file->size; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_storage_cloud_file_set_operation(service_storage_cloud_file_h file, const char *operation) +{ + SAL_FN_CALL; + + RETV_IF(NULL == file, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == operation, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + file->operation = strdup(operation); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_storage_cloud_file_get_operation(service_storage_cloud_file_h file, char **operation) +{ + SAL_FN_CALL; + + RETV_IF(NULL == file, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == operation, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + *operation = strdup(file->operation); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_storage_cloud_file_is_directory(service_storage_cloud_file_h file, bool *is_dir) +{ + SAL_FN_CALL; + + RETV_IF(NULL == file, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == is_dir, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + *is_dir = file->is_dir; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_storage_cloud_file_foreach_file(service_storage_cloud_file_h file, service_storage_cloud_file_cb callback, void *user_data) +{ + SAL_FN_CALL; + + RETV_IF(NULL == file, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == callback, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + RETV_IF(false == file->is_dir, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + RETV_IF(0 == g_list_length(file->files), SERVICE_ADAPTOR_ERROR_NO_DATA); + + for (GList *list = g_list_first(file->files); list != NULL; list = list->next) + { + service_storage_cloud_file_h file_data = (service_storage_cloud_file_h) list->data; + + bool ret = callback(SERVICE_ADAPTOR_ERROR_NONE, file_data, user_data); + RETV_IF(false == ret, SERVICE_ADAPTOR_ERROR_NONE); + } + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_storage_cloud_file_create_task(service_storage_cloud_file_h file, service_task_h *task) +{ + SAL_FN_CALL; + + RETV_IF(NULL == file, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == task, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + service_task_h service_task = (service_task_h) g_malloc0(sizeof(service_task_s)); + service_task->cloud_file = file; + + *task = service_task; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_storage_cloud_file_destroy_task(service_task_h task) +{ + SAL_FN_CALL; + + RETV_IF(NULL == task, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + SAL_FREE(task); + + return SERVICE_ADAPTOR_ERROR_NONE; +} diff --git a/client/sal_service_storage.h b/client/sal_service_storage.h new file mode 100644 index 0000000..a8c10e0 --- /dev/null +++ b/client/sal_service_storage.h @@ -0,0 +1,72 @@ +/* + * Service Storage + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __SERVICE_STORAGE_H__ +#define __SERVICE_STORAGE_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "sal_service_adaptor.h" +#include "sal_service_task.h" + +#define SERVICE_STORAGE_CLOUD_REMOVE_FILE_URI "http://tizen.org/service-adaptor/storage/cloud/remove_file" +#define SERVICE_STORAGE_CLOUD_DOWNLOAD_FILE_URI "http://tizen.org/service-adaptor/storage/cloud/download_file" +#define SERVICE_STORAGE_CLOUD_UPLOAD_FILE_URI "http://tizen.org/service-adaptor/storage/cloud/upload_file" +#define SERVICE_STORAGE_CLOUD_DOWNLOAD_FILE_THUMBNAIL_URI "http://tizen.org/service-adaptor/storage/cloud/download_file_thumbnail" +#define SERVICE_STORAGE_CLOUD_GET_FILE_LIST_URI "http://tizen.org/service-adaptor/storage/cloud/get_file_list" + +typedef struct _service_storage_cloud_file_s *service_storage_cloud_file_h; + +typedef bool (*service_storage_cloud_file_cb)(int result, service_storage_cloud_file_h file, void *user_data); + +/*================================================================================================== + FUNCTION PROTOTYPES +==================================================================================================*/ + +int service_storage_cloud_file_create(service_plugin_h plugin, service_storage_cloud_file_h *file); +int service_storage_cloud_file_clone(service_storage_cloud_file_h src_file, service_storage_cloud_file_h *dst_file); + +int service_storage_cloud_file_destroy(service_storage_cloud_file_h file); +int service_storage_cloud_file_set_callback(service_storage_cloud_file_h file, service_storage_cloud_file_cb callback, void *user_data); +int service_storage_cloud_file_unset_callback(service_storage_cloud_file_h file); +int service_storage_cloud_file_set_cloud_path(service_storage_cloud_file_h file, const char *cloud_path); +int service_storage_cloud_file_get_cloud_path(service_storage_cloud_file_h file, char **cloud_path); +int service_storage_cloud_file_set_local_path(service_storage_cloud_file_h file, const char *local_path); +int service_storage_cloud_file_get_local_path(service_storage_cloud_file_h file, char **local_path); +int service_storage_cloud_file_set_size(service_storage_cloud_file_h file, unsigned long long size); +int service_storage_cloud_file_get_size(service_storage_cloud_file_h file, unsigned long long *size); +int service_storage_cloud_file_set_operation(service_storage_cloud_file_h file, const char *operation); +int service_storage_cloud_file_get_operation(service_storage_cloud_file_h file, char **operation); +int service_storage_cloud_file_is_directory(service_storage_cloud_file_h file, bool *is_dir); +int service_storage_cloud_file_foreach_file(service_storage_cloud_file_h file, service_storage_cloud_file_cb callback, void *user_data); +int service_storage_cloud_file_create_task(service_storage_cloud_file_h file, service_task_h *task); +int service_storage_cloud_file_destroy_task(service_task_h task); + +#ifdef __cplusplus +} +#endif + +#endif /* __SERVICE_STORAGE_H__ */ diff --git a/client/sal_service_storage_internal.h b/client/sal_service_storage_internal.h new file mode 100644 index 0000000..4e2a024 --- /dev/null +++ b/client/sal_service_storage_internal.h @@ -0,0 +1,64 @@ +/* + * Service Storage Internal + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __SERVICE_STORAGE_INTERNAL_H__ +#define __SERVICE_STORAGE_INTERNAL_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include + +#include "sal_service_adaptor.h" +#include "sal_service_storage.h" + +typedef struct _service_storage_cloud_file_s +{ + service_plugin_h plugin; + service_storage_cloud_file_cb callback; + void *user_data; + + bool is_dir; + char *dir_path; + char *local_path; + char *cloud_path; + unsigned long long size; + char *operation; + + GList *files; +} service_storage_cloud_file_s; + +/*================================================================================================== + FUNCTION PROTOTYPES +==================================================================================================*/ + +int service_storage_cloud_start(service_storage_cloud_file_h file); +int service_storage_cloud_stop(service_storage_cloud_file_h file); + +#ifdef __cplusplus +} +#endif + +#endif /* __SERVICE_STORAGE_INTERNAL_H__ */ diff --git a/client/sal_service_task.c b/client/sal_service_task.c new file mode 100644 index 0000000..4bbd229 --- /dev/null +++ b/client/sal_service_task.c @@ -0,0 +1,193 @@ +/* + * Service Task + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include + +#include + +#include "service_adaptor_errors.h" +#include "service_adaptor_internal.h" +#include "sal_service_adaptor.h" +#include "sal_service_adaptor_internal.h" +#include "sal_service_task.h" +#include "sal_service_task_internal.h" +#include "sal_service_auth_internal.h" +#include "sal_service_storage_internal.h" + +//****************************************************************************** +//* Global variables and defines +//****************************************************************************** + +GList *service_tasks = NULL; +GThreadPool *thread_pool = NULL; + +//****************************************************************************** +//* Private interface +//****************************************************************************** + +//****************************************************************************** +//* Private interface definition +//****************************************************************************** + +static void _service_task_async_func(gpointer data, gpointer user_data) +{ + service_task_h task = (service_task_h) data; + + if (NULL != task->oauth1) + { + service_auth_oauth1_start(task->oauth1); + } + else if (NULL != task->cloud_file) + { + service_storage_cloud_start(task->cloud_file); + } + else + { + return; + } + + service_tasks = g_list_append(service_tasks, task); +} + +//****************************************************************************** +//* Public interface definition +//****************************************************************************** + +API int service_task_connect() +{ + SAL_FN_CALL; + + thread_pool = g_thread_pool_new(_service_task_async_func, NULL, -1, FALSE, NULL); + RETVM_IF(NULL == thread_pool, SERVICE_ADAPTOR_ERROR_SYSTEM, "g_thread_pool_new() Failed"); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_task_disconnect() +{ + SAL_FN_CALL; + + // TODO: stop current stated task + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_task_start(service_task_h task) +{ + SAL_FN_CALL; + + RETV_IF(NULL == task, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + g_thread_pool_push(thread_pool, (gpointer) task, NULL); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_task_stop(service_task_h task) +{ + SAL_FN_CALL; + + RETV_IF(NULL == task, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + if (NULL != task->cloud_file) + { + service_storage_cloud_stop(task->cloud_file); + } + else + { + return SERVICE_ADAPTOR_ERROR_NO_DATA; + } + + service_tasks = g_list_remove(service_tasks, task); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_task_set_uri(service_task_h task, const char *uri) +{ + SAL_FN_CALL; + + RETV_IF(NULL == task, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + task->uri = strdup(uri); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_task_get_uri(service_task_h task, char **uri) +{ + SAL_FN_CALL; + + RETV_IF(NULL == task, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + *uri = strdup(task->uri); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_task_set_progress_callback(service_task_h task, service_task_progress_cb callback, void *user_data) +{ + SAL_FN_CALL; + + RETV_IF(NULL == task, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == callback, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + task->progress_callback = callback; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_task_unset_progress_callback(service_task_h task) +{ + SAL_FN_CALL; + + RETV_IF(NULL == task, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + task->progress_callback = NULL; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_task_set_state_changed_callback(service_task_h task, service_task_state_changed_cb callback, void *user_data) +{ + SAL_FN_CALL; + + RETV_IF(NULL == task, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == callback, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + task->state_callback = callback; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int service_task_unset_state_changed_callback(service_task_h task) +{ + SAL_FN_CALL; + + RETV_IF(NULL == task, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + task->state_callback = NULL; + + return SERVICE_ADAPTOR_ERROR_NONE; +} diff --git a/client/sal_service_task.h b/client/sal_service_task.h new file mode 100644 index 0000000..6f038e2 --- /dev/null +++ b/client/sal_service_task.h @@ -0,0 +1,63 @@ +/* + * Service Task + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __SERVICE_TASK_H__ +#define __SERVICE_TASK_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +typedef enum _service_task_state_e +{ + SERVICE_TASK_IN_PROGRESS = 1, + SERVICE_TASK_COMPLETED = 2, + SERVICE_TASK_CANCELED = 3, + SERVICE_TASK_FAILED = 4 +} service_task_state_e; + +typedef struct _service_task_s *service_task_h; + +typedef void (*service_task_progress_cb)(service_task_h task, unsigned long long progress, unsigned long long total, void *user_data); + +typedef void (*service_task_state_changed_cb)(service_task_h task, service_task_state_e state, void *user_data); + +/*================================================================================================== + FUNCTION PROTOTYPES +==================================================================================================*/ + +int service_task_start(service_task_h task); +int service_task_stop(service_task_h task); +int service_task_set_uri(service_task_h task, const char *uri); +int service_task_get_uri(service_task_h task, char **uri); +int service_task_set_progress_callback(service_task_h task, service_task_progress_cb callback, void *user_data); +int service_task_unset_progress_callback(service_task_h task); +int service_task_set_state_changed_callback(service_task_h task, service_task_state_changed_cb callback, void *user_data); +int service_task_unset_state_changed_callback(service_task_h task); + +#ifdef __cplusplus +} +#endif + +#endif /* __SERVICE_TASK_H__ */ diff --git a/client/sal_service_task_internal.h b/client/sal_service_task_internal.h new file mode 100644 index 0000000..f2a4c58 --- /dev/null +++ b/client/sal_service_task_internal.h @@ -0,0 +1,57 @@ +/* + * Service Task Internal + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __SERVICE_TASK_INTERNAL_H__ +#define __SERVICE_TASK_INTERNAL_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "sal_service_task.h" +#include "sal_service_auth.h" +#include "sal_service_storage.h" + +typedef struct _service_task_s +{ + char *uri; + service_task_progress_cb progress_callback; + service_task_state_changed_cb state_callback; + + service_auth_oauth1_h oauth1; + service_storage_cloud_file_h cloud_file; +} service_task_s; + +/*================================================================================================== + FUNCTION PROTOTYPES +==================================================================================================*/ + +int service_task_connect(); +int service_task_disconnect(); + +#ifdef __cplusplus +} +#endif + +#endif /* __SERVICE_TASK_INTERNAL_H__ */ diff --git a/client/sal_storage_provider.c b/client/sal_storage_provider.c new file mode 100644 index 0000000..f511241 --- /dev/null +++ b/client/sal_storage_provider.c @@ -0,0 +1,92 @@ +/* + * Storage Plugin Client + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include + +#include + +#include "service_adaptor_errors.h" +#include "service_adaptor_internal.h" +#include "cloud_service.h" +#include "sal_service_provider.h" +#include "sal_storage_provider.h" + +API int storage_provider_create(storage_provider_h *provider) +{ + SAL_FN_CALL; + + storage_provider_h storage_provider = (storage_provider_h) g_malloc0(sizeof(storage_provider_s)); + + storage_provider->cloud_remove_file = NULL; + + *provider = storage_provider; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API app_control_h storage_provider_message(storage_provider_h provider, const char *operation, void *user_data) +{ + SAL_FN_CALL; + + app_control_h reply = NULL; + + RETV_IF(NULL == provider, reply); + + int ret = SERVICE_ADAPTOR_ERROR_NONE; + + if (0 == strcmp(operation, CLOUD_REMOVE_FILE_URI)) + { + app_control_create(&reply); + + char *cloud_path = NULL; + app_control_get_extra_data((app_control_h) user_data, CLOUD_CLOUD_PATH_KEY, &cloud_path); + + ret = provider->cloud_remove_file(cloud_path); + + if (SERVICE_ADAPTOR_ERROR_NONE != ret) + { + SAL_ERR("cloud_remove_file() Fail (%d)", ret); + app_control_add_extra_data(reply, PLUGIN_RESULT_KEY, PLUGIN_RESULT_VALUE_FAILURE); + return reply; + } + + app_control_add_extra_data(reply, PLUGIN_RESULT_KEY, PLUGIN_RESULT_VALUE_SUCCESS); + } + + return reply; +} + +API int storage_provider_add_extra_data(storage_provider_h provider, app_control_h reply) +{ + SAL_FN_CALL; + + RETV_IF(NULL == provider, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == reply, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + app_control_add_extra_data(reply, PLUGIN_KEY_STORAGE, PLUGIN_VALUE_TRUE); + + if (NULL != provider->cloud_remove_file) + { + app_control_add_extra_data(reply, CLOUD_REMOVE_FILE_URI, PLUGIN_VALUE_TRUE); + } + + return SERVICE_ADAPTOR_ERROR_NONE; +} diff --git a/client/sal_storage_provider.h b/client/sal_storage_provider.h new file mode 100644 index 0000000..3053fce --- /dev/null +++ b/client/sal_storage_provider.h @@ -0,0 +1,69 @@ +/* + * Storage Plugin Client + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __STORAGE_PLUGIN_CLIENT_H__ +#define __STORAGE_PLUGIN_CLIENT_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include + +#include "service_adaptor_errors.h" + +#define CLOUD_LOCAL_PATH_KEY "local_path" +#define CLOUD_CLOUD_PATH_KEY "cloud_path" + +/** + * @brief Describes infromation about Cloud Service + * @key name, ... + */ +#define CLOUD_REMOVE_FILE_URI "http://tizen.org/service-adaptor/storage/cloud/remove_file" +#define CLOUD_DOWNLOAD_FILE_URI "http://tizen.org/service-adaptor/storage/cloud/download_file" +#define CLOUD_UPLOAD_FILE_URI "http://tizen.org/service-adaptor/storage/cloud/upload_file" +#define CLOUD_DOWNLOAD_FILE_THUMBNAIL_URI "http://tizen.org/service-adaptor/storage/cloud/download_file_thumbnail" +#define CLOUD_GET_FILE_LIST_URI "http://tizen.org/service-adaptor/storage/cloud/get_file_list" + +/** + * @brief Describes infromation about Storage Plugin Handle + */ +typedef struct _storage_provider_s +{ + // Cloud + service_adaptor_error_e (*cloud_remove_file)(const char *cloud_path); + + // Posix +} storage_provider_s; +typedef struct _storage_provider_s *storage_provider_h; + +int storage_provider_create(storage_provider_h *provider); +app_control_h storage_provider_message(storage_provider_h provider, const char *operation, void *user_data); +int storage_provider_add_extra_data(storage_provider_h provider, app_control_h reply); + +#ifdef __cplusplus +} +#endif + +#endif /* __STORAGE_PLUGIN_CLIENT_H__ */ diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index b3187b1..c755981 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -14,35 +14,123 @@ MESSAGE(">>> Build type: ${CMAKE_BUILD_TYPE}") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${VISIBILITY} -fvisibility=hidden") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,--gc-sections") -SET(COMMON-LIB "sal-common") -SET(COMMON-SRCS - ${CMAKE_SOURCE_DIR}/common/sal_common.c - ${CMAKE_SOURCE_DIR}/common/ipc/sal_ipc.c +ADD_DEFINITIONS("-DSERVICE_ADAPTOR_DEBUGGING") + +########################################################## +# Define common base +########################################################## + +SET(COMMON-BASE-LIB "sal-common-base") +SET(COMMON-BASE-SRCS + ${CMAKE_SOURCE_DIR}/common/sal_ipc.c +) + +INCLUDE_DIRECTORIES( + ${CMAKE_SOURCE_DIR}/include + ${CMAKE_SOURCE_DIR}/common +) + +INCLUDE(FindPkgConfig) +pkg_check_modules(common_base_pkgs REQUIRED dlog glib-2.0 gio-2.0) + +FOREACH(flag ${common_base_pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -std=gnu99") +#message(">>>[${COMMON-BASE-LIB}] extra_cflags ${EXTRA_CFLAGS}") +#message(">>>[${COMMON-BASE-LIB}] common_base_pkgs_cflags ${common_base_pkgs_CFLAGS}") +#message(">>>[${COMMON-BASE-LIB}] result ${CMAKE_C_FLAGS}") + +SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed") + +ADD_LIBRARY(${COMMON-BASE-LIB} SHARED ${COMMON-BASE-SRCS}) +TARGET_LINK_LIBRARIES(${COMMON-BASE-LIB} ${common_base_pkgs_LDFLAGS}) +SET_TARGET_PROPERTIES(${COMMON-BASE-LIB} PROPERTIES SOVERSION ${VERSION_MAJOR}) +SET_TARGET_PROPERTIES(${COMMON-BASE-LIB} PROPERTIES VERSION ${VERSION}) + +INSTALL(TARGETS ${COMMON-BASE-LIB} DESTINATION lib COMPONENT RuntimeLibraries) + +########################################################## +# Define common server +########################################################## + +SET(COMMON-SERVER-LIB "sal-common-server") +SET(COMMON-SERVER-SRCS + ${CMAKE_SOURCE_DIR}/common/ipc-server/sal_ipc_server.c + ${CMAKE_SOURCE_DIR}/common/ipc-server/sal_ipc_server_core.c + ${CMAKE_SOURCE_DIR}/common/ipc-server/sal_ipc_server_auth.c + ${CMAKE_SOURCE_DIR}/common/ipc-server/sal_ipc_server_storage.c +) + +INCLUDE_DIRECTORIES( + ${CMAKE_SOURCE_DIR}/include + ${CMAKE_SOURCE_DIR}/adaptor/auth-adaptor + ${CMAKE_SOURCE_DIR}/adaptor/contact-adaptor + ${CMAKE_SOURCE_DIR}/adaptor/storage-adaptor + ${CMAKE_SOURCE_DIR}/adaptor/resource-adaptor + ${CMAKE_SOURCE_DIR}/common + ${CMAKE_SOURCE_DIR}/common/ipc-server + ${CMAKE_SOURCE_DIR}/server +) + +INCLUDE(FindPkgConfig) +pkg_check_modules(common_server_pkgs REQUIRED dlog glib-2.0 gio-2.0) + +FOREACH(flag ${common_server_pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -std=gnu99") +#message(">>>[${COMMON-SERVER-LIB}] extra_cflags ${EXTRA_CFLAGS}") +#message(">>>[${COMMON-SERVER-LIB}] common_server_pkgs_cflags ${common_server_pkgs_CFLAGS}") +#message(">>>[${COMMON-SERVER-LIB}] result ${CMAKE_C_FLAGS}") + +SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed") + +ADD_LIBRARY(${COMMON-SERVER-LIB} SHARED ${COMMON-SERVER-SRCS}) +TARGET_LINK_LIBRARIES(${COMMON-SERVER-LIB} ${common_server_pkgs_LDFLAGS} sal-common-base auth-adaptor storage-adaptor) +SET_TARGET_PROPERTIES(${COMMON-SERVER-LIB} PROPERTIES SOVERSION ${VERSION_MAJOR}) +SET_TARGET_PROPERTIES(${COMMON-SERVER-LIB} PROPERTIES VERSION ${VERSION}) + +INSTALL(TARGETS ${COMMON-SERVER-LIB} DESTINATION lib COMPONENT RuntimeLibraries) + +########################################################## +# Define common client +########################################################## + +SET(COMMON-CLIENT-LIB "sal-common-client") +SET(COMMON-CLIENT-SRCS + ${CMAKE_SOURCE_DIR}/common/ipc-client/sal_ipc_client.c + ${CMAKE_SOURCE_DIR}/common/ipc-client/sal_ipc_client_core.c + ${CMAKE_SOURCE_DIR}/common/ipc-client/sal_ipc_client_auth.c + ${CMAKE_SOURCE_DIR}/common/ipc-client/sal_ipc_client_storage.c ) INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/common - ${CMAKE_SOURCE_DIR}/common/ipc + ${CMAKE_SOURCE_DIR}/common/ipc-client + ${CMAKE_SOURCE_DIR}/client ) INCLUDE(FindPkgConfig) -pkg_check_modules(common_pkgs REQUIRED dlog glib-2.0) +pkg_check_modules(common_client_pkgs REQUIRED dlog glib-2.0 gio-2.0) -FOREACH(flag ${common_pkgs_CFLAGS}) +FOREACH(flag ${common_client_pkgs_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") ENDFOREACH(flag) -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") -#message(">>>[${COMMON-LIB}] extra_cflags ${EXTRA_CFLAGS}") -#message(">>>[${COMMON-LIB}] common_pkgs_cflags ${common_pkgs_CFLAGS}") -#message(">>>[${COMMON-LIB}] result ${CMAKE_C_FLAGS}") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -std=gnu99") +#message(">>>[${COMMON-CLIENT-LIB}] extra_cflags ${EXTRA_CFLAGS}") +#message(">>>[${COMMON-CLIENT-LIB}] common_client_pkgs_cflags ${common_client_pkgs_CFLAGS}") +#message(">>>[${COMMON-CLIENT-LIB}] result ${CMAKE_C_FLAGS}") SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed") -ADD_LIBRARY(${COMMON-LIB} SHARED ${COMMON-SRCS}) -TARGET_LINK_LIBRARIES(${COMMON-LIB} ${common_pkgs_LDFLAGS}) -SET_TARGET_PROPERTIES(${COMMON-LIB} PROPERTIES SOVERSION ${VERSION_MAJOR}) -SET_TARGET_PROPERTIES(${COMMON-LIB} PROPERTIES VERSION ${VERSION}) +ADD_LIBRARY(${COMMON-CLIENT-LIB} SHARED ${COMMON-CLIENT-SRCS}) +TARGET_LINK_LIBRARIES(${COMMON-CLIENT-LIB} ${common_client_pkgs_LDFLAGS} sal-common-base) +SET_TARGET_PROPERTIES(${COMMON-CLIENT-LIB} PROPERTIES SOVERSION ${VERSION_MAJOR}) +SET_TARGET_PROPERTIES(${COMMON-CLIENT-LIB} PROPERTIES VERSION ${VERSION}) -INSTALL(TARGETS ${COMMON-LIB} DESTINATION lib COMPONENT RuntimeLibraries) +INSTALL(TARGETS ${COMMON-CLIENT-LIB} DESTINATION lib COMPONENT RuntimeLibraries) diff --git a/common/ipc-client/sal_ipc_client.c b/common/ipc-client/sal_ipc_client.c new file mode 100644 index 0000000..03df9db --- /dev/null +++ b/common/ipc-client/sal_ipc_client.c @@ -0,0 +1,453 @@ +/* + * Service Adaptor IPC Client + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include + +#include "service_adaptor_errors.h" +#include "service_adaptor_internal.h" +#include "sal_ipc.h" + +//****************************************************************************** +//* Global variables and defines +//****************************************************************************** + +/** + * Service Adaptor D-Bus client thread data + */ +typedef struct _dbus_client_thread_data_s +{ + GMutex connection_mutex; // Mutex used to protect connection status data + GCond connection_cond; // Conditional variable used to signal that connection was established + int connection_cond_signaled; // Additional variable used to signal that connection was established +} dbus_client_thread_data_s; +typedef struct _dbus_client_thread_data_s *dbus_client_thread_data_h; + +/** + * D-Bus client thread. + */ +static GThread *dbus_client_thread = NULL; + +/** + * D-Bus client thread main loop context. + */ +static GMainContext *dbus_client_context = NULL; + +/** + * D-Bus client thread main loop. + */ +static GMainLoop *dbus_client_loop = NULL; + +/** + * Service Adaptor D-Bus bus watcher id. + */ +static guint watcher_id = 0; + +/** + * D-Bus connection to vService Channel + */ +static GDBusConnection *connection = NULL; + +/** + * D-Bus proxy to Service Adaptor Client interface + */ +static GDBusProxy *interface_proxy = NULL; + +//****************************************************************************** +//* Private interface +//****************************************************************************** + +static gpointer _dbus_client_thread_func(gpointer data); + +static service_adaptor_error_e _dbus_client_start(dbus_client_thread_data_h thread_data); + +static service_adaptor_error_e _dbus_client_stop(); + +static void _on_name_appeared(GDBusConnection *connection, + const gchar *name, + const gchar *name_owner, + gpointer user_data); + +static void _on_name_vanished(GDBusConnection *connection, + const gchar *name, + gpointer user_data); + +static void _on_signal(GDBusProxy *proxy, + gchar *sender_name, + gchar *signal_name, + GVariant *parameters, + gpointer user_data); + +//****************************************************************************** +//* Private interface definition +//****************************************************************************** + +/** + * @brief D-Bus client thread function. + * + * D-Bus client thread function. It initialises all client D-Bus interfaces. + * @param data Data passed to thread. + * @return Result data from thread (always NULL in this implementation). + */ +static gpointer _dbus_client_thread_func(gpointer data) +{ + SAL_FN_CALL; + + int ret = 0; + + dbus_client_context = g_main_context_new(); + dbus_client_loop = g_main_loop_new(dbus_client_context, FALSE); + g_main_context_push_thread_default(dbus_client_context); + + ret = _dbus_client_start(data); + + if (SERVICE_ADAPTOR_ERROR_NONE == ret) + { + g_main_loop_run(dbus_client_loop); + } + + _dbus_client_stop(); + + g_main_context_pop_thread_default(dbus_client_context); + g_main_loop_unref(dbus_client_loop); + dbus_client_loop = NULL; + g_main_context_unref(dbus_client_context); + dbus_client_context = NULL; + + free(data); + + return NULL; +} + +/** + * @brief Initialises Service Adaptor D-Bus client internal structures. + * + * Initialises Service Adaptor D-Bus client internal structures. + * @param thread_data Pointer to thread data used to signal that connection was successfully established. + * @return 0 on success, error code when some structures could not be initialised. + */ +static service_adaptor_error_e _dbus_client_start(dbus_client_thread_data_h thread_data) +{ + SAL_FN_CALL; + + GError *error = NULL; + + RETV_IF(NULL != connection, SERVICE_ADAPTOR_ERROR_INTERNAL); + RETV_IF(NULL != interface_proxy, SERVICE_ADAPTOR_ERROR_INTERNAL); + + connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); + + if (NULL == connection) + { + g_error_free(error); + + return SERVICE_ADAPTOR_ERROR_INTERNAL; + } + + interface_proxy = g_dbus_proxy_new_sync(connection, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + SERVICE_ADAPTOR_BUS_NAME, + SERVICE_ADAPTOR_OBJECT_PATH, + SERVICE_ADAPTOR_INTERFACE, + NULL, + &error); + + if (NULL == interface_proxy) + { + g_error_free(error); + + g_object_unref(connection); + connection = NULL; + + return SERVICE_ADAPTOR_ERROR_INTERNAL; + } + + watcher_id = g_bus_watch_name(G_BUS_TYPE_SYSTEM, + SERVICE_ADAPTOR_BUS_NAME, + G_BUS_NAME_WATCHER_FLAGS_NONE, + _on_name_appeared, + _on_name_vanished, + thread_data, + NULL); + + if (0 == watcher_id) + { + g_object_unref(interface_proxy); + interface_proxy = NULL; + + g_object_unref(connection); + connection = NULL; + + return SERVICE_ADAPTOR_ERROR_INTERNAL; + } + + int res = g_signal_connect(interface_proxy, + "g-signal", + G_CALLBACK(_on_signal), + NULL); + + if (0 == res) + { + g_object_unref(interface_proxy); + interface_proxy = NULL; + + g_object_unref(connection); + connection = NULL; + + g_bus_unwatch_name(watcher_id); + watcher_id = 0; + + return SERVICE_ADAPTOR_ERROR_INTERNAL; + } + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +/** + * @brief Deinitialises Service Adaptor D-Bus client internal structures. + * + * Deinitialises Service Adaptor D-Bus client internal structures. + */ +static service_adaptor_error_e _dbus_client_stop() +{ + SAL_FN_CALL; + + if (NULL != interface_proxy) + { + g_object_unref(interface_proxy); + interface_proxy = NULL; + } + + if (NULL != connection) + { + g_object_unref(connection); + connection = NULL; + } + + if (0 != watcher_id) + { + g_bus_unwatch_name(watcher_id); + watcher_id = 0; + } + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +/** + * @brief Service Adaptor availability callback function. + * + * Service Adaptor availability callback function. Called when Service Adaptor appears at D-Bus bus. + * @param connection D-Bus connection. + * @param name The name being watched. + * @param name_owner Unique name of the owner of the name being watched. + * @param user_data User data passed to g_bus_watch_name(). + */ +static void _on_name_appeared(GDBusConnection *connection, + const gchar *name, + const gchar *name_owner, + gpointer user_data) +{ + SAL_FN_CALL; + + dbus_client_thread_data_h thread_data = (dbus_client_thread_data_h) user_data; + + if (NULL != thread_data) + { + g_mutex_lock(&thread_data->connection_mutex); + thread_data->connection_cond_signaled = 1; + g_cond_signal(&thread_data->connection_cond); + g_mutex_unlock(&thread_data->connection_mutex); + } +} + +/** + * @brief Service Adaptor availability callback function. + * + * Service Adaptor availability callback function. Called when Service Adaptor disappears from D-Bus bus. + * @param connection D-Bus connection. + * @param name he name being watched. + * @param user_data User data passed to g_bus_watch_name(). + */ +static void _on_name_vanished(GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + SAL_FN_CALL; + + if (NULL != interface_proxy) + { + g_object_unref(interface_proxy); + interface_proxy = NULL; + } + + if (NULL != connection) + { + g_object_unref(connection); + connection = NULL; + } + + if (0 != watcher_id) + { + g_bus_unwatch_name(watcher_id); + watcher_id = 0; + } +} + +/** + * @brief Service Adaptor signals handler. + * + * Service Adaptor signals handler. It is called when Service Adaptor sends signal over D-Bus. + * @param proxy D-Bus proxy object. + * @param sender_name The unique bus name of the remote caller. + * @param signal_name Signal name. + * @param parameters Signal parameters. + * @param user_data The user_data gpointer. + */ +static void _on_signal(GDBusProxy *proxy, + gchar *sender_name, + gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + SAL_FN_CALL; + + if (0 == strncmp(signal_name, DBUS_SERVICE_ADAPTOR, DBUS_NAME_LENGTH)) + { + // TODO: +/* + on_service_signal(proxy, + sender_name, + signal_name, + parameters, + user_data); +*/ + } +} + +//****************************************************************************** +//* Public interface definition +//****************************************************************************** + +API service_adaptor_error_e sal_ipc_client_get_interface(GDBusProxy **interface) +{ + SAL_FN_CALL; + + *interface = interface_proxy; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API service_adaptor_error_e sal_ipc_client_init() +{ + SAL_FN_CALL; + +#if !GLIB_CHECK_VERSION(2,32,0) + g_thread_init(NULL); +#endif +#if !GLIB_CHECK_VERSION(2,35,0) + g_type_init(); +#endif + + RETVM_IF(NULL != dbus_client_thread, SERVICE_ADAPTOR_ERROR_INTERNAL, "D-Bus client thread is already running"); + + dbus_client_thread_data_h thread_data = + (dbus_client_thread_data_h) malloc(sizeof(dbus_client_thread_data_s)); + + g_mutex_init(&thread_data->connection_mutex); + g_cond_init(&thread_data->connection_cond); + thread_data->connection_cond_signaled = 0; + + dbus_client_thread = g_thread_new("Service Adaptor D-Bus Client", _dbus_client_thread_func, thread_data); + + gint64 timeout = g_get_monotonic_time() + 5 * G_TIME_SPAN_SECOND; + g_mutex_lock(&thread_data->connection_mutex ); + while (!thread_data->connection_cond_signaled) + { + if (!g_cond_wait_until(&thread_data->connection_cond, &thread_data->connection_mutex, timeout)) + { + g_mutex_unlock(&thread_data->connection_mutex); + return SERVICE_ADAPTOR_ERROR_INTERNAL; + } + } + + g_mutex_unlock(&thread_data->connection_mutex); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API service_adaptor_error_e sal_ipc_client_deinit() +{ + SAL_FN_CALL; + + if (NULL != dbus_client_loop) + { + if (g_main_loop_is_running(dbus_client_loop)) + { + g_main_loop_quit(dbus_client_loop); + } + } + + if (NULL != dbus_client_thread) + { + g_thread_join(dbus_client_thread); + dbus_client_thread = NULL; + } + + if (NULL != dbus_client_loop) + { + g_main_loop_unref(dbus_client_loop); + dbus_client_loop = NULL; + } + + if (NULL != dbus_client_context) + { + g_main_context_pop_thread_default(dbus_client_context); + g_main_context_unref(dbus_client_context); + dbus_client_context = NULL; + } + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int sal_ipc_client_call_request(const char *request_method, GVariant *request_data, const char *reply_type, GVariant **reply_info) +{ + GError *error = NULL; + GVariant *reply = NULL; + int ret = SERVICE_ADAPTOR_ERROR_NONE; + + GDBusProxy *interface_proxy = NULL; + ret = sal_ipc_client_get_interface(&interface_proxy); + RETV_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_INTERNAL); + + reply = g_dbus_proxy_call_sync(interface_proxy, + request_method, + request_data, + G_DBUS_CALL_FLAGS_NONE, + G_MAXINT, + NULL, + &error); + + RETVM_IF(NULL == reply, SERVICE_ADAPTOR_ERROR_INTERNAL, "IPC Request Failed: %s", error->message); + RETV_IF(false == g_variant_is_of_type(reply, (GVariantType *) ipc_make_return_type(reply_type)), SERVICE_ADAPTOR_ERROR_INTERNAL); + + *reply_info = reply; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + diff --git a/common/ipc-client/sal_ipc_client.h b/common/ipc-client/sal_ipc_client.h new file mode 100644 index 0000000..b88fd99 --- /dev/null +++ b/common/ipc-client/sal_ipc_client.h @@ -0,0 +1,52 @@ +/* + * Service Adaptor Client IPC + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Yongjin Kim + * Jinhyeong Ahn + * Jiwon Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_CONVERGENCE_SAL_IPC_CLIENT_H__ +#define __TIZEN_CONVERGENCE_SAL_IPC_CLIENT_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include +#include + +#include "service_adaptor_errors.h" +#include "sal_ipc.h" + +service_adaptor_error_e sal_ipc_client_init(); +service_adaptor_error_e sal_ipc_client_deinit(); +service_adaptor_error_e sal_ipc_client_get_interface(GDBusProxy **interface); +int sal_ipc_client_call_request(const char *request_method, GVariant *request_data, const char *reply_type, GVariant **reply_info); + +#ifdef __cplusplus +} +#endif + +#endif /* __TIZEN_CONVERGENCE_SAL_IPC_CLIENT_H__ */ + diff --git a/common/ipc-client/sal_ipc_client_auth.c b/common/ipc-client/sal_ipc_client_auth.c new file mode 100644 index 0000000..051837d --- /dev/null +++ b/common/ipc-client/sal_ipc_client_auth.c @@ -0,0 +1,112 @@ +/* + * Service Adaptor IPC Client + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include + +#include "service_adaptor_errors.h" +#include "service_adaptor_internal.h" +#include "sal_ipc_client.h" +#include "sal_ipc_client_auth.h" +#include "sal_service_auth.h" +#include "sal_service_auth_internal.h" + +//****************************************************************************** +//* Global variables and defines +//****************************************************************************** + +//****************************************************************************** +//* Private interface +//****************************************************************************** + +//****************************************************************************** +//* Private interface definition +//****************************************************************************** + +int _get_oauth1(GVariant *reply_info, service_auth_oauth1_h *oauth1) +{ + service_auth_oauth1_h auth_oauth1 = (service_auth_oauth1_h) g_malloc0(sizeof(service_auth_oauth1_s)); + + int info_size = service_auth_oauth1_res_s_type_length; + GVariant *info[info_size]; + ipc_create_variant_info(reply_info, info_size, (GVariant ***) &info); + + int idx = 0; + int auth_info_size = service_auth_oauth1_s_type_length; + GVariant *auth_info[auth_info_size]; + ipc_create_variant_info(info[idx++], auth_info_size, (GVariant ***) &auth_info); + + int idx2 = 0; + auth_oauth1->access_token = ipc_insure_g_variant_dup_string(auth_info[idx2++]); + auth_oauth1->operation = ipc_insure_g_variant_dup_string(auth_info[idx2++]); + + ipc_destroy_variant_info(auth_info, auth_info_size); + + ipc_destroy_variant_info(info, info_size); + + *oauth1 = auth_oauth1; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +//****************************************************************************** +//* Public interface definition +//****************************************************************************** + +API int ipc_service_auth_oauth1(const char *uri, service_auth_oauth1_h req_oauth1, service_auth_oauth1_h *res_oauth1) +{ + SAL_FN_CALL; + + RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == req_oauth1, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + int ret = SERVICE_ADAPTOR_ERROR_NONE; + + char *request_method = DBUS_SERVICE_AUTH_OAUTH1_METHOD; + GVariant *request_data = g_variant_new("(" service_auth_oauth1_req_s_type ")", uri, SAL_IPC_STR(req_oauth1->access_token), SAL_IPC_STR(req_oauth1->operation)); + + char *reply_type = service_auth_oauth1_res_s_type; + int reply_size = RETURN_LENGTH + 1; + GVariant *reply = NULL; + + ret = sal_ipc_client_call_request(request_method, request_data, reply_type, &reply); + RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, ret, "ipc_client_call_request() Failed(%d)", ret); + + GVariant *reply_info[reply_size]; + ipc_create_variant_info(reply, reply_size, (GVariant ***) &reply_info); + + int idx = 0; + service_auth_oauth1_h oauth1 = NULL; + _get_oauth1(reply_info[idx++], &oauth1); + + int ipc_ret = g_variant_get_int32(reply_info[idx++]); + char *ipc_msg = ipc_insure_g_variant_dup_string(reply_info[idx++]); + + ipc_destroy_variant_info(reply_info, reply_size); + + g_variant_unref(reply); + + RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ipc_ret, SERVICE_ADAPTOR_ERROR_INTERNAL, "IPC Result Failed(%d): %s", ipc_ret, ipc_msg); + + *res_oauth1 = oauth1; + + SAL_FREE(ipc_msg); + + return SERVICE_ADAPTOR_ERROR_NONE; +} diff --git a/common/ipc-client/sal_ipc_client_auth.h b/common/ipc-client/sal_ipc_client_auth.h new file mode 100644 index 0000000..56b553f --- /dev/null +++ b/common/ipc-client/sal_ipc_client_auth.h @@ -0,0 +1,45 @@ +/* + * Service Adaptor Client Auth IPC + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Yongjin Kim + * Jinhyeong Ahn + * Jiwon Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_CONVERGENCE_SAL_IPC_CLIENT_AUTH_H__ +#define __TIZEN_CONVERGENCE_SAL_IPC_CLIENT_AUTH_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "sal_service_auth.h" + +int ipc_service_auth_oauth1(const char *uri, service_auth_oauth1_h req_oauth1, service_auth_oauth1_h *res_oauth1); + +#ifdef __cplusplus +} +#endif + +#endif /* __TIZEN_CONVERGENCE_SAL_IPC_CLIENT_AUTH_H__ */ + diff --git a/common/ipc-client/sal_ipc_client_core.c b/common/ipc-client/sal_ipc_client_core.c new file mode 100644 index 0000000..8759940 --- /dev/null +++ b/common/ipc-client/sal_ipc_client_core.c @@ -0,0 +1,208 @@ +/* + * Service Adaptor IPC Client + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include + +#include "service_adaptor_errors.h" +#include "service_adaptor_internal.h" +#include "sal_ipc_client.h" +#include "sal_ipc_client_core.h" + +//****************************************************************************** +//* Global variables and defines +//****************************************************************************** + +//****************************************************************************** +//* Private interface +//****************************************************************************** + +//****************************************************************************** +//* Private interface definition +//****************************************************************************** + +//****************************************************************************** +//* Public interface definition +//****************************************************************************** + +API int ipc_service_adaptor_connect(const char *uri, GList **plugins) +{ + SAL_FN_CALL; + + RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + int ret = SERVICE_ADAPTOR_ERROR_NONE; + + char *request_method = DBUS_SERVICE_ADAPTOR_CONNECT_METHOD; + GVariant *request_data = g_variant_new("(" service_adaptor_connect_req_s_type ")", uri); + + char *reply_type = service_adaptor_connect_res_s_type; + int reply_size = RETURN_LENGTH + 1; + GVariant *reply = NULL; + + ret = sal_ipc_client_call_request(request_method, request_data, reply_type, &reply); + RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, ret, "ipc_client_call_request() Failed(%d)", ret); + + GVariant *reply_info[reply_size]; + ipc_create_variant_info(reply, reply_size, (GVariant ***) &reply_info); + + int idx = 0; + int info_size = service_adaptor_connect_res_s_type_length; + GVariant *info[info_size]; + ipc_create_variant_info(reply_info[idx++], info_size, (GVariant ***) &info); + + int idx2 = 0; + GList *plugin_list = NULL; + gsize uri_info_size = g_variant_n_children(info[idx2]); + + for (gsize i = 0; i < uri_info_size; i++) + { + GVariant *uri_info_struct; + GVariant *uri_info_entry_v = g_variant_get_child_value(info[idx2], i); + uri_info_struct = g_variant_get_child_value(uri_info_entry_v, 0); + + plugin_list = g_list_append(plugin_list, ipc_insure_g_variant_dup_string(uri_info_struct)); + + g_variant_unref(uri_info_struct); + } + + *plugins = plugin_list; + + int ipc_ret = g_variant_get_int32(reply_info[idx++]); + char *ipc_msg = ipc_insure_g_variant_dup_string(reply_info[idx++]); + + ipc_destroy_variant_info(reply_info, reply_size); + + g_variant_unref(reply); + + RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ipc_ret, SERVICE_ADAPTOR_ERROR_INTERNAL, "IPC Result Failed(%d): %s", ipc_ret, ipc_msg); + + SAL_FREE(ipc_msg); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int ipc_service_adaptor_disconnect(const char *uri) +{ + SAL_FN_CALL; + + RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + int ret = SERVICE_ADAPTOR_ERROR_NONE; + + char *request_method = DBUS_SERVICE_ADAPTOR_DISCONNECT_METHOD; + GVariant *request_data = g_variant_new("(" service_adaptor_disconnect_s_type ")", uri); + + char *reply_type = NULL; + int reply_size = RETURN_LENGTH; + GVariant *reply = NULL; + + ret = sal_ipc_client_call_request(request_method, request_data, reply_type, &reply); + RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, ret, "ipc_client_call_request() Failed(%d)", ret); + + GVariant *reply_info[reply_size]; + ipc_create_variant_info(reply, reply_size, (GVariant ***) &reply_info); + + int idx = 0; + int ipc_ret = g_variant_get_int32(reply_info[idx++]); + char *ipc_msg = ipc_insure_g_variant_dup_string(reply_info[idx++]); + + ipc_destroy_variant_info(reply_info, reply_size); + + g_variant_unref(reply); + + RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ipc_ret, SERVICE_ADAPTOR_ERROR_INTERNAL, "IPC Result Failed(%d): %s", ipc_ret, ipc_msg); + + SAL_FREE(ipc_msg); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int ipc_service_plugin_create(const char *uri) +{ + SAL_FN_CALL; + + RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + int ret = SERVICE_ADAPTOR_ERROR_NONE; + + char *request_method = DBUS_SERVICE_PLUGIN_CREATE_METHOD; + GVariant *request_data = g_variant_new("(" service_plugin_create_s_type ")", uri); + + char *reply_type = NULL; + int reply_size = RETURN_LENGTH; + GVariant *reply = NULL; + + ret = sal_ipc_client_call_request(request_method, request_data, reply_type, &reply); + RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, ret, "ipc_client_call_request() Failed(%d)", ret); + + GVariant *reply_info[reply_size]; + ipc_create_variant_info(reply, reply_size, (GVariant ***) &reply_info); + + int idx = 0; + int ipc_ret = g_variant_get_int32(reply_info[idx++]); + char *ipc_msg = ipc_insure_g_variant_dup_string(reply_info[idx++]); + + ipc_destroy_variant_info(reply_info, reply_size); + + g_variant_unref(reply); + + RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ipc_ret, SERVICE_ADAPTOR_ERROR_INTERNAL, "IPC Result Failed(%d): %s", ipc_ret, ipc_msg); + + SAL_FREE(ipc_msg); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API int ipc_service_plugin_destroy(const char *uri) +{ + SAL_FN_CALL; + + RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + int ret = SERVICE_ADAPTOR_ERROR_NONE; + + char *request_method = DBUS_SERVICE_PLUGIN_DESTROY_METHOD; + GVariant *request_data = g_variant_new("(" service_plugin_destroy_s_type ")", uri); + + char *reply_type = NULL; + int reply_size = RETURN_LENGTH; + GVariant *reply = NULL; + + ret = sal_ipc_client_call_request(request_method, request_data, reply_type, &reply); + RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, ret, "ipc_client_call_request() Failed(%d)", ret); + + GVariant *reply_info[reply_size]; + ipc_create_variant_info(reply, reply_size, (GVariant ***) &reply_info); + + int idx = 0; + int ipc_ret = g_variant_get_int32(reply_info[idx++]); + char *ipc_msg = ipc_insure_g_variant_dup_string(reply_info[idx++]); + + ipc_destroy_variant_info(reply_info, reply_size); + + g_variant_unref(reply); + + RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ipc_ret, SERVICE_ADAPTOR_ERROR_INTERNAL, "IPC Result Failed(%d): %s", ipc_ret, ipc_msg); + + SAL_FREE(ipc_msg); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + diff --git a/common/ipc-client/sal_ipc_client_core.h b/common/ipc-client/sal_ipc_client_core.h new file mode 100644 index 0000000..a4f1ea3 --- /dev/null +++ b/common/ipc-client/sal_ipc_client_core.h @@ -0,0 +1,49 @@ +/* + * Service Adaptor Client Core IPC + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Yongjin Kim + * Jinhyeong Ahn + * Jiwon Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_CONVERGENCE_SAL_IPC_CLIENT_CORE_H__ +#define __TIZEN_CONVERGENCE_SAL_IPC_CLIENT_CORE_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include + +int ipc_service_adaptor_connect(const char *uri, GList **plugins); +int ipc_service_adaptor_disconnect(const char *uri); +int ipc_service_plugin_create(const char *uri); +int ipc_service_plugin_destroy(const char *uri); + + +#ifdef __cplusplus +} +#endif + +#endif /* __TIZEN_CONVERGENCE_SAL_IPC_CLIENT_CORE_H__ */ + diff --git a/common/ipc-client/sal_ipc_client_storage.c b/common/ipc-client/sal_ipc_client_storage.c new file mode 100644 index 0000000..5dd6dfe --- /dev/null +++ b/common/ipc-client/sal_ipc_client_storage.c @@ -0,0 +1,131 @@ +/* + * Service Adaptor IPC Client + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include + +#include "service_adaptor_errors.h" +#include "service_adaptor_internal.h" +#include "sal_ipc_client.h" +#include "sal_ipc_client_storage.h" +#include "sal_service_storage.h" +#include "sal_service_storage_internal.h" + +//****************************************************************************** +//* Global variables and defines +//****************************************************************************** + +//****************************************************************************** +//* Private interface +//****************************************************************************** + +//****************************************************************************** +//* Private interface definition +//****************************************************************************** + +int _get_cloud_file(GVariant *reply_info, service_storage_cloud_file_h *file) +{ + service_storage_cloud_file_h cloud_file = (service_storage_cloud_file_h) g_malloc0(sizeof(service_storage_cloud_file_s)); + + int info_size = service_storage_cloud_file_res_s_type_length; + GVariant *info[info_size]; + ipc_create_variant_info(reply_info, info_size, (GVariant ***) &info); + + int idx = 0; + int file_info_size = service_storage_cloud_file_s_type_length; + GVariant *file_info[file_info_size]; + ipc_create_variant_info(info[idx++], file_info_size, (GVariant ***) &file_info); + + int idx2 = 0; + cloud_file->is_dir = g_variant_get_boolean(file_info[idx2++]); + cloud_file->dir_path = ipc_insure_g_variant_dup_string(file_info[idx2++]); + cloud_file->local_path = ipc_insure_g_variant_dup_string(file_info[idx2++]); + cloud_file->cloud_path = ipc_insure_g_variant_dup_string(file_info[idx2++]); + cloud_file->size = g_variant_get_uint64(file_info[idx2++]); + cloud_file->operation = ipc_insure_g_variant_dup_string(file_info[idx2++]); + + ipc_destroy_variant_info(file_info, file_info_size); + + gsize files_size = g_variant_n_children(info[idx]); + + for (gsize i = 0; i < files_size; i++) + { + GVariant *files_struct; + GVariant *files_entry_v = g_variant_get_child_value(info[idx], i); + files_struct = g_variant_get_child_value(files_entry_v, 0); + + cloud_file->files = g_list_append(cloud_file->files, ipc_insure_g_variant_dup_string(files_struct)); + + g_variant_unref(files_struct); + } + + ipc_destroy_variant_info(info, info_size); + + // TODO: reorder files because it is just serialized. it makes tree structure. + + *file = cloud_file; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +//****************************************************************************** +//* Public interface definition +//****************************************************************************** + +API int ipc_service_storage_cloud_file(const char *uri, service_storage_cloud_file_h req_file, service_storage_cloud_file_h *res_file) +{ + SAL_FN_CALL; + + RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == req_file, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + int ret = SERVICE_ADAPTOR_ERROR_NONE; + + char *request_method = DBUS_SERVICE_STORAGE_CLOUD_FILE_METHOD; + GVariant *request_data = g_variant_new("(" service_storage_cloud_file_req_s_type ")", uri, req_file->is_dir, SAL_IPC_STR(req_file->dir_path), SAL_IPC_STR(req_file->local_path), SAL_IPC_STR(req_file->cloud_path), req_file->size, SAL_IPC_STR(req_file->operation)); + + char *reply_type = service_storage_cloud_file_res_s_type; + int reply_size = RETURN_LENGTH + 1; + GVariant *reply = NULL; + + ret = sal_ipc_client_call_request(request_method, request_data, reply_type, &reply); + RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, ret, "ipc_client_call_request() Failed(%d)", ret); + + GVariant *reply_info[reply_size]; + ipc_create_variant_info(reply, reply_size, (GVariant ***) &reply_info); + + int idx = 0; + service_storage_cloud_file_h cloud_file = NULL; + _get_cloud_file(reply_info[idx++], &cloud_file); + + int ipc_ret = g_variant_get_int32(reply_info[idx++]); + char *ipc_msg = ipc_insure_g_variant_dup_string(reply_info[idx++]); + + ipc_destroy_variant_info(reply_info, reply_size); + + g_variant_unref(reply); + + RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ipc_ret, SERVICE_ADAPTOR_ERROR_INTERNAL, "IPC Result Failed(%d): %s", ipc_ret, ipc_msg); + + *res_file = cloud_file; + + SAL_FREE(ipc_msg); + + return SERVICE_ADAPTOR_ERROR_NONE; +} diff --git a/common/ipc-client/sal_ipc_client_storage.h b/common/ipc-client/sal_ipc_client_storage.h new file mode 100644 index 0000000..ed25d22 --- /dev/null +++ b/common/ipc-client/sal_ipc_client_storage.h @@ -0,0 +1,45 @@ +/* + * Service Adaptor Client Storage IPC + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Yongjin Kim + * Jinhyeong Ahn + * Jiwon Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_CONVERGENCE_SAL_IPC_CLIENT_STORAGE_H__ +#define __TIZEN_CONVERGENCE_SAL_IPC_CLIENT_STORAGE_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "sal_service_storage.h" + +int ipc_service_storage_cloud_file(const char *uri, service_storage_cloud_file_h req_file, service_storage_cloud_file_h *res_file); + +#ifdef __cplusplus +} +#endif + +#endif /* __TIZEN_CONVERGENCE_SAL_IPC_CLIENT_STORAGE_H__ */ + diff --git a/common/ipc-server/sal_ipc_server.c b/common/ipc-server/sal_ipc_server.c new file mode 100644 index 0000000..e4a9fbe --- /dev/null +++ b/common/ipc-server/sal_ipc_server.c @@ -0,0 +1,517 @@ +/* + * Service Adaptor IPC Server + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include + +#include "service_adaptor_errors.h" +#include "service_adaptor_internal.h" +#include "sal_ipc.h" +#include "sal_ipc_server_core.h" +#include "sal_ipc_server_auth.h" +#include "sal_ipc_server_storage.h" + +//****************************************************************************** +//* Global variables and defines +//****************************************************************************** + +/** + * D-Bus server thread + */ +static GThread* dbus_server_thread = NULL; + +/** + * D-Bus server thread main loop context + */ +static GMainContext* dbus_server_context = NULL; + +/** + * D-Bus server thread main loop + */ +static GMainLoop* dbus_server_loop = NULL; + +/** + * D-Bus server thread pool + */ +static GThreadPool *thread_pool = NULL; + +/** + * Compiled introspection data describing D-Bus interface + */ +static GDBusNodeInfo *introspection_data = NULL; + +/** + * D-Bus server owner id + */ +static guint owner_id = 0; + +/** + * D-Bus connection used by server + */ +static GDBusConnection *dbus_connection = NULL; + +/** + * Introspection data describing D-Bus interface + */ +static const gchar introspection_xml[] = +"" +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +""; + +/** + * information for method call + */ +typedef struct _method_call_s +{ + GDBusConnection *connection; + gchar *sender; + gchar *object_path; + gchar *interface_name; + gchar *method_name; + GVariant *parameters; + GDBusMethodInvocation *invocation; + gpointer user_data; +} method_call_s; +typedef struct _method_call_s *method_call_h; + +//****************************************************************************** +//* Private interface +//****************************************************************************** + +//****************************************************************************** +//* Private interface definition +//****************************************************************************** + +static void _method_call_async_func(gpointer data, gpointer user_data) +{ + SAL_FN_CALL; + + method_call_h handle = data; + + RET_IF(NULL == handle); + + SAL_INFO("Call %s", handle->method_name); + + if (0 == strncmp(handle->method_name, DBUS_SERVICE_ADAPTOR, DBUS_NAME_LENGTH)) + { + service_adaptor_method_call(handle->connection, + handle->sender, + handle->object_path, + handle->interface_name, + handle->method_name, + handle->parameters, + handle->invocation, + handle->user_data); + } + else if (0 == strncmp(handle->method_name, DBUS_SERVICE_PLUGIN, DBUS_NAME_LENGTH)) + { + service_plugin_method_call(handle->connection, + handle->sender, + handle->object_path, + handle->interface_name, + handle->method_name, + handle->parameters, + handle->invocation, + handle->user_data); + } + else if (0 == strncmp(handle->method_name, DBUS_SERVICE_AUTH, DBUS_NAME_LENGTH)) + { + service_auth_method_call(handle->connection, + handle->sender, + handle->object_path, + handle->interface_name, + handle->method_name, + handle->parameters, + handle->invocation, + handle->user_data); + } + else if (0 == strncmp(handle->method_name, DBUS_SERVICE_STORAGE, DBUS_NAME_LENGTH)) + { + service_storage_method_call(handle->connection, + handle->sender, + handle->object_path, + handle->interface_name, + handle->method_name, + handle->parameters, + handle->invocation, + handle->user_data); + } +} + +/** + * @brief Service Adaptor D-Bus interface method call handler. + * + * Service Adaptor D-Bus interface method call handler. Called when client calls some function defined in + * Service Adaptor D-Bus interface. + * @param connection A GDBusConnection. + * @param sender The unique bus name of the remote caller. + * @param object_path The object path that the method was invoked on. + * @param interface_name The D-Bus interface name the method was invoked on. + * @param method_name The name of the method that was invoked. + * @param parameters A GVariant tuple with parameters. + * @param invocation A GDBusMethodInvocation object that can be used to return a value or error. + * @param user_data The user_data gpointer passed to g_dbus_connection_register_object(). + */ +static void _handle_method_call(GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + SAL_FN_CALL; + + method_call_h handle = (method_call_h) g_malloc0(sizeof(method_call_s)); + + handle->connection = connection; + handle->sender = (gchar *) sender; + handle->object_path = (gchar *) object_path; + handle->interface_name = (gchar *) interface_name; + handle->method_name = (gchar *) method_name; + handle->parameters = parameters; + handle->invocation = invocation; + handle->user_data = user_data; + + g_thread_pool_push(thread_pool, (gpointer) handle, NULL); +} + +/** + * @brief Service Adaptor D-Bus interface get property call handler. + * + * Service Adaptor D-Bus interface get property call handler. + * @param connection A GDBusConnection. + * @param sender The unique bus name of the remote caller. + * @param object_path The object path that the method was invoked on. + * @param interface_name The D-Bus interface name for the property. + * @param property_name The name of the property to get the value of. + * @param error Return location for error. + * @param user_data The user_data gpointer passed to g_dbus_connection_register_object(). + * @return A GVariant with the value for property_name or NULL if error is set. If the returned GVariant + * is floating, it is consumed - otherwise its reference count is decreased by one. + */ +static GVariant *_handle_get_property(GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GError **error, + gpointer user_data) +{ + SAL_FN_CALL; + + GVariant *ret = NULL; + + return ret; +} + +/** + * @brief Service Adaptor D-Bus interface set property call handler. + * + * Service Adaptor D-Bus interface set property call handler. + * @param connection A GDBusConnection. + * @param sender The unique bus name of the remote caller. + * @param object_path The object path that the method was invoked on. + * @param interface_name The D-Bus interface name for the property. + * @param property_name The name of the property to get the value of. + * @param value The value to set the property to. + * @param error Return location for error. + * @param user_data The user_data gpointer passed to g_dbus_connection_register_object(). + * @return TRUE if the property was set to value, FALSE if error is set. + */ +static gboolean _handle_set_property(GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GVariant *value, + GError **error, + gpointer user_data) +{ + SAL_FN_CALL; + + gboolean ret = false; + + if (NULL == *error) + { + ret = true; + } + + return ret; +} + +/** + * D-Bus handlers vtable. + */ +static const GDBusInterfaceVTable interface_vtable = +{ + _handle_method_call, + _handle_get_property, + _handle_set_property +}; + +/** + * @brief Callback function called when D-Bus bus name for Service Adaptor D-Bus server is acquired. + * + * Callback function called when D-Bus bus name for Service Adaptor D-Bus server is acquired. + * @param connection The GDBusConnection to a message bus. + * @param name The name that is requested to be owned. + * @param user_data User data passed to g_bus_own_name(). + */ +static void _on_bus_acquired(GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + SAL_FN_CALL; + + guint registration_id; + + registration_id = g_dbus_connection_register_object(connection, + SERVICE_ADAPTOR_OBJECT_PATH, + introspection_data->interfaces[0], + &interface_vtable, + NULL, /* user_data */ + NULL, /* user_data_free_func */ + NULL); /* GError** */ + + g_assert(registration_id > 0); +} + +/** + * @brief Callback function called when D-Bus name for Service Adaptor D-Bus server is acquired. + * + * Callback function called when D-Bus name for Service Adaptor D-Bus server is acquired. + * @param connection The GDBusConnection on which to acquired the name. + * @param name The name being owned. + * @param user_data User data passed to g_bus_own_name() or g_bus_own_name_on_connection(). + */ +static void _on_name_acquired(GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + SAL_FN_CALL; + + dbus_connection = connection; + g_object_ref(dbus_connection); +} + +/** + * @brief Callback function called when the Service Adaptor D-Bus name is lost or connection has been closed. + * + * Callback function called when the Service Adaptor D-Bus name is lost or connection has been closed. + * @param connection The GDBusConnection on which to acquire the name or NULL if the connection was disconnected. + * @param name The name being owned. + * @param user_data User data passed to g_bus_own_name() or g_bus_own_name_on_connection(). + */ +static void _on_name_lost(GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + SAL_FN_CALL; + + if (NULL != dbus_connection) + { + g_object_unref(dbus_connection); + dbus_connection = NULL; + } + + SAL_INFO("Unexpected D-bus bus name lost"); + + // Send SIGINT to main thread to stop File Manager process and cleanly close Service Adaptor + kill(getpid(), SIGINT); +} + +service_adaptor_error_e _sal_ipc_server_start() +{ + SAL_FN_CALL; + + RETV_IF(NULL != introspection_data, SERVICE_ADAPTOR_ERROR_INTERNAL); + RETV_IF(0 != owner_id, SERVICE_ADAPTOR_ERROR_INTERNAL); + + introspection_data = g_dbus_node_info_new_for_xml(introspection_xml, NULL); + RETVM_IF(NULL == introspection_data, SERVICE_ADAPTOR_ERROR_INTERNAL, "g_dbus_node_info_new_for_xml() Failed"); + + thread_pool = g_thread_pool_new(_method_call_async_func, NULL, -1, FALSE, NULL); + RETVM_IF(NULL == thread_pool, SERVICE_ADAPTOR_ERROR_SYSTEM, "g_thread_pool_new() Failed"); + + owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM, + SERVICE_ADAPTOR_BUS_NAME, + G_BUS_NAME_OWNER_FLAGS_NONE, + _on_bus_acquired, + _on_name_acquired, + _on_name_lost, + NULL, + NULL); + + if (0 == owner_id) + { + g_dbus_node_info_unref(introspection_data); + introspection_data = NULL; + + return SERVICE_ADAPTOR_ERROR_SYSTEM; + } + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +service_adaptor_error_e _sal_ipc_server_stop() +{ + SAL_FN_CALL; + + if (NULL != thread_pool) + { + g_thread_pool_free(thread_pool, TRUE, TRUE); + } + + if (0 != owner_id) + { + g_bus_unown_name(owner_id); + owner_id = 0; + } + + if (NULL != introspection_data) + { + g_dbus_node_info_unref(introspection_data); + introspection_data = NULL; + } + + return SERVICE_ADAPTOR_ERROR_NONE; +} +/** + * @brief D-Bus server thread function. + * + * D-Bus server thread function. It initialises structures and callbacks needed to export D-Bus interfaces. + * @param data Data passed to thread. + * @return Result data from thread (always NULL in this implementation). + */ +static gpointer _dbus_server_thread_func(gpointer data) +{ + SAL_FN_CALL; + + int ret = 0; + + dbus_server_context = g_main_context_new(); + dbus_server_loop = g_main_loop_new(dbus_server_context, FALSE); + g_main_context_push_thread_default(dbus_server_context); + + ret = _sal_ipc_server_start(); + + if (SERVICE_ADAPTOR_ERROR_NONE == ret) + { + g_main_loop_run(dbus_server_loop); + } + + _sal_ipc_server_stop(); + + g_main_context_pop_thread_default(dbus_server_context); + g_main_loop_unref(dbus_server_loop); + dbus_server_loop = NULL; + g_main_context_unref(dbus_server_context); + dbus_server_context = NULL; + + return NULL; +} + +//****************************************************************************** +//* Public interface definition +//****************************************************************************** + +API service_adaptor_error_e sal_ipc_server_init() +{ + SAL_FN_CALL; + + RETVM_IF(NULL != dbus_server_thread, SERVICE_ADAPTOR_ERROR_INTERNAL, "IPC server thread is already running"); + + dbus_server_thread = g_thread_new("IPC Server", _dbus_server_thread_func, NULL); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API service_adaptor_error_e sal_ipc_server_deinit() +{ + SAL_FN_CALL; + + if (NULL != dbus_server_loop) + { + if (g_main_loop_is_running(dbus_server_loop)) + { + g_main_loop_quit(dbus_server_loop); + } + } + + if (NULL != dbus_server_thread) + { + g_thread_join(dbus_server_thread); + dbus_server_thread = NULL; + } + + if (NULL != dbus_server_loop) + { + g_main_loop_unref(dbus_server_loop); + dbus_server_loop = NULL; + } + + if (NULL != dbus_server_context) + { + g_main_context_pop_thread_default(dbus_server_context); + g_main_context_unref(dbus_server_context); + dbus_server_context = NULL; + } + + return SERVICE_ADAPTOR_ERROR_NONE; +} diff --git a/common/ipc/sal_ipc.h b/common/ipc-server/sal_ipc_server.h similarity index 76% rename from common/ipc/sal_ipc.h rename to common/ipc-server/sal_ipc_server.h index 009d59b..034d98b 100644 --- a/common/ipc/sal_ipc.h +++ b/common/ipc-server/sal_ipc_server.h @@ -1,5 +1,5 @@ /* - * Service Adaptor + * Service Adaptor Server IPC * * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. * @@ -21,8 +21,8 @@ * */ -#ifndef __TIZEN_CONVERGENCE_SAL_IPC_H__ -#define __TIZEN_CONVERGENCE_SAL_IPC_H__ +#ifndef __TIZEN_CONVERGENCE_SAL_IPC_SERVER_H__ +#define __TIZEN_CONVERGENCE_SAL_IPC_SERVER_H__ #ifndef API #define API __attribute__ ((visibility("default"))) @@ -34,12 +34,14 @@ extern "C" #endif #include "service_adaptor_errors.h" +#include "sal_ipc.h" -API service_adaptor_error_e sal_ipc_init_server(); -API service_adaptor_error_e sal_ipc_deinit_server(); +service_adaptor_error_e sal_ipc_server_init(); +service_adaptor_error_e sal_ipc_server_deinit(); #ifdef __cplusplus } #endif -#endif /* __TIZEN_CONVERGENCE_SAL_IPC_H__ */ +#endif /* __TIZEN_CONVERGENCE_SAL_IPC_SERVER_H__ */ + diff --git a/common/ipc-server/sal_ipc_server_auth.c b/common/ipc-server/sal_ipc_server_auth.c new file mode 100644 index 0000000..22a8962 --- /dev/null +++ b/common/ipc-server/sal_ipc_server_auth.c @@ -0,0 +1,175 @@ +/* + * Service Adaptor IPC Server + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include + +#include "service_adaptor_errors.h" +#include "service_adaptor_internal.h" +#include "sal.h" +#include "sal_ipc_server.h" +#include "sal_ipc_server_auth.h" +#include "auth_adaptor.h" +#include "sal_service_auth.h" +#include "sal_service_auth_internal.h" + +//****************************************************************************** +//* Global variables and defines +//****************************************************************************** + +//****************************************************************************** +//* Private interface +//****************************************************************************** + +//****************************************************************************** +//* Private interface definition +//****************************************************************************** + +void _oauth1_get_access_token_cb(int result, oauth1_h oauth1, void *user_data) +{ + SAL_FN_CALL; + + ipc_reply_data_h reply = (ipc_reply_data_h) user_data; + + int ipc_ret = SERVICE_ADAPTOR_ERROR_NONE; + char *ipc_msg = NULL; + GVariant *ipc_data = NULL; + + ipc_create_error_msg(ipc_ret, &ipc_msg); + ipc_data = g_variant_new(ipc_make_return_type(reply->type), SAL_IPC_STR(oauth1->access_token), SAL_IPC_STR(oauth1->operation), ipc_ret, SAL_IPC_STR(ipc_msg)); + g_dbus_method_invocation_return_value(reply->invocation, ipc_data); + + SAL_FREE(ipc_msg); + ipc_free_reply_data(reply); +} + +int _get_oauth1(GVariant *reply_info, service_auth_oauth1_h *oauth1) +{ + SAL_FN_CALL; + + service_auth_oauth1_h auth_oauth1 = (service_auth_oauth1_h) g_malloc0(sizeof(service_auth_oauth1_s)); + + int info_size = service_auth_oauth1_s_type_length; + GVariant *info[info_size]; + ipc_create_variant_info(reply_info, info_size, (GVariant ***) &info); + + int idx = 0; + auth_oauth1->access_token = ipc_insure_g_variant_dup_string(info[idx++]); + auth_oauth1->operation = ipc_insure_g_variant_dup_string(info[idx++]); + + ipc_destroy_variant_info(info, info_size); + + *oauth1 = auth_oauth1; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +int _oauth1_execute_operation(auth_plugin_h plugin, service_auth_oauth1_h oauth1, ipc_reply_data_h reply) +{ + SAL_FN_CALL; + + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == plugin->oauth1, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == oauth1, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + int ret = SERVICE_ADAPTOR_ERROR_NONE; + + if (0 == strcmp(oauth1->operation, SERVICE_AUTH_OAUTH1_0_GET_ACCESS_TOKEN_URI)) + { + ret = plugin->oauth1->oauth1_get_access_token(plugin, _oauth1_get_access_token_cb, reply); + + return ret; + } + else if (0 == strcmp(oauth1->operation, SERVICE_AUTH_OAUTH1_0_GET_EXTRA_DATA_URI)) + { + return ret; + } + + return SERVICE_ADAPTOR_ERROR_INTERNAL; +} + +//****************************************************************************** +//* Public interface definition +//****************************************************************************** + +API void service_auth_method_call(GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + SAL_FN_CALL; + + int ipc_ret = SERVICE_ADAPTOR_ERROR_NONE; + char *ipc_msg = NULL; + char *ipc_type = NULL; + GVariant *ipc_data = NULL; + + char *uri = NULL; + + GVariant *in_parameters = g_variant_get_child_value(parameters, 0); + + if (0 == g_strcmp0(method_name, DBUS_SERVICE_AUTH_OAUTH1_METHOD)) + { + int idx = 0; + int size = service_auth_oauth1_req_s_type_length; + GVariant *req_info[size]; + + ipc_create_variant_info(in_parameters, size, (GVariant ***) &req_info); + + char *uri = ipc_insure_g_variant_dup_string(req_info[idx++]); + service_auth_oauth1_h oauth1 = NULL; + _get_oauth1(req_info[idx++], &oauth1); + + SAL_INFO("uri: %s", uri); + + ipc_ret = SERVICE_ADAPTOR_ERROR_INTERNAL; + ipc_type = strdup(service_auth_oauth1_res_s_type); + + sal_h sal = sal_get_handle(); + TRYVM_IF(NULL == sal, ipc_ret = SERVICE_ADAPTOR_ERROR_INTERNAL, "sal_get_handle() Failed"); + + auth_plugin_h plugin = auth_adaptor_get_plugin(sal->auth, uri); + + ipc_reply_data_h reply = (ipc_reply_data_h) g_malloc0(sizeof(ipc_reply_data_s)); + reply->invocation = invocation; + reply->type = strdup(ipc_type); + + ipc_ret = _oauth1_execute_operation(plugin, oauth1, reply); + TRY_IF(SERVICE_ADAPTOR_ERROR_NONE == ipc_ret, "oauth1_execute_operation() Request Successed"); + + ipc_create_error_msg(ipc_ret, &ipc_msg); + ipc_data = g_variant_new(ipc_make_return_type(ipc_type), SAL_IPC_STR(NULL), SAL_IPC_STR(NULL), ipc_ret, SAL_IPC_STR(ipc_msg)); + + ipc_destroy_variant_info(req_info, size); + } + + g_dbus_method_invocation_return_value(invocation, ipc_data); + +catch: + SAL_FREE(uri); + SAL_FREE(ipc_msg); + SAL_FREE(ipc_type); + + SAL_FN_END; +} diff --git a/common/ipc-server/sal_ipc_server_auth.h b/common/ipc-server/sal_ipc_server_auth.h new file mode 100644 index 0000000..9162034 --- /dev/null +++ b/common/ipc-server/sal_ipc_server_auth.h @@ -0,0 +1,53 @@ +/* + * Service Adaptor Server Auth IPC + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Yongjin Kim + * Jinhyeong Ahn + * Jiwon Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_CONVERGENCE_SAL_IPC_SERVER_AUTH_H__ +#define __TIZEN_CONVERGENCE_SAL_IPC_SERVER_AUTH_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include +#include + +void service_auth_method_call(GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data); + +#ifdef __cplusplus +} +#endif + +#endif /* __TIZEN_CONVERGENCE_SAL_IPC_SERVER_AUTH_H__ */ + diff --git a/common/ipc-server/sal_ipc_server_core.c b/common/ipc-server/sal_ipc_server_core.c new file mode 100644 index 0000000..1f5f471 --- /dev/null +++ b/common/ipc-server/sal_ipc_server_core.c @@ -0,0 +1,238 @@ +/* + * Service Adaptor IPC Server + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include + +#include "service_adaptor_errors.h" +#include "service_adaptor_internal.h" +#include "sal.h" +#include "sal_ipc_server.h" +#include "sal_ipc_server_core.h" + +//****************************************************************************** +//* Global variables and defines +//****************************************************************************** + +//****************************************************************************** +//* Private interface +//****************************************************************************** + +//****************************************************************************** +//* Private interface definition +//****************************************************************************** + +//****************************************************************************** +//* Public interface definition +//****************************************************************************** + +API void service_adaptor_method_call(GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + SAL_FN_CALL; + + int ipc_ret = SERVICE_ADAPTOR_ERROR_NONE; + char *ipc_msg = NULL; + char *ipc_type = NULL; + GVariant *ipc_data = NULL; + + char *uri = NULL; + + GVariant *in_parameters = g_variant_get_child_value(parameters, 0); + + if (0 == g_strcmp0(method_name, DBUS_SERVICE_ADAPTOR_CONNECT_METHOD)) + { + int idx = 0; + int size = service_adaptor_connect_req_s_type_length; + GVariant *req_info[size]; + + ipc_create_variant_info(in_parameters, size, (GVariant ***) &req_info); + + char *uri = ipc_insure_g_variant_dup_string(req_info[idx++]); + + SAL_INFO("uri: %s", uri); + + ipc_type = strdup(service_adaptor_connect_res_s_type); + ipc_ret = sal_adaptor_connect(uri); + + int plugins_size = 0; + char **plugins = NULL; + GVariantBuilder *builder = g_variant_builder_new(G_VARIANT_TYPE(plugin_list_type)); + + ipc_ret = sal_adaptor_get_plugins(&plugins, &plugins_size); + + for (gsize i = 0; i < plugins_size; i++) + { + ipc_insure_g_variant_builder_add_array_string(builder, plugins[i]); + } + + ipc_create_error_msg(ipc_ret, &ipc_msg); + ipc_data = g_variant_new(ipc_make_return_type(ipc_type), builder, ipc_ret, SAL_IPC_STR(ipc_msg)); + + g_variant_builder_unref(builder); + ipc_destroy_variant_info(req_info, size); + } + else if (0 == g_strcmp0(method_name, DBUS_SERVICE_ADAPTOR_DISCONNECT_METHOD)) + { + int idx = 0; + int size = service_adaptor_disconnect_s_type_length; + GVariant *req_info[size]; + + ipc_create_variant_info(in_parameters, size, (GVariant ***) &req_info); + + char *uri = ipc_insure_g_variant_dup_string(req_info[idx++]); + + SAL_INFO("uri: %s", uri); + + ipc_ret = sal_adaptor_disconnect(uri); + + ipc_create_error_msg(ipc_ret, &ipc_msg); + ipc_data = g_variant_new(ipc_make_return_type(ipc_type), ipc_ret, SAL_IPC_STR(ipc_msg)); + + ipc_destroy_variant_info(req_info, size); + } + + g_dbus_method_invocation_return_value(invocation, ipc_data); + + SAL_FREE(uri); + SAL_FREE(ipc_msg); + SAL_FREE(ipc_type); + + SAL_FN_END; +} + +API void service_plugin_method_call(GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + SAL_FN_CALL; + + int ipc_ret = SERVICE_ADAPTOR_ERROR_NONE; + char *ipc_msg = NULL; + char *ipc_type = NULL; + GVariant *ipc_data = NULL; + + char *uri = NULL; + + GVariant *in_parameters = g_variant_get_child_value(parameters, 0); + + if (0 == g_strcmp0(method_name, DBUS_SERVICE_PLUGIN_CREATE_METHOD)) + { + int idx = 0; + int size = service_plugin_create_s_type_length; + GVariant *req_info[size]; + + ipc_create_variant_info(in_parameters, size, (GVariant ***) &req_info); + + char *uri = ipc_insure_g_variant_dup_string(req_info[idx++]); + + SAL_INFO("uri: %s", uri); + + ipc_ret = SERVICE_ADAPTOR_ERROR_INTERNAL; + + sal_h sal = sal_get_handle(); + + if (NULL != sal) + { + ipc_ret = auth_adaptor_ref_plugin(sal->auth, uri); + } + + ipc_create_error_msg(ipc_ret, &ipc_msg); + ipc_data = g_variant_new(ipc_make_return_type(ipc_type), ipc_ret, SAL_IPC_STR(ipc_msg)); + + ipc_destroy_variant_info(req_info, size); + } + else if (0 == g_strcmp0(method_name, DBUS_SERVICE_PLUGIN_DESTROY_METHOD)) + { + int idx = 0; + int size = service_plugin_destroy_s_type_length; + GVariant *req_info[size]; + + ipc_create_variant_info(in_parameters, size, (GVariant ***) &req_info); + + char *uri = ipc_insure_g_variant_dup_string(req_info[idx++]); + + SAL_INFO("uri: %s", uri); + + ipc_ret = SERVICE_ADAPTOR_ERROR_INTERNAL; + + sal_h sal = sal_get_handle(); + + if (NULL != sal) + { + ipc_ret = auth_adaptor_unref_plugin(sal->auth, uri); + } + + ipc_create_error_msg(ipc_ret, &ipc_msg); + ipc_data = g_variant_new(ipc_make_return_type(ipc_type), ipc_ret, SAL_IPC_STR(ipc_msg)); + + ipc_destroy_variant_info(req_info, size); + } + + g_dbus_method_invocation_return_value(invocation, ipc_data); + + SAL_FREE(uri); + SAL_FREE(ipc_msg); + SAL_FREE(ipc_type); + + SAL_FN_END; +} +/* +service_adaptor_internal_error_code_e dbus_service_adaptor_signal_callback(service_adaptor_internal_signal_code_e signal_code, + const char *signal_msg) +{ + SAL_FN_CALL; + + GError* error = NULL; + GDBusConnection *dbus_connection = dbus_get_connection(); + + if (NULL != dbus_connection) + { + GVariant *response = g_variant_new("(ts)", (uint64_t) signal_code, signal_msg); + + g_dbus_connection_emit_signal(dbus_connection, + NULL, + SERVICE_ADAPTOR_OBJECT_PATH, + SERVICE_ADAPTOR_INTERFACE, + DBUS_SERVICE_ADAPTOR_SIGNAL, + response, + &error ); + + if (NULL != error) + { + service_adaptor_debug("Unable to send msg: %s", error->message); + return SERVICE_ADAPTOR_INTERNAL_ERROR_DBUS; + } + } + + return SERVICE_ADAPTOR_INTERNAL_ERROR_NONE; +} +*/ diff --git a/common/ipc-server/sal_ipc_server_core.h b/common/ipc-server/sal_ipc_server_core.h new file mode 100644 index 0000000..917743e --- /dev/null +++ b/common/ipc-server/sal_ipc_server_core.h @@ -0,0 +1,62 @@ +/* + * Service Adaptor Server Core IPC + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Yongjin Kim + * Jinhyeong Ahn + * Jiwon Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_CONVERGENCE_SAL_IPC_SERVER_CORE_H__ +#define __TIZEN_CONVERGENCE_SAL_IPC_SERVER_CORE_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include +#include + +void service_adaptor_method_call(GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data); + +void service_plugin_method_call(GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data); + +#ifdef __cplusplus +} +#endif + +#endif /* __TIZEN_CONVERGENCE_SAL_IPC_SERVER_CORE_H__ */ + diff --git a/common/ipc-server/sal_ipc_server_storage.c b/common/ipc-server/sal_ipc_server_storage.c new file mode 100644 index 0000000..e91fd70 --- /dev/null +++ b/common/ipc-server/sal_ipc_server_storage.c @@ -0,0 +1,198 @@ +/* + * Service Adaptor IPC Server + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include + +#include "service_adaptor_errors.h" +#include "service_adaptor_internal.h" +#include "sal.h" +#include "sal_ipc_server.h" +#include "sal_ipc_server_storage.h" +#include "storage_adaptor.h" +#include "sal_service_storage.h" +#include "sal_service_storage_internal.h" + +//****************************************************************************** +//* Global variables and defines +//****************************************************************************** + +//****************************************************************************** +//* Private interface +//****************************************************************************** + +//****************************************************************************** +//* Private interface definition +//****************************************************************************** + +void _cloud_remove_file_cb(int result, cloud_file_h file, void *user_data) +{ + SAL_FN_CALL; + + ipc_reply_data_h reply = (ipc_reply_data_h) user_data; + + int ipc_ret = SERVICE_ADAPTOR_ERROR_NONE; + char *ipc_msg = NULL; + GVariant *ipc_data = NULL; + + GVariantBuilder *builder = g_variant_builder_new(G_VARIANT_TYPE(file_list_type)); + + ipc_create_error_msg(ipc_ret, &ipc_msg); + ipc_data = g_variant_new(ipc_make_return_type(reply->type), file->is_dir, SAL_IPC_STR(file->dir_path), SAL_IPC_STR(file->local_path), SAL_IPC_STR(file->cloud_path), file->size, SAL_IPC_STR(file->operation), builder, ipc_ret, SAL_IPC_STR(ipc_msg)); + g_dbus_method_invocation_return_value(reply->invocation, ipc_data); + + SAL_FREE(ipc_msg); + ipc_free_reply_data(reply); + g_variant_builder_unref(builder); + + SAL_FN_END; +} + +int _get_cloud_file(GVariant *reply_info, service_storage_cloud_file_h *file) +{ + SAL_FN_CALL; + + service_storage_cloud_file_h cloud_file = (service_storage_cloud_file_h) g_malloc0(sizeof(service_storage_cloud_file_s)); + + int info_size = service_storage_cloud_file_s_type_length; + GVariant *info[info_size]; + ipc_create_variant_info(reply_info, info_size, (GVariant ***) &info); + + int idx = 0; + cloud_file->is_dir = g_variant_get_boolean(info[idx++]); + cloud_file->dir_path = ipc_insure_g_variant_dup_string(info[idx++]); + cloud_file->local_path = ipc_insure_g_variant_dup_string(info[idx++]); + cloud_file->cloud_path = ipc_insure_g_variant_dup_string(info[idx++]); + cloud_file->size = g_variant_get_uint64(info[idx++]); + cloud_file->operation = ipc_insure_g_variant_dup_string(info[idx++]); + + ipc_destroy_variant_info(info, info_size); + + *file = cloud_file; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +int _cloud_execute_operation(storage_plugin_h plugin, service_storage_cloud_file_h file, ipc_reply_data_h reply) +{ + SAL_FN_CALL; + + RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == plugin->cloud, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == file, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + int ret = SERVICE_ADAPTOR_ERROR_NONE; + + if (0 == strcmp(file->operation, SERVICE_STORAGE_CLOUD_REMOVE_FILE_URI)) + { + ret = plugin->cloud->cloud_remove_file(plugin, file->cloud_path, _cloud_remove_file_cb, reply); + + return ret; + } + else if (0 == strcmp(file->operation, SERVICE_STORAGE_CLOUD_DOWNLOAD_FILE_URI)) + { + return ret; + } + else if (0 == strcmp(file->operation, SERVICE_STORAGE_CLOUD_UPLOAD_FILE_URI)) + { + return ret; + } + else if (0 == strcmp(file->operation, SERVICE_STORAGE_CLOUD_DOWNLOAD_FILE_THUMBNAIL_URI)) + { + return ret; + } + else if (0 == strcmp(file->operation, SERVICE_STORAGE_CLOUD_GET_FILE_LIST_URI)) + { + return ret; + } + + return SERVICE_ADAPTOR_ERROR_INTERNAL; +} + +//****************************************************************************** +//* Public interface definition +//****************************************************************************** + +API void service_storage_method_call(GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + SAL_FN_CALL; + + int ipc_ret = SERVICE_ADAPTOR_ERROR_NONE; + char *ipc_msg = NULL; + char *ipc_type = NULL; + GVariant *ipc_data = NULL; + + char *uri = NULL; + + GVariant *in_parameters = g_variant_get_child_value(parameters, 0); + + if (0 == g_strcmp0(method_name, DBUS_SERVICE_STORAGE_CLOUD_FILE_METHOD)) + { + int idx = 0; + int size = service_storage_cloud_file_req_s_type_length; + GVariant *req_info[size]; + + ipc_create_variant_info(in_parameters, size, (GVariant ***) &req_info); + + char *uri = ipc_insure_g_variant_dup_string(req_info[idx++]); + service_storage_cloud_file_h file = NULL; + _get_cloud_file(req_info[idx++], &file); + + SAL_INFO("uri: %s", uri); + + ipc_ret = SERVICE_ADAPTOR_ERROR_INTERNAL; + ipc_type = strdup(service_storage_cloud_file_res_s_type); + + sal_h sal = sal_get_handle(); + TRYVM_IF(NULL == sal, ipc_ret = SERVICE_ADAPTOR_ERROR_INTERNAL, "sal_get_handle() Failed"); + + storage_plugin_h plugin = storage_adaptor_get_plugin(sal->storage, uri); + + ipc_reply_data_h reply = (ipc_reply_data_h) g_malloc0(sizeof(ipc_reply_data_s)); + reply->invocation = invocation; + reply->type = strdup(ipc_type); + + ipc_ret = _cloud_execute_operation(plugin, file, reply); + TRY_IF(SERVICE_ADAPTOR_ERROR_NONE == ipc_ret, "cloud_execute_operation() Request Successed"); + + GVariantBuilder *builder = g_variant_builder_new(G_VARIANT_TYPE(file_list_type)); + ipc_create_error_msg(ipc_ret, &ipc_msg); + ipc_data = g_variant_new(ipc_make_return_type(ipc_type), false, "", "", 0, 0, builder, ipc_ret, SAL_IPC_STR(ipc_msg)); + + g_variant_builder_unref(builder); + ipc_destroy_variant_info(req_info, size); + } + + g_dbus_method_invocation_return_value(invocation, ipc_data); + +catch: + SAL_FREE(uri); + SAL_FREE(ipc_msg); + SAL_FREE(ipc_type); + + SAL_FN_END; +} diff --git a/common/ipc-server/sal_ipc_server_storage.h b/common/ipc-server/sal_ipc_server_storage.h new file mode 100644 index 0000000..9289cd2 --- /dev/null +++ b/common/ipc-server/sal_ipc_server_storage.h @@ -0,0 +1,53 @@ +/* + * Service Adaptor Server Storage IPC + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Yongjin Kim + * Jinhyeong Ahn + * Jiwon Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_CONVERGENCE_SAL_IPC_SERVER_STORAGE_H__ +#define __TIZEN_CONVERGENCE_SAL_IPC_SERVER_STORAGE_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include +#include + +void service_storage_method_call(GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data); + +#ifdef __cplusplus +} +#endif + +#endif /* __TIZEN_CONVERGENCE_SAL_IPC_SERVER_STORAGE_H__ */ + diff --git a/common/ipc/sal_ipc.c b/common/ipc/sal_ipc.c deleted file mode 100644 index fb83e28..0000000 --- a/common/ipc/sal_ipc.c +++ /dev/null @@ -1,11 +0,0 @@ -#include "sal_ipc.h" - -service_adaptor_error_e sal_ipc_init_server() -{ - return SERVICE_ADAPTOR_ERROR_NONE; -} - -service_adaptor_error_e sal_ipc_deinit_server() -{ - return SERVICE_ADAPTOR_ERROR_NONE; -} diff --git a/common/sal_common.c b/common/sal_common.c deleted file mode 100644 index e69de29..0000000 diff --git a/common/sal_ipc.c b/common/sal_ipc.c new file mode 100644 index 0000000..814fdcf --- /dev/null +++ b/common/sal_ipc.c @@ -0,0 +1,120 @@ +/* + * Service Adaptor IPC + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include + +#include "service_adaptor_errors.h" +#include "service_adaptor_internal.h" +#include "sal_ipc.h" + +//****************************************************************************** +//* Global variables and defines +//****************************************************************************** + +//****************************************************************************** +//* Private interface +//****************************************************************************** + +//****************************************************************************** +//* Private interface definition +//****************************************************************************** + +//****************************************************************************** +//* Public interface definition +//****************************************************************************** + +API char *ipc_insure_g_variant_dup_string(GVariant *string) +{ + char *ret = g_variant_dup_string(string, NULL); + + if (0 == strcmp(ret, "")) + { + SAL_FREE(ret); + } + + return ret; +} + +API void ipc_insure_g_variant_builder_add_array_string(GVariantBuilder *builder, const char *str) +{ + if (NULL == str) + { + g_variant_builder_add(builder, "(s)", ""); + } + else + { + g_variant_builder_add(builder, "(s)", str); + } +} + +API char *ipc_make_return_type(const char *type) +{ + return g_strdup_printf("(%sis)", SAL_IPC_STR(type)); +} + +API void ipc_create_error_msg(int code, char **ipc_msg) +{ + switch (code) + { + case SERVICE_ADAPTOR_ERROR_NONE: + { + *ipc_msg = NULL; + break; + } + case SERVICE_ADAPTOR_ERROR_INTERNAL: + { + *ipc_msg = strdup("SERVICE_ADAPTOR_ERROR_INTERNAL"); + break; + } + default: + { + *ipc_msg = strdup("SERVICE_ADAPTOR_ERROR_UNKNOWN"); + break; + } + } +} + +API void ipc_create_variant_info(GVariant *parameters, int size, GVariant ***var_info) +{ + for (size_t i = 0; i < size; i++) + { + *(var_info +i) = (GVariant **) g_variant_get_child_value(parameters, i); + } +} + +API void ipc_destroy_variant_info(GVariant **var_info, int size) +{ + for (size_t i = 0; i < size; i++) + { + g_variant_unref(var_info[i]); + } +} + +API void ipc_free_reply_data(ipc_reply_data_h reply) +{ + SAL_FN_CALL; + + RET_IF(NULL == reply); + + SAL_FREE(reply->type); + SAL_FREE(reply); + + SAL_FN_END; +} diff --git a/common/sal_ipc.h b/common/sal_ipc.h new file mode 100644 index 0000000..3561e01 --- /dev/null +++ b/common/sal_ipc.h @@ -0,0 +1,185 @@ +/* + * Service Adaptor IPC + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Yongjin Kim + * Jinhyeong Ahn + * Jiwon Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_CONVERGENCE_SAL_IPC_H__ +#define __TIZEN_CONVERGENCE_SAL_IPC_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include +#include + +#define SAL_IPC_STR(x) (x==NULL)?"":x + +/** + * Service Adaptor D-Bus server bus name. + */ +#define SERVICE_ADAPTOR_BUS_NAME "org.tizen.serviceadaptor.client" + +/** + * Service Adaptor D-Bus server object path. + */ +#define SERVICE_ADAPTOR_OBJECT_PATH "/org/tizen/serviceadaptor/client" + +/** + * Service Adaptor D-Bus interface. + */ +#define SERVICE_ADAPTOR_INTERFACE "org.tizen.serviceadaptor.client.interface" + +/** + * struct for dbus. + */ +#define service_adaptor_connect_req_s_type_length 1 +#define service_adaptor_connect_req_s_type \ + "(" \ + "s" /* char *uri */ \ + ")" + +#define service_adaptor_connect_res_s_type_length 1 +#define service_adaptor_connect_res_s_type \ + "(" \ + "a(s)" /* char **uri */ \ + ")" + +#define service_adaptor_disconnect_s_type_length 1 +#define service_adaptor_disconnect_s_type \ + "(" \ + "s" /* char *uri */ \ + ")" + +#define service_plugin_create_s_type_length 1 +#define service_plugin_create_s_type \ + "(" \ + "s" /* char *uri */ \ + ")" + +#define service_plugin_destroy_s_type_length 1 +#define service_plugin_destroy_s_type \ + "(" \ + "s" /* char *uri */ \ + ")" + +#define service_auth_oauth1_s_type_length 2 +#define service_auth_oauth1_s_type \ + "(" \ + "s" /* char *access_token */ \ + "s" /* char *operation */ \ + ")" + +#define service_auth_oauth1_req_s_type_length 2 +#define service_auth_oauth1_req_s_type \ + "(" \ + "s" /* char *uri */ \ + service_auth_oauth1_s_type /* service_auth_oauth1_s oauth1 */ \ + ")" + +#define service_auth_oauth1_res_s_type_length 1 +#define service_auth_oauth1_res_s_type \ + "(" \ + service_auth_oauth1_s_type /* service_auth_oauth1_s oauth1 */ \ + ")" + +#define service_storage_cloud_file_s_type_length 6 +#define service_storage_cloud_file_s_type \ + "(" \ + "b" /* bool is_dir */ \ + "s" /* char *dir_path */ \ + "s" /* char *local_path */ \ + "s" /* char *cloud_path */ \ + "t" /* uint64 size */ \ + "s" /* char *operation */ \ + ")" + +#define service_storage_cloud_file_req_s_type_length 2 +#define service_storage_cloud_file_req_s_type \ + "(" \ + "s" /* char *uri */ \ + service_storage_cloud_file_s_type /* service_storage_cloud_file_s file */ \ + ")" + +#define service_storage_cloud_file_res_s_type_length 2 +#define service_storage_cloud_file_res_s_type \ + "(" \ + service_storage_cloud_file_s_type /* service_storage_cloud_file_s file */ \ + "a" service_storage_cloud_file_s_type /* GList *files */ \ + ")" + +/** + * array of structures + */ +#define plugin_list_type "a(s)" +#define file_list_type "a" service_storage_cloud_file_s_type + +/** + * append error code to the type + */ +#define RETURN_LENGTH 2 + +/** + * DBus APIs + */ +#define DBUS_SERVICE_ADAPTOR "dbus_00" +#define DBUS_SERVICE_PLUGIN "dbus_01" +#define DBUS_SERVICE_AUTH "dbus_02" +#define DBUS_SERVICE_STORAGE "dbus_03" +#define DBUS_NAME_LENGTH 7 + +#define DBUS_SERVICE_ADAPTOR_CONNECT_METHOD DBUS_SERVICE_ADAPTOR "_service_adaptor_connect" +#define DBUS_SERVICE_ADAPTOR_DISCONNECT_METHOD DBUS_SERVICE_ADAPTOR "_service_adaptor_disconnect" + +#define DBUS_SERVICE_PLUGIN_CREATE_METHOD DBUS_SERVICE_PLUGIN "_service_plugin_create" +#define DBUS_SERVICE_PLUGIN_DESTROY_METHOD DBUS_SERVICE_PLUGIN "_service_plugin_destroy" + +#define DBUS_SERVICE_AUTH_OAUTH1_METHOD DBUS_SERVICE_AUTH "_service_auth_oauth1" + +#define DBUS_SERVICE_STORAGE_CLOUD_FILE_METHOD DBUS_SERVICE_STORAGE "_service_storage_cloud_file" + +#define DBUS_SERVICE_ADAPTOR_NOTIFY_SIGNAL DBUS_SERVICE_ADAPTOR "_service_adaptor_signal_notify" + +typedef struct _ipc_reply_data_s +{ + GDBusMethodInvocation *invocation; + char *type; +} ipc_reply_data_s; +typedef struct _ipc_reply_data_s *ipc_reply_data_h; + +char *ipc_insure_g_variant_dup_string(GVariant *string); +void ipc_insure_g_variant_builder_add_array_string(GVariantBuilder *builder, const char *str); +char *ipc_make_return_type(const char *type); +void ipc_create_error_msg(int code, char **ipc_msg); +void ipc_create_variant_info(GVariant *parameters, int size, GVariant ***var_info); +void ipc_destroy_variant_info(GVariant **var_info, int size); +void ipc_free_reply_data(ipc_reply_data_h reply); + +#ifdef __cplusplus +} +#endif + +#endif /* __TIZEN_CONVERGENCE_SAL_IPC_H__ */ diff --git a/include/service_adaptor.h b/include/service_adaptor.h index 0591e52..5c3cef1 100644 --- a/include/service_adaptor.h +++ b/include/service_adaptor.h @@ -21,7 +21,10 @@ #define __TIZEN_CONVERGENCE_SERVICE_ADAPTOR_H__ #include -#include -#include + +#include "sal_service_adaptor.h" +#include "sal_service_task.h" +#include "sal_service_auth.h" +#include "sal_service_storage.h" #endif /* __TIZEN_CONVERGENCE_SERVICE_ADAPTOR_H__ */ diff --git a/include/service_adaptor_internal.h b/include/service_adaptor_internal.h index d4e12a8..8bf04cc 100644 --- a/include/service_adaptor_internal.h +++ b/include/service_adaptor_internal.h @@ -33,7 +33,7 @@ #endif #define API __attribute__ ((visibility("default"))) -#define LOG_TAG "SERVICE_ADAPTOR" +#define LOG_TAG "SERVICE-ADAPTOR" #include #define DLOG(prio, fmt, arg...) \ do { SLOG(prio, LOG_TAG, fmt, ##arg); } while (0) @@ -47,8 +47,29 @@ #define IPC_ROLE "[LIB]" #endif -#define INFO(fmt, arg...) SLOGI(IPC_ROLE" "fmt, ##arg) -#define ERR(fmt, arg...) SLOGE(IPC_ROLE" "fmt, ##arg) +/** + * Colors of font + */ +#define FONT_COLOR_RESET "\033[0m" +#define FONT_COLOR_BLACK "\033[30m" /* Black */ +#define FONT_COLOR_RED "\033[31m" /* Red */ +#define FONT_COLOR_GREEN "\033[32m" /* Green */ +#define FONT_COLOR_YELLOW "\033[33m" /* Yellow */ +#define FONT_COLOR_BLUE "\033[34m" /* Blue */ +#define FONT_COLOR_PURPLE "\033[35m" /* Purple */ +#define FONT_COLOR_CYAN "\033[36m" /* Cyan */ +#define FONT_COLOR_WHITE "\033[37m" /* White */ +#define FONT_COLOR_BOLDBLACK "\033[1m\033[30m" /* Bold Black */ +#define FONT_COLOR_BOLDRED "\033[1m\033[31m" /* Bold Red */ +#define FONT_COLOR_BOLDGREEN "\033[1m\033[32m" /* Bold Green */ +#define FONT_COLOR_BOLDYELLOW "\033[1m\033[33m" /* Bold Yellow */ +#define FONT_COLOR_BOLDBLUE "\033[1m\033[34m" /* Bold Blue */ +#define FONT_COLOR_BOLDPURPLE "\033[1m\033[35m" /* Bold Purple */ +#define FONT_COLOR_BOLDCYAN "\033[1m\033[36m" /* Bold Cyan */ +#define FONT_COLOR_BOLDWHITE "\033[1m\033[37m" /* Bold White */ + +#define INFO(fmt, arg...) SLOGI(FONT_COLOR_YELLOW""IPC_ROLE" "fmt""FONT_COLOR_RESET, ##arg) +#define ERR(fmt, arg...) SLOGE(FONT_COLOR_RED""IPC_ROLE" "fmt""FONT_COLOR_RESET, ##arg) #define DBG(fmt, arg...) SLOGD(IPC_ROLE" "fmt, ##arg) #define WARN(fmt, arg...) SLOGD(IPC_ROLE" "fmt, ##arg) #define VERBOSE(fmt, arg...) SLOGV(IPC_ROLE" "fmt, ##arg) @@ -57,6 +78,8 @@ #define SAL_FN_CALL DBG(">>>>>>>> called") #define SAL_FN_END DBG("<<<<<<<< ended") +// #define SAL_FN_CALL INFO(">>>>>>>> called") +// #define SAL_FN_END INFO("<<<<<<<< ended") #define SAL_DBG(fmt, arg...) DBG(fmt, ##arg) #define SAL_WARN(fmt, arg...) WARN(fmt, ##arg) @@ -105,6 +128,12 @@ return (val); \ } \ } while (0) +#define TRY_IF(expr, fmt, arg...) do { \ + if (expr) { \ + SAL_INFO(fmt, ##arg); \ + goto catch; \ + } \ +} while (0) #define TRYM_IF(expr, fmt, arg...) do { \ if (expr) { \ SAL_ERR(fmt, ##arg); \ @@ -119,6 +148,11 @@ } \ } while (0) +#define SAL_STRDUP(dst, ptr) do { \ + if (ptr) \ + dst = strdup(ptr); \ + ptr = NULL; \ +} while(0) #define SAL_FREE(ptr) do { \ if (ptr) \ diff --git a/include/service_adaptor_types.h b/include/service_adaptor_types.h index e51c010..1a98384 100644 --- a/include/service_adaptor_types.h +++ b/include/service_adaptor_types.h @@ -30,8 +30,7 @@ #include "auth_adaptor.h" #include "contact_adaptor.h" #include "storage_adaptor.h" - -#define FILE_PATH_LEN 256 +#include "resource_adaptor.h" typedef struct _service_adaptor_s { @@ -40,10 +39,12 @@ typedef struct _service_adaptor_s auth_adaptor_h auth; contact_adaptor_h contact; storage_adaptor_h storage; + resource_adaptor_h resource; auth_adaptor_listener_h auth_listener; contact_adaptor_listener_h contact_listener; storage_adaptor_listener_h storage_listener; + resource_adaptor_listener_h resource_listener; GMutex mutex; GCond cond; @@ -51,5 +52,4 @@ typedef struct _service_adaptor_s } service_adaptor_s; typedef struct _service_adaptor_s *service_adaptor_h; - #endif /* __TIZEN_CONVERGENCE_SERVICE_ADAPTOR_TYPES_H__ */ diff --git a/include/service_provider.h b/include/service_provider.h new file mode 100644 index 0000000..509f236 --- /dev/null +++ b/include/service_provider.h @@ -0,0 +1,27 @@ +/* + * Service Provider + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_CONVERGENCE_SERVICE_PROVIDER_H__ +#define __TIZEN_CONVERGENCE_SERVICE_PROVIDER_H__ + +#include "service_adaptor_errors.h" +#include "sal_service_provider.h" +#include "sal_auth_provider.h" + +#endif /* __TIZEN_CONVERGENCE_SERVICE_PROVIDER_H__ */ diff --git a/packaging/org.tizen.serviceadaptor.client.conf b/packaging/org.tizen.serviceadaptor.client.conf new file mode 100644 index 0000000..d575a9d --- /dev/null +++ b/packaging/org.tizen.serviceadaptor.client.conf @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/packaging/org.tizen.serviceadaptor.client.service b/packaging/org.tizen.serviceadaptor.client.service new file mode 100644 index 0000000..0f3d406 --- /dev/null +++ b/packaging/org.tizen.serviceadaptor.client.service @@ -0,0 +1,6 @@ +[D-BUS Service] +Name=org.tizen.serviceadaptor.client +Exec=/bin/false +SystemdService=service-adaptor.service +User=system +Group=system diff --git a/packaging/service-adaptor.service b/packaging/service-adaptor.service index 925a7e4..6529108 100644 --- a/packaging/service-adaptor.service +++ b/packaging/service-adaptor.service @@ -1,18 +1,17 @@ [Unit] Description=Service Adaptor daemon -Requires=dbus.socket -After=dlog_logger.service tizen-runtime.target +Requires=tizen-runtime.target +After=tizen-runtime.target [Service] User=system Group=system SmackProcessLabel=service-adaptor Type=dbus -BusName=com.samsung.svcadaptor -ExecStart=/usr/bin/service-adaptor -Restart=none -RestartSec=0 -KillMode=none +BusName=org.tizen.serviceadaptor.client +ExecStart=/usr/bin/service-adaptor-server +Restart=always +RestartSec=1 [Install] WantedBy=multi-user.target diff --git a/packaging/service-adaptor.spec b/packaging/service-adaptor.spec index 9003ff8..1cef723 100644 --- a/packaging/service-adaptor.spec +++ b/packaging/service-adaptor.spec @@ -1,6 +1,6 @@ Name: service-adaptor Summary: Service Adaptor Framework for Convergence -Version: 0.0.1 +Version: 1.1.0 Release: 1 Group: System/Libraries License: Apache-2.0 @@ -14,6 +14,7 @@ BuildRequires: pkgconfig(glib-2.0) BuildRequires: pkgconfig(gobject-2.0) BuildRequires: pkgconfig(gthread-2.0) BuildRequires: pkgconfig(capi-base-common) +BuildRequires: pkgconfig(capi-appfw-application) BuildRequires: pkgconfig(capi-appfw-app-manager) BuildRequires: pkgconfig(capi-appfw-package-manager) BuildRequires: pkgconfig(libsmack) @@ -59,6 +60,10 @@ mkdir -p %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants install -m 0644 %SOURCE1 %{buildroot}%{_libdir}/systemd/system/ ln -sf ../service-adaptor.service %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants/ +mkdir -p %{buildroot}/usr/lib/systemd/user/tizen-middleware.target.wants +cp %SOURCE1 %{buildroot}/usr/lib/systemd/user/service-adaptor.service +ln -s ../service-adaptor.service %{buildroot}/usr/lib/systemd/user/tizen-middleware.target.wants/ + mkdir -p %{buildroot}/usr/share/license cp LICENSE.APLv2 %{buildroot}/usr/share/license/service-adaptor cp LICENSE.APLv2 %{buildroot}/usr/share/license/service-adaptor-devel @@ -70,17 +75,22 @@ cp LICENSE.APLv2 %{buildroot}/usr/share/license/service-adaptor-devel %files -n service-adaptor %manifest service-adaptor.manifest -%defattr(-,system,system,-) +#%defattr(-,system,system,-) +%defattr(-,root,root,-) %{_libdir}/lib*.so.* -%{_bindir}/service-adaptor +%{_bindir}/service-adaptor-server %{_bindir}/sal-test +/usr/lib/systemd/user/service-adaptor.service +/usr/lib/systemd/user/tizen-middleware.target.wants/service-adaptor.service %{_libdir}/systemd/system/service-adaptor.service %{_libdir}/systemd/system/multi-user.target.wants/service-adaptor.service /usr/share/license/%{name} %files -n service-adaptor-devel -%defattr(-,system,system,-) +#%defattr(-,system,system,-) +%defattr(-,root,root,-) %{_libdir}/lib*.so %{_libdir}/pkgconfig/service-adaptor.pc %{_includedir}/service-adaptor/*.h +%{_includedir}/service-provider/*.h /usr/share/license/%{name}-devel diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt index 0a6ce71..a8ae0d3 100644 --- a/server/CMakeLists.txt +++ b/server/CMakeLists.txt @@ -19,11 +19,12 @@ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,--gc-sections -fPIE") # Define Execute File ########################################################## -SET(MAIN-EXE "service-adaptor") +SET(MAIN-EXE "service-adaptor-server") SET(MAIN-SRCS ${CMAKE_SOURCE_DIR}/server/sal_auth.c ${CMAKE_SOURCE_DIR}/server/sal_contact.c ${CMAKE_SOURCE_DIR}/server/sal_storage.c + ${CMAKE_SOURCE_DIR}/server/sal_resource.c ${CMAKE_SOURCE_DIR}/server/sal_observer.c ${CMAKE_SOURCE_DIR}/server/sal_main.c ) @@ -31,26 +32,28 @@ SET(MAIN-SRCS INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/common - ${CMAKE_SOURCE_DIR}/common/ipc + ${CMAKE_SOURCE_DIR}/common/ipc-server ${CMAKE_SOURCE_DIR}/server + ${CMAKE_SOURCE_DIR}/client ${CMAKE_SOURCE_DIR}/adaptor/auth-adaptor ${CMAKE_SOURCE_DIR}/adaptor/contact-adaptor ${CMAKE_SOURCE_DIR}/adaptor/storage-adaptor + ${CMAKE_SOURCE_DIR}/adaptor/resource-adaptor ) INCLUDE(FindPkgConfig) -pkg_check_modules(main_pkgs REQUIRED dlog glib-2.0 capi-base-common capi-appfw-app-manager capi-appfw-package-manager libsmack service-discovery service-federation) +pkg_check_modules(main_pkgs REQUIRED dlog glib-2.0 capi-base-common capi-appfw-application capi-appfw-app-manager capi-appfw-package-manager libsmack service-discovery service-federation) FOREACH(flag ${main_pkgs_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") ENDFOREACH(flag) -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -std=gnu99") SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie") ADD_DEFINITIONS("-DSERVICE_ADAPTOR_DEBUGGING") ADD_DEFINITIONS("-D_SERVICE_ADAPTOR_IPC_SERVER") ADD_EXECUTABLE(${MAIN-EXE} ${MAIN-SRCS}) -TARGET_LINK_LIBRARIES(${MAIN-EXE} ${main_pkgs_LDFLAGS} sal-common auth-adaptor contact-adaptor storage-adaptor) +TARGET_LINK_LIBRARIES(${MAIN-EXE} ${main_pkgs_LDFLAGS} sal-common-server auth-adaptor contact-adaptor storage-adaptor resource-adaptor) INSTALL(TARGETS ${MAIN-EXE} DESTINATION bin) diff --git a/server/sal.h b/server/sal.h index 4d2a66e..3581e9e 100644 --- a/server/sal.h +++ b/server/sal.h @@ -24,13 +24,50 @@ #ifndef __TIZEN_CONVERGENCE_SAL_H__ #define __TIZEN_CONVERGENCE_SAL_H__ +#include + #include "service_adaptor_errors.h" -#include "service_adaptor_types.h" -#include "service_adaptor_internal.h" -service_adaptor_h sal_get_handle(); +#include "auth_adaptor.h" +#include "contact_adaptor.h" +#include "storage_adaptor.h" +#include "resource_adaptor.h" + +typedef struct _sal_s +{ + GList *svc_list; + + auth_adaptor_h auth; + contact_adaptor_h contact; + storage_adaptor_h storage; + resource_adaptor_h resource; + + auth_adaptor_listener_h auth_listener; + contact_adaptor_listener_h contact_listener; + storage_adaptor_listener_h storage_listener; + resource_adaptor_listener_h resource_listener; + + GMutex mutex; + GCond cond; + int start; +} sal_s; +typedef struct _sal_s *sal_h; + +typedef struct _provider_user_data_s +{ + char *uri; + char *name; + char *package; +} provider_user_data_s; +typedef struct _provider_user_data_s *provider_user_data_h; + +sal_h sal_get_handle(); char *sal_get_root_path(); -service_adaptor_error_e sal_connect(service_adaptor_h sal); -service_adaptor_error_e sal_disconnect(service_adaptor_h sal); +service_adaptor_error_e sal_adaptor_connect(const char *uri); +service_adaptor_error_e sal_adaptor_disconnect(const char *uri); +service_adaptor_error_e sal_adaptor_get_plugins(char ***plugins, int *plugins_size); +service_adaptor_error_e sal_provider_connect(const char *uri, const char *name, const char *package); +service_adaptor_error_e sal_provider_disconnect(const char *uri); +char *sal_provider_get_uri(const char *package); #endif /* __TIZEN_CONVERGENCE_SAL_H__ */ diff --git a/server/sal_auth.c b/server/sal_auth.c index 4cb12ac..4af6d1a 100644 --- a/server/sal_auth.c +++ b/server/sal_auth.c @@ -33,26 +33,24 @@ //****************************************************************************** //* Private interface definition //****************************************************************************** +void _sal_auth_login_cb(const char *uri, void *user_data) +{ +} //****************************************************************************** //* Public interface definition //****************************************************************************** -auth_adaptor_h sal_auth_create_handle() -{ - auth_adaptor_h auth_adaptor = auth_adaptor_create(); - - return auth_adaptor; -} - auth_adaptor_listener_h sal_auth_register_listener(auth_adaptor_h auth) { - int ret = SERVICE_ADAPTOR_ERROR_NONE; + SAL_FN_CALL; auth_adaptor_listener_h listener = (auth_adaptor_listener_h) g_malloc0(sizeof(auth_adaptor_listener_s)); - ret = auth_adaptor_register_listener(auth, listener); + listener->login_cb = _sal_auth_login_cb; + + int ret = auth_adaptor_register_listener(auth, listener); if (SERVICE_ADAPTOR_ERROR_NONE != ret) { diff --git a/server/sal_auth.h b/server/sal_auth.h index c2b61b1..4a37fd3 100644 --- a/server/sal_auth.h +++ b/server/sal_auth.h @@ -26,7 +26,6 @@ #include "auth_adaptor.h" -auth_adaptor_h sal_auth_create_handle(); auth_adaptor_listener_h sal_auth_register_listener(auth_adaptor_h auth); #endif /* __TIZEN_CONVERGENCE_SAL_AUTH_H__ */ diff --git a/server/sal_contact.c b/server/sal_contact.c index 570c4e1..b8246cd 100644 --- a/server/sal_contact.c +++ b/server/sal_contact.c @@ -38,13 +38,6 @@ //* Public interface definition //****************************************************************************** -contact_adaptor_h sal_contact_create_handle() -{ - contact_adaptor_h contact_adaptor = contact_adaptor_create(); - - return contact_adaptor; -} - contact_adaptor_listener_h sal_contact_register_listener(contact_adaptor_h contact) { int ret = SERVICE_ADAPTOR_ERROR_NONE; diff --git a/server/sal_contact.h b/server/sal_contact.h index e7b5a06..7092783 100644 --- a/server/sal_contact.h +++ b/server/sal_contact.h @@ -26,7 +26,6 @@ #include "contact_adaptor.h" -contact_adaptor_h sal_contact_create_handle(); contact_adaptor_listener_h sal_contact_register_listener(contact_adaptor_h contact); #endif /* __TIZEN_CONVERGENCE_SAL_CONTACT_H__ */ diff --git a/server/sal_main.c b/server/sal_main.c index 7ef46c9..c75ddbf 100644 --- a/server/sal_main.c +++ b/server/sal_main.c @@ -21,22 +21,28 @@ #include #include -#include "service_adaptor.h" -#include "service_discovery.h" -#include "service_federation.h" +#include + +#include "service_adaptor_internal.h" + #include "sal.h" -#include "sal_ipc.h" #include "sal_auth.h" #include "sal_contact.h" #include "sal_storage.h" +#include "sal_resource.h" #include "sal_observer.h" +#include "sal_ipc_server.h" +#include "sal_service_provider.h" + +#include "service_discovery.h" +#include "service_federation.h" //****************************************************************************** //* Global variables and defines //****************************************************************************** -#define SAL_PLUGIN_METADATA_KEY_ADAPTOR "service-adaptor" +#define FILE_PATH_LEN 256 -static service_adaptor_h g_service_adaptor = NULL; +static sal_h g_service_adaptor = NULL; //****************************************************************************** //* Private interface @@ -47,11 +53,100 @@ static service_adaptor_h g_service_adaptor = NULL; //****************************************************************************** /** + * @brief callback of app control + * + * @return void. + */ +static bool _app_control_extra_data_cb(app_control_h app_control, const char *key, void *user_data) +{ + char *value = NULL; + + app_control_get_extra_data(app_control, key, &value); + SAL_INFO("PLUGIN Key (%s): %s", key, value); + + g_hash_table_insert((GHashTable *) user_data, (char *) key, value); + + return true; +} + +/** + * @brief callback of plugin connection + * + * @return void. + */ +static void _provider_connect_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data) +{ + SAL_FN_CALL; + + RET_IF(APP_CONTROL_RESULT_FAILED == result); + + sal_h sal = sal_get_handle(); + RETM_IF(NULL == sal, "sal_get_handle() Fail"); + + GHashTable *service = g_hash_table_new(g_str_hash, g_str_equal); + app_control_foreach_extra_data(reply, _app_control_extra_data_cb, (void *) service); + + provider_user_data_h provider_user_data = (provider_user_data_h) user_data; + + GHashTableIter iter; + gpointer iter_key, iter_value; + + g_hash_table_iter_init(&iter, service); + while (g_hash_table_iter_next(&iter, &iter_key, &iter_value)) + { + if (0 == strcmp(iter_key, PLUGIN_KEY_AUTH)) + { + auth_plugin_h plugin = NULL; + auth_adaptor_create_plugin(provider_user_data->uri, provider_user_data->name, provider_user_data->package, &plugin); + auth_adaptor_register_plugin_service(plugin, service); + auth_adaptor_add_plugin(sal->auth, plugin); + } + else if (0 == strcmp(iter_key, PLUGIN_KEY_STORAGE)) + { + storage_plugin_h plugin = NULL; + storage_adaptor_create_plugin(provider_user_data->uri, provider_user_data->name, provider_user_data->package, &plugin); + storage_adaptor_register_plugin_service(plugin, service); + storage_adaptor_add_plugin(sal->storage, plugin); + } + } + + g_hash_table_destroy(service); + + SAL_FN_END; +} + +/** + * @brief callback of plugin disconnection + * + * @return void. + */ +static void _provider_disconnect_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data) +{ + SAL_FN_CALL; + + RET_IF(APP_CONTROL_RESULT_FAILED == result); + + sal_h sal = sal_get_handle(); + RETM_IF(NULL == sal, "sal_get_handle() Fail"); + + char *uri = (char *) user_data; + + auth_plugin_h plugin = auth_adaptor_get_plugin(sal->auth, uri); + auth_adaptor_remove_plugin(sal->auth, plugin); + auth_adaptor_unregister_plugin_service(plugin); + auth_adaptor_destroy_plugin(plugin); + + // TODO: destroy plugin of other adaptor + + SAL_FN_END; +} + +/** * @brief create spec file * * @return void. */ -static service_adaptor_error_e _sal_create_spec_file(service_adaptor_h sal) +static service_adaptor_error_e _sal_create_spec_file(sal_h sal) { SAL_FN_CALL; @@ -66,7 +161,7 @@ static service_adaptor_error_e _sal_create_spec_file(service_adaptor_h sal) * * @return void. */ -static service_adaptor_error_e _sal_destroy_spec_file(service_adaptor_h sal) +static service_adaptor_error_e _sal_destroy_spec_file(sal_h sal) { SAL_FN_CALL; @@ -81,7 +176,7 @@ static service_adaptor_error_e _sal_destroy_spec_file(service_adaptor_h sal) * * @return void. */ -static service_adaptor_error_e _sal_start(service_adaptor_h sal) +static service_adaptor_error_e _sal_start(sal_h sal) { SAL_FN_CALL; @@ -97,6 +192,12 @@ static service_adaptor_error_e _sal_start(service_adaptor_h sal) ret = storage_adaptor_start(sal->storage); RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_INTERNAL, "storage_adaptor_start() Fail(%d)", ret); + ret = resource_adaptor_start(sal->resource); + RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_INTERNAL, "resource_adaptor_start() Fail(%d)", ret); + + ret = sal_observer_register_existed_plugin(); + RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, ret, "sal_observer_register_existed_plugin() Fail(%d)", ret); + g_mutex_lock(&sal->mutex); sal->start = sal->start + 1; g_cond_signal(&sal->cond); @@ -110,7 +211,7 @@ static service_adaptor_error_e _sal_start(service_adaptor_h sal) * * @return void. */ -static service_adaptor_error_e _sal_stop(service_adaptor_h sal) +static service_adaptor_error_e _sal_stop(sal_h sal) { SAL_FN_CALL; @@ -121,6 +222,7 @@ static service_adaptor_error_e _sal_stop(service_adaptor_h sal) ret += auth_adaptor_stop(sal->auth); ret += contact_adaptor_stop(sal->contact); ret += storage_adaptor_stop(sal->storage); + ret += resource_adaptor_stop(sal->resource); RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_INTERNAL, "could not stop service adaptor(%d)", ret); sal->start = 0; @@ -133,49 +235,58 @@ static service_adaptor_error_e _sal_stop(service_adaptor_h sal) * * @return void. */ -static service_adaptor_h _sal_create() +static sal_h _sal_create() { SAL_FN_CALL; - service_adaptor_h sal = NULL; + sal_h sal = NULL; // 1) create auth adaptor handle - auth_adaptor_h auth = sal_auth_create_handle(); + auth_adaptor_h auth = auth_adaptor_create(); TRYM_IF(NULL == auth, "sal_auth_create_handle() Fail"); // 2) create contact adaptor handle - contact_adaptor_h contact = sal_contact_create_handle(); + contact_adaptor_h contact = contact_adaptor_create(); TRYM_IF(NULL == contact, "sal_contact_create_handle() Fail"); // 3) create storage adaptor handle - storage_adaptor_h storage = sal_storage_create_handle(); + storage_adaptor_h storage = storage_adaptor_create(); TRYM_IF(NULL == storage, "sal_storage_create_handle() Fail"); - // 4) register auth adaptor listener + // 4) create resource adaptor handle + resource_adaptor_h resource = resource_adaptor_create(); + TRYM_IF(NULL == resource, "sal_resource_create_handle() Fail"); + + // 5) register auth adaptor listener auth_adaptor_listener_h auth_listener = sal_auth_register_listener(auth); TRYM_IF(NULL == auth_listener, "sal_auth_register_listener() Fail"); - // 5) register contact adaptor listener + // 6) register contact adaptor listener contact_adaptor_listener_h contact_listener = sal_contact_register_listener(contact); TRYM_IF(NULL == contact_listener, "sal_contact_register_listener() Fail"); - // 6) register storage adaptor listener + // 7) register storage adaptor listener storage_adaptor_listener_h storage_listener = sal_storage_register_listener(storage); TRYM_IF(NULL == storage_listener, "sal_storage_register_listener() Fail"); - // 7) create service adaptor - sal = (service_adaptor_h) g_malloc0(sizeof(service_adaptor_s)); + // 8) register resource adaptor listener + resource_adaptor_listener_h resource_listener = sal_resource_register_listener(resource); + TRYM_IF(NULL == resource_listener, "sal_resource_register_listener() Fail"); + + // 9) create service adaptor + sal = (sal_h) g_malloc0(sizeof(sal_s)); TRYM_IF(NULL == sal, "could not create service adaptor"); sal->auth = auth; sal->contact = contact; sal->storage = storage; + sal->resource = resource; g_mutex_init(&sal->mutex); g_cond_init(&sal->cond); catch: - // free + // TODO: free return sal; } @@ -185,7 +296,7 @@ catch: * * @return void. */ -static void _sal_destroy(service_adaptor_h sal) +static void _sal_destroy(sal_h sal) { SAL_FN_CALL; @@ -215,7 +326,7 @@ static service_adaptor_error_e _sal_init() int ret = SERVICE_ADAPTOR_ERROR_NONE; // 1) create adaptor (memory allocation) - service_adaptor_h sal = _sal_create(); + sal_h sal = _sal_create(); RETVM_IF(NULL == sal, SERVICE_ADAPTOR_ERROR_INTERNAL, "_sal_create() Fail"); // 2) start adaptor (plugin loading) @@ -226,9 +337,9 @@ static service_adaptor_error_e _sal_init() ret = _sal_create_spec_file(sal); RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_INTERNAL, "_sal_create_spec_file() Fail(%d)", ret); - // 4) init dbus - ret = sal_ipc_init_server(); - RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_IPC_UNSTABLE, "sal_ipc_init_server() Fail(%d)", ret); + // 4) init dbus server + ret = sal_ipc_server_init(); + RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_IPC_UNSTABLE, "sal_ipc_server_init() Fail(%d)", ret); // 5) assign to global service adaptor handle g_service_adaptor = sal; @@ -254,13 +365,13 @@ static service_adaptor_error_e _sal_init() * @param[in] service_adaptor specifies handle of service adaptor * @return void. */ -static void _sal_deinit(service_adaptor_h sal) +static void _sal_deinit(sal_h sal) { SAL_FN_CALL; RET_IF(NULL == sal); - sal_ipc_deinit_server(); + sal_ipc_server_deinit(); _sal_destroy_spec_file(sal); @@ -324,7 +435,7 @@ int main(int argc, char *argv[]) // cleanup after mainloop g_main_loop_unref(loop); - service_adaptor_h sal = sal_get_handle(); + sal_h sal = sal_get_handle(); _sal_deinit(sal); return 0; @@ -334,14 +445,14 @@ int main(int argc, char *argv[]) //* Public interface definition //****************************************************************************** -service_adaptor_h sal_get_handle() +API sal_h sal_get_handle() { SAL_FN_CALL; return g_service_adaptor; } -char *sal_get_root_path() +API char *sal_get_root_path() { SAL_FN_CALL; @@ -355,20 +466,111 @@ char *sal_get_root_path() return root_path; } -service_adaptor_error_e sal_connect(service_adaptor_h sal) +API service_adaptor_error_e sal_adaptor_connect(const char *uri) { SAL_FN_CALL; - RETV_IF(NULL == sal, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + SAL_INFO("uri: %s", uri); return SERVICE_ADAPTOR_ERROR_NONE; } -service_adaptor_error_e sal_disconnect(service_adaptor_h sal) +API service_adaptor_error_e sal_adaptor_disconnect(const char *uri) { SAL_FN_CALL; - RETV_IF(NULL == sal, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + SAL_INFO("uri: %s", uri); return SERVICE_ADAPTOR_ERROR_NONE; } + +API service_adaptor_error_e sal_adaptor_get_plugins(char ***plugins, int *plugins_size) +{ + SAL_FN_CALL; + + RETV_IF(NULL == g_service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == g_service_adaptor->auth, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + int size = g_list_length(g_service_adaptor->auth->plugins); + RETV_IF(0 == size, SERVICE_ADAPTOR_ERROR_NO_DATA); + + int i = 0; + char **uri = (char **) g_malloc0(sizeof(char *) * size); + + for (GList *list = g_list_first(g_service_adaptor->auth->plugins); list != NULL; list = list->next) + { + auth_plugin_h this = (auth_plugin_h) list->data; + + uri[i] = strdup(this->uri); + } + + *plugins = uri; + *plugins_size = size; + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API service_adaptor_error_e sal_provider_connect(const char *uri, const char *name, const char *package) +{ + SAL_FN_CALL; + + RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + app_control_h request; + app_control_create(&request); + + app_control_set_app_id(request, uri); + app_control_set_operation(request, PLUGIN_CONNECT_URI); + + provider_user_data_h provider_user_data = (provider_user_data_h) g_malloc0(sizeof(provider_user_data_s)); + provider_user_data->uri = strdup(uri); + provider_user_data->name = strdup(name); + provider_user_data->package = strdup(package); + + int ret = app_control_send_launch_request(request, _provider_connect_cb, provider_user_data); + + RETVM_IF(APP_CONTROL_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_SYSTEM, "app_control_send_launch_request() Fail(%d)", ret); + + app_control_destroy(request); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API service_adaptor_error_e sal_provider_disconnect(const char *uri) +{ + SAL_FN_CALL; + + RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER); + + app_control_h request; + app_control_create(&request); + + app_control_set_app_id(request, uri); + app_control_set_operation(request, PLUGIN_DISCONNECT_URI); + + int ret = app_control_send_launch_request(request, _provider_disconnect_cb, (void *) uri); + + RETVM_IF(APP_CONTROL_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_SYSTEM, "app_control_send_launch_request() Fail(%d)", ret); + + app_control_destroy(request); + + return SERVICE_ADAPTOR_ERROR_NONE; +} + +API char *sal_provider_get_uri(const char *package) +{ + SAL_FN_CALL; + + RETV_IF(NULL == package, NULL); + + sal_h sal = sal_get_handle(); + RETVM_IF(NULL == sal, NULL, "sal_get_handle() Fail"); + + char *uri = auth_adaptor_get_uri(sal->auth, package); + + return uri; +} diff --git a/server/sal_observer.c b/server/sal_observer.c index b012215..b2285b3 100644 --- a/server/sal_observer.c +++ b/server/sal_observer.c @@ -18,14 +18,19 @@ */ #include +#include #include #include +#include #include #include +#include "service_adaptor_internal.h" + #include "sal.h" #include "sal_observer.h" +#include "auth_adaptor.h" //****************************************************************************** //* Global variables and defines @@ -47,16 +52,16 @@ */ static bool _sal_app_meta_cb(const char *key, const char *value, void *user_data) { - SAL_FN_CALL; - - char **app_meta = (char **) user_data; + provider_user_data_h provider_user_data = (provider_user_data_h) user_data; if ((NULL != key) && (NULL != value)) { if (0 == strncmp(SAL_PLUGIN_METADATA_KEY_ADAPTOR, key, strlen(SAL_PLUGIN_METADATA_KEY_ADAPTOR))) { - app_meta[0] = strdup(value); - SAL_INFO("SAL_PLUGIN_METADATA_KEY_ADAPTOR: %s", value); + SAL_INFO("%s: %s", provider_user_data->uri, value); + int ret = sal_provider_connect(provider_user_data->uri, value, provider_user_data->package); + + RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, false, "sal_plugin_connect() Fail(%d)", ret); } } @@ -70,25 +75,20 @@ static bool _sal_app_meta_cb(const char *key, const char *value, void *user_data */ static bool _sal_app_info_cb(package_info_app_component_type_e comp_type, const char *app_id, void *user_data) { - SAL_FN_CALL; - app_info_h app_info = NULL; int ret = PACKAGE_MANAGER_ERROR_NONE; - char *pkg_path = (char *) user_data; - char **app_meta = (char **) g_malloc0(sizeof(char *) * 1); + char *package = (char *) user_data; - (void) pkg_path; + provider_user_data_h provider_user_data = (provider_user_data_h) g_malloc0(sizeof(provider_user_data_s)); + provider_user_data->uri = strdup(app_id); + provider_user_data->package = strdup(package); app_info_create(app_id, &app_info); - ret = app_info_foreach_metadata(app_info, _sal_app_meta_cb, (void *) app_meta); + ret = app_info_foreach_metadata(app_info, _sal_app_meta_cb, provider_user_data); RETVM_IF(PACKAGE_MANAGER_ERROR_NONE != ret, false, "app_info_foreach_metadata() Fail(%d)", ret); app_info_destroy(app_info); - // TODO: using app_meta - - SAL_FREE(app_meta); - return true; } @@ -105,31 +105,58 @@ static void _sal_package_event_cb(const char *type, package_manager_error_e error, void *user_data) { - SAL_FN_CALL; + if ((PACKAGE_MANAGER_EVENT_TYPE_INSTALL == event_type) && (PACKAGE_MANAGER_EVENT_STATE_COMPLETED == event_state)) + { + int ret = PACKAGE_MANAGER_ERROR_NONE; + package_info_h p_info = NULL; + + ret = package_manager_get_package_info(package, &p_info); + RETM_IF(PACKAGE_MANAGER_ERROR_NONE != ret, "package_manager_get_package_info() Fail(%d)", ret); - if ((PACKAGE_MANAGER_EVENT_TYPE_INSTALL == event_type) - && (PACKAGE_MANAGER_EVENT_STATE_COMPLETED == event_state)) + ret = package_info_foreach_app_from_package(p_info, PACKAGE_INFO_ALLAPP, _sal_app_info_cb, (void *) package); + RETM_IF(PACKAGE_MANAGER_ERROR_NONE != ret, "package_info_foreach_app_from_package() Fail(%d)", ret); + + ret = package_info_destroy(p_info); + RETM_IF(PACKAGE_MANAGER_ERROR_NONE != ret, "package_info_destroy() Fail(%d)", ret); + } + else if ((PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL == event_type) && (PACKAGE_MANAGER_EVENT_STATE_COMPLETED == event_state)) { - int ret = PACKAGE_MANAGER_ERROR_NONE; - package_info_h p_info = NULL; + sal_h sal = sal_get_handle(); + RETM_IF(NULL == sal, "sal_get_handle() Fail"); + + char *uri = sal_provider_get_uri(package); + + auth_plugin_h auth_plugin = auth_adaptor_get_plugin(sal->auth, uri); + auth_adaptor_remove_plugin(sal->auth, auth_plugin); + auth_adaptor_unregister_plugin_service(auth_plugin); + auth_adaptor_destroy_plugin(auth_plugin); - ret = package_manager_get_package_info(package, &p_info); - RETM_IF(PACKAGE_MANAGER_ERROR_NONE != ret, "package_manager_get_package_info() Fail(%d)", ret); + storage_plugin_h storage_plugin = storage_adaptor_get_plugin(sal->storage, uri); + storage_adaptor_remove_plugin(sal->storage, storage_plugin); + storage_adaptor_unregister_plugin_service(storage_plugin); + storage_adaptor_destroy_plugin(storage_plugin); - char *path = NULL; - ret = package_info_get_root_path(p_info, &path); - RETM_IF(PACKAGE_MANAGER_ERROR_NONE != ret, "package_info_get_root_path() Fail(%d)", ret); + // TODO: destroy plugin of other adaptor + } +} - ret = package_info_foreach_app_from_package(p_info, PACKAGE_INFO_ALLAPP, _sal_app_info_cb, path); - RETM_IF(PACKAGE_MANAGER_ERROR_NONE != ret, "package_info_foreach_app_from_package() Fail(%d)", ret); +/** + * @brief callback of package_manager_foreach_package_info() + * + * @return void. + */ +static bool _sal_package_info_cb(package_info_h package_info, void *user_data) +{ + int ret = PACKAGE_MANAGER_ERROR_NONE; - ret = package_info_destroy(p_info); - RETM_IF(PACKAGE_MANAGER_ERROR_NONE != ret, "package_info_destroy() Fail(%d)", ret); + char *package = NULL; + ret = package_info_get_package(package_info, &package); + RETVM_IF(PACKAGE_MANAGER_ERROR_NONE != ret, false, "package_info_get_package() Fail(%d)", ret); - SAL_FREE(path); - } + ret = package_info_foreach_app_from_package(package_info, PACKAGE_INFO_ALLAPP, _sal_app_info_cb, package); + RETVM_IF(PACKAGE_MANAGER_ERROR_NONE != ret, false, "package_info_foreach_app_from_package() Fail(%d)", ret); - SAL_FN_END; + return true; } //****************************************************************************** @@ -153,3 +180,18 @@ service_adaptor_error_e sal_observer_start() return SERVICE_ADAPTOR_ERROR_NONE; } + +/** + * @brief register existing plugin using package manager + * + * @return void. + */ +service_adaptor_error_e sal_observer_register_existed_plugin() +{ + int ret = PACKAGE_MANAGER_ERROR_NONE; + + ret = package_manager_foreach_package_info(_sal_package_info_cb, NULL); + RETVM_IF(PACKAGE_MANAGER_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_SYSTEM, "package_manager_foreach_package_info() Fail(%d)", ret); + + return SERVICE_ADAPTOR_ERROR_NONE; +} diff --git a/server/sal_observer.h b/server/sal_observer.h index 1f87a3e..01c962e 100644 --- a/server/sal_observer.h +++ b/server/sal_observer.h @@ -27,5 +27,6 @@ #include "service_adaptor_errors.h" service_adaptor_error_e sal_observer_start(); +service_adaptor_error_e sal_observer_register_existed_plugin(); #endif /* __TIZEN_CONVERGENCE_SAL_OBSERVER_H__ */ diff --git a/server/sal_resource.c b/server/sal_resource.c new file mode 100644 index 0000000..c465e0c --- /dev/null +++ b/server/sal_resource.c @@ -0,0 +1,56 @@ +/* + * Service Adaptor + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "sal_resource.h" +#include "service_adaptor_internal.h" + +//****************************************************************************** +//* Global variables and defines +//****************************************************************************** + +//****************************************************************************** +//* Private interface +//****************************************************************************** + +//****************************************************************************** +//* Private interface definition +//****************************************************************************** + +//****************************************************************************** +//* Public interface definition +//****************************************************************************** + +resource_adaptor_listener_h sal_resource_register_listener(resource_adaptor_h resource) +{ + int ret = SERVICE_ADAPTOR_ERROR_NONE; + + resource_adaptor_listener_h listener = + (resource_adaptor_listener_h) g_malloc0(sizeof(resource_adaptor_listener_s)); + + ret = resource_adaptor_register_listener(resource, listener); + + if (SERVICE_ADAPTOR_ERROR_NONE != ret) + { + SAL_FREE(listener); + } + + return listener; +} diff --git a/server/sal_resource.h b/server/sal_resource.h new file mode 100644 index 0000000..e79c2f7 --- /dev/null +++ b/server/sal_resource.h @@ -0,0 +1,31 @@ +/* + * Service Adaptor + * + * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Yongjin Kim + * Jinhyeong Ahn + * Jiwon Kim + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __TIZEN_CONVERGENCE_SAL_RESOURCE_H__ +#define __TIZEN_CONVERGENCE_SAL_RESOURCE_H__ + +#include "resource_adaptor.h" + +resource_adaptor_listener_h sal_resource_register_listener(resource_adaptor_h resource); + +#endif /* __TIZEN_CONVERGENCE_SAL_RESOURCE_H__ */ diff --git a/server/sal_storage.c b/server/sal_storage.c index cd7e901..64c0a4e 100644 --- a/server/sal_storage.c +++ b/server/sal_storage.c @@ -38,13 +38,6 @@ //* Public interface definition //****************************************************************************** -storage_adaptor_h sal_storage_create_handle() -{ - storage_adaptor_h storage_adaptor = storage_adaptor_create(); - - return storage_adaptor; -} - storage_adaptor_listener_h sal_storage_register_listener(storage_adaptor_h storage) { int ret = SERVICE_ADAPTOR_ERROR_NONE; diff --git a/server/sal_storage.h b/server/sal_storage.h index 9ee3680..b01955e 100644 --- a/server/sal_storage.h +++ b/server/sal_storage.h @@ -26,7 +26,6 @@ #include "storage_adaptor.h" -storage_adaptor_h sal_storage_create_handle(); storage_adaptor_listener_h sal_storage_register_listener(storage_adaptor_h storage); #endif /* __TIZEN_CONVERGENCE_SAL_STORAGE_H__ */ diff --git a/service-adaptor.manifest b/service-adaptor.manifest index ef546a3..fcb2a80 100644 --- a/service-adaptor.manifest +++ b/service-adaptor.manifest @@ -1,9 +1,6 @@ - - @@ -22,6 +19,8 @@ + + diff --git a/service-adaptor.pc.in b/service-adaptor.pc.in index 73a9e12..f928be8 100644 --- a/service-adaptor.pc.in +++ b/service-adaptor.pc.in @@ -4,6 +4,9 @@ includedir=${prefix}/include Name: service-adaptor library Description: service-adaptor library 1.0 -Version: $version -Libs: -L${libdir} -lsal-common -lsal-client -Cflags: -I${includedir}/service-adaptor + +Requires: capi-base-common +Version: @VERSION@ + +Libs: -L${libdir} -lsal-common-client -lservice-adaptor -lservice-provider +Cflags: -I${includedir}/service-adaptor -I${includedir}/service-provider diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 437d198..4141487 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -11,6 +11,8 @@ MESSAGE("") MESSAGE(">>> current directory: ${CMAKE_CURRENT_SOURCE_DIR}") MESSAGE(">>> Build type: ${CMAKE_BUILD_TYPE}") +ADD_DEFINITIONS("-DSERVICE_ADAPTOR_DEBUGGING") + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${VISIBILITY} -fvisibility=hidden") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,--gc-sections") @@ -21,10 +23,11 @@ SET(TEST-SRCS INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/include + ${CMAKE_SOURCE_DIR}/client ) INCLUDE(FindPkgConfig) -pkg_check_modules(test_pkgs REQUIRED dlog glib-2.0) +pkg_check_modules(test_pkgs REQUIRED dlog glib-2.0 capi-appfw-application) FOREACH(flag ${test_pkgs_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") @@ -39,5 +42,5 @@ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie") ADD_EXECUTABLE(${TEST-EXE} ${TEST-SRCS}) -TARGET_LINK_LIBRARIES(${TEST-EXE} ${test_pkgs_LDFLAGS} sal-client) +TARGET_LINK_LIBRARIES(${TEST-EXE} ${test_pkgs_LDFLAGS} service-adaptor) INSTALL(TARGETS ${TEST-EXE} DESTINATION bin) diff --git a/test/test.c b/test/test.c index 7fb1ab9..46d64f5 100644 --- a/test/test.c +++ b/test/test.c @@ -1,6 +1,140 @@ #include +#include +#include +#include +#include -int main() +#include "service_adaptor.h" + +service_plugin_h service_plugin = NULL; + +void _service_auth_oauth1_cb(int result, service_auth_oauth1_h oauth1, void *user_data) +{ + char *access_token = NULL; + service_auth_oauth1_get_access_token(oauth1, &access_token); + + printf("access_token = %s (%s)\n", access_token, (char *) user_data); +} + +bool _service_storage_cloud_file_cb(int result, service_storage_cloud_file_h file, void *user_data) +{ + char *cloud_path = NULL; + service_storage_cloud_file_get_cloud_path(file, &cloud_path); + + printf("cloud_path = %s (%s)\n", cloud_path, (char *) user_data); + + return true; +} + +void _service_plugin_login_callback(int result, void *user_data) +{ + int ret = SERVICE_ADAPTOR_ERROR_NONE; + + ret = service_plugin_start(service_plugin); + + if (SERVICE_ADAPTOR_ERROR_NONE != ret) + { + printf("service_plugin_start Failed(%d)\n", ret); + return; + } + + /* operation */ + service_auth_oauth1_h oauth1 = NULL; + ret = service_auth_oauth1_create(service_plugin, &oauth1); + ret = service_auth_oauth1_set_callback(oauth1, _service_auth_oauth1_cb, NULL); + ret = service_auth_oauth1_set_operation(oauth1, SERVICE_AUTH_OAUTH1_0_GET_ACCESS_TOKEN_URI); + + service_task_h auth_task = NULL; + ret = service_auth_oauth1_create_task(oauth1, &auth_task); + ret = service_task_start(auth_task); + if (SERVICE_ADAPTOR_ERROR_NONE == ret) + { + printf("service_auth_oauth1_get_access_token() Request Successed\n"); + } + + char *cloud_path = "/root/cloud"; + service_storage_cloud_file_h file = NULL; + ret = service_storage_cloud_file_create(service_plugin, &file); + ret = service_storage_cloud_file_set_callback(file, _service_storage_cloud_file_cb, NULL); + ret = service_storage_cloud_file_set_cloud_path(file, cloud_path); + ret = service_storage_cloud_file_set_operation(file, SERVICE_STORAGE_CLOUD_REMOVE_FILE_URI); + + service_task_h task = NULL; + ret = service_storage_cloud_file_create_task(file, &task); + ret = service_task_start(task); + if (SERVICE_ADAPTOR_ERROR_NONE == ret) + { + printf("service_storage_cloud_remove_file() Request Successed: %s\n", cloud_path); + } +} + +bool _service_adaptor_plugin_callback(const char *uri, int service_mask, void *user_data) +{ + if (0 != strcmp(uri, "org.tizen.service-plugin-sample")) + { + return true; + } + + int ret = SERVICE_ADAPTOR_ERROR_NONE; + + ret = service_plugin_create(uri, &service_plugin); + + if (SERVICE_ADAPTOR_ERROR_NONE != ret) + { + printf("service_plugin_create(%s) Failed(%d)\n", uri, ret); + return true; + } + + ret = service_plugin_login(service_plugin, _service_plugin_login_callback, NULL); + + if (SERVICE_ADAPTOR_ERROR_NONE != ret) + { + printf("service_plugin_login(%s) Failed(%d)\n", uri, ret); + return true; + } + + return true; +} + +static gint _sigterm_callback(void *data) { + g_main_loop_quit((GMainLoop*)data); + return 0; } + +int main() +{ + GMainLoop *loop = NULL; + +#if !GLIB_CHECK_VERSION(2,32,0) + g_thread_init(NULL); +#endif +#if !GLIB_CHECK_VERSION(2,35,0) + g_type_init(); +#endif + + /* init */ + int ret = SERVICE_ADAPTOR_ERROR_NONE; + + ret = service_adaptor_connect(); + ret = service_adaptor_foreach_plugin(_service_adaptor_plugin_callback, NULL); + + loop = g_main_loop_new(NULL, FALSE); + + g_unix_signal_add_full(G_PRIORITY_HIGH, SIGINT, + _sigterm_callback, loop, NULL ); + g_unix_signal_add_full(G_PRIORITY_HIGH, SIGTERM, + _sigterm_callback, loop, NULL ); + + g_main_loop_run(loop); + + g_main_loop_unref(loop); + + /* deinit */ + ret = service_plugin_stop(service_plugin); + ret = service_plugin_destroy(service_plugin); + ret = service_adaptor_disconnect(); + + return ret; +}