• 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 
16 #include <cstdint>
17 #include <cinttypes>
18 #include <cstdio>
19 #include <cstring>
20 #include <unistd.h>
21 #include <securec.h>
22 #include "time_common.h"
23 #include "sntp_client.h"
24 #include "ntp_trusted_time.h"
25 
26 namespace OHOS {
27 namespace MiscServices {
28 namespace {
29 constexpr int64_t INVALID_MILLIS = -1;
30 constexpr int64_t HALF = 2;
31 constexpr int32_t RETRY_TIMES = 2;
32 }
33 
NtpTrustedTime()34 NtpTrustedTime::NtpTrustedTime() {}
~NtpTrustedTime()35 NtpTrustedTime::~NtpTrustedTime() {}
36 
ForceRefresh(std::string ntpServer)37 bool NtpTrustedTime::ForceRefresh(std::string ntpServer)
38 {
39     TIME_HILOGD(TIME_MODULE_SERVICE, "start.");
40     SNTPClient client;
41     for (int i = 0; i < RETRY_TIMES; i++) {
42         if (client.RequestTime(ntpServer)) {
43             if (mTimeResult != nullptr) {
44                 mTimeResult->Clear();
45             }
46             int64_t ntpCertainty = client.getRoundTripTime() / HALF;
47             mTimeResult = std::make_shared<TimeResult>(client.getNtpTIme(), client.getNtpTimeReference(), ntpCertainty);
48             TIME_HILOGD(TIME_MODULE_SERVICE, "Get Ntp time result");
49             TIME_HILOGD(TIME_MODULE_SERVICE, "true end.");
50             return true;
51         }
52     }
53     TIME_HILOGD(TIME_MODULE_SERVICE, "false end.");
54     return false;
55 }
56 
CurrentTimeMillis()57 int64_t NtpTrustedTime::CurrentTimeMillis()
58 {
59     TIME_HILOGD(TIME_MODULE_SERVICE, "start.");
60     if (mTimeResult == nullptr) {
61         TIME_HILOGD(TIME_MODULE_SERVICE, "Missing authoritative time source");
62         return INVALID_MILLIS;
63     }
64     TIME_HILOGD(TIME_MODULE_SERVICE, "end.");
65     return mTimeResult->CurrentTimeMillis();
66 }
67 
HasCache()68 bool NtpTrustedTime::HasCache()
69 {
70     return mTimeResult == nullptr;
71 }
72 
GetCacheAge()73 int64_t NtpTrustedTime::GetCacheAge()
74 {
75     if (mTimeResult != nullptr) {
76         return std::chrono::duration_cast<std::chrono::milliseconds>
77             (std::chrono::steady_clock::now().time_since_epoch()).count() - mTimeResult->GetElapsedRealtimeMillis();
78     } else {
79         return INT_MAX;
80     }
81 }
82 
GetCachedNtpTime()83 int64_t NtpTrustedTime::GetCachedNtpTime()
84 {
85     return mTimeResult == nullptr ? 0 : mTimeResult->GetTimeMillis();
86 }
87 
GetCachedNtpTimeReference()88 int64_t NtpTrustedTime::GetCachedNtpTimeReference()
89 {
90     return mTimeResult == nullptr ? 0 : mTimeResult->GetElapsedRealtimeMillis();
91 }
92 
GetTimeMillis()93 int64_t NtpTrustedTime::TimeResult::GetTimeMillis()
94 {
95     return mTimeMillis;
96 }
97 
GetElapsedRealtimeMillis()98 int64_t NtpTrustedTime::TimeResult::GetElapsedRealtimeMillis()
99 {
100     return mElapsedRealtimeMillis;
101 }
102 
GetCertaintyMillis()103 int64_t NtpTrustedTime::TimeResult::GetCertaintyMillis()
104 {
105     return mCertaintyMillis;
106 }
107 
CurrentTimeMillis()108 int64_t NtpTrustedTime::TimeResult::CurrentTimeMillis()
109 {
110     return mTimeMillis + GetAgeMillis();
111 }
112 
GetAgeMillis()113 int64_t NtpTrustedTime::TimeResult::GetAgeMillis()
114 {
115     return std::chrono::duration_cast<std::chrono::milliseconds>
116         (std::chrono::steady_clock::now().time_since_epoch()).count() - this->mElapsedRealtimeMillis;
117 }
118 
TimeResult()119 NtpTrustedTime::TimeResult::TimeResult() {}
~TimeResult()120 NtpTrustedTime::TimeResult::~TimeResult() {}
121 
TimeResult(int64_t mTimeMillis,int64_t mElapsedRealtimeMills,int64_t mCertaintyMillis)122 NtpTrustedTime::TimeResult::TimeResult(int64_t mTimeMillis, int64_t mElapsedRealtimeMills, int64_t mCertaintyMillis)
123 {
124     this->mTimeMillis = mTimeMillis;
125     this->mElapsedRealtimeMillis = mElapsedRealtimeMills;
126     this->mCertaintyMillis = mCertaintyMillis;
127     TIME_HILOGD(TIME_MODULE_SERVICE, "mTimeMillis %{public}" PRId64 "", mTimeMillis);
128     TIME_HILOGD(TIME_MODULE_SERVICE, "mElapsedRealtimeMills %{public}" PRId64 "", mElapsedRealtimeMills);
129     TIME_HILOGD(TIME_MODULE_SERVICE, "mCertaintyMillis %{public}" PRId64 "", mCertaintyMillis);
130 }
131 
Clear()132 void NtpTrustedTime::TimeResult::Clear()
133 {
134     TIME_HILOGD(TIME_MODULE_SERVICE, "start.");
135     mTimeMillis = 0;
136     mElapsedRealtimeMillis = 0;
137     mCertaintyMillis = 0;
138     TIME_HILOGD(TIME_MODULE_SERVICE, "end.");
139 }
140 } // MiscServices
141 } // OHOS