1 /*
2 * Copyright (c) 2025 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 #include "ability_runtime/cj_ability_context.h"
16 #include "calendar_manager_ffi.h"
17 #include "cj_calendar_manager.h"
18 #include "cj_calendar.h"
19 #include "cj_event_filter.h"
20 #include "native/ffi_remote_data.h"
21 #include "ipc_skeleton.h"
22 #include "calendar_log.h"
23 #include "cj_native_calendar.h"
24 #include "cj_native_util.h"
25 #include "cj_native_calendar_manager.h"
26 #include "cj_calendar_env.h"
27 #include "calendar_env.h"
28 #include "ui_content.h"
29
30 using namespace OHOS;
31 using namespace OHOS::AbilityRuntime;
32 using namespace OHOS::CalendarApi;
33 using namespace OHOS::FFI;
34 using namespace OHOS::DataShare;
35 using namespace OHOS::AppExecFwk;
36 static const int INVALID_EVENT_ID = -1;
37
38 namespace OHOS {
39 namespace CalendarApi {
GetCalendarManager(int64_t contextId,int32_t * errcode)40 void CJCalendarManager::GetCalendarManager(int64_t contextId, int32_t* errcode)
41 {
42 sptr<CJAbilityContext> context = OHOS::FFI::FFIData::GetData<CJAbilityContext>(contextId);
43 if (context == nullptr) {
44 LOG_ERROR("Context is nullptr");
45 *errcode = CJ_ERR_NULL_PTR;
46 return;
47 }
48
49 OHOS::CalendarApi::CJCalendarEnv::GetInstance().Init(context->GetAbilityContext());
50 }
51
CreateCalendar(CCalendarAccount calendarAccount,int64_t * calendarId,int32_t * errcode)52 int64_t CJCalendarManager::CreateCalendar(CCalendarAccount calendarAccount, int64_t* calendarId, int32_t* errcode)
53 {
54 CalendarAccount account;
55 account.name = calendarAccount.name;
56 account.type = calendarAccount.type;
57 account.displayName = calendarAccount.displayName;
58
59 auto calendar_ = Native::CJNativeCalendarManager::GetInstance().CreateCalendar(account);
60 if (calendar_ == nullptr) {
61 LOG_ERROR("calendar_ is nullptr");
62 *errcode = CJ_ERR_NULL_PTR;
63 return -1;
64 }
65 *calendarId = calendar_->GetId();
66 auto instance = OHOS::FFI::FFIData::Create<CJCalendar>(calendar_);
67 return instance->GetID();
68 }
69
DeleteCalendar(int64_t calendarId,int32_t * errcode)70 void CJCalendarManager::DeleteCalendar(int64_t calendarId, int32_t* errcode)
71 {
72 auto instance = FFIData::GetData<CJCalendar>(calendarId);
73 if (instance == nullptr) {
74 LOG_ERROR("CJCalendar is nullptr");
75 *errcode = CJ_ERR_ILLEGAL_INSTANCE;
76 return;
77 }
78 auto nativeCalendar = instance->GetNative();
79 if (nativeCalendar == nullptr) {
80 LOG_ERROR("nativeCalendar is nullptr");
81 *errcode = CJ_ERR_NULL_PTR;
82 return;
83 }
84
85 bool result = Native::CJNativeCalendarManager::GetInstance().DeleteCalendar(*(nativeCalendar.get()));
86 if (!result) {
87 LOG_ERROR("deleteCalendar failed");
88 *errcode = CJ_ERR_NULL_PTR;
89 return;
90 }
91 }
92
GetCalendar(CCalendarAccount calendarAccount,int64_t * calendarId,int32_t * errcode)93 int64_t CJCalendarManager::GetCalendar(CCalendarAccount calendarAccount, int64_t* calendarId, int32_t* errcode)
94 {
95 CalendarAccount account;
96 account.name = calendarAccount.name;
97 account.type = calendarAccount.type;
98 account.displayName = calendarAccount.displayName;
99 auto calendar_ = Native::CJNativeCalendarManager::GetInstance().GetCalendar(account);
100 if (calendar_ == nullptr) {
101 LOG_ERROR("calendar_ is nullptr");
102 *errcode = CJ_ERR_NULL_PTR;
103 return -1;
104 }
105 *calendarId = calendar_->GetId();
106 auto instance = OHOS::FFI::FFIData::Create<CJCalendar>(calendar_);
107 return instance->GetID();
108 }
109
GetAllCalendars(int32_t * errcode)110 CArrI64 CJCalendarManager::GetAllCalendars(int32_t* errcode)
111 {
112 std::vector<int64_t> calendarIds;
113 auto nativeCalendars = Native::CJNativeCalendarManager::GetInstance().GetAllCalendars();
114 CArrI64 ret = {.head = nullptr, .size = 0};
115 if (nativeCalendars.empty()) {
116 LOG_ERROR("nativeCalendars is empty");
117 *errcode = CJ_ERR_OUT_OF_MEMORY;
118 return ret;
119 }
120 auto size = nativeCalendars.size();
121 if (size == 0 || size > (SIZE_MAX * sizeof(int64_t))) {
122 LOG_ERROR("Invalid size for memory allocation");
123 *errcode = CJ_ERR_OUT_OF_MEMORY;
124 return ret;
125 }
126 auto arr = static_cast<int64_t*>(malloc(size * sizeof(int64_t)*size));
127 if (arr == nullptr) {
128 LOG_ERROR("arr is nullptr");
129 *errcode = CJ_ERR_OUT_OF_MEMORY;
130 return ret;
131 }
132
133 int64_t i = 0;
134 for (auto &nativeCalendar : nativeCalendars) {
135 int64_t calendarId = nativeCalendar->GetId();
136 arr[i] = calendarId;
137 i++;
138 }
139 ret.head = arr;
140 ret.size = static_cast<int64_t>(size);
141 return ret;
142 }
143
GetAbilityContext(int32_t * errcode)144 std::shared_ptr<AbilityRuntime::AbilityContext> CJCalendarManager::GetAbilityContext(int32_t* errcode)
145 {
146 auto aContext = CJCalendarEnv::GetInstance().getContext();
147 if (aContext == nullptr) {
148 LOG_ERROR("aContext is nullptr");
149 *errcode = CJ_ERR_NULL_PTR;
150 }
151 auto abilityContext = OHOS::AbilityRuntime::Context::ConvertTo<AbilityRuntime::AbilityContext>(aContext);
152 if (abilityContext == nullptr) {
153 LOG_ERROR("abilityContext is nullptr");
154 *errcode = CJ_ERR_NULL_PTR;
155 }
156 return abilityContext;
157 }
158
EditerEvent(char * eventstr,int32_t * errcode)159 int64_t CJCalendarManager::EditerEvent(char* eventstr, int32_t* errcode)
160 {
161 int32_t _sessionId = 0;
162 std::string event = eventstr;
163 int64_t id = 0;
164 auto ctx = CJCalendarManager::GetAbilityContext(errcode);
165 if (ctx == nullptr) {
166 *errcode = CJ_ERR_NULL_PTR;
167 return INVALID_EVENT_ID;
168 }
169 auto _uiContent = ctx->GetUIContent();
170 if (_uiContent == nullptr) {
171 *errcode = CJ_ERR_NULL_PTR;
172 return INVALID_EVENT_ID;
173 }
174 AAFwk::Want want;
175 want.SetElementName("com.ohos.calendardata", "EditorUIExtensionAbility");
176 const std::string uiExtType = "sys/commonUI";
177 want.SetParam("ability.want.params.uiExtensionType", uiExtType);
178 want.SetParam("event", event);
179 Ace::ModalUIExtensionCallbacks callbacks;
180 callbacks = {
181 .onRelease = [_uiContent, _sessionId](int32_t code) {
182 _uiContent->CloseModalUIExtension(_sessionId);
183 },
184 .onResult = [_uiContent, _sessionId, &id](int32_t code, const AAFwk::Want &wantRes) {
185 auto eventId = wantRes.GetIntParam("eventId", INVALID_EVENT_ID);
186 id = static_cast<int64_t>(eventId);
187 },
188 .onReceive = [_uiContent, _sessionId](const AAFwk::WantParams &wantParams) {
189 LOG_INFO("editEvent onReceive.");
190 },
191 .onError = [_uiContent, _sessionId](int32_t code, const std::string &event, const std::string &msg) {
192 _uiContent->CloseModalUIExtension(_sessionId);
193 },
194 .onRemoteReady = [_uiContent, _sessionId](const std::shared_ptr<Ace::ModalUIExtensionProxy> &proxy) {
195 LOG_INFO("editEvent onRemoteReady.");
196 },
197 .onDestroy = [_uiContent, _sessionId]{
198 LOG_INFO("editEvent onDestroy.");
199 },
200 };
201 Ace::ModalUIExtensionConfig config = {
202 .isProhibitBack = false,
203 };
204 _sessionId = _uiContent->CreateModalUIExtension(want, callbacks, config);
205 return id;
206 }
207
208 }
209 }