From 4f033cfdf853d9237dae8d22154c4b35de69149e Mon Sep 17 00:00:00 2001 From: Dongjin Choi Date: Tue, 26 Mar 2013 08:23:08 +0900 Subject: [PATCH] Update change log and spec for wrt-plugins-tizen_0.4.12 [Issue#] N/A [Problem] Not decided to support [Cause] N/A [Solution] Rollback the code [SCMRequest] N/A --- packaging/wrt-plugins-tizen.spec | 2 +- src/Content/ContentExif.cpp | 245 ------------- src/Content/ContentExif.h | 57 --- src/Content/IContentManager.cpp | 67 +--- src/Content/IContentManager.h | 1 - src/Content/JSContentManager.cpp | 75 ---- src/Content/JSContentManager.h | 9 - src/Content/plugin_config.cpp | 21 -- src/Content/plugin_config.h | 2 - src/DataSync/CMakeLists.txt | 26 +- src/Messaging/JSMessage.cpp | 36 +- src/Messaging/MessageFilterValidatorFactory.cpp | 2 +- ...StorageChangesMessageFilterValidatorFactory.cpp | 2 +- src/Messaging/messageDB/MessageStorageReader.cpp | 31 +- src/SecureStorage/CMakeLists.txt | 25 ++ src/SecureStorage/JSSecureStorageManager.cpp | 407 +++++++++++++++++++++ src/SecureStorage/JSSecureStorageManager.h | 71 ++++ src/SecureStorage/SecureStorageManager.cpp | 265 ++++++++++++++ src/SecureStorage/SecureStorageManager.h | 53 +++ src/SecureStorage/config.xml | 18 + src/SecureStorage/plugin_config.cpp | 123 +++++++ src/SecureStorage/plugin_config.h | 38 ++ src/SecureStorage/plugin_initializer.cpp | 62 ++++ 23 files changed, 1113 insertions(+), 525 deletions(-) delete mode 100755 src/Content/ContentExif.cpp delete mode 100755 src/Content/ContentExif.h create mode 100644 src/SecureStorage/CMakeLists.txt create mode 100644 src/SecureStorage/JSSecureStorageManager.cpp create mode 100644 src/SecureStorage/JSSecureStorageManager.h create mode 100644 src/SecureStorage/SecureStorageManager.cpp create mode 100644 src/SecureStorage/SecureStorageManager.h create mode 100644 src/SecureStorage/config.xml create mode 100644 src/SecureStorage/plugin_config.cpp create mode 100644 src/SecureStorage/plugin_config.h create mode 100644 src/SecureStorage/plugin_initializer.cpp diff --git a/packaging/wrt-plugins-tizen.spec b/packaging/wrt-plugins-tizen.spec index b7fe3aa..60bebfa 100755 --- a/packaging/wrt-plugins-tizen.spec +++ b/packaging/wrt-plugins-tizen.spec @@ -1,6 +1,6 @@ Name: wrt-plugins-tizen Summary: JavaScript plugins for WebRuntime -Version: 0.4.11 +Version: 0.4.12 Release: 0 Group: Development/Libraries License: Apache License, Version 2.0 diff --git a/src/Content/ContentExif.cpp b/src/Content/ContentExif.cpp deleted file mode 100755 index 0a77d75..0000000 --- a/src/Content/ContentExif.cpp +++ /dev/null @@ -1,245 +0,0 @@ -// -// Tizen Web Device API -// Copyright (c) 2012 Samsung Electronics Co., Ltd. -// -// 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 "ContentExif.h" -#include - - -namespace DeviceAPI { -namespace Content { - -ContentExif::ContentExif(std::string path) -{ - fp = fopen(path.c_str(), "rb+"); - m_exifBuf = NULL; -} - -ContentExif::~ContentExif() -{ - if(fp) - { - fclose(fp); - } - if(!m_exifBuf) - { - free(m_exifBuf); - } -} - -unsigned char ContentExif::nextByte() -{ - return getc(fp); -} - -int ContentExif::read_1_byte (void) -{ - int c; - - //todo. check EOF - c = nextByte(); - - return c; -} - -/* Read 2 bytes, convert to unsigned int */ -/* All 2-byte quantities in JPEG markers are MSB first */ -unsigned int ContentExif::read_2_bytes (void) -{ - int c1, c2; - - //todo. check EOF - c1 = nextByte(); - c2 = nextByte(); - return (((unsigned int) c1) << 8) + ((unsigned int) c2); -} - -int ContentExif::LodExif() -{ - unsigned char soi[2]; - - if(fp == NULL) return 0; - - for (int i = 0; i < sizeof(soi); i++) - soi[i] = (unsigned char) read_1_byte(); - - //check soi tag for jpeg - if (soi[0]!=0xFF || soi[1]!=0xD8) - { - LogDebug("can not find SOI tag"); - return -1; - } - - //App marker - for(;;) - { - unsigned char app[2]; - for( int i = 0; i < sizeof(app); i++) - app[i] = (unsigned char) read_1_byte(); - - printf("marker:%02x %02x \n",app[0],app[1]); - if(app[0] == 0xFF && app[1] == 0xE1) - break; - else if(app[0] != 0xFF || !(app[1]==0xEE ||app[1]==0xE0)) - { - LogDebug("Not supported image type."); - return -1; - } - - unsigned int marker_size = read_2_bytes(); - - for( int i =0 ; i < marker_size - 2; i++) - read_1_byte(); - } - - unsigned int len = read_2_bytes() - 8; - if (len < 0) - { - LogDebug("Wrong Image"); - return -2; - } - - //check exif header - unsigned char exif[6]; - for (int i = 0; i < 6; i++) - exif[i] = (unsigned char) read_1_byte(); - - if (exif[0] != 0x45 || exif[1] != 0x78 || exif[2] != 0x69 ||exif[3] != 0x66) - { - LogDebug("can not find EXIF tag"); - return -1; - } - - m_exifBuf = (unsigned char*)calloc(len,sizeof(unsigned char)); - - fread(m_exifBuf, 1, len,fp); - - /* check endian type */ - if (m_exifBuf[0] == 0x49 && m_exifBuf[1] == 0x49) - { - m_endianType = false; - } - else if (m_exifBuf[0] == 0x4D && m_exifBuf[1] == 0x4D) - { - m_endianType = true; - } - else - { - LogDebug("can not find endian tag"); - return -1; - } - - /* Get first IFD offset (offset to IFD0) */ - if (m_endianType) - { - if (m_exifBuf[4] != 0) return 0; - if (m_exifBuf[5] != 0) return 0; - m_offset = m_exifBuf[6]; - m_offset <<= 8; - m_offset += m_exifBuf[7]; - } - else - { - if (m_exifBuf[7] != 0) return 0; - if (m_exifBuf[6] != 0) return 0; - m_offset = m_exifBuf[5]; - m_offset <<= 8; - m_offset += m_exifBuf[4]; - } - - if (m_offset > len - 2) return 0; /* check end of data segment */ - - /* Get the number of directory entries contained in this IFD */ - if (m_endianType) - { - m_tagCount = m_exifBuf[m_offset]; - m_tagCount <<= 8; - m_tagCount += m_exifBuf[m_offset+1]; - } - else - { - m_tagCount = m_exifBuf[m_offset+1]; - m_tagCount <<= 8; - m_tagCount += m_exifBuf[m_offset]; - } - if (m_tagCount == 0) return 0; - m_offset += 2; - - return 1; -} - -bool ContentExif::SetExifChar(unsigned int tag, unsigned char value) -{ - unsigned int _tag; - bool isfound = false; - for(unsigned int i = 0; i < m_tagCount; i++) - { - if(m_endianType) - { - _tag = m_exifBuf[m_offset]; - _tag <<= 8; - _tag += m_exifBuf[m_offset+1]; - } - else - { - _tag = m_exifBuf[m_offset+1]; - _tag <<= 8; - _tag += m_exifBuf[m_offset]; - } - if(_tag == tag) - { - isfound = true; - break; - } - - m_offset += 12; - } - - if(isfound) - { - if (m_endianType) { - m_exifBuf[m_offset+2] = 0; /* Format = unsigned short (2 octets) */ - m_exifBuf[m_offset+3] = 3; - m_exifBuf[m_offset+4] = 0; /* Number Of Components = 1 */ - m_exifBuf[m_offset+5] = 0; - m_exifBuf[m_offset+6] = 0; - m_exifBuf[m_offset+7] = 1; - m_exifBuf[m_offset+8] = 0; - m_exifBuf[m_offset+9] = value; - m_exifBuf[m_offset+10] = 0; - m_exifBuf[m_offset+11] = 0; - } else { - m_exifBuf[m_offset+2] = 3; /* Format = unsigned short (2 octets) */ - m_exifBuf[m_offset+3] = 0; - m_exifBuf[m_offset+4] = 1; /* Number Of Components = 1 */ - m_exifBuf[m_offset+5] = 0; - m_exifBuf[m_offset+6] = 0; - m_exifBuf[m_offset+7] = 0; - m_exifBuf[m_offset+8] = value; - m_exifBuf[m_offset+9] = 0; - m_exifBuf[m_offset+10] = 0; - m_exifBuf[m_offset+11] = 0; - } - - fseek(fp, (4 + 2 + 6 + 2) + m_offset, SEEK_SET); - fwrite(m_exifBuf + 2 + m_offset, 1, 10, fp); - } - return isfound; -} - - -} // Content -} // DeviceAPI diff --git a/src/Content/ContentExif.h b/src/Content/ContentExif.h deleted file mode 100755 index 2aabe3e..0000000 --- a/src/Content/ContentExif.h +++ /dev/null @@ -1,57 +0,0 @@ -// -// Tizen Web Device API -// Copyright (c) 2012 Samsung Electronics Co., Ltd. -// -// 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 _PLATFORM_CONTENT_EXIF_H_ -#define _PLATFORM_CONTENT_EXIF_H_ - -#include - -namespace DeviceAPI { -namespace Content { - -#define EXIF_TAG_ORIENTATION 0x0112 - -class ContentExif -{ -public: - ContentExif(std::string path); - virtual ~ContentExif(); - - int LodExif(); - bool SetExifChar(unsigned int tag, unsigned char value); - -private: - - int read_1_byte(); - unsigned int read_2_bytes(); - unsigned char nextByte(); - - - FILE *fp; - - std::string m_path; - bool m_endianType; - unsigned char *m_exifBuf; - unsigned int m_tagCount; - unsigned int m_offset; -}; - -} // Content -} // DeviceAPI - -#endif // _PLATFORM_CONTENT_UTILITY_H_ \ No newline at end of file diff --git a/src/Content/IContentManager.cpp b/src/Content/IContentManager.cpp index b7511c0..673a660 100755 --- a/src/Content/IContentManager.cpp +++ b/src/Content/IContentManager.cpp @@ -15,7 +15,7 @@ // limitations under the License. // -#include + #include #include #include "IContentManager.h" @@ -25,7 +25,6 @@ #include "ContentVideo.h" #include "ContentAudio.h" #include "ContentManager.h" -#include "ContentExif.h" #include "ContentUtility.h" @@ -333,70 +332,6 @@ bool IMediacontentManager::unsetListener() return ret; } -bool IMediacontentManager::updateMetadata(MediacontentImagePtr &ptr) -{ - LogDebug("ContentManager::updateMetadata called"); - string orientation = ptr->getImageOrientation(); - unsigned char orientation_value; - LogDebug("ContentManager::updateMetadata called1"); - if ( orientation.compare("NORMAL")==0) - { - orientation_value= 1; //MEDIA_CONTENT_ORIENTATION_NORMAL - } - else if (orientation.compare("FLIP_HORIZONTAL")==0) - { - orientation_value = 2; //MEDIA_CONTENT_ORIENTATION_HFLIP; - } - else if (orientation.compare("ROTATE_180")==0) - { - orientation_value = 3; //MEDIA_CONTENT_ORIENTATION_ROT_180; - } - else if (orientation.compare("FLIP_VERTICAL")==0) - { - orientation_value = 4; //MEDIA_CONTENT_ORIENTATION_VFLIP; - } - else if (orientation.compare("TRANSPOSE")==0) - { - orientation_value = 5; //MEDIA_CONTENT_ORIENTATION_TRANSPOSE; - } - else if (orientation.compare("ROTATE_90")==0) - { - orientation_value = 6; //MEDIA_CONTENT_ORIENTATION_ROT_90; - } - else if (orientation.compare("TRANSVERSE")==0) - { - orientation_value = 7; //MEDIA_CONTENT_ORIENTATION_TRANSVERSE; - } - else if (orientation.compare("ROTATE_270")==0) - { - orientation_value = 8; //MEDIA_CONTENT_ORIENTATION_ROT_270; - } - else - { - LogDebug("wrong value."); - return false; - } - LogDebug("ContentManager::updateMetadata called2"); - string real_path = ContentUtility::convertUriToPath(ptr->getFilePath()); - ContentExif exif(real_path.c_str()); - int res = exif.LodExif(); - if( res == 0) - { - ThrowMsg(WrtDeviceApis::Commons::InvalidArgumentException, "Invalid image"); - return false; - } - else if(res < 0) - { - ThrowMsg(WrtDeviceApis::Commons::UnsupportedException, "Not supported image type"); - return false; - - } - exif.SetExifChar(EXIF_TAG_ORIENTATION,orientation_value); - - - return true; - -} } } diff --git a/src/Content/IContentManager.h b/src/Content/IContentManager.h index 6467fb9..a3c45eb 100755 --- a/src/Content/IContentManager.h +++ b/src/Content/IContentManager.h @@ -62,7 +62,6 @@ class IMediacontentManager : virtual bool scanFile(scanCompletedCallback callback, std::string path, void* user_data); virtual bool setListener(void* user_data); virtual bool unsetListener(); - virtual bool updateMetadata(MediacontentImagePtr &ptr); virtual void OnRequestReceived(const IEventFindFolderPtr &value) = 0; virtual void OnRequestReceived(const IEventUpdateMediaPtr &value) = 0; diff --git a/src/Content/JSContentManager.cpp b/src/Content/JSContentManager.cpp index 9c6865c..ef76450 100755 --- a/src/Content/JSContentManager.cpp +++ b/src/Content/JSContentManager.cpp @@ -75,7 +75,6 @@ JSStaticFunction JSMediacontentManager::m_function[] = { CONTENT_FUNCTION_API_SCAN_FILE, scanFile, kJSPropertyAttributeNone }, { CONTENT_FUNCTION_API_SET_CHANGE_LISTENER, setChangeListener, kJSPropertyAttributeNone }, { CONTENT_FUNCTION_API_UNSET_CHANGE_LISTENER, unsetChangeListener,kJSPropertyAttributeNone}, - { CONTENT_FUNCTION_API_UPDATE_METADATA, updateMetadata,kJSPropertyAttributeNone}, { 0, 0, 0 } }; @@ -876,80 +875,6 @@ JSValueRef JSMediacontentManager::unsetChangeListener( } -JSValueRef JSMediacontentManager::updateMetadata( - JSContextRef context, - JSObjectRef object, - JSObjectRef thisObject, - size_t argumentCount, - const JSValueRef arguments[], - JSValueRef* exception) -{ -LogDebug("JSContentManagerManager::updateMetadata entered"); - - - MediacontentManagerPrivObject *privateObject; - privateObject = static_cast(JSObjectGetPrivate(thisObject)); - if (!privateObject) { - return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "private object is null"); - } - - AceSecurityStatus status = CONTENT_CHECK_ACCESS(CONTENT_FUNCTION_API_UPDATE_METADATA); - TIZEN_SYNC_ACCESS_HANDLER(status, context, exception); - - Validator validator(context); - - Try - { - IMediacontentManagerPtr contentMgr = getContentManagerPrivObject(context, thisObject, exception); - - JSObjectRef arg; - if(argumentCount >= 1){ - if (!JSValueIsObjectOfClass(context, arguments[0],JSImage::getClassRef())){ - ThrowMsg(UnsupportedException, "Not supported type."); - } - arg = JSValueToObject(context, arguments[0], exception); - } - else{ - ThrowMsg(ConversionException, "Invalid content type."); - } - - MediacontentImagePtr content = JSImage::getImageObject(arg); - - if (!(contentMgr->updateMetadata(content))) { - ThrowMsg(WrtDeviceApis::Commons::Exception, "updating metadata is failed by unknown reason."); - } - } - Catch(WrtDeviceApis::Commons::UnsupportedException) - { - LogWarning("Exception: "<<_rethrown_exception.GetMessage()); - return JSTizenExceptionFactory::postException(context, exception, JSTizenException::NOT_SUPPORTED_ERROR, _rethrown_exception.GetMessage()); - } - Catch(WrtDeviceApis::Commons::InvalidArgumentException) - { - LogWarning("Exception: "<<_rethrown_exception.GetMessage()); - return JSTizenExceptionFactory::postException(context, exception, JSTizenException::INVALID_VALUES_ERROR, _rethrown_exception.GetMessage()); - } - Catch(WrtDeviceApis::Commons::ConversionException) - { - LogWarning("Exception: "<<_rethrown_exception.GetMessage()); - return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, _rethrown_exception.GetMessage()); - } - Catch(WrtDeviceApis::Commons::NotFoundException) - { - LogWarning("Exception: "<<_rethrown_exception.GetMessage()); - return JSTizenExceptionFactory::postException(context, exception, JSTizenException::NOT_FOUND_ERROR, _rethrown_exception.GetMessage()); - } - Catch(WrtDeviceApis::Commons::Exception) - { - LogWarning("Exception: "<<_rethrown_exception.GetMessage()); - return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, _rethrown_exception.GetMessage()); - } - - return JSValueMakeUndefined(context); - -} - - const JSClassRef JSMediacontentManager::getClassRef() { if (!m_jsClassRef) { m_jsClassRef = JSClassCreate(&m_classInfo); diff --git a/src/Content/JSContentManager.h b/src/Content/JSContentManager.h index 7089727..73599a8 100755 --- a/src/Content/JSContentManager.h +++ b/src/Content/JSContentManager.h @@ -145,15 +145,6 @@ static JSValueRef getMediacontent( JSValueRef* exception); - static JSValueRef updateMetadata( - JSContextRef context, - JSObjectRef object, - JSObjectRef thisObject, - size_t argumentCount, - const JSValueRef arguments[], - JSValueRef* exception); - - /** * This structure contains properties and callbacks that define a type of object. */ diff --git a/src/Content/plugin_config.cpp b/src/Content/plugin_config.cpp index d78216c..9427dfe 100755 --- a/src/Content/plugin_config.cpp +++ b/src/Content/plugin_config.cpp @@ -27,12 +27,9 @@ #define CONTENT_FEATURE_API_READ "http://tizen.org/privilege/content.read" #define CONTENT_FEATURE_API_WRITE "http://tizen.org/privilege/content.write" -#define CONTENT_FEATURE_API_MANAGER_WRITE "http://tizen.org/privilege/contentmanager.write" - #define CONTENT_DEVICE_CAP_READ "content.read" #define CONTENT_DEVICE_CAP_WRITE "content.write" -#define CONTENT_DEVICE_CAP_MANAGER_WRITE "contentmanager.write" using namespace WrtDeviceApis::Commons; @@ -53,7 +50,6 @@ static FunctionMapping createContentFunctions() */ ACE_CREATE_DEVICE_CAP(DEVICE_CAP_CONTENT_READ, CONTENT_DEVICE_CAP_READ); ACE_CREATE_DEVICE_CAP(DEVICE_CAP_CONTENT_WRITE, CONTENT_DEVICE_CAP_WRITE); - ACE_CREATE_DEVICE_CAP(DEVICE_CAP_CONTENT_MANAGER_WRITE, CONTENT_DEVICE_CAP_MANAGER_WRITE); ACE_CREATE_DEVICE_CAPS_LIST(EMPTY_DEVICE_LIST); ACE_CREATE_DEVICE_CAPS_LIST(DEVICE_LIST_CONTENT_READ); @@ -62,15 +58,11 @@ static FunctionMapping createContentFunctions() ACE_CREATE_DEVICE_CAPS_LIST(DEVICE_LIST_CONTENT_WRITE); ACE_ADD_DEVICE_CAP(DEVICE_LIST_CONTENT_WRITE, DEVICE_CAP_CONTENT_WRITE); - ACE_CREATE_DEVICE_CAPS_LIST(DEVICE_LIST_CONTENT_MANAGER_WRITE); - ACE_ADD_DEVICE_CAP(DEVICE_LIST_CONTENT_MANAGER_WRITE, DEVICE_CAP_CONTENT_MANAGER_WRITE); - /** * Api Features */ ACE_CREATE_FEATURE(FEATURE_CONTENT_READ, CONTENT_FEATURE_API_READ); ACE_CREATE_FEATURE(FEATURE_CONTENT_WRITE, CONTENT_FEATURE_API_WRITE); - ACE_CREATE_FEATURE(FEATURE_CONTENT_MANAGER_WRITE, CONTENT_FEATURE_API_MANAGER_WRITE); ACE_CREATE_FEATURE_LIST(CONTENT_FEATURES_CONTENT_READ_WRITE); ACE_ADD_API_FEATURE(CONTENT_FEATURES_CONTENT_READ_WRITE, FEATURE_CONTENT_READ); @@ -82,8 +74,6 @@ static FunctionMapping createContentFunctions() ACE_CREATE_FEATURE_LIST(CONTENT_FEATURES_CONTENT_WRITE); ACE_ADD_API_FEATURE(CONTENT_FEATURES_CONTENT_WRITE, FEATURE_CONTENT_WRITE); - ACE_CREATE_FEATURE_LIST(CONTENT_FEATURES_CONTENT_MANAGER_WRITE); - ACE_ADD_API_FEATURE(CONTENT_FEATURES_CONTENT_MANAGER_WRITE, FEATURE_CONTENT_MANAGER_WRITE); #if 0 ACE_CREATE_FEATURE_LIST(CONTENT_FEATURES_CONTENT); ACE_ADD_API_FEATURE(CONTENT_FEATURES_CONTENT, @@ -181,17 +171,6 @@ static FunctionMapping createContentFunctions() CONTENT_FUNCTION_API_UNSET_CHANGE_LISTENER, unsetListenerFunc)); - //updateMetadata - AceFunction updateMetadataFunc = ACE_CREATE_FUNCTION( - FUNCTION_UPDATE_METADATA, - CONTENT_FUNCTION_API_UPDATE_METADATA, - CONTENT_FEATURES_CONTENT_MANAGER_WRITE, - DEVICE_LIST_CONTENT_MANAGER_WRITE); - - contentMapping.insert(std::make_pair( - CONTENT_FUNCTION_API_UPDATE_METADATA, - updateMetadataFunc)); - return contentMapping; } diff --git a/src/Content/plugin_config.h b/src/Content/plugin_config.h index 3e8aea3..6eb9188 100755 --- a/src/Content/plugin_config.h +++ b/src/Content/plugin_config.h @@ -36,8 +36,6 @@ namespace Content { #define CONTENT_FUNCTION_API_SCAN_FILE "scanFile" #define CONTENT_FUNCTION_API_SET_CHANGE_LISTENER "setChangeListener" #define CONTENT_FUNCTION_API_UNSET_CHANGE_LISTENER "unsetChangeListener" -#define CONTENT_FUNCTION_API_UPDATE_METADATA "updateMetadata" - DECLARE_FUNCTION_GETTER(Content); diff --git a/src/DataSync/CMakeLists.txt b/src/DataSync/CMakeLists.txt index cd8e155..fc86234 100755 --- a/src/DataSync/CMakeLists.txt +++ b/src/DataSync/CMakeLists.txt @@ -2,7 +2,14 @@ SET(TARGET_NAME ${datasync_target}) SET(DESTINATION_NAME ${datasync_dest}) SET(TARGET_IMPL_NAME ${datasync_impl}) -PKG_SEARCH_MODULE(sync-agent REQUIRED sync-agent) +PKG_CHECK_MODULES(platform_pkgs_datasync REQUIRED sync-agent) + +INCLUDE_DIRECTORIES( + ${TOP}/Tizen + ${TOP}/TimeUtil + ${TOP}/Common + ${platform_pkgs_datasync_INCLUDE_DIRS} +) SET(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_RPATH} @@ -28,18 +35,12 @@ SET(SRCS_IMPL IDataSyncManager.cpp ) -INCLUDE_DIRECTORIES( - ${TOP}/Tizen - ${TOP}/TimeUtil - ${TOP}/Common - ${sync-agent_INCLUDE_DIRS} -) - ADD_LIBRARY(${TARGET_IMPL_NAME} SHARED ${SRCS_IMPL}) TARGET_LINK_LIBRARIES(${TARGET_IMPL_NAME} ${LIBS_COMMON} - ${sync-agent_LIBRARIES} + ${tizen_impl} + ${platform_pkgs_datasync_LIBRARIES} ) SET(SRCS @@ -51,14 +52,11 @@ ADD_LIBRARY(${TARGET_NAME} SHARED ${SRCS}) TARGET_LINK_LIBRARIES(${TARGET_NAME} ${TARGET_IMPL_NAME} - ${tizen_impl} - ${timeutil_impl} - ${LIBS_COMMON} ) INSTALL(TARGETS ${TARGET_NAME} ${TARGET_IMPL_NAME} LIBRARY DESTINATION ${DESTINATION_LIB_PREFIX}/${DESTINATION_NAME}) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/config.xml DESTINATION ${DESTINATION_LIB_PREFIX}/${DESTINATION_NAME}) INSTALL( - DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/ DESTINATION ${DESTINATION_HEADER_PREFIX}/datasync - FILES_MATCHING PATTERN "*.h" PATTERN "CMakeFiles" EXCLUDE + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/ DESTINATION ${DESTINATION_HEADER_PREFIX}/datasync + FILES_MATCHING PATTERN "*.h" PATTERN "CMakeFiles" EXCLUDE ) diff --git a/src/Messaging/JSMessage.cpp b/src/Messaging/JSMessage.cpp index af0bb52..96cb6c7 100644 --- a/src/Messaging/JSMessage.cpp +++ b/src/Messaging/JSMessage.cpp @@ -597,7 +597,17 @@ JSValueRef JSMessage::getBccAddress(JSContextRef context, { IEmailPtr email = MessageFactory::convertToEmail(msg); RecipientsPtr recipient = email->getBccRecipientsPtr(); - return JSRecipientArray::createArray(converter->toJSGlobalContext(object), recipient); + JSObjectRef arrayValue = JSCreateArrayObject(context, 0, NULL); + if (NULL == arrayValue) + { + LogError("Could not create js array object"); + return JSValueMakeUndefined(context); + } + for(size_t i = 0; i < recipient->getRecipientSize(); i++) + { + JSSetArrayElement(context, arrayValue, i, converter->toJSValueRef(recipient->getRecipient(i))); + } + return arrayValue; } case SMS: case MMS: @@ -664,7 +674,17 @@ JSValueRef JSMessage::getCcAddress(JSContextRef context, { IEmailPtr email = MessageFactory::convertToEmail(msg); RecipientsPtr recipient = email->getCcRecipientsPtr(); - return JSRecipientArray::createArray(converter->toJSGlobalContext(object), recipient); + JSObjectRef arrayValue = JSCreateArrayObject(context, 0, NULL); + if (NULL == arrayValue) + { + LogError("Could not create js array object"); + return JSValueMakeUndefined(context); + } + for(size_t i = 0; i < recipient->getRecipientSize(); i++) + { + JSSetArrayElement(context, arrayValue, i, converter->toJSValueRef(recipient->getRecipient(i))); + } + return arrayValue; } case MMS: case SMS: @@ -701,7 +721,17 @@ JSValueRef JSMessage::getDestinationAddress(JSContextRef context, ConverterMessageFactory::ConverterType converter = ConverterMessageFactory::getConverter(context); IMessagePtr msg = converter->toIMessage(object); RecipientsPtr recipient = msg->getToRecipientsPtr(); - return JSRecipientArray::createArray(converter->toJSGlobalContext(object), recipient); + JSObjectRef arrayValue = JSCreateArrayObject(context, 0, NULL); + if (NULL == arrayValue) + { + LogError("Could not create js array object"); + return JSValueMakeUndefined(context); + } + for(size_t i = 0; i < recipient->getRecipientSize(); i++) + { + JSSetArrayElement(context, arrayValue, i, converter->toJSValueRef(recipient->getRecipient(i))); + } + return arrayValue; } Catch(WrtDeviceApis::Commons::ConversionException) { LogError("Error on conversion"); diff --git a/src/Messaging/MessageFilterValidatorFactory.cpp b/src/Messaging/MessageFilterValidatorFactory.cpp index b9188ae..cd32ee4 100755 --- a/src/Messaging/MessageFilterValidatorFactory.cpp +++ b/src/Messaging/MessageFilterValidatorFactory.cpp @@ -31,7 +31,7 @@ namespace DeviceAPI { const std::string MessageFilterValidatorFactory::ATTRIBUTE_TO = "to"; const std::string MessageFilterValidatorFactory::ATTRIBUTE_CC = "cc"; const std::string MessageFilterValidatorFactory::ATTRIBUTE_BCC = "bcc"; - const std::string MessageFilterValidatorFactory::ATTRIBUTE_BODY = "body"; + const std::string MessageFilterValidatorFactory::ATTRIBUTE_BODY = "body.plainBody"; const std::string MessageFilterValidatorFactory::ATTRIBUTE_IS_READ = "isRead"; const std::string MessageFilterValidatorFactory::ATTRIBUTE_PRIORITY = "isHighPriority"; const std::string MessageFilterValidatorFactory::ATTRIBUTE_SUBJECT = "subject"; diff --git a/src/Messaging/StorageChangesMessageFilterValidatorFactory.cpp b/src/Messaging/StorageChangesMessageFilterValidatorFactory.cpp index 5137f79..d4b9af7 100755 --- a/src/Messaging/StorageChangesMessageFilterValidatorFactory.cpp +++ b/src/Messaging/StorageChangesMessageFilterValidatorFactory.cpp @@ -31,7 +31,7 @@ namespace DeviceAPI { const std::string StorageChangesMessageFilterValidatorFactory::ATTRIBUTE_TO = "to"; const std::string StorageChangesMessageFilterValidatorFactory::ATTRIBUTE_CC = "cc"; const std::string StorageChangesMessageFilterValidatorFactory::ATTRIBUTE_BCC = "bcc"; - const std::string StorageChangesMessageFilterValidatorFactory::ATTRIBUTE_BODY = "body"; + const std::string StorageChangesMessageFilterValidatorFactory::ATTRIBUTE_BODY = "body.plainBody"; const std::string StorageChangesMessageFilterValidatorFactory::ATTRIBUTE_IS_READ = "isRead"; const std::string StorageChangesMessageFilterValidatorFactory::ATTRIBUTE_HAS_ATTACHMENT = "hasAttachment"; const std::string StorageChangesMessageFilterValidatorFactory::ATTRIBUTE_PRIORITY = "isHighPriority"; diff --git a/src/Messaging/messageDB/MessageStorageReader.cpp b/src/Messaging/messageDB/MessageStorageReader.cpp index 1907be2..39a85f8 100644 --- a/src/Messaging/messageDB/MessageStorageReader.cpp +++ b/src/Messaging/messageDB/MessageStorageReader.cpp @@ -55,11 +55,9 @@ namespace{ MSG_CLASS_TYPE_T classType; /**< Message class type. See enum _MSG_CLASS_TYPE_E */ msg_storage_id_t storageId; /**< Indicates where the message is saved. see enum _MSG_FOLDER_TYPE_E*/ msg_struct_list_s *addr_list; - GList *addressList; char replyAddress[MAX_PHONE_NUMBER_LEN+1]; /**< Indicates the reply address. */ char subject[MAX_SUBJECT_LEN+1]; /**< Indicates the message subject. */ time_t displayTime; /**< Indicates the display time related to the specific operation. */ - time_t scheduledTime; /**< Indicates the time to send scheduled message. */ msg_network_status_t networkStatus; /**< Indicates the network status of the message. */ msg_encode_type_t encodeType; /**< Indicates the string encoding type. */ bool bRead; /**< Indicates whether the message is read or not. */ @@ -75,7 +73,7 @@ namespace{ size_t dataSize; /**< Indicates the data size. The unit is byte. */ void *pData; /**< Indicates the message payload information as a body. default character encoding is UTF-8*/ void *pMmsData; /**< Indicates the message payload information as a body. default character encoding is UTF-8*/ - size_t mmsDataSize; + size_t mmsDataSize; } MSG_MESSAGE_HIDDEN_S; @@ -130,7 +128,6 @@ enum _MSG_SUB_TYPE_E MSG_STATUS_REPORT_SMS, /**< SMS-STATUS-REPORT */ MSG_SYNCML_CP, /**< SyncML Message CP */ MSG_LBS_SMS, /**< LBS Message */ - MSG_SOS_SMS, /**< SOS Message */ MSG_REJECT_SMS, /**< Reject Message */ MSG_CONCAT_SIM_SMS, /**< Concatenated Message in SIM */ @@ -291,9 +288,7 @@ FROM " << MSGFW_MESSAGE_TABLE_NAME << " A, " << MSGFW_ADDRESS_TABLE_NAME << " B pTmp->bBackup = dbHandle.getColumnToInt(index++); pTmp->priority = dbHandle.getColumnToInt(index++); pTmp->direction= dbHandle.getColumnToInt(index++); - pTmp->addressList = NULL; - - pTmp->scheduledTime = (time_t)dbHandle.getColumnToInt(index++); + index++; // This field is reserved. dbHandle.getColumnToString(index++, MAX_SUBJECT_LEN, pTmp->subject); @@ -374,28 +369,6 @@ FROM " << MSGFW_MESSAGE_TABLE_NAME << " A, " << MSGFW_ADDRESS_TABLE_NAME << " B pTmp->addr_list = addr_list; - // For GList *addressList - msg_struct_s *addrStruct = NULL; - MSG_ADDRESS_INFO_S *addrInfo = NULL; - - addrStruct = new msg_struct_s; - memset(addrStruct, 0x00, sizeof(msg_struct_s)); - - addrStruct->type = MSG_STRUCT_ADDRESS_INFO; - addrStruct->data = new MSG_ADDRESS_INFO_S; - memset(addrStruct->data, 0x00, sizeof(MSG_ADDRESS_INFO_S)); - - addrInfo = (MSG_ADDRESS_INFO_S *)addrStruct->data; - - addrInfo->addressType = address->addressType; - addrInfo->recipientType = address->recipientType; - addrInfo->contactId = address->contactId; - strncpy(addrInfo->addressVal, address->addressVal, MAX_ADDRESS_VAL_LEN); - strncpy(addrInfo->displayName, address->displayName, MAX_DISPLAY_NAME_LEN); - addrInfo->displayName[MAX_DISPLAY_NAME_LEN] = '\0'; - - pTmp->addressList = g_list_append(pTmp->addressList, addrStruct); - pTmp->attachCount = dbHandle.getColumnToInt(index++); dbHandle.getColumnToString(index++, MSG_FILEPATH_LEN_MAX, pTmp->thumbPath); diff --git a/src/SecureStorage/CMakeLists.txt b/src/SecureStorage/CMakeLists.txt new file mode 100644 index 0000000..a329913 --- /dev/null +++ b/src/SecureStorage/CMakeLists.txt @@ -0,0 +1,25 @@ +SET(TARGET_NAME ${securestorage_target}) +SET(DESTINATION_NAME ${securestorage_dest}) + +PKG_CHECK_MODULES(platform_pkgs_securestorage REQUIRED secure-storage) + +INCLUDE_DIRECTORIES( + ${platform_pkgs_securestorage_INCLUDE_DIRS} +) + +SET(SRCS + plugin_initializer.cpp + plugin_config.cpp + SecureStorageManager.cpp + JSSecureStorageManager.cpp +) + +ADD_LIBRARY(${TARGET_NAME} SHARED ${SRCS}) + +TARGET_LINK_LIBRARIES(${TARGET_NAME} + ${LIBS_COMMON} + ${platform_pkgs_securestorage_LIBRARIES} +) + +INSTALL(TARGETS ${TARGET_NAME} LIBRARY DESTINATION ${DESTINATION_NAME}) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/config.xml DESTINATION ${DESTINATION_NAME}) diff --git a/src/SecureStorage/JSSecureStorageManager.cpp b/src/SecureStorage/JSSecureStorageManager.cpp new file mode 100644 index 0000000..818f24c --- /dev/null +++ b/src/SecureStorage/JSSecureStorageManager.cpp @@ -0,0 +1,407 @@ +/* + * Copyright (c) 2011 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 +#include "JSSecureStorageManager.h" +#include "plugin_config.h" + +using namespace std; +using namespace DPL; +using namespace WrtDeviceApis; +using namespace WrtDeviceApis::CommonsJavaScript; +using namespace DeviceAPI::Common; + +namespace TizenApis { +namespace Tizen1_0 { + +JSClassDefinition JSSecureStorageManager::m_classInfo = +{ + 0, + kJSClassAttributeNone, + "SecureStorageManager", + NULL, + NULL, + m_function, + initialize, + finalize, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + hasInstance, + NULL +}; + + +JSStaticFunction JSSecureStorageManager::m_function[] = +{ + { "remove", JSSecureStorageManager::remove, kJSPropertyAttributeNone }, + { "set", JSSecureStorageManager::set, kJSPropertyAttributeNone }, + { "get", JSSecureStorageManager::get, kJSPropertyAttributeNone }, + { "listKeys", JSSecureStorageManager::listKeys, kJSPropertyAttributeNone }, + { "removeAll", JSSecureStorageManager::removeAll, kJSPropertyAttributeNone }, + { 0, 0, 0 } +}; + + +const JSClassRef JSSecureStorageManager::getClassRef() +{ + if (!m_jsClassRef) { + m_jsClassRef = JSClassCreate(&m_classInfo); + } + return m_jsClassRef; +} + +const JSClassDefinition* JSSecureStorageManager::getClassInfo() +{ + return &m_classInfo; +} + +JSClassRef JSSecureStorageManager::m_jsClassRef = JSClassCreate(JSSecureStorageManager::getClassInfo()); + +void JSSecureStorageManager::initialize(JSContextRef context, JSObjectRef object) +{ + LogDebug("JSSecureStorageManager::initialize "); + JSSecureStorageManagerPriv* priv = static_cast(JSObjectGetPrivate(object)); + + if (priv == NULL) + { + SecureStorageManagerPtr secureStorage(new SecureStorageManager()); + priv = new JSSecureStorageManagerPriv( context, secureStorage); + if(!JSObjectSetPrivate(object, static_cast(priv))) + { + LogError("Object can't store private data."); + delete priv; + } + } + else + { + LogDebug("JSSecureStorageManager::already exist "); + } +} + +void JSSecureStorageManager::finalize(JSObjectRef object) +{ + JSSecureStorageManagerPriv* priv = static_cast(JSObjectGetPrivate(object)); + + LogDebug("JSSecureStorageManager::Finalrize"); + + if (priv != NULL) + { + JSObjectSetPrivate(object, NULL); + delete priv; + } +} + +bool JSSecureStorageManager::hasInstance(JSContextRef context, JSObjectRef constructor, + JSValueRef possibleInstance, JSValueRef* exception) +{ + return JSValueIsObjectOfClass(context, possibleInstance, getClassRef()); +} + + +JSValueRef JSSecureStorageManager::listKeys(JSContextRef context, JSObjectRef object, + JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], + JSValueRef* exception) +{ + JSSecureStorageManagerPriv* priv = static_cast(JSObjectGetPrivate(thisObject)); + + try + { + if (priv == NULL) + { + LogError("priv null"); + Throw(WrtDeviceApis::Commons::ConversionException); + } + + + // to do : need to update TizenPolicy.xml + // AceSecurityStatus status = SECURE_STORAGE_CHECK_ACCESS(SECURE_STORAGE_FUNC_READ); + // TIZEN_SYNC_ACCESS_HANDLER(status, context, exception); + + SecureStorageManagerPtr secureStorage(priv->getObject()); + Converter converter(priv->getContext()); + std::vector keys = secureStorage->listKeys(); + return converter.toJSValueRef(keys); + } + catch (const WrtDeviceApis::Commons::Exception& ex) + { + LogDebug("Error message" << ex.GetMessage()); + switch(ex.getCode()) + { + case WrtDeviceApis::Commons::ExceptionCodes::NotFoundException: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::NOT_FOUND_ERROR, "not found error"); + case WrtDeviceApis::Commons::ExceptionCodes::InvalidArgumentException: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::INVALID_VALUES_ERROR, "invalid parameter error"); + case WrtDeviceApis::Commons::ExceptionCodes::ConversionException: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::TYPE_MISMATCH_ERROR, "type mismatch error"); + case WrtDeviceApis::Commons::ExceptionCodes::SecurityException: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::PERMISSION_DENIED_ERROR, "permission denied error"); + case WrtDeviceApis::Commons::ExceptionCodes::Exception: + default: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::UNKNOWN_ERROR, "Unkown error"); + } + } + return JSValueMakeUndefined(context); + +} + + +JSValueRef JSSecureStorageManager::set(JSContextRef context, JSObjectRef object, + JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], + JSValueRef* exception) +{ + JSSecureStorageManagerPriv* priv = static_cast(JSObjectGetPrivate(thisObject)); + JSValueRef reserveArguments[2]; + size_t index = 0; + + + try + { + if (priv == NULL) + { + LogError("priv null"); + + Throw(WrtDeviceApis::Commons::ConversionException); + } + + // to do : need to update TizenPolicy.xml + // AceSecurityStatus status = SECURE_STORAGE_CHECK_ACCESS(SECURE_STORAGE_FUNC_WRITE); + // TIZEN_SYNC_ACCESS_HANDLER(status, context, exception); + + + for (index = 0; index < 2; index++) + { + if (index < argumentCount) + reserveArguments[index] = arguments[index]; + else + reserveArguments[index] = JSValueMakeUndefined(context); + } + + SecureStorageManagerPtr secureStorage(priv->getObject()); + Converter converter(priv->getContext()); + std::string key = converter.toString(reserveArguments[0]); + std::string value = converter.toString(reserveArguments[1]); + secureStorage->set(key, value); + + } + catch (const WrtDeviceApis::Commons::Exception& ex) + { + LogDebug("Error message" << ex.GetMessage()); + switch(ex.getCode()) + { + case WrtDeviceApis::Commons::ExceptionCodes::NotFoundException: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::NOT_FOUND_ERROR, "not found error"); + case WrtDeviceApis::Commons::ExceptionCodes::InvalidArgumentException: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::INVALID_VALUES_ERROR, "invalid parameter error"); + case WrtDeviceApis::Commons::ExceptionCodes::ConversionException: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::TYPE_MISMATCH_ERROR, "type mismatch error"); + case WrtDeviceApis::Commons::ExceptionCodes::SecurityException: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::PERMISSION_DENIED_ERROR, "permission denied error"); + case WrtDeviceApis::Commons::ExceptionCodes::Exception: + default: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::UNKNOWN_ERROR, "Unkown error"); + } + } + return JSValueMakeUndefined(context); +} + +JSValueRef JSSecureStorageManager::get(JSContextRef context, JSObjectRef object, + JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], + JSValueRef* exception) +{ + JSSecureStorageManagerPriv* priv = static_cast(JSObjectGetPrivate(thisObject)); + JSValueRef reserveArguments; + + try + { + if (priv == NULL) + { + LogError("priv null"); + Throw(WrtDeviceApis::Commons::ConversionException); + } + + // to do : need to update TizenPolicy.xml + // AceSecurityStatus status = SECURE_STORAGE_CHECK_ACCESS(SECURE_STORAGE_FUNC_READ); + // TIZEN_SYNC_ACCESS_HANDLER(status, context, exception); + + if (argumentCount > 0) + reserveArguments = arguments[0]; + else + reserveArguments = JSValueMakeUndefined(context); + + SecureStorageManagerPtr secureStorage(priv->getObject()); + Converter converter(priv->getContext()); + std::string key = converter.toString(reserveArguments); + std::string value = secureStorage->get(key); + return converter.toJSValueRef(value); + } + catch (const WrtDeviceApis::Commons::Exception& ex) + { + LogDebug("Error message" << ex.GetMessage()); + switch(ex.getCode()) + { + case WrtDeviceApis::Commons::ExceptionCodes::NotFoundException: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::NOT_FOUND_ERROR, "not found error"); + case WrtDeviceApis::Commons::ExceptionCodes::InvalidArgumentException: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::INVALID_VALUES_ERROR, "invalid parameter error"); + case WrtDeviceApis::Commons::ExceptionCodes::ConversionException: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::TYPE_MISMATCH_ERROR, "type mismatch error"); + case WrtDeviceApis::Commons::ExceptionCodes::SecurityException: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::PERMISSION_DENIED_ERROR, "permission denied error"); + case WrtDeviceApis::Commons::ExceptionCodes::Exception: + default: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::UNKNOWN_ERROR, "Unkown error"); + } + } + return JSValueMakeUndefined(context); + +} + +JSValueRef JSSecureStorageManager::remove(JSContextRef context, JSObjectRef object, + JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], + JSValueRef* exception) +{ + JSSecureStorageManagerPriv* priv = static_cast(JSObjectGetPrivate(thisObject)); + JSValueRef reserveArguments; + + try + { + if (priv == NULL) + { + LogError("priv null"); + Throw(WrtDeviceApis::Commons::ConversionException); + } + + // to do : need to update TizenPolicy.xml + // AceSecurityStatus status = SECURE_STORAGE_CHECK_ACCESS(SECURE_STORAGE_FUNC_WRITE); + // TIZEN_SYNC_ACCESS_HANDLER(status, context, exception); + + if (argumentCount > 0) + reserveArguments = arguments[0]; + else + reserveArguments = JSValueMakeUndefined(context); + + SecureStorageManagerPtr secureStorage(priv->getObject()); + Converter converter(priv->getContext()); + std::string key = converter.toString(reserveArguments); + secureStorage->remove(key); + } + catch (const WrtDeviceApis::Commons::Exception& ex) + { + LogDebug("Error message" << ex.GetMessage()); + switch(ex.getCode()) + { + case WrtDeviceApis::Commons::ExceptionCodes::NotFoundException: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::NOT_FOUND_ERROR, "not found error"); + case WrtDeviceApis::Commons::ExceptionCodes::InvalidArgumentException: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::INVALID_VALUES_ERROR, "invalid parameter error"); + case WrtDeviceApis::Commons::ExceptionCodes::ConversionException: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::TYPE_MISMATCH_ERROR, "type mismatch error"); + case WrtDeviceApis::Commons::ExceptionCodes::SecurityException: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::PERMISSION_DENIED_ERROR, "permission denied error"); + case WrtDeviceApis::Commons::ExceptionCodes::Exception: + default: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::UNKNOWN_ERROR, "Unkown error"); + } + } + return JSValueMakeUndefined(context); + +} + +JSValueRef JSSecureStorageManager::removeAll(JSContextRef context, JSObjectRef object, + JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], + JSValueRef* exception) +{ + JSSecureStorageManagerPriv* priv = static_cast(JSObjectGetPrivate(thisObject)); + + try + { + if (priv == NULL) + { + LogError("priv null"); + Throw(WrtDeviceApis::Commons::ConversionException); + } + + // to do : need to update TizenPolicy.xml + // AceSecurityStatus status = SECURE_STORAGE_CHECK_ACCESS(SECURE_STORAGE_FUNC_WRITE); + // TIZEN_SYNC_ACCESS_HANDLER(status, context, exception); + + SecureStorageManagerPtr secureStorage(priv->getObject()); + Converter converter(priv->getContext()); + secureStorage->removeAll(); + + } + catch (const WrtDeviceApis::Commons::Exception& ex) + { + LogDebug("Error message" << ex.GetMessage()); + switch(ex.getCode()) + { + case WrtDeviceApis::Commons::ExceptionCodes::NotFoundException: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::NOT_FOUND_ERROR, "not found error"); + case WrtDeviceApis::Commons::ExceptionCodes::InvalidArgumentException: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::INVALID_VALUES_ERROR, "invalid parameter error"); + case WrtDeviceApis::Commons::ExceptionCodes::ConversionException: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::TYPE_MISMATCH_ERROR, "type mismatch error"); + case WrtDeviceApis::Commons::ExceptionCodes::SecurityException: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::PERMISSION_DENIED_ERROR, "permission denied error"); + case WrtDeviceApis::Commons::ExceptionCodes::Exception: + default: + return JSTizenExceptionFactory::postException(context, exception, + JSTizenException::UNKNOWN_ERROR, "Unkown error"); + } + } + return JSValueMakeUndefined(context); + +} + +} +} + diff --git a/src/SecureStorage/JSSecureStorageManager.h b/src/SecureStorage/JSSecureStorageManager.h new file mode 100644 index 0000000..b0ba72a --- /dev/null +++ b/src/SecureStorage/JSSecureStorageManager.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2011 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 TIZENAPIS_TIZEN_JS_SECURE_STORAGE_MANAGER_H_ +#define TIZENAPIS_TIZEN_JS_SECURE_STORAGE_MANAGER_H_ + +#include +#include "SecureStorageManager.h" +#include + +using namespace WrtDeviceApis::CommonsJavaScript; +using namespace WrtDeviceApis; +using namespace WrtDeviceApis::Commons; + + +namespace TizenApis { +namespace Tizen1_0 { + + +typedef PrivateObjectT::Type JSSecureStorageManagerPriv; + +class JSSecureStorageManager { +public: + static const JSClassDefinition* getClassInfo(); + static const JSClassRef getClassRef(); +private: + static void initialize(JSContextRef context, JSObjectRef object); + static void finalize(JSObjectRef object); + static bool hasInstance(JSContextRef context, JSObjectRef constructor, + JSValueRef possibleInstance, JSValueRef* exception); + + static JSValueRef listKeys(JSContextRef context, JSObjectRef object, + JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], + JSValueRef* exception); + static JSValueRef set(JSContextRef context, JSObjectRef object, + JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], + JSValueRef* exception); + static JSValueRef get(JSContextRef context, JSObjectRef object, + JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], + JSValueRef* exception); + static JSValueRef remove(JSContextRef context, JSObjectRef object, + JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], + JSValueRef* exception); + static JSValueRef removeAll(JSContextRef context, JSObjectRef object, + JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], + JSValueRef* exception); + + static JSClassDefinition m_classInfo; + static JSStaticFunction m_function[]; + static JSClassRef m_jsClassRef; +}; + +} +} + +#endif + diff --git a/src/SecureStorage/SecureStorageManager.cpp b/src/SecureStorage/SecureStorageManager.cpp new file mode 100644 index 0000000..cb202b5 --- /dev/null +++ b/src/SecureStorage/SecureStorageManager.cpp @@ -0,0 +1,265 @@ +/* + * Copyright (c) 2011 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 "SecureStorageManager.h" +#include +#include +#include +#include +#include +#include + +using namespace DPL; +using namespace WrtDeviceApis::Commons; + +namespace TizenApis { +namespace Tizen1_0{ + +std::string SecureStorageManager::m_filePath = "securedata.txt"; +int SecureStorageManager::m_maxLength = 256; + +SecureStorageManager::SecureStorageManager() +{ + LogDebug("OK"); + + try + { + loadSecurePairData(); + } + catch (const WrtDeviceApis::Commons::Exception& ex) + { + LogError("Exception: " << ex.GetMessage()); + LogDebug("there is no file"); + } + + LogDebug("initial map size : " << m_securePairData.size()); +} + +SecureStorageManager::~SecureStorageManager() +{ + LogDebug("OK"); +} + +std::string SecureStorageManager::get(std::string key) +{ + LogDebug("OK"); + + std::map::iterator it = m_securePairData.find(key); + + if (it == m_securePairData.end()) + { + ThrowMsg(WrtDeviceApis::Commons::NotFoundException, "not found key"); + } + + return m_securePairData[key]; +} + +std::vector SecureStorageManager::listKeys() +{ + std::vector vector; + std::map::iterator it; + + LogDebug("OK"); + + for (it = m_securePairData.begin(); it != m_securePairData.end(); ++it) + { + vector.push_back((*it).first); + } + + return vector; +} +void SecureStorageManager::set(std::string key, std::string value) +{ + m_securePairData[key] = value; + + LogDebug("Save current data"); + saveSecurePairData(); +} + +void SecureStorageManager::remove(std::string key) +{ + LogDebug("OK"); + + std::map::iterator it = m_securePairData.find(key); + + if (it == m_securePairData.end()) + { + ThrowMsg(WrtDeviceApis::Commons::NotFoundException, "not found key"); + } + m_securePairData.erase(it); + LogDebug("Save current data"); + saveSecurePairData(); +} + +void SecureStorageManager::removeAll() +{ + LogDebug("OK"); + + ssm_flag flag = SSM_FLAG_SECRET_OPERATION; + + m_securePairData.clear(); + ssm_delete_file(m_filePath.c_str(), flag, NULL); +} + +void SecureStorageManager::saveSecurePairData() +{ + LogDebug("OK"); + + std::map::iterator it; + size_t dataSize = 0; + size_t index = 0; + size_t num = 0; + size_t mapSize = m_securePairData.size(); + int ret = -1; + + for (it = m_securePairData.begin(); it != m_securePairData.end(); ++it) + { + dataSize += (*it).first.size(); + dataSize += (*it).second.size(); + } + + dataSize += sizeof(size_t) * 2 * m_securePairData.size(); + dataSize += sizeof(size_t) * 2; + + DPL::ScopedArray saveBuf(new char[dataSize]); + + memcpy(&saveBuf[index], (char*)&mapSize, sizeof(size_t)); + index += sizeof(size_t); + + memcpy(&saveBuf[index], (char*)&dataSize, sizeof(size_t)); + index += sizeof(size_t); + + for (it = m_securePairData.begin(); it != m_securePairData.end(); ++it) + { + num = (*it).first.size(); + memcpy(&saveBuf[index], (char*)&num, sizeof(size_t)); + index += sizeof(size_t); + + memcpy(&saveBuf[index], (char*)(*it).first.c_str(), (*it).first.size()); + index += (*it).first.size(); + + num = (*it).second.size(); + memcpy(&saveBuf[index], (char*)&num, sizeof(size_t)); + index += sizeof(size_t); + memcpy(&saveBuf[index], (char*)(*it).second.c_str(), (*it).second.size()); + index += (*it).second.size(); + } + + ssm_flag flag = SSM_FLAG_SECRET_OPERATION; + + ret = ssm_write_buffer(saveBuf.Get(), dataSize, m_filePath.c_str(), flag, NULL); + + if (ret < 0) + { + ThrowMsg(WrtDeviceApis::Commons::PlatformException, "ssm write buf error"); + } + LogDebug("save result : " << ret); +} + +std::string SecureStorageManager::readStringFromMemory(const char *saveBuf, size_t ¤t, size_t dataSize) +{ + std::string value = ""; + size_t num = 0; + char tempbuf[m_maxLength]; + + if (current + sizeof(size_t) > dataSize) + { + ThrowMsg(WrtDeviceApis::Commons::PlatformException, "get size error "); + } + + memcpy(&num, &saveBuf[current], sizeof(size_t)); + memset(tempbuf, 0, sizeof(tempbuf)); + current += sizeof(size_t); + + if (current + num > dataSize) + { + ThrowMsg(WrtDeviceApis::Commons::PlatformException, "get size error "); + } + + memcpy(tempbuf, &saveBuf[current], num); + current += num; + value = tempbuf; + + return value; +} + + +void SecureStorageManager::loadSecurePairData() +{ + LogDebug("OK"); + + int ret = -1; + size_t num = 0; + size_t dataSize = 0; + size_t i = 0; + size_t readlen = 0; + char* retbuf = NULL; + ssm_file_info_t sfi; + ssm_flag flag = SSM_FLAG_SECRET_OPERATION; + size_t index = 0; + + m_securePairData.clear(); + ret = ssm_getinfo(m_filePath.c_str(), &sfi, flag, NULL); + + if (ret < 0) + { + ThrowMsg(WrtDeviceApis::Commons::PlatformException, "get info error"); + } + + if (sfi.originSize == 0) + { + ThrowMsg(WrtDeviceApis::Commons::PlatformException, "originSize error"); + } + + DPL::ScopedArray saveBuf(new char[sfi.originSize]); + retbuf = saveBuf.Get(); + + memset(retbuf, 0x00, sizeof(char) * sfi.originSize); + ret = ssm_read(m_filePath.c_str(), retbuf, sfi.originSize, &readlen, flag, NULL); + + if (ret < 0) + { + ThrowMsg(WrtDeviceApis::Commons::PlatformException, "read buf error"); + } + + LogDebug("read result : " << ret << ", length:" << readlen); + + memcpy(&num, &saveBuf[index], sizeof(size_t)); + index += sizeof(size_t); + + memcpy(&dataSize, &saveBuf[index], sizeof(size_t)); + index += sizeof(size_t); + + LogDebug("dataSize" << dataSize << "-" << num); + + for (i = 0; i < num; i++) + { + std::string key = readStringFromMemory(retbuf, index, dataSize); + std::string value = readStringFromMemory(retbuf, index, dataSize); + + if (key.size() == 0 || value.size() == 0) + { + ThrowMsg(WrtDeviceApis::Commons::PlatformException, "read buf error"); + } + m_securePairData[key] = value; + LogDebug("contents:" << key << "-" << m_securePairData[key]); + } +} + + +} +} + diff --git a/src/SecureStorage/SecureStorageManager.h b/src/SecureStorage/SecureStorageManager.h new file mode 100644 index 0000000..bb37aab --- /dev/null +++ b/src/SecureStorage/SecureStorageManager.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2011 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 TIZENAPIS_TIZEN_SECURE_STORAGE_MANAGER_H_ +#define TIZENAPIS_TIZEN_SECURE_STORAGE_MANAGER_H_ + +#include +#include +#include +#include + +namespace TizenApis { +namespace Tizen1_0 { + +class SecureStorageManager; +typedef DPL::SharedPtr SecureStorageManagerPtr; + + +class SecureStorageManager +{ +public: + std::string get(std::string key); + std::vector listKeys(); + void set(std::string key, std::string value); + void remove(std::string key); + void removeAll(); + SecureStorageManager(); + ~SecureStorageManager(); +private: + static std::string m_filePath; + static int m_maxLength; + std::map m_securePairData; + void saveSecurePairData(); + void loadSecurePairData(); + std::string readStringFromMemory(const char *saveBuf, size_t ¤t, size_t dataSize); +}; +} +} +#endif diff --git a/src/SecureStorage/config.xml b/src/SecureStorage/config.xml new file mode 100644 index 0000000..b8835e9 --- /dev/null +++ b/src/SecureStorage/config.xml @@ -0,0 +1,18 @@ + + + + libwrt-plugins-tizen-securestorage.so + securestorage.install.uri + SAMSUNG plugin group + SAMSUNG certificate authority + AAAABBBBCCCCDDDEEEE0000 + + http://tizen.org/privilege/securestorage.read + securestorage.read + + + http://tizen.org/privilege/securestorage.write + securestorage.write + + + diff --git a/src/SecureStorage/plugin_config.cpp b/src/SecureStorage/plugin_config.cpp new file mode 100644 index 0000000..85c1438 --- /dev/null +++ b/src/SecureStorage/plugin_config.cpp @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2011 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 "plugin_config.h" + +#define SECURE_STORAGE_FEATURE_API_READ "http://tizen.org/privilege/securestorage.read" +#define SECURE_STORAGE_FEATURE_API_WRITE "http://tizen.org/privilege/securestorage.write" + +#define SECURE_STORAGE_DEVICE_CAP_READ "securestorage.read" +#define SECURE_STORAGE_DEVICE_CAP_WRITE "securestorage.write" + +namespace TizenApis { +namespace Tizen1_0 { + +const char* SECURE_STORAGE_FUNC_READ = "SecureStroageReadFunc"; +const char* SECURE_STORAGE_FUNC_WRITE = "SecureStroageWriteFunc"; +const char* SECURE_STORAGE_FUNC_READWRITE = "SecureStroageReadWriteFunc"; + +static WrtDeviceApis::Commons::FunctionMapping createSecureStorageFunctions(); + +static WrtDeviceApis::Commons::FunctionMapping SecureStorageFunctions = + createSecureStorageFunctions(); + +DEFINE_FUNCTION_GETTER(SecureStorage, SecureStorageFunctions); + +static WrtDeviceApis::Commons::FunctionMapping createSecureStorageFunctions() +{ + using namespace WrtDeviceApis::Commons; + + ACE_CREATE_DEVICE_CAP(DEVICE_CAP_SECURE_STORAGE_READ, SECURE_STORAGE_DEVICE_CAP_READ); + ACE_CREATE_DEVICE_CAP(DEVICE_CAP_SECURE_STORAGE_WRITE, SECURE_STORAGE_DEVICE_CAP_WRITE); + + + ACE_CREATE_DEVICE_CAPS_LIST(EMPTY_DEVICE_LIST); + + ACE_CREATE_DEVICE_CAPS_LIST(DEVICE_LIST_SECURE_STORAGE_READ); + ACE_ADD_DEVICE_CAP(DEVICE_LIST_SECURE_STORAGE_READ, DEVICE_CAP_SECURE_STORAGE_READ); + + ACE_CREATE_DEVICE_CAPS_LIST(DEVICE_LIST_SECURE_STORAGE_WRITE); + ACE_ADD_DEVICE_CAP(DEVICE_LIST_SECURE_STORAGE_WRITE, DEVICE_CAP_SECURE_STORAGE_WRITE); + + + ACE_CREATE_DEVICE_CAPS_LIST(DEVICE_LIST_SECURE_STORAGE_READWRITE); + ACE_ADD_DEVICE_CAP(DEVICE_LIST_SECURE_STORAGE_READWRITE, DEVICE_CAP_SECURE_STORAGE_READ); + ACE_ADD_DEVICE_CAP(DEVICE_LIST_SECURE_STORAGE_READWRITE, DEVICE_CAP_SECURE_STORAGE_WRITE); + + + ACE_CREATE_FEATURE(FEATURE_READ, SECURE_STORAGE_FEATURE_API_READ); + ACE_CREATE_FEATURE(FEATURE_WRITE, SECURE_STORAGE_FEATURE_API_WRITE); + + ACE_CREATE_FEATURE_LIST(SECURE_STORAGE_FEATURES_SECURE_READWRITE); + ACE_ADD_API_FEATURE(SECURE_STORAGE_FEATURES_SECURE_READWRITE, FEATURE_READ); + ACE_ADD_API_FEATURE(SECURE_STORAGE_FEATURES_SECURE_READWRITE, FEATURE_WRITE); + + ACE_CREATE_FEATURE_LIST(SECURE_STORAGE_FEATURES_READ); + ACE_ADD_API_FEATURE(SECURE_STORAGE_FEATURES_READ, FEATURE_READ); + + ACE_CREATE_FEATURE_LIST(SECURE_STORAGE_FEATURES_WRITE); + ACE_ADD_API_FEATURE(SECURE_STORAGE_FEATURES_WRITE, FEATURE_WRITE); + + + FunctionMapping SecureStorageFunctions; + + AceFunction secureStorageRead = ACE_CREATE_FUNCTION( + FUNCTION_SECURE_STORAGE_READ_FUNCTIONS, + SECURE_STORAGE_FUNC_READ, + SECURE_STORAGE_FEATURES_READ, + DEVICE_LIST_SECURE_STORAGE_READ); + + SecureStorageFunctions.insert(std::make_pair( + SECURE_STORAGE_FUNC_READ, + secureStorageRead)); + + AceFunction secureStorageWrite = ACE_CREATE_FUNCTION( + FUNCTION_SECURE_STORAGE_WRITE_FUNCTIONS, + SECURE_STORAGE_FUNC_WRITE, + SECURE_STORAGE_FEATURES_WRITE, + DEVICE_LIST_SECURE_STORAGE_WRITE); + + SecureStorageFunctions.insert(std::make_pair( + SECURE_STORAGE_FUNC_WRITE, + secureStorageWrite)); + + AceFunction secureStorageReadWrite = ACE_CREATE_FUNCTION( + FUNCTION_SECURE_STORAGE_READWRITE_FUNCTIONS, + SECURE_STORAGE_FUNC_READWRITE, + SECURE_STORAGE_FEATURES_SECURE_READWRITE, + DEVICE_LIST_SECURE_STORAGE_READWRITE); + + SecureStorageFunctions.insert(std::make_pair( + SECURE_STORAGE_FUNC_READWRITE, + secureStorageReadWrite)); + + return SecureStorageFunctions; +} +} +} + +#undef SECURE_STORAGE_FEATURE_API +#undef SECURE_STORAGE_FEATURE_API_WRITE +#undef SECURE_STORAGE_FEATURE_API_READ +#undef SECURE_STORAGE_DEVICE_CAP_WRITE +#undef SECURE_STORAGE_DEVICE_CAP_READ + diff --git a/src/SecureStorage/plugin_config.h b/src/SecureStorage/plugin_config.h new file mode 100644 index 0000000..572b634 --- /dev/null +++ b/src/SecureStorage/plugin_config.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2011 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 TIZENAPIS_TIZEN_JS_SECURE_STORAGE_PLUGIN_CONFIG_H_ +#define TIZENAPIS_TIZEN_JS_SECURE_STORAGE_PLUGIN_CONFIG_H_ + +#include + +namespace TizenApis { +namespace Tizen1_0 { + +extern const char* SECURE_STORAGE_FUNC_READ; +extern const char* SECURE_STORAGE_FUNC_WRITE; + + +WrtDeviceApis::Commons::AceFunction getSecureStorageFunctionData(const std::string & functionId); + +#define SECURE_STORAGE_CHECK_ACCESS(functionName) \ + aceCheckAccess >( \ + getSecureStorageFunctionData, \ + functionName) +} +} + +#endif diff --git a/src/SecureStorage/plugin_initializer.cpp b/src/SecureStorage/plugin_initializer.cpp new file mode 100644 index 0000000..85b849d --- /dev/null +++ b/src/SecureStorage/plugin_initializer.cpp @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2011 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 "JSSecureStorageManager.h" + +using namespace WrtDeviceApis; +using namespace WrtDeviceApis::Commons; + +void on_widget_start_callback(int widgetId) +{ + LogDebug("[Tizen\\Bluetooth ] on_widget_start_callback ("<