• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
AddEvent(const Event & event)65 int Calendar::AddEvent(const Event& event)
66 {
67     auto valueEvent = BuildValueEvent(event, m_id);
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     for (const auto &attendee : event.attendees) {
75         auto valueAttendee = BuildAttendeeValue(attendee, eventId);
76         auto index = DataShareHelperManager::GetInstance().Insert(*(m_attendeeUri.get()), valueAttendee);
77         LOG_INFO("Insert attendee index %{public}d", index);
78     }
79     // insert reminder
80     if (event.reminderTime.has_value()) {
81         InsertReminders(eventId, event.reminderTime.value());
82     }
83 
84     return eventId;
85 }
86 #define SUPPORT_BATCH_INSERT 0
87 
88 #if SUPPORT_BATCH_INSERT
AddEvents(const std::vector<Event> & events)89 int Calendar::AddEvents(const std::vector<Event>& events)
90 {
91     std::vector<DataShare::DataShareValuesBucket> valueEvents;
92     for (const auto &event : events) {
93         valueEvents.emplace_back(BuildValueEvent(event));
94     }
95     auto count = DataShareHelperManager::GetInstance().BatchInsert(*(m_eventUri.get()), valueEvents);
96     LOG_INFO("BatchInsert count %{public}d", count);
97     return count;
98 }
99 #else
AddEvents(const std::vector<Event> & events)100 int Calendar::AddEvents(const std::vector<Event>& events)
101 {
102     int count = 0;
103     for (const auto &event : events) {
104         auto index = Calendar::AddEvent(event);
105         if (index > 0) {
106             count++;
107         }
108     }
109     LOG_INFO("AddEvents count %{public}d", count);
110     return count;
111 }
112 #endif
113 
114 
DeleteEvent(int id)115 bool Calendar::DeleteEvent(int id)
116 {
117     DataShare::DataSharePredicates predicates;
118     predicates.EqualTo("_id", id);
119     predicates.EqualTo("calendar_id", GetId());
120     auto ret = DataShareHelperManager::GetInstance().Delete(*(m_eventUri.get()), predicates);
121     LOG_INFO("DeleteEvent number %{public}d", ret);
122     {
123         // delete attendee
124         DataShare::DataSharePredicates predicates;
125         predicates.EqualTo("event_id", id);
126         auto ret = DataShareHelperManager::GetInstance().Delete(*(m_attendeeUri.get()), predicates);
127         LOG_INFO("Delete attendee num %{public}d", ret);
128     }
129     {
130         // delete reminder
131         DataShare::DataSharePredicates predicates;
132         predicates.EqualTo("event_id", id);
133         auto ret = DataShareHelperManager::GetInstance().Delete(*(m_reminderUrl.get()), predicates);
134         LOG_INFO("Delete reminder num %{public}d", ret);
135     }
136     return ret == 1;
137 }
138 
DeleteAllEvents()139 void Calendar::DeleteAllEvents()
140 {
141     DataShare::DataSharePredicates predicates;
142     predicates.EqualTo("_id", GetId());
143     auto ret = DataShareHelperManager::GetInstance().Delete(*(m_eventUri.get()), predicates);
144     LOG_INFO("DeleteEvent number %{public}d", ret);
145     return;
146 }
147 
DeleteEvents(const std::vector<int> & ids)148 int Calendar::DeleteEvents(const std::vector<int>& ids)
149 {
150     int count = 0;
151     for (const auto &id : ids) {
152         if (DeleteEvent(id)) {
153             count +=1;
154         }
155     }
156     LOG_INFO("DeleteEvents %{public}d", count);
157     return count;
158 }
159 
UpdateEvent(const Event & event)160 bool Calendar::UpdateEvent(const Event& event)
161 {
162     if (!event.id) {
163         LOG_ERROR("event id not exist");
164         return false;
165     }
166     const auto eventId = event.id.value();
167     DataShare::DataSharePredicates m_predicates;
168     m_predicates.EqualTo("_id", eventId);
169     auto valueEvent = BuildValueEvent(event, m_id);
170     auto ret = DataShareHelperManager::GetInstance().Update(*(m_eventUri.get()), m_predicates, valueEvent);
171     LOG_INFO(" Update code %{public}d", ret);
172     {
173         // delete attendee
174         DataShare::DataSharePredicates predicates;
175         predicates.EqualTo("event_id", eventId);
176         auto ret = DataShareHelperManager::GetInstance().Delete(*(m_attendeeUri.get()), predicates);
177         LOG_INFO("Delete attendee num %{public}d", ret);
178     }
179     for (const auto &attendee : event.attendees) {
180         auto valueAttendee = BuildAttendeeValue(attendee, eventId);
181         auto index = DataShareHelperManager::GetInstance().Insert(*(m_attendeeUri.get()), valueAttendee);
182         LOG_INFO("Update attendee index %{public}d", index);
183     }
184 
185     {
186         // delete reminder
187         DataShare::DataSharePredicates predicates;
188         predicates.EqualTo("event_id", eventId);
189         auto ret = DataShareHelperManager::GetInstance().Delete(*(m_reminderUrl.get()), predicates);
190         LOG_INFO("Delete reminder num %{public}d", ret);
191     }
192     if (event.reminderTime.has_value()) {
193         InsertReminders(eventId, event.reminderTime.value());
194     }
195 
196     return ret == 1;
197 }
198 
UpdateEvents(const std::vector<Event> & events)199 int Calendar::UpdateEvents(const std::vector<Event>& events)
200 {
201     int count = 0;
202     for (const auto &event : events) {
203         if (UpdateEvent(event)) {
204             count +=1;
205         }
206     }
207     LOG_INFO("UpdateEvents %{public}d", count);
208     return count;
209 }
210 
GetAttendeesByEventId(int id)211 std::vector<Attendee> Calendar::GetAttendeesByEventId(int id)
212 {
213     DataShare::DataSharePredicates predicates;
214     predicates.EqualTo("event_id", id);
215     std::vector<std::string> columns = {"attendeeName", "attendeeEmail"};
216     DataShare::DatashareBusinessError error;
217     auto result = DataShareHelperManager::GetInstance().Query(*(m_attendeeUri.get()), predicates, columns, &error);
218     std::vector<Attendee> attendees;
219     ResultSetToAttendees(attendees, result);
220     LOG_INFO(" query attendee finished");
221     return attendees;
222 }
223 
GetRemindersByEventId(int id)224 std::optional<std::vector<int>> Calendar::GetRemindersByEventId(int id)
225 {
226     DataShare::DataSharePredicates predicates;
227     predicates.EqualTo("event_id", id);
228     std::vector<std::string> columns = {"event_id", "minutes"};
229     DataShare::DatashareBusinessError error;
230     auto result = DataShareHelperManager::GetInstance().Query(*(m_reminderUrl.get()), predicates, columns, &error);
231     std::vector<int> reminders;
232     auto ret = ResultSetToReminders(reminders, result);
233     if (ret != DataShare::E_OK) {
234         return std::nullopt;
235     }
236     LOG_INFO("query reminder finished");
237     return reminders;
238 }
239 
GetEvents(std::shared_ptr<EventFilter> filter,const std::vector<string> & eventKey)240 std::vector<Event> Calendar::GetEvents(std::shared_ptr<EventFilter> filter, const std::vector<string>& eventKey)
241 {
242     std::vector<Event> events;
243     std::shared_ptr<DataShare::DataSharePredicates> predicates = nullptr;
244     if (filter) {
245         predicates = filter->GetFilterPrediacates();
246         if (!predicates) {
247             LOG_ERROR("predicates null");
248             return events;
249         }
250     } else {
251         predicates = std::make_shared<DataShare::DataSharePredicates>();
252     }
253     predicates->EqualTo("calendar_id", GetId());
254     std::vector<string> queryField = {};
255     std::set<string> resultSetField;
256     if (eventKey.size() > 0) {
257         queryField.emplace_back("_id");
258         setField(eventKey, queryField, resultSetField);
259     } else {
260         resultSetField = {"type", "title", "startTime", "endTime", "isAllDay", "description",
261                           "timeZone", "location", "service", "attendee", "reminderTime"};
262     }
263     DataShare::DatashareBusinessError error;
264     auto result = DataShareHelperManager::GetInstance().Query(*(m_eventUri.get()),
265         *(predicates.get()), queryField, &error);
266     if (!result) {
267         LOG_ERROR("query failed");
268         return events;
269     }
270     ResultSetToEvents(events, result, resultSetField);
271     for (auto &event : events) {
272         const auto eventId = event.id.value();
273         if (resultSetField.count("attendee")) {
274             event.attendees = GetAttendeesByEventId(eventId);
275         }
276         if (resultSetField.count("reminderTime")) {
277             event.reminderTime = GetRemindersByEventId(eventId);
278         }
279         DumpEvent(event);
280     }
281     LOG_INFO("query finished");
282     return events;
283 }
284 
GetConfig()285 CalendarConfig Calendar::GetConfig()
286 {
287     return m_config;
288 }
289 
SetConfig(const CalendarConfig & config)290 bool Calendar::SetConfig(const CalendarConfig& config)
291 {
292     DataShare::DataSharePredicates m_predicates;
293     m_predicates.EqualTo("_id", m_id);
294     DataShare::DataShareValuesBucket valuesBucket;
295     if (std::get_if<1>(&config.color)) {
296         valuesBucket.Put("calendar_color", std::get<1>(config.color));
297     }
298     if (config.enableReminder) {
299         valuesBucket.Put("canReminder", config.enableReminder.value());
300     }
301     if (valuesBucket.IsEmpty()) {
302         LOG_INFO("no need update");
303         return true;
304     }
305 
306     // dataShareHelper 需要提到event_handler基类里面去
307     auto ret = DataShareHelperManager::GetInstance().Update(*(m_calendarUri.get()), m_predicates, valuesBucket) == 1;
308     LOG_INFO("SetConfig %{public}d", ret);
309     if (ret) {
310         m_config = config;
311     }
312     return ret;
313 }
314 }