• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }