1886da342Sopenharmony_ci/*
2886da342Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
3886da342Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4886da342Sopenharmony_ci * you may not use this file except in compliance with the License.
5886da342Sopenharmony_ci * You may obtain a copy of the License at
6886da342Sopenharmony_ci *
7886da342Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8886da342Sopenharmony_ci *
9886da342Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10886da342Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11886da342Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12886da342Sopenharmony_ci * See the License for the specific language governing permissions and
13886da342Sopenharmony_ci * limitations under the License.
14886da342Sopenharmony_ci */
15886da342Sopenharmony_ci
16886da342Sopenharmony_ci#include "test_server_service.h"
17886da342Sopenharmony_ci
18886da342Sopenharmony_ci#include "iremote_object.h"
19886da342Sopenharmony_ci#include "system_ability_definition.h"
20886da342Sopenharmony_ci#include "hilog/log.h"
21886da342Sopenharmony_ci#include "parameters.h"
22886da342Sopenharmony_ci#include "iservice_registry.h"
23886da342Sopenharmony_ci#include "test_server_error_code.h"
24886da342Sopenharmony_ci#include "pasteboard_client.h"
25886da342Sopenharmony_ci
26886da342Sopenharmony_cinamespace OHOS::testserver {
27886da342Sopenharmony_ci    // TEST_SERVER_SA_ID
28886da342Sopenharmony_ci    REGISTER_SYSTEM_ABILITY_BY_ID(TestServerService, TEST_SERVER_SA_ID, false); // SA run on demand
29886da342Sopenharmony_ci
30886da342Sopenharmony_ci    using namespace std;
31886da342Sopenharmony_ci    using namespace OHOS::HiviewDFX;
32886da342Sopenharmony_ci    static constexpr OHOS::HiviewDFX::HiLogLabel LABEL_SERVICE = {LOG_CORE, 0xD003110, "TestServerService"};
33886da342Sopenharmony_ci    static constexpr OHOS::HiviewDFX::HiLogLabel LABEL_TIMER = {LOG_CORE, 0xD003110, "CallerDetectTimer"};
34886da342Sopenharmony_ci    static const int CALLER_DETECT_DURING = 10000;
35886da342Sopenharmony_ci
36886da342Sopenharmony_ci    TestServerService::TestServerService(int32_t saId, bool runOnCreate) : SystemAbility(saId, runOnCreate)
37886da342Sopenharmony_ci    {
38886da342Sopenharmony_ci        HiLog::Info(LABEL_SERVICE, "%{public}s called. saId=%{public}d, runOnCreate=%{public}d",
39886da342Sopenharmony_ci            __func__, saId, runOnCreate);
40886da342Sopenharmony_ci        StartCallerDetectTimer();
41886da342Sopenharmony_ci    }
42886da342Sopenharmony_ci
43886da342Sopenharmony_ci    TestServerService::~TestServerService()
44886da342Sopenharmony_ci    {
45886da342Sopenharmony_ci        HiLog::Info(LABEL_SERVICE, "%{public}s called.", __func__);
46886da342Sopenharmony_ci        if (callerDetectTimer_ == nullptr) {
47886da342Sopenharmony_ci            HiLog::Error(LABEL_SERVICE, "%{public}s. callerDetectTimer_ is nullptr.", __func__);
48886da342Sopenharmony_ci            return;
49886da342Sopenharmony_ci        }
50886da342Sopenharmony_ci        callerDetectTimer_->Cancel();
51886da342Sopenharmony_ci    }
52886da342Sopenharmony_ci
53886da342Sopenharmony_ci    void TestServerService::OnStart()
54886da342Sopenharmony_ci    {
55886da342Sopenharmony_ci        HiLog::Info(LABEL_SERVICE, "%{public}s called.", __func__);
56886da342Sopenharmony_ci        if (!IsRootVersion() && !IsDeveloperMode()) {
57886da342Sopenharmony_ci            HiLog::Error(LABEL_SERVICE, "%{public}s. System mode is unsatisfied.", __func__);
58886da342Sopenharmony_ci            return;
59886da342Sopenharmony_ci        }
60886da342Sopenharmony_ci        bool res = Publish(this);
61886da342Sopenharmony_ci        if (!res) {
62886da342Sopenharmony_ci            HiLog::Error(LABEL_SERVICE, "%{public}s. Publish failed", __func__);
63886da342Sopenharmony_ci        }
64886da342Sopenharmony_ci    }
65886da342Sopenharmony_ci
66886da342Sopenharmony_ci    void TestServerService::OnStop()
67886da342Sopenharmony_ci    {
68886da342Sopenharmony_ci        HiLog::Info(LABEL_SERVICE, "%{public}s called.", __func__);
69886da342Sopenharmony_ci        IsDeveloperMode();
70886da342Sopenharmony_ci    }
71886da342Sopenharmony_ci
72886da342Sopenharmony_ci    bool TestServerService::IsRootVersion()
73886da342Sopenharmony_ci    {
74886da342Sopenharmony_ci        bool debugmode = OHOS::system::GetBoolParameter("const.debuggable", false);
75886da342Sopenharmony_ci        HiLog::Info(LABEL_SERVICE, "%{public}s. debugmode=%{public}d", __func__, debugmode);
76886da342Sopenharmony_ci        return debugmode;
77886da342Sopenharmony_ci    }
78886da342Sopenharmony_ci
79886da342Sopenharmony_ci    bool TestServerService::IsDeveloperMode()
80886da342Sopenharmony_ci    {
81886da342Sopenharmony_ci        bool developerMode = OHOS::system::GetBoolParameter("const.security.developermode.state", false);
82886da342Sopenharmony_ci        HiLog::Info(LABEL_SERVICE, "%{public}s. developerMode=%{public}d", __func__, developerMode);
83886da342Sopenharmony_ci        return developerMode;
84886da342Sopenharmony_ci    }
85886da342Sopenharmony_ci
86886da342Sopenharmony_ci    void TestServerService::StartCallerDetectTimer()
87886da342Sopenharmony_ci    {
88886da342Sopenharmony_ci        HiLog::Info(LABEL_SERVICE, "%{public}s called.", __func__);
89886da342Sopenharmony_ci        callerDetectTimer_ = new CallerDetectTimer(this);
90886da342Sopenharmony_ci        callerDetectTimer_->Start();
91886da342Sopenharmony_ci    }
92886da342Sopenharmony_ci
93886da342Sopenharmony_ci    ErrCode TestServerService::CreateSession(const SessionToken &sessionToken)
94886da342Sopenharmony_ci    {
95886da342Sopenharmony_ci        HiLog::Info(LABEL_SERVICE, "%{public}s called.", __func__);
96886da342Sopenharmony_ci        bool result = true;
97886da342Sopenharmony_ci        try {
98886da342Sopenharmony_ci            result = sessionToken.AddDeathRecipient(
99886da342Sopenharmony_ci                sptr<TestServerProxyDeathRecipient>(new TestServerProxyDeathRecipient(this)));
100886da342Sopenharmony_ci        } catch(...) {
101886da342Sopenharmony_ci            result = false;
102886da342Sopenharmony_ci        }
103886da342Sopenharmony_ci        if (!result) {
104886da342Sopenharmony_ci            HiLog::Error(LABEL_SERVICE, "%{public}s. AddDeathRecipient FAILD.", __func__);
105886da342Sopenharmony_ci            DestorySession();
106886da342Sopenharmony_ci            return TEST_SERVER_ADD_DEATH_RECIPIENT_FAILED;
107886da342Sopenharmony_ci        }
108886da342Sopenharmony_ci        AddCaller();
109886da342Sopenharmony_ci        HiLog::Info(LABEL_SERVICE, "%{public}s. Create session SUCCESS. callerCount=%{public}d",
110886da342Sopenharmony_ci            __func__, GetCallerCount());
111886da342Sopenharmony_ci        return TEST_SERVER_OK;
112886da342Sopenharmony_ci    }
113886da342Sopenharmony_ci
114886da342Sopenharmony_ci    ErrCode TestServerService::SetPasteData(const std::string& text)
115886da342Sopenharmony_ci    {
116886da342Sopenharmony_ci        HiLog::Info(LABEL_SERVICE, "%{public}s called.", __func__);
117886da342Sopenharmony_ci        auto pasteBoardMgr = MiscServices::PasteboardClient::GetInstance();
118886da342Sopenharmony_ci        pasteBoardMgr->Clear();
119886da342Sopenharmony_ci        auto pasteData = pasteBoardMgr->CreatePlainTextData(text);
120886da342Sopenharmony_ci        if (pasteData == nullptr) {
121886da342Sopenharmony_ci            return TEST_SERVER_CREATE_PASTE_DATA_FAILED;
122886da342Sopenharmony_ci        }
123886da342Sopenharmony_ci        int32_t ret = pasteBoardMgr->SetPasteData(*pasteData);
124886da342Sopenharmony_ci        int32_t successErrCode = 27787264;
125886da342Sopenharmony_ci        return ret == successErrCode ? TEST_SERVER_OK : TEST_SERVER_SET_PASTE_DATA_FAILED;
126886da342Sopenharmony_ci    }
127886da342Sopenharmony_ci
128886da342Sopenharmony_ci    ErrCode TestServerService::PublishCommonEvent(const EventFwk::CommonEventData &event, bool &re)
129886da342Sopenharmony_ci    {
130886da342Sopenharmony_ci        if (!EventFwk::CommonEventManager::PublishCommonEvent(event)) {
131886da342Sopenharmony_ci            HiLog::Info(LABEL_SERVICE, "%{public}s Pulbish commonEvent.", __func__);
132886da342Sopenharmony_ci            re = false;
133886da342Sopenharmony_ci        }
134886da342Sopenharmony_ci        re = true;
135886da342Sopenharmony_ci        int32_t ret = re ? TEST_SERVER_OK : TEST_SERVER_PUBLISH_EVENT_FAILED;
136886da342Sopenharmony_ci        return ret;
137886da342Sopenharmony_ci    }
138886da342Sopenharmony_ci
139886da342Sopenharmony_ci    void TestServerService::AddCaller()
140886da342Sopenharmony_ci    {
141886da342Sopenharmony_ci        callerCount_++;
142886da342Sopenharmony_ci    }
143886da342Sopenharmony_ci
144886da342Sopenharmony_ci    void TestServerService::RemoveCaller()
145886da342Sopenharmony_ci    {
146886da342Sopenharmony_ci        callerCount_--;
147886da342Sopenharmony_ci    }
148886da342Sopenharmony_ci
149886da342Sopenharmony_ci    int TestServerService::GetCallerCount()
150886da342Sopenharmony_ci    {
151886da342Sopenharmony_ci        return callerCount_.load();
152886da342Sopenharmony_ci    }
153886da342Sopenharmony_ci
154886da342Sopenharmony_ci    void TestServerService::DestorySession()
155886da342Sopenharmony_ci    {
156886da342Sopenharmony_ci        HiLog::Info(LABEL_SERVICE, "%{public}s called.", __func__);
157886da342Sopenharmony_ci        if (callerCount_ == 0) {
158886da342Sopenharmony_ci            HiLog::Info(LABEL_SERVICE, "%{public}s. No proxy exists. Remove the TestServer", __func__);
159886da342Sopenharmony_ci            RemoveTestServer();
160886da342Sopenharmony_ci        } else {
161886da342Sopenharmony_ci            HiLog::Info(LABEL_SERVICE, "%{public}s. Other proxys exist. Can not remove the TestServer", __func__);
162886da342Sopenharmony_ci        }
163886da342Sopenharmony_ci    }
164886da342Sopenharmony_ci
165886da342Sopenharmony_ci    bool TestServerService::RemoveTestServer()
166886da342Sopenharmony_ci    {
167886da342Sopenharmony_ci        HiLog::Info(LABEL_SERVICE, "%{public}s called. ", __func__);
168886da342Sopenharmony_ci        sptr<ISystemAbilityManager> samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
169886da342Sopenharmony_ci        if (samgr == nullptr) {
170886da342Sopenharmony_ci            HiLog::Error(LABEL_SERVICE, "%{public}s. Get SystemAbility Manager failed!", __func__);
171886da342Sopenharmony_ci            return false;
172886da342Sopenharmony_ci        }
173886da342Sopenharmony_ci        auto res = samgr->UnloadSystemAbility(TEST_SERVER_SA_ID);
174886da342Sopenharmony_ci        return res == ERR_OK;
175886da342Sopenharmony_ci    }
176886da342Sopenharmony_ci
177886da342Sopenharmony_ci    void TestServerService::TestServerProxyDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &object)
178886da342Sopenharmony_ci    {
179886da342Sopenharmony_ci        HiLog::Info(LABEL_SERVICE, "%{public}s called.", __func__);
180886da342Sopenharmony_ci        if (object == nullptr) {
181886da342Sopenharmony_ci            HiLog::Error(LABEL_SERVICE, "%{public}s. IRemoteObject is NULL.", __func__);
182886da342Sopenharmony_ci            return;
183886da342Sopenharmony_ci        }
184886da342Sopenharmony_ci        testServerService_->RemoveCaller();
185886da342Sopenharmony_ci        testServerService_->DestorySession();
186886da342Sopenharmony_ci    }
187886da342Sopenharmony_ci
188886da342Sopenharmony_ci    void TestServerService::CallerDetectTimer::Start()
189886da342Sopenharmony_ci    {
190886da342Sopenharmony_ci        HiLog::Info(LABEL_TIMER, "%{public}s called.", __func__);
191886da342Sopenharmony_ci        thread_ = thread([this] {
192886da342Sopenharmony_ci            this_thread::sleep_for(chrono::milliseconds(CALLER_DETECT_DURING));
193886da342Sopenharmony_ci            HiLog::Info(LABEL_TIMER, "%{public}s. Timer is done.", __func__);
194886da342Sopenharmony_ci            if (!testServerExit_) {
195886da342Sopenharmony_ci                testServerService_->DestorySession();
196886da342Sopenharmony_ci            }
197886da342Sopenharmony_ci        });
198886da342Sopenharmony_ci        thread_.detach();
199886da342Sopenharmony_ci    }
200886da342Sopenharmony_ci
201886da342Sopenharmony_ci    void TestServerService::CallerDetectTimer::Cancel()
202886da342Sopenharmony_ci    {
203886da342Sopenharmony_ci        HiLog::Info(LABEL_TIMER, "%{public}s called.", __func__);
204886da342Sopenharmony_ci        testServerExit_ = true;
205886da342Sopenharmony_ci    }
206886da342Sopenharmony_ci
207886da342Sopenharmony_ci} // namespace OHOS::testserver