Description:refine get dinput sa

Match-id-e01951e49eabc5456af473375d142d8e7c0d11d4
This commit is contained in:
xxxx
2022-06-14 10:39:26 +08:00
parent 406991381a
commit d91d833072
7 changed files with 158 additions and 16 deletions
+2
View File
@@ -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;
+124 -6
View File
@@ -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;
}