1 /*
2 * Copyright (c) 2021 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 "stoperator.h"
16 #include <cstring>
17
18 namespace STtools {
19 using std::string;
20
PushOperatorInVector(std::vector<string> & vectorOperator,StOperator & ParentOperator)21 void PushOperatorInVector(std::vector<string> &vectorOperator, StOperator &ParentOperator)
22 {
23 vectorOperator.emplace_back(std::to_string(ParentOperator.GetChildOperator().size()));
24 vectorOperator.emplace_back(ParentOperator.GetAbilityType());
25 vectorOperator.emplace_back(ParentOperator.GetBundleName());
26 vectorOperator.emplace_back(ParentOperator.GetAbilityName());
27 vectorOperator.emplace_back(ParentOperator.GetOperatorName());
28 vectorOperator.emplace_back(ParentOperator.GetMessage());
29 for (auto child : ParentOperator.GetChildOperator()) {
30 PushOperatorInVector(vectorOperator, *child);
31 }
32 }
33
SerializationStOperatorToVector(StOperator & ParentOperator)34 std::vector<string> SerializationStOperatorToVector(StOperator &ParentOperator)
35 {
36 std::vector<string> vectorOperator;
37 PushOperatorInVector(vectorOperator, ParentOperator);
38 return vectorOperator;
39 }
40
PullOperatorFromVector(StOperator & ParentOperator,std::vector<string> & vectorOperator)41 void PullOperatorFromVector(StOperator &ParentOperator, std::vector<string> &vectorOperator)
42 {
43 int childnum = std::stoi(vectorOperator.front());
44 vectorOperator.erase(vectorOperator.begin());
45 string abilityType = vectorOperator.front();
46 vectorOperator.erase(vectorOperator.begin());
47 string bundleName = vectorOperator.front();
48 vectorOperator.erase(vectorOperator.begin());
49 string abilityName = vectorOperator.front();
50 vectorOperator.erase(vectorOperator.begin());
51 string operatorName = vectorOperator.front();
52 vectorOperator.erase(vectorOperator.begin());
53 string message = vectorOperator.front();
54 vectorOperator.erase(vectorOperator.begin());
55 ParentOperator.SetAbilityType(abilityType)
56 .SetBundleName(bundleName)
57 .SetAbilityName(abilityName)
58 .SetOperatorName(operatorName)
59 .SetMessage(message);
60 for (int i = 0; i < childnum; i++) {
61 auto child = std::make_shared<StOperator>();
62 if (child == nullptr) {
63 return;
64 }
65 ParentOperator.AddChildOperator(child);
66 PullOperatorFromVector(*(child.get()), vectorOperator);
67 }
68 }
69
DeserializationStOperatorFromVector(StOperator & ParentOperator,std::vector<string> & vectorOperator)70 void DeserializationStOperatorFromVector(StOperator &ParentOperator, std::vector<string> &vectorOperator)
71 {
72 PullOperatorFromVector(ParentOperator, vectorOperator);
73 }
74
75 int StOperator::countChild = 0;
76
StOperator()77 StOperator::StOperator()
78 : g_parentOperator(nullptr), g_abilityType("0"),
79 g_bundleName(""), g_abilityName(""), g_operatorName(""), g_message("")
80 {
81 g_childOperator.clear();
82 StOperator::countChild++;
83 }
84
StOperator(const string & type,const string & bundle,const string & ability,const string & operatorName,const string & message)85 StOperator::StOperator(
86 const string &type, const string &bundle, const string &ability, const string &operatorName, const string &message)
87 : g_parentOperator(nullptr),
88 g_abilityType(type),
89 g_bundleName(bundle),
90 g_abilityName(ability),
91 g_operatorName(operatorName),
92 g_message("")
93 {
94 g_childOperator.clear();
95 StOperator::countChild++;
96 }
97
~StOperator()98 StOperator::~StOperator()
99 {
100 g_childOperator.clear();
101 StOperator::countChild--;
102 }
103
GetCountChild()104 int StOperator::GetCountChild()
105 {
106 return StOperator::countChild;
107 }
108
GetAbilityType()109 string StOperator::GetAbilityType()
110 {
111 return g_abilityType;
112 }
113
SetAbilityType(const string & type)114 StOperator &StOperator::SetAbilityType(const string &type)
115 {
116 g_abilityType = type;
117 return *this;
118 }
119
GetBundleName()120 string StOperator::GetBundleName()
121 {
122 return g_bundleName;
123 }
124
SetBundleName(const string & bundleName)125 StOperator &StOperator::SetBundleName(const string &bundleName)
126 {
127 g_bundleName = bundleName;
128 return *this;
129 }
130
GetAbilityName()131 string StOperator::GetAbilityName()
132 {
133 return g_abilityName;
134 }
135
SetAbilityName(const string & abilityName)136 StOperator &StOperator::SetAbilityName(const string &abilityName)
137 {
138 g_abilityName = abilityName;
139 return *this;
140 }
141
GetOperatorName()142 string StOperator::GetOperatorName()
143 {
144 return g_operatorName;
145 }
146
SetOperatorName(const string & operatorName)147 StOperator &StOperator::SetOperatorName(const string &operatorName)
148 {
149 g_operatorName = operatorName;
150 return *this;
151 }
152
GetMessage()153 string StOperator::GetMessage()
154 {
155 return g_message;
156 }
157
SetMessage(const string & message)158 StOperator &StOperator::SetMessage(const string &message)
159 {
160 g_message = message;
161 return *this;
162 }
163
AddChildOperator(std::shared_ptr<StOperator> childOperator)164 StOperator &StOperator::AddChildOperator(std::shared_ptr<StOperator> childOperator)
165 {
166 if (childOperator == nullptr) {
167 return *this;
168 }
169 childOperator->g_parentOperator = std::make_shared<StOperator>(*this);
170 g_childOperator.emplace_back(childOperator);
171 return *this;
172 }
173
GetChildOperator()174 std::vector<std::shared_ptr<StOperator>> StOperator::GetChildOperator()
175 {
176 return g_childOperator;
177 }
178
PopChildOperator()179 std::vector<std::shared_ptr<StOperator>> StOperator::PopChildOperator()
180 {
181 std::vector<std::shared_ptr<StOperator>> popChildOperator = g_childOperator;
182 for (auto child : popChildOperator) {
183 child->g_parentOperator = nullptr;
184 }
185 g_childOperator.clear();
186 return popChildOperator;
187 }
188 } // namespace STtools