1 /* 2 * Copyright (c) 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 #ifndef OHOS_ABILITY_ABILITY_TRANSACTION_CALLBACK_INFO_H 17 #define OHOS_ABILITY_ABILITY_TRANSACTION_CALLBACK_INFO_H 18 19 #include <memory> 20 #include <stack> 21 #include "lifecycle_state_info.h" 22 23 namespace OHOS { 24 namespace AppExecFwk { 25 template<typename T = void> 26 class AbilityTransactionCallbackInfo { 27 public: 28 using CallbackFunc = std::function<void(T&)>; 29 Create()30 static AbilityTransactionCallbackInfo *Create() 31 { 32 return new(std::nothrow) AbilityTransactionCallbackInfo(); 33 } 34 Destroy(AbilityTransactionCallbackInfo * callbackInfo)35 static void Destroy(AbilityTransactionCallbackInfo *callbackInfo) 36 { 37 delete callbackInfo; 38 } 39 Push(const CallbackFunc & callback)40 void Push(const CallbackFunc &callback) 41 { 42 callbackStack_.push(callback); 43 } 44 Call(T & callbackResult)45 void Call(T &callbackResult) 46 { 47 while (!callbackStack_.empty()) { 48 CallbackFunc &callbackFunc = callbackStack_.top(); 49 callbackFunc(callbackResult); 50 callbackStack_.pop(); 51 } 52 } 53 54 private: 55 AbilityTransactionCallbackInfo() = default; 56 57 ~AbilityTransactionCallbackInfo() = default; 58 59 std::stack<CallbackFunc> callbackStack_ {}; 60 }; 61 62 template<> 63 class AbilityTransactionCallbackInfo<void> { 64 public: 65 using CallbackFunc = std::function<void()>; 66 Create()67 static AbilityTransactionCallbackInfo *Create() 68 { 69 return new(std::nothrow) AbilityTransactionCallbackInfo(); 70 } 71 Destroy(AbilityTransactionCallbackInfo * callbackInfo)72 static void Destroy(AbilityTransactionCallbackInfo *callbackInfo) 73 { 74 delete callbackInfo; 75 } 76 Push(const CallbackFunc & callback)77 void Push(const CallbackFunc &callback) 78 { 79 callbackStack_.push(callback); 80 } 81 Call()82 void Call() 83 { 84 while (!callbackStack_.empty()) { 85 CallbackFunc &callbackFunc = callbackStack_.top(); 86 callbackFunc(); 87 callbackStack_.pop(); 88 } 89 } 90 91 private: 92 AbilityTransactionCallbackInfo() = default; 93 94 ~AbilityTransactionCallbackInfo() = default; 95 96 std::stack<CallbackFunc> callbackStack_ {}; 97 }; 98 } // namespace AppExecFwk 99 } // namespace OHOS 100 #endif // OHOS_ABILITY_ABILITY_TRANSACTION_CALLBACK_INFO_H 101