• 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 
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     LOG_INFO("DeleteEvent number %{public}d", ret);
134     {
135         // delete attendee
136         DataShare::DataSharePredicates predicates;
137         predicates.EqualTo("event_id", id);
138         auto ret = DataShareHelperManager::GetInstance().Delete(*(m_attendeeUri.get()), predicates);
139         LOG_INFO("Delete attendee num %{public}d", ret);
140     }
141     {
142         // delete reminder
143         DataShare::DataSharePredicates predicates;
144         predicates.EqualTo("event_id", id);
145         auto ret = DataShareHelperManager::GetInstance().Delete(*(m_reminderUrl.get()), predicates);
146         LOG_INFO("Delete reminder num %{public}d", ret);
147     }
148     return ret == 1;
149 }
150 
DeleteAllEvents()151 void Calendar::DeleteAllEvents()
152 {
153     DataShare::DataSharePredicates predicates;
154     predicates.EqualTo("_id", GetId());
155     auto ret = DataShareHelperManager::GetInstance().Delete(*(m_eventUri.get()), predicates);
156     LOG_INFO("DeleteEvent number %{public}d", ret);
157     return;
158 }
159 
DeleteEvents(const std::vector<int> & ids)160 int Calendar::DeleteEvents(const std::vector<int>& ids)
161 {
162     int count = 0;
163     for (const auto &id : ids) {
164         if (DeleteEvent(id)) {
165             count +=1;
166         }
167     }
168     LOG_INFO("DeleteEvents %{public}d", count);
169     return count;
170 }
171 
UpdateEvent(const Event & event)172 bool Calendar::UpdateEvent(const Event& event)
173 {
174     if (!event.id) {
175         LOG_ERROR("event id not exist");
176         return false;
177     }
178     const auto eventId = event.id.value();
179     DataShare::DataSharePredicates m_predicates;
180     m_predicates.EqualTo("_id", eventId);
181     auto valueEvent = BuildValueEvent(event, m_id, 0);
182     auto ret = DataShareHelperManager::GetInstance().Update(*(m_eventUri.get()), m_predicates, valueEvent);
183     LOG_INFO(" Update code %{public}d", ret);
184     {
185         // delete attendee
186         DataShare::DataSharePredicates predicates;
187         predicates.EqualTo("event_id", eventId);
188         auto ret = DataShareHelperManager::GetInstance().Delete(*(m_attendeeUri.get()), predicates);
189         LOG_INFO("Delete attendee num %{public}d", ret);
190     }
191     auto valueAttendees = std::vector<DataShare::DataShareValuesBucket>();
192     for (const auto &attendee : event.attendees) {
193         auto valueAttendee = BuildAttendeeValue(attendee, eventId);
194         valueAttendees.emplace_back(valueAttendee);
195     }
196     if (valueAttendees.size() > 0) {
197         auto count = DataShareHelperManager::GetInstance().BatchInsert(*(m_attendeeUri.get()), valueAttendees);
198         LOG_INFO("batchInsert attendees count %{public}d", count);
199     }
200 
201     {
202         // delete reminder
203         DataShare::DataSharePredicates predicates;
204         predicates.EqualTo("event_id", eventId);
205         auto ret = DataShareHelperManager::GetInstance().Delete(*(m_reminderUrl.get()), predicates);
206         LOG_INFO("Delete reminder num %{public}d", ret);
207     }
208     if (event.reminderTime.has_value()) {
209         InsertReminders(eventId, event.reminderTime.value());
210     }
211 
212     return ret == 1;
213 }
214 
UpdateEvents(const std::vector<Event> & events)215 int Calendar::UpdateEvents(const std::vector<Event>& events)
216 {
217     int count = 0;
218     for (const auto &event : events) {
219         if (UpdateEvent(event)) {
220             count +=1;
221         }
222     }
223     LOG_INFO("UpdateEvents %{public}d", count);
224     return count;
225 }
226 
GetAttendeesByEventId(int id)227 std::vector<Attendee> Calendar::GetAttendeesByEventId(int id)
228 {
229     DataShare::DataSharePredicates predicates;
230     predicates.EqualTo("event_id", id);
231     std::vector<std::string> columns = {"attendeeName", "attendeeEmail", "attendeeRelationship"};
232     DataShare::DatashareBusinessError error;
233     auto result = DataShareHelperManager::GetInstance().Query(*(m_attendeeUri.get()), predicates, columns, &error);
234     std::vector<Attendee> attendees;
235     if (result != nullptr) {
236         ResultSetToAttendees(attendees, result);
237     }
238     LOG_INFO(" query attendee finished");
239     return attendees;
240 }
241 
GetRemindersByEventId(int id)242 std::optional<std::vector<int>> Calendar::GetRemindersByEventId(int id)
243 {
244     DataShare::DataSharePredicates predicates;
245     predicates.EqualTo("event_id", id);
246     std::vector<std::string> columns = {"event_id", "minutes"};
247     DataShare::DatashareBusinessError error;
248     auto result = DataShareHelperManager::GetInstance().Query(*(m_reminderUrl.get()), predicates, columns, &error);
249     if (result == nullptr) {
250         return std::nullopt;
251     }
252     std::vector<int> reminders;
253     auto ret = ResultSetToReminders(reminders, result);
254     if (ret != DataShare::E_OK) {
255         return std::nullopt;
256     }
257     LOG_INFO("query reminder finished");
258     return reminders;
259 }
260 
GetEvents(std::shared_ptr<EventFilter> filter,const std::vector<string> & eventKey)261 std::vector<Event> Calendar::GetEvents(std::shared_ptr<EventFilter> filter, const std::vector<string>& eventKey)
262 {
263     std::vector<Event> events;
264     std::shared_ptr<DataShare::DataSharePredicates> predicates = nullptr;
265     if (filter) {
266         predicates = filter->GetFilterPrediacates();
267         if (!predicates) {
268             LOG_ERROR("predicates null");
269             return events;
270         }
271     } else {
272         predicates = std::make_shared<DataShare::DataSharePredicates>();
273     }
274     predicates->EqualTo("calendar_id", GetId());
275     std::vector<string> queryField = {};
276     std::set<string> resultSetField;
277     if (eventKey.size() > 0) {
278         queryField.emplace_back("_id");
279         SetField(eventKey, queryField, resultSetField);
280     } else {
281         resultSetField = {"type", "title", "startTime", "endTime", "isAllDay", "description",
282         "timeZone", "location", "service", "attendee", "reminderTime"};
283     }
284     DataShare::DatashareBusinessError error;
285     auto result = DataShareHelperManager::GetInstance().Query(*(m_eventUri.get()),
286         *(predicates.get()), queryField, &error);
287     if (!result) {
288         LOG_ERROR("query failed");
289         return events;
290     }
291     ResultSetToEvents(events, result, resultSetField);
292     for (auto &event : events) {
293         const auto eventId = event.id.value();
294         if (resultSetField.count("attendee")) {
295             event.attendees = GetAttendeesByEventId(eventId);
296         }
297         if (resultSetField.count("reminderTime")) {
298             event.reminderTime = GetRemindersByEventId(eventId);
299         }
300         DumpEvent(event);
301     }
302     LOG_INFO("query finished");
303     return events;
304 }
305 
GetConfig()306 CalendarConfig Calendar::GetConfig()
307 {
308     return m_config;
309 }
310 
SetConfig(const CalendarConfig & config)311 bool Calendar::SetConfig(const CalendarConfig& config)
312 {
313     DataShare::DataSharePredicates m_predicates;
314     m_predicates.EqualTo("_id", m_id);
315     DataShare::DataShareValuesBucket valuesBucket;
316     if (std::get_if<1>(&config.color)) {
317         valuesBucket.Put("calendar_color", std::get<1>(config.color));
318     }
319     if (config.enableReminder) {
320         valuesBucket.Put("canReminder", config.enableReminder.value());
321     }
322     if (valuesBucket.IsEmpty()) {
323         LOG_INFO("no need update");
324         return true;
325     }
326 
327     // dataShareHelper 需要提到event_handler基类里面去
328     auto ret = DataShareHelperManager::GetInstance().Update(*(m_calendarUri.get()), m_predicates, valuesBucket) == 1;
329     LOG_INFO("SetConfig %{public}d", ret);
330     if (ret) {
331         m_config = config;
332     }
333     return ret;
334 }
335 }