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_manager.h"
17 #include "data_share_helper_manager.h"
18 #include "calendar_env.h"
19 #include "calendar_log.h"
20 #include "native_util.h"
21
22 namespace OHOS::CalendarApi::Native {
23 DataShare::DataSharePredicates BuildCalendarFilter(const CalendarAccount& account);
24 const CalendarAccount defaultAccount {"phone", "local", ""};
25 const string calendarUrl = "datashare:///calendardata/Calendars";
26
CalendarManager()27 CalendarManager::CalendarManager()
28 {
29 uint64_t tokenId = CalendarEnv::GetInstance().GetTokenId();
30 auto bumdleName = CalendarEnv::GetInstance().GetBundleName();
31 auto bundleName_tokeId = "?bundleName=" + bumdleName + "&tokenId=" + std::to_string(tokenId);
32 LOG_INFO("bundleName_tokeId: %{public}s", bundleName_tokeId.c_str());
33 m_calendarUri = std::make_unique<Uri>(calendarUrl + bundleName_tokeId);
34 }
35
GetInstance()36 CalendarManager &CalendarManager::GetInstance()
37 {
38 static CalendarManager instance;
39 return instance;
40 }
41
IsDefaultAccount(const CalendarAccount & account)42 bool CalendarManager::IsDefaultAccount(const CalendarAccount &account)
43 {
44 return account.name == defaultAccount.name && account.type == defaultAccount.type;
45 }
46
BuildValueCalendarAccount(const CalendarAccount & account)47 auto BuildValueCalendarAccount(const CalendarAccount &account)
48 {
49 DataShare::DataShareValuesBucket valuesBucket;
50 valuesBucket.Put("account_name", account.name);
51 valuesBucket.Put("account_type", account.type);
52 if (account.displayName) {
53 valuesBucket.Put("calendar_displayName", account.displayName.value());
54 }
55
56 return valuesBucket;
57 }
58
CreateCalendar(const CalendarAccount & account)59 std::shared_ptr<Calendar> CalendarManager::CreateCalendar(const CalendarAccount& account)
60 {
61 DataShare::DataSharePredicates predicates = BuildCalendarFilter(account);
62 std::vector<std::string> columns = {"_id", "account_name", "account_type", "calendar_displayName"};
63 DataShare::DatashareBusinessError error;
64 auto resultSet = DataShareHelperManager::GetInstance().Query(*(m_calendarUri.get()), predicates, columns, &error);
65 if (resultSet) {
66 auto calendarSet = ResultSetToCalendars(resultSet);
67 if (!calendarSet.empty()) {
68 LOG_INFO("already exist");
69 return std::make_shared<Calendar>(calendarSet.at(0)->GetAccount(), calendarSet.at(0)->GetId());
70 }
71 }
72 auto valueEvent = BuildValueCalendarAccount(account);
73 auto index = DataShareHelperManager::GetInstance().Insert(*(m_calendarUri.get()), valueEvent);
74 LOG_DEBUG("Insert index %{public}d", index);
75 if (index <= 0) {
76 LOG_ERROR("Insert failed");
77 return nullptr;
78 }
79 return std::make_shared<Calendar>(account, index);
80 }
81
82
BuildCalendarFilter(const CalendarAccount & account)83 DataShare::DataSharePredicates BuildCalendarFilter(const CalendarAccount& account)
84 {
85 DumpCalendarAccount(account);
86 DataShare::DataSharePredicates predicates;
87 predicates.EqualTo("account_name", account.name);
88 predicates.And();
89 predicates.EqualTo("account_type", account.type);
90 return predicates;
91 }
92
GetCalendar(const std::optional<CalendarAccount> & account)93 std::shared_ptr<Calendar> CalendarManager::GetCalendar(const std::optional<CalendarAccount>& account)
94 {
95 DataShare::DataSharePredicates predicates;
96 if (account) {
97 predicates = BuildCalendarFilter(account.value());
98 } else {
99 LOG_WARN("get defaultAccount");
100 predicates = BuildCalendarFilter(defaultAccount);
101 }
102 std::vector<std::string> columns = {"_id", "account_name", "account_type", "calendar_displayName"};
103 DataShare::DatashareBusinessError error;
104 auto resultSet = DataShareHelperManager::GetInstance().Query(*(m_calendarUri.get()), predicates, columns, &error);
105 if (!resultSet) {
106 LOG_ERROR("query failed %{public}d, %{public}s", error.GetCode(), error.GetMessage().c_str());
107 return nullptr;
108 }
109 auto calendarSet = ResultSetToCalendars(resultSet);
110 if (calendarSet.empty()) {
111 LOG_WARN("calendarSet empty");
112 return nullptr;
113 }
114 LOG_INFO("GetCalendar successed");
115 return std::move(calendarSet.at(0));
116 }
117
GetAllCalendars()118 std::vector<std::shared_ptr<Calendar>> CalendarManager::GetAllCalendars()
119 {
120 std::vector<std::shared_ptr<Calendar>> results;
121 DataShare::DataSharePredicates predicates;
122 std::vector<std::string> columns = {"_id", "account_name", "account_type", "calendar_displayName"};
123 DataShare::DatashareBusinessError error;
124 auto queryResult = DataShareHelperManager::GetInstance().Query(*(m_calendarUri.get()), predicates, columns, &error);
125 if (!queryResult) {
126 LOG_ERROR("query failed %{public}d, %{public}s", error.GetCode(), error.GetMessage().c_str());
127 return results;
128 }
129 return ResultSetToCalendars(queryResult);
130 }
131
132
DeleteCalendar(const Calendar & calendar)133 bool CalendarManager::DeleteCalendar(const Calendar& calendar)
134 {
135 DataShare::DataSharePredicates predicates;
136 predicates.EqualTo("_id", calendar.GetId());
137 auto result = DataShareHelperManager::GetInstance().Delete(*(m_calendarUri.get()), predicates);
138 LOG_INFO("DeleteCalendar %{public}d", result);
139 return result == 1;
140 }
141
DeleteAllCalendars()142 int CalendarManager::DeleteAllCalendars()
143 {
144 auto calendars = GetAllCalendars();
145 int count = 0;
146 for (const auto &calendar: calendars) {
147 if (DeleteCalendar(*calendar.get())) {
148 count +=1;
149 }
150 }
151 return count;
152 }
153
154 }
155