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