1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "native_calendar.h"
17 #include "data_share_helper_manager.h"
18 #include "calendar_log.h"
19 #include "calendar_env.h"
20 #include "data_ability_helper.h"
21 #include "native_util.h"
22
23 namespace {
24 const string eventUrl = "datashare:///calendardata/Events";
25 const string attendeeUrl = "datashare:///calendardata/Attendees";
26 const string calendarUrl = "datashare:///calendardata/Calendars";
27 const string reminderUrl = "datashare:///calendardata/Reminders";
28 }
29 namespace OHOS::CalendarApi::Native {
Calendar(int id)30 Calendar::Calendar(int id)
31 : m_id(id)
32 {
33 uint64_t tokenId = CalendarEnv::GetInstance().GetTokenId();
34 auto bumdleName = CalendarEnv::GetInstance().GetBundleName();
35 auto bundleName_tokeId = "?bundleName=" + bumdleName + "&tokenId=" + std::to_string(tokenId);
36 LOG_INFO("bundleName_tokeId: %{public}s", bundleName_tokeId.c_str());
37 m_eventUri = std::make_unique<Uri>(eventUrl + bundleName_tokeId);
38 m_calendarUri = std::make_unique<Uri>(calendarUrl + bundleName_tokeId);
39 }
40
Calendar(CalendarAccount account,int id)41 Calendar::Calendar(CalendarAccount account, int id)
42 :m_account(std::move(account)), m_id(id)
43 {
44 // todo getallcalendar的时候会重复,需要复用
45 uint64_t tokenId = CalendarEnv::GetInstance().GetTokenId();
46 auto bumdleName = CalendarEnv::GetInstance().GetBundleName();
47 auto bundleName_tokeId = "?bundleName=" + bumdleName + "&tokenId=" + std::to_string(tokenId);
48 LOG_INFO("bundleName_tokeId: %{public}s", bundleName_tokeId.c_str());
49 m_eventUri = std::make_unique<Uri>(eventUrl + bundleName_tokeId);
50 m_attendeeUri = std::make_unique<Uri>(attendeeUrl + bundleName_tokeId);
51 m_calendarUri = std::make_unique<Uri>(calendarUrl + bundleName_tokeId);
52 m_reminderUrl = std::make_unique<Uri>(reminderUrl + bundleName_tokeId);
53 }
InsertReminders(int eventId,vector<int> reminders)54 void Calendar::InsertReminders(int eventId, vector<int> reminders)
55 {
56 for (const auto &reminder : reminders) {
57 DataShare::DataShareValuesBucket valuesBucket;
58 valuesBucket.Put("event_id", eventId);
59 valuesBucket.Put("minutes", reminder);
60 auto index = DataShareHelperManager::GetInstance().Insert(*(m_reminderUrl.get()), valuesBucket);
61 LOG_INFO("Insert reminder index %{public}d", index);
62 }
63 }
64
AddEventInfo(const Event & event,int channelId)65 int Calendar::AddEventInfo(const Event& event, int channelId)
66 {
67 auto valueEvent = BuildValueEvent(event, m_id, channelId);
68 auto eventId = DataShareHelperManager::GetInstance().Insert(*(m_eventUri.get()), valueEvent);
69 LOG_INFO("Insert Event eventId %{public}d", eventId);
70 if (eventId <= 0) {
71 return eventId;
72 }
73 // insert attendee
74 auto valueAttendees = std::vector<DataShare::DataShareValuesBucket>();
75 for (const auto &attendee : event.attendees) {
76 auto valueAttendee = BuildAttendeeValue(attendee, eventId);
77 valueAttendees.emplace_back(valueAttendee);
78 }
79 if (valueAttendees.size() > 0) {
80 auto count = DataShareHelperManager::GetInstance().BatchInsert(*(m_attendeeUri.get()), valueAttendees);
81 LOG_INFO("batchInsert attendees count %{public}d", count);
82 }
83
84 // insert reminder
85 if (event.reminderTime.has_value()) {
86 InsertReminders(eventId, event.reminderTime.value());
87 }
88
89 return eventId;
90 }
91
AddEvent(const Event & event)92 int Calendar::AddEvent(const Event& event)
93 {
94 return Calendar::AddEventInfo(event, 0);
95 }
96 #define SUPPORT_BATCH_INSERT 0
97
98 #if SUPPORT_BATCH_INSERT
AddEvents(const std::vector<Event> & events)99 int Calendar::AddEvents(const std::vector<Event>& events)
100 {
101 std::vector<DataShare::DataShareValuesBucket> valueEvents;
102 for (const auto &event : events) {
103 valueEvents.emplace_back(BuildValueEvent(event));
104 }
105 auto count = DataShareHelperManager::GetInstance().BatchInsert(*(m_eventUri.get()), valueEvents);
106 LOG_INFO("BatchInsert count %{public}d", count);
107 return count;
108 }
109 #else
AddEvents(const std::vector<Event> & events)110 int Calendar::AddEvents(const std::vector<Event>& events)
111 {
112 int count = 0;
113 int channelId = 0;
114 for (const auto &event : events) {
115 auto index = Calendar::AddEventInfo(event, channelId);
116 if (index > 0) {
117 count++;
118 }
119 channelId++;
120 }
121 LOG_INFO("AddEvents count %{public}d", count);
122 return count;
123 }
124 #endif
125
126
DeleteEvent(int id)127 bool Calendar::DeleteEvent(int id)
128 {
129 DataShare::DataSharePredicates predicates;
130 predicates.EqualTo("_id", id);
131 predicates.EqualTo("calendar_id", GetId());
132 auto ret = DataShareHelperManager::GetInstance().Delete(*(m_eventUri.get()), predicates);
133 return ret == 1;
134 }
135
DeleteAllEvents()136 void Calendar::DeleteAllEvents()
137 {
138 DataShare::DataSharePredicates predicates;
139 predicates.EqualTo("_id", GetId());
140 auto ret = DataShareHelperManager::GetInstance().Delete(*(m_eventUri.get()), predicates);
141 LOG_INFO("DeleteEvent number %{public}d", ret);
142 return;
143 }
144
DeleteEvents(const std::vector<int> & ids)145 int Calendar::DeleteEvents(const std::vector<int>& ids)
146 {
147 int count = 0;
148 for (const auto &id : ids) {
149 if (DeleteEvent(id)) {
150 count +=1;
151 }
152 }
153 LOG_INFO("DeleteEvents %{public}d", count);
154 return count;
155 }
156
UpdateEvent(const Event & event)157 bool Calendar::UpdateEvent(const Event& event)
158 {
159 if (!event.id) {
160 LOG_ERROR("event id not exist");
161 return false;
162 }
163 const auto eventId = event.id.value();
164 DataShare::DataSharePredicates m_predicates;
165 m_predicates.EqualTo("_id", eventId);
166 auto valueEvent = BuildValueEvent(event, m_id, 0);
167 auto ret = DataShareHelperManager::GetInstance().Update(*(m_eventUri.get()), m_predicates, valueEvent);
168 LOG_INFO(" Update code %{public}d", ret);
169 {
170 // delete attendee
171 DataShare::DataSharePredicates predicates;
172 predicates.EqualTo("event_id", eventId);
173 auto ret = DataShareHelperManager::GetInstance().Delete(*(m_attendeeUri.get()), predicates);
174 LOG_INFO("Delete attendee num %{public}d", ret);
175 }
176 auto valueAttendees = std::vector<DataShare::DataShareValuesBucket>();
177 for (const auto &attendee : event.attendees) {
178 auto valueAttendee = BuildAttendeeValue(attendee, eventId);
179 valueAttendees.emplace_back(valueAttendee);
180 }
181 if (valueAttendees.size() > 0) {
182 auto count = DataShareHelperManager::GetInstance().BatchInsert(*(m_attendeeUri.get()), valueAttendees);
183 LOG_INFO("batchInsert attendees count %{public}d", count);
184 }
185
186 {
187 // delete reminder
188 DataShare::DataSharePredicates predicates;
189 predicates.EqualTo("event_id", eventId);
190 auto ret = DataShareHelperManager::GetInstance().Delete(*(m_reminderUrl.get()), predicates);
191 LOG_INFO("Delete reminder num %{public}d", ret);
192 }
193 if (event.reminderTime.has_value()) {
194 InsertReminders(eventId, event.reminderTime.value());
195 }
196
197 return ret == 1;
198 }
199
UpdateEvents(const std::vector<Event> & events)200 int Calendar::UpdateEvents(const std::vector<Event>& events)
201 {
202 int count = 0;
203 for (const auto &event : events) {
204 if (UpdateEvent(event)) {
205 count +=1;
206 }
207 }
208 LOG_INFO("UpdateEvents %{public}d", count);
209 return count;
210 }
211
GetAttendeesByEventId(int id)212 std::vector<Attendee> Calendar::GetAttendeesByEventId(int id)
213 {
214 DataShare::DataSharePredicates predicates;
215 predicates.EqualTo("event_id", id);
216 std::vector<std::string> columns = {"attendeeName", "attendeeEmail",
217 "attendeeRelationship", "attendeeStatus", "attendeeType"};
218 DataShare::DatashareBusinessError error;
219 auto result = DataShareHelperManager::GetInstance().Query(*(m_attendeeUri.get()), predicates, columns, &error);
220 std::vector<Attendee> attendees;
221 if (result != nullptr) {
222 ResultSetToAttendees(attendees, result);
223 }
224 LOG_INFO(" query attendee finished");
225 return attendees;
226 }
227
GetRemindersByEventId(int id)228 std::optional<std::vector<int>> Calendar::GetRemindersByEventId(int id)
229 {
230 DataShare::DataSharePredicates predicates;
231 predicates.EqualTo("event_id", id);
232 std::vector<std::string> columns = {"event_id", "minutes"};
233 DataShare::DatashareBusinessError error;
234 auto result = DataShareHelperManager::GetInstance().Query(*(m_reminderUrl.get()), predicates, columns, &error);
235 if (result == nullptr) {
236 return std::nullopt;
237 }
238 std::vector<int> reminders;
239 auto ret = ResultSetToReminders(reminders, result);
240 if (ret != DataShare::E_OK) {
241 return std::nullopt;
242 }
243 LOG_INFO("query reminder finished");
244 return reminders;
245 }
246
GetEvents(std::shared_ptr<EventFilter> filter,const std::vector<string> & eventKey)247 std::vector<Event> Calendar::GetEvents(std::shared_ptr<EventFilter> filter, const std::vector<string>& eventKey)
248 {
249 std::vector<Event> events;
250 std::shared_ptr<DataShare::DataSharePredicates> predicates = nullptr;
251 if (filter) {
252 predicates = filter->GetFilterPrediacates();
253 if (!predicates) {
254 LOG_ERROR("predicates null");
255 return events;
256 }
257 } else {
258 predicates = std::make_shared<DataShare::DataSharePredicates>();
259 }
260 predicates->EqualTo("calendar_id", GetId());
261 std::vector<string> queryField = {};
262 std::set<string> resultSetField;
263 if (eventKey.size() > 0) {
264 queryField.emplace_back("_id");
265 SetField(eventKey, queryField, resultSetField);
266 } else {
267 resultSetField = {"type", "title", "startTime", "endTime", "isAllDay", "description",
268 "timeZone", "location", "service", "attendee", "reminderTime"};
269 }
270 DataShare::DatashareBusinessError error;
271 auto result = DataShareHelperManager::GetInstance().Query(*(m_eventUri.get()),
272 *(predicates.get()), queryField, &error);
273 if (!result) {
274 LOG_ERROR("query failed");
275 return events;
276 }
277 ResultSetToEvents(events, result, resultSetField);
278 for (auto &event : events) {
279 const auto eventId = event.id.value();
280 if (resultSetField.count("attendee")) {
281 event.attendees = GetAttendeesByEventId(eventId);
282 }
283 if (resultSetField.count("reminderTime")) {
284 event.reminderTime = GetRemindersByEventId(eventId);
285 }
286 DumpEvent(event);
287 }
288 LOG_INFO("query finished");
289 return events;
290 }
291
GetConfig()292 CalendarConfig Calendar::GetConfig()
293 {
294 DataShare::DataSharePredicates predicates;
295 predicates.EqualTo("_id", m_id);
296 std::vector<std::string> columns = {"calendar_color", "canReminder"};
297 DataShare::DatashareBusinessError error;
298 auto result = DataShareHelperManager::GetInstance().Query(*(m_calendarUri.get()), predicates, columns, &error);
299 if (result != nullptr) {
300 ResultSetToConfig(m_config, result);
301 };
302 LOG_INFO(" query config finished");
303 return m_config;
304 }
305
SetConfig(const CalendarConfig & config)306 bool Calendar::SetConfig(const CalendarConfig& config)
307 {
308 DataShare::DataSharePredicates m_predicates;
309 m_predicates.EqualTo("_id", m_id);
310 DataShare::DataShareValuesBucket valuesBucket;
311 if (std::get_if<1>(&config.color)) {
312 valuesBucket.Put("calendar_color", std::get<1>(config.color));
313 }
314 if (config.enableReminder) {
315 valuesBucket.Put("canReminder", config.enableReminder.value());
316 }
317 if (valuesBucket.IsEmpty()) {
318 LOG_INFO("no need update");
319 return true;
320 }
321
322 // dataShareHelper 需要提到event_handler基类里面去
323 auto ret = DataShareHelperManager::GetInstance().Update(*(m_calendarUri.get()), m_predicates, valuesBucket) == 1;
324 LOG_INFO("SetConfig %{public}d", ret);
325 if (ret) {
326 m_config = config;
327 }
328 return ret;
329 }
330 }