mirror of
https://github.com/openharmony/distributedhardware_distributed_input.git
synced 2026-07-21 05:45:23 -04:00
Description:refine get dinput sa
Match-id-e01951e49eabc5456af473375d142d8e7c0d11d4
This commit is contained in:
@@ -93,6 +93,8 @@ namespace DistributedInput {
|
||||
*/
|
||||
constexpr uint32_t INPUT_TYPE_ALL = INPUT_TYPE_MOUSE | INPUT_TYPE_KEYBOARD | INPUT_TYPE_TOUCH;
|
||||
|
||||
constexpr int32_t INPUT_SUBSCRIBESA_DELAY_MS = 5;
|
||||
|
||||
constexpr int32_t INPUT_LOADSA_TIMEOUT_MS = 10000;
|
||||
|
||||
constexpr int32_t SESSION_WAIT_TIMEOUT_SECOND = 5;
|
||||
|
||||
@@ -24,10 +24,15 @@
|
||||
namespace OHOS {
|
||||
namespace DistributedHardware {
|
||||
namespace DistributedInput {
|
||||
std::shared_ptr<DistributedInputClient> DistributedInputClient::instance(new DistributedInputClient());
|
||||
|
||||
DistributedInputClient::DistributedInputClient()
|
||||
{
|
||||
}
|
||||
|
||||
DistributedInputClient &DistributedInputClient::GetInstance()
|
||||
{
|
||||
static DistributedInputClient instance;
|
||||
return instance;
|
||||
return *instance.get();
|
||||
}
|
||||
|
||||
void DistributedInputClient::RegisterDInputCb::OnResult(
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#ifndef DISTRIBUTED_INPUT_CLIENT_H
|
||||
#define DISTRIBUTED_INPUT_CLIENT_H
|
||||
|
||||
#include <atomic>
|
||||
#include <iostream>
|
||||
#include <mutex>
|
||||
#include <string>
|
||||
@@ -30,12 +31,15 @@
|
||||
|
||||
#include "idistributed_hardware_source.h"
|
||||
#include "idistributed_hardware_sink.h"
|
||||
#include "system_ability_status_change_stub.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace DistributedHardware {
|
||||
namespace DistributedInput {
|
||||
class DistributedInputClient {
|
||||
public:
|
||||
~DistributedInputClient(){};
|
||||
|
||||
static DistributedInputClient &GetInstance();
|
||||
|
||||
int32_t InitSource();
|
||||
@@ -110,7 +114,15 @@ public:
|
||||
void OnResult(const std::string &deviceId);
|
||||
};
|
||||
|
||||
class SystemAbilityListener : public SystemAbilityStatusChangeStub {
|
||||
public:
|
||||
void OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId) override;
|
||||
void OnRemoveSystemAbility(int32_t systemAbilityId, const std::string& deviceId) override;
|
||||
};
|
||||
|
||||
private:
|
||||
DistributedInputClient();
|
||||
void Init();
|
||||
bool GetDInputSourceProxy();
|
||||
bool GetDInputSinkProxy();
|
||||
bool IsJsonData(std::string strData) const;
|
||||
@@ -118,7 +130,12 @@ private:
|
||||
void DelWhiteListInfos(const std::string &deviceId) const;
|
||||
|
||||
private:
|
||||
static std::shared_ptr<DistributedInputClient> instance;
|
||||
std::mutex mutex_;
|
||||
std::atomic<bool> dInputSourceSAOnline = false;
|
||||
std::atomic<bool> dInputSinkSAOnline = false;
|
||||
std::atomic<bool> isSubscribeSrcSAChangeListener = false;
|
||||
std::atomic<bool> isSubscribeSinkSAChangeListener = false;
|
||||
sptr<IDistributedSourceInput> dInputSourceProxy_ = nullptr;
|
||||
sptr<IDistributedSinkInput> dInputSinkProxy_ = nullptr;
|
||||
|
||||
@@ -134,7 +151,8 @@ private:
|
||||
sptr<StartDInputServerCb> sourceTypeCallback = nullptr;
|
||||
sptr<AddWhiteListInfosCb> addWhiteListCallback = nullptr;
|
||||
sptr<DelWhiteListInfosCb> delWhiteListCallback = nullptr;
|
||||
|
||||
sptr<SystemAbilityListener> saListenerCallback = nullptr;
|
||||
|
||||
struct DHardWareFwkRegistInfo {
|
||||
std::string devId;
|
||||
std::string dhId;
|
||||
|
||||
@@ -29,10 +29,50 @@
|
||||
namespace OHOS {
|
||||
namespace DistributedHardware {
|
||||
namespace DistributedInput {
|
||||
std::shared_ptr<DistributedInputClient> DistributedInputClient::instance(new DistributedInputClient());
|
||||
|
||||
DistributedInputClient::DistributedInputClient()
|
||||
{
|
||||
Init();
|
||||
}
|
||||
|
||||
void DistributedInputClient::Init()
|
||||
{
|
||||
saListenerCallback = new(std::nothrow) SystemAbilityListener();
|
||||
sptr<ISystemAbilityManager> systemAbilityManager =
|
||||
SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
|
||||
|
||||
if (!systemAbilityManager) {
|
||||
DHLOGE("get system ability manager failed.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isSubscribeSrcSAChangeListener.load()) {
|
||||
DHLOGI("try subscribe source sa change listener, sa id: %d", DISTRIBUTED_HARDWARE_INPUT_SOURCE_SA_ID);
|
||||
int32_t ret = systemAbilityManager->SubscribeSystemAbility(DISTRIBUTED_HARDWARE_INPUT_SOURCE_SA_ID,
|
||||
saListenerCallback);
|
||||
if (ret != DH_SUCCESS) {
|
||||
DHLOGE("subscribe source sa change failed: %d", ret);
|
||||
return;
|
||||
}
|
||||
isSubscribeSrcSAChangeListener.store(true);
|
||||
}
|
||||
|
||||
if (!isSubscribeSinkSAChangeListener.load()) {
|
||||
DHLOGI("try subscribe sink sa change listener, sa id: %d", DISTRIBUTED_HARDWARE_INPUT_SINK_SA_ID);
|
||||
int32_t ret = systemAbilityManager->SubscribeSystemAbility(DISTRIBUTED_HARDWARE_INPUT_SINK_SA_ID,
|
||||
saListenerCallback);
|
||||
if (ret != DH_SUCCESS) {
|
||||
DHLOGE("subscribe sink sa change failed: %d", ret);
|
||||
return;
|
||||
}
|
||||
isSubscribeSinkSAChangeListener.store(true);
|
||||
}
|
||||
}
|
||||
|
||||
DistributedInputClient &DistributedInputClient::GetInstance()
|
||||
{
|
||||
static DistributedInputClient instance;
|
||||
return instance;
|
||||
return *instance.get();
|
||||
}
|
||||
|
||||
void DistributedInputClient::RegisterDInputCb::OnResult(
|
||||
@@ -92,6 +132,32 @@ void DistributedInputClient::DelWhiteListInfosCb::OnResult(const std::string& de
|
||||
DistributedInputClient::GetInstance().DelWhiteListInfos(deviceId);
|
||||
}
|
||||
|
||||
void DistributedInputClient::SystemAbilityListener::OnAddSystemAbility(int32_t systemAbilityId,
|
||||
const std::string& deviceId)
|
||||
{
|
||||
if (systemAbilityId == DISTRIBUTED_HARDWARE_INPUT_SOURCE_SA_ID) {
|
||||
DistributedInputClient::GetInstance().dInputSourceSAOnline.store(true);
|
||||
} else if (systemAbilityId == DISTRIBUTED_HARDWARE_INPUT_SINK_SA_ID) {
|
||||
DistributedInputClient::GetInstance().dInputSinkSAOnline.store(true);
|
||||
}
|
||||
DHLOGI("sa %d is added.", systemAbilityId);
|
||||
}
|
||||
|
||||
void DistributedInputClient::SystemAbilityListener::OnRemoveSystemAbility(int32_t systemAbilityId,
|
||||
const std::string& deviceId)
|
||||
{
|
||||
if (systemAbilityId == DISTRIBUTED_HARDWARE_INPUT_SOURCE_SA_ID) {
|
||||
DistributedInputClient::GetInstance().dInputSourceSAOnline.store(false);
|
||||
std::lock_guard<std::mutex> lock(DistributedInputClient::GetInstance().mutex_);
|
||||
DistributedInputClient::GetInstance().dInputSourceProxy_ = nullptr;
|
||||
} else if (systemAbilityId == DISTRIBUTED_HARDWARE_INPUT_SINK_SA_ID) {
|
||||
DistributedInputClient::GetInstance().dInputSinkSAOnline.store(false);
|
||||
std::lock_guard<std::mutex> lock(DistributedInputClient::GetInstance().mutex_);
|
||||
DistributedInputClient::GetInstance().dInputSinkProxy_ = nullptr;
|
||||
}
|
||||
DHLOGI("sa %d is removed.", systemAbilityId);
|
||||
}
|
||||
|
||||
int32_t DistributedInputClient::InitSource()
|
||||
{
|
||||
if (!GetDInputSourceProxy()) {
|
||||
@@ -330,12 +396,38 @@ DInputServerType DistributedInputClient::IsStartDistributedInput(const uint32_t&
|
||||
|
||||
bool DistributedInputClient::GetDInputSourceProxy()
|
||||
{
|
||||
if (!dInputSourceProxy_) {
|
||||
if (!isSubscribeSrcSAChangeListener.load()) {
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
if (!isSubscribeSrcSAChangeListener.load()) {
|
||||
sptr<ISystemAbilityManager> systemAbilityManager =
|
||||
SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
|
||||
if (!systemAbilityManager) {
|
||||
DHLOGE("get system ability manager failed.");
|
||||
return false;
|
||||
}
|
||||
|
||||
DHLOGI("try subscribe source sa change listener, sa id: %d", DISTRIBUTED_HARDWARE_INPUT_SOURCE_SA_ID);
|
||||
int32_t ret = systemAbilityManager->SubscribeSystemAbility(DISTRIBUTED_HARDWARE_INPUT_SOURCE_SA_ID,
|
||||
saListenerCallback);
|
||||
if (ret != DH_SUCCESS) {
|
||||
DHLOGE("subscribe source sa change failed: %d", ret);
|
||||
return false;
|
||||
}
|
||||
isSubscribeSrcSAChangeListener.store(true);
|
||||
}
|
||||
}
|
||||
|
||||
if (dInputSourceSAOnline.load() && !dInputSourceProxy_) {
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
if (dInputSourceProxy_ != nullptr) {
|
||||
DHLOGI("dinput source proxy has already got.");
|
||||
return true;
|
||||
}
|
||||
sptr<ISystemAbilityManager> systemAbilityManager =
|
||||
SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
|
||||
|
||||
if (!systemAbilityManager) {
|
||||
DHLOGE("get system ability manager failed.");
|
||||
return false;
|
||||
}
|
||||
DHLOGI("%s try get sa: %d", __func__, DISTRIBUTED_HARDWARE_INPUT_SOURCE_SA_ID);
|
||||
@@ -351,7 +443,7 @@ bool DistributedInputClient::GetDInputSourceProxy()
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
return dInputSourceProxy_ != nullptr;
|
||||
}
|
||||
|
||||
bool DistributedInputClient::HasDInputSourceProxy()
|
||||
@@ -388,11 +480,37 @@ bool DistributedInputClient::SetDInputSinkProxy(const sptr<IRemoteObject> &remot
|
||||
|
||||
bool DistributedInputClient::GetDInputSinkProxy()
|
||||
{
|
||||
if (!dInputSinkProxy_) {
|
||||
if (!isSubscribeSinkSAChangeListener.load()) {
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
if (!isSubscribeSinkSAChangeListener.load()) {
|
||||
sptr<ISystemAbilityManager> systemAbilityManager =
|
||||
SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
|
||||
if (!systemAbilityManager) {
|
||||
DHLOGE("get system ability manager failed.");
|
||||
return false;
|
||||
}
|
||||
|
||||
DHLOGI("try subscribe sink sa change listener, sa id: %d", DISTRIBUTED_HARDWARE_INPUT_SINK_SA_ID);
|
||||
int32_t ret = systemAbilityManager->SubscribeSystemAbility(DISTRIBUTED_HARDWARE_INPUT_SINK_SA_ID,
|
||||
saListenerCallback);
|
||||
if (ret != DH_SUCCESS) {
|
||||
DHLOGE("subscribe sink sa change failed: %d", ret);
|
||||
return false;
|
||||
}
|
||||
isSubscribeSinkSAChangeListener.store(true);
|
||||
}
|
||||
}
|
||||
|
||||
if (dInputSinkSAOnline.load() && !dInputSinkProxy_) {
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
if (dInputSinkProxy_ != nullptr) {
|
||||
DHLOGI("dinput sink proxy has already got.");
|
||||
return true;
|
||||
}
|
||||
sptr<ISystemAbilityManager> systemAbilityManager =
|
||||
SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
|
||||
if (!systemAbilityManager) {
|
||||
DHLOGE("get system ability manager failed.");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -408,7 +526,7 @@ bool DistributedInputClient::GetDInputSinkProxy()
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
return dInputSinkProxy_ != nullptr;
|
||||
}
|
||||
|
||||
bool DistributedInputClient::IsJsonData(std::string strData) const
|
||||
|
||||
@@ -103,7 +103,7 @@ int32_t DistributedInputInject::RegisterDistributedEvent(RawEvent* buffer, size_
|
||||
DHLOGE("the DistributedInputNodeManager is null\n");
|
||||
return ERR_DH_INPUT_SERVER_SOURCE_INJECT_NODE_MANAGER_IS_NULL;
|
||||
}
|
||||
DHLOGE("RegisterDistributedEvent start %zu\n", bufferSize);
|
||||
DHLOGI("RegisterDistributedEvent start %zu\n", bufferSize);
|
||||
for (size_t i = 0; i < bufferSize; i++) {
|
||||
inputNodeManager_->ReportEvent(buffer[i]);
|
||||
}
|
||||
|
||||
@@ -152,7 +152,7 @@ bool VirtualDevice::InjectInputEvent(const input_event& event)
|
||||
return false;
|
||||
}
|
||||
RecordEventLog(event);
|
||||
DHLOGE("InjectInputEvent end\n");
|
||||
DHLOGI("InjectInputEvent end\n");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -158,7 +158,10 @@ int32_t DistributedInputSourceTransport::OpenInputSoftbus(const std::string &rem
|
||||
GetAnonyString(remoteDevId).c_str(), GetAnonyInt32(sessionId).c_str());
|
||||
return ERR_DH_INPUT_SERVER_SOURCE_TRANSPORT_OPEN_SESSION_FAIL;
|
||||
}
|
||||
|
||||
{
|
||||
std::unique_lock<std::mutex> sessionLock(operationMutex_);
|
||||
sessionDevMap_[remoteDevId] = sessionId;
|
||||
}
|
||||
DHLOGI("Wait for channel session opened.");
|
||||
{
|
||||
std::unique_lock<std::mutex> waitLock(operationMutex_);
|
||||
@@ -173,10 +176,6 @@ int32_t DistributedInputSourceTransport::OpenInputSoftbus(const std::string &rem
|
||||
|
||||
DHLOGI("OpenSession success, remoteDevId:%s, sessionId:%s",
|
||||
GetAnonyString(remoteDevId).c_str(), GetAnonyInt32(sessionId).c_str());
|
||||
{
|
||||
std::unique_lock<std::mutex> sessionLock(operationMutex_);
|
||||
sessionDevMap_[remoteDevId] = sessionId;
|
||||
}
|
||||
return DH_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user