From: Jooseok Park Date: Tue, 11 Apr 2017 00:39:48 +0000 (+0900) Subject: [WIP] iotcon notification draft X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fheads%2Fdevel%2Fnotification;p=platform%2Fcore%2Fiot%2Fiotcon.git [WIP] iotcon notification draft Change-Id: If4a1d5e721c72d3163cbdfe4eebbad8e428367a1 --- diff --git a/CMakeLists.txt b/CMakeLists.txt index ca6d5cb..16f8e79 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,3 +35,4 @@ FILE(GLOB HEADER include/*.h) INSTALL(FILES ${HEADER} DESTINATION ${INCLUDE_INSTALL_DIR}/${LIB}) ADD_SUBDIRECTORY(test) +ADD_SUBDIRECTORY(notification) diff --git a/notification/CMakeLists.txt b/notification/CMakeLists.txt new file mode 100755 index 0000000..61b6bba --- /dev/null +++ b/notification/CMakeLists.txt @@ -0,0 +1,31 @@ +PROJECT(iotcon-notification C) + +SET(LIB ${PROJECT_NAME}) +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/notification/include ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/src) + +MESSAGE("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@") +MESSAGE("CMAKE_SOURCE_DIR: ${CMAKE_SOURCE_DIR}") +MESSAGE("LIB_INSTALL_DIR: ${LIB_INSTALL_DIR}") +MESSAGE("CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}") +MESSAGE("LIB: ${LIB}") + +SET(SRCS + src/iotcon-ns-provider.c + src/iotcon-ns-consumer.c +) + +# library +ADD_LIBRARY(${LIB} SHARED ${SRCS}) +TARGET_LINK_LIBRARIES(${LIB} ${pkgs_LIBRARIES}) +SET_TARGET_PROPERTIES(${LIB} PROPERTIES VERSION ${FULLVER} SOVERSION ${MAJORVER}) +INSTALL(TARGETS ${LIB} DESTINATION ${LIB_INSTALL_DIR}) + +# pkgconfig file +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +CONFIGURE_FILE(${LIB}.pc.in ${LIB}.pc @ONLY) +INSTALL(FILES ${LIB}.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) + +# header file +FILE(GLOB HEADER include/*.h) +INSTALL(FILES ${HEADER} DESTINATION ${INCLUDE_INSTALL_DIR}/${LIB}) + diff --git a/notification/doc/iotcon-ns_doc.h b/notification/doc/iotcon-ns_doc.h new file mode 100755 index 0000000..351e498 --- /dev/null +++ b/notification/doc/iotcon-ns_doc.h @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2015 - 2016 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_IOTCON_NS_DOC_H__ +#define __TIZEN_IOTCON_NS_DOC_H__ + +/** + * @ingroup CAPI_NETWORK_FRAMEWORK + * @defgroup CAPI_IOT_CONNECTIVITY_NOTIFICATION_SERVICE IoTCon Notification Service + * @brief The IoTCon notification service provides notification functions for IoT connectivity. + * + * @section CAPI_IOT_CONNECTIVITY_NOTIFICATION_SERVICE_HEADER Required Header + * \#include + * + * @section CAPI_IOT_CONNECTIVITY_NOTIFICATION_SERVICE_OVERVIEW Overview + * The iotcon notification service provides notification service features based on IoTivity service.\n + * + * @section CAPI_IOT_CONNECTIVITY_NOTIFICATION_SERVICE_FEATURE Related Features + * This API is related with the following features: \n + * - http://tizen.org/feature/iot.ocf \n + * It is recommended to design feature related codes in your application for reliability. \n + * You can check if a device supports the related features for this API by using @ref CAPI_SYSTEM_SYSTEM_INFO_MODULE, thereby controlling the procedure of your application. \n + * To ensure your application is only running on the device with specific features, please define the features in your manifest file using the manifest editor in the SDK. \n + * More details on featuring your application can be found from Feature Element. + */ + +/** + * @ingroup CAPI_IOT_CONNECTIVITY_NOTIFICATION_SERVICE + * @defgroup CAPI_IOT_CONNECTIVITY_NOTIFICATION_SERVICE_COMMON Common + * @brief This provides notification provider functionality. + * + * @section CAPI_IOT_CONNECTIVITY_NOTIFICATION_SERVICE_COMMON_HEADER Required Header + * \#include + * + * @section CAPI_IOT_CONNECTIVITY_NOTIFICATION_SERVICE_COMMON_OVERVIEW Overview + * The iotcon notification service common provides common functionality for notification service features based on IoTivity service.\n + * + * @section CAPI_IOT_CONNECTIVITY_NOTIFICATION_SERVICE_COMMON_FEATURE Related Features + * This API is related with the following features: \n + * - http://tizen.org/feature/iot.ocf \n + * It is recommended to design feature related codes in your application for reliability. \n + * You can check if a device supports the related features for this API by using @ref CAPI_SYSTEM_SYSTEM_INFO_MODULE, thereby controlling the procedure of your application. \n + * To ensure your application is only running on the device with specific features, please define the features in your manifest file using the manifest editor in the SDK. \n + * More details on featuring your application can be found from Feature Element. + */ + +/** + * @ingroup CAPI_IOT_CONNECTIVITY_NOTIFICATION_SERVICE + * @defgroup CAPI_IOT_CONNECTIVITY_NOTIFICATION_SERVICE_PROVIDER Provider + * @brief This provides notification provider functionality. + * + * @section CAPI_IOT_CONNECTIVITY_NOTIFICATION_SERVICE_PROVIDER_HEADER Required Header + * \#include + * + * @section CAPI_IOT_CONNECTIVITY_NOTIFICATION_SERVICE_PROVIDER_OVERVIEW Overview + * The iotcon notification service provider provides notification provider service features based on IoTivity service.\n + * + * @section CAPI_IOT_CONNECTIVITY_NOTIFICATION_SERVICE_PROVIDER_FEATURE Related Features + * This API is related with the following features: \n + * - http://tizen.org/feature/iot.ocf \n + * It is recommended to design feature related codes in your application for reliability. \n + * You can check if a device supports the related features for this API by using @ref CAPI_SYSTEM_SYSTEM_INFO_MODULE, thereby controlling the procedure of your application. \n + * To ensure your application is only running on the device with specific features, please define the features in your manifest file using the manifest editor in the SDK. \n + * More details on featuring your application can be found from Feature Element. + */ + +/** + * @ingroup CAPI_IOT_CONNECTIVITY_NOTIFICATION_SERVICE + * @defgroup CAPI_IOT_CONNECTIVITY_NOTIFICATION_SERVICE_CONSUMER Consumer + * @brief This provides notification provider functionality. + * + * @section CAPI_IOT_CONNECTIVITY_NOTIFICATION_SERVICE_CONSUMER_HEADER Required Header + * \#include + * + * @section CAPI_IOT_CONNECTIVITY_NOTIFICATION_SERVICE_CONSUMER_OVERVIEW Overview + * The iotcon notification service consumer provides notification consumer service features based on IoTivity service.\n + * + * @section CAPI_IOT_CONNECTIVITY_NOTIFICATION_SERVICE_CONSUMER_FEATURE Related Features + * This API is related with the following features: \n + * - http://tizen.org/feature/iot.ocf \n + * It is recommended to design feature related codes in your application for reliability. \n + * You can check if a device supports the related features for this API by using @ref CAPI_SYSTEM_SYSTEM_INFO_MODULE, thereby controlling the procedure of your application. \n + * To ensure your application is only running on the device with specific features, please define the features in your manifest file using the manifest editor in the SDK. \n + * More details on featuring your application can be found from Feature Element. + */ + +#endif /* __TIZEN_IOTCON_NS_DOC_H__ */ diff --git a/notification/include/iotcon-ns-common.h b/notification/include/iotcon-ns-common.h new file mode 100755 index 0000000..8b0cd05 --- /dev/null +++ b/notification/include/iotcon-ns-common.h @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2015 - 2016 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 __IOTCON_NS_COMMON_H__ +#define __IOTCON_NS_COMMON_H__ + + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + + +/** + * @file "iotcon-ns-common.h" + */ + + +/** + * @addtogroup CAPI_IOT_CONNECTIVITY_NOTIFICATION_SERVICE_COMMON + * @{ + */ + + +/** + * @brief The message handle for notification service. + * @since_tizen 4.0 + */ +typedef struct _icl_ns_message_s *iotcon_ns_message_h; + +/** + * @brief The synchronization handle of the notification message. + * @since_tizen 4.0 + */ +typedef struct _icl_ns_sync_info_s *iotcon_ns_sync_info_h; + +/** + * @brief The topic linked list handle. + * @since_tizen 4.0 + */ +typedef struct _icl_ns_topic_list_s *iotcon_ns_topic_list_h; + + +/** + * @brief Invoked when the synchronization data is received. + * @since_tizen 4.0 + * @param[in] sync_info The synchronization information of the notification message + */ +typedef void (*iotcon_ns_sync_info_received_cb)(iotcon_ns_sync_info_h sync_info); + +/** + * @brief Provider state for notification consumer service. + * @since_tizen 4.0 + */ +typedef enum { + IOTCON_NS_PROVIDER_STATE_ALLOW = 1, /**< ALLOW */ + IOTCON_NS_PROVIDER_STATE_DENY = 2, /**< DENY */ + IOTCON_NS_PROVIDER_STATE_TOPIC = 3, /**< TOPIC */ + IOTCON_NS_PROVIDER_STATE_DISCOVERED = 11, /**< DISCOVERED */ + IOTCON_NS_PROVIDER_STATE_STOPPED = 12 /**< STOPPED */ +} iotcon_ns_provider_state_e; + +/** + * @brief Notification message sync state. + * @since_tizen 4.0 + */ +typedef enum { + IOTCON_NS_SYNC_STATE_UNREAD = 0, /**< UNREAD */ + IOTCON_NS_SYNC_STATE_READ = 1, /**< READ */ + IOTCON_NS_SYNC_STATE_DELETED = 2, /**< DELETED */ +} iotcon_ns_sync_state_e; + +/** + * @brief Notification message type. + * @since_tizen 4.0 + */ +typedef enum { + IOTCON_NS_MESSAGE_NONE = 0, /**< NONE */ + IOTCON_NS_MESSAGE_ALERT = 1, /**< ALERT */ + IOTCON_NS_MESSAGE_NOTICE = 2, /**< NOTICE */ + IOTCON_NS_MESSAGE_EVENT = 3, /**< EVENT */ + IOTCON_NS_MESSAGE_INFO = 4, /**< INFO */ + IOTCON_NS_MESSAGE_WARNING = 5, /**< WARNING */ + IOTCON_NS_MESSAGE_READ = 11, /**< READ */ + IOTCON_NS_MESSAGE_DELETED = 12 /**< DELETED */ +} iotcon_ns_message_type_e; + +/** + * @brief Notification topic state. + * @since_tizen 4.0 + */ +typedef enum { + IOTCON_NS_TOPIC_STATE_UNSUBSCRIBED = 0, /**< UNSUBSCRIBED */ + IOTCON_NS_TOPIC_STATE_SUBSCRIBED = 1, /**< SUBSCRIBED */ +} iotcon_ns_topic_state_e; + + + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __IOTCON_NS_COMMON_H__ */ diff --git a/notification/include/iotcon-ns-consumer.h b/notification/include/iotcon-ns-consumer.h new file mode 100755 index 0000000..333d591 --- /dev/null +++ b/notification/include/iotcon-ns-consumer.h @@ -0,0 +1,259 @@ +/* + * Copyright (c) 2015 - 2016 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 __IOTCON_NS_CONSUMER_H__ +#define __IOTCON_NS_CONSUMER_H__ + + +#ifdef __cplusplus +extern "C" { +#endif + +#include "iotcon-ns-common.h" + +/** + * @file iotcon-ns-consumer.h + */ + + +/** + * @addtogroup CAPI_IOT_CONNECTIVITY_NOTIFICATION_SERVICE_CONSUMER + * @{ + */ + +/** + * @brief Invoked when the provider state is changed. + * @since_tizen 4.0 + * @param[in] provider_id The provider id which has the notification resource. + * Provider id will be freed after this callback returns. + * @param[in] state The provider state + */ +typedef void (*iotcon_ns_provider_state_changed_cb)(char *provider_id, iotcon_ns_provider_state_e state); + +/** + * @brief Invoked when the notification message from provider is received. + * @since_tizen 4.0 + * @param[in] message The notification message + */ +typedef void (*iotcon_ns_message_received_cb)(iotcon_ns_message_h message); + +/** + * @brief Specifies the type of function passed to iotcon_ns_consumer_foreach_topic_list(). + * @since_tizen 4.0 + * @param[in] name The topic name + * @param[in] state The topic state + * @param[in] user_data The user data to pass to the function + * @return @c true to continue with the next iteration of the loop, + * otherwise @c false to break out of the loop + * @see iotcon_ns_consumer_foreach_topic_list() + */ +typedef bool (*iotcon_ns_topic_list_cb)(const char *name, iotcon_ns_topic_state_e state, void *user_data); + +/** + * @brief Start notification service for consumer. + * @since_tizen 4.0 + * @privlevel public + * @privilege %http://tizen.org/privilege/internet + * @param[in] provider_changed_cb The callback to be invoked when the provider state is changed + * @param[in] message_received_cb The callback to be invoked when the notification message from provider is received + * @param[in] sync_info_received_cb The callback to be invoked when the synchronization data is received + * @return @c 0 on success, otherwise a negative error value + * @see iotcon_ns_consumer_stop() + */ +int iotcon_ns_consumer_start(iotcon_ns_provider_state_changed_cb provider_changed_cb, + iotcon_ns_message_received_cb message_received_cb, + iotcon_ns_sync_info_received_cb sync_info_received_cb); + +/** + * @brief Terminate notification service for consumer. + * @since_tizen 4.0 + * @return @c 0 on success, otherwise a negative error value + * @see iotcon_ns_consumer_start() + */ +int iotcon_ns_consumer_stop(void); + +/** + * @brief Request to subscribe notification message resource of provider. + * @since_tizen 4.0 + * @privlevel public + * @privilege %http://tizen.org/privilege/internet + * @param[in] provider_id The provider id to which consumer subscribe + * @return @c 0 on success, otherwise a negative error value + * @see iotcon_ns_consumer_unsubscribe() + */ +int iotcon_ns_consumer_subscribe(const char *provider_id); + +/** + * @brief Request to unsubscribe in order not to receive notification message from provider. + * @since_tizen 4.0 + * @privlevel public + * @privilege %http://tizen.org/privilege/internet + * @param[in] provider_id The provider id to which consumer unsubscribe + * @return @c 0 on success, otherwise a negative error value + * @see iotcon_ns_consumer_subscribe() + */ +int iotcon_ns_consumer_unsubscribe(const char *provider_id); + +/** + * @brief Send sync state to provider in order to synchronize notification status with other consumers. + * @since_tizen 4.0 + * @privlevel public + * @privilege %http://tizen.org/privilege/internet + * @param[in] provider_id The provider id of the Notification message + * @param[in] message_id The Notification message id to synchronize the state + * @param[in] state The sync state + * @return @c 0 on success, otherwise a negative error value + */ +int iotcon_ns_consumer_send_sync_info(const char *provider_id, unsigned long long message_id, + iotcon_ns_sync_state_e state); +/** + * @brief Request to discover provider manually. + * @since_tizen 4.0 + * @privlevel public + * @privilege %http://tizen.org/privilege/internet + * @return @c 0 on success, otherwise a negative error value + */ +int iotcon_ns_consumer_rescan(void); + +/** + * @brief Calls a function for each element of the topic list + * @since_tizen 4.0 + * @param[in] provider_id The provider id + * @param[in] cb The callback function to invoke + * @param[in] user_data The user data to pass to the function + * @return @c 0 on success, otherwise a negative error value + * @see iotcon_ns_topic_list_cb() + */ +int iotcon_ns_consumer_foreach_topic_list(const char *provider_id, iotcon_ns_topic_list_cb cb, void *user_data); + +/** + * @brief Update the topic list that is wanted to subscribe or unsubscribe from provider. + * @since_tizen 4.0 + * @privlevel public + * @privilege %http://tizen.org/privilege/internet + * @param[in] provider_id The provider id which send the notification message + * @param[in] topic_list The topic list that consumer wants to set + * @return @c 0 on success, otherwise a negative error value + */ +int iotcon_ns_consumer_update_topic_list(const char *provider_id, iotcon_ns_topic_list_h topic_list); + +/** + * @brief Get message id in message handle. + * @since_tizen 4.0 + * @param[in] message The notification message handle which is received from provider + * @param[out] message_id The message id + * @return @c 0 on success, otherwise a negative error value + */ +int iotcon_ns_consumer_message_get_id(iotcon_ns_message_h *message, unsigned long long *message_id); + +/** + * @brief Get message id in message handle. + * @since_tizen 4.0 + * @remarks You must release @c provider_id using free() + * @param[in] message The notification message handle which is received from provider + * @param[out] provider_id The message id + * @return @c 0 on success, otherwise a negative error value + */ +int iotcon_ns_consumer_message_get_provider_id(iotcon_ns_message_h *message, char **provider_id); + +/** + * @brief Get message type in message handle.(optional) + * @since_tizen 4.0 + * @param[in] message The notification message handle which is received from provider + * @param[out] type The message type (#iotcon_ns_message_type_e) + * @return @c 0 on success, otherwise a negative error value + */ +int iotcon_ns_consumer_message_get_type(iotcon_ns_message_h *message, iotcon_ns_message_type_e *type); + +/** + * @brief Get date time in message handle.(optional) + * @since_tizen 4.0 + * @remarks You must release @c date_time using free() + * @param[in] message The notification message handle which is received from provider + * @param[out] date_time The date time + * @return @c 0 on success, otherwise a negative error value + */ +int iotcon_ns_consumer_message_get_date_time(iotcon_ns_message_h *message, char **date_time); + +/** + * @brief Get ttl in message handle.(optional) + * @since_tizen 4.0 + * @param[in] message The notification message handle which is received from provider + * @param[out] ttl The time to live + * @return @c 0 on success, otherwise a negative error value + */ +int iotcon_ns_consumer_message_get_ttl(iotcon_ns_message_h *message, unsigned long long *ttl); + +/** + * @brief Get the title in message handle.(optional) + * @since_tizen 4.0 + * @remarks You must release @c title using free() + * @param[in] message The notification message handle which is received from provider + * @param[out] title The title + * @return @c 0 on success, otherwise a negative error value + */ +int iotcon_ns_consumer_message_get_title(iotcon_ns_message_h *message, char **title); + +/** + * @brief Get the content text in message handle.(optional) + * @since_tizen 4.0 + * @remarks You must release @c content_text using free() + * @param[in] message The notification message handle which is received from provider + * @param[out] content_text The content text + * @return @c 0 on success, otherwise a negative error value + */ +int iotcon_ns_consumer_message_get_content_text(iotcon_ns_message_h *message, char **content_text); + +/** + * @brief Get the source name in message handle.(optional) + * @since_tizen 4.0 + * @remarks You must release @c source_name using free() + * @param[in] message The notification message handle which is received from provider + * @param[out] source_name The source name + * @return @c 0 on success, otherwise a negative error value + */ +int iotcon_ns_consumer_message_get_source_name(iotcon_ns_message_h *message, char **source_name); + +/** + * @brief Get the icon image in message handle.(optional) + * @since_tizen 4.0 + * @remarks You must release @c icon_image using free() + * @param[in] message The notification message handle which is received from provider + * @param[out] icon_image The icon image + * @return @c 0 on success, otherwise a negative error value + */ +int iotcon_ns_consumer_message_get_icon_image(iotcon_ns_message_h *message, char **icon_image); + +/** + * @brief Get the topic name in message handle.(optional) + * @since_tizen 4.0 + * @remarks You must release @c topic_name using free() + * @param[in] message The notification message handle which is received from provider + * @param[out] topic_name The topic name + * @return @c 0 on success, otherwise a negative error value + */ +int iotcon_ns_consumer_message_get_topic_name(iotcon_ns_message_h *message, char **topic_name); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __IOTCON_NS_CONSUMER_H__ */ diff --git a/notification/include/iotcon-ns-provider.h b/notification/include/iotcon-ns-provider.h new file mode 100755 index 0000000..cc5a97c --- /dev/null +++ b/notification/include/iotcon-ns-provider.h @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2015 - 2016 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 __IOTCON_NS_PROVIDER_H__ +#define __IOTCON_NS_PROVIDER_H__ + + +#ifdef __cplusplus +extern "C" { +#endif + +#include "iotcon-ns-common.h" + +/** + * @file iotcon-ns-provider.h + */ + + +/** + * @addtogroup CAPI_IOT_CONNECTIVITY_NOTIFICATION_SERVICE_PROVIDER + * @{ + */ + +/** + * @brief Invoked when provider receives the subscription request of consumer. + * @since_tizen 4.0 + * @param[in] consumer_id The consumer id which subscribes the notification message resource + * Consumer id will be freed after this callback returns. + */ +typedef void (*iotcon_ns_subscription_request_cb)(char *consumer_id); + + +// TODO need to recheck what is param's usage +/** + * @brief Start notification service for provider. + * @since_tizen 4.0 + * @privlevel public + * @privilege %http://tizen.org/privilege/internet + * @param[in] subscription_request_cb The callback to be invoked when the subscription request from consumer is received + * @param[in] sync_info_cb The callback to be invoked when the synchronization data, read and deleted, is sent by consumer is received + * @param[in] sub_controllability Set the subscription policy for notification service which checks whether provider is capable of + * denying the subscription of notification message from consumer + * and getting controllabliity to set consumer topic list. + * If true, provider is able to control subscription request and consumer topic list. + * @param[in] resource_security Set on/off for secure resource channel setting + * @return @c 0 on success, otherwise a negative error value + * @see iotcon_ns_provider_stop() + */ +int iotcon_ns_provider_start(iotcon_ns_subscription_request_cb subscription_request_cb, + iotcon_ns_sync_info_received_cb sync_info_cb, + bool sub_controllability, bool resource_security); // TODO: check whether separate cb set api is needed or not. + +/** + * @brief Terminate notification service for provider. + * @since_tizen 4.0 + * @privlevel public + * @privilege %http://tizen.org/privilege/internet + * @return @c 0 on success, + * otherwise a negative error value + * @see iotcon_ns_provider_start() + */ +int iotcon_ns_provider_stop(void); + +/** + * @brief Send notification message to all subscribers. + * @since_tizen 4.0 + * @privlevel public + * @privilege %http://tizen.org/privilege/internet + * @param[in] msg The notification message including provider id, message id, title, content text + * @return @c 0 on success, otherwise a negative error value + */ +int iotcon_ns_provider_send_msg(iotcon_ns_message_h msg); + +/** + * @brief Send acceptance to consumer which subscribes the resource of notification message. + * @since_tizen 4.0 + * @privlevel public + * @privilege %http://tizen.org/privilege/internet + * @remarks This function is valid only when sub_controllability is set true. + * @param[in] consumer_id The consumer id which subscribes the resource + * @param[in] accepted The result of acceptance + * @return @c 0 on success, otherwise a negative error value + */ +int iotcon_ns_provider_accept_subscription(const char *consumer_id, bool accepted); + +/** + * @brief Send synchronizad state of notificaion message to consumers. + * @since_tizen 4.0 + * @privlevel public + * @privilege %http://tizen.org/privilege/internet + * @param[in] message_id The Notification message id to synchronize the state + * @param[in] state The sync state + * @return @c 0 on success, otherwise a negative error value + */ +int iotcon_ns_provider_send_sync_info(unsigned long long message_id, iotcon_ns_sync_state_e state); + +/** + * @brief Create notification message. + * @since_tizen 4.0 + * @privlevel public + * @privilege %http://tizen.org/privilege/internet + * @remarks message handle will be returned with mandatory fields which message id and provider id are filled with. + * @param[out] msg The Notification message handle + * @return @c 0 on success, otherwise a negative error value + */ +int iotcon_ns_provider_create_message(iotcon_ns_message_h *msg); + +/** + * @brief Add topic to topic list which is located in provider service storage. + * @since_tizen 4.0 + * @privlevel public + * @privilege %http://tizen.org/privilege/internet + * @param[in] topic_name The topic name to add + * @return @c 0 on success, otherwise a negative error value + */ +int iotcon_ns_provider_register_topic(const char *topic_name); + +/** + * @brief Delete topic from topic list + * @since_tizen 4.0 + * @privlevel public + * @privilege %http://tizen.org/privilege/internet + * @param[in] topic_name The topic name to delete + * @return @c 0 on success, otherwise a negative error value + */ +int iotcon_ns_provider_unregister_topic(const char *topic_name); + +// TODO: what is set /unset conumser_topic API?? +/** + * @brief Select a topic name for a consumer + * @since_tizen 4.0 + * @privlevel public + * @privilege %http://tizen.org/privilege/internet + * @param[in] consumer_id The consumer id for which the user on provider selects a topic + * @param[in] topic_name The topic name to select + * @return @c 0 on success, otherwise a negative error value + */ +int iotcon_ns_provider_set_consumer_topic(const char *consumer_id, const char *topic_name); + +/** + * @brief Unselect a topic from the topic list for consumer + * @since_tizen 4.0 + * @privlevel public + * @privilege %http://tizen.org/privilege/internet + * @param[in] consumer_id The consumer id for which the user on provider unselects a topic + * @param[in] topic_name The topic name to unselect + * @return @c 0 on success, otherwise a negative error value + */ +int iotcon_ns_provider_unset_consumer_topic(const char *consumer_id, const char *topic_name); + +/** + * @brief Get the list of topics with subscription state for the consumer + * @since_tizen 4.0 + * @privlevel public + * @privilege %http://tizen.org/privilege/internet + * @param[in] consumer_id The consumer id for which topic list is subscribed for + * @param[out] topic_listThe topic list + * @return @c 0 on success, otherwise a negative error value + */ +int iotcon_ns_provider_get_consumer_topics(const char *consumer_id, iotcon_ns_topic_list_h *topic_list); + +/** + * @brief Get the list of topics which are registered by provider + * @since_tizen 4.0 + * @privlevel public + * @privilege %http://tizen.org/privilege/internet + * @param[out] topic_list The topic list + * @return @c 0 on success, otherwise a negative error value + */ +int iotcon_ns_provider_get_topics(iotcon_ns_topic_list_h *topic_list); // TODO: change it to foreach API + + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif /* __IOTCON_NS_PROVIDER_H__ */ diff --git a/notification/include/iotcon-ns.h b/notification/include/iotcon-ns.h new file mode 100755 index 0000000..5a28649 --- /dev/null +++ b/notification/include/iotcon-ns.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2015 - 2016 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 __IOTCON_NS_H__ +#define __IOTCON_NS_H__ + + +#ifdef __cplusplus +extern "C" { +#endif + +#include "iotcon-ns-common.h" +#include "iotcon-ns-provider.h" +#include "iotcon-ns-consumer.h" + +/** + * @file "iotcon-ns.h" + * @brief This file contains iotcon notification service related headers. + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __IOTCON_NS_H__ */ diff --git a/notification/iotcon-notification.pc.in b/notification/iotcon-notification.pc.in new file mode 100644 index 0000000..e69de29 diff --git a/notification/iotivity_header/NSCommon.h b/notification/iotivity_header/NSCommon.h new file mode 100644 index 0000000..35200df --- /dev/null +++ b/notification/iotivity_header/NSCommon.h @@ -0,0 +1,171 @@ +//****************************************************************** +// +// Copyright 2016 Samsung Electronics 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. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +/** + * @file + * + * This file provides APIs of Notification Service for common functions. + */ + +#ifndef _NS_COMMON_H_ +#define _NS_COMMON_H_ + +#include +#include + +#define NS_UUID_STRING_SIZE 37 +//#define WITH_MQ +/** + * Result code of notification service + */ +typedef enum eResult +{ + NS_OK = 100, + NS_ERROR = 200, + NS_SUCCESS = 300, + NS_FAIL = 400, + +} NSResult; + +/** + * Provider state of notification consumer service + */ +typedef enum +{ + NS_ALLOW = 1, + NS_DENY = 2, + NS_TOPIC = 3, + NS_DISCOVERED = 11, + NS_STOPPED = 12 +} NSProviderState; + +/** + * Notification message status to synchronize + */ +typedef enum +{ + NS_SYNC_UNREAD = 0, + NS_SYNC_READ = 1, + NS_SYNC_DELETED = 2, + +} NSSyncType; + +/** + * Notification Message Type + * Alert mean is High / critical + * Notice mean is low / critical + * Event mean is High / Normal + * Information mean is Low / Normal + */ +typedef enum +{ + NS_MESSAGE_ALERT = 1, + NS_MESSAGE_NOTICE = 2, + NS_MESSAGE_EVENT = 3, + NS_MESSAGE_INFO = 4, + NS_MESSAGE_WARNING = 5, + NS_MESSAGE_READ = 11, + NS_MESSAGE_DELETED = 12 + +} NSMessageType; + +/** + * Notification topic state + */ +typedef enum +{ + NS_TOPIC_UNSUBSCRIBED = 0, + NS_TOPIC_SUBSCRIBED = 1, + +} NSTopicState; + +/** + * Topic linked list + */ +typedef struct _nsTopic +{ + char * topicName; + NSTopicState state; + struct _nsTopic * next; + +} NSTopicLL; + +/** + * Consumer information + */ +typedef struct +{ + char consumerId[NS_UUID_STRING_SIZE]; + +} NSConsumer; + +/** + * Provider information + */ +typedef struct +{ + char providerId[NS_UUID_STRING_SIZE]; + +} NSProvider; + +/** + * Media Contents of Notification Message (Optional) + */ +typedef struct +{ + char * iconImage; + +} NSMediaContents; + +/** + * Notification Message + */ +typedef struct +{ + //Mandatory + uint64_t messageId; + char providerId[NS_UUID_STRING_SIZE]; + + //optional + NSMessageType type; + char * dateTime; + uint64_t ttl; + char * title; + char * contentText; + char * sourceName; + NSMediaContents * mediaContents; + char * topic; + OCRepPayload * extraInfo; + +} NSMessage; + +/** + * Synchronization information of the notification message + */ +typedef struct +{ + uint64_t messageId; + char providerId[NS_UUID_STRING_SIZE]; + NSSyncType state; + +} NSSyncInfo; + +#endif /* _NS_COMMON_H_ */ + diff --git a/notification/iotivity_header/NSConsumerInterface.h b/notification/iotivity_header/NSConsumerInterface.h new file mode 100644 index 0000000..a25675f --- /dev/null +++ b/notification/iotivity_header/NSConsumerInterface.h @@ -0,0 +1,154 @@ +//****************************************************************** +// +// Copyright 2016 Samsung Electronics 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. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +/** + * @file + * + * This file provides APIs of Notification Service for Consumer. + */ + +#ifndef _NS_CONSUMER_INTERFACE_H_ +#define _NS_CONSUMER_INTERFACE_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif // __cplusplus + +#include "NSCommon.h" + +/** + * Invoked when the provider state is changed + * @param[in] provider Provider which has the notification resource + * @param[in] state Response which has the provider state + */ +typedef void (* NSProviderStateCallback)(NSProvider *, NSProviderState); + +/** + * Invoked when the notification message from provider is received + * synchronization + * @param[in] message Notification message + */ +typedef void (* NSMessageReceivedCallback)(NSMessage *); + +/** + * Invoked when the synchronization data which has notification message + * read/delete event from provider/consumer is received + * synchronization + * @param[in] syncInfo Synchronization information of the notification message + */ +typedef void (* NSSyncInfoReceivedCallback)(NSSyncInfo *); + +typedef struct +{ + NSProviderStateCallback changedCb; + NSMessageReceivedCallback messageCb; + NSSyncInfoReceivedCallback syncInfoCb; + +} NSConsumerConfig; + +/** + * Initialize notification service for consumer + * @param[in] config NSConsumerconfig structure of callback functions + * @return ::NS_OK or result code of NSResult + */ +NSResult NSStartConsumer(NSConsumerConfig config); + +/** + * Terminate notification service for consumer + * @return ::NS_OK or result code of NSResult + */ +NSResult NSStopConsumer(); + +/** + * Request to discover to remote address as parameter. + * @param[in] server address combined with IP address and port number using delimiter : + * @return ::NS_OK or result code of NSResult + */ +NSResult NSConsumerEnableRemoteService(const char * serverAddress); + +#ifdef WITH_MQ +/** + * Request to subscribe to remote MQ address as parameter. + * @param[in] server address combined with IP address and port number and MQ broker uri using delimiter : + * @param[in] topicName the interest MQ Topic name for subscription. + * @return ::NS_OK or result code of NSResult + */ +NSResult NSConsumerSubscribeMQService(const char * serverAddress, const char * topicName); +#endif + +/** + * Request discovery manually + * @return ::NS_OK or result code of NSResult + */ +NSResult NSRescanProvider(); + +/** + * Request to subscribe notification message resource of provider + * @param[in] providerId the Id of Provider who send the notification message + * @return ::NS_OK or result code of NSResult + */ +NSResult NSSubscribe(const char * providerId); + +/** + * Request to unsubscribe in order not to receive notification message from provider + * @param[in] providerId the Id of Provider who send the notification message + * @return ::NS_OK or result code of NSResult + */ +NSResult NSUnsubscribe(const char * providerId); + +/** + * Send sync type to provider in order to synchronize notification status with other consumers + * when consumer consumes the notification such as READ, DELETE + * @param[in] providerId Provider id of the Notification message + * @param[in] messageId Notification message id to synchronize the status + * @param[in] type changed notification status from NSSyncType + * @return ::NS_OK or result code of NSResult + */ +NSResult NSConsumerSendSyncInfo( + const char * providerId, uint64_t messageId, NSSyncType type); + +/** + * Request NSProvider that is matched by provider id + * @param[in] providerId the id of provider that user wants to get + * @return NSProvider + */ +NSProvider * NSConsumerGetProvider(const char * providerId); + +/** + * Request NSTopic list that is subscribed from provider + * @param[in] providerId the Id of provider that user wants to get + * @return NSResult + */ +NSTopicLL * NSConsumerGetTopicList(const char * providerId); + +/** + * Select Topic list that is wanted to subscribe from provider + * @param[in] providerId the Id of provider that user wants to set + * @param[in] topics the topic list that user wants to set + * @return NSResult + */ +NSResult NSConsumerUpdateTopicList(const char * providerId, NSTopicLL * topics); + +#ifdef __cplusplus +} +#endif // __cplusplus + +#endif // _NS_CONSUMER_INTERFACE_H_ diff --git a/notification/iotivity_header/NSProviderInterface.h b/notification/iotivity_header/NSProviderInterface.h new file mode 100755 index 0000000..260c554 --- /dev/null +++ b/notification/iotivity_header/NSProviderInterface.h @@ -0,0 +1,191 @@ +//****************************************************************** +// +// Copyright 2016 Samsung Electronics 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. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +/** + * @file + * + * This file provides APIs of Notification Service for Provider. + */ + +#ifndef _NS_PROVIDER_INTERFACE_H_ +#define _NS_PROVIDER_INTERFACE_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif // __cplusplus + +#include "NSCommon.h" +#include +#include +/** + * Invoked when provider receives the subscription request of consumer. + * @param[in] consumer Consumer who subscribes the notification message resource + */ +typedef void (*NSSubscribeRequestCallback)(NSConsumer *); + +/** + * Invoked when synchronization data which has notification message + * read/deleted event from consumer is received. + * @param[in] sync Synchronization information of the notification message + */ +typedef void (*NSProviderSyncInfoCallback)(NSSyncInfo *); + +/** + * Set provider service with the following configuration + */ +typedef struct +{ + /* Invoked when the subscription request from consumer is received */ + NSSubscribeRequestCallback subRequestCallback; + /* Invoked when the synchronization data, read and deleted, is sent by consumer is received */ + NSProviderSyncInfoCallback syncInfoCallback; + /* Set the policy for notification servcie which checks whether provider is capable of + * denying the subscription of notification message from consumer + * and getting controllabliity to set consumer topic list. + * If true, provider is able to control subscription request and consumer topic list. + * Otherwise(policy is false), consumer can do the same. + */ + bool subControllability; + /* User defined information such as device friendly name */ + char * userInfo; + /* Set on/off for secure resource channel setting */ + bool resourceSecurity; + +} NSProviderConfig; + +/** + * Initialize notification service for provider + * @param[in] config Refer to NSProviderConfig + * @return ::NS_OK if the action is requested succesfully + */ +NSResult NSStartProvider(NSProviderConfig config); + +/** + * Terminate notification service for provider + * @return ::NS_OK if the action is requested succesfully + */ +NSResult NSStopProvider(); + +/** + * Request to publish resource using remote relay server + * @param[in] server address combined with IP address and port number using delimiter : + * @return ::NS_OK if the action is requested succesfully or NS_FAIL if wrong parameter is set. + */ +NSResult NSProviderEnableRemoteService(char * serverAddress); + +/** + * Request to terminate remote service from relay server + * @param[in] server address combined with IP address and port number using delimiter : + * @return ::NS_OK if the action is requested succesfully or NS_FAIL if wrong parameter is set. + */ +NSResult NSProviderDisableRemoteService(char * serverAddress); + +#ifdef WITH_MQ +/** + * Request to subscribe to remote MQ address as parameter. + * @param[in] server address combined with IP address and port number and MQ broker uri using delimiter : + * @param[in] topicName the interest Topic name for subscription. + * @return ::NS_OK or result code of NSResult + */ +NSResult NSProviderSubscribeMQService(const char * serverAddress, const char * topicName); +#endif + +/** + * Send notification message to all subscribers + * @param[in] message Notification message including id, title, contentText + * @return ::NS_OK if the action is requested succesfully or NS_FAIL if wrong parameter is set. + */ +NSResult NSSendMessage(NSMessage * msg); + +/** + * Send acceptance to consumer who subscribes the resource of notification message + * This function is valid only when subControllability is set true. + * @param[in] consumer Consumer who subscribes the resource + * @param[in] accepted the result of acceptance; ALLOW or DENY + * @return ::NS_OK if this function is requested succesfully + * or NS_FAIL if subContollability is false. + */ +NSResult NSAcceptSubscription(const char * consumerId, bool accepted); + +/** + * Send synchronizad state of notificaion message to consumers + * @param[in] messageiId ID of notification message + * @param[in] type SyncType of the syncInfo message + * @return ::NS_OK if the action is requested succesfully or NS_FAIL if wrong parameter is set. + */ +NSResult NSProviderSendSyncInfo(uint64_t messageId, NSSyncType type); + +/** + * Initialize NSMessage struct. + * Service sets mandatory fields which message id and provider(device) id are filled with. + * @return ::NSMessage * + */ +NSMessage * NSCreateMessage(); + +/** + * Add topic to topic list which is located in provider service storage + * @param[in] topicName Topic name to add + * @return ::NS_OK if the action is requested succesfully or NS_FAIL if wrong parameter is set. + */ +NSResult NSProviderRegisterTopic(const char * topicName); + +/** + * Delete topic from topic list + * @param[in] topicName Topic name to delete + * @return ::NS_OK if the action is requested succesfully or NS_FAIL if wrong parameter is set. + */ +NSResult NSProviderUnregisterTopic(const char * topicName); + +/** + * Select a topic name for a consumer + * @param[in] consumerId consumer id for which the user on provider selects a topic + * @param[in] topicName Topic name to select + * @return ::NS_OK if the action is requested succesfully or NS_FAIL if subContollability is false + */ +NSResult NSProviderSetConsumerTopic(const char * consumerId, const char * topicName); + +/** + * Unselect a topic from the topic list for consumer + * @param[in] consumerId consumer id for which the user on provider unselects a topic + * @param[in] topicName Topic name to unselect + * @return ::NS_OK if the action is requested succesfully or NS_FAIL if subContollability is false + */ +NSResult NSProviderUnsetConsumerTopic(const char * consumerId, const char * topicName); + +/** + * Request topic list with selection state for the consumer + * @param[in] consumerid the id of consumer which topic list is subscribed for + * @return :: Topic list + */ +NSTopicLL * NSProviderGetConsumerTopics(const char * consumerId); + +/** + * Request topics list already registered by provider user + * @return :: Topic list + */ +NSTopicLL * NSProviderGetTopics(); + +#ifdef __cplusplus +} +#endif // __cplusplus + +#endif /* _NS_PROVIDER_INTERFACE_H_ */ + diff --git a/notification/src/ic-ns-common.h b/notification/src/ic-ns-common.h new file mode 100755 index 0000000..c542646 --- /dev/null +++ b/notification/src/ic-ns-common.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2015 - 2016 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 __IC_NS_COMMON_H__ +#define __IC_NS_COMMON_H__ + +#include +#include "iotcon-ns-common.h" + +#include "iotcon-errors.h" +#include "ic-log.h" // TODO: need to add separate file +#include "ic-utils.h" // TODO: need to add separate file + +#ifdef API +#undef API +#endif +#define API __attribute__((visibility("default"))) +/**************************************************************/ +#if 0 // TODO: removed + +#define ICL_NS_UUID_STRING_SIZE 37 + +typedef struct _icl_ns_provider_s { + char provider_id[ICL_NS_UUID_STRING_SIZE]; +} icl_ns_provider_s; + +typedef struct _icl_ns_consumer_s { + char consumer_id[ICL_NS_UUID_STRING_SIZE]; +} icl_ns_consumer_s; +#endif + +typedef struct _icl_ns_message_s { + /* Mandatory */ + unsigned long long message_id; + char *provider_id; + + /* Optional */ + // TODO check whether all param is needed or not + iotcon_ns_message_type_e type; + char *date_time; + unsigned long long ttl; + char *title; + char *content_text; + char *source_name; + char *icon_image; + char *topic_name; +} icl_ns_message_s; + +typedef struct _icl_ns_sync_info_s { + unsigned long long message_id; + char *provider_id; + iotcon_ns_sync_state_e state; +} icl_ns_sync_info_s; + +typedef struct _icl_ns_topic_list_s { + char *topic_name; + iotcon_ns_topic_state_e topic_state; + struct _icl_ns_topic_list_s *next; +} icl_ns_topic_list_s; + +#endif /* __IC_NS_COMMON_H__ */ diff --git a/notification/src/iotcon-ns-consumer.c b/notification/src/iotcon-ns-consumer.c new file mode 100755 index 0000000..6d184f4 --- /dev/null +++ b/notification/src/iotcon-ns-consumer.c @@ -0,0 +1,489 @@ +/* + * Copyright (c) 2015 - 2016 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 "ic-ns-common.h" +#include "iotcon-ns-consumer.h" + +#include + +/* TODO : need to check whether handler is introduced instead of many global variable as below */ +/* +typedef struct { + bool consumer_started; + iotcon_ns_provider_state_changed_cb provider_cb; + iotcon_ns_message_received_cb msg_cb; + iotcon_ns_sync_info_received_cb sync_cb; + void *user_data; +} iotcon_ns_consumer_h; +static iotcon_ns_consumer_h g_consumer; +*/ +static bool g_consumer_started = false; +static iotcon_ns_provider_state_changed_cb g_provider_changed_cb; +static iotcon_ns_message_received_cb g_message_received_cb; +static iotcon_ns_sync_info_received_cb g_sync_info_received_cb; + +static void on_provider_changed(NSProvider *ioty_provider, NSProviderState ioty_state) +{ + FN_CALL; + DBG("providerId :[%s], state :[%d]", ioty_provider->providerId, ioty_state); + + char *provider_id = NULL; + iotcon_ns_provider_state_e state; + + if (ioty_provider->providerId) + provider_id = strdup(ioty_provider->providerId); + state = ioty_state; + + if (g_provider_changed_cb) + g_provider_changed_cb(provider_id, state); + + free(provider_id); +} +static void on_messsage_received(NSMessage *ioty_msg) +{ + FN_CALL; + DBG("messageId :[%lld]", (long long int)ioty_msg->messageId); + DBG("providerId : [%s]", ioty_msg->providerId); + DBG("type : [%d]", ioty_msg->type); + DBG("dateTime : [%s]", ioty_msg->dateTime); + DBG("ttl : [%lld]", (long long int)ioty_msg->ttl); + DBG("title : [%s]", ioty_msg->title); + DBG("content : [%s]", ioty_msg->contentText); + DBG("source : [%s]", ioty_msg->sourceName); + DBG("topic : [%s]", ioty_msg->topic); + + iotcon_ns_message_h message = NULL; + message = calloc(1, sizeof(icl_ns_message_s)); + if (NULL == message) { + ERR("calloc() Fail(%d)", errno); + return; + } + + /* Mandatory */ + message->message_id = ioty_msg->messageId; + if (ioty_msg->providerId) + message->provider_id = strdup(ioty_msg->providerId); + + /* Optional */ + message->type = ioty_msg->type; + if (ioty_msg->dateTime) + message->date_time = strdup(ioty_msg->dateTime); + message->ttl = ioty_msg->ttl; + if (ioty_msg->title) + message->title = strdup(ioty_msg->title); + if (ioty_msg->contentText) + message->content_text = strdup(ioty_msg->contentText); + if (ioty_msg->sourceName) + message->source_name = strdup(ioty_msg->sourceName); + if (ioty_msg->mediaContents && ioty_msg->mediaContents->iconImage) + message->icon_image = strdup(ioty_msg->mediaContents->iconImage); + if (ioty_msg->topic) + message->topic_name = strdup(ioty_msg->topic); + + if (g_message_received_cb) + g_message_received_cb(message); + + free(message->provider_id); + free(message->date_time); + free(message->title); + free(message->content_text); + free(message->source_name); + free(message->icon_image); + free(message->topic_name); + free(message); +} + +static void on_sync_info_received(NSSyncInfo *ioty_sync_info) +{ + FN_CALL; + DBG("messageId :[%lld]", (long long int)ioty_sync_info->messageId); + DBG("providerId :[%s], sync state :[%d]", ioty_sync_info->providerId, ioty_sync_info->state); + + iotcon_ns_sync_info_h sync_info = NULL; + sync_info = calloc(1, sizeof(icl_ns_sync_info_s)); + if (NULL == sync_info) { + ERR("calloc() Fail(%d)", errno); + return; + } + + sync_info->message_id = ioty_sync_info->messageId; + if (ioty_sync_info->providerId) + sync_info->provider_id = strdup(ioty_sync_info->providerId); + sync_info->state = ioty_sync_info->state; + + if (g_sync_info_received_cb) + g_sync_info_received_cb(sync_info); + + free(sync_info->provider_id); + free(sync_info); +} + +API int iotcon_ns_consumer_start(iotcon_ns_provider_state_changed_cb provider_changed_cb, + iotcon_ns_message_received_cb message_received_cb, + iotcon_ns_sync_info_received_cb sync_info_received_cb) +{ + API_CALL; + RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED); + RETV_IF(false == ic_utils_check_permission(IC_PERMISSION_INTERNET), IOTCON_ERROR_PERMISSION_DENIED); + + RETV_IF(NULL == provider_changed_cb, IOTCON_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == message_received_cb, IOTCON_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == sync_info_received_cb, IOTCON_ERROR_INVALID_PARAMETER); + + if (g_consumer_started) { + ERR("Already started"); + return IOTCON_ERROR_ALREADY; + } + + NSConsumerConfig config = {0,}; + config.changedCb = on_provider_changed; + config.messageCb = on_messsage_received; + config.syncInfoCb = on_sync_info_received; + + int ret = NSStartConsumer(config); + if (NS_OK != ret) { + ERR("NSStartConsumer() Fail(%d)", ret); + return IOTCON_ERROR_IOTIVITY; + } + + g_consumer_started = true; + g_provider_changed_cb = provider_changed_cb; + g_message_received_cb = message_received_cb; + g_sync_info_received_cb = sync_info_received_cb; + + return IOTCON_ERROR_NONE; +} + +API int iotcon_ns_consumer_stop(void) +{ + API_CALL; + RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED); + + if (!g_consumer_started) { + ERR("consumer is not started"); + return IOTCON_ERROR_IOTIVITY; + } + + int ret = NSStopConsumer(); + if (NS_OK != ret) { + ERR("NSStopConsumer() Fail(%d)", ret); + return IOTCON_ERROR_IOTIVITY; + } + + g_consumer_started = false; + g_provider_changed_cb = NULL; + g_message_received_cb = NULL; + g_sync_info_received_cb = NULL; + + return IOTCON_ERROR_NONE; +} + +API int iotcon_ns_consumer_subscribe(const char *provider_id) +{ + API_CALL; + RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED); + RETV_IF(false == ic_utils_check_permission(IC_PERMISSION_INTERNET), IOTCON_ERROR_PERMISSION_DENIED); + + RETV_IF(NULL == provider_id, IOTCON_ERROR_INVALID_PARAMETER); + + int ret = NSSubscribe(provider_id); + if (NS_OK != ret) { + ERR("NSSubscribe() Fail(%d)", ret); + return IOTCON_ERROR_IOTIVITY; + } + + return IOTCON_ERROR_NONE; +} + +API int iotcon_ns_consumer_unsubscribe(const char *provider_id) +{ + API_CALL; + RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED); + RETV_IF(false == ic_utils_check_permission(IC_PERMISSION_INTERNET), IOTCON_ERROR_PERMISSION_DENIED); + + RETV_IF(NULL == provider_id, IOTCON_ERROR_INVALID_PARAMETER); + +#if 0 /* TODO: need to fix iotivity (there is no NSUnsubscribe API in iotivity header files) */ + int ret = NSUnsubscribe(provider_id); + if (NS_OK != ret) { + ERR("NSUnsubscribe() Fail(%d)", ret); + return IOTCON_ERROR_IOTIVITY; + } +#endif + return IOTCON_ERROR_NONE; +} + +API int iotcon_ns_consumer_send_sync_info(const char *provider_id, unsigned long long message_id, + iotcon_ns_sync_state_e state) +{ + API_CALL; + RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED); + RETV_IF(false == ic_utils_check_permission(IC_PERMISSION_INTERNET), IOTCON_ERROR_PERMISSION_DENIED); + + RETV_IF(NULL == provider_id, IOTCON_ERROR_INVALID_PARAMETER); + + int ret = NSConsumerSendSyncInfo(provider_id, message_id, state); + if (NS_OK != ret) { + ERR("NSConsumerSendSyncInfo() Fail(%d)", ret); + return IOTCON_ERROR_IOTIVITY; + } + + return IOTCON_ERROR_NONE; +} + +API int iotcon_ns_consumer_rescan(void) +{ + API_CALL; + RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED); + RETV_IF(false == ic_utils_check_permission(IC_PERMISSION_INTERNET), IOTCON_ERROR_PERMISSION_DENIED); + + int ret = NSRescanProvider(); + if (NS_OK != ret) { + ERR("NSRescanProvider() Fail(%d)", ret); + return IOTCON_ERROR_IOTIVITY; + } + + return IOTCON_ERROR_NONE; +} + +API int iotcon_ns_consumer_foreach_topic_list(const char *provider_id, iotcon_ns_topic_list_cb cb, void *user_data) +{ + API_CALL; + RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED); + + RETV_IF(NULL == provider_id, IOTCON_ERROR_INVALID_PARAMETER); + + NSTopicLL *ioty_list = NULL; + ioty_list = NSConsumerGetTopicList(provider_id); + if (ioty_list) { + NSTopicLL *iter = ioty_list; + while (iter) { + DBG("topicName:[ %s]\t, state: %d\n", iter->topicName, iter->state); + if (false == cb(iter->topicName, iter->state, user_data)) + break; + iter = iter->next; + } + } + + return IOTCON_ERROR_NONE; +} + +static NSTopicLL *_topic_list_shallow_copy(iotcon_ns_topic_list_h list) +{ + if (NULL == list) + return NULL; + + NSTopicLL *ioty_list = NULL; + NSTopicLL *ioty_last; + + ioty_list = calloc(1, sizeof(NSTopicLL)); + ioty_list->topicName = list->topic_name; + ioty_list->state = list->topic_state; + + ioty_last = ioty_list; + list = list->next; + while (list) { + ioty_last->next = calloc(1, sizeof(NSTopicLL)); + ioty_last = ioty_last->next; + ioty_last->topicName = list->topic_name; + ioty_last->state = list->topic_state; + list = list->next; + } + ioty_last->next = NULL; + + return ioty_list; +} +static void _topic_list_free(NSTopicLL *list) +{ + if (NULL == list) + return; + + NSTopicLL *iter = list; + NSTopicLL *next = NULL; + + while (iter) { + next = iter->next; + free(iter); + iter = next; + } +} +API int iotcon_ns_consumer_update_topic_list(const char *provider_id, iotcon_ns_topic_list_h topic_list) +{ + API_CALL; + RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED); + RETV_IF(false == ic_utils_check_permission(IC_PERMISSION_INTERNET), IOTCON_ERROR_PERMISSION_DENIED); + + RETV_IF(NULL == provider_id, IOTCON_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == topic_list, IOTCON_ERROR_INVALID_PARAMETER); + +#if 1 + if (topic_list) { + iotcon_ns_topic_list_h iter = topic_list; + while (iter) { + DBG("[BEFORE] topic_name:[ %s]\t, topic_state: %d\n", iter->topic_name, iter->topic_state); + iter = iter->next; + } + } +#endif + + NSTopicLL *ioty_list = _topic_list_shallow_copy(topic_list); + +#if 1 + if (ioty_list) { + NSTopicLL *iter = ioty_list; + while (iter) { + DBG("[AFTER]topicName:[ %s]\t, state: %d\n", iter->topicName, iter->state); + iter = iter->next; + } + } +#endif + int ret = NSConsumerUpdateTopicList(provider_id, ioty_list); + if (NS_OK != ret) { + ERR("NSConsumerUpdateTopicList() Fail(%d)", ret); + _topic_list_free(ioty_list); + return IOTCON_ERROR_IOTIVITY; + } + + _topic_list_free(ioty_list); + + return IOTCON_ERROR_NONE; +} + +API int iotcon_ns_consumer_message_get_id(iotcon_ns_message_h *message, unsigned long long *message_id) +{ + RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED); + RETV_IF(NULL == message, IOTCON_ERROR_INVALID_PARAMETER); + + *message_id = ((icl_ns_message_s *)message)->message_id; + + return IOTCON_ERROR_NONE; +} + +API int iotcon_ns_consumer_message_get_provider_id(iotcon_ns_message_h *message, char **provider_id) +{ + RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED); + RETV_IF(NULL == message, IOTCON_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == provider_id, IOTCON_ERROR_INVALID_PARAMETER); + + *provider_id = NULL; + if (((icl_ns_message_s *)message)->provider_id) + *provider_id = strdup(((icl_ns_message_s *)message)->provider_id); + + return IOTCON_ERROR_NONE; +} + + +API int iotcon_ns_consumer_message_get_type(iotcon_ns_message_h *message, iotcon_ns_message_type_e *type) +{ + RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED); + RETV_IF(NULL == message, IOTCON_ERROR_INVALID_PARAMETER); + + *type = ((icl_ns_message_s *)message)->type; + + return IOTCON_ERROR_NONE; +} + +API int iotcon_ns_consumer_message_get_date_time(iotcon_ns_message_h *message, char **date_time) +{ + RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED); + RETV_IF(NULL == message, IOTCON_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == date_time, IOTCON_ERROR_INVALID_PARAMETER); + + *date_time = NULL; + if (((icl_ns_message_s *)message)->date_time) + *date_time = strdup(((icl_ns_message_s *)message)->date_time); + + return IOTCON_ERROR_NONE; +} + +API int iotcon_ns_consumer_message_get_ttl(iotcon_ns_message_h *message, unsigned long long *ttl) +{ + RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED); + RETV_IF(NULL == message, IOTCON_ERROR_INVALID_PARAMETER); + + *ttl = ((icl_ns_message_s *)message)->ttl; + + return IOTCON_ERROR_NONE; +} + +API int iotcon_ns_consumer_message_get_title(iotcon_ns_message_h *message, char **title) +{ + RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED); + RETV_IF(NULL == message, IOTCON_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == title, IOTCON_ERROR_INVALID_PARAMETER); + + *title = NULL; + if (((icl_ns_message_s *)message)->title) + *title = strdup(((icl_ns_message_s *)message)->title); + + return IOTCON_ERROR_NONE; +} + +API int iotcon_ns_consumer_message_get_content_text(iotcon_ns_message_h *message, char **content_text) +{ + RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED); + RETV_IF(NULL == message, IOTCON_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == content_text, IOTCON_ERROR_INVALID_PARAMETER); + + *content_text = NULL; + if (((icl_ns_message_s *)message)->content_text) + *content_text = strdup(((icl_ns_message_s *)message)->content_text); + + return IOTCON_ERROR_NONE; +} + +API int iotcon_ns_consumer_message_get_source_name(iotcon_ns_message_h *message, char **source_name) +{ + RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED); + RETV_IF(NULL == message, IOTCON_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == source_name, IOTCON_ERROR_INVALID_PARAMETER); + + *source_name = NULL; + if (((icl_ns_message_s *)message)->source_name) + *source_name = strdup(((icl_ns_message_s *)message)->source_name); + + return IOTCON_ERROR_NONE; +} + +API int iotcon_ns_consumer_message_get_icon_image(iotcon_ns_message_h *message, char **icon_image) +{ + RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED); + RETV_IF(NULL == message, IOTCON_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == icon_image, IOTCON_ERROR_INVALID_PARAMETER); + + *icon_image = NULL; + if (((icl_ns_message_s *)message)->icon_image) + *icon_image = strdup(((icl_ns_message_s *)message)->icon_image); + + return IOTCON_ERROR_NONE; +} + +API int iotcon_ns_consumer_message_get_topic_name(iotcon_ns_message_h *message, char **topic_name) +{ + RETV_IF(false == ic_utils_check_ocf_feature(), IOTCON_ERROR_NOT_SUPPORTED); + RETV_IF(NULL == message, IOTCON_ERROR_INVALID_PARAMETER); + RETV_IF(NULL == topic_name, IOTCON_ERROR_INVALID_PARAMETER); + + *topic_name = NULL; + if (((icl_ns_message_s *)message)->topic_name) + *topic_name = strdup(((icl_ns_message_s *)message)->topic_name); + + return IOTCON_ERROR_NONE; +} + diff --git a/notification/src/iotcon-ns-provider.c b/notification/src/iotcon-ns-provider.c new file mode 100755 index 0000000..3f53f6e --- /dev/null +++ b/notification/src/iotcon-ns-provider.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2015 - 2016 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 "ic-ns-common.h" +#include "iotcon-ns-provider.h" + +API int iotcon_ns_provider_start(iotcon_ns_subscription_request_cb subscription_request_cb, + iotcon_ns_sync_info_received_cb sync_info_cb, + bool sub_controllability, bool resource_security) +{ + + return IOTCON_ERROR_NONE; +}