From c869fee472860571ab6ae6ef5a2e5980412a1cdf Mon Sep 17 00:00:00 2001 From: Piotr Kosko Date: Thu, 28 Jul 2016 08:44:47 +0200 Subject: [PATCH 01/16] [Notification] Added missing values casting [Bug] Native API expects range of 0-1, but webapi spec defines it with 0-100, additional values casting was needed. [Verification] TCT passrate is 100%. Code below generates notification with "12%" progress bar: tizen.notification.post( new tizen.StatusNotification( "PROGRESS", "Progress Notification", { content:"Progress", progressValue : 12 , progressType : "PERCENTAGE" } ) ); Change-Id: Ib8b5ed9bbc8235071591e93f4dc19b1fa450b557 Signed-off-by: Piotr Kosko --- src/notification/status_notification.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/notification/status_notification.cc b/src/notification/status_notification.cc index 894b432..9b03933 100644 --- a/src/notification/status_notification.cc +++ b/src/notification/status_notification.cc @@ -856,6 +856,8 @@ PlatformResult StatusNotification::GetProgressValue( return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Get notification progress error"); } + // native api uses range 0-1, but webapi expects 0-100, so we need to multiply result with 100 + tmp_progress_value *= 100; } else { return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Unknown notification progress type", @@ -884,7 +886,8 @@ PlatformResult StatusNotification::SetProgressValue( progress_value); } } else if (progress_type == kProgressTypePercentage) { - ret = notification_set_progress(noti_handle, progress_value); + // native api uses range 0-1, but webapi expects 0-100, so we need to divide by 100 + ret = notification_set_progress(noti_handle, progress_value/100); if (is_update) { ret = notification_update_progress(noti_handle, NOTIFICATION_PRIV_ID_NONE, -- 2.7.4 From 26f6db12db968028bd5e477a9e10135fcaa0868a Mon Sep 17 00:00:00 2001 From: Andrzej Popowski Date: Thu, 28 Jul 2016 11:24:27 +0200 Subject: [PATCH 02/16] [Iotcon] - fixing bugs to pass TCT tests Change-Id: I262dcc13661f4a9ae5ee4a69b45084a179765af1 Signed-off-by: Andrzej Popowski --- src/iotcon/iotcon_api.js | 28 +++++++++++++++++++++++----- src/iotcon/iotcon_client_manager.cc | 2 +- src/iotcon/iotcon_instance.cc | 2 +- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/iotcon/iotcon_api.js b/src/iotcon/iotcon_api.js index fa5899b..55e19bb 100644 --- a/src/iotcon/iotcon_api.js +++ b/src/iotcon/iotcon_api.js @@ -178,18 +178,36 @@ function DeviceInfo(data) { function IotconOption(id, data) { validator.isConstructorCall(this, tizen.IotconOption); + var _id = 0; + var _data = ''; + Object.defineProperties(this, { id: { - value: id, - writable: false, + get: function() { + return _id; + }, + set: function(v) { + if (v) { + _id = v; + } + }, enumerable: true }, data: { - value: data, - writable: false, + get: function() { + return _data; + }, + set: function(v) { + if (v) { + _data = v; + } + }, enumerable: true } }); + + this["id"] = id; + this["data"] = data; } function PlatformInfo(data) { @@ -1078,7 +1096,7 @@ Server.prototype.createResource = function() { name: 'dictionary', type: types.DICTIONARY, optional: true, - nullable: true + nullable: false }]); var callArgs = args.dictionary || {}; diff --git a/src/iotcon/iotcon_client_manager.cc b/src/iotcon/iotcon_client_manager.cc index 41f9c3b..7ecd9bb 100644 --- a/src/iotcon/iotcon_client_manager.cc +++ b/src/iotcon/iotcon_client_manager.cc @@ -84,7 +84,7 @@ common::TizenResult IotconClientManager::AddPresenceEventListener( presence->id = GetPresenceNextId(); presence_map_.insert(std::make_pair(presence->id, presence)); - return TizenSuccess(); + return result; } common::TizenResult IotconClientManager::RemovePresenceEventListener(long long id) { diff --git a/src/iotcon/iotcon_instance.cc b/src/iotcon/iotcon_instance.cc index 7e7b5fb..29af641 100644 --- a/src/iotcon/iotcon_instance.cc +++ b/src/iotcon/iotcon_instance.cc @@ -85,7 +85,7 @@ const std::string kResult = "result"; const std::string kTimeout = "timeout"; const std::string kData = "data"; -const std::string kVirtualResourcesHandlingPath = "/home/tmp_file_iotcon.dat"; +const std::string kVirtualResourcesHandlingPath = "/home/owner/share/tmp_file_iotcon.dat"; } // namespace -- 2.7.4 From 4975191c4aad30161c89a21b4b0bb92926a81a22 Mon Sep 17 00:00:00 2001 From: Piotr Kosko Date: Mon, 1 Aug 2016 07:44:17 +0200 Subject: [PATCH 03/16] [Iotcon] fixed additional throwing error on getProperty Change-Id: I77fea66d35875cd3d370a33db24b2ecb2223de5e Signed-off-by: Piotr Kosko --- src/iotcon/iotcon_utils.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/iotcon/iotcon_utils.cc b/src/iotcon/iotcon_utils.cc index 4edc261..c167418 100644 --- a/src/iotcon/iotcon_utils.cc +++ b/src/iotcon/iotcon_utils.cc @@ -1767,8 +1767,11 @@ common::TizenResult IotconUtils::PlatformInfoGetProperty(iotcon_platform_info_h auto result = ConvertIotconError(iotcon_platform_info_get_property(platform, property_e, &property)); - if (!result || !property) { + if (!result) { LogAndReturnTizenError(result, ("iotcon_platform_info_get_property() failed")); + } else if (!property) { + // TODO check if it should be an error or rather it should be ignored and used some default value + LogAndReturnTizenError(common::AbortError("iotcon_platform_info_get_property() returned no result")); } out->insert(std::make_pair(name, picojson::value{property})); -- 2.7.4 From fdce93945c9998c69b5d18be4644b02e5fda24b0 Mon Sep 17 00:00:00 2001 From: Andrzej Popowski Date: Mon, 13 Jun 2016 14:48:20 +0200 Subject: [PATCH 04/16] [Content] - The function createThumbnail() implemented Change-Id: I0b3589ea25c87db9b5765f77d0b308dc7b25f9f8 Signed-off-by: Andrzej Popowski --- src/content/content_instance.cc | 23 ++++++++++++++-- src/content/content_instance.h | 1 + src/content/content_manager.cc | 60 +++++++++++++++++++++++++++++++++++++++++ src/content/content_manager.h | 13 ++++++--- src/content/js/manager.js | 26 ++++++++++++++++++ 5 files changed, 117 insertions(+), 6 deletions(-) diff --git a/src/content/content_instance.cc b/src/content/content_instance.cc index 659c4f1..9008f68 100755 --- a/src/content/content_instance.cc +++ b/src/content/content_instance.cc @@ -51,7 +51,7 @@ ContentInstance::ContentInstance() : using std::placeholders::_1; using std::placeholders::_2; - #define REGISTER_SYNC(c,x) \ +#define REGISTER_SYNC(c,x) \ RegisterSyncHandler(c, std::bind(&ContentInstance::x, this, _1, _2)); REGISTER_SYNC("ContentManager_find", ContentManagerFind); @@ -80,7 +80,10 @@ ContentInstance::ContentInstance() : REGISTER_SYNC("ContentPlaylist_getThumbnailUri", PlaylistGetThumbnailUri); REGISTER_SYNC("ContentPlaylist_setThumbnailUri", PlaylistSetThumbnailUri); REGISTER_SYNC("ContentPlaylist_getNumberOfTracks", PlaylistGetNumberOfTracks); - #undef REGISTER_SYNC + REGISTER_SYNC("ContentManager_createThumbnail", ContentManagerCreateThumbnail); +#undef REGISTER_SYNC + + ContentManager::getInstance()->setContentInstance(this); } ContentInstance::~ContentInstance() { @@ -93,6 +96,7 @@ ContentInstance::~ContentInstance() { delete listener_data_; listener_data_ = nullptr; } + ContentManager::getInstance()->setContentInstance(nullptr); } static gboolean CompletedCallback(const std::shared_ptr& user_data) { @@ -593,7 +597,22 @@ void ContentInstance::ContentManagerRemoveplaylist(const picojson::value& args, // implement it common::TaskQueue::GetInstance().Queue(WorkThread, CompletedCallback, cbData); +} + +void ContentInstance::ContentManagerCreateThumbnail(const picojson::value& args, picojson::object& out) { + LoggerD("entered"); + CHECK_PRIVILEGE_ACCESS(kPrivilegeContentWrite, &out); + common::PlatformResult result = common::PlatformResult(common::ErrorCode::NO_ERROR); + if(ContentManager::getInstance()->isConnected()) { + result = ContentManager::getInstance()->createThumbnail(args); + } else { + result = LogAndCreateResult(common::ErrorCode::UNKNOWN_ERR, "DB Connection is failed."); + } + if (!result) { + LogAndReportError(result, &out, ("Failed to create a thumbnail")); + common::Instance::PostMessage(this, picojson::value(out).serialize().c_str()); + } } void ContentInstance::ContentManagerPlaylistAdd(const picojson::value& args, picojson::object& out) { diff --git a/src/content/content_instance.h b/src/content/content_instance.h index 0025d2b..a631e62 100755 --- a/src/content/content_instance.h +++ b/src/content/content_instance.h @@ -84,6 +84,7 @@ class ContentInstance : public common::ParsedInstance { void ContentManagerPlaylistSetorder(const picojson::value& args, picojson::object& out); void ContentManagerPlaylistMove(const picojson::value& args, picojson::object& out); void ContentManagerAudioGetLyrics(const picojson::value& args, picojson::object& out); + void ContentManagerCreateThumbnail(const picojson::value& args, picojson::object& out); void PlaylistGetName(const picojson::value& args, picojson::object& out); void PlaylistSetName(const picojson::value& args, picojson::object& out); diff --git a/src/content/content_manager.cc b/src/content/content_manager.cc index 6aa319d..28140da 100644 --- a/src/content/content_manager.cc +++ b/src/content/content_manager.cc @@ -36,6 +36,7 @@ using namespace std; using namespace common; +using common::tools::ReportSuccess; using common::tools::ReportError; namespace extension { @@ -660,6 +661,31 @@ static bool playlist_content_member_cb(int playlist_member_id, media_info_h medi return true; } +void CreateThumbnailCallback(media_content_error_e err, const char* path, void* user_data) { + LoggerD("Enter"); + + if (!(ContentManager::getInstance()->getContentInstance())) { + // There is not instance already + LoggerD("There is not instance now"); + return; + } + + unsigned int callbackId = (unsigned int) user_data; + picojson::object out; + + out["callbackId"] = picojson::value(static_cast(callbackId)); + + if (MEDIA_CONTENT_ERROR_NONE == err) { + out["result"] = picojson::value(std::string(path)); + ReportSuccess(out); + } else { + PlatformResult result = ContentManager::getInstance()->convertError(err); + LogAndReportError(result, &out, ("Failed to create a thumbnail")); + } + common::Instance::PostMessage(ContentManager::getInstance()->getContentInstance(), + picojson::value(out).serialize().c_str()); +} + ContentManager::ContentManager() { LoggerD("ContentManager called"); @@ -668,6 +694,7 @@ ContentManager::ContentManager() { } else m_dbConnected = false; + m_contentInstance = nullptr; } ContentManager::~ContentManager() { @@ -685,6 +712,16 @@ ContentManager* ContentManager::getInstance() { return &instance; } +ContentInstance* ContentManager::getContentInstance() { + LoggerD("Enter"); + return m_contentInstance; +} + +void ContentManager::setContentInstance(ContentInstance* const content_instance) { + LoggerD("Enter"); + m_contentInstance = content_instance; +} + bool ContentManager::isConnected() { LoggerD("Enter"); return m_dbConnected; @@ -1596,6 +1633,29 @@ int ContentManager::getNumberOfTracks(int id, int* result) { return MEDIA_CONTENT_ERROR_NONE; } +common::PlatformResult ContentManager::createThumbnail(const picojson::value& args) { + LoggerD("Enter"); + + unsigned int callbackId = static_cast(args.get("callbackId").get()); + std::string id = args.get("id").get(); + + media_info_h media = NULL; + int ret = media_info_get_media_from_db(id.c_str(), &media); + if(MEDIA_CONTENT_ERROR_NONE != ret && nullptr == media) { + return LogAndCreateResult(ErrorCode::ABORT_ERR, "Getting media is failed.", + ("Getting media is failed: %d (%s)", ret, get_error_message(ret))); + } + + ret = media_info_create_thumbnail(media, CreateThumbnailCallback, (void*) callbackId); + media_info_destroy(media); + if(MEDIA_CONTENT_ERROR_NONE != ret) { + return LogAndCreateResult(ErrorCode::ABORT_ERR, "Creating thumbnail failed.", + ("Creating thumbnail failed: %d (%s)", ret, get_error_message(ret))); + } + + return PlatformResult(ErrorCode::NO_ERROR); +} + PlatformResult ContentManager::convertError(int err) { char* error_msg = get_error_message(err); switch (err) { diff --git a/src/content/content_manager.h b/src/content/content_manager.h index 36b52d5..60a177f 100644 --- a/src/content/content_manager.h +++ b/src/content/content_manager.h @@ -43,6 +43,8 @@ class ContentManager { virtual ~ContentManager(); bool isConnected(); static ContentManager* getInstance(); + ContentInstance* getContentInstance(); + void setContentInstance(ContentInstance* const content_instance); void getDirectories(const std::shared_ptr& user_data); void find(const std::shared_ptr& user_data); @@ -74,23 +76,26 @@ class ContentManager { void playlistRemovebatch(const std::shared_ptr& user_data); void playlistSetOrder(const std::shared_ptr& user_data); void playlistMove(const std::shared_ptr& user_data); - int getPlaylistName(int id, std::string* result); int setPlaylistName(int id, const std::string& name); - int getThumbnailUri(int id, std::string* result); - int setThumbnailUri(int id, const std::string& thb_uri); - int getNumberOfTracks(int id, int* result); //playlistSetOrder static common::PlatformResult convertError(int err); + +//thumbnail + int getThumbnailUri(int id, std::string* result); + int setThumbnailUri(int id, const std::string& thb_uri); + common::PlatformResult createThumbnail(const picojson::value& args); + private: //int setContent(media_info_h media, picojson::value content); ContentManager(); private: bool m_dbConnected; + ContentInstance* m_contentInstance; }; diff --git a/src/content/js/manager.js b/src/content/js/manager.js index 009156d..00ffadd 100755 --- a/src/content/js/manager.js +++ b/src/content/js/manager.js @@ -371,4 +371,30 @@ ContentManager.prototype.removePlaylist = function(id, successCallback, errorCal } }; +ContentManager.prototype.createThumbnail = function(content, successCallback, errorCallback) { + var args = validator_.validateArgs(arguments, [ + {name: 'content', type: types_.PLATFORM_OBJECT, values: Content}, + {name: 'successCallback', type: types_.FUNCTION}, + {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true} + ]); + + var data = { + id: args.content.id + }; + + var callback = function(result) { + if (native_.isFailure(result)) { + native_.callIfPossible(args.errorCallback, native_.getErrorObject(result)); + return; + } + args.successCallback(native_.getResultObject(result)); + }; + + var result = native_.call('ContentManager_createThumbnail', data, callback); + + if (native_.isFailure(result)) { + throw native_.getErrorObject(result); + } +}; + exports = new ContentManager(); -- 2.7.4 From 1764dc0d098a070d9266bd942f2801dd72edf1e7 Mon Sep 17 00:00:00 2001 From: Hyunjin Park Date: Tue, 2 Aug 2016 19:19:13 +0900 Subject: [PATCH 05/16] [version] 1.21 Change-Id: I4d40d76270611195168b3d4a126f5ba6335ac8d2 --- packaging/webapi-plugins.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/webapi-plugins.spec b/packaging/webapi-plugins.spec index 0ca2d5c..b0e257b 100644 --- a/packaging/webapi-plugins.spec +++ b/packaging/webapi-plugins.spec @@ -10,7 +10,7 @@ %define crosswalk_extensions_path %{_libdir}/%{crosswalk_extensions} Name: webapi-plugins -Version: 1.20 +Version: 1.21 Release: 0 License: Apache-2.0 and BSD-2.0 and MIT Group: Development/Libraries -- 2.7.4 From d7e8268ab691eeab5a4b7b937ad2044e56e3e344 Mon Sep 17 00:00:00 2001 From: Tomasz Marciniak Date: Tue, 2 Aug 2016 14:55:56 +0200 Subject: [PATCH 06/16] [Notification] Fix for push service daemon notifications. [Verification] Code compiles. TCT pass rate 100% Change-Id: If4f3ea10366ad2982bb3f8faa3c01e04563d5e47 Signed-off-by: Tomasz Marciniak --- src/notification/status_notification.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/notification/status_notification.cc b/src/notification/status_notification.cc index 9b03933..cc0e135 100644 --- a/src/notification/status_notification.cc +++ b/src/notification/status_notification.cc @@ -1108,6 +1108,12 @@ PlatformResult StatusNotification::ToJson(int id, GetImage(noti_handle, NOTIFICATION_IMAGE_TYPE_LIST_5, &progress_type); if (status.IsError()) return status; + + //push service daemon doesn't set progress type + //so use default if notification type is different from "PROGRESS" + if ("PROGRESS" != noti_type_str) { + progress_type = progress_type == kProgressTypeByte ? progress_type : kProgressTypePercentage; + } out["progressType"] = picojson::value(progress_type); double progress_value; -- 2.7.4 From abc4ff1f1f363acea109a2536bd40c3f5d371d7d Mon Sep 17 00:00:00 2001 From: Mateusz Bruno-Kaminski Date: Mon, 18 Jul 2016 13:12:10 +0200 Subject: [PATCH 07/16] [API] Logging warnings for deprecated API elements [Details] Added warnings which are logged when deprecated elements are used. Both in C++ and JavaScript. [Verification] Code compiles without errors and warnings shows up for deprecated API elements. Change-Id: I50bb501a5b29bb59d01ac5c0847ea6dac7203a98 Signed-off-by: Mateusz Bruno-Kaminski --- src/application/application_api.js | 6 ++++++ src/application/application_instance.cc | 4 ++++ src/bluetooth/bluetooth_adapter.cc | 2 ++ src/bluetooth/bluetooth_api.js | 3 +++ src/nfc/nfc_api.js | 3 +++ src/nfc/nfc_instance.cc | 3 +++ src/power/power_api.js | 10 +++++++++- src/power/power_instance.cc | 4 ++++ src/power/power_manager.cc | 15 ++++++++++++++- src/push/push_api.js | 4 ++-- src/systeminfo/systeminfo_api.js | 2 ++ src/systeminfo/systeminfo_instance.cc | 2 ++ src/time/time_api.js | 2 ++ src/time/time_instance.cc | 2 ++ 14 files changed, 58 insertions(+), 4 deletions(-) diff --git a/src/application/application_api.js b/src/application/application_api.js index 7b42f15..77805ef 100755 --- a/src/application/application_api.js +++ b/src/application/application_api.js @@ -564,6 +564,9 @@ var APPLICATION_EVENT_LISTENER = 'ApplicationEventListener'; var applicationEventListener = new ListenerManager(native, APPLICATION_EVENT_LISTENER); ApplicationManager.prototype.addAppInfoEventListener = function() { + console.warn('DEPRECATION WARNING: addAppInfoEventListener() is deprecated and will be removed from next release. ' + + 'Use tizen.package.setPackageInfoEventListener() instead.'); + var args = AV.validateMethod(arguments, [ { name : 'eventCallback', @@ -576,6 +579,9 @@ ApplicationManager.prototype.addAppInfoEventListener = function() { }; ApplicationManager.prototype.removeAppInfoEventListener = function() { + console.warn('DEPRECATION WARNING: removeAppInfoEventListener() is deprecated and will be removed from next release. ' + + 'Use tizen.package.unsetPackageInfoEventListener() instead.'); + var args = AV.validateMethod(arguments, [ { name : 'watchId', diff --git a/src/application/application_instance.cc b/src/application/application_instance.cc index 67ff539..cb8d850 100755 --- a/src/application/application_instance.cc +++ b/src/application/application_instance.cc @@ -159,12 +159,16 @@ void ApplicationInstance::GetAppMetaData(const picojson::value& args, picojson:: void ApplicationInstance::AddAppInfoEventListener(const picojson::value& args, picojson::object& out) { LoggerD("Entered"); + LoggerW("DEPRECATION WARNING: addAppInfoEventListener() is deprecated and will be removed from next release. " + "Use tizen.package.setPackageInfoEventListener() instead."); manager_.StartAppInfoEventListener(&out); } void ApplicationInstance::RemoveAppInfoEventListener(const picojson::value& args, picojson::object& out) { LoggerD("Entered"); + LoggerW("DEPRECATION WARNING: removeAppInfoEventListener() is deprecated and will be removed from next release. " + "Use tizen.package.unsetPackageInfoEventListener() instead."); manager_.StopAppInfoEventListener(); ReportSuccess(out); diff --git a/src/bluetooth/bluetooth_adapter.cc b/src/bluetooth/bluetooth_adapter.cc index e4283d6..396211d 100755 --- a/src/bluetooth/bluetooth_adapter.cc +++ b/src/bluetooth/bluetooth_adapter.cc @@ -516,6 +516,8 @@ void BluetoothAdapter::SetName(const picojson::value& data, picojson::object& ou void BluetoothAdapter::SetPowered(const picojson::value& data, picojson::object& out) { LoggerD("Entered"); + LoggerW("DEPRECATION WARNING: setPowered() is deprecated and will be removed from next release. " + "Let the user turn on/off Bluetooth through the Settings application instead."); CHECK_BACKWARD_COMPABILITY_PRIVILEGE_ACCESS(Privilege::kBluetooth, Privilege::kBluetoothAdmin, &out); diff --git a/src/bluetooth/bluetooth_api.js b/src/bluetooth/bluetooth_api.js index 06c5fe9..c1c1864 100755 --- a/src/bluetooth/bluetooth_api.js +++ b/src/bluetooth/bluetooth_api.js @@ -2030,6 +2030,9 @@ BluetoothAdapter.prototype.setName = function() { BluetoothAdapter.prototype.setPowered = function() { console.log('Entered BluetoothAdapter.setPowered()'); + console.warn('DEPRECATION WARNING: setPowered() is deprecated and will be removed from next release. ' + + 'Let the user turn on/off Bluetooth through the Settings application instead.'); + var args = AV.validateMethod(arguments, [ { name : 'powered', diff --git a/src/nfc/nfc_api.js b/src/nfc/nfc_api.js index 641a4ee..3954049 100644 --- a/src/nfc/nfc_api.js +++ b/src/nfc/nfc_api.js @@ -272,6 +272,9 @@ function NFCAdapter() { } NFCAdapter.prototype.setPowered = function() { + console.warn('DEPRECATION WARNING: setPowered() is deprecated and will be removed from next release. Let the user turn NFC on/off ' + + 'through the Settings application instead.'); + var args = validator_.validateArgs(arguments, [ { name: 'powered', diff --git a/src/nfc/nfc_instance.cc b/src/nfc/nfc_instance.cc index 781f90e..4c0b50e 100644 --- a/src/nfc/nfc_instance.cc +++ b/src/nfc/nfc_instance.cc @@ -205,6 +205,9 @@ void NFCInstance::SetExclusiveMode( void NFCInstance::SetPowered( const picojson::value& args, picojson::object& out) { LoggerD("Entered"); + LoggerW("DEPRECATION WARNING: setPowered() is deprecated and will be removed from next release. Let the user turn NFC on/off " + "through the Settings application instead."); + CHECK_PRIVILEGE_ACCESS(kPrivilegeNfcAdmin, &out); PlatformResult result = NFCAdapter::GetInstance()->SetPowered(args); diff --git a/src/power/power_api.js b/src/power/power_api.js index 96c75f0..5be1026 100755 --- a/src/power/power_api.js +++ b/src/power/power_api.js @@ -120,11 +120,15 @@ function PowerManager() { * is desired to be. */ PowerManager.prototype.request = function(resource, state) { - var args = validator_.validateArgs(arguments, [ + var args = validator_.validateArgs(arguments, [ {'name' : 'resource', 'type': types_.ENUM, 'values' : ['SCREEN', 'CPU']}, {'name' : 'state', 'type': types_.ENUM, 'values' : ['SCREEN_OFF', 'SCREEN_DIM', 'SCREEN_NORMAL', 'SCREEN_BRIGHT', 'CPU_AWAKE']} ]); + if (args['state'] && args.state === PowerScreenState['SCREEN_BRIGHT']) { + console.warn('DEPRECATION WARNING: SCREEN_BRIGHT is deprecated and will be removed from next release.'); + } + var nativeParam = { }; @@ -273,6 +277,8 @@ PowerManager.prototype.restoreScreenBrightness = function() { * Turns on the screen. */ PowerManager.prototype.turnScreenOn = function() { + console.warn('DEPRECATION WARNING: turnScreenOn() is deprecated and will be removed from next release. Use request() instead.'); + var nativeParam = { }; @@ -288,6 +294,8 @@ PowerManager.prototype.turnScreenOn = function() { * Turns off the screen. */ PowerManager.prototype.turnScreenOff = function() { + console.warn('DEPRECATION WARNING: turnScreenOff() is deprecated and will be removed from next release. Use release() instead.'); + var nativeParam = { }; diff --git a/src/power/power_instance.cc b/src/power/power_instance.cc index a4b566d..8296123 100755 --- a/src/power/power_instance.cc +++ b/src/power/power_instance.cc @@ -173,6 +173,8 @@ void PowerInstance::PowerManagerRestorescreenbrightness(const picojson::value& a void PowerInstance::PowerManagerTurnscreenon(const picojson::value& args, picojson::object& out) { LoggerD("Enter"); + LoggerW("DEPRECATION WARNING: turnScreenOn() is deprecated and will be removed from next release. Use request() instead."); + CHECK_PRIVILEGE_ACCESS(kPrivilegePower, &out); PlatformResult result = PowerManager::GetInstance()->SetScreenState(true); @@ -184,6 +186,8 @@ void PowerInstance::PowerManagerTurnscreenon(const picojson::value& args, picojs void PowerInstance::PowerManagerTurnscreenoff(const picojson::value& args, picojson::object& out) { LoggerD("Enter"); + LoggerW("DEPRECATION WARNING: turnScreenOff() is deprecated and will be removed from next release. Use release() instead."); + CHECK_PRIVILEGE_ACCESS(kPrivilegePower, &out); PlatformResult result = PowerManager::GetInstance()->SetScreenState(false); diff --git a/src/power/power_manager.cc b/src/power/power_manager.cc index 865dca4..4bde5f6 100644 --- a/src/power/power_manager.cc +++ b/src/power/power_manager.cc @@ -102,6 +102,12 @@ void PowerManager::OnPlatformStateChangedCB(device_callback_e type, void* value, switch (state) { case DISPLAY_STATE_NORMAL : current = object->bright_state_enabled_ ? POWER_STATE_SCREEN_BRIGHT : POWER_STATE_SCREEN_NORMAL; + + // TODO: Remove log along with removal of deprecation power state + if (POWER_STATE_SCREEN_BRIGHT == current) { + LoggerW("DEPRECATION WARNING: SCREEN_BRIGHT is deprecated and will be removed from next release."); + } + break; case DISPLAY_STATE_SCREEN_DIM : current = POWER_STATE_SCREEN_DIM; @@ -187,6 +193,8 @@ PlatformResult PowerManager::Request(PowerResource resource, PowerState state) { } case POWER_STATE_SCREEN_BRIGHT: { + LoggerW("DEPRECATION WARNING: SCREEN_BRIGHT is deprecated and will be removed from next release."); + int max_brightness; ret = device_display_get_max_brightness(0, &max_brightness); if (DEVICE_ERROR_NONE != ret) { @@ -220,8 +228,11 @@ PlatformResult PowerManager::Request(PowerResource resource, PowerState state) { ret = device_display_get_state(&platform_state); if (DEVICE_ERROR_NONE != ret) LoggerE("device_display_get_state failed (%d)", ret); - if (platform_state == DISPLAY_STATE_NORMAL) + if (DISPLAY_STATE_NORMAL == platform_state) { + // TODO: Remove log along with removal of deprecation power state + LoggerW("DEPRECATION WARNING: SCREEN_BRIGHT is deprecated and will be removed from next release."); BroadcastScreenState(POWER_STATE_SCREEN_BRIGHT); + } break; } case POWER_STATE_SCREEN_OFF: @@ -392,6 +403,8 @@ PlatformResult PowerManager::SetPlatformBrightness(int brightness) { should_be_read_from_cache_ = true; return PlatformResult(ErrorCode::NO_ERROR); } else if (current_state_ == POWER_STATE_SCREEN_BRIGHT) { + LoggerW("DEPRECATION WARNING: SCREEN_BRIGHT is deprecated and will be removed from next release."); + current_brightness_ = brightness; LoggerD("Current state is not normal state the value is saved in cache: %d", brightness); should_be_read_from_cache_ = true; diff --git a/src/push/push_api.js b/src/push/push_api.js index afa1378..e415131 100644 --- a/src/push/push_api.js +++ b/src/push/push_api.js @@ -56,7 +56,7 @@ PushManager.prototype.registerService = function() { values: tizen.ApplicationControl } ]); - console.warn('Method registerService() is deprecated, use register() instead.'); + console.warn('DEPRECATION WARNING: registerService() is deprecated and will be removed from next release. Use register() instead.'); this.register.apply(this, Array.prototype.slice.call(arguments, 1)); }; @@ -89,7 +89,7 @@ PushManager.prototype.register = function() { }; PushManager.prototype.unregisterService = function() { - console.warn('Method unregisterService() is deprecated, use unregister() instead.'); + console.warn('DEPRECATION WARNING: unregisterService() is deprecated and will be removed from next release. Use unregister() instead.'); this.unregister.apply(this, arguments); }; diff --git a/src/systeminfo/systeminfo_api.js b/src/systeminfo/systeminfo_api.js index 7fae0c7..dad6383 100644 --- a/src/systeminfo/systeminfo_api.js +++ b/src/systeminfo/systeminfo_api.js @@ -729,6 +729,8 @@ var SystemInfo = function() { }; SystemInfo.prototype.getCapabilities = function() { + console.warn('DEPRECATION WARNING: getCapabilities() is deprecated and will be removed from next release. Use getCapability() instead.'); + var result = native_.callSync('SystemInfo_getCapabilities', {}); if (native_.isFailure(result)) { throw native_.getErrorObject(result); diff --git a/src/systeminfo/systeminfo_instance.cc b/src/systeminfo/systeminfo_instance.cc index 8f6ad50..15961ec 100644 --- a/src/systeminfo/systeminfo_instance.cc +++ b/src/systeminfo/systeminfo_instance.cc @@ -81,6 +81,8 @@ SysteminfoInstance::~SysteminfoInstance() { void SysteminfoInstance::GetCapabilities(const picojson::value& args, picojson::object& out) { LoggerD("Enter"); + LoggerW("DEPRECATION WARNING: getCapabilities() is deprecated and will be removed from next release. Use getCapability() instead."); + manager_.GetCapabilities(args, &out); } diff --git a/src/time/time_api.js b/src/time/time_api.js index ea6962b..67ae674 100644 --- a/src/time/time_api.js +++ b/src/time/time_api.js @@ -533,6 +533,8 @@ tizen.TZDate.prototype.toString = function() { tizen.TZDate.prototype.getTimezoneAbbreviation = function() { console.log('Entered TZDate.getTimezoneAbbreviation'); + console.warn('DEPRECATION WARNING: getTimezoneAbbreviation() is deprecated and will be removed from next release.'); + var result = native_.callSync('TZDate_getTimezoneAbbreviation', {timezone: String(this._timezoneName), timestamp: String(this._utcTimestamp)}); diff --git a/src/time/time_instance.cc b/src/time/time_instance.cc index c6e9cf2..1e63ece 100644 --- a/src/time/time_instance.cc +++ b/src/time/time_instance.cc @@ -256,6 +256,8 @@ void TimeInstance::TZDate_toString(const picojson::value& args, picojson::object void TimeInstance::TZDate_getTimezoneAbbreviation(const picojson::value& args, picojson::object& out) { LoggerD("Entered"); + LoggerW("DEPRECATION WARNING: getTimezoneAbbreviation() is deprecated and will be removed from next release."); + if (!args.contains("timezone") || !args.contains("timestamp")) { LogAndReportError(PlatformResult(ErrorCode::INVALID_VALUES_ERR, "Invalid parameter passed."), &out, ("Required parameters are missing: \"timezone\", \"timestamp\"")); -- 2.7.4 From 5482ae778f8b3882d4202f3bb094e9ff191a6af1 Mon Sep 17 00:00:00 2001 From: Hyunjin Park Date: Mon, 8 Aug 2016 10:15:02 +0900 Subject: [PATCH 08/16] [version] 1.22 Change-Id: I669b84037a7cd0271a540c6da8b4ce38aa6da15c --- packaging/webapi-plugins.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/webapi-plugins.spec b/packaging/webapi-plugins.spec index b0e257b..c54ace0 100644 --- a/packaging/webapi-plugins.spec +++ b/packaging/webapi-plugins.spec @@ -10,7 +10,7 @@ %define crosswalk_extensions_path %{_libdir}/%{crosswalk_extensions} Name: webapi-plugins -Version: 1.21 +Version: 1.22 Release: 0 License: Apache-2.0 and BSD-2.0 and MIT Group: Development/Libraries -- 2.7.4 From c58da703dfe8e54d5fb8b7c3689b822f5a076835 Mon Sep 17 00:00:00 2001 From: Andrzej Popowski Date: Mon, 8 Aug 2016 13:25:23 +0200 Subject: [PATCH 09/16] [Content] - fixing createThumbnail() function Change-Id: I834dc5a5b427b0cc50e48d14b13aed9b84965ae8 Signed-off-by: Andrzej Popowski --- src/content/content_manager.cc | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/content/content_manager.cc b/src/content/content_manager.cc index 28140da..2673604 100644 --- a/src/content/content_manager.cc +++ b/src/content/content_manager.cc @@ -664,16 +664,18 @@ static bool playlist_content_member_cb(int playlist_member_id, media_info_h medi void CreateThumbnailCallback(media_content_error_e err, const char* path, void* user_data) { LoggerD("Enter"); + unsigned int* callbackId = (unsigned int*) user_data; + if (!(ContentManager::getInstance()->getContentInstance())) { // There is not instance already LoggerD("There is not instance now"); + delete callbackId; return; } - unsigned int callbackId = (unsigned int) user_data; picojson::object out; - out["callbackId"] = picojson::value(static_cast(callbackId)); + out["callbackId"] = picojson::value(static_cast(*callbackId)); if (MEDIA_CONTENT_ERROR_NONE == err) { out["result"] = picojson::value(std::string(path)); @@ -682,6 +684,8 @@ void CreateThumbnailCallback(media_content_error_e err, const char* path, void* PlatformResult result = ContentManager::getInstance()->convertError(err); LogAndReportError(result, &out, ("Failed to create a thumbnail")); } + + delete callbackId; common::Instance::PostMessage(ContentManager::getInstance()->getContentInstance(), picojson::value(out).serialize().c_str()); } @@ -1636,23 +1640,27 @@ int ContentManager::getNumberOfTracks(int id, int* result) { common::PlatformResult ContentManager::createThumbnail(const picojson::value& args) { LoggerD("Enter"); - unsigned int callbackId = static_cast(args.get("callbackId").get()); + unsigned int* callbackId = new unsigned int(static_cast(args.get("callbackId").get())); std::string id = args.get("id").get(); media_info_h media = NULL; int ret = media_info_get_media_from_db(id.c_str(), &media); if(MEDIA_CONTENT_ERROR_NONE != ret && nullptr == media) { + delete callbackId; return LogAndCreateResult(ErrorCode::ABORT_ERR, "Getting media is failed.", ("Getting media is failed: %d (%s)", ret, get_error_message(ret))); } - ret = media_info_create_thumbnail(media, CreateThumbnailCallback, (void*) callbackId); + ret = media_info_create_thumbnail(media, CreateThumbnailCallback, /* (void*) callbackId */ nullptr); media_info_destroy(media); if(MEDIA_CONTENT_ERROR_NONE != ret) { + delete callbackId; return LogAndCreateResult(ErrorCode::ABORT_ERR, "Creating thumbnail failed.", ("Creating thumbnail failed: %d (%s)", ret, get_error_message(ret))); } + delete callbackId; + return PlatformResult(ErrorCode::NO_ERROR); } -- 2.7.4 From 0574d8acee1ce5b2d2e13b178dd1cc7c0c754084 Mon Sep 17 00:00:00 2001 From: Hyunjin Park Date: Wed, 10 Aug 2016 07:47:11 +0900 Subject: [PATCH 10/16] [common] apply changed deviced interface [verification] filesystem/systeminfo TC are passed Change-Id: I68c00e2ea569251a772a87af2c33cd29e9a98b67 --- src/common/filesystem/filesystem_provider_deviced.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/filesystem/filesystem_provider_deviced.cc b/src/common/filesystem/filesystem_provider_deviced.cc index 3c22667..e8613a8 100644 --- a/src/common/filesystem/filesystem_provider_deviced.cc +++ b/src/common/filesystem/filesystem_provider_deviced.cc @@ -29,7 +29,7 @@ namespace { static const char* kBus = "org.tizen.system.storage"; -static const char* kBlockIface = "org.tizen.system.storage.Block"; +static const char* kBlockIface = "org.tizen.system.storage.BlockManager"; static const char* kBlackManagerIface = "org.tizen.system.storage.BlockManager"; static const char* kPath = "/Org/Tizen/System/Storage/Block/Manager"; static const char* kDeviceChangedMethod = "DeviceChanged"; -- 2.7.4 From c0b60f0abc8d108fab6e6be0d4f68c0b250945f5 Mon Sep 17 00:00:00 2001 From: Hyunjin Park Date: Wed, 10 Aug 2016 16:12:20 +0900 Subject: [PATCH 11/16] [version] 1.23 Change-Id: I08bdd950d48da08b76c28768ace04c8404dcd7a6 --- packaging/webapi-plugins.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/webapi-plugins.spec b/packaging/webapi-plugins.spec index c54ace0..eb12889 100644 --- a/packaging/webapi-plugins.spec +++ b/packaging/webapi-plugins.spec @@ -10,7 +10,7 @@ %define crosswalk_extensions_path %{_libdir}/%{crosswalk_extensions} Name: webapi-plugins -Version: 1.22 +Version: 1.23 Release: 0 License: Apache-2.0 and BSD-2.0 and MIT Group: Development/Libraries -- 2.7.4 From c86d9b07077321e1891270c05c2f9afd3c59b40c Mon Sep 17 00:00:00 2001 From: Andrzej Popowski Date: Wed, 10 Aug 2016 09:57:27 +0200 Subject: [PATCH 12/16] [Filesystem] - new deviced API applied Change-Id: I3093b99841ff1e77f4b01db9956d20c03be49cbf Signed-off-by: Andrzej Popowski --- src/common/filesystem/filesystem_provider_deviced.cc | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/common/filesystem/filesystem_provider_deviced.cc b/src/common/filesystem/filesystem_provider_deviced.cc index e8613a8..f3bb5a0 100644 --- a/src/common/filesystem/filesystem_provider_deviced.cc +++ b/src/common/filesystem/filesystem_provider_deviced.cc @@ -23,14 +23,12 @@ #include #include #include - #include "common/filesystem/filesystem_storage.h" #include "common/logger.h" namespace { static const char* kBus = "org.tizen.system.storage"; -static const char* kBlockIface = "org.tizen.system.storage.BlockManager"; -static const char* kBlackManagerIface = "org.tizen.system.storage.BlockManager"; +static const char* kBlockManagerIface = "org.tizen.system.storage.BlockManager"; static const char* kPath = "/Org/Tizen/System/Storage/Block/Manager"; static const char* kDeviceChangedMethod = "DeviceChanged"; static const char* kGetDeviceListMethod = "GetDeviceList"; @@ -173,7 +171,7 @@ void FilesystemProviderDeviced::RegisterDeviceChangeState( if (device_changed_callback_ == nullptr) { LoggerD("Registering dbus signal subscription"); block_signal_subscribe_id_ = g_dbus_connection_signal_subscribe( - dbus_, nullptr, kBlockIface, kDeviceChangedMethod, + dbus_, nullptr, kBlockManagerIface, kDeviceChangedMethod, nullptr, nullptr, G_DBUS_SIGNAL_FLAGS_NONE, BlockSignalProxy, this, nullptr); } @@ -240,7 +238,7 @@ Storages FilesystemProviderDeviced::GetStorages() { GVariant* variant = g_dbus_connection_call_sync(dbus_, kBus, kPath, - kBlackManagerIface, + kBlockManagerIface, kGetDeviceListMethod, g_variant_new("(s)", "all"), NULL, -- 2.7.4 From 38cb014ec735107c942beb8e2a2acfbdc9f05981 Mon Sep 17 00:00:00 2001 From: Hyunjin Park Date: Wed, 17 Aug 2016 13:33:49 +0900 Subject: [PATCH 13/16] [NFC][wearable emulator] enable NFC feature Change-Id: I023ef3ed461bd4c9af47a97ff9dffe72d3c5cc30 --- packaging/webapi-plugins.spec | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packaging/webapi-plugins.spec b/packaging/webapi-plugins.spec index eb12889..128205a 100644 --- a/packaging/webapi-plugins.spec +++ b/packaging/webapi-plugins.spec @@ -10,7 +10,7 @@ %define crosswalk_extensions_path %{_libdir}/%{crosswalk_extensions} Name: webapi-plugins -Version: 1.23 +Version: 1.24 Release: 0 License: Apache-2.0 and BSD-2.0 and MIT Group: Development/Libraries @@ -232,11 +232,7 @@ Source0: %{name}-%{version}.tar.gz %define tizen_feature_message_port_support 1 %define tizen_feature_messaging_support 0 %define tizen_feature_nfc_emulation_support 0 -%if 0%{?tizen_is_emulator} -%define tizen_feature_nfc_support 0 -%else %define tizen_feature_nfc_support 1 -%endif %define tizen_feature_notification_support 1 %define tizen_feature_package_support 1 %define tizen_feature_power_support 1 -- 2.7.4 From f175b52301477712e61afc52449b7327f86396a7 Mon Sep 17 00:00:00 2001 From: Tomasz Marciniak Date: Thu, 18 Aug 2016 10:49:14 +0200 Subject: [PATCH 14/16] [SecureElement] Adjusted to new native api - part 1. [Verification] Code compiles. Change-Id: Ic598a7a54d38fbf77ff38ab206c5e47aaf033541 Signed-off-by: Tomasz Marciniak --- packaging/webapi-plugins.spec | 3 +- src/secureelement/secureelement.gyp | 10 +- src/secureelement/secureelement_api.js | 4 +- src/secureelement/secureelement_channel.cc | 61 ---- src/secureelement/secureelement_channel.h | 40 --- src/secureelement/secureelement_instance.cc | 478 +++++++++++---------------- src/secureelement/secureelement_instance.h | 43 ++- src/secureelement/secureelement_reader.cc | 82 ----- src/secureelement/secureelement_reader.h | 42 --- src/secureelement/secureelement_seservice.cc | 239 -------------- src/secureelement/secureelement_seservice.h | 56 ---- src/secureelement/secureelement_session.cc | 107 ------ src/secureelement/secureelement_session.h | 47 --- 13 files changed, 215 insertions(+), 997 deletions(-) delete mode 100644 src/secureelement/secureelement_channel.cc delete mode 100644 src/secureelement/secureelement_channel.h delete mode 100644 src/secureelement/secureelement_reader.cc delete mode 100644 src/secureelement/secureelement_reader.h delete mode 100644 src/secureelement/secureelement_seservice.cc delete mode 100644 src/secureelement/secureelement_seservice.h delete mode 100644 src/secureelement/secureelement_session.cc delete mode 100644 src/secureelement/secureelement_session.h diff --git a/packaging/webapi-plugins.spec b/packaging/webapi-plugins.spec index 128205a..8b9c4ff 100644 --- a/packaging/webapi-plugins.spec +++ b/packaging/webapi-plugins.spec @@ -477,8 +477,7 @@ BuildRequires: pkgconfig(feedback) %endif %if 0%{?tizen_feature_se_support} -BuildRequires: pkgconfig(smartcard-service) -BuildRequires: pkgconfig(smartcard-service-common) +BuildRequires: pkgconfig(capi-network-smartcard) %endif %if 0%{?tizen_feature_message_port_support} diff --git a/src/secureelement/secureelement.gyp b/src/secureelement/secureelement.gyp index a302c6a..9c9bf00 100644 --- a/src/secureelement/secureelement.gyp +++ b/src/secureelement/secureelement.gyp @@ -15,21 +15,13 @@ 'secureelement_extension.h', 'secureelement_instance.cc', 'secureelement_instance.h', - 'secureelement_seservice.cc', - 'secureelement_seservice.h', - 'secureelement_reader.cc', - 'secureelement_reader.h', - 'secureelement_session.cc', - 'secureelement_session.h', - 'secureelement_channel.cc', - 'secureelement_channel.h', ], 'includes': [ '../common/pkg-config.gypi', ], 'conditions': [ [ 'tizen == 1', { - 'variables': { 'packages': ['smartcard-service', 'smartcard-service-common'] }, + 'variables': { 'packages': ['capi-network-smartcard'] }, }], ], }, diff --git a/src/secureelement/secureelement_api.js b/src/secureelement/secureelement_api.js index ccbcde2..9a55298 100644 --- a/src/secureelement/secureelement_api.js +++ b/src/secureelement/secureelement_api.js @@ -184,7 +184,7 @@ function Reader(reader_handle) { console.log('SEReader_isPresent error: ' + native_.getErrorObject(result)); return false; } else { - return native_.getResultObject(result).isPresent; + return native_.getResultObject(result); } }}, _handle: { configurable: false, @@ -202,7 +202,7 @@ Reader.prototype.getName = function() { throw native_.getErrorObject(result); } - return native_.getResultObject(result).name; + return native_.getResultObject(result); }; Reader.prototype.openSession = function() { diff --git a/src/secureelement/secureelement_channel.cc b/src/secureelement/secureelement_channel.cc deleted file mode 100644 index e7355d3..0000000 --- a/src/secureelement/secureelement_channel.cc +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "common/picojson.h" -#include "common/logger.h" -#include "secureelement_channel.h" - -using namespace smartcard_service_api; - -namespace extension { -namespace secureelement { - -void SEChannel::close() { - LoggerD("Entered"); - if (m_channel_ptr && !m_channel_ptr->isClosed()) { - m_channel_ptr->closeSync(); - } -} - - -ByteArray SEChannel::transmit(const picojson::array& v_command) { - LoggerD("Entered"); - ByteArray response; - if ( m_channel_ptr) { - size_t v_command_size = v_command.size(); - uint8_t* command = new uint8_t[v_command_size]; - for (size_t i = 0; i < v_command_size; i++) { - command[i] = (uint8_t) static_cast(v_command[i].get()); - } - ByteArray ba_command(command, v_command.size()); - delete [] command; - m_channel_ptr->transmitSync( ba_command, response); - } - return response; -} - - -ByteArray SEChannel::getSelectResponse() { - LoggerD("Entered"); - ByteArray response; - if ( m_channel_ptr) { - response = m_channel_ptr->getSelectResponse(); - } - return response; -} - -} // secureelement -} // extension diff --git a/src/secureelement/secureelement_channel.h b/src/secureelement/secureelement_channel.h deleted file mode 100644 index 4d62643..0000000 --- a/src/secureelement/secureelement_channel.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef SECUREELEMENT_CHANNEL_H_ -#define SECUREELEMENT_CHANNEL_H_ - -#include -#include "common/picojson.h" - -namespace extension { -namespace secureelement { - -class SEChannel { -public: - SEChannel( smartcard_service_api::ClientChannel* channel_ptr) : m_channel_ptr(channel_ptr) {}; - virtual ~SEChannel() {}; - void close(); - smartcard_service_api::ByteArray transmit(const picojson::array& v_command); - smartcard_service_api::ByteArray getSelectResponse(); -private: - smartcard_service_api::ClientChannel* m_channel_ptr; -}; - -} // secureelement -} // extension - -#endif // SECUREELEMENT_CHANNEL_H_ diff --git a/src/secureelement/secureelement_instance.cc b/src/secureelement/secureelement_instance.cc index 3b78716..75063a7 100644 --- a/src/secureelement/secureelement_instance.cc +++ b/src/secureelement/secureelement_instance.cc @@ -16,384 +16,286 @@ #include "secureelement/secureelement_instance.h" -#include -#include -#include "common/picojson.h" -#include "common/logger.h" -#include "common/task-queue.h" -#include "common/tools.h" +#include +#include -#include "secureelement_reader.h" -#include "secureelement_session.h" -#include "secureelement_channel.h" +#include "common/tools.h" +#include "common/scope_exit.h" namespace extension { namespace secureelement { -using namespace common; -using namespace smartcard_service_api; +using common::TizenResult; +using common::TizenSuccess; namespace { const std::string kPrivilegeSecureElement = "http://tizen.org/privilege/secureelement"; + +const std::string kHandle = "handle"; + +TizenResult ConvertErrorCode(int error) { + switch (error) { + case SMARTCARD_ERROR_NONE: + return TizenSuccess(); + case SMARTCARD_ERROR_INVALID_PARAMETER: + return common::InvalidValuesError(error); + case SMARTCARD_ERROR_IO_ERROR: + return common::IoError(error); + case SMARTCARD_ERROR_ILLEGAL_STATE: + case SMARTCARD_ERROR_CHANNEL_NOT_AVAILABLE: + return common::InvalidStateError(error); + case SMARTCARD_ERROR_NO_SUCH_ELEMENT: + return common::NotFoundError(error); + case SMARTCARD_ERROR_GENERAL: + case SMARTCARD_ERROR_ILLEGAL_REFERENCE: + case SMARTCARD_ERROR_OPERATION_NOT_SUPPORTED: + case SMARTCARD_ERROR_PERMISSION_DENIED: + case SMARTCARD_ERROR_NOT_INITIALIZED: + case SMARTCARD_ERROR_NOT_SUPPORTED: + default: + return common::UnknownError(error); + } } -SecureElementInstance::SecureElementInstance() - : service_(*this) { - LoggerD("Entered"); +} //namespace + +SecureElementInstance::SecureElementInstance() : + is_initialized_(false) { + ScopeLogger(); - using std::placeholders::_1; - using std::placeholders::_2; + using std::placeholders::_1; + using std::placeholders::_2; #define REGISTER_SYNC(c,x) \ - RegisterSyncHandler(c, std::bind(&SecureElementInstance::x, this, _1, _2)); - - REGISTER_SYNC("SEService_registerSEListener", RegisterSEListener); - REGISTER_SYNC("SEService_unregisterSEListener", UnregisterSEListener); - REGISTER_SYNC("SEService_shutdown", Shutdown); - REGISTER_SYNC("SEReader_getName", GetName); - REGISTER_SYNC("SEReader_isPresent", IsPresent); - REGISTER_SYNC("SEReader_closeSessions", CloseSessions); - REGISTER_SYNC("SESession_getATR", GetATR); - REGISTER_SYNC("SESession_isClosed", IsSessionClosed); - REGISTER_SYNC("SESession_close", CloseSession); - REGISTER_SYNC("SESession_closeChannels", CloseChannels); - REGISTER_SYNC("SEChannel_close", CloseChannel); - REGISTER_SYNC("SEChannel_getSelectResponse", GetSelectResponse); + RegisterSyncHandler(c, std::bind(&SecureElementInstance::x, this, _1)); + + REGISTER_SYNC("SEService_registerSEListener", RegisterSEListener); + REGISTER_SYNC("SEService_unregisterSEListener", UnregisterSEListener); + REGISTER_SYNC("SEService_shutdown", Shutdown); + REGISTER_SYNC("SEReader_getName", GetName); + REGISTER_SYNC("SEReader_isPresent", IsPresent); + REGISTER_SYNC("SEReader_closeSessions", CloseSessions); + REGISTER_SYNC("SESession_getATR", GetATR); + REGISTER_SYNC("SESession_isClosed", IsSessionClosed); + REGISTER_SYNC("SESession_close", CloseSession); + REGISTER_SYNC("SESession_closeChannels", CloseChannels); + REGISTER_SYNC("SEChannel_close", CloseChannel); + REGISTER_SYNC("SEChannel_getSelectResponse", GetSelectResponse); #undef REGISTER_SYNC #define REGISTER(c,x) \ - RegisterSyncHandler(c, std::bind(&SecureElementInstance::x, this, _1, _2)); + RegisterHandler(c, std::bind(&SecureElementInstance::x, this, _1, _2)); - REGISTER("SEService_getReaders", GetReaders); - REGISTER("SEReader_openSession", OpenSession); - REGISTER("SESession_openBasicChannel", OpenBasicChannel); - REGISTER("SESession_openLogicalChannel", OpenLogicalChannel); - REGISTER("SEChannel_transmit", Transmit); + REGISTER("SEService_getReaders", GetReaders); + REGISTER("SEReader_openSession", OpenSession); + REGISTER("SESession_openBasicChannel", OpenBasicChannel); + REGISTER("SESession_openLogicalChannel", OpenLogicalChannel); + REGISTER("SEChannel_transmit", Transmit); #undef REGISTER + + if (SMARTCARD_ERROR_NONE == smartcard_initialize()) { + is_initialized_ = true; + } } SecureElementInstance::~SecureElementInstance() { + ScopeLogger(); + + if (is_initialized_) { + if (SMARTCARD_ERROR_NONE != smartcard_deinitialize()) { + LoggerE("Failed to deinitilize smartcard service"); + } + is_initialized_ = false; + } } -void SecureElementInstance::GetReaders(const picojson::value& args, picojson::object& out) { - LoggerD("Entered"); +// Service methods +TizenResult SecureElementInstance::GetReaders(picojson::object const& args, const common::AsyncToken& token) { + ScopeLogger(); - CHECK_PRIVILEGE_ACCESS(kPrivilegeSecureElement, &out); + CHECK_PRIVILEGE(kPrivilegeSecureElement); - double callback_id = 0.0; - if (args.contains("callbackId")) { - callback_id = args.get("callbackId").get(); - } + auto get_readers = [this](const common::AsyncToken& token) -> void { + TizenResult result = TizenSuccess(); - service_.GetReaders(callback_id); - ReportSuccess(out); -} + int* readers = nullptr; + int count = 0; -void SecureElementInstance::RegisterSEListener(const picojson::value& args, picojson::object& out) { - LoggerD("Entered"); + int ret = smartcard_get_readers(&readers, &count); + SCOPE_EXIT { + free(readers); + }; - CHECK_PRIVILEGE_ACCESS(kPrivilegeSecureElement, &out); + if (SMARTCARD_ERROR_NONE != ret) { + LoggerE("smartcard_get_readers() failed"); + result = ConvertErrorCode(ret); + } else { + picojson::value response{picojson::array{}}; + auto& array = response.get(); + bool is_present = false; + + for (int i = 0; i < count; i++) { + ret = smartcard_reader_is_secure_element_present(readers[i], &is_present); + if (SMARTCARD_ERROR_NONE == ret && is_present) { + array.push_back(picojson::value(static_cast(readers[i]))); + } + } - service_.RegisterSEListener(); - ReportSuccess(out); -} + result = TizenSuccess(response); + } -void SecureElementInstance::UnregisterSEListener( - const picojson::value& args, picojson::object& out) { - LoggerD("Entered"); + this->Post(token, result); + }; - CHECK_PRIVILEGE_ACCESS(kPrivilegeSecureElement, &out); + std::thread(get_readers, token).detach(); - service_.UnregisterSEListener(); - ReportSuccess(out); + return TizenSuccess(); } -void SecureElementInstance::Shutdown(const picojson::value& args, picojson::object& out) { - LoggerD("Entered"); +TizenResult SecureElementInstance::RegisterSEListener(picojson::object const& args) { + ScopeLogger(); - CHECK_PRIVILEGE_ACCESS(kPrivilegeSecureElement, &out); + CHECK_PRIVILEGE(kPrivilegeSecureElement); - service_.Shutdown(); - ReportSuccess(out); + return common::NotSupportedError(); } -void SecureElementInstance::GetName( - const picojson::value& args, picojson::object& out) { - LoggerD("Entered"); +TizenResult SecureElementInstance::UnregisterSEListener(picojson::object const& args) { + ScopeLogger(); - CHECK_PRIVILEGE_ACCESS(kPrivilegeSecureElement, &out); + CHECK_PRIVILEGE(kPrivilegeSecureElement); - Reader* reader_ptr = (Reader*) static_cast(args.get("handle").get()); - SEReader seReader(reader_ptr); - picojson::value result = seReader.getName(); - ReportSuccess(result, out); + return common::NotSupportedError(); } -void SecureElementInstance::IsPresent( - const picojson::value& args, picojson::object& out) { - LoggerD("Entered"); +TizenResult SecureElementInstance::Shutdown(picojson::object const& args) { + ScopeLogger(); + + if (is_initialized_) { + int ret = smartcard_deinitialize(); + if (SMARTCARD_ERROR_NONE != ret) { + LogAndReturnTizenError(ConvertErrorCode(ret), ("smartcard_deinitialize() failed")); + } - Reader* reader_ptr = (Reader*) static_cast(args.get("handle").get()); - SEReader seReader(reader_ptr); - picojson::value result = seReader.isPresent(); - ReportSuccess(result, out); + is_initialized_ = false; + } + + return TizenSuccess(); } -void SecureElementInstance::CloseSessions( - const picojson::value& args, picojson::object& out) { - LoggerD("Entered"); +// Reader methods +TizenResult SecureElementInstance::GetName(picojson::object const& args) { + ScopeLogger(); - CHECK_PRIVILEGE_ACCESS(kPrivilegeSecureElement, &out); + CHECK_PRIVILEGE(kPrivilegeSecureElement); - Reader* reader_ptr = (Reader*) static_cast(args.get("handle").get()); - SEReader seReader(reader_ptr); - seReader.closeSessions(); - ReportSuccess(out); -} + int reader = static_cast(args.find(kHandle)->second.get()); + char* name = nullptr; -void SecureElementInstance::CloseChannel( const picojson::value& args, picojson::object& out) { - LoggerD("Entered"); - CHECK_PRIVILEGE_ACCESS(kPrivilegeSecureElement, &out); + int ret = smartcard_reader_get_name(reader, &name); + SCOPE_EXIT { + free(name); + }; - ClientChannel* channel_ptr = (ClientChannel*) static_cast(args.get("handle").get()); - SEChannel seChannel(channel_ptr); - seChannel.close(); - ReportSuccess(out); -} + if (SMARTCARD_ERROR_NONE != ret) { + LogAndReturnTizenError(ConvertErrorCode(ret), ("smartcard_reader_get_name() failed")); + } -void SecureElementInstance::GetSelectResponse( const picojson::value& args, picojson::object& out) { - LoggerD("Entered"); - CHECK_PRIVILEGE_ACCESS(kPrivilegeSecureElement, &out); + return TizenSuccess(picojson::value(name)); +} - ClientChannel* channel_ptr = (ClientChannel*) static_cast(args.get("handle").get()); - SEChannel seChannel(channel_ptr); +TizenResult SecureElementInstance::IsPresent(picojson::object const& args) { + ScopeLogger(); - ByteArray select_response = seChannel.getSelectResponse(); - picojson::value result = picojson::value(picojson::array()); - picojson::array& arr = result.get(); - size_t select_response_size = select_response.size(); - for (size_t i = 0; i < select_response_size; i++) { - arr.push_back(picojson::value(static_cast(select_response[i]))); - } - ReportSuccess( result, out); + return common::NotSupportedError(); } -void SecureElementInstance::OpenSession( - const picojson::value& args, picojson::object& out) { - LoggerD("Entered"); - CHECK_PRIVILEGE_ACCESS(kPrivilegeSecureElement, &out); - - const double callback_id = args.get("callbackId").get(); - Reader* reader_ptr = (Reader*) static_cast(args.get("handle").get()); - - auto open_session = [this, reader_ptr](const std::shared_ptr& response) -> void { - LoggerD("Opening session"); - try { - SEReader seReader(reader_ptr); - picojson::value result = seReader.openSession(); - ReportSuccess(result, response->get()); - } catch (const ErrorIO& err) { - LogAndReportError(PlatformResult(ErrorCode::IO_ERR), &response->get()); - } catch (const ErrorIllegalState& err) { - LogAndReportError(PlatformResult(ErrorCode::INVALID_STATE_ERR), &response->get()); - } catch (const ErrorIllegalParameter& err) { - LogAndReportError(PlatformResult(ErrorCode::INVALID_VALUES_ERR), &response->get()); - } catch (const ErrorSecurity& err) { - LogAndReportError(PlatformResult(ErrorCode::SECURITY_ERR), &response->get()); - } catch (const ExceptionBase& err) { - LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR), &response->get()); - } - }; +TizenResult SecureElementInstance::OpenSession(picojson::object const& args, const common::AsyncToken& token) { + ScopeLogger(); - auto open_session_response = [this, callback_id](const std::shared_ptr& response) -> void { - LoggerD("Getting response"); + CHECK_PRIVILEGE(kPrivilegeSecureElement); - picojson::object& obj = response->get(); - obj.insert(std::make_pair("callbackId", picojson::value(callback_id))); - Instance::PostMessage(this, response->serialize().c_str()); - }; + return common::NotSupportedError(); +} - auto data = std::shared_ptr(new picojson::value(picojson::object())); +TizenResult SecureElementInstance::CloseSessions(picojson::object const& args) { + ScopeLogger(); - TaskQueue::GetInstance().Queue( - open_session, - open_session_response, - data); + CHECK_PRIVILEGE(kPrivilegeSecureElement); + + return common::NotSupportedError(); } // Session functions +TizenResult SecureElementInstance::OpenBasicChannel(picojson::object const& args, const common::AsyncToken& token) { + ScopeLogger(); -void SecureElementInstance::OpenBasicChannel( const picojson::value& args, picojson::object& out) { - LoggerD("Enter"); - CHECK_PRIVILEGE_ACCESS(kPrivilegeSecureElement, &out); - - const double callback_id = args.get("callbackId").get(); - const picojson::array v_aid = args.get("aid").get(); - Session* session_ptr = (Session*) static_cast(args.get("handle").get()); - - auto open = [this, v_aid, session_ptr](const std::shared_ptr& response) -> void { - LoggerD("Opening basic channel"); - try { - SESession seSession(session_ptr); - picojson::value result = seSession.openBasicChannel(v_aid); - ReportSuccess(result, response->get()); - } catch (const ErrorIO& err) { - LogAndReportError(PlatformResult(ErrorCode::IO_ERR), &response->get()); - } catch (const ErrorIllegalState& err) { - LogAndReportError(PlatformResult(ErrorCode::INVALID_STATE_ERR), &response->get()); - } catch (const ErrorIllegalParameter& err) { - LogAndReportError(PlatformResult(ErrorCode::INVALID_VALUES_ERR), &response->get()); - } catch (const ErrorSecurity& err) { - LogAndReportError(PlatformResult(ErrorCode::SECURITY_ERR), &response->get()); - } catch (const ExceptionBase& err) { - LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR), &response->get()); - } - }; + CHECK_PRIVILEGE(kPrivilegeSecureElement); - auto get_response = [this, callback_id](const std::shared_ptr& response) -> void { - LoggerD("Getting response"); - picojson::object& obj = response->get(); - obj.insert(std::make_pair("callbackId", picojson::value(callback_id))); - Instance::PostMessage(this, response->serialize().c_str()); - }; + return common::NotSupportedError(); +} + +TizenResult SecureElementInstance::OpenLogicalChannel(picojson::object const& args, const common::AsyncToken& token) { + ScopeLogger(); - auto data = std::shared_ptr(new picojson::value(picojson::object())); + CHECK_PRIVILEGE(kPrivilegeSecureElement); - TaskQueue::GetInstance().Queue(open, get_response, data); + return common::NotSupportedError(); } +TizenResult SecureElementInstance::GetATR(picojson::object const& args) { + ScopeLogger(); -void SecureElementInstance::OpenLogicalChannel( const picojson::value& args, picojson::object& out) { - LoggerD("Enter"); - CHECK_PRIVILEGE_ACCESS(kPrivilegeSecureElement, &out); - - const double callback_id = args.get("callbackId").get(); - const picojson::array v_aid = args.get("aid").get(); - Session* session_ptr = (Session*) static_cast(args.get("handle").get()); - - auto open = [this, v_aid, session_ptr](const std::shared_ptr& response) -> void { - LoggerD("Opening basic channel"); - try { - SESession seSession(session_ptr); - picojson::value result = seSession.openLogicalChannel(v_aid); - ReportSuccess(result, response->get()); - } catch (const ErrorIO& err) { - LogAndReportError(PlatformResult(ErrorCode::IO_ERR), &response->get()); - } catch (const ErrorIllegalState& err) { - LogAndReportError(PlatformResult(ErrorCode::INVALID_STATE_ERR), &response->get()); - } catch (const ErrorIllegalParameter& err) { - LogAndReportError(PlatformResult(ErrorCode::INVALID_VALUES_ERR), &response->get()); - } catch (const ErrorSecurity& err) { - LogAndReportError(PlatformResult(ErrorCode::SECURITY_ERR), &response->get()); - } catch (const ExceptionBase& err) { - LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR), &response->get()); - } - }; + CHECK_PRIVILEGE(kPrivilegeSecureElement); - auto get_response = [this, callback_id](const std::shared_ptr& response) -> void { - LoggerD("Getting response"); - picojson::object& obj = response->get(); - obj.insert(std::make_pair("callbackId", picojson::value(callback_id))); - Instance::PostMessage(this, response->serialize().c_str()); - }; + return common::NotSupportedError(); +} - auto data = std::shared_ptr(new picojson::value(picojson::object())); +TizenResult SecureElementInstance::IsSessionClosed(picojson::object const& args) { + ScopeLogger(); - TaskQueue::GetInstance().Queue(open, get_response, data); + return common::NotSupportedError(); } +TizenResult SecureElementInstance::CloseSession(picojson::object const& args) { + ScopeLogger(); -void SecureElementInstance::GetATR( const picojson::value& args, picojson::object& out) { - LoggerD("Enter"); - CHECK_PRIVILEGE_ACCESS(kPrivilegeSecureElement, &out); - - Session* session_ptr = (Session*) static_cast(args.get("handle").get()); - SESession seSession(session_ptr); + CHECK_PRIVILEGE(kPrivilegeSecureElement); - ByteArray atr_result = seSession.getATR(); - picojson::value result = picojson::value(picojson::array()); - picojson::array& arr = result.get(); - size_t atr_result_size = atr_result.size(); - for (size_t i = 0; i < atr_result_size; i++) { - arr.push_back(picojson::value(static_cast(atr_result[i]))); - } - ReportSuccess( result, out); + return common::NotSupportedError(); } +TizenResult SecureElementInstance::CloseChannels(picojson::object const& args) { + ScopeLogger(); -void SecureElementInstance::IsSessionClosed( const picojson::value& args, picojson::object& out) { - LoggerD("Enter"); - Session* session_ptr = (Session*) static_cast(args.get("handle").get()); - SESession seSession(session_ptr); - picojson::value result = seSession.isClosed(); - ReportSuccess( result, out); + CHECK_PRIVILEGE(kPrivilegeSecureElement); + + return common::NotSupportedError(); } +// Channel methods +TizenResult SecureElementInstance::CloseChannel(picojson::object const& args) { + ScopeLogger(); -void SecureElementInstance::CloseSession( const picojson::value& args, picojson::object& out) { - LoggerD("Enter"); - CHECK_PRIVILEGE_ACCESS(kPrivilegeSecureElement, &out); + CHECK_PRIVILEGE(kPrivilegeSecureElement); - Session* session_ptr = (Session*) static_cast(args.get("handle").get()); - SESession seSession(session_ptr); - seSession.close(); - ReportSuccess(out); + return common::NotSupportedError(); } +TizenResult SecureElementInstance::Transmit(picojson::object const& args, const common::AsyncToken& token) { + ScopeLogger(); -void SecureElementInstance::CloseChannels( const picojson::value& args, picojson::object& out) { - LoggerD("Enter"); - CHECK_PRIVILEGE_ACCESS(kPrivilegeSecureElement, &out); + CHECK_PRIVILEGE(kPrivilegeSecureElement); - Session* session_ptr = (Session*) static_cast(args.get("handle").get()); - SESession seSession(session_ptr); - seSession.closeChannels(); - ReportSuccess(out); + return common::NotSupportedError(); } -void SecureElementInstance::Transmit( const picojson::value& args, picojson::object& out) { - LoggerD("Enter"); - CHECK_PRIVILEGE_ACCESS(kPrivilegeSecureElement, &out); - - const double callback_id = args.get("callbackId").get(); - const picojson::array v_command = args.get("command").get(); - ClientChannel* channel_ptr = (ClientChannel*) static_cast(args.get("handle").get()); - - auto open = [this, v_command, channel_ptr](const std::shared_ptr& response) -> void { - LoggerD("Transmit APDDU command to secure element"); - try { - SEChannel seChannel(channel_ptr); - ByteArray transmit_response = seChannel.transmit(v_command); - picojson::value result = picojson::value(picojson::array()); - picojson::array& arr = result.get(); - size_t transmit_response_size = transmit_response.size(); - for (size_t i = 0; i < transmit_response_size; i++) { - arr.push_back(picojson::value(static_cast(transmit_response[i]))); - } - ReportSuccess( result, response->get()); - } catch (const ErrorIO& err) { - LogAndReportError(PlatformResult(ErrorCode::IO_ERR, "Failed to transmit command."), &response->get()); - } catch (const ErrorIllegalState& err) { - LogAndReportError(PlatformResult(ErrorCode::INVALID_STATE_ERR, "Failed to transmit command."), &response->get()); - } catch (const ErrorIllegalParameter& err) { - LogAndReportError(PlatformResult(ErrorCode::INVALID_VALUES_ERR, "Failed to transmit command."), &response->get()); - } catch (const ErrorSecurity& err) { - LogAndReportError(PlatformResult(ErrorCode::SECURITY_ERR, "Failed to transmit command."), &response->get()); - } catch (const ExceptionBase& err) { - LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to transmit command."), &response->get()); - } - }; - - auto get_response = [this, callback_id](const std::shared_ptr& response) -> void { - LoggerD("Getting response"); - picojson::object& obj = response->get(); - obj.insert(std::make_pair("callbackId", picojson::value(callback_id))); - Instance::PostMessage(this, response->serialize().c_str()); - }; +TizenResult SecureElementInstance::GetSelectResponse(picojson::object const& args) { + ScopeLogger(); - auto data = std::shared_ptr(new picojson::value(picojson::object())); + CHECK_PRIVILEGE(kPrivilegeSecureElement); - TaskQueue::GetInstance().Queue(open, get_response, data); + return common::NotSupportedError(); } } // namespace secureelement diff --git a/src/secureelement/secureelement_instance.h b/src/secureelement/secureelement_instance.h index 1f0ff9c..21a9bcc 100644 --- a/src/secureelement/secureelement_instance.h +++ b/src/secureelement/secureelement_instance.h @@ -17,44 +17,43 @@ #ifndef SECUREELEMENT_SECUREELEMENT_INSTANCE_H_ #define SECUREELEMENT_SECUREELEMENT_INSTANCE_H_ -#include "common/extension.h" -#include "secureelement_seservice.h" +#include "common/tizen_instance.h" namespace extension { namespace secureelement { -class SecureElementInstance: public common::ParsedInstance { +class SecureElementInstance: public common::TizenInstance { public: SecureElementInstance(); virtual ~SecureElementInstance(); private: - /* SEService methods */ - void GetReaders(const picojson::value& args, picojson::object& out); - void RegisterSEListener(const picojson::value& args, picojson::object& out); - void UnregisterSEListener(const picojson::value& args, picojson::object& out); - void Shutdown(const picojson::value& args, picojson::object& out); + /* Service methods */ + common::TizenResult GetReaders(picojson::object const& args, const common::AsyncToken& token); + common::TizenResult RegisterSEListener(picojson::object const& args); + common::TizenResult UnregisterSEListener(picojson::object const& args); + common::TizenResult Shutdown(picojson::object const& args); /* Reader methods */ - void GetName(const picojson::value& args, picojson::object& out); - void IsPresent(const picojson::value& args, picojson::object& out); - void OpenSession(const picojson::value& args, picojson::object& out); - void CloseSessions(const picojson::value& args, picojson::object& out); + common::TizenResult GetName(picojson::object const& args); + common::TizenResult IsPresent(picojson::object const& args); + common::TizenResult OpenSession(picojson::object const& args, const common::AsyncToken& token); + common::TizenResult CloseSessions(picojson::object const& args); /* Session methods */ - void OpenBasicChannel(const picojson::value& args, picojson::object& out); - void OpenLogicalChannel(const picojson::value& args, picojson::object& out); - void GetATR(const picojson::value& args, picojson::object& out); - void IsSessionClosed(const picojson::value& args, picojson::object& out); - void CloseSession(const picojson::value& args, picojson::object& out); - void CloseChannels(const picojson::value& args, picojson::object& out); + common::TizenResult OpenBasicChannel(picojson::object const& args, const common::AsyncToken& token); + common::TizenResult OpenLogicalChannel(picojson::object const& args, const common::AsyncToken& token); + common::TizenResult GetATR(picojson::object const& args); + common::TizenResult IsSessionClosed(picojson::object const& args); + common::TizenResult CloseSession(picojson::object const& args); + common::TizenResult CloseChannels(picojson::object const& args); /* Channel methods */ - void CloseChannel(const picojson::value& args, picojson::object& out); - void Transmit(const picojson::value& args, picojson::object& out); - void GetSelectResponse(const picojson::value& args, picojson::object& out); + common::TizenResult CloseChannel(picojson::object const& args); + common::TizenResult Transmit(picojson::object const& args, const common::AsyncToken& token); + common::TizenResult GetSelectResponse(picojson::object const& args); - SEService service_; + bool is_initialized_; }; } // namespace secureelement diff --git a/src/secureelement/secureelement_reader.cc b/src/secureelement/secureelement_reader.cc deleted file mode 100644 index 3ad2845..0000000 --- a/src/secureelement/secureelement_reader.cc +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "secureelement_reader.h" - -#include -#include -#include "common/picojson.h" -#include "common/logger.h" - -using namespace smartcard_service_api; -using namespace std; - -namespace extension { -namespace secureelement { - - -picojson::value SEReader::getName() { - LoggerD("Entered"); - - picojson::value result = picojson::value(picojson::object()); - picojson::object& obj = result.get(); - - if(m_reader) { - obj.insert(std::make_pair("name", picojson::value(m_reader->getName()))); - } - - return result; -} - -picojson::value SEReader::isPresent() { - LoggerD("Entered"); - - picojson::value result = picojson::value(picojson::object()); - picojson::object& obj = result.get(); - - if(m_reader) { - obj.insert(std::make_pair("isPresent", picojson::value(m_reader->isSecureElementPresent()))); - } - - return result; -} - -picojson::value SEReader::openSession() { - LoggerD("Entered"); - - picojson::value result = picojson::value(picojson::object()); - picojson::object& obj = result.get(); - - if(m_reader) { - Session *session_ptr = static_cast(m_reader->openSessionSync()); - - obj.insert(std::make_pair("handle", picojson::value((double) (long) session_ptr))); - obj.insert(std::make_pair("isClosed", picojson::value(session_ptr->isClosed()))); - } - - return result; -} - -void SEReader::closeSessions() { - LoggerD("Entered"); - - if(m_reader) { - m_reader->closeSessions(); - } -} - -}// secureelement -}// extension diff --git a/src/secureelement/secureelement_reader.h b/src/secureelement/secureelement_reader.h deleted file mode 100644 index fc2d777..0000000 --- a/src/secureelement/secureelement_reader.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef SECUREELEMENT_READER_H_ -#define SECUREELEMENT_READER_H_ - -#include "common/picojson.h" -#include - -namespace extension { -namespace secureelement { - -class SEReader { -public: - SEReader(smartcard_service_api::Reader* reader_ptr) : m_reader(reader_ptr) {}; - ~SEReader() {}; - - picojson::value getName(); - picojson::value isPresent(); - picojson::value openSession(); - void closeSessions(); -private: - smartcard_service_api::Reader* m_reader; -}; - -} // secureelement -} // extension - -#endif // SECUREELEMENT_READER_H_ diff --git a/src/secureelement/secureelement_seservice.cc b/src/secureelement/secureelement_seservice.cc deleted file mode 100644 index 15fe491..0000000 --- a/src/secureelement/secureelement_seservice.cc +++ /dev/null @@ -1,239 +0,0 @@ -/* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "secureelement/secureelement_seservice.h" - -#include "common/logger.h" -#include "common/platform_result.h" -#include "common/task-queue.h" -#include "common/tools.h" - - -#include "secureelement/secureelement_instance.h" - -using namespace smartcard_service_api; -using namespace common; -using namespace tools; - -namespace extension { -namespace secureelement { - -namespace { -const int SE_INSERTED = 1; -const int SE_REMOVED = 2; -} - -class SEServiceEventHandler : public SEServiceListener { - void serviceConnected(SEServiceHelper *service, void *context) { - LoggerD("Entered"); - if (context) { - (static_cast(context))->ServiceConnected(); - } else { - LoggerE("Context is null"); - } - } - - void eventHandler(SEServiceHelper *service, char *se_name, int event, void *context) { - LoggerD("Entered"); - if (context) { - (static_cast(context))->EventHandler(se_name, event); - } else { - LoggerE("Context is null"); - } - } - - void errorHandler(SEServiceHelper *service, int error, void *context) { - LoggerE("Error handler called, code: %d", error); - if (context) { - (static_cast(context))->ErrorHandler(error); - } else { - LoggerE("Context is null"); - } - } -}; - -static SEServiceEventHandler se_event_handler; - -SEService::SEService(SecureElementInstance& instance) - : is_initialized_(false), - is_listener_set_(false), - is_error_(false), - instance_(instance) { - LoggerD("Entered"); - - se_service_ = new smartcard_service_api::SEService((void *)this, &se_event_handler); -} - -SEService::~SEService() { - LoggerD("Entered"); - - if (is_initialized_) { - se_service_->shutdownSync(); - is_initialized_ = false; - } - - delete se_service_; - se_service_ = nullptr; -} - -void SEService::GetReaders(double callback_id) { - LoggerD("Entered"); - - auto get_readers = [this]( - const std::shared_ptr& response) -> void { - picojson::value result = picojson::value(picojson::array()); - picojson::array& result_array = result.get(); - - std::vector readers = se_service_->getReaders(); - for (std::size_t i = 0; i < readers.size(); i++) { - if (readers[i]->isSecureElementPresent()) { - result_array.push_back(picojson::value((double) (long) readers[i])); - } - } - - ReportSuccess(result, response->get()); - }; - - auto get_readers_response = [this, callback_id]( - const std::shared_ptr& response) -> void { - picojson::object& obj = response->get(); - obj.insert(std::make_pair("callbackId", picojson::value(callback_id))); - Instance::PostMessage(&instance_, response->serialize().c_str()); - }; - - if (is_error_) { - // there has been an error, report it asynchronously - std::shared_ptr response{new picojson::value{picojson::object{}}}; - LogAndReportError( - PlatformResult(ErrorCode::SERVICE_NOT_AVAILABLE_ERR, - "Unable to connect to service."), - &response->get(), - ("Failed: is_error_")); - TaskQueue::GetInstance().Async(get_readers_response, response); - return; - } - - if (!is_initialized_) { - // not yet ready, wait for the platform callback, send the response then - get_readers_callbacks_.push_back(callback_id); - return; - } - - auto data = std::shared_ptr(new picojson::value(picojson::object())); - - // everything's fine, get the readers, send the response - TaskQueue::GetInstance().Queue( - get_readers, - get_readers_response, - data); -} - -void SEService::RegisterSEListener() { - LoggerD("Entered"); - - is_listener_set_ = true; -} - -void SEService::UnregisterSEListener() { - LoggerD("Entered"); - - is_listener_set_ = false; -} - -void SEService::Shutdown() { - LoggerD("Entered"); - - if (is_initialized_) { - se_service_->shutdownSync(); - is_initialized_ = false; - } -} - -void SEService::ServiceConnected() { - LoggerD("Entered"); - - is_initialized_ = true; - - // send the response to pending GetReaders callbacks - for (const auto& callback_id : get_readers_callbacks_) { - GetReaders(callback_id); - } - get_readers_callbacks_.clear(); - - // notify the listeners - if (!is_listener_set_) { - LoggerE("SE listener is not set."); - return; - } - - std::vector readers = se_service_->getReaders(); - for (std::size_t i = 0; i < readers.size(); i++) { - if (readers[i]->isSecureElementPresent()) { - picojson::value result = picojson::value(picojson::object()); - picojson::object& obj = result.get(); - - obj.insert(std::make_pair("action", picojson::value("onSEReady"))); - obj.insert(std::make_pair("handle", picojson::value((double) (long) readers[i]))); - - Instance::PostMessage(&instance_, result.serialize().c_str()); - } - } -} - -void SEService::EventHandler(char *se_name, int event) { - LoggerD("Entered"); - - if (SE_INSERTED != event && SE_REMOVED != event) { - LoggerD("Incorrect event type"); - return; - } - - if (is_initialized_ && is_listener_set_) { - bool is_present = event == SE_INSERTED; - - std::vector readers = se_service_->getReaders(); - for (std::size_t i = 0; i < readers.size(); i++) { - if (!strcmp(se_name, readers[i]->getName()) && - readers[i]->isSecureElementPresent() != is_present) { - picojson::value result = picojson::value(picojson::object()); - picojson::object& obj = result.get(); - - if (is_present) { - obj.insert(std::make_pair("action", picojson::value("onSEReady"))); - } else { - obj.insert(std::make_pair("action", picojson::value("onSENotReady"))); - } - - obj.insert(std::make_pair("handle", picojson::value((double) (long) readers[i]))); - Instance::PostMessage(&instance_, result.serialize().c_str()); - return; - } - } - } -} - -void SEService::ErrorHandler(int error) { - LoggerD("Entered"); - is_error_ = true; - - for (const auto& callback_id : get_readers_callbacks_) { - GetReaders(callback_id); - } - get_readers_callbacks_.clear(); -} - -} // secureelement -} // extension diff --git a/src/secureelement/secureelement_seservice.h b/src/secureelement/secureelement_seservice.h deleted file mode 100644 index 5ac4067..0000000 --- a/src/secureelement/secureelement_seservice.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef SECUREELEMENT_SESERVICE_H_ -#define SECUREELEMENT_SESERVICE_H_ - -#include -#include - -namespace extension { -namespace secureelement { - -class SecureElementInstance; - -class SEService { - public: - explicit SEService(SecureElementInstance& instance); - ~SEService(); - - void GetReaders(double callback_id); - void RegisterSEListener(); - void UnregisterSEListener(); - void Shutdown(); - - void ServiceConnected(); - void EventHandler(char *se_name, int event); - void ErrorHandler(int error); - private: - SEService(const SEService&) = delete; - SEService& operator=(const SEService&) = delete; - - smartcard_service_api::SEService *se_service_; - bool is_initialized_; - bool is_listener_set_; - bool is_error_; - std::vector get_readers_callbacks_; - SecureElementInstance& instance_; -}; - -} // secureelement -} // extension - -#endif // SECUREELEMENT_SESERVICE_H_ diff --git a/src/secureelement/secureelement_session.cc b/src/secureelement/secureelement_session.cc deleted file mode 100644 index 35fee11..0000000 --- a/src/secureelement/secureelement_session.cc +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include "common/picojson.h" -#include "common/logger.h" -#include "secureelement_session.h" - -using namespace smartcard_service_api; - -namespace extension { -namespace secureelement { - -picojson::value SESession::openBasicChannel(const picojson::array& v_aid) { - LoggerD("Entered"); - - size_t v_aid_size = v_aid.size(); - unsigned char* aid = new unsigned char[v_aid_size]; - for (size_t i = 0; i < v_aid_size; i++) { - aid[i] = static_cast(v_aid[i].get()); - } - ByteArray aid_byte_array( aid, (unsigned int) v_aid.size()); - ClientChannel* channel_ptr = static_cast(m_session_ptr->openBasicChannelSync( aid_byte_array)); - delete [] aid; - - picojson::value result = picojson::value(picojson::object()); - picojson::object& obj = result.get(); - obj.insert(std::make_pair("handle", picojson::value((double) (long) channel_ptr))); - obj.insert(std::make_pair("isBasicChannel", picojson::value(channel_ptr->isBasicChannel()))); - - return result; -} - - -picojson::value SESession::openLogicalChannel(const picojson::array& v_aid) { - LoggerD("Entered"); - - size_t v_aid_size = v_aid.size(); - unsigned char* aid = new unsigned char[v_aid_size]; - for (size_t i = 0; i < v_aid_size; i++) { - aid[i] = static_cast(v_aid[i].get()); - } - ByteArray aid_byte_array( aid, (unsigned int) v_aid.size()); - ClientChannel* channel_ptr = static_cast(m_session_ptr->openLogicalChannelSync( aid_byte_array)); - delete [] aid; - - picojson::value result = picojson::value(picojson::object()); - picojson::object& obj = result.get(); - obj.insert(std::make_pair("handle", picojson::value((double) (long) channel_ptr))); - obj.insert(std::make_pair("isBasicChannel", picojson::value(channel_ptr->isBasicChannel()))); - - return result; -} - - -picojson::value SESession::isClosed() { - LoggerD("Entered"); - bool is_closed = m_session_ptr->isClosed(); - picojson::value result = picojson::value(picojson::object()); - picojson::object& obj = result.get(); - obj.insert(std::make_pair("isClosed", picojson::value(is_closed))); - return result; -} - - -void SESession::close() { - LoggerD("Entered"); - if ( m_session_ptr) { - m_session_ptr->closeSync(); - } -} - - -ByteArray SESession::getATR() { - LoggerD("Entered"); - ByteArray response; - if ( m_session_ptr) { - response = m_session_ptr->getATRSync(); - } - return response; -} - - -void SESession::closeChannels() { - LoggerD("Entered"); - if ( m_session_ptr) { - m_session_ptr->closeChannels(); - } -} - - -} // secureelement -} // extension diff --git a/src/secureelement/secureelement_session.h b/src/secureelement/secureelement_session.h deleted file mode 100644 index 891380c..0000000 --- a/src/secureelement/secureelement_session.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef SECUREELEMENT_SESSION_H_ -#define SECUREELEMENT_SESSION_H_ - -#include -#include "common/picojson.h" -#include "common/logger.h" - -namespace extension { -namespace secureelement { - -class SESession { -public: - SESession(smartcard_service_api::Session* session_ptr) - : m_session_ptr(session_ptr) { - } - - ~SESession() {}; - picojson::value openBasicChannel( const picojson::array& v_aid); - picojson::value openLogicalChannel( const picojson::array& v_aid); - picojson::value isClosed(); - void close(); - smartcard_service_api::ByteArray getATR(); - void closeChannels(); -private: - smartcard_service_api::Session* m_session_ptr; -}; - -} // secureelement -} // extension - -#endif // SECUREELEMENT_SESSION_H_ -- 2.7.4 From 73f1cd39f55b2422e4243fb76992fdca4c006632 Mon Sep 17 00:00:00 2001 From: Tomasz Marciniak Date: Fri, 19 Aug 2016 15:24:44 +0200 Subject: [PATCH 15/16] [SecureElement] Adjusted to new native api - part 2. [Verification] Code compiles. Change-Id: I3374d0b42a910a6357e811ca72d40051d5f58e9c Signed-off-by: Tomasz Marciniak --- src/secureelement/secureelement_instance.cc | 220 ++++++++++++++++++++++++++-- src/secureelement/secureelement_instance.h | 5 + 2 files changed, 210 insertions(+), 15 deletions(-) diff --git a/src/secureelement/secureelement_instance.cc b/src/secureelement/secureelement_instance.cc index 75063a7..899d855 100644 --- a/src/secureelement/secureelement_instance.cc +++ b/src/secureelement/secureelement_instance.cc @@ -32,6 +32,13 @@ namespace { const std::string kPrivilegeSecureElement = "http://tizen.org/privilege/secureelement"; const std::string kHandle = "handle"; +const std::string kIsBasicChannel = "isBasicChannel"; +const std::string kAid = "aid"; +const std::string kAction = "action"; +const std::string kListenerId = "listenerId"; +const std::string kListener = "SecureElementChangeListener"; +const std::string kReady = "onSEReady"; +const std::string kNotReady = "onSENotReady"; TizenResult ConvertErrorCode(int error) { switch (error) { @@ -57,10 +64,39 @@ TizenResult ConvertErrorCode(int error) { } } +void SecureElementEventCb(int reader, smartcard_reader_event_type_e event_type, void *user_data) { + ScopeLogger(); + + //TODO What action should be performed in case of SMARTCARD_READER_EVENT_TYPE_IO_ERROR event + if (SMARTCARD_READER_EVENT_TYPE_INSERTED != event_type && + SMARTCARD_READER_EVENT_TYPE_REMOVED != event_type) { + LoggerD("Incorrect event type"); + return; + } + + SecureElementInstance* instance = static_cast(user_data); + if (!instance) { + LoggerD("user data is null"); + return; + } + + picojson::value result{picojson::object{}}; + auto& obj = result.get(); + + std::string action = SMARTCARD_READER_EVENT_TYPE_INSERTED == event_type ? kReady : kNotReady; + + obj.insert(std::make_pair(kAction, picojson::value(action))); + obj.insert(std::make_pair(kHandle, picojson::value(static_cast(reader)))); + obj.insert(std::make_pair(kListenerId, picojson::value(kListener))); + + instance->Instance::PostMessage(instance, result.serialize().c_str()); +} + } //namespace SecureElementInstance::SecureElementInstance() : - is_initialized_(false) { + is_initialized_(false), + is_listener_set_(false) { ScopeLogger(); using std::placeholders::_1; @@ -101,12 +137,8 @@ SecureElementInstance::SecureElementInstance() : SecureElementInstance::~SecureElementInstance() { ScopeLogger(); - if (is_initialized_) { - if (SMARTCARD_ERROR_NONE != smartcard_deinitialize()) { - LoggerE("Failed to deinitilize smartcard service"); - } - is_initialized_ = false; - } + UnregisterListener(); + Deinitialize(); } // Service methods @@ -157,7 +189,31 @@ TizenResult SecureElementInstance::RegisterSEListener(picojson::object const& ar CHECK_PRIVILEGE(kPrivilegeSecureElement); - return common::NotSupportedError(); + int ret = smartcard_reader_set_event_cb(SecureElementEventCb, this); + if (SMARTCARD_ERROR_NONE != ret) { + LogAndReturnTizenError(ConvertErrorCode(ret), ("smartcard_reader_set_event_cb() failed")); + } + + is_listener_set_ = true; + + return TizenSuccess(); +} + +TizenResult SecureElementInstance::UnregisterListener() { + ScopeLogger(); + + CHECK_PRIVILEGE(kPrivilegeSecureElement); + + if (is_listener_set_) { + int ret = smartcard_reader_unset_event_cb(); + if (SMARTCARD_ERROR_NONE != ret) { + LogAndReturnTizenError(ConvertErrorCode(ret), ("smartcard_reader_unset_event_cb() failed")); + } + + is_listener_set_ = false; + } + + return TizenSuccess(); } TizenResult SecureElementInstance::UnregisterSEListener(picojson::object const& args) { @@ -165,12 +221,14 @@ TizenResult SecureElementInstance::UnregisterSEListener(picojson::object const& CHECK_PRIVILEGE(kPrivilegeSecureElement); - return common::NotSupportedError(); + return UnregisterListener(); } -TizenResult SecureElementInstance::Shutdown(picojson::object const& args) { +TizenResult SecureElementInstance::Deinitialize() { ScopeLogger(); + CHECK_PRIVILEGE(kPrivilegeSecureElement); + if (is_initialized_) { int ret = smartcard_deinitialize(); if (SMARTCARD_ERROR_NONE != ret) { @@ -183,6 +241,13 @@ TizenResult SecureElementInstance::Shutdown(picojson::object const& args) { return TizenSuccess(); } +TizenResult SecureElementInstance::Shutdown(picojson::object const& args) { + ScopeLogger(); + + UnregisterListener(); + return Deinitialize(); +} + // Reader methods TizenResult SecureElementInstance::GetName(picojson::object const& args) { ScopeLogger(); @@ -207,7 +272,16 @@ TizenResult SecureElementInstance::GetName(picojson::object const& args) { TizenResult SecureElementInstance::IsPresent(picojson::object const& args) { ScopeLogger(); - return common::NotSupportedError(); + int reader = static_cast(args.find(kHandle)->second.get()); + bool is_present = false; + + int ret = smartcard_reader_is_secure_element_present(reader, &is_present); + if (SMARTCARD_ERROR_NONE != ret) { + LogAndReturnTizenError(ConvertErrorCode(ret), + ("smartcard_reader_is_secure_element_present() failed")); + } + + return TizenSuccess(picojson::value(is_present)); } TizenResult SecureElementInstance::OpenSession(picojson::object const& args, const common::AsyncToken& token) { @@ -215,7 +289,30 @@ TizenResult SecureElementInstance::OpenSession(picojson::object const& args, con CHECK_PRIVILEGE(kPrivilegeSecureElement); - return common::NotSupportedError(); + int reader = static_cast(args.find(kHandle)->second.get()); + + auto open_session = [this, reader](const common::AsyncToken& token) -> void { + TizenResult result = TizenSuccess(); + int session = 0; + + int ret = smartcard_reader_open_session(reader, &session); + if (SMARTCARD_ERROR_NONE != ret) { + LoggerE("smartcard_reader_open_session() failed"); + result = ConvertErrorCode(ret); + } else { + picojson::value response{picojson::object{}}; + auto& obj = response.get(); + + obj.insert(std::make_pair(kHandle, picojson::value(static_cast(session)))); + result = TizenSuccess(response); + } + + this->Post(token, result); + }; + + std::thread(open_session, token).detach(); + + return TizenSuccess(); } TizenResult SecureElementInstance::CloseSessions(picojson::object const& args) { @@ -223,16 +320,74 @@ TizenResult SecureElementInstance::CloseSessions(picojson::object const& args) { CHECK_PRIVILEGE(kPrivilegeSecureElement); - return common::NotSupportedError(); + int reader = static_cast(args.find(kHandle)->second.get()); + + int ret = smartcard_reader_close_sessions(reader); + if (SMARTCARD_ERROR_NONE != ret) { + LogAndReturnTizenError(ConvertErrorCode(ret), ("smartcard_reader_close_sessions() failed")); + } + + return TizenSuccess(); } // Session functions + +TizenResult SecureElementInstance::IsBasicChannel(int channel, picojson::value& val) { + ScopeLogger(); + + bool is_basic = false; + int ret = smartcard_channel_is_basic_channel(channel, &is_basic); + if (SMARTCARD_ERROR_NONE != ret) { + LogAndReturnTizenError(ConvertErrorCode(ret), ("smartcard_channel_is_basic_channel() failed")); + } + + auto& obj = val.get(); + obj.insert(std::make_pair(kIsBasicChannel, picojson::value(is_basic))); + + return TizenSuccess(val); +} + TizenResult SecureElementInstance::OpenBasicChannel(picojson::object const& args, const common::AsyncToken& token) { ScopeLogger(); CHECK_PRIVILEGE(kPrivilegeSecureElement); - return common::NotSupportedError(); + int session = static_cast(args.find(kHandle)->second.get()); + const picojson::array v_aid = args.find(kAid)->second.get(); + + auto open_basic_channel = [this, session, v_aid](const common::AsyncToken& token) -> void { + TizenResult result = TizenSuccess(); + int channel = 0; + unsigned char P2 = 0; + + size_t v_aid_size = v_aid.size(); + unsigned char* aid = new unsigned char[v_aid_size]; + SCOPE_EXIT { + delete [] aid; + }; + + for (size_t i = 0; i < v_aid_size; i++) { + aid[i] = static_cast(v_aid[i].get()); + } + + int ret = smartcard_session_open_basic_channel(session, aid, v_aid_size, P2, &channel); + if (SMARTCARD_ERROR_NONE != ret) { + LoggerE("smartcard_session_open_basic_channel() failed"); + result = ConvertErrorCode(ret); + } else { + picojson::value response{picojson::object{}}; + auto& obj = response.get(); + + obj.insert(std::make_pair(kHandle, picojson::value(static_cast(channel)))); + result = IsBasicChannel(channel, response); + } + + this->Post(token, result); + }; + + std::thread(open_basic_channel, token).detach(); + + return TizenSuccess(); } TizenResult SecureElementInstance::OpenLogicalChannel(picojson::object const& args, const common::AsyncToken& token) { @@ -240,7 +395,42 @@ TizenResult SecureElementInstance::OpenLogicalChannel(picojson::object const& ar CHECK_PRIVILEGE(kPrivilegeSecureElement); - return common::NotSupportedError(); + int session = static_cast(args.find(kHandle)->second.get()); + const picojson::array v_aid = args.find(kAid)->second.get(); + + auto open_basic_logical = [this, session, v_aid](const common::AsyncToken& token) -> void { + TizenResult result = TizenSuccess(); + int channel = 0; + unsigned char P2 = 0; + + size_t v_aid_size = v_aid.size(); + unsigned char* aid = new unsigned char[v_aid_size]; + SCOPE_EXIT { + delete [] aid; + }; + + for (size_t i = 0; i < v_aid_size; i++) { + aid[i] = static_cast(v_aid[i].get()); + } + + int ret = smartcard_session_open_logical_channel(session, aid, v_aid_size, P2, &channel); + if (SMARTCARD_ERROR_NONE != ret) { + LoggerE("smartcard_session_open_logical_channel() failed"); + result = ConvertErrorCode(ret); + } else { + picojson::value response{picojson::object{}}; + auto& obj = response.get(); + + obj.insert(std::make_pair(kHandle, picojson::value(static_cast(channel)))); + result = IsBasicChannel(channel, response); + } + + this->Post(token, result); + }; + + std::thread(open_basic_logical, token).detach(); + + return TizenSuccess(); } TizenResult SecureElementInstance::GetATR(picojson::object const& args) { diff --git a/src/secureelement/secureelement_instance.h b/src/secureelement/secureelement_instance.h index 21a9bcc..d4e1295 100644 --- a/src/secureelement/secureelement_instance.h +++ b/src/secureelement/secureelement_instance.h @@ -41,6 +41,7 @@ private: common::TizenResult CloseSessions(picojson::object const& args); /* Session methods */ + common::TizenResult IsBasicChannel(int channel, picojson::value& val); common::TizenResult OpenBasicChannel(picojson::object const& args, const common::AsyncToken& token); common::TizenResult OpenLogicalChannel(picojson::object const& args, const common::AsyncToken& token); common::TizenResult GetATR(picojson::object const& args); @@ -53,7 +54,11 @@ private: common::TizenResult Transmit(picojson::object const& args, const common::AsyncToken& token); common::TizenResult GetSelectResponse(picojson::object const& args); + common::TizenResult Deinitialize(); + common::TizenResult UnregisterListener(); + bool is_initialized_; + bool is_listener_set_; }; } // namespace secureelement -- 2.7.4 From d344dd50069a245fe2adc3bc5d16762d9717df45 Mon Sep 17 00:00:00 2001 From: Tomasz Marciniak Date: Fri, 19 Aug 2016 15:34:16 +0200 Subject: [PATCH 16/16] [SecureElement] Adjusted to new native api - part 3. [Verification] Code compiles. TCT pass rate 100%. Change-Id: Ica0528757ff9a724f6a05d8e6214d49ae226539f Signed-off-by: Tomasz Marciniak --- src/secureelement/secureelement_api.js | 2 +- src/secureelement/secureelement_instance.cc | 128 ++++++++++++++++++++++++++-- 2 files changed, 122 insertions(+), 8 deletions(-) diff --git a/src/secureelement/secureelement_api.js b/src/secureelement/secureelement_api.js index 9a55298..4ff5bd2 100644 --- a/src/secureelement/secureelement_api.js +++ b/src/secureelement/secureelement_api.js @@ -306,7 +306,7 @@ function Session(session_handle) { console.log('SESession_isClosed error: ' + native_.getErrorObject(result)); return true; } else { - return native_.getResultObject(result).isClosed; + return native_.getResultObject(result); } } }, diff --git a/src/secureelement/secureelement_instance.cc b/src/secureelement/secureelement_instance.cc index 899d855..ea01bee 100644 --- a/src/secureelement/secureelement_instance.cc +++ b/src/secureelement/secureelement_instance.cc @@ -35,6 +35,7 @@ const std::string kHandle = "handle"; const std::string kIsBasicChannel = "isBasicChannel"; const std::string kAid = "aid"; const std::string kAction = "action"; +const std::string kCommand = "command"; const std::string kListenerId = "listenerId"; const std::string kListener = "SecureElementChangeListener"; const std::string kReady = "onSEReady"; @@ -438,13 +439,41 @@ TizenResult SecureElementInstance::GetATR(picojson::object const& args) { CHECK_PRIVILEGE(kPrivilegeSecureElement); - return common::NotSupportedError(); + int session = static_cast(args.find(kHandle)->second.get()); + int length = 0; + unsigned char* atr = nullptr; + + int ret = smartcard_session_get_atr(session, &atr, &length); + SCOPE_EXIT { + free(atr); + }; + + if (SMARTCARD_ERROR_NONE != ret) { + LogAndReturnTizenError(ConvertErrorCode(ret), ("smartcard_session_get_atr() failed")); + } + + picojson::value response{picojson::array{}}; + auto& array = response.get(); + + for (int i = 0; i < length; i++) { + array.push_back(picojson::value(static_cast(atr[i]))); + } + + return TizenSuccess(response); } TizenResult SecureElementInstance::IsSessionClosed(picojson::object const& args) { ScopeLogger(); - return common::NotSupportedError(); + int session = static_cast(args.find(kHandle)->second.get()); + bool is_closed = false; + + int ret = smartcard_session_is_closed(session, &is_closed); + if (SMARTCARD_ERROR_NONE != ret) { + LogAndReturnTizenError(ConvertErrorCode(ret), ("smartcard_session_is_closed() failed")); + } + + return TizenSuccess(picojson::value(is_closed)); } TizenResult SecureElementInstance::CloseSession(picojson::object const& args) { @@ -452,7 +481,14 @@ TizenResult SecureElementInstance::CloseSession(picojson::object const& args) { CHECK_PRIVILEGE(kPrivilegeSecureElement); - return common::NotSupportedError(); + int session = static_cast(args.find(kHandle)->second.get()); + + int ret = smartcard_session_close(session); + if (SMARTCARD_ERROR_NONE != ret) { + LogAndReturnTizenError(ConvertErrorCode(ret), ("smartcard_session_close() failed")); + } + + return TizenSuccess(); } TizenResult SecureElementInstance::CloseChannels(picojson::object const& args) { @@ -460,7 +496,14 @@ TizenResult SecureElementInstance::CloseChannels(picojson::object const& args) { CHECK_PRIVILEGE(kPrivilegeSecureElement); - return common::NotSupportedError(); + int session = static_cast(args.find(kHandle)->second.get()); + + int ret = smartcard_session_close_channels(session); + if (SMARTCARD_ERROR_NONE != ret) { + LogAndReturnTizenError(ConvertErrorCode(ret), ("smartcard_session_close_channels() failed")); + } + + return TizenSuccess(); } // Channel methods @@ -469,7 +512,14 @@ TizenResult SecureElementInstance::CloseChannel(picojson::object const& args) { CHECK_PRIVILEGE(kPrivilegeSecureElement); - return common::NotSupportedError(); + int channel = static_cast(args.find(kHandle)->second.get()); + + int ret = smartcard_channel_close(channel); + if (SMARTCARD_ERROR_NONE != ret) { + LogAndReturnTizenError(ConvertErrorCode(ret), ("smartcard_channel_close() failed")); + } + + return TizenSuccess(); } TizenResult SecureElementInstance::Transmit(picojson::object const& args, const common::AsyncToken& token) { @@ -477,7 +527,50 @@ TizenResult SecureElementInstance::Transmit(picojson::object const& args, const CHECK_PRIVILEGE(kPrivilegeSecureElement); - return common::NotSupportedError(); + int channel = static_cast(args.find(kHandle)->second.get()); + const auto& v_cmd = args.find(kCommand)->second.get(); + + auto transmit = [this, channel, v_cmd](const common::AsyncToken& token) -> void { + TizenResult result = TizenSuccess(); + + size_t v_cmd_size = v_cmd.size(); + unsigned char* cmd = new unsigned char[v_cmd_size]; + SCOPE_EXIT { + delete [] cmd; + }; + + for (size_t i = 0; i < v_cmd_size; i++) { + cmd[i] = static_cast(v_cmd[i].get()); + } + + int length = 0; + unsigned char* response = nullptr; + + int ret = smartcard_channel_transmit(channel, cmd, v_cmd_size, &response, &length); + SCOPE_EXIT { + free(response); + }; + + if (SMARTCARD_ERROR_NONE != ret) { + LoggerE("smartcard_channel_transmit() failed"); + result = ConvertErrorCode(ret); + } else { + picojson::value response_v{picojson::array{}}; + auto& array = response_v.get(); + + for (int i = 0; i < length; i++) { + array.push_back(picojson::value(static_cast(response[i]))); + } + + result = TizenSuccess(response_v); + } + + this->Post(token, result); + }; + + std::thread(transmit, token).detach(); + + return TizenSuccess(); } TizenResult SecureElementInstance::GetSelectResponse(picojson::object const& args) { @@ -485,7 +578,28 @@ TizenResult SecureElementInstance::GetSelectResponse(picojson::object const& arg CHECK_PRIVILEGE(kPrivilegeSecureElement); - return common::NotSupportedError(); + int channel = static_cast(args.find(kHandle)->second.get()); + int length = 0; + unsigned char* select_response = nullptr; + + int ret = smartcard_channel_get_select_response(channel, &select_response, &length); + SCOPE_EXIT { + free(select_response); + }; + + if (SMARTCARD_ERROR_NONE != ret) { + LogAndReturnTizenError(ConvertErrorCode(ret), + ("smartcard_channel_get_select_response() failed")); + } + + picojson::value response{picojson::array{}}; + auto& array = response.get(); + + for (int i = 0; i < length; i++) { + array.push_back(picojson::value(static_cast(select_response[i]))); + } + + return TizenSuccess(response); } } // namespace secureelement -- 2.7.4