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