• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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 "application_state_observer_stub.h"
17 #include "appexecfwk_errors.h"
18 #include "hilog_wrapper.h"
19 #include "ipc_types.h"
20 #include "iremote_object.h"
21 
22 namespace OHOS {
23 namespace AppExecFwk {
24 std::mutex ApplicationStateObserverStub::callbackMutex_;
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)25 int ApplicationStateObserverStub::OnRemoteRequest(
26     uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
27 {
28     HILOG_DEBUG("ApplicationStateObserverStub::OnReceived, code = %{public}u, flags= %{public}d.",
29         code, option.GetFlags());
30     std::u16string descriptor = ApplicationStateObserverStub::GetDescriptor();
31     std::u16string remoteDescriptor = data.ReadInterfaceToken();
32     if (descriptor != remoteDescriptor) {
33         HILOG_ERROR("local descriptor is not equal to remote.");
34         return ERR_INVALID_STATE;
35     }
36 
37     auto itFunc = memberFuncMap_.find(code);
38     if (itFunc != memberFuncMap_.end()) {
39         auto memberFunc = itFunc->second;
40         if (memberFunc != nullptr) {
41             return (this->*memberFunc)(data, reply);
42         }
43     }
44     HILOG_WARN("ApplicationStateObserverStub::OnRemoteRequest, default case, need check");
45     return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
46 }
47 
OnForegroundApplicationChanged(const AppStateData & appStateData)48 void ApplicationStateObserverStub::OnForegroundApplicationChanged(const AppStateData &appStateData)
49 {}
50 
OnAbilityStateChanged(const AbilityStateData & abilityStateData)51 void ApplicationStateObserverStub::OnAbilityStateChanged(const AbilityStateData &abilityStateData)
52 {}
53 
OnExtensionStateChanged(const AbilityStateData & abilityStateData)54 void ApplicationStateObserverStub::OnExtensionStateChanged(const AbilityStateData &abilityStateData)
55 {}
56 
OnProcessCreated(const ProcessData & processData)57 void ApplicationStateObserverStub::OnProcessCreated(const ProcessData &processData)
58 {}
59 
OnProcessStateChanged(const ProcessData & processData)60 void ApplicationStateObserverStub::OnProcessStateChanged(const ProcessData &processData)
61 {}
62 
OnProcessDied(const ProcessData & processData)63 void ApplicationStateObserverStub::OnProcessDied(const ProcessData &processData)
64 {}
65 
OnApplicationStateChanged(const AppStateData & appStateData)66 void ApplicationStateObserverStub::OnApplicationStateChanged(const AppStateData &appStateData)
67 {}
68 
OnAppStateChanged(const AppStateData & appStateData)69 void ApplicationStateObserverStub::OnAppStateChanged(const AppStateData &appStateData)
70 {}
71 
OnProcessReused(const ProcessData & processData)72 void ApplicationStateObserverStub::OnProcessReused(const ProcessData &processData)
73 {}
74 
OnAppStarted(const AppStateData & appStateData)75 void ApplicationStateObserverStub::OnAppStarted(const AppStateData &appStateData)
76 {}
77 
OnAppStopped(const AppStateData & appStateData)78 void ApplicationStateObserverStub::OnAppStopped(const AppStateData &appStateData)
79 {}
80 
OnPageShow(const PageStateData & pageStateData)81 void ApplicationStateObserverStub::OnPageShow(const PageStateData &pageStateData)
82 {}
83 
OnPageHide(const PageStateData & pageStateData)84 void ApplicationStateObserverStub::OnPageHide(const PageStateData &pageStateData)
85 {}
86 
HandleOnForegroundApplicationChanged(MessageParcel & data,MessageParcel & reply)87 int32_t ApplicationStateObserverStub::HandleOnForegroundApplicationChanged(MessageParcel &data, MessageParcel &reply)
88 {
89     std::unique_ptr<AppStateData> processData(data.ReadParcelable<AppStateData>());
90     if (!processData) {
91         HILOG_ERROR("ReadParcelable<AppStateData> failed");
92         return ERR_APPEXECFWK_PARCEL_ERROR;
93     }
94 
95     OnForegroundApplicationChanged(*processData);
96     return NO_ERROR;
97 }
98 
HandleOnAbilityStateChanged(MessageParcel & data,MessageParcel & reply)99 int32_t ApplicationStateObserverStub::HandleOnAbilityStateChanged(MessageParcel &data, MessageParcel &reply)
100 {
101     AbilityStateData* abilityStateData = nullptr;
102     {
103         std::unique_lock<std::mutex> lock(callbackMutex_);
104         abilityStateData = data.ReadParcelable<AbilityStateData>();
105         if (!abilityStateData) {
106             HILOG_ERROR("ReadParcelable<AbilityStateData> failed");
107             return ERR_APPEXECFWK_PARCEL_ERROR;
108         }
109     }
110     OnAbilityStateChanged(*abilityStateData);
111     {
112         // Protect Multi Thread Deconstruct IRemoteObject
113         std::unique_lock<std::mutex> lock(callbackMutex_);
114         delete abilityStateData;
115     }
116     return NO_ERROR;
117 }
118 
HandleOnExtensionStateChanged(MessageParcel & data,MessageParcel & reply)119 int32_t ApplicationStateObserverStub::HandleOnExtensionStateChanged(MessageParcel &data, MessageParcel &reply)
120 {
121     AbilityStateData* abilityStateData = nullptr;
122     {
123         std::unique_lock<std::mutex> lock(callbackMutex_);
124         abilityStateData = data.ReadParcelable<AbilityStateData>();
125         if (!abilityStateData) {
126             HILOG_ERROR("ReadParcelable<AbilityStateData> failed");
127             return ERR_APPEXECFWK_PARCEL_ERROR;
128         }
129     }
130     OnExtensionStateChanged(*abilityStateData);
131     {
132         // Protect Multi Thread Deconstruct IRemoteObject
133         std::unique_lock<std::mutex> lock(callbackMutex_);
134         delete abilityStateData;
135     }
136     return NO_ERROR;
137 }
138 
HandleOnProcessCreated(MessageParcel & data,MessageParcel & reply)139 int32_t ApplicationStateObserverStub::HandleOnProcessCreated(MessageParcel &data, MessageParcel &reply)
140 {
141     std::unique_ptr<ProcessData> processData(data.ReadParcelable<ProcessData>());
142     if (!processData) {
143         HILOG_ERROR("ReadParcelable<ProcessData> failed");
144         return ERR_APPEXECFWK_PARCEL_ERROR;
145     }
146 
147     OnProcessCreated(*processData);
148     return NO_ERROR;
149 }
150 
HandleOnProcessStateChanged(MessageParcel & data,MessageParcel & reply)151 int32_t ApplicationStateObserverStub::HandleOnProcessStateChanged(MessageParcel &data, MessageParcel &reply)
152 {
153     std::unique_ptr<ProcessData> processData(data.ReadParcelable<ProcessData>());
154     if (!processData) {
155         HILOG_ERROR("ReadParcelable<ProcessData> failed");
156         return ERR_APPEXECFWK_PARCEL_ERROR;
157     }
158 
159     OnProcessStateChanged(*processData);
160     return NO_ERROR;
161 }
162 
HandleOnProcessDied(MessageParcel & data,MessageParcel & reply)163 int32_t ApplicationStateObserverStub::HandleOnProcessDied(MessageParcel &data, MessageParcel &reply)
164 {
165     std::unique_ptr<ProcessData> processData(data.ReadParcelable<ProcessData>());
166     if (!processData) {
167         HILOG_ERROR("ReadParcelable<ProcessData> failed");
168         return ERR_APPEXECFWK_PARCEL_ERROR;
169     }
170 
171     OnProcessDied(*processData);
172     return NO_ERROR;
173 }
174 
HandleOnApplicationStateChanged(MessageParcel & data,MessageParcel & reply)175 int32_t ApplicationStateObserverStub::HandleOnApplicationStateChanged(MessageParcel &data, MessageParcel &reply)
176 {
177     std::unique_ptr<AppStateData> processData(data.ReadParcelable<AppStateData>());
178     if (!processData) {
179         HILOG_ERROR("ReadParcelable<AppStateData> failed");
180         return ERR_APPEXECFWK_PARCEL_ERROR;
181     }
182 
183     OnApplicationStateChanged(*processData);
184     return NO_ERROR;
185 }
186 
HandleOnAppStateChanged(MessageParcel & data,MessageParcel & reply)187 int32_t ApplicationStateObserverStub::HandleOnAppStateChanged(MessageParcel &data, MessageParcel &reply)
188 {
189     std::unique_ptr<AppStateData> processData(data.ReadParcelable<AppStateData>());
190     if (!processData) {
191         HILOG_ERROR("ReadParcelable<AppStateData> failed");
192         return ERR_APPEXECFWK_PARCEL_ERROR;
193     }
194 
195     OnAppStateChanged(*processData);
196     return NO_ERROR;
197 }
198 
OnRemoteDied(const wptr<IRemoteObject> & remote)199 void ApplicationStateObserverRecipient::OnRemoteDied(const wptr<IRemoteObject> &__attribute__((unused)) remote)
200 {
201     HILOG_DEBUG("called");
202     if (handler_) {
203         handler_(remote);
204     }
205 }
206 
HandleOnProcessReused(MessageParcel & data,MessageParcel & reply)207 int32_t ApplicationStateObserverStub::HandleOnProcessReused(MessageParcel &data, MessageParcel &reply)
208 {
209     std::unique_ptr<ProcessData> processData(data.ReadParcelable<ProcessData>());
210     if (!processData) {
211         HILOG_ERROR("ReadParcelable<ProcessData> failed");
212         return ERR_APPEXECFWK_PARCEL_ERROR;
213     }
214 
215     OnProcessReused(*processData);
216     return NO_ERROR;
217 }
218 
HandleOnAppStarted(MessageParcel & data,MessageParcel & reply)219 int32_t ApplicationStateObserverStub::HandleOnAppStarted(MessageParcel &data, MessageParcel &reply)
220 {
221     std::unique_ptr<AppStateData> processData(data.ReadParcelable<AppStateData>());
222     if (!processData) {
223         HILOG_ERROR("ReadParcelable<AppStateData> failed");
224         return ERR_APPEXECFWK_PARCEL_ERROR;
225     }
226 
227     OnAppStarted(*processData);
228     return NO_ERROR;
229 }
230 
HandleOnAppStopped(MessageParcel & data,MessageParcel & reply)231 int32_t ApplicationStateObserverStub::HandleOnAppStopped(MessageParcel &data, MessageParcel &reply)
232 {
233     std::unique_ptr<AppStateData> processData(data.ReadParcelable<AppStateData>());
234     if (!processData) {
235         HILOG_ERROR("ReadParcelable<AppStateData> failed");
236         return ERR_APPEXECFWK_PARCEL_ERROR;
237     }
238 
239     OnAppStopped(*processData);
240     return NO_ERROR;
241 }
242 
HandleOnPageShow(MessageParcel & data,MessageParcel & reply)243 int32_t ApplicationStateObserverStub::HandleOnPageShow(MessageParcel &data, MessageParcel &reply)
244 {
245     std::unique_ptr<PageStateData> pageStateData(data.ReadParcelable<PageStateData>());
246     if (!pageStateData) {
247         HILOG_ERROR("ReadParcelable<pageStateData> failed");
248         return ERR_APPEXECFWK_PARCEL_ERROR;
249     }
250 
251     OnPageShow(*pageStateData);
252     return NO_ERROR;
253 }
254 
HandleOnPageHide(MessageParcel & data,MessageParcel & reply)255 int32_t ApplicationStateObserverStub::HandleOnPageHide(MessageParcel &data, MessageParcel &reply)
256 {
257     std::unique_ptr<PageStateData> pageStateData(data.ReadParcelable<PageStateData>());
258     if (!pageStateData) {
259         HILOG_ERROR("ReadParcelable<pageStateData> failed");
260         return ERR_APPEXECFWK_PARCEL_ERROR;
261     }
262 
263     OnPageHide(*pageStateData);
264     return NO_ERROR;
265 }
266 
ApplicationStateObserverRecipient(RemoteDiedHandler handler)267 ApplicationStateObserverRecipient::ApplicationStateObserverRecipient(RemoteDiedHandler handler) : handler_(handler)
268 {}
269 
~ApplicationStateObserverRecipient()270 ApplicationStateObserverRecipient::~ApplicationStateObserverRecipient()
271 {}
272 }  // namespace AppExecFwk
273 }  // namespace OHOS
274