1 /*
2 * Copyright (c) 2021 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 "hdc_connect.h"
17 #include "hdc_jdwp.h"
18 #include "parameter.h"
19
20 namespace Hdc {
21
22 std::unique_ptr<ConnectManagement> g_connectManagement = nullptr;
23 static HdcJdwpSimulator *g_clsHdcJdwpSimulator = nullptr;
24
SetProcessName(const std::string & processName)25 void ConnectManagement::SetProcessName(const std::string &processName)
26 {
27 processName_ = processName;
28 }
29
GetProcessName() const30 std::string ConnectManagement::GetProcessName() const
31 {
32 return processName_;
33 }
34
SetPkgName(const std::string & pkgName)35 void ConnectManagement::SetPkgName(const std::string &pkgName)
36 {
37 pkgName_ = pkgName;
38 }
39
GetPkgName() const40 std::string ConnectManagement::GetPkgName() const
41 {
42 return pkgName_;
43 }
44
SetDebug(bool isDebug)45 void ConnectManagement::SetDebug(bool isDebug)
46 {
47 isDebug_ = isDebug;
48 }
49
GetDebug() const50 bool ConnectManagement::GetDebug() const
51 {
52 return isDebug_;
53 }
54
SetCallback(Callback cb)55 void ConnectManagement::SetCallback(Callback cb)
56 {
57 cb_ = cb;
58 }
59
GetCallback() const60 Callback ConnectManagement::GetCallback() const
61 {
62 return cb_;
63 }
64
GetDevItem(const char * key,std::string & out,const char * preDefine=nullptr)65 static void GetDevItem(const char *key, std::string &out, const char *preDefine = nullptr)
66 {
67 constexpr int len = 512;
68 char buf[len] = "";
69 if (memset_s(buf, len, 0, len) != EOK) {
70 HILOG_WARN(LOG_CORE, "memset_s failed");
71 return;
72 }
73 auto res = GetParameter(key, preDefine, buf, len);
74 if (res <= 0) {
75 return;
76 }
77 out = buf;
78 }
79
IsDeveloperMode()80 static bool IsDeveloperMode()
81 {
82 std::string developerMode;
83 GetDevItem("const.security.developermode.state", developerMode);
84 return developerMode == "true";
85 }
86
FreeInstance()87 void FreeInstance()
88 {
89 if (g_clsHdcJdwpSimulator == nullptr) {
90 return;
91 }
92 g_clsHdcJdwpSimulator->Disconnect();
93 delete g_clsHdcJdwpSimulator;
94 g_clsHdcJdwpSimulator = nullptr;
95 }
96
Stop(int signo)97 void Stop(int signo)
98 {
99 FreeInstance();
100 _exit(0);
101 }
102
StopConnect()103 void StopConnect()
104 {
105 if (!IsDeveloperMode()) {
106 HILOG_INFO(LOG_CORE, "non developer mode not to stop connect");
107 return;
108 }
109 #ifdef JS_JDWP_CONNECT
110 FreeInstance();
111 #endif // JS_JDWP_CONNECT
112 }
113
HdcConnectRun(void * pkgContent)114 void* HdcConnectRun(void* pkgContent)
115 {
116 if (signal(SIGINT, Stop) == SIG_ERR) {
117 HILOG_FATAL(LOG_CORE, "jdwp_process signal fail.");
118 }
119 int ret = pthread_setname_np(pthread_self(), "OS_hdcRegister");
120 if (ret != 0) {
121 HILOG_FATAL(LOG_CORE, "set Thread name failed.");
122 }
123 std::string processName = static_cast<ConnectManagement*>(pkgContent)->GetProcessName();
124 std::string pkgName = static_cast<ConnectManagement*>(pkgContent)->GetPkgName();
125 bool isDebug = static_cast<ConnectManagement*>(pkgContent)->GetDebug();
126 Callback cb = static_cast<ConnectManagement*>(pkgContent)->GetCallback();
127 g_clsHdcJdwpSimulator = new (std::nothrow) HdcJdwpSimulator(processName, pkgName, isDebug, cb);
128 if (!g_clsHdcJdwpSimulator->Connect()) {
129 HILOG_FATAL(LOG_CORE, "Connect fail.");
130 return nullptr;
131 }
132 return nullptr;
133 }
134
StartConnect(const std::string & processName,const std::string & pkgName,bool isDebug,Callback cb)135 void StartConnect(const std::string& processName, const std::string& pkgName, bool isDebug, Callback cb)
136 {
137 if (!IsDeveloperMode()) {
138 HILOG_INFO(LOG_CORE, "non developer mode not to start connect");
139 return;
140 }
141 if (g_clsHdcJdwpSimulator != nullptr) {
142 return;
143 }
144 pthread_t tid;
145 g_connectManagement = std::make_unique<ConnectManagement>();
146 g_connectManagement->SetProcessName(processName);
147 g_connectManagement->SetPkgName(pkgName);
148 g_connectManagement->SetDebug(isDebug);
149 g_connectManagement->SetCallback(cb);
150 if (pthread_create(&tid, nullptr, &HdcConnectRun, static_cast<void*>(g_connectManagement.get())) != 0) {
151 HILOG_FATAL(LOG_CORE, "pthread_create fail!");
152 return;
153 }
154 }
155 } // namespace Hdc
156