* Copyright (c) 2021-2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "hdf_device_event_manager.h"
#include <dlfcn.h>
#include <unistd.h>
#include "hdf_device_event_dispatch.h"
#include "mmi_log.h"
#undef MMI_LOG_TAG
#define MMI_LOG_TAG "HdfDeviceEventManager"
using namespace OHOS::HiviewDFX;
namespace OHOS {
namespace MMI {
namespace {
constexpr int32_t INPUT_PARAM_FIRST { 0 };
constexpr int32_t INPUT_PARAM_SECOND { 1 };
}
void HdfDeviceEventManager::ConnectHDFInit()
{
std::string name = "mmi-hdf";
inputInterface_ = IInputInterfaces::Get(true);
if (inputInterface_ == nullptr) {
MMI_HILOGE("The inputInterface_ is nullptr");
return;
}
thread_ = std::thread([this] { injectThread_.InjectFunc(); });
pthread_setname_np(thread_.native_handle(), name.c_str());
int32_t ret = inputInterface_->OpenInputDevice(TOUCH_DEV_ID);
if (ret == HDF_SUCCESS) {
ret = inputInterface_->GetInputDevice(TOUCH_DEV_ID, iDevInfo_);
if (ret != HDF_SUCCESS) {
MMI_HILOGE("Get input device failed");
return;
}
callback_ = new (std::nothrow) HdfDeviceEventDispatch(iDevInfo_.attrSet.axisInfo[ABS_MT_POSITION_X].max,
iDevInfo_.attrSet.axisInfo[ABS_MT_POSITION_Y].max);
if (callback_ == nullptr) {
MMI_HILOGE("The callback_ is nullptr");
return;
}
ret = inputInterface_->RegisterReportCallback(TOUCH_DEV_ID, callback_);
MMI_HILOGD("RegisterReportCallback ret:%{public}d", ret);
} else {
MMI_HILOGE("Open input device failed");
}
}
}
}
int32_t main() __attribute__((no_sanitize("cfi")))
{
int sleepSeconds = 1;
sleep(sleepSeconds);
OHOS::MMI::HdfDeviceEventManager iHdfDeviceEventManager;
iHdfDeviceEventManager.ConnectHDFInit();
int32_t pid = getpid();
MMI_HILOGI("Current pid:%{public}d", pid);
void *notifyProcessStatus = nullptr;
int32_t(* notifyProcessStatusFunc)(int32_t, int32_t, int32_t) = nullptr;
void *libMemMgrClientHandle = dlopen("libmemmgrclient.z.so", RTLD_NOW);
if (!libMemMgrClientHandle) {
MMI_HILOGE("%{public}s, dlopen libmemmgrclient failed.", __func__);
goto nextStep;
}
notifyProcessStatus = (dlsym(libMemMgrClientHandle, "notify_process_status"));
if (!notifyProcessStatus) {
MMI_HILOGE("%{public}s, dlsym notify_process_status failed.", __func__);
dlclose(libMemMgrClientHandle);
goto nextStep;
}
notifyProcessStatusFunc = reinterpret_cast<int32_t(*)(int32_t, int32_t, int32_t)>(notifyProcessStatus);
if (notifyProcessStatusFunc(pid, OHOS::MMI::INPUT_PARAM_FIRST, OHOS::MMI::INPUT_PARAM_SECOND) != 0) {
MMI_HILOGE("%{public}s, get device memory failed.", __func__);
}
dlclose(libMemMgrClientHandle);
MMI_HILOGI("The notify_process_status execute end");
nextStep:
MMI_HILOGI("Start thread loop");
static std::int32_t usleepTime = 1500000;
while (true) {
usleep(usleepTime);
}
return 0;
}