• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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