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 #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) {
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),
79 g_abilityType("0"),
80 g_bundleName(""),
81 g_abilityName(""),
82 g_operatorName(""),
83 g_message("")
84 {
85 g_childOperator.clear();
86 StOperator::countChild++;
87 }
88
StOperator(const string & type,const string & bundle,const string & ability,const string & operatorName,const string & message)89 StOperator::StOperator(
90 const string &type, const string &bundle, const string &ability, const string &operatorName, const string &message)
91 : g_parentOperator(nullptr),
92 g_abilityType(type),
93 g_bundleName(bundle),
94 g_abilityName(ability),
95 g_operatorName(operatorName),
96 g_message("")
97 {
98 g_childOperator.clear();
99 StOperator::countChild++;
100 }
101
~StOperator()102 StOperator::~StOperator()
103 {
104 g_childOperator.clear();
105 StOperator::countChild--;
106 }
107
GetCountChild()108 int StOperator::GetCountChild()
109 {
110 return StOperator::countChild;
111 }
112
GetAbilityType()113 string StOperator::GetAbilityType()
114 {
115 return g_abilityType;
116 }
117
SetAbilityType(const string & type)118 StOperator &StOperator::SetAbilityType(const string &type)
119 {
120 g_abilityType = type;
121 return *this;
122 }
123
GetBundleName()124 string StOperator::GetBundleName()
125 {
126 return g_bundleName;
127 }
128
SetBundleName(const string & bundleName)129 StOperator &StOperator::SetBundleName(const string &bundleName)
130 {
131 g_bundleName = bundleName;
132 return *this;
133 }
134
GetAbilityName()135 string StOperator::GetAbilityName()
136 {
137 return g_abilityName;
138 }
139
SetAbilityName(const string & abilityName)140 StOperator &StOperator::SetAbilityName(const string &abilityName)
141 {
142 g_abilityName = abilityName;
143 return *this;
144 }
145
GetOperatorName()146 string StOperator::GetOperatorName()
147 {
148 return g_operatorName;
149 }
150
SetOperatorName(const string & operatorName)151 StOperator &StOperator::SetOperatorName(const string &operatorName)
152 {
153 g_operatorName = operatorName;
154 return *this;
155 }
156
GetMessage()157 string StOperator::GetMessage()
158 {
159 return g_message;
160 }
161
SetMessage(const string & message)162 StOperator &StOperator::SetMessage(const string &message)
163 {
164 g_message = message;
165 return *this;
166 }
167
AddChildOperator(std::shared_ptr<StOperator> childOperator)168 StOperator &StOperator::AddChildOperator(std::shared_ptr<StOperator> childOperator)
169 {
170 if (!childOperator) {
171 return *this;
172 }
173 childOperator->g_parentOperator = std::make_shared<StOperator>(*this);
174 g_childOperator.emplace_back(childOperator);
175 return *this;
176 }
177
GetChildOperator()178 std::vector<std::shared_ptr<StOperator>> StOperator::GetChildOperator()
179 {
180 return g_childOperator;
181 }
182
PopChildOperator()183 std::vector<std::shared_ptr<StOperator>> StOperator::PopChildOperator()
184 {
185 std::vector<std::shared_ptr<StOperator>> popChildOperator = g_childOperator;
186 for (auto child : popChildOperator) {
187 child->g_parentOperator = nullptr;
188 }
189 g_childOperator.clear();
190 return popChildOperator;
191 }
192 } // namespace STtools