1 // Copyright (c) 2013 Intel Corporation. All rights reserved.
2 // Copyright (c) 2015 Samsung Electronics Co, Ltd. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
6 #include "time/time_instance.h"
7 #include "common/logger.h"
8 #include "common/picojson.h"
9 #include "common/platform_result.h"
14 using namespace common;
16 TimeInstance::TimeInstance() : manager_(this) {
19 using std::placeholders::_1;
20 using std::placeholders::_2;
22 #define REGISTER_METHOD(M) RegisterSyncHandler(#M, std::bind(&TimeInstance::M, this, _1, _2))
23 REGISTER_METHOD(TimeUtilGetAvailableTimezones);
24 REGISTER_METHOD(TimeUtilGetDateFormat);
25 REGISTER_METHOD(TimeUtilGetTimeFormat);
26 REGISTER_METHOD(TimeUtilSetDateTimeChangeListener);
27 REGISTER_METHOD(TimeUtilUnsetDateTimeChangeListener);
28 REGISTER_METHOD(TimeUtilSetTimezoneChangeListener);
29 REGISTER_METHOD(TimeUtilUnsetTimezoneChangeListener);
30 REGISTER_METHOD(TZDateGetLocalTimezone);
31 REGISTER_METHOD(TZDateGetTimezoneOffset);
32 REGISTER_METHOD(TZDateToLocaleDateString);
33 REGISTER_METHOD(TZDateToLocaleTimeString);
34 REGISTER_METHOD(TZDateToLocaleString);
35 REGISTER_METHOD(TZDateToDateString);
36 REGISTER_METHOD(TZDateToTimeString);
37 REGISTER_METHOD(TZDateToString);
38 REGISTER_METHOD(TZDateGetTimezoneAbbreviation);
39 REGISTER_METHOD(TZDateIsDST);
40 REGISTER_METHOD(TZDateGetPreviousDSTTransition);
41 REGISTER_METHOD(TZDateGetNextDSTTransition);
42 #undef REGISTER_METHOD
45 TimeInstance::~TimeInstance() {
49 void TimeInstance::TimeUtilGetAvailableTimezones(const picojson::value& /*args*/,
50 picojson::object& out) {
52 picojson::value result = picojson::value(picojson::object());
53 picojson::object& result_obj = result.get<picojson::object>();
56 result_obj.insert(std::make_pair("availableTimezones", picojson::value(picojson::array())));
58 TimeUtilTools::GetAvailableTimezones(&array.first->second.get<picojson::array>());
60 LogAndReportError(res, &out, ("Failed to get available timezones"));
63 ReportSuccess(result, out);
66 void TimeInstance::TimeUtilGetDateFormat(const picojson::value& args, picojson::object& out) {
68 if (!args.contains("shortformat")) {
69 LogAndReportError(PlatformResult(ErrorCode::INVALID_VALUES_ERR, "Invalid parameter passed."),
70 &out, ("Required parameter \"shortformat\" is missing"));
74 bool shortformat = args.get("shortformat").get<bool>();
76 PlatformResult res = TimeUtilTools::GetDateFormat(shortformat, &format);
78 LogAndReportError(res, &out, ("Failed to get date format."));
82 picojson::value result = picojson::value(picojson::object());
83 picojson::object& result_obj = result.get<picojson::object>();
84 result_obj.insert(std::make_pair("format", picojson::value(format)));
86 ReportSuccess(result, out);
89 void TimeInstance::TimeUtilGetTimeFormat(const picojson::value& /* args */, picojson::object& out) {
92 PlatformResult res = TimeUtilTools::GetTimeFormat(&format);
94 LogAndReportError(res, &out, ("Failed to get time format."));
98 picojson::value result = picojson::value(picojson::object());
99 picojson::object& result_obj = result.get<picojson::object>();
100 result_obj.insert(std::make_pair("format", picojson::value(format)));
102 ReportSuccess(result, out);
105 void TimeInstance::TimeUtilSetDateTimeChangeListener(const picojson::value& /*args*/,
106 picojson::object& out) {
108 PlatformResult res = manager_.RegisterVconfCallback(kTimeChange);
110 LogAndReportError(res, &out, ("Failed to set date-time change listener."));
115 void TimeInstance::TimeUtilUnsetDateTimeChangeListener(const picojson::value& /*args*/,
116 picojson::object& out) {
118 PlatformResult res = manager_.UnregisterVconfCallback(kTimeChange);
120 LogAndReportError(res, &out, ("Failed to remove date-time change listener."));
125 void TimeInstance::TimeUtilSetTimezoneChangeListener(const picojson::value& /*args*/,
126 picojson::object& out) {
128 PlatformResult res = manager_.RegisterVconfCallback(kTimezoneChange);
130 LogAndReportError(res, &out, ("Failed to set timezone change listener."));
135 void TimeInstance::TimeUtilUnsetTimezoneChangeListener(const picojson::value& /*args*/,
136 picojson::object& out) {
138 PlatformResult res = manager_.UnregisterVconfCallback(kTimezoneChange);
140 LogAndReportError(res, &out, ("Failed to remove timezone change listener."));
145 void TimeInstance::TZDateGetLocalTimezone(const picojson::value& /*args*/, picojson::object& out) {
148 std::string local_timezone = TimeManager::GetDefaultTimezone();
150 picojson::value result = picojson::value(picojson::object());
151 picojson::object& result_obj = result.get<picojson::object>();
152 result_obj.insert(std::make_pair("timezoneId", picojson::value(local_timezone)));
154 ReportSuccess(result, out);
157 void TimeInstance::TZDateGetTimezoneOffset(const picojson::value& args, picojson::object& out) {
159 if (!args.contains("timezone") || !args.contains("timestamp")) {
160 LogAndReportError(PlatformResult(ErrorCode::INVALID_VALUES_ERR, "Invalid parameter passed."),
161 &out, ("Required parameters are missing: \"timezone\", \"timestamp\""));
164 const std::string& timezone_id = args.get("timezone").get<std::string>();
165 LoggerD("Getting timezone details for id: %s ", timezone_id.c_str());
167 const std::string& timestamp_str = args.get("timestamp").get<std::string>();
170 std::string modifier;
171 PlatformResult res = manager_.GetTimezoneOffset(timezone_id, timestamp_str, &offset, &modifier);
172 if (res.IsSuccess()) {
173 picojson::value result = picojson::value(picojson::object());
174 picojson::object& result_obj = result.get<picojson::object>();
175 result_obj.insert(std::make_pair("offset", picojson::value(offset)));
176 // this value is to correct 'missing' hour also in JS
177 result_obj.insert(std::make_pair("modifier", picojson::value(modifier)));
178 ReportSuccess(result, out);
180 LogAndReportError(res, &out, ("Failed to get timezone offset."));
184 void TimeInstance::ToStringTemplate(const picojson::value& args, bool use_locale_fmt,
185 TimeUtilTools::DateTimeFormatType type, picojson::object* out) {
187 if (!args.contains("timezone") || !args.contains("timestamp")) {
188 LogAndReportError(PlatformResult(ErrorCode::INVALID_VALUES_ERR, "Invalid parameter passed."),
189 out, ("Required parameters are missing: \"timezone\", \"timestamp\""));
192 const std::string& timezone_id = args.get("timezone").get<std::string>();
193 std::shared_ptr<UnicodeString> unicode_id(new UnicodeString(timezone_id.c_str()));
194 LoggerD("Getting timezone details for id: %s ", timezone_id.c_str());
196 const std::string& timestamp_str = args.get("timestamp").get<std::string>();
197 UDate date = std::stod(timestamp_str);
199 std::string result_string;
201 TimeUtilTools::ToStringHelper(date, unicode_id, use_locale_fmt, type, &result_string);
203 LogAndReportError(res, out, ("Failed to convert to string."));
207 picojson::value result = picojson::value(picojson::object());
208 picojson::object& result_obj = result.get<picojson::object>();
209 result_obj.insert(std::make_pair("string", picojson::value(result_string)));
211 ReportSuccess(result, *out);
214 void TimeInstance::TZDateToLocaleDateString(const picojson::value& args, picojson::object& out) {
216 ToStringTemplate(args, true, TimeUtilTools::DateTimeFormatType::kDateFormat, &out);
219 void TimeInstance::TZDateToLocaleTimeString(const picojson::value& args, picojson::object& out) {
221 ToStringTemplate(args, true, TimeUtilTools::DateTimeFormatType::kTimeFormat, &out);
224 void TimeInstance::TZDateToLocaleString(const picojson::value& args, picojson::object& out) {
226 ToStringTemplate(args, true, TimeUtilTools::DateTimeFormatType::kDateTimeFormat, &out);
229 void TimeInstance::TZDateToDateString(const picojson::value& args, picojson::object& out) {
231 ToStringTemplate(args, false, TimeUtilTools::DateTimeFormatType::kDateFormat, &out);
234 void TimeInstance::TZDateToTimeString(const picojson::value& args, picojson::object& out) {
236 ToStringTemplate(args, false, TimeUtilTools::DateTimeFormatType::kTimeFormat, &out);
239 void TimeInstance::TZDateToString(const picojson::value& args, picojson::object& out) {
241 ToStringTemplate(args, false, TimeUtilTools::DateTimeFormatType::kDateTimeFormat, &out);
244 void TimeInstance::TZDateGetTimezoneAbbreviation(const picojson::value& args,
245 picojson::object& out) {
248 "DEPRECATION WARNING: getTimezoneAbbreviation() is deprecated and will be removed from next "
251 if (!args.contains("timezone") || !args.contains("timestamp")) {
252 LogAndReportError(PlatformResult(ErrorCode::INVALID_VALUES_ERR, "Invalid parameter passed."),
253 &out, ("Required parameters are missing: \"timezone\", \"timestamp\""));
256 const std::string& timezone_id = args.get("timezone").get<std::string>();
257 std::shared_ptr<UnicodeString> unicode_id(new UnicodeString(timezone_id.c_str()));
259 const std::string& timestamp_str = args.get("timestamp").get<std::string>();
260 UDate date = std::stod(timestamp_str);
262 std::string result_string;
263 PlatformResult res = TimeUtilTools::GetTimezoneAbbreviation(date, unicode_id, &result_string);
265 LogAndReportError(res, &out, ("Failed to get timezone abbreviation."));
269 picojson::value result = picojson::value(picojson::object());
270 picojson::object& result_obj = result.get<picojson::object>();
271 result_obj.insert(std::make_pair("abbreviation", picojson::value(result_string)));
273 ReportSuccess(result, out);
276 void TimeInstance::TZDateIsDST(const picojson::value& args, picojson::object& out) {
278 if (!args.contains("timezone") || !args.contains("timestamp")) {
279 LogAndReportError(PlatformResult(ErrorCode::INVALID_VALUES_ERR, "Invalid parameter passed."),
280 &out, ("Required parameters are missing: \"timezone\", \"timestamp\""));
283 const std::string& timezone_id = args.get("timezone").get<std::string>();
284 std::shared_ptr<UnicodeString> unicode_id(new UnicodeString(timezone_id.c_str()));
286 const std::string& timestamp_str = args.get("timestamp").get<std::string>();
287 UDate date = std::stod(timestamp_str);
290 PlatformResult res = TimeUtilTools::IsDST(date, unicode_id, &is_dst);
292 LogAndReportError(res, &out, ("Failed to check DST."));
295 picojson::value result = picojson::value(picojson::object());
296 picojson::object& result_obj = result.get<picojson::object>();
297 result_obj.insert(std::make_pair("isDST", picojson::value(is_dst)));
298 ReportSuccess(result, out);
301 void TimeInstance::TZDateGetPreviousDSTTransition(const picojson::value& args,
302 picojson::object& out) {
304 if (!args.contains("timezone") || !args.contains("timestamp")) {
305 LogAndReportError(PlatformResult(ErrorCode::INVALID_VALUES_ERR, "Invalid parameter passed."),
306 &out, ("Required parameters are missing: \"timezone\", \"timestamp\""));
309 const std::string& timezone_id = args.get("timezone").get<std::string>();
310 std::shared_ptr<UnicodeString> unicode_id(new UnicodeString(timezone_id.c_str()));
312 const std::string& timestamp_str = args.get("timestamp").get<std::string>();
313 UDate date = std::stod(timestamp_str);
315 picojson::value result = picojson::value(picojson::object());
316 picojson::object& result_obj = result.get<picojson::object>();
318 TimeUtilTools::GetDSTTransition(date, unicode_id, TimeUtilTools::DSTTransition::kPreviousDST);
319 result_obj.insert(std::make_pair("prevDSTDate", picojson::value(prev_dst)));
321 ReportSuccess(result, out);
324 void TimeInstance::TZDateGetNextDSTTransition(const picojson::value& args, picojson::object& out) {
326 if (!args.contains("timezone") || !args.contains("timestamp")) {
327 LogAndReportError(PlatformResult(ErrorCode::INVALID_VALUES_ERR, "Invalid parameter passed."),
328 &out, ("Required parameters are missing: \"timezone\", \"timestamp\""));
331 const std::string& timezone_id = args.get("timezone").get<std::string>();
332 std::shared_ptr<UnicodeString> unicode_id(new UnicodeString(timezone_id.c_str()));
334 const std::string& timestamp_str = args.get("timestamp").get<std::string>();
335 UDate date = std::stod(timestamp_str);
337 picojson::value result = picojson::value(picojson::object());
338 picojson::object& result_obj = result.get<picojson::object>();
340 TimeUtilTools::GetDSTTransition(date, unicode_id, TimeUtilTools::DSTTransition::kNextDST);
341 result_obj.insert(std::make_pair("nextDSTDate", picojson::value(next_dst)));
343 ReportSuccess(result, out);
347 } // namespace extension