• 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_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 const int MAX_ERR_NUM = 3;
27 
CalendarManager()28 CalendarManager::CalendarManager()
29 {
30     uint64_t tokenId = CalendarEnv::GetInstance().GetTokenId();
31     auto bumdleName = CalendarEnv::GetInstance().GetBundleName();
32     auto bundleName_tokeId = "?bundleName=" + bumdleName + "&tokenId=" + std::to_string(tokenId);
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     auto valueEvent = BuildValueCalendarAccount(account);
62     int errNum = 0;
63     int index = 0;
64     do {
65         index = DataShareHelperManager::GetInstance().Insert(*(m_calendarUri.get()), valueEvent);
66         if (index <= 0) {
67             LOG_WARN("Insert index %{public}d", index);
68             LOG_WARN("Insert indexNum %{public}d", errNum);
69             errNum++;
70         } else {
71             break;
72         }
73     } while (errNum > 0 && errNum <= MAX_ERR_NUM);
74     if (index <= 0) {
75         LOG_ERROR("Insert failed");
76         return nullptr;
77     }
78     return std::make_shared<Calendar>(account, index);
79 }
80 
BuildCalendarFilter(const CalendarAccount & account)81 DataShare::DataSharePredicates BuildCalendarFilter(const CalendarAccount &account)
82 {
83     DumpCalendarAccount(account);
84     DataShare::DataSharePredicates predicates;
85     predicates.EqualTo("account_name", account.name);
86     predicates.And();
87     predicates.EqualTo("account_type", account.type);
88     return predicates;
89 }
90 
GetCalendar(const std::optional<CalendarAccount> & account)91 std::shared_ptr<Calendar> CalendarManager::GetCalendar(const std::optional<CalendarAccount> &account)
92 {
93     DataShare::DataSharePredicates predicates;
94     if (account) {
95         predicates = BuildCalendarFilter(account.value());
96     } else {
97         LOG_WARN("get defaultAccount");
98         predicates = BuildCalendarFilter(defaultAccount);
99     }
100     std::vector<std::string> columns = {"_id", "account_name", "account_type", "calendar_displayName"};
101     DataShare::DatashareBusinessError error;
102     auto resultSet = DataShareHelperManager::GetInstance().Query(*(m_calendarUri.get()), predicates, columns, &error);
103     if (!resultSet) {
104         LOG_ERROR("query failed %{public}d, %{public}s", error.GetCode(), error.GetMessage().c_str());
105         return nullptr;
106     }
107     auto calendarSet = ResultSetToCalendars(resultSet);
108     if (calendarSet.empty()) {
109         LOG_WARN("calendarSet empty");
110         return std::make_shared<Calendar>(-1);
111     }
112     LOG_INFO("GetCalendar successed");
113     return std::move(calendarSet.at(0));
114 }
115 
GetAllCalendars()116 std::vector<std::shared_ptr<Calendar>> CalendarManager::GetAllCalendars()
117 {
118     std::vector<std::shared_ptr<Calendar>> results;
119     DataShare::DataSharePredicates predicates;
120     std::vector<std::string> columns = {"_id", "account_name", "account_type", "calendar_displayName"};
121     DataShare::DatashareBusinessError error;
122     auto queryResult = DataShareHelperManager::GetInstance().Query(*(m_calendarUri.get()), predicates, columns, &error);
123     if (!queryResult) {
124         LOG_ERROR("query failed %{public}d, %{public}s", error.GetCode(), error.GetMessage().c_str());
125         return results;
126     }
127     return ResultSetToCalendars(queryResult);
128 }
129 
DeleteCalendar(const Calendar & calendar)130 bool CalendarManager::DeleteCalendar(const Calendar &calendar)
131 {
132     DataShare::DataSharePredicates predicates;
133     predicates.EqualTo("_id", calendar.GetId());
134     int errNum = 0;
135     int result = 0;
136     do {
137         result = DataShareHelperManager::GetInstance().Delete(*(m_calendarUri.get()), predicates);
138         if (result <= 0) {
139             LOG_WARN("DeleteCalendar %{public}d", result);
140             LOG_WARN("DeleteCalendarNum %{public}d", errNum);
141             errNum++;
142         } else {
143             break;
144         }
145     } while (errNum > 0 && errNum <= MAX_ERR_NUM);
146     return result == 1;
147 }
148 
DeleteAllCalendars()149 int CalendarManager::DeleteAllCalendars()
150 {
151     auto calendars = GetAllCalendars();
152     int count = 0;
153     for (const auto &calendar : calendars) {
154         if (DeleteCalendar(*calendar.get())) {
155             count += 1;
156         }
157     }
158     return count;
159 }
160 
161 }  // namespace OHOS::CalendarApi::Native
162