[Code format] Fixed formating with auto-format tool
[platform/core/api/webapi-plugins.git] / src / time / time_instance.cc
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.
5
6 #include "time/time_instance.h"
7 #include "common/logger.h"
8 #include "common/picojson.h"
9 #include "common/platform_result.h"
10
11 namespace extension {
12 namespace time {
13
14 using namespace common;
15
16 TimeInstance::TimeInstance() : manager_(this) {
17   ScopeLogger();
18
19   using std::placeholders::_1;
20   using std::placeholders::_2;
21
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
43 }
44
45 TimeInstance::~TimeInstance() {
46   ScopeLogger();
47 }
48
49 void TimeInstance::TimeUtilGetAvailableTimezones(const picojson::value& /*args*/,
50                                                  picojson::object& out) {
51   ScopeLogger();
52   picojson::value result = picojson::value(picojson::object());
53   picojson::object& result_obj = result.get<picojson::object>();
54
55   auto array =
56       result_obj.insert(std::make_pair("availableTimezones", picojson::value(picojson::array())));
57   PlatformResult res =
58       TimeUtilTools::GetAvailableTimezones(&array.first->second.get<picojson::array>());
59   if (res.IsError()) {
60     LogAndReportError(res, &out, ("Failed to get available timezones"));
61     return;
62   }
63   ReportSuccess(result, out);
64 }
65
66 void TimeInstance::TimeUtilGetDateFormat(const picojson::value& args, picojson::object& out) {
67   ScopeLogger();
68   if (!args.contains("shortformat")) {
69     LogAndReportError(PlatformResult(ErrorCode::INVALID_VALUES_ERR, "Invalid parameter passed."),
70                       &out, ("Required parameter \"shortformat\" is missing"));
71     return;
72   }
73
74   bool shortformat = args.get("shortformat").get<bool>();
75   std::string format;
76   PlatformResult res = TimeUtilTools::GetDateFormat(shortformat, &format);
77   if (res.IsError()) {
78     LogAndReportError(res, &out, ("Failed to get date format."));
79     return;
80   }
81
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)));
85
86   ReportSuccess(result, out);
87 }
88
89 void TimeInstance::TimeUtilGetTimeFormat(const picojson::value& /* args */, picojson::object& out) {
90   ScopeLogger();
91   std::string format;
92   PlatformResult res = TimeUtilTools::GetTimeFormat(&format);
93   if (res.IsError()) {
94     LogAndReportError(res, &out, ("Failed to get time format."));
95     return;
96   }
97
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)));
101
102   ReportSuccess(result, out);
103 }
104
105 void TimeInstance::TimeUtilSetDateTimeChangeListener(const picojson::value& /*args*/,
106                                                      picojson::object& out) {
107   ScopeLogger();
108   PlatformResult res = manager_.RegisterVconfCallback(kTimeChange);
109   if (res.IsError()) {
110     LogAndReportError(res, &out, ("Failed to set date-time change listener."));
111   }
112   ReportSuccess(out);
113 }
114
115 void TimeInstance::TimeUtilUnsetDateTimeChangeListener(const picojson::value& /*args*/,
116                                                        picojson::object& out) {
117   ScopeLogger();
118   PlatformResult res = manager_.UnregisterVconfCallback(kTimeChange);
119   if (res.IsError()) {
120     LogAndReportError(res, &out, ("Failed to remove date-time change listener."));
121   }
122   ReportSuccess(out);
123 }
124
125 void TimeInstance::TimeUtilSetTimezoneChangeListener(const picojson::value& /*args*/,
126                                                      picojson::object& out) {
127   ScopeLogger();
128   PlatformResult res = manager_.RegisterVconfCallback(kTimezoneChange);
129   if (res.IsError()) {
130     LogAndReportError(res, &out, ("Failed to set timezone change listener."));
131   }
132   ReportSuccess(out);
133 }
134
135 void TimeInstance::TimeUtilUnsetTimezoneChangeListener(const picojson::value& /*args*/,
136                                                        picojson::object& out) {
137   ScopeLogger();
138   PlatformResult res = manager_.UnregisterVconfCallback(kTimezoneChange);
139   if (res.IsError()) {
140     LogAndReportError(res, &out, ("Failed to remove timezone change listener."));
141   }
142   ReportSuccess(out);
143 }
144
145 void TimeInstance::TZDateGetLocalTimezone(const picojson::value& /*args*/, picojson::object& out) {
146   ScopeLogger();
147
148   std::string local_timezone = TimeManager::GetDefaultTimezone();
149
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)));
153
154   ReportSuccess(result, out);
155 }
156
157 void TimeInstance::TZDateGetTimezoneOffset(const picojson::value& args, picojson::object& out) {
158   ScopeLogger();
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\""));
162     return;
163   }
164   const std::string& timezone_id = args.get("timezone").get<std::string>();
165   LoggerD("Getting timezone details for id: %s ", timezone_id.c_str());
166
167   const std::string& timestamp_str = args.get("timestamp").get<std::string>();
168
169   std::string offset;
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);
179   } else {
180     LogAndReportError(res, &out, ("Failed to get timezone offset."));
181   }
182 }
183
184 void TimeInstance::ToStringTemplate(const picojson::value& args, bool use_locale_fmt,
185                                     TimeUtilTools::DateTimeFormatType type, picojson::object* out) {
186   ScopeLogger();
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\""));
190     return;
191   }
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());
195
196   const std::string& timestamp_str = args.get("timestamp").get<std::string>();
197   UDate date = std::stod(timestamp_str);
198
199   std::string result_string;
200   PlatformResult res =
201       TimeUtilTools::ToStringHelper(date, unicode_id, use_locale_fmt, type, &result_string);
202   if (res.IsError()) {
203     LogAndReportError(res, out, ("Failed to convert to string."));
204     return;
205   }
206
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)));
210
211   ReportSuccess(result, *out);
212 }
213
214 void TimeInstance::TZDateToLocaleDateString(const picojson::value& args, picojson::object& out) {
215   ScopeLogger();
216   ToStringTemplate(args, true, TimeUtilTools::DateTimeFormatType::kDateFormat, &out);
217 }
218
219 void TimeInstance::TZDateToLocaleTimeString(const picojson::value& args, picojson::object& out) {
220   ScopeLogger();
221   ToStringTemplate(args, true, TimeUtilTools::DateTimeFormatType::kTimeFormat, &out);
222 }
223
224 void TimeInstance::TZDateToLocaleString(const picojson::value& args, picojson::object& out) {
225   ScopeLogger();
226   ToStringTemplate(args, true, TimeUtilTools::DateTimeFormatType::kDateTimeFormat, &out);
227 }
228
229 void TimeInstance::TZDateToDateString(const picojson::value& args, picojson::object& out) {
230   ScopeLogger();
231   ToStringTemplate(args, false, TimeUtilTools::DateTimeFormatType::kDateFormat, &out);
232 }
233
234 void TimeInstance::TZDateToTimeString(const picojson::value& args, picojson::object& out) {
235   ScopeLogger();
236   ToStringTemplate(args, false, TimeUtilTools::DateTimeFormatType::kTimeFormat, &out);
237 }
238
239 void TimeInstance::TZDateToString(const picojson::value& args, picojson::object& out) {
240   ScopeLogger();
241   ToStringTemplate(args, false, TimeUtilTools::DateTimeFormatType::kDateTimeFormat, &out);
242 }
243
244 void TimeInstance::TZDateGetTimezoneAbbreviation(const picojson::value& args,
245                                                  picojson::object& out) {
246   ScopeLogger();
247   LoggerW(
248       "DEPRECATION WARNING: getTimezoneAbbreviation() is deprecated and will be removed from next "
249       "release.");
250
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\""));
254     return;
255   }
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()));
258
259   const std::string& timestamp_str = args.get("timestamp").get<std::string>();
260   UDate date = std::stod(timestamp_str);
261
262   std::string result_string;
263   PlatformResult res = TimeUtilTools::GetTimezoneAbbreviation(date, unicode_id, &result_string);
264   if (res.IsError()) {
265     LogAndReportError(res, &out, ("Failed to get timezone abbreviation."));
266     return;
267   }
268
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)));
272
273   ReportSuccess(result, out);
274 }
275
276 void TimeInstance::TZDateIsDST(const picojson::value& args, picojson::object& out) {
277   ScopeLogger();
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\""));
281     return;
282   }
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()));
285
286   const std::string& timestamp_str = args.get("timestamp").get<std::string>();
287   UDate date = std::stod(timestamp_str);
288
289   bool is_dst = false;
290   PlatformResult res = TimeUtilTools::IsDST(date, unicode_id, &is_dst);
291   if (res.IsError()) {
292     LogAndReportError(res, &out, ("Failed to check DST."));
293     return;
294   }
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);
299 }
300
301 void TimeInstance::TZDateGetPreviousDSTTransition(const picojson::value& args,
302                                                   picojson::object& out) {
303   ScopeLogger();
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\""));
307     return;
308   }
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()));
311
312   const std::string& timestamp_str = args.get("timestamp").get<std::string>();
313   UDate date = std::stod(timestamp_str);
314
315   picojson::value result = picojson::value(picojson::object());
316   picojson::object& result_obj = result.get<picojson::object>();
317   UDate prev_dst =
318       TimeUtilTools::GetDSTTransition(date, unicode_id, TimeUtilTools::DSTTransition::kPreviousDST);
319   result_obj.insert(std::make_pair("prevDSTDate", picojson::value(prev_dst)));
320
321   ReportSuccess(result, out);
322 }
323
324 void TimeInstance::TZDateGetNextDSTTransition(const picojson::value& args, picojson::object& out) {
325   ScopeLogger();
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\""));
329     return;
330   }
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()));
333
334   const std::string& timestamp_str = args.get("timestamp").get<std::string>();
335   UDate date = std::stod(timestamp_str);
336
337   picojson::value result = picojson::value(picojson::object());
338   picojson::object& result_obj = result.get<picojson::object>();
339   UDate next_dst =
340       TimeUtilTools::GetDSTTransition(date, unicode_id, TimeUtilTools::DSTTransition::kNextDST);
341   result_obj.insert(std::make_pair("nextDSTDate", picojson::value(next_dst)));
342
343   ReportSuccess(result, out);
344 }
345
346 }  // namespace time
347 }  // namespace extension