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 "work_info.h"
16
17 #include "work_sched_common.h"
18
19 namespace OHOS {
20 namespace WorkScheduler {
21 const int INVALID_VALUE = -1;
22 const int INVALID_TIME_VALUE = 0;
23 const size_t MAX_SIZE = 1024;
24
WorkInfo()25 WorkInfo::WorkInfo()
26 {
27 workId_ = INVALID_VALUE;
28 uid_ = INVALID_VALUE;
29 persisted_ = false;
30 }
31
~WorkInfo()32 WorkInfo::~WorkInfo() {}
33
SetWorkId(int32_t workId)34 void WorkInfo::SetWorkId(int32_t workId)
35 {
36 workId_ = workId;
37 }
38
SetElement(std::string bundleName,std::string abilityName)39 void WorkInfo::SetElement(std::string bundleName, std::string abilityName)
40 {
41 bundleName_ = bundleName;
42 abilityName_ = abilityName;
43 }
44
RequestPersisted(bool persisted)45 void WorkInfo::RequestPersisted(bool persisted)
46 {
47 persisted_ = persisted;
48 }
49
RequestNetworkType(WorkCondition::Network condition)50 void WorkInfo::RequestNetworkType(WorkCondition::Network condition)
51 {
52 std::shared_ptr<Condition> networkCondition = std::make_shared<Condition>();
53 networkCondition->enumVal = static_cast<int>(condition);
54 conditionMap_.emplace(WorkCondition::Type::NETWORK, networkCondition);
55 }
56
RequestChargerType(bool isCharging,WorkCondition::Charger condition)57 void WorkInfo::RequestChargerType(bool isCharging, WorkCondition::Charger condition)
58 {
59 std::shared_ptr<Condition> chargerCondition = std::make_shared<Condition>();
60 chargerCondition->boolVal = isCharging;
61 chargerCondition->enumVal = static_cast<int>(condition);
62 conditionMap_.emplace(WorkCondition::Type::CHARGER, chargerCondition);
63 }
64
RequestBatteryLevel(int32_t battLevel)65 void WorkInfo::RequestBatteryLevel(int32_t battLevel)
66 {
67 std::shared_ptr<Condition> batteryLevelCondition = std::make_shared<Condition>();
68 batteryLevelCondition->intVal = battLevel;
69 conditionMap_.emplace(WorkCondition::Type::BATTERY_LEVEL, batteryLevelCondition);
70 }
71
RequestBatteryStatus(WorkCondition::BatteryStatus condition)72 void WorkInfo::RequestBatteryStatus(WorkCondition::BatteryStatus condition)
73 {
74 std::shared_ptr<Condition> batteryCondition = std::make_shared<Condition>();
75 batteryCondition->enumVal = static_cast<int>(condition);
76 conditionMap_.emplace(WorkCondition::Type::BATTERY_STATUS, batteryCondition);
77 }
78
RequestStorageLevel(WorkCondition::Storage condition)79 void WorkInfo::RequestStorageLevel(WorkCondition::Storage condition)
80 {
81 std::shared_ptr<Condition> storageCondition = std::make_shared<Condition>();
82 storageCondition->enumVal = static_cast<int>(condition);
83 conditionMap_.emplace(WorkCondition::Type::STORAGE, storageCondition);
84 }
85
RequestRepeatCycle(uint32_t timeInterval,int32_t cycle)86 void WorkInfo::RequestRepeatCycle(uint32_t timeInterval, int32_t cycle)
87 {
88 std::shared_ptr<Condition> repeatCycle = std::make_shared<Condition>();
89 repeatCycle->uintVal = timeInterval;
90 repeatCycle->intVal = cycle;
91 repeatCycle->boolVal = false;
92 conditionMap_.emplace(WorkCondition::Type::TIMER, repeatCycle);
93 }
94
RequestRepeatCycle(uint32_t timeInterval)95 void WorkInfo::RequestRepeatCycle(uint32_t timeInterval)
96 {
97 std::shared_ptr<Condition> repeatCycle = std::make_shared<Condition>();
98 repeatCycle->uintVal = timeInterval;
99 repeatCycle->boolVal = true;
100 conditionMap_.emplace(WorkCondition::Type::TIMER, repeatCycle);
101 }
102
RefreshUid(int32_t uid)103 void WorkInfo::RefreshUid(int32_t uid)
104 {
105 uid_ = uid;
106 }
107
GetUid()108 int32_t WorkInfo::GetUid()
109 {
110 return uid_;
111 }
112
GetWorkId()113 int32_t WorkInfo::GetWorkId()
114 {
115 return workId_;
116 }
117
GetBundleName()118 std::string WorkInfo::GetBundleName()
119 {
120 return bundleName_;
121 }
122
GetAbilityName()123 std::string WorkInfo::GetAbilityName()
124 {
125 return abilityName_;
126 }
127
IsPersisted()128 bool WorkInfo::IsPersisted()
129 {
130 return persisted_;
131 }
132
GetNetworkType()133 WorkCondition::Network WorkInfo::GetNetworkType()
134 {
135 if (conditionMap_.count(WorkCondition::Type::NETWORK) > 0) {
136 int enumVal = conditionMap_.at(WorkCondition::Type::NETWORK)->enumVal;
137 WorkCondition::Network network = WorkCondition::Network(enumVal);
138 return WorkCondition::Network(network);
139 }
140 return WorkCondition::Network::NETWORK_UNKNOWN;
141 }
142
GetChargerType()143 WorkCondition::Charger WorkInfo::GetChargerType()
144 {
145 if (conditionMap_.count(WorkCondition::Type::CHARGER) > 0) {
146 int enumVal = conditionMap_.at(WorkCondition::Type::CHARGER)->enumVal;
147 WorkCondition::Charger charger = WorkCondition::Charger(enumVal);
148 return WorkCondition::Charger(charger);
149 }
150 return WorkCondition::Charger::CHARGING_UNKNOWN;
151 }
152
GetBatteryLevel()153 int32_t WorkInfo::GetBatteryLevel()
154 {
155 if (conditionMap_.count(WorkCondition::Type::BATTERY_LEVEL) > 0) {
156 return conditionMap_.at(WorkCondition::Type::BATTERY_LEVEL)->intVal;
157 }
158 return INVALID_VALUE;
159 }
160
GetBatteryStatus()161 WorkCondition::BatteryStatus WorkInfo::GetBatteryStatus()
162 {
163 if (conditionMap_.count(WorkCondition::Type::BATTERY_STATUS) > 0) {
164 int enumVal = conditionMap_.at(WorkCondition::Type::BATTERY_STATUS)->enumVal;
165 WorkCondition::BatteryStatus battery = WorkCondition::BatteryStatus(enumVal);
166 return WorkCondition::BatteryStatus(battery);
167 }
168 return WorkCondition::BatteryStatus::BATTERY_UNKNOWN;
169 }
170
GetStorageLevel()171 WorkCondition::Storage WorkInfo::GetStorageLevel()
172 {
173 if (conditionMap_.count(WorkCondition::Type::STORAGE) > 0) {
174 int enumVal = conditionMap_.at(WorkCondition::Type::STORAGE)->enumVal;
175 WorkCondition::Storage storage = WorkCondition::Storage(enumVal);
176 return WorkCondition::Storage(storage);
177 }
178 return WorkCondition::Storage::STORAGE_UNKNOWN;
179 }
180
IsRepeat()181 bool WorkInfo::IsRepeat()
182 {
183 if (conditionMap_.count(WorkCondition::Type::TIMER) > 0) {
184 return conditionMap_.at(WorkCondition::Type::TIMER)->boolVal;
185 }
186 return false;
187 }
188
GetTimeInterval()189 uint32_t WorkInfo::GetTimeInterval()
190 {
191 if (conditionMap_.count(WorkCondition::Type::TIMER) > 0) {
192 return conditionMap_.at(WorkCondition::Type::TIMER)->uintVal;
193 }
194 return INVALID_TIME_VALUE;
195 }
196
GetCycleCount()197 int32_t WorkInfo::GetCycleCount()
198 {
199 if (conditionMap_.count(WorkCondition::Type::TIMER) > 0) {
200 if (IsRepeat()) {
201 return INVALID_VALUE;
202 }
203 return conditionMap_.at(WorkCondition::Type::TIMER)->intVal;
204 }
205 return INVALID_VALUE;
206 }
207
GetConditionMap()208 std::shared_ptr<std::map<WorkCondition::Type, std::shared_ptr<Condition>>> WorkInfo::GetConditionMap()
209 {
210 return std::make_shared<std::map<WorkCondition::Type, std::shared_ptr<Condition>>>(conditionMap_);
211 }
212
Marshalling(Parcel & parcel) const213 bool WorkInfo::Marshalling(Parcel &parcel) const
214 {
215 bool ret = false;
216 ret = parcel.WriteInt32(workId_);
217 ret = ret && parcel.WriteString(bundleName_);
218 ret = ret && parcel.WriteString(abilityName_);
219 ret = ret && parcel.WriteBool(persisted_);
220 ret = ret && parcel.WriteUint32(conditionMap_.size());
221 for (auto it : conditionMap_) {
222 switch (it.first) {
223 case WorkCondition::Type::NETWORK:
224 case WorkCondition::Type::BATTERY_STATUS:
225 case WorkCondition::Type::STORAGE: {
226 ret = ret && parcel.WriteInt32(it.first);
227 ret = ret && parcel.WriteInt32(it.second->enumVal);
228 break;
229 }
230 case WorkCondition::Type::CHARGER: {
231 ret = ret && parcel.WriteInt32(it.first);
232 ret = ret && parcel.WriteBool(it.second->boolVal);
233 ret = ret && parcel.WriteInt32(it.second->enumVal);
234 break;
235 }
236 case WorkCondition::Type::BATTERY_LEVEL: {
237 ret = ret && parcel.WriteInt32(it.first);
238 ret = ret && parcel.WriteInt32(it.second->intVal);
239 break;
240 }
241 case WorkCondition::Type::TIMER: {
242 ret = ret && parcel.WriteInt32(it.first);
243 ret = ret && parcel.WriteUint32(it.second->uintVal);
244 ret = ret && parcel.WriteBool(it.second->boolVal);
245 if (!it.second->boolVal) {
246 ret = ret && parcel.WriteInt32(it.second->intVal);
247 }
248 break;
249 }
250 default: {
251 ret = false;
252 }
253 }
254 }
255 return ret;
256 }
257
Unmarshalling(Parcel & parcel)258 sptr<WorkInfo> WorkInfo::Unmarshalling(Parcel &parcel)
259 {
260 sptr<WorkInfo> read = new (std::nothrow) WorkInfo();
261 if (read == nullptr) {
262 WS_HILOGD("read is nullptr.");
263 return nullptr;
264 }
265 read->workId_ = parcel.ReadInt32();
266 read->bundleName_ = parcel.ReadString();
267 read->abilityName_ = parcel.ReadString();
268 read->persisted_ = parcel.ReadBool();
269 size_t mapsize = parcel.ReadUint32();
270 if (mapsize >= MAX_SIZE) {
271 WS_HILOGD("mapsize is too big.");
272 return nullptr;
273 }
274
275 read->conditionMap_ = std::map<WorkCondition::Type, std::shared_ptr<Condition>>();
276 for (size_t i = 0; i < mapsize; i++) {
277 int32_t key = parcel.ReadInt32();
278 auto condition = std::make_shared<Condition>();
279 switch (key) {
280 case WorkCondition::Type::NETWORK:
281 case WorkCondition::Type::BATTERY_STATUS:
282 case WorkCondition::Type::STORAGE: {
283 condition->enumVal = parcel.ReadInt32();
284 break;
285 }
286 case WorkCondition::Type::CHARGER: {
287 condition->boolVal = parcel.ReadBool();
288 condition->enumVal = parcel.ReadInt32();
289 break;
290 }
291 case WorkCondition::Type::BATTERY_LEVEL: {
292 condition->intVal = parcel.ReadInt32();
293 break;
294 }
295 case WorkCondition::Type::TIMER: {
296 condition->uintVal = parcel.ReadUint32();
297 condition->boolVal = parcel.ReadBool();
298 if (!condition->boolVal) {
299 condition->intVal = parcel.ReadInt32();
300 }
301 break;
302 }
303 default: {
304 }
305 }
306 read->conditionMap_.emplace(WorkCondition::Type(key), condition);
307 }
308 return read;
309 }
310
ParseToJsonStr()311 std::string WorkInfo::ParseToJsonStr()
312 {
313 Json::Value root;
314 if (uid_ != INVALID_VALUE) {
315 root["uid"] = uid_;
316 }
317 root["workId"] = workId_;
318 root["bundleName"] = bundleName_;
319 root["abilityName"] = abilityName_;
320 root["persisted"] = persisted_;
321 Json::Value conditions;
322 for (auto it : conditionMap_) {
323 switch (it.first) {
324 case WorkCondition::Type::NETWORK: {
325 conditions["network"] = it.second->enumVal;
326 break;
327 }
328 case WorkCondition::Type::CHARGER: {
329 conditions["isCharging"] = it.second->boolVal;
330 conditions["chargerType"] = it.second->enumVal;
331 break;
332 }
333 case WorkCondition::Type::BATTERY_LEVEL: {
334 conditions["batteryLevel"] = it.second->intVal;
335 break;
336 }
337 case WorkCondition::Type::BATTERY_STATUS: {
338 conditions["batteryStatus"] = it.second->enumVal;
339 break;
340 }
341 case WorkCondition::Type::STORAGE: {
342 conditions["storage"] = it.second->enumVal;
343 break;
344 }
345 case WorkCondition::Type::TIMER: {
346 conditions["timer"] = it.second->uintVal;
347 conditions["repeat"] = it.second->boolVal;
348 if (!it.second->boolVal) {
349 conditions["cycle"] = it.second->intVal;
350 }
351 break;
352 }
353 default: {}
354 }
355 }
356 root["conditions"] = conditions;
357 Json::StreamWriterBuilder writerBuilder;
358 std::ostringstream os;
359 std::unique_ptr<Json::StreamWriter> jsonWriter(writerBuilder.newStreamWriter());
360 jsonWriter->write(root, &os);
361 std::string result = os.str();
362 return result;
363 }
364
ParseFromJson(const Json::Value value)365 bool WorkInfo::ParseFromJson(const Json::Value value)
366 {
367 if (value.empty()) {
368 return false;
369 }
370 if (!value.isMember("workId") || !value.isMember("bundleName") || !value.isMember("abilityName")) {
371 return false;
372 }
373 this->workId_ = value["workId"].asInt();
374 this->bundleName_ = value["bundleName"].asString();
375 this->abilityName_ = value["abilityName"].asString();
376 this->persisted_ = value["persisted"].asBool();
377 if (value.isMember("uid")) {
378 this->uid_ = value["uid"].asInt();
379 }
380 Json::Value conditions = value["conditions"];
381 if (conditions.isMember("network")) {
382 this->RequestNetworkType(WorkCondition::Network(conditions["network"].asInt()));
383 }
384 if (conditions.isMember("isCharging") && conditions.isMember("chargerType")) {
385 this->RequestChargerType(conditions["isCharging"].asBool(),
386 WorkCondition::Charger(conditions["chargerType"].asInt()));
387 }
388 if (conditions.isMember("batteryLevel")) {
389 this->RequestBatteryLevel(conditions["batteryLevel"].asInt());
390 }
391 if (conditions.isMember("batteryStatus")) {
392 this->RequestBatteryStatus(WorkCondition::BatteryStatus(conditions["batteryStatus"].asInt()));
393 }
394 if (conditions.isMember("storage")) {
395 this->RequestStorageLevel(WorkCondition::Storage(conditions["storage"].asInt()));
396 }
397 if (conditions.isMember("timer") && conditions.isMember("repeat")) {
398 if (!conditions["repeat"].asBool()) {
399 this->RequestRepeatCycle(conditions["timer"].asInt());
400 } else {
401 if (conditions.isMember("cycle")) {
402 this->RequestRepeatCycle(conditions["timer"].asInt(), conditions["cycle"].asInt());
403 }
404 }
405 }
406 return true;
407 }
408
Dump(std::string & result)409 void WorkInfo::Dump(std::string &result)
410 {
411 result.append(ParseToJsonStr());
412 }
413 } // namespace WorkScheduler
414 } // namespace OHOS
415