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     m_calendarUri = std::make_unique<Uri>(calendarUrl + bundleName_tokeId);
33 }
34 
GetInstance()35 CalendarManager &CalendarManager::GetInstance()
36 {
37     static CalendarManager instance;
38     return instance;
39 }
40 
IsDefaultAccount(const CalendarAccount &account)41 bool CalendarManager::IsDefaultAccount(const CalendarAccount &account)
42 {
43     return account.name == defaultAccount.name && account.type == defaultAccount.type;
44 }
45 
BuildValueCalendarAccount(const CalendarAccount &account)46 auto BuildValueCalendarAccount(const CalendarAccount &account)
47 {
48     DataShare::DataShareValuesBucket valuesBucket;
49     valuesBucket.Put("account_name", account.name);
50     valuesBucket.Put("account_type", account.type);
51     if (account.displayName) {
52         valuesBucket.Put("calendar_displayName", account.displayName.value());
53     }
54 
55     return valuesBucket;
56 }
57 
CreateCalendar(const CalendarAccount& account)58 std::shared_ptr<Calendar> CalendarManager::CreateCalendar(const CalendarAccount& account)
59 {
60     auto valueEvent = BuildValueCalendarAccount(account);
61     auto index = DataShareHelperManager::GetInstance().Insert(*(m_calendarUri.get()), valueEvent);
62     LOG_DEBUG("Insert index %{public}d", index);
63     if (index <= 0) {
64         LOG_ERROR("Insert failed");
65         return nullptr;
66     }
67     return std::make_shared<Calendar>(account, index);
68 }
69 
70 
BuildCalendarFilter(const CalendarAccount& account)71 DataShare::DataSharePredicates BuildCalendarFilter(const CalendarAccount& account)
72 {
73     DumpCalendarAccount(account);
74     DataShare::DataSharePredicates predicates;
75     predicates.EqualTo("account_name", account.name);
76     predicates.And();
77     predicates.EqualTo("account_type", account.type);
78     return predicates;
79 }
80 
GetCalendar(const std::optional<CalendarAccount>& account)81 std::shared_ptr<Calendar> CalendarManager::GetCalendar(const std::optional<CalendarAccount>& account)
82 {
83     DataShare::DataSharePredicates predicates;
84     if (account) {
85         predicates = BuildCalendarFilter(account.value());
86     } else {
87         LOG_WARN("get defaultAccount");
88         predicates = BuildCalendarFilter(defaultAccount);
89     }
90     std::vector<std::string> columns = {"_id", "account_name", "account_type", "calendar_displayName"};
91     DataShare::DatashareBusinessError error;
92     auto resultSet = DataShareHelperManager::GetInstance().Query(*(m_calendarUri.get()), predicates, columns, &error);
93     if (!resultSet) {
94         LOG_ERROR("query failed %{public}d, %{public}s", error.GetCode(), error.GetMessage().c_str());
95         return nullptr;
96     }
97     auto calendarSet = ResultSetToCalendars(resultSet);
98     if (calendarSet.empty()) {
99         LOG_WARN("calendarSet empty");
100         return std::make_shared<Calendar>(-1);
101     }
102     LOG_INFO("GetCalendar successed");
103     return std::move(calendarSet.at(0));
104 }
105 
GetAllCalendars()106 std::vector<std::shared_ptr<Calendar>> CalendarManager::GetAllCalendars()
107 {
108     std::vector<std::shared_ptr<Calendar>> results;
109     DataShare::DataSharePredicates predicates;
110     std::vector<std::string> columns = {"_id", "account_name", "account_type", "calendar_displayName"};
111     DataShare::DatashareBusinessError error;
112     auto queryResult = DataShareHelperManager::GetInstance().Query(*(m_calendarUri.get()), predicates, columns, &error);
113     if (!queryResult) {
114         LOG_ERROR("query failed %{public}d, %{public}s", error.GetCode(), error.GetMessage().c_str());
115         return results;
116     }
117     return ResultSetToCalendars(queryResult);
118 }
119 
120 
DeleteCalendar(const Calendar& calendar)121 bool CalendarManager::DeleteCalendar(const Calendar& calendar)
122 {
123     DataShare::DataSharePredicates predicates;
124     predicates.EqualTo("_id", calendar.GetId());
125     auto result = DataShareHelperManager::GetInstance().Delete(*(m_calendarUri.get()), predicates);
126     LOG_INFO("DeleteCalendar %{public}d", result);
127     return result == 1;
128 }
129 
DeleteAllCalendars()130 int CalendarManager::DeleteAllCalendars()
131 {
132     auto calendars = GetAllCalendars();
133     int count = 0;
134     for (const auto &calendar: calendars) {
135         if (DeleteCalendar(*calendar.get())) {
136             count +=1;
137         }
138     }
139     return count;
140 }
141 
142 }
143