1 /*
2 * Copyright (c) 2025-2026 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 #include "state_utils.h"
17 #include <sys/time.h>
18 #include "netmgr_ext_log_wrapper.h"
19 #include "core_service_client.h"
20
21 namespace OHOS::NetManagerStandard {
22 constexpr int32_t SLOT_0 = 0;
23 constexpr int32_t SLOT_1 = 1;
24 constexpr int32_t UTIL_SLOT_0 = 0;
25 constexpr int32_t UTIL_SLOT_2 = 2;
26 constexpr int32_t MODEM_ID_0 = 0x00;
27 constexpr int32_t MODEM_ID_1 = 0x01;
28 constexpr int32_t TIME_RATE = 1000;
29 constexpr int32_t HTTP_DETECTION_TIMEOUT = 3000;
30
GetNowMilliSeconds()31 int64_t StateUtils::GetNowMilliSeconds()
32 {
33 auto nowSys = AppExecFwk::InnerEvent::Clock::now();
34 auto epoch = nowSys.time_since_epoch();
35 return std::chrono::duration_cast<std::chrono::milliseconds>(epoch).count();
36 }
37
GetCurrentSysTimeMs()38 int64_t StateUtils::GetCurrentSysTimeMs()
39 {
40 struct timeval time = {0};
41 gettimeofday(&time, nullptr);
42 return static_cast<int64_t>(
43 static_cast<uint64_t>(time.tv_sec * TIME_RATE) + static_cast<uint64_t>(time.tv_usec / TIME_RATE));
44 }
45
GetDefaultSlotId()46 int32_t StateUtils::GetDefaultSlotId()
47 {
48 int32_t slotId = DelayedRefSingleton<Telephony::CellularDataClient>::GetInstance().GetDefaultCellularDataSlotId();
49 return slotId;
50 }
51
GetPrimarySlotId()52 int32_t StateUtils::GetPrimarySlotId()
53 {
54 int32_t slotId = -1;
55 int32_t ret = DelayedRefSingleton<Telephony::CoreServiceClient>::GetInstance().GetPrimarySlotId(slotId);
56 if (ret != Telephony::TELEPHONY_SUCCESS) {
57 NETMGR_EXT_LOG_E("get primary slotid fail, ret:%{public}d", ret);
58 return -1;
59 }
60 return slotId;
61 }
62
GetSlaveCardSlotId()63 int32_t StateUtils::GetSlaveCardSlotId()
64 {
65 return (GetPrimarySlotId() == SLOT_0) ? SLOT_1 : SLOT_0;
66 }
67
IsValidSlotId(int32_t slotId)68 bool StateUtils::IsValidSlotId(int32_t slotId)
69 {
70 return (slotId >= UTIL_SLOT_0) && (slotId <= UTIL_SLOT_2);
71 }
72
IsRoaming(int32_t slotId)73 bool StateUtils::IsRoaming(int32_t slotId)
74 {
75 if (!StateUtils::IsValidSlotId(slotId)) {
76 NETMGR_EXT_LOG_E("IsRoaming slotId is inValid");
77 return false;
78 }
79 sptr<Telephony::NetworkState> networkState = nullptr;
80 DelayedRefSingleton<Telephony::CoreServiceClient>::GetInstance().GetNetworkState(slotId, networkState);
81 if (networkState != nullptr) {
82 return networkState->IsRoaming();
83 }
84 return false;
85 }
86
GetModemIdBySlotId(int32_t slotId)87 int32_t StateUtils::GetModemIdBySlotId(int32_t slotId)
88 {
89 int32_t masterCardSlotId = GetPrimarySlotId();
90 if (!IsValidSlotId(masterCardSlotId)) {
91 NETMGR_EXT_LOG_E("invalid masterCardSlotId: %{public}d", masterCardSlotId);
92 masterCardSlotId = 0;
93 }
94
95 if (slotId == UTIL_SLOT_2) {
96 return MODEM_ID_0;
97 }
98
99 if (masterCardSlotId == slotId) {
100 return MODEM_ID_0;
101 } else {
102 return MODEM_ID_1;
103 }
104 }
105
GetSlotIdByModemId(int32_t modemId)106 int32_t StateUtils::GetSlotIdByModemId(int32_t modemId)
107 {
108 int32_t masterCardSlotId = GetPrimarySlotId();
109 int32_t slaveCardSlotId = GetSlaveCardSlotId();
110
111 if (MODEM_ID_0 == modemId) {
112 return IsValidSlotId(masterCardSlotId) ? masterCardSlotId : UTIL_SLOT_0;
113 } else {
114 return IsValidSlotId(slaveCardSlotId) ? slaveCardSlotId : UTIL_SLOT_0;
115 }
116 }
117 } // namespace OHOS::NetManagerStandard
118