From e9bbafd3cf774b6669b533854d6ce12d4b5a0fb9 Mon Sep 17 00:00:00 2001 From: Hyunjin Park Date: Thu, 29 Dec 2016 11:24:57 +0900 Subject: [PATCH 01/16] [version] 1.66 Change-Id: I5f13e3af7f68e3fbf93d3b9fb7a855ee6d5c5425 --- 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 b0dfd6d..c823c6a 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.65 +Version: 1.66 Release: 0 License: Apache-2.0 and BSD-3-Clause and MIT Group: Development/Libraries -- 2.7.4 From f60b0dd58d49a3cb85df7ca63aeda384abf0bcd2 Mon Sep 17 00:00:00 2001 From: Jeongkyun Pu Date: Tue, 3 Jan 2017 02:54:02 -0800 Subject: [PATCH 02/16] Revert "[HAM] - fixing pedometer listeners" This reverts commit dbe8157f28394a8bba37a3ecab194c67e360209a. Change-Id: I842ab00deef4102f6af98bc48875c748d2d8be9f --- .../humanactivitymonitor_api.js | 24 +++++++++------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/humanactivitymonitor/humanactivitymonitor_api.js b/src/humanactivitymonitor/humanactivitymonitor_api.js index 5c36b72..2d2d65e 100755 --- a/src/humanactivitymonitor/humanactivitymonitor_api.js +++ b/src/humanactivitymonitor/humanactivitymonitor_api.js @@ -354,17 +354,12 @@ HumanActivityMonitorManager.prototype.stop = function(type) { {name: 'type', type: types_.ENUM, values: Object.keys(HumanActivityType)} ]); + stopListener('HumanActivityMonitor_' + args.type, + 'HumanActivityMonitorManager_stop', + { type: args.type }); + if (HumanActivityType.PEDOMETER === args.type) { - if (pedometerListener && !accumulativePedometerListener) { - stopListener('HumanActivityMonitor_PEDOMETER', - 'HumanActivityMonitorManager_stop', - { type: HumanActivityType.PEDOMETER }); - } pedometerListener = null; - } else { - stopListener('HumanActivityMonitor_' + args.type, - 'HumanActivityMonitorManager_stop', - { type: args.type }); } if (HumanActivityType.GPS === args.type) { @@ -387,12 +382,13 @@ HumanActivityMonitorManager.prototype.setAccumulativePedometerListener = functio }; HumanActivityMonitorManager.prototype.unsetAccumulativePedometerListener = function() { - if (accumulativePedometerListener && !pedometerListener) { - stopListener('HumanActivityMonitor_PEDOMETER', - 'HumanActivityMonitorManager_stop', - { type: HumanActivityType.PEDOMETER }); - } + var oldPedometerListener = pedometerListener; + + // calling stop() will overwrite pedometerListener, needs to be restored afterwards + this.stop(HumanActivityType.PEDOMETER); + accumulativePedometerListener = null; + pedometerListener = oldPedometerListener; }; -- 2.7.4 From e42ef24a1b48530bc5feca3e4b72ec4cdc5b0837 Mon Sep 17 00:00:00 2001 From: Hyunjin Park Date: Tue, 3 Jan 2017 20:14:34 +0900 Subject: [PATCH 03/16] [version] 1.67 Change-Id: I110bfe96bf7c564c2c580e59badab3b46b6da03b --- 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 c823c6a..73399e1 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.66 +Version: 1.67 Release: 0 License: Apache-2.0 and BSD-3-Clause and MIT Group: Development/Libraries -- 2.7.4 From 96a2d9ba654a5cf606bd299fe42ed8071c08f9a9 Mon Sep 17 00:00:00 2001 From: Piotr Kosko Date: Tue, 3 Jan 2017 12:54:30 +0100 Subject: [PATCH 04/16] [HAM] - fixing pedometer listeners with correct privileges check This reverts commit f60b0dd58d49a3cb85df7ca63aeda384abf0bcd2 and adds some special code to correctly handle privileges check. [Verification] TCT for humanactivitymonitor passrate didn't change. All TCT privilege HAM-related testcases pass. Change-Id: Ica915e1f198765ccd43d41df316804bfbcb201d2 --- .../humanactivitymonitor_api.js | 36 ++++++++++++---------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/humanactivitymonitor/humanactivitymonitor_api.js b/src/humanactivitymonitor/humanactivitymonitor_api.js index d1393cd..736b9a4 100755 --- a/src/humanactivitymonitor/humanactivitymonitor_api.js +++ b/src/humanactivitymonitor/humanactivitymonitor_api.js @@ -237,18 +237,20 @@ function checkPrivilegesForMethod(method, type) { } } -function stopListener(listenerId, method, data) { +function stopListener(listenerId, method, data, doRemoval) { if (!native_.isListenerSet(listenerId)) { checkPrivilegesForMethod(method, data.type); return; } - var result = native_.callSync(method, data); - if (native_.isFailure(result)) { - throw native_.getErrorObject(result); - } + if (doRemoval) { + var result = native_.callSync(method, data); + if (native_.isFailure(result)) { + throw native_.getErrorObject(result); + } - native_.removeListener(listenerId); + native_.removeListener(listenerId); + } } // Pedometer listener and accumulative pedometer listener are handled by a single @@ -351,12 +353,16 @@ HumanActivityMonitorManager.prototype.stop = function(type) { {name: 'type', type: types_.ENUM, values: Object.keys(HumanActivityType)} ]); - stopListener('HumanActivityMonitor_' + args.type, - 'HumanActivityMonitorManager_stop', - { type: args.type }); - if (HumanActivityType.PEDOMETER === args.type) { + stopListener('HumanActivityMonitor_PEDOMETER', + 'HumanActivityMonitorManager_stop', + { type: HumanActivityType.PEDOMETER }, + pedometerListener && !accumulativePedometerListener); pedometerListener = null; + } else { + stopListener('HumanActivityMonitor_' + args.type, + 'HumanActivityMonitorManager_stop', + { type: args.type }, true); } if (HumanActivityType.GPS === args.type) { @@ -379,13 +385,11 @@ HumanActivityMonitorManager.prototype.setAccumulativePedometerListener = functio }; HumanActivityMonitorManager.prototype.unsetAccumulativePedometerListener = function() { - var oldPedometerListener = pedometerListener; - - // calling stop() will overwrite pedometerListener, needs to be restored afterwards - this.stop(HumanActivityType.PEDOMETER); - + stopListener('HumanActivityMonitor_PEDOMETER', + 'HumanActivityMonitorManager_stop', + { type: HumanActivityType.PEDOMETER }, + accumulativePedometerListener && !pedometerListener); accumulativePedometerListener = null; - pedometerListener = oldPedometerListener; }; -- 2.7.4 From ead4401549d41ff0818607a0b7b59c0ace1fa595 Mon Sep 17 00:00:00 2001 From: Tomasz Marciniak Date: Thu, 5 Jan 2017 08:59:08 +0100 Subject: [PATCH 05/16] [Convergence] Added checking if service is started. [Verification] Code compiles. Function successfully tested in chrome console. Change-Id: Ic1ee1b6cd182d4aa09d924d96435f07d71c3fe11 Signed-off-by: Tomasz Marciniak --- .../convergence_remote_app_control_service.cc | 34 +++++++++++++++++----- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/convergence/convergence_remote_app_control_service.cc b/src/convergence/convergence_remote_app_control_service.cc index 5d4db99..cdd1716 100644 --- a/src/convergence/convergence_remote_app_control_service.cc +++ b/src/convergence/convergence_remote_app_control_service.cc @@ -34,6 +34,7 @@ static const char* kAppControl = "app_control"; static const char* kReply = "reply"; static const char* kCbResult = "callback_result"; static const char* kRemoteFunc = "remote_function"; +static const char* kJSCurrentListenerId = "curListenerId"; static const std::string kLaunch = "launch"; static const std::string kLaunchAppControl = "launchAppControl"; @@ -160,15 +161,34 @@ TizenResult ConvergenceRemoteAppControlService::Start(const bool reply, const in return LogAndCreateTizenError(AbortError, "Service with specified type does not exist"); } - if (reply) { - UpdateListener(cur_listener_id); - } + bool is_started = false; + //regarding to native team returned value should not be checked + //as CONV_ERROR_NONE means service is started, otherwise not started + //check only passed bool variable + conv_service_is_started(service, nullptr, &is_started); - const int error = conv_service_start(service, nullptr, nullptr); - if (CONV_ERROR_NONE != error) { - return LogAndCreateTizenError(AbortError, "conv_service_start error"); + if (is_started) { + //just call success callback + picojson::object param; + param[kServiceResultType] = picojson::value("onStart"); + param[kServiceListenerStatus] = picojson::value(kServiceListenerStatusOk); + param[kJSCurrentListenerId] = picojson::value(static_cast(cur_listener_id)); + + convergence_plugin_->ReplyAsync(kRemoteAppControlListenerCallback, + cur_listener_id, + true, + param); } else { - LoggerI("RemoteAppControlService started"); + if (reply) { + UpdateListener(cur_listener_id); + } + + const int error = conv_service_start(service, nullptr, nullptr); + if (CONV_ERROR_NONE != error) { + return LogAndCreateTizenError(AbortError, "conv_service_start error"); + } else { + LoggerI("RemoteAppControlService started"); + } } return TizenSuccess(); -- 2.7.4 From 9d083aa4f971ff160034262e5d3b0de77527fa92 Mon Sep 17 00:00:00 2001 From: Andrzej Popowski Date: Mon, 9 Jan 2017 08:31:40 +0100 Subject: [PATCH 06/16] [Convergence] - adding conv_service_is_started to AppCommunicationService Change-Id: I7fbf4412805b9e7ecaf0326c84016c8441e3d2c4 Signed-off-by: Andrzej Popowski --- .../convergence_app_communication_service.cc | 61 +++++++++++++++++----- 1 file changed, 49 insertions(+), 12 deletions(-) diff --git a/src/convergence/convergence_app_communication_service.cc b/src/convergence/convergence_app_communication_service.cc index 2b71890..5d40451 100644 --- a/src/convergence/convergence_app_communication_service.cc +++ b/src/convergence/convergence_app_communication_service.cc @@ -73,14 +73,32 @@ common::TizenResult ConvergenceAppCommunicationService::Start( return LogAndCreateTizenError(AbortError, "Service with specified type does not exist"); } - UpdateListener(cur_listener_id, REMOTE_SERVICE_START); + bool is_started = false; + //regarding to native team returned value should not be checked + //as CONV_ERROR_NONE means service is started, otherwise not started + //check only passed bool variable + conv_service_is_started(service_handle, channel->GetHandle(), &is_started); - const int error = conv_service_start(service_handle, channel->GetHandle(), nullptr); - if (CONV_ERROR_NONE != error) { - return LogAndCreateTizenError(AbortError, "conv_service_start [fail]"); - } + if (is_started) { + picojson::object param; + param[kServiceListenerStatus] = picojson::value(kServiceListenerStatusOk); + param[kChannel] = ConvergenceChannel::ToJson(channel->GetHandle()); + param[kServiceResultType] = picojson::value("onStart"); - opened_channels.push_back(ch_ptr.release()); + // totu + convergence_plugin_->ReplyAsync(kAppCommunicationListenerCallback, + cur_listener_id, true, param); + } else { + UpdateListener(cur_listener_id, REMOTE_SERVICE_START); + + const int error = conv_service_start(service_handle, channel->GetHandle(), nullptr); + if (CONV_ERROR_NONE != error) { + LoggerD("conv_service_start [fail] %d %s", error, get_error_message(error)); + return LogAndCreateTizenError(AbortError, "conv_service_start [fail]"); + } + + opened_channels.push_back(ch_ptr.release()); + } return TizenSuccess(); } @@ -371,14 +389,33 @@ common::TizenResult ConvergenceAppCommunicationServerService::Start( return LogAndCreateTizenError(AbortError, "Service with specified type does not exist"); } - UpdateListener(cur_listener_id, LOCAL_SERVICE_START); - const int error = conv_service_start(service_handle, channel->GetHandle(), nullptr); - if (CONV_ERROR_NONE != error) { - return LogAndCreateTizenError(AbortError, "conv_service_start [fail]"); - } + bool is_started = false; + //regarding to native team returned value should not be checked + //as CONV_ERROR_NONE means service is started, otherwise not started + //check only passed bool variable + conv_service_is_started(service_handle, channel->GetHandle(), &is_started); + + if (is_started) { + picojson::object param; + param[kServiceListenerStatus] = picojson::value(kServiceListenerStatusOk); + param[kChannel] = ConvergenceChannel::ToJson(channel->GetHandle()); + param[kServiceResultType] = picojson::value("onStart"); - opened_channels.push_back(ch_ptr.release()); + // totu + convergence_plugin_->ReplyAsync(kAppCommunicationListenerCallback, + cur_listener_id, true, param); + } else { + UpdateListener(cur_listener_id, LOCAL_SERVICE_START); + + const int error = conv_service_start(service_handle, channel->GetHandle(), nullptr); + if (CONV_ERROR_NONE != error) { + LoggerD("conv_service_start [fail] %d %s", error, get_error_message(error)); + return LogAndCreateTizenError(AbortError, "conv_service_start [fail]"); + } + + opened_channels.push_back(ch_ptr.release()); + } return TizenSuccess(); } -- 2.7.4 From 19218b5ce33796f556f73a442b7dfc2dfdc8a59e Mon Sep 17 00:00:00 2001 From: Hyunjin Park Date: Tue, 10 Jan 2017 11:21:28 +0900 Subject: [PATCH 07/16] [version] 1.68 Change-Id: I03441f3e65af3ed06c87d65162c1f8670b640242 --- 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 73399e1..d00b6d4 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.67 +Version: 1.68 Release: 0 License: Apache-2.0 and BSD-3-Clause and MIT Group: Development/Libraries -- 2.7.4 From b25f64b7fda7d4261e68ced971ffc87cf7684864 Mon Sep 17 00:00:00 2001 From: Lukasz Bardeli Date: Tue, 10 Jan 2017 09:22:57 +0100 Subject: [PATCH 08/16] [Convergance] Fix for swapDevice Change-Id: I42ddf08ec4d8343124db8c1d994b6ede499f6a8b Signed-off-by: Lukasz Bardeli --- src/convergence/convergence_device.cc | 11 +++++++++-- src/convergence/convergence_device.h | 3 ++- src/convergence/convergence_manager.cc | 3 +++ src/convergence/convergence_service.cc | 2 +- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/convergence/convergence_device.cc b/src/convergence/convergence_device.cc index 34d3663..f617db7 100644 --- a/src/convergence/convergence_device.cc +++ b/src/convergence/convergence_device.cc @@ -154,7 +154,7 @@ void ConvergenceDevice::ForEachServiceCb(conv_service_h service_handle, s->Refresh(); } -void ConvergenceDevice::Refresh() { +void ConvergenceDevice::Refresh(conv_device_h device_handle) { ScopeLogger(); // Getting device properties from handle id_ = ExtractDevicePropery(CONV_DEVICE_ID); @@ -165,7 +165,14 @@ void ConvergenceDevice::Refresh() { id_.c_str(), name_.c_str(), type_.c_str()); // Extracting services - const int error = conv_device_foreach_service(device_handle_, ForEachServiceCb, this); + conv_device_h handle = nullptr; + if (device_handle) { + handle = device_handle; + } else { + handle = device_handle_; + } + + const int error = conv_device_foreach_service(handle, ForEachServiceCb, this); if (CONV_ERROR_NONE != error) { trace_conv_error(error, __LINE__, "conv_device_foreach_service"); } diff --git a/src/convergence/convergence_device.h b/src/convergence/convergence_device.h index e16e410..6496244 100644 --- a/src/convergence/convergence_device.h +++ b/src/convergence/convergence_device.h @@ -44,11 +44,12 @@ class ConvergenceDevice { public: - void Refresh(); + void Refresh(conv_device_h device_handle = nullptr); ConvergenceService *GetService(const int service_type) const; //picojson::object ToJson() const; picojson::value ToJson() const; //std::string get_device() const {return device_handle_; } + int ServiceCount() {return services_.size();}; public: ConvergenceService *RegisterLocalService(const int service_type); diff --git a/src/convergence/convergence_manager.cc b/src/convergence/convergence_manager.cc index c7f6784..11482af 100644 --- a/src/convergence/convergence_manager.cc +++ b/src/convergence/convergence_manager.cc @@ -115,6 +115,9 @@ ConvergenceDevice *ConvergenceManager::SwapDevice(const char *device_id, d->SetId(device_id); registered_devices_[device_id] = d; LoggerI("...registering the device [%s, %x]", device_id, device_handle); + // Assume that there are only two services + } else if(registered_devices_[device_id]->ServiceCount() < 2) { + registered_devices_[device_id]->Refresh(device_handle); } return registered_devices_[device_id]; } diff --git a/src/convergence/convergence_service.cc b/src/convergence/convergence_service.cc index 61d9d3b..4f9167e 100644 --- a/src/convergence/convergence_service.cc +++ b/src/convergence/convergence_service.cc @@ -150,7 +150,7 @@ void ConvergenceService::Refresh() { ScopeLogger(); conv_service_h service_handle = FindServiceHandle(); if (!service_handle) { - LoggerE("AAAAAA!!! Service not found"); + LoggerE("Service not found"); return; } -- 2.7.4 From 74d47d4292ca863ed21bfe93c3cbcaae3ecf2696 Mon Sep 17 00:00:00 2001 From: Hyunjin Park Date: Wed, 11 Jan 2017 11:06:58 +0900 Subject: [PATCH 09/16] [version] 1.69 Change-Id: Iac591a1c64772c65a0623193f10752264afc9dc5 --- 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 d00b6d4..a8a6691 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.68 +Version: 1.69 Release: 0 License: Apache-2.0 and BSD-3-Clause and MIT Group: Development/Libraries -- 2.7.4 From 78fc5627f05a957c03a561fbd22c5ea1bb4a8b6c Mon Sep 17 00:00:00 2001 From: Lukasz Bardeli Date: Wed, 11 Jan 2017 14:43:19 +0100 Subject: [PATCH 10/16] [Convergance] fix for swapDevice2 Change-Id: I68f61357bfcdc9bcc174d885f5e82fc457757f3c Signed-off-by: Lukasz Bardeli --- src/convergence/convergence_device.cc | 11 ++--------- src/convergence/convergence_device.h | 2 +- src/convergence/convergence_manager.cc | 5 ++++- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/convergence/convergence_device.cc b/src/convergence/convergence_device.cc index f617db7..34d3663 100644 --- a/src/convergence/convergence_device.cc +++ b/src/convergence/convergence_device.cc @@ -154,7 +154,7 @@ void ConvergenceDevice::ForEachServiceCb(conv_service_h service_handle, s->Refresh(); } -void ConvergenceDevice::Refresh(conv_device_h device_handle) { +void ConvergenceDevice::Refresh() { ScopeLogger(); // Getting device properties from handle id_ = ExtractDevicePropery(CONV_DEVICE_ID); @@ -165,14 +165,7 @@ void ConvergenceDevice::Refresh(conv_device_h device_handle) { id_.c_str(), name_.c_str(), type_.c_str()); // Extracting services - conv_device_h handle = nullptr; - if (device_handle) { - handle = device_handle; - } else { - handle = device_handle_; - } - - const int error = conv_device_foreach_service(handle, ForEachServiceCb, this); + const int error = conv_device_foreach_service(device_handle_, ForEachServiceCb, this); if (CONV_ERROR_NONE != error) { trace_conv_error(error, __LINE__, "conv_device_foreach_service"); } diff --git a/src/convergence/convergence_device.h b/src/convergence/convergence_device.h index 6496244..505ae38 100644 --- a/src/convergence/convergence_device.h +++ b/src/convergence/convergence_device.h @@ -44,7 +44,7 @@ class ConvergenceDevice { public: - void Refresh(conv_device_h device_handle = nullptr); + void Refresh(); ConvergenceService *GetService(const int service_type) const; //picojson::object ToJson() const; picojson::value ToJson() const; diff --git a/src/convergence/convergence_manager.cc b/src/convergence/convergence_manager.cc index 11482af..3b14d6c 100644 --- a/src/convergence/convergence_manager.cc +++ b/src/convergence/convergence_manager.cc @@ -117,7 +117,10 @@ ConvergenceDevice *ConvergenceManager::SwapDevice(const char *device_id, LoggerI("...registering the device [%s, %x]", device_id, device_handle); // Assume that there are only two services } else if(registered_devices_[device_id]->ServiceCount() < 2) { - registered_devices_[device_id]->Refresh(device_handle); + registered_devices_.erase(device_id); + ConvergenceDevice *d = new ConvergenceDevice(device_handle, convergence_plugin_); + d->SetId(device_id); + registered_devices_[device_id] = d; } return registered_devices_[device_id]; } -- 2.7.4 From 6155969620dbec240d2fcea7d38c3f218e46232e Mon Sep 17 00:00:00 2001 From: Jakub Skowron Date: Fri, 13 Jan 2017 13:05:55 +0100 Subject: [PATCH 11/16] [Filesystem] Fix UTF-8 decoding in readAsText Correctly decode multibyte characters at buffer boundary. Change-Id: Ie6ccb680e8fb78d1bfffaa1b06cd600d78c3b675 Signed-off-by: Jakub Skowron --- src/filesystem/js/base64.js | 19 +++++++------------ src/filesystem/js/file.js | 10 ++++++---- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/filesystem/js/base64.js b/src/filesystem/js/base64.js index 2324831..20a29b4 100755 --- a/src/filesystem/js/base64.js +++ b/src/filesystem/js/base64.js @@ -54,12 +54,7 @@ var Base64 = { return output; }, decodeString: function(data) { - data = this.decode(data); - var output = ''; - for (var i = 0; i < data.length; ++i) { - output += String.fromCharCode(data[i]); - } - return this._utf8_decode(output); + return this._utf8_decode(this.decode(data)); }, decode: function(data) { var output = []; @@ -118,26 +113,26 @@ var Base64 = { return utftext; }, - _utf8_decode: function(utftext) { + _utf8_decode: function(utfarray) { var str = ''; var i = 0, c = 0, c1 = 0, c2 = 0; - while (i < utftext.length) { + while (i < utfarray.length) { - c = utftext.charCodeAt(i); + c = utfarray[i]; if (c < 128) { str += String.fromCharCode(c); i++; } else if ((c > 191) && (c < 224)) { - c1 = utftext.charCodeAt(i + 1); + c1 = utfarray[i + 1]; str += String.fromCharCode(((c & 31) << 6) | (c1 & 63)); i += 2; } else { - c1 = utftext.charCodeAt(i + 1); - c2 = utftext.charCodeAt(i + 2); + c1 = utfarray[i + 1]; + c2 = utfarray[i + 2]; str += String.fromCharCode(((c & 15) << 12) | ((c1 & 63) << 6) | (c2 & 63)); i += 3; } diff --git a/src/filesystem/js/file.js b/src/filesystem/js/file.js index 0c4a721..4b07da6 100644 --- a/src/filesystem/js/file.js +++ b/src/filesystem/js/file.js @@ -316,12 +316,12 @@ function readAsText() { var data = { location: commonFS_.toRealPath(this.fullPath), offset: 0, - length: 1024, + length: 65536, encoding: args.encoding }; function readFile() { - var result, encoded, str = ''; + var result, encoded, buffers = []; do { result = native_.callSync('File_readSync', data); @@ -333,13 +333,15 @@ function readAsText() { } encoded = native_.getResultObject(result); if (encoded.length) { - str += Base64.decodeString(encoded); + buffers.push( Base64.decode(encoded) ); data.offset += data.length; } } while (encoded.length); + var buffer = Array.prototype.concat.apply([], buffers); + setTimeout(function() { - native_.callIfPossible(args.onsuccess, str); + native_.callIfPossible(args.onsuccess, Base64._utf8_decode(buffer) ); }, 0); } -- 2.7.4 From 9778e1c74d499e5a46aa4ff84fa2599d593207db Mon Sep 17 00:00:00 2001 From: Szymon Jastrzebski Date: Fri, 13 Jan 2017 15:36:03 +0100 Subject: [PATCH 12/16] [Filesystem] Added decoding for UTF-8 4 bytes characters Change-Id: I78bfa0e205d62b7e7dc5a6b95cad8cf98a941ae1 Signed-off-by: Szymon Jastrzebski --- src/filesystem/js/base64.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/filesystem/js/base64.js b/src/filesystem/js/base64.js index 20a29b4..034ce33 100755 --- a/src/filesystem/js/base64.js +++ b/src/filesystem/js/base64.js @@ -115,7 +115,7 @@ var Base64 = { }, _utf8_decode: function(utfarray) { var str = ''; - var i = 0, c = 0, c1 = 0, c2 = 0; + var i = 0, c = 0, c1 = 0, c2 = 0, c3 = 0; while (i < utfarray.length) { @@ -130,13 +130,19 @@ var Base64 = { str += String.fromCharCode(((c & 31) << 6) | (c1 & 63)); i += 2; } - else { + else if((c > 223) && (c < 240)) { c1 = utfarray[i + 1]; c2 = utfarray[i + 2]; str += String.fromCharCode(((c & 15) << 12) | ((c1 & 63) << 6) | (c2 & 63)); i += 3; } - + else {//support 4 bytes characters e.g. Emojis + c1 = utfarray[i + 1]; + c2 = utfarray[i + 2]; + c3 = utfarray[i + 3]; + str += String.fromCodePoint(((c & 7) << 18) | ((c1 & 63) << 12) | ((c2 & 63) << 6) | (c3 & 63)); + i += 4; + } } return str; -- 2.7.4 From ab7b081f9095d09bb72e97a1c4aafcdeb2640624 Mon Sep 17 00:00:00 2001 From: Jakub Skowron Date: Wed, 18 Jan 2017 09:10:23 +0100 Subject: [PATCH 13/16] [Filesystem] Fix SMP support in UTF-8 encoding on write Support supplementary planes, including Emoji. [Verification] readASText() is working correctly for P170111-07658 issue. Change-Id: I6f75f397e167ea9c89b4298edcaa19352586c90d Signed-off-by: Jakub Skowron --- src/filesystem/js/base64.js | 42 +++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/src/filesystem/js/base64.js b/src/filesystem/js/base64.js index 034ce33..d2868f3 100755 --- a/src/filesystem/js/base64.js +++ b/src/filesystem/js/base64.js @@ -16,13 +16,8 @@ var Base64 = { _b64: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=', - encodeString: function(data) { - data = this._utf8_encode(data); - var input = []; - for (var i = 0; i < data.length; ++i) { - input.push(data.charCodeAt(i)); - } - return this.encode(input); + encodeString: function(str) { + return this.encode(this._utf8_encode(str)); }, encode: function(data) { var output = ''; @@ -90,28 +85,29 @@ var Base64 = { }, _utf8_encode: function(str) { str = str.replace(/\r\n/g, '\n'); - var utftext = ''; - - for (var n = 0; n < str.length; n++) { + var utfarray = []; - var c = str.charCodeAt(n); + //TODO: use for( var c of str ) in future versions + for (var offset = 0; offset < str.length; offset++) { + var code = str.codePointAt(offset); - if (c < 128) { - utftext += String.fromCharCode(c); + if (code <= 0x7F) { + utfarray.push(code); } - else if ((c > 127) && (c < 2048)) { - utftext += String.fromCharCode((c >> 6) | 192); - utftext += String.fromCharCode((c & 63) | 128); + else if (code <= 0x7FF) { + utfarray.push( 0xC0 | (code >> 6), 0x80 | (code & 0x3F) ); + } + else if (code <= 0xFFFF) { + utfarray.push( 0xE0 | (code >> 12), 0x80 | ((code >> 6) & 0x3F), 0x80 | (code & 0x3F) ); } else { - utftext += String.fromCharCode((c >> 12) | 224); - utftext += String.fromCharCode(((c >> 6) & 63) | 128); - utftext += String.fromCharCode((c & 63) | 128); + utfarray.push( 0xF0 | (code >> 18), 0x80 | ((code >> 12) & 0x3F), + 0x80 | ((code >> 6) & 0x3F), 0x80 | (code & 0x3F) ); + offset++; //there is a UTF16 surrogate pair in str, so jump two elements } - } - return utftext; + return utfarray; }, _utf8_decode: function(utfarray) { var str = ''; @@ -125,12 +121,12 @@ var Base64 = { str += String.fromCharCode(c); i++; } - else if ((c > 191) && (c < 224)) { + else if ((c >= 192) && (c < 224)) { c1 = utfarray[i + 1]; str += String.fromCharCode(((c & 31) << 6) | (c1 & 63)); i += 2; } - else if((c > 223) && (c < 240)) { + else if((c >= 224) && (c < 240)) { c1 = utfarray[i + 1]; c2 = utfarray[i + 2]; str += String.fromCharCode(((c & 15) << 12) | ((c1 & 63) << 6) | (c2 & 63)); -- 2.7.4 From 1c49245159cd3b4610359c9aba6ea74fc45b4e13 Mon Sep 17 00:00:00 2001 From: Hyunjin Park Date: Mon, 23 Jan 2017 13:42:53 +0900 Subject: [PATCH 14/16] [version] 1.70 Change-Id: I8f0d3b61894c9b13339668054d5b48207c460cc4 --- 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 a8a6691..85f1e2e 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.69 +Version: 1.70 Release: 0 License: Apache-2.0 and BSD-3-Clause and MIT Group: Development/Libraries -- 2.7.4 From 9b1afdee572fdfdb0fe9c3952fda6bb813019e72 Mon Sep 17 00:00:00 2001 From: Piotr Kosko Date: Wed, 25 Jan 2017 10:29:57 +0100 Subject: [PATCH 15/16] [Common] Fixed spec file - capi-appfw-application removed [Verification] Code compiles without errors. Change-Id: I9cae8ba1eba46d7302bd661261a6498c20c856f7 Signed-off-by: Piotr Kosko --- packaging/webapi-plugins.spec | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packaging/webapi-plugins.spec b/packaging/webapi-plugins.spec index 85f1e2e..ddff270 100644 --- a/packaging/webapi-plugins.spec +++ b/packaging/webapi-plugins.spec @@ -401,7 +401,8 @@ BuildRequires: pkgconfig(capi-network-bluetooth) BuildRequires: pkgconfig(capi-network-wifi-manager) BuildRequires: pkgconfig(tapi) BuildRequires: pkgconfig(libpcrecpp) -BuildRequires: pkgconfig(capi-appfw-application) +BuildRequires: pkgconfig(capi-appfw-event) +BuildRequires: pkgconfig(capi-appfw-preference) BuildRequires: pkgconfig(capi-appfw-app-manager) BuildRequires: pkgconfig(capi-appfw-package-manager) BuildRequires: pkgconfig(capi-content-media-content) -- 2.7.4 From c7e7f65c0c32bdb06ebe19eead06a84d5fe05745 Mon Sep 17 00:00:00 2001 From: Piotr Kosko Date: Wed, 1 Feb 2017 09:01:10 +0100 Subject: [PATCH 16/16] [version] 1.71 Change-Id: I8a3feba11e51c0cdec6ed27a0e58eb5ff86f68a4 Signed-off-by: Piotr Kosko --- 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 ddff270..3a8b454 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.70 +Version: 1.71 Release: 0 License: Apache-2.0 and BSD-3-Clause and MIT Group: Development/Libraries -- 2.7.4